File Coverage

RIPEMD160.xs
Criterion Covered Total %
statement 29 29 100.0
branch 2 2 100.0
condition n/a
subroutine n/a
pod n/a
total 31 31 100.0


line stmt bran cond sub pod time code
1             /*
2             Perl Extension for the RIPEMD160 Message-Digest Algorithm
3              
4             This module by Christian H. Geuer
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 69           RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO));
27 69           RIPEMD160_init(RETVAL);
28             }
29             OUTPUT:
30             RETVAL
31              
32              
33             void
34             rmd160_DESTROY(ripemd160)
35             Crypt::RIPEMD160 ripemd160
36             CODE:
37             {
38 69           safefree((char *) ripemd160);
39             }
40              
41              
42             void
43             reset(ripemd160)
44             Crypt::RIPEMD160 ripemd160
45             CODE:
46             {
47 21           RIPEMD160_init(ripemd160);
48             }
49              
50             void
51             rmd160_add(ripemd160, ...)
52             Crypt::RIPEMD160 ripemd160
53             CODE:
54             {
55             STRLEN len;
56             byte *strptr;
57             int i;
58              
59 2001024 100         for (i = 1; i < items; i++) {
60 1000618           strptr = (byte *) (SvPV(ST(i), len));
61 1000618           RIPEMD160_update(ripemd160, strptr, len);
62             }
63             }
64              
65             SV *
66             rmd160_digest(ripemd160)
67             Crypt::RIPEMD160 ripemd160
68             CODE:
69             {
70             unsigned char d_str[20];
71              
72 85           RIPEMD160_final(ripemd160);
73              
74 85           d_str[ 0] = (unsigned char) ((ripemd160->MDbuf[0] ) & 0xff);
75 85           d_str[ 1] = (unsigned char) ((ripemd160->MDbuf[0] >> 8) & 0xff);
76 85           d_str[ 2] = (unsigned char) ((ripemd160->MDbuf[0] >> 16) & 0xff);
77 85           d_str[ 3] = (unsigned char) ((ripemd160->MDbuf[0] >> 24) & 0xff);
78 85           d_str[ 4] = (unsigned char) ((ripemd160->MDbuf[1] ) & 0xff);
79 85           d_str[ 5] = (unsigned char) ((ripemd160->MDbuf[1] >> 8) & 0xff);
80 85           d_str[ 6] = (unsigned char) ((ripemd160->MDbuf[1] >> 16) & 0xff);
81 85           d_str[ 7] = (unsigned char) ((ripemd160->MDbuf[1] >> 24) & 0xff);
82 85           d_str[ 8] = (unsigned char) ((ripemd160->MDbuf[2] ) & 0xff);
83 85           d_str[ 9] = (unsigned char) ((ripemd160->MDbuf[2] >> 8) & 0xff);
84 85           d_str[10] = (unsigned char) ((ripemd160->MDbuf[2] >> 16) & 0xff);
85 85           d_str[11] = (unsigned char) ((ripemd160->MDbuf[2] >> 24) & 0xff);
86 85           d_str[12] = (unsigned char) ((ripemd160->MDbuf[3] ) & 0xff);
87 85           d_str[13] = (unsigned char) ((ripemd160->MDbuf[3] >> 8) & 0xff);
88 85           d_str[14] = (unsigned char) ((ripemd160->MDbuf[3] >> 16) & 0xff);
89 85           d_str[15] = (unsigned char) ((ripemd160->MDbuf[3] >> 24) & 0xff);
90 85           d_str[16] = (unsigned char) ((ripemd160->MDbuf[4] ) & 0xff);
91 85           d_str[17] = (unsigned char) ((ripemd160->MDbuf[4] >> 8) & 0xff);
92 85           d_str[18] = (unsigned char) ((ripemd160->MDbuf[4] >> 16) & 0xff);
93 85           d_str[19] = (unsigned char) ((ripemd160->MDbuf[4] >> 24) & 0xff);
94              
95 85           ST(0) = sv_2mortal(newSVpv((const char *)d_str, 20));
96             }