File Coverage

RIPEMD160.xs
Criterion Covered Total %
statement 20 23 86.9
branch 5 6 83.3
condition n/a
subroutine n/a
pod n/a
total 25 29 86.2


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             #define PERL_NO_GET_CONTEXT
12             #include "EXTERN.h"
13             #include "perl.h"
14             #include "XSUB.h"
15              
16             #include "wrap_160.h"
17              
18             MODULE = Crypt::RIPEMD160 PACKAGE = Crypt::RIPEMD160 PREFIX = rmd160_
19              
20             PROTOTYPES: DISABLE
21              
22             Crypt::RIPEMD160
23             rmd160_new(packname = "Crypt::RIPEMD160")
24             char * packname
25             CODE:
26             {
27             PERL_UNUSED_VAR(packname);
28 698           RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO));
29 698           RIPEMD160_init(RETVAL);
30             }
31             OUTPUT:
32             RETVAL
33              
34              
35             void
36             rmd160_DESTROY(ripemd160)
37             Crypt::RIPEMD160 ripemd160
38             CODE:
39             {
40 715           secure_memzero(ripemd160, sizeof(RIPEMD160_INFO));
41 715           safefree((char *) ripemd160);
42             }
43              
44              
45             void
46             reset(ripemd160)
47             Crypt::RIPEMD160 ripemd160
48             PPCODE:
49             {
50 33           RIPEMD160_init(ripemd160);
51             /* return self for method chaining */
52 33           XSRETURN(1);
53             }
54              
55             Crypt::RIPEMD160
56             rmd160_clone(ripemd160)
57             Crypt::RIPEMD160 ripemd160
58             CODE:
59             {
60 17           RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO));
61 17           memcpy(RETVAL, ripemd160, sizeof(RIPEMD160_INFO));
62             }
63             OUTPUT:
64             RETVAL
65              
66              
67             void
68             rmd160_add(ripemd160, ...)
69             Crypt::RIPEMD160 ripemd160
70             PPCODE:
71             {
72             STRLEN len;
73             byte *strptr;
74             int i;
75              
76 2005008 100         for (i = 1; i < items; i++) {
77 1002616           strptr = (byte *) (SvPVbyte(ST(i), len));
78             #if PTRSIZE > 4
79             /* STRLEN is 64-bit on 64-bit systems but RIPEMD160_update
80             takes a 32-bit dword length; chunk to avoid truncation */
81 1002614 50         while (len > (STRLEN)0xFFFFFFFFU) {
82 0           RIPEMD160_update(ripemd160, strptr, (dword)0xFFFFFFFFU);
83 0           strptr += 0xFFFFFFFFU;
84 0           len -= 0xFFFFFFFFU;
85             }
86             #endif
87 1002614           RIPEMD160_update(ripemd160, strptr, (dword)len);
88             }
89             /* return self for method chaining */
90 1002392           XSRETURN(1);
91             }
92              
93             SV *
94             rmd160_digest(ripemd160)
95             Crypt::RIPEMD160 ripemd160
96             CODE:
97             {
98             unsigned char d_str[20];
99             int i;
100              
101 713           RIPEMD160_final(ripemd160);
102              
103 4278 100         for (i = 0; i < 5; i++) {
104 3565           d_str[4*i ] = (unsigned char)(ripemd160->MDbuf[i] & 0xff);
105 3565           d_str[4*i+1] = (unsigned char)(ripemd160->MDbuf[i] >> 8 & 0xff);
106 3565           d_str[4*i+2] = (unsigned char)(ripemd160->MDbuf[i] >> 16 & 0xff);
107 3565           d_str[4*i+3] = (unsigned char)(ripemd160->MDbuf[i] >> 24 & 0xff);
108             }
109              
110 713           RETVAL = newSVpvn((const char *)d_str, 20);
111             }
112             OUTPUT:
113             RETVAL