File Coverage

wrap_160.c
Criterion Covered Total %
statement 39 41 95.1
branch 14 16 87.5
condition n/a
subroutine n/a
pod n/a
total 53 57 92.9


line stmt bran cond sub pod time code
1             #include
2             #include
3              
4             #include "rmd160.h"
5             #include "wrap_160.h"
6              
7             #ifdef USE_RMD160CRYPT_HEADER
8 38           void RIPEMD160_init(Crypt__RIPEMD160 ripemd160)
9             #else
10             void RIPEMD160_init(RIPEMD160 ripemd160)
11             #endif
12             {
13 38           MDinit(ripemd160->MDbuf);
14 38           ripemd160->local = (dword) 0;
15 38           ripemd160->count_lo = (dword) 0;
16 38           ripemd160->count_hi = (dword) 0;
17 38           }
18              
19             #ifdef USE_RMD160CRYPT_HEADER
20 1005728           void RIPEMD160_update(Crypt__RIPEMD160 ripemd160, byte *strptr, dword len)
21             #else
22             void RIPEMD160_update(RIPEMD160 ripemd160, byte *strptr, dword len)
23             #endif
24             {
25             dword
26             i;
27             byte *
28             ptr;
29            
30 1005728 50         if (ripemd160->count_lo + len < ripemd160->count_lo) {
31 0           ripemd160->count_hi++;
32             }
33 1005728           ripemd160->count_lo += len;
34            
35 1005728 100         if (ripemd160->local > 0) {
36 989968           i = RIPEMD160_BLOCKSIZE - ripemd160->local;
37 989968 100         if (i > len) {
38 974103           i = len;
39             }
40 989968           memcpy(ripemd160->data + ripemd160->local, strptr, i);
41 989968           len -= i;
42 989968           strptr += i;
43 989968           ripemd160->local += i;
44 989968 100         if (ripemd160->local == RIPEMD160_BLOCKSIZE) {
45 15865           memset(ripemd160->X, 0, RIPEMD160_BLOCKSIZE);
46 15865           ptr = ripemd160->data;
47 1031225 100         for (i=0; i
48             /* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */
49 1015360           ripemd160->X[i>>2] |= (dword) *ptr++ << (8 * (i&3));
50             }
51 15865           rmd160_compress(ripemd160->MDbuf, ripemd160->X);
52             } else {
53 974103           return;
54             }
55             }
56 32063 100         while (len >= RIPEMD160_BLOCKSIZE) {
57 438           memset(ripemd160->X, 0, RIPEMD160_BLOCKSIZE);
58 28470 100         for (i=0; i
59             /* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */
60 28032           ripemd160->X[i>>2] |= (dword) *strptr++ << (8 * (i&3));
61             }
62 438           len -= RIPEMD160_BLOCKSIZE;
63 438           rmd160_compress(ripemd160->MDbuf, ripemd160->X);
64             }
65 31625           memcpy(ripemd160->data, strptr, len);
66 31625           ripemd160->local = len;
67             }
68              
69             #ifdef USE_RMD160CRYPT_HEADER
70 36           void RIPEMD160_final(Crypt__RIPEMD160 ripemd160)
71             #else
72             void RIPEMD160_final(RIPEMD160 ripemd160)
73             #endif
74             {
75 36 50         if (ripemd160->local != ripemd160->count_lo % 64) {
76 0           printf("local != count %% 64\n");
77             }
78              
79 36           MDfinish(ripemd160->MDbuf,
80 36           ripemd160->data,
81 36           (dword) ripemd160->count_lo,
82 36           (dword) ripemd160->count_hi);
83 36           }
84              
85             /* The HMAC_RIPEMD160 transform looks like:
86            
87             RIPEMD160(K XOR opad, RIPEMD160(K XOR ipad, text))
88            
89             where K is an n byte key
90             ipad is the byte 0x36 repeated 64 times
91             opad is the byte 0x5c repeated 64 times
92             and text is the data being protected
93             */
94              
95             #ifdef USE_MALICIOUS_MAC
96             #ifdef USE_RMD160CRYPT_HEADER
97             void RIPEMD160_HMAC(Crypt__RIPEMD160 ripemd160,
98             byte *input, /* pointer to data stream */
99             dword len, /* length of data stream */
100             byte *key, /* pointer to authentication key */
101             dword keylen) /* length of authentication key */
102             #else
103             void RIPEMD160_HMAC(RIPEMD160 ripemd160,
104             byte *input, /* pointer to data stream */
105             dword len, /* length of data stream */
106             byte *key, /* pointer to authentication key */
107             dword keylen) /* length of authentication key */
108             #endif
109             {
110             byte
111             k_ipad[65], /* inner padding - key XORd with ipad */
112             k_opad[65]; /* outer padding - key XORd with opad */
113             byte
114             tk[RMD160_DIGESTSIZE];
115             dword
116             i;
117            
118             /* if key is longer than 64 bytes reset it to key=RIPEMD160(key) */
119             if (keylen > 64) {
120             RIPEMD160_INFO
121             tctx;
122            
123             RIPEMD160_init(&tctx);
124             RIPEMD160_update(&tctx, key, keylen);
125             RIPEMD160_final(&tctx);
126            
127             key = tctx.MDbuf;
128             keylen = RMD160_DIGESTSIZE;
129             }
130            
131             /* start out by storing key in pads */
132             memset(k_ipad, 0x36, sizeof(k_ipad));
133             memset(k_opad, 0x5c, sizeof(k_opad));
134            
135             /* XOR key with ipad and opad values */
136             for (i=0; i
137             k_ipad[i] ^= key[i];
138             k_opad[i] ^= key[i];
139             }
140            
141             /* perform inner RIPEMD-160 */
142             RIPEMD160_init(ripemd160); /* init ripemd160 for 1st pass */
143             RIPEMD160_update(ripemd160, k_ipad, 64); /* start with inner pad */
144             RIPEMD160_update(ripemd160, input, len); /* then text of datagram */
145             RIPEMD160_final(ripemd160); /* finish up 1st pass */
146             memcpy(digest, ripemd160->MDbuf, RMD160_DIGESTSIZE);
147            
148             /* perform outer RIPEMD-160 */
149             RIPEMD160_init(ripemd160); /* init ripemd160 for 2nd pass */
150             RIPEMD160_update(ripemd160, k_opad, 64); /* start with outer pad */
151             RIPEMD160_update(ripemd160, digest, RMD160_DIGESTSIZE);
152             RIPEMD160_final(ripemd160); /* finish up 2nd pass */
153             memcpy(digest, ripemd160->MDbuf, RMD160_DIGESTSIZE);
154            
155             /* clean up secret keys */
156             memset(k_ipad, 0x00, sizeof(k_ipad));
157             memset(k_opad, 0x00, sizeof(k_opad));
158             }
159             #endif
160             /* ************************************************************************* */
161              
162             /* #define MAINTEST */
163              
164             #ifdef MAINTEST
165             #include
166             #include
167              
168             void print_hash(RIPEMD160 ripemd160)
169             {
170             byte hashcode[RMDsize/8];
171             int i;
172              
173             for (i=0; i
174             hashcode[i] = ripemd160->MDbuf[i>>2];
175             hashcode[i+1] = (ripemd160->MDbuf[i>>2] >> 8);
176             hashcode[i+2] = (ripemd160->MDbuf[i>>2] >> 16);
177             hashcode[i+3] = (ripemd160->MDbuf[i>>2] >> 24);
178             }
179             printf("hashcode: ");
180             for (i=0; i
181             printf("%02x", hashcode[i]);
182             printf("\n");
183             }
184              
185             int main (void)
186             {
187             RIPEMD160_INFO ripemd160_info;
188             byte a[1000001];
189              
190             int i;
191             long L;
192              
193             RIPEMD160_init(&ripemd160_info);
194              
195             /*
196             RIPEMD160_update(&ripemd160_info, (byte *) "a", (dword) strlen("a"));
197             RIPEMD160_update(&ripemd160_info, (byte *) "b", (dword) strlen("b"));
198             RIPEMD160_update(&ripemd160_info, (byte *) "c", (dword) strlen("c"));
199             */
200              
201             /*
202             memset(a, 'a', 1000000);
203             a[1000000] = 0;
204             RIPEMD160_update(&ripemd160_info, (byte *) a, (dword) 1000000);
205             */
206              
207            
208             for (L = 0; L<1000000; L++) {
209             RIPEMD160_update(&ripemd160_info, (byte *) "a", (dword) strlen("a"));
210             }
211            
212             /*
213             for (i = 0; i<8; i++) {
214             RIPEMD160_update(&ripemd160_info_info,
215             (byte *) "1234567890",
216             (dword) strlen("1234567890"));
217             }
218             */
219            
220             RIPEMD160_final(&ripemd160_info);
221              
222             print_hash(&ripemd160_info);
223            
224             return(0);
225             }
226             #endif