1 /* 2 Perl Extension for the RIPEMD160 Message-Digest Algorithm 3 4 This module by Christian H. Geuer <christian.geuer@crypto.gun.de> 5 following example of MD5 module and SHA module. 6 7 This extension (wrapper code and perl-stuff) may be distributed 8 under the same terms as Perl. 9 */ 10 11 #include "EXTERN.h" 12 #include "perl.h" 13 #include "XSUB.h" 14 15 #include "wrap_160.h" 16 17 MODULE = Crypt::RIPEMD160 PACKAGE = Crypt::RIPEMD160 PREFIX = rmd160_ 18 19 PROTOTYPES: DISABLE 20 21 Crypt::RIPEMD160 22 rmd160_new(packname = "Crypt::RIPEMD160") 23 char * packname 24 CODE: 25 { 26 RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO)); 27 RIPEMD160_init(RETVAL); 28 } 29 OUTPUT: 30 RETVAL 31 32 33 void rmd160_DESTROY(ripemd160)34rmd160_DESTROY(ripemd160) 35 Crypt::RIPEMD160 ripemd160 36 CODE: 37 { 38 safefree((char *) ripemd160); 39 } 40 41 42 void reset(ripemd160)43reset(ripemd160) 44 Crypt::RIPEMD160 ripemd160 45 CODE: 46 { 47 RIPEMD160_init(ripemd160); 48 } 49 50 void rmd160_add(ripemd160,...)51rmd160_add(ripemd160, ...) 52 Crypt::RIPEMD160 ripemd160 53 CODE: 54 { 55 SV *svdata; 56 STRLEN len; 57 byte *strptr; 58 int i; 59 60 for (i = 1; i < items; i++) { 61 strptr = (byte *) (SvPV(ST(i), len)); 62 RIPEMD160_update(ripemd160, strptr, len); 63 } 64 } 65 66 SV * rmd160_digest(ripemd160)67rmd160_digest(ripemd160) 68 Crypt::RIPEMD160 ripemd160 69 CODE: 70 { 71 unsigned char d_str[20]; 72 73 RIPEMD160_final(ripemd160); 74 75 d_str[ 0] = (unsigned char) ((ripemd160->MDbuf[0] ) & 0xff); 76 d_str[ 1] = (unsigned char) ((ripemd160->MDbuf[0] >> 8) & 0xff); 77 d_str[ 2] = (unsigned char) ((ripemd160->MDbuf[0] >> 16) & 0xff); 78 d_str[ 3] = (unsigned char) ((ripemd160->MDbuf[0] >> 24) & 0xff); 79 d_str[ 4] = (unsigned char) ((ripemd160->MDbuf[1] ) & 0xff); 80 d_str[ 5] = (unsigned char) ((ripemd160->MDbuf[1] >> 8) & 0xff); 81 d_str[ 6] = (unsigned char) ((ripemd160->MDbuf[1] >> 16) & 0xff); 82 d_str[ 7] = (unsigned char) ((ripemd160->MDbuf[1] >> 24) & 0xff); 83 d_str[ 8] = (unsigned char) ((ripemd160->MDbuf[2] ) & 0xff); 84 d_str[ 9] = (unsigned char) ((ripemd160->MDbuf[2] >> 8) & 0xff); 85 d_str[10] = (unsigned char) ((ripemd160->MDbuf[2] >> 16) & 0xff); 86 d_str[11] = (unsigned char) ((ripemd160->MDbuf[2] >> 24) & 0xff); 87 d_str[12] = (unsigned char) ((ripemd160->MDbuf[3] ) & 0xff); 88 d_str[13] = (unsigned char) ((ripemd160->MDbuf[3] >> 8) & 0xff); 89 d_str[14] = (unsigned char) ((ripemd160->MDbuf[3] >> 16) & 0xff); 90 d_str[15] = (unsigned char) ((ripemd160->MDbuf[3] >> 24) & 0xff); 91 d_str[16] = (unsigned char) ((ripemd160->MDbuf[4] ) & 0xff); 92 d_str[17] = (unsigned char) ((ripemd160->MDbuf[4] >> 8) & 0xff); 93 d_str[18] = (unsigned char) ((ripemd160->MDbuf[4] >> 16) & 0xff); 94 d_str[19] = (unsigned char) ((ripemd160->MDbuf[4] >> 24) & 0xff); 95 96 ST(0) = sv_2mortal(newSVpv(d_str, 20)); 97 } 98