]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/port/ripemd.c
libsec: add diffie-hellman functions
[plan9front.git] / sys / src / libsec / port / ripemd.c
1 #include "os.h"
2
3 #include <libsec.h>
4
5 #define BYTES_TO_DWORD(strptr)                    \
6             (((u32int) *((strptr)+3) << 24) | \
7              ((u32int) *((strptr)+2) << 16) | \
8              ((u32int) *((strptr)+1) <<  8) | \
9              ((u32int) *(strptr)))
10
11 #define ROL(x, n)        (((x) << (n)) | ((x) >> (32-(n))))
12
13 /* the five basic functions F(), G() and H() */
14 #define F(x, y, z)        ((x) ^ (y) ^ (z)) 
15 #define G(x, y, z)        (((x) & (y)) | (~(x) & (z))) 
16 #define H(x, y, z)        (((x) | ~(y)) ^ (z))
17 #define I(x, y, z)        (((x) & (z)) | ((y) & ~(z))) 
18 #define J(x, y, z)        ((x) ^ ((y) | ~(z)))
19   
20 /* the ten basic operations FF() through III() */
21 #define FF(a, b, c, d, e, x, s)        {\
22       (a) += F((b), (c), (d)) + (x);\
23       (a) = ROL((a), (s)) + (e);\
24       (c) = ROL((c), 10);\
25    }
26 #define GG(a, b, c, d, e, x, s)        {\
27       (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
28       (a) = ROL((a), (s)) + (e);\
29       (c) = ROL((c), 10);\
30    }
31 #define HH(a, b, c, d, e, x, s)        {\
32       (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
33       (a) = ROL((a), (s)) + (e);\
34       (c) = ROL((c), 10);\
35    }
36 #define II(a, b, c, d, e, x, s)        {\
37       (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
38       (a) = ROL((a), (s)) + (e);\
39       (c) = ROL((c), 10);\
40    }
41 #define JJ(a, b, c, d, e, x, s)        {\
42       (a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
43       (a) = ROL((a), (s)) + (e);\
44       (c) = ROL((c), 10);\
45    }
46 #define FFF(a, b, c, d, e, x, s)        {\
47       (a) += F((b), (c), (d)) + (x);\
48       (a) = ROL((a), (s)) + (e);\
49       (c) = ROL((c), 10);\
50    }
51 #define GGG(a, b, c, d, e, x, s)        {\
52       (a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
53       (a) = ROL((a), (s)) + (e);\
54       (c) = ROL((c), 10);\
55    }
56 #define HHH(a, b, c, d, e, x, s)        {\
57       (a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
58       (a) = ROL((a), (s)) + (e);\
59       (c) = ROL((c), 10);\
60    }
61 #define III(a, b, c, d, e, x, s)        {\
62       (a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
63       (a) = ROL((a), (s)) + (e);\
64       (c) = ROL((c), 10);\
65    }
66 #define JJJ(a, b, c, d, e, x, s)        {\
67       (a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
68       (a) = ROL((a), (s)) + (e);\
69       (c) = ROL((c), 10);\
70    }
71
72
73 static void MDinit(u32int *MDbuf)
74 {
75    MDbuf[0] = 0x67452301UL;
76    MDbuf[1] = 0xefcdab89UL;
77    MDbuf[2] = 0x98badcfeUL;
78    MDbuf[3] = 0x10325476UL;
79    MDbuf[4] = 0xc3d2e1f0UL;
80
81    return;
82 }
83
84 static void compress(u32int *MDbuf, u32int *X)
85 {
86    u32int aa = MDbuf[0],  bb = MDbuf[1],  cc = MDbuf[2],
87          dd = MDbuf[3],  ee = MDbuf[4];
88    u32int aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2],
89          ddd = MDbuf[3], eee = MDbuf[4];
90
91    /* round 1 */
92    FF(aa, bb, cc, dd, ee, X[ 0], 11);
93    FF(ee, aa, bb, cc, dd, X[ 1], 14);
94    FF(dd, ee, aa, bb, cc, X[ 2], 15);
95    FF(cc, dd, ee, aa, bb, X[ 3], 12);
96    FF(bb, cc, dd, ee, aa, X[ 4],  5);
97    FF(aa, bb, cc, dd, ee, X[ 5],  8);
98    FF(ee, aa, bb, cc, dd, X[ 6],  7);
99    FF(dd, ee, aa, bb, cc, X[ 7],  9);
100    FF(cc, dd, ee, aa, bb, X[ 8], 11);
101    FF(bb, cc, dd, ee, aa, X[ 9], 13);
102    FF(aa, bb, cc, dd, ee, X[10], 14);
103    FF(ee, aa, bb, cc, dd, X[11], 15);
104    FF(dd, ee, aa, bb, cc, X[12],  6);
105    FF(cc, dd, ee, aa, bb, X[13],  7);
106    FF(bb, cc, dd, ee, aa, X[14],  9);
107    FF(aa, bb, cc, dd, ee, X[15],  8);
108                              
109    /* round 2 */
110    GG(ee, aa, bb, cc, dd, X[ 7],  7);
111    GG(dd, ee, aa, bb, cc, X[ 4],  6);
112    GG(cc, dd, ee, aa, bb, X[13],  8);
113    GG(bb, cc, dd, ee, aa, X[ 1], 13);
114    GG(aa, bb, cc, dd, ee, X[10], 11);
115    GG(ee, aa, bb, cc, dd, X[ 6],  9);
116    GG(dd, ee, aa, bb, cc, X[15],  7);
117    GG(cc, dd, ee, aa, bb, X[ 3], 15);
118    GG(bb, cc, dd, ee, aa, X[12],  7);
119    GG(aa, bb, cc, dd, ee, X[ 0], 12);
120    GG(ee, aa, bb, cc, dd, X[ 9], 15);
121    GG(dd, ee, aa, bb, cc, X[ 5],  9);
122    GG(cc, dd, ee, aa, bb, X[ 2], 11);
123    GG(bb, cc, dd, ee, aa, X[14],  7);
124    GG(aa, bb, cc, dd, ee, X[11], 13);
125    GG(ee, aa, bb, cc, dd, X[ 8], 12);
126
127    /* round 3 */
128    HH(dd, ee, aa, bb, cc, X[ 3], 11);
129    HH(cc, dd, ee, aa, bb, X[10], 13);
130    HH(bb, cc, dd, ee, aa, X[14],  6);
131    HH(aa, bb, cc, dd, ee, X[ 4],  7);
132    HH(ee, aa, bb, cc, dd, X[ 9], 14);
133    HH(dd, ee, aa, bb, cc, X[15],  9);
134    HH(cc, dd, ee, aa, bb, X[ 8], 13);
135    HH(bb, cc, dd, ee, aa, X[ 1], 15);
136    HH(aa, bb, cc, dd, ee, X[ 2], 14);
137    HH(ee, aa, bb, cc, dd, X[ 7],  8);
138    HH(dd, ee, aa, bb, cc, X[ 0], 13);
139    HH(cc, dd, ee, aa, bb, X[ 6],  6);
140    HH(bb, cc, dd, ee, aa, X[13],  5);
141    HH(aa, bb, cc, dd, ee, X[11], 12);
142    HH(ee, aa, bb, cc, dd, X[ 5],  7);
143    HH(dd, ee, aa, bb, cc, X[12],  5);
144
145    /* round 4 */
146    II(cc, dd, ee, aa, bb, X[ 1], 11);
147    II(bb, cc, dd, ee, aa, X[ 9], 12);
148    II(aa, bb, cc, dd, ee, X[11], 14);
149    II(ee, aa, bb, cc, dd, X[10], 15);
150    II(dd, ee, aa, bb, cc, X[ 0], 14);
151    II(cc, dd, ee, aa, bb, X[ 8], 15);
152    II(bb, cc, dd, ee, aa, X[12],  9);
153    II(aa, bb, cc, dd, ee, X[ 4],  8);
154    II(ee, aa, bb, cc, dd, X[13],  9);
155    II(dd, ee, aa, bb, cc, X[ 3], 14);
156    II(cc, dd, ee, aa, bb, X[ 7],  5);
157    II(bb, cc, dd, ee, aa, X[15],  6);
158    II(aa, bb, cc, dd, ee, X[14],  8);
159    II(ee, aa, bb, cc, dd, X[ 5],  6);
160    II(dd, ee, aa, bb, cc, X[ 6],  5);
161    II(cc, dd, ee, aa, bb, X[ 2], 12);
162
163    /* round 5 */
164    JJ(bb, cc, dd, ee, aa, X[ 4],  9);
165    JJ(aa, bb, cc, dd, ee, X[ 0], 15);
166    JJ(ee, aa, bb, cc, dd, X[ 5],  5);
167    JJ(dd, ee, aa, bb, cc, X[ 9], 11);
168    JJ(cc, dd, ee, aa, bb, X[ 7],  6);
169    JJ(bb, cc, dd, ee, aa, X[12],  8);
170    JJ(aa, bb, cc, dd, ee, X[ 2], 13);
171    JJ(ee, aa, bb, cc, dd, X[10], 12);
172    JJ(dd, ee, aa, bb, cc, X[14],  5);
173    JJ(cc, dd, ee, aa, bb, X[ 1], 12);
174    JJ(bb, cc, dd, ee, aa, X[ 3], 13);
175    JJ(aa, bb, cc, dd, ee, X[ 8], 14);
176    JJ(ee, aa, bb, cc, dd, X[11], 11);
177    JJ(dd, ee, aa, bb, cc, X[ 6],  8);
178    JJ(cc, dd, ee, aa, bb, X[15],  5);
179    JJ(bb, cc, dd, ee, aa, X[13],  6);
180
181    /* parallel round 1 */
182    JJJ(aaa, bbb, ccc, ddd, eee, X[ 5],  8);
183    JJJ(eee, aaa, bbb, ccc, ddd, X[14],  9);
184    JJJ(ddd, eee, aaa, bbb, ccc, X[ 7],  9);
185    JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
186    JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
187    JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
188    JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
189    JJJ(ddd, eee, aaa, bbb, ccc, X[ 4],  5);
190    JJJ(ccc, ddd, eee, aaa, bbb, X[13],  7);
191    JJJ(bbb, ccc, ddd, eee, aaa, X[ 6],  7);
192    JJJ(aaa, bbb, ccc, ddd, eee, X[15],  8);
193    JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
194    JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
195    JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
196    JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
197    JJJ(aaa, bbb, ccc, ddd, eee, X[12],  6);
198
199    /* parallel round 2 */
200    III(eee, aaa, bbb, ccc, ddd, X[ 6],  9); 
201    III(ddd, eee, aaa, bbb, ccc, X[11], 13);
202    III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
203    III(bbb, ccc, ddd, eee, aaa, X[ 7],  7);
204    III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
205    III(eee, aaa, bbb, ccc, ddd, X[13],  8);
206    III(ddd, eee, aaa, bbb, ccc, X[ 5],  9);
207    III(ccc, ddd, eee, aaa, bbb, X[10], 11);
208    III(bbb, ccc, ddd, eee, aaa, X[14],  7);
209    III(aaa, bbb, ccc, ddd, eee, X[15],  7);
210    III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
211    III(ddd, eee, aaa, bbb, ccc, X[12],  7);
212    III(ccc, ddd, eee, aaa, bbb, X[ 4],  6);
213    III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
214    III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
215    III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
216
217    /* parallel round 3 */
218    HHH(ddd, eee, aaa, bbb, ccc, X[15],  9);
219    HHH(ccc, ddd, eee, aaa, bbb, X[ 5],  7);
220    HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
221    HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
222    HHH(eee, aaa, bbb, ccc, ddd, X[ 7],  8);
223    HHH(ddd, eee, aaa, bbb, ccc, X[14],  6);
224    HHH(ccc, ddd, eee, aaa, bbb, X[ 6],  6);
225    HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
226    HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
227    HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
228    HHH(ddd, eee, aaa, bbb, ccc, X[12],  5);
229    HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
230    HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
231    HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
232    HHH(eee, aaa, bbb, ccc, ddd, X[ 4],  7);
233    HHH(ddd, eee, aaa, bbb, ccc, X[13],  5);
234
235    /* parallel round 4 */   
236    GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
237    GGG(bbb, ccc, ddd, eee, aaa, X[ 6],  5);
238    GGG(aaa, bbb, ccc, ddd, eee, X[ 4],  8);
239    GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
240    GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
241    GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
242    GGG(bbb, ccc, ddd, eee, aaa, X[15],  6);
243    GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
244    GGG(eee, aaa, bbb, ccc, ddd, X[ 5],  6);
245    GGG(ddd, eee, aaa, bbb, ccc, X[12],  9);
246    GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
247    GGG(bbb, ccc, ddd, eee, aaa, X[13],  9);
248    GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
249    GGG(eee, aaa, bbb, ccc, ddd, X[ 7],  5);
250    GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
251    GGG(ccc, ddd, eee, aaa, bbb, X[14],  8);
252
253    /* parallel round 5 */
254    FFF(bbb, ccc, ddd, eee, aaa, X[12] ,  8);
255    FFF(aaa, bbb, ccc, ddd, eee, X[15] ,  5);
256    FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
257    FFF(ddd, eee, aaa, bbb, ccc, X[ 4] ,  9);
258    FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
259    FFF(bbb, ccc, ddd, eee, aaa, X[ 5] ,  5);
260    FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
261    FFF(eee, aaa, bbb, ccc, ddd, X[ 7] ,  6);
262    FFF(ddd, eee, aaa, bbb, ccc, X[ 6] ,  8);
263    FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
264    FFF(bbb, ccc, ddd, eee, aaa, X[13] ,  6);
265    FFF(aaa, bbb, ccc, ddd, eee, X[14] ,  5);
266    FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
267    FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
268    FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
269    FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
270
271    /* combine results */
272    ddd += cc + MDbuf[1];               /* final result for MDbuf[0] */
273    MDbuf[1] = MDbuf[2] + dd + eee;
274    MDbuf[2] = MDbuf[3] + ee + aaa;
275    MDbuf[3] = MDbuf[4] + aa + bbb;
276    MDbuf[4] = MDbuf[0] + bb + ccc;
277    MDbuf[0] = ddd;
278
279    return;
280 }
281
282 static void MDfinish(u32int *MDbuf, uchar *strptr, u32int lswlen, u32int mswlen)
283 {
284    unsigned int i;                                 /* counter       */
285    u32int        X[16];                             /* message words */
286
287    memset(X, 0, 16*sizeof(u32int));
288
289    /* put bytes from strptr into X */
290    for (i=0; i<(lswlen&63); i++) {
291       /* byte i goes into word X[i div 4] at pos.  8*(i mod 4)  */
292       X[i>>2] ^= (u32int) *strptr++ << (8 * (i&3));
293    }
294
295    /* append the bit m_n == 1 */
296    X[(lswlen>>2)&15] ^= (u32int)1 << (8*(lswlen&3) + 7);
297
298    if ((lswlen & 63) > 55) {
299       /* length goes to next block */
300       compress(MDbuf, X);
301       memset(X, 0, 16*sizeof(u32int));
302    }
303
304    /* append length in bits*/
305    X[14] = lswlen << 3;
306    X[15] = (lswlen >> 29) | (mswlen << 3);
307    compress(MDbuf, X);
308
309    return;
310 }
311
312 DigestState*
313 ripemd160(uchar *p, ulong len, uchar *digest, DigestState *s)
314 {
315         u32int x[16];
316         int i, j, k;
317
318         if(s == nil){
319                 s = malloc(sizeof(*s));
320                 if(s == nil)
321                         return nil;
322                 memset(s, 0, sizeof(*s));
323                 s->malloced = 1;
324         }
325
326         if(s->seeded == 0){
327                 MDinit(s->state);
328                 s->seeded = 1;
329         }
330
331         /* fill out the partial 64 byte block from previous calls */
332         if(s->blen){
333                 i = 64 - s->blen;
334                 if(len < i)
335                         i = len;
336                 memmove(s->buf + s->blen, p, i);
337                 len -= i;
338                 s->blen += i;
339                 p += i;
340                 if(s->blen == 64){
341                         for(i = 0; i < 16; i++)
342                                 x[i] = BYTES_TO_DWORD(s->buf + i * 4);
343                         compress(s->state, x);
344                         s->len += s->blen;
345                         s->blen = 0;
346                 }
347         }
348
349         /* do 64 byte blocks */
350         i = len & ~0x3f;
351         if(i){
352                 for(j = 0; j < i; j += 64){
353                         for(k = 0; k < 16; k++)
354                                 x[k] = BYTES_TO_DWORD(p + j + k * 4);
355                         compress(s->state, x);
356                 }
357                 s->len += i;
358                 len -= i;
359                 p += i;
360         }
361
362         /* save the left overs if not last call */
363         if(digest == 0){
364                 if(len){
365                         memmove(s->buf, p, len);
366                         s->blen += len;
367                 }
368                 return s;
369         }
370
371         MDfinish(s->state, p, s->len + len, 0);
372         for(i = 0; i < 5; i++){
373                 digest[4 * i] = s->state[i];
374                 digest[4 * i + 1] = s->state[i] >> 8;
375                 digest[4 * i + 2] = s->state[i] >> 16;
376                 digest[4 * i + 3] = s->state[i] >> 24;
377
378         }
379         if(s->malloced == 1)
380                 free(s);
381         return nil;
382
383 }