Coverage Report

Created: 2022-12-08 06:10

/src/libgcrypt/cipher/rmd160.c
Line
Count
Source (jump to first uncovered line)
1
/* rmd160.c  -  RIPE-MD160
2
 * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
3
 *
4
 * This file is part of Libgcrypt.
5
 *
6
 * Libgcrypt is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU Lesser General Public License as
8
 * published by the Free Software Foundation; either version 2.1 of
9
 * the License, or (at your option) any later version.
10
 *
11
 * Libgcrypt is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19
 */
20
21
#include <config.h>
22
#include <stdio.h>
23
#include <stdlib.h>
24
#include <string.h>
25
26
#include "g10lib.h"
27
#include "hash-common.h"
28
#include "cipher.h" /* Only used for the rmd160_hash_buffer() prototype. */
29
30
#include "bithelp.h"
31
#include "bufhelp.h"
32
33
/*********************************
34
 * RIPEMD-160 is not patented, see (as of 25.10.97)
35
 *   http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
36
 * Note that the code uses Little Endian byteorder, which is good for
37
 * 386 etc, but we must add some conversion when used on a big endian box.
38
 *
39
 *
40
 * Pseudo-code for RIPEMD-160
41
 *
42
 * RIPEMD-160 is an iterative hash function that operates on 32-bit words.
43
 * The round function takes as input a 5-word chaining variable and a 16-word
44
 * message block and maps this to a new chaining variable. All operations are
45
 * defined on 32-bit words. Padding is identical to that of MD4.
46
 *
47
 *
48
 * RIPEMD-160: definitions
49
 *
50
 *
51
 *   nonlinear functions at bit level: exor, mux, -, mux, -
52
 *
53
 *   f(j, x, y, z) = x XOR y XOR z      (0 <= j <= 15)
54
 *   f(j, x, y, z) = (x AND y) OR (NOT(x) AND z)  (16 <= j <= 31)
55
 *   f(j, x, y, z) = (x OR NOT(y)) XOR z    (32 <= j <= 47)
56
 *   f(j, x, y, z) = (x AND z) OR (y AND NOT(z))  (48 <= j <= 63)
57
 *   f(j, x, y, z) = x XOR (y OR NOT(z))    (64 <= j <= 79)
58
 *
59
 *
60
 *   added constants (hexadecimal)
61
 *
62
 *   K(j) = 0x00000000      (0 <= j <= 15)
63
 *   K(j) = 0x5A827999     (16 <= j <= 31)  int(2**30 x sqrt(2))
64
 *   K(j) = 0x6ED9EBA1     (32 <= j <= 47)  int(2**30 x sqrt(3))
65
 *   K(j) = 0x8F1BBCDC     (48 <= j <= 63)  int(2**30 x sqrt(5))
66
 *   K(j) = 0xA953FD4E     (64 <= j <= 79)  int(2**30 x sqrt(7))
67
 *   K'(j) = 0x50A28BE6     (0 <= j <= 15)      int(2**30 x cbrt(2))
68
 *   K'(j) = 0x5C4DD124    (16 <= j <= 31)      int(2**30 x cbrt(3))
69
 *   K'(j) = 0x6D703EF3    (32 <= j <= 47)      int(2**30 x cbrt(5))
70
 *   K'(j) = 0x7A6D76E9    (48 <= j <= 63)      int(2**30 x cbrt(7))
71
 *   K'(j) = 0x00000000    (64 <= j <= 79)
72
 *
73
 *
74
 *   selection of message word
75
 *
76
 *   r(j)      = j          (0 <= j <= 15)
77
 *   r(16..31) = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8
78
 *   r(32..47) = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12
79
 *   r(48..63) = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2
80
 *   r(64..79) = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
81
 *   r0(0..15) = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12
82
 *   r0(16..31)= 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2
83
 *   r0(32..47)= 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13
84
 *   r0(48..63)= 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14
85
 *   r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
86
 *
87
 *
88
 *   amount for rotate left (rol)
89
 *
90
 *   s(0..15)  = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8
91
 *   s(16..31) = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12
92
 *   s(32..47) = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5
93
 *   s(48..63) = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12
94
 *   s(64..79) = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
95
 *   s'(0..15) = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6
96
 *   s'(16..31)= 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11
97
 *   s'(32..47)= 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5
98
 *   s'(48..63)= 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8
99
 *   s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
100
 *
101
 *
102
 *   initial value (hexadecimal)
103
 *
104
 *   h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476;
105
 *              h4 = 0xC3D2E1F0;
106
 *
107
 *
108
 * RIPEMD-160: pseudo-code
109
 *
110
 *   It is assumed that the message after padding consists of t 16-word blocks
111
 *   that will be denoted with X[i][j], with 0 <= i <= t-1 and 0 <= j <= 15.
112
 *   The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left
113
 *   shift (rotate) over s positions.
114
 *
115
 *
116
 *   for i := 0 to t-1 {
117
 *   A := h0; B := h1; C := h2; D = h3; E = h4;
118
 *   A' := h0; B' := h1; C' := h2; D' = h3; E' = h4;
119
 *   for j := 0 to 79 {
120
 *       T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E;
121
 *       A := E; E := D; D := rol_10(C); C := B; B := T;
122
 *       T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)]
123
                   [+] K'(j)) [+] E';
124
 *       A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T;
125
 *   }
126
 *   T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A';
127
 *   h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T;
128
 *   }
129
 */
130
131
/* Some examples:
132
 * ""                    9c1185a5c5e9fc54612808977ee8f548b2258d31
133
 * "a"                   0bdc9d2d256b3ee9daae347be6f4dc835a467ffe
134
 * "abc"                 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
135
 * "message digest"      5d0689ef49d2fae572b881b123a85ffa21595f36
136
 * "a...z"               f71c27109c692c1b56bbdceb5b9d2865b3708dbc
137
 * "abcdbcde...nopq"     12a053384a9c0c88e405a06c27dcf49ada62eb2b
138
 * "A...Za...z0...9"     b0e20b6e3116640286ed3a87a5713079b21f5189
139
 * 8 times "1234567890"  9b752e45573d4b39f4dbd3323cab82bf63326bfb
140
 * 1 million times "a"   52783243c1697bdbe16d37f97f68f08325dc1528
141
 */
142
143
typedef struct
144
{
145
  gcry_md_block_ctx_t bctx;
146
  u32  h0,h1,h2,h3,h4;
147
} RMD160_CONTEXT;
148
149
150
static unsigned int
151
transform ( void *ctx, const unsigned char *data, size_t nblks );
152
153
static void
154
rmd160_init (void *context, unsigned int flags)
155
{
156
  RMD160_CONTEXT *hd = context;
157
158
  (void)flags;
159
160
  hd->h0 = 0x67452301;
161
  hd->h1 = 0xEFCDAB89;
162
  hd->h2 = 0x98BADCFE;
163
  hd->h3 = 0x10325476;
164
  hd->h4 = 0xC3D2E1F0;
165
166
  hd->bctx.nblocks = 0;
167
  hd->bctx.nblocks_high = 0;
168
  hd->bctx.count = 0;
169
  hd->bctx.blocksize_shift = _gcry_ctz(64);
170
  hd->bctx.bwrite = transform;
171
}
172
173
174
/****************
175
 * Transform the message X which consists of 16 32-bit-words
176
 */
177
static unsigned int
178
transform_blk ( void *ctx, const unsigned char *data )
179
217k
{
180
217k
  RMD160_CONTEXT *hd = ctx;
181
217k
  register u32 al, ar, bl, br, cl, cr, dl, dr, el, er;
182
217k
  u32 x[16];
183
217k
  int i;
184
185
3.69M
  for ( i = 0; i < 16; i++ )
186
3.47M
    x[i] = buf_get_le32(data + i * 4);
187
188
217k
#define K0  0x00000000
189
217k
#define K1  0x5A827999
190
217k
#define K2  0x6ED9EBA1
191
217k
#define K3  0x8F1BBCDC
192
217k
#define K4  0xA953FD4E
193
217k
#define KK0 0x50A28BE6
194
217k
#define KK1 0x5C4DD124
195
217k
#define KK2 0x6D703EF3
196
217k
#define KK3 0x7A6D76E9
197
217k
#define KK4 0x00000000
198
6.95M
#define F0(x,y,z)   ( (x) ^ (y) ^ (z) )
199
6.95M
#define F1(x,y,z)   ( ((x) & (y)) | (~(x) & (z)) )
200
6.95M
#define F2(x,y,z)   ( ((x) | ~(y)) ^ (z) )
201
6.95M
#define F3(x,y,z)   ( ((x) & (z)) | ((y) & ~(z)) )
202
6.95M
#define F4(x,y,z)   ( (x) ^ ((y) | ~(z)) )
203
34.7M
#define R(a,b,c,d,e,f,k,r,s) do { a += f(b,c,d) + k + x[r]; \
204
34.7M
          a = rol(a,s) + e;        \
205
34.7M
          c = rol(c,10);         \
206
34.7M
        } while(0)
207
208
  /* left lane and right lanes interleaved */
209
217k
  al = ar = hd->h0;
210
217k
  bl = br = hd->h1;
211
217k
  cl = cr = hd->h2;
212
217k
  dl = dr = hd->h3;
213
217k
  el = er = hd->h4;
214
217k
  R( al, bl, cl, dl, el, F0, K0,  0, 11 );
215
217k
  R( ar, br, cr, dr, er, F4, KK0,  5,  8);
216
217k
  R( el, al, bl, cl, dl, F0, K0,  1, 14 );
217
217k
  R( er, ar, br, cr, dr, F4, KK0, 14,  9);
218
217k
  R( dl, el, al, bl, cl, F0, K0,  2, 15 );
219
217k
  R( dr, er, ar, br, cr, F4, KK0,  7,  9);
220
217k
  R( cl, dl, el, al, bl, F0, K0,  3, 12 );
221
217k
  R( cr, dr, er, ar, br, F4, KK0,  0, 11);
222
217k
  R( bl, cl, dl, el, al, F0, K0,  4,  5 );
223
217k
  R( br, cr, dr, er, ar, F4, KK0,  9, 13);
224
217k
  R( al, bl, cl, dl, el, F0, K0,  5,  8 );
225
217k
  R( ar, br, cr, dr, er, F4, KK0,  2, 15);
226
217k
  R( el, al, bl, cl, dl, F0, K0,  6,  7 );
227
217k
  R( er, ar, br, cr, dr, F4, KK0, 11, 15);
228
217k
  R( dl, el, al, bl, cl, F0, K0,  7,  9 );
229
217k
  R( dr, er, ar, br, cr, F4, KK0,  4,  5);
230
217k
  R( cl, dl, el, al, bl, F0, K0,  8, 11 );
231
217k
  R( cr, dr, er, ar, br, F4, KK0, 13,  7);
232
217k
  R( bl, cl, dl, el, al, F0, K0,  9, 13 );
233
217k
  R( br, cr, dr, er, ar, F4, KK0,  6,  7);
234
217k
  R( al, bl, cl, dl, el, F0, K0, 10, 14 );
235
217k
  R( ar, br, cr, dr, er, F4, KK0, 15,  8);
236
217k
  R( el, al, bl, cl, dl, F0, K0, 11, 15 );
237
217k
  R( er, ar, br, cr, dr, F4, KK0,  8, 11);
238
217k
  R( dl, el, al, bl, cl, F0, K0, 12,  6 );
239
217k
  R( dr, er, ar, br, cr, F4, KK0,  1, 14);
240
217k
  R( cl, dl, el, al, bl, F0, K0, 13,  7 );
241
217k
  R( cr, dr, er, ar, br, F4, KK0, 10, 14);
242
217k
  R( bl, cl, dl, el, al, F0, K0, 14,  9 );
243
217k
  R( br, cr, dr, er, ar, F4, KK0,  3, 12);
244
217k
  R( al, bl, cl, dl, el, F0, K0, 15,  8 );
245
217k
  R( ar, br, cr, dr, er, F4, KK0, 12,  6);
246
217k
  R( el, al, bl, cl, dl, F1, K1,  7,  7 );
247
217k
  R( er, ar, br, cr, dr, F3, KK1,  6,  9);
248
217k
  R( dl, el, al, bl, cl, F1, K1,  4,  6 );
249
217k
  R( dr, er, ar, br, cr, F3, KK1, 11, 13);
250
217k
  R( cl, dl, el, al, bl, F1, K1, 13,  8 );
251
217k
  R( cr, dr, er, ar, br, F3, KK1,  3, 15);
252
217k
  R( bl, cl, dl, el, al, F1, K1,  1, 13 );
253
217k
  R( br, cr, dr, er, ar, F3, KK1,  7,  7);
254
217k
  R( al, bl, cl, dl, el, F1, K1, 10, 11 );
255
217k
  R( ar, br, cr, dr, er, F3, KK1,  0, 12);
256
217k
  R( el, al, bl, cl, dl, F1, K1,  6,  9 );
257
217k
  R( er, ar, br, cr, dr, F3, KK1, 13,  8);
258
217k
  R( dl, el, al, bl, cl, F1, K1, 15,  7 );
259
217k
  R( dr, er, ar, br, cr, F3, KK1,  5,  9);
260
217k
  R( cl, dl, el, al, bl, F1, K1,  3, 15 );
261
217k
  R( cr, dr, er, ar, br, F3, KK1, 10, 11);
262
217k
  R( bl, cl, dl, el, al, F1, K1, 12,  7 );
263
217k
  R( br, cr, dr, er, ar, F3, KK1, 14,  7);
264
217k
  R( al, bl, cl, dl, el, F1, K1,  0, 12 );
265
217k
  R( ar, br, cr, dr, er, F3, KK1, 15,  7);
266
217k
  R( el, al, bl, cl, dl, F1, K1,  9, 15 );
267
217k
  R( er, ar, br, cr, dr, F3, KK1,  8, 12);
268
217k
  R( dl, el, al, bl, cl, F1, K1,  5,  9 );
269
217k
  R( dr, er, ar, br, cr, F3, KK1, 12,  7);
270
217k
  R( cl, dl, el, al, bl, F1, K1,  2, 11 );
271
217k
  R( cr, dr, er, ar, br, F3, KK1,  4,  6);
272
217k
  R( bl, cl, dl, el, al, F1, K1, 14,  7 );
273
217k
  R( br, cr, dr, er, ar, F3, KK1,  9, 15);
274
217k
  R( al, bl, cl, dl, el, F1, K1, 11, 13 );
275
217k
  R( ar, br, cr, dr, er, F3, KK1,  1, 13);
276
217k
  R( el, al, bl, cl, dl, F1, K1,  8, 12 );
277
217k
  R( er, ar, br, cr, dr, F3, KK1,  2, 11);
278
217k
  R( dl, el, al, bl, cl, F2, K2,  3, 11 );
279
217k
  R( dr, er, ar, br, cr, F2, KK2, 15,  9);
280
217k
  R( cl, dl, el, al, bl, F2, K2, 10, 13 );
281
217k
  R( cr, dr, er, ar, br, F2, KK2,  5,  7);
282
217k
  R( bl, cl, dl, el, al, F2, K2, 14,  6 );
283
217k
  R( br, cr, dr, er, ar, F2, KK2,  1, 15);
284
217k
  R( al, bl, cl, dl, el, F2, K2,  4,  7 );
285
217k
  R( ar, br, cr, dr, er, F2, KK2,  3, 11);
286
217k
  R( el, al, bl, cl, dl, F2, K2,  9, 14 );
287
217k
  R( er, ar, br, cr, dr, F2, KK2,  7,  8);
288
217k
  R( dl, el, al, bl, cl, F2, K2, 15,  9 );
289
217k
  R( dr, er, ar, br, cr, F2, KK2, 14,  6);
290
217k
  R( cl, dl, el, al, bl, F2, K2,  8, 13 );
291
217k
  R( cr, dr, er, ar, br, F2, KK2,  6,  6);
292
217k
  R( bl, cl, dl, el, al, F2, K2,  1, 15 );
293
217k
  R( br, cr, dr, er, ar, F2, KK2,  9, 14);
294
217k
  R( al, bl, cl, dl, el, F2, K2,  2, 14 );
295
217k
  R( ar, br, cr, dr, er, F2, KK2, 11, 12);
296
217k
  R( el, al, bl, cl, dl, F2, K2,  7,  8 );
297
217k
  R( er, ar, br, cr, dr, F2, KK2,  8, 13);
298
217k
  R( dl, el, al, bl, cl, F2, K2,  0, 13 );
299
217k
  R( dr, er, ar, br, cr, F2, KK2, 12,  5);
300
217k
  R( cl, dl, el, al, bl, F2, K2,  6,  6 );
301
217k
  R( cr, dr, er, ar, br, F2, KK2,  2, 14);
302
217k
  R( bl, cl, dl, el, al, F2, K2, 13,  5 );
303
217k
  R( br, cr, dr, er, ar, F2, KK2, 10, 13);
304
217k
  R( al, bl, cl, dl, el, F2, K2, 11, 12 );
305
217k
  R( ar, br, cr, dr, er, F2, KK2,  0, 13);
306
217k
  R( el, al, bl, cl, dl, F2, K2,  5,  7 );
307
217k
  R( er, ar, br, cr, dr, F2, KK2,  4,  7);
308
217k
  R( dl, el, al, bl, cl, F2, K2, 12,  5 );
309
217k
  R( dr, er, ar, br, cr, F2, KK2, 13,  5);
310
217k
  R( cl, dl, el, al, bl, F3, K3,  1, 11 );
311
217k
  R( cr, dr, er, ar, br, F1, KK3,  8, 15);
312
217k
  R( bl, cl, dl, el, al, F3, K3,  9, 12 );
313
217k
  R( br, cr, dr, er, ar, F1, KK3,  6,  5);
314
217k
  R( al, bl, cl, dl, el, F3, K3, 11, 14 );
315
217k
  R( ar, br, cr, dr, er, F1, KK3,  4,  8);
316
217k
  R( el, al, bl, cl, dl, F3, K3, 10, 15 );
317
217k
  R( er, ar, br, cr, dr, F1, KK3,  1, 11);
318
217k
  R( dl, el, al, bl, cl, F3, K3,  0, 14 );
319
217k
  R( dr, er, ar, br, cr, F1, KK3,  3, 14);
320
217k
  R( cl, dl, el, al, bl, F3, K3,  8, 15 );
321
217k
  R( cr, dr, er, ar, br, F1, KK3, 11, 14);
322
217k
  R( bl, cl, dl, el, al, F3, K3, 12,  9 );
323
217k
  R( br, cr, dr, er, ar, F1, KK3, 15,  6);
324
217k
  R( al, bl, cl, dl, el, F3, K3,  4,  8 );
325
217k
  R( ar, br, cr, dr, er, F1, KK3,  0, 14);
326
217k
  R( el, al, bl, cl, dl, F3, K3, 13,  9 );
327
217k
  R( er, ar, br, cr, dr, F1, KK3,  5,  6);
328
217k
  R( dl, el, al, bl, cl, F3, K3,  3, 14 );
329
217k
  R( dr, er, ar, br, cr, F1, KK3, 12,  9);
330
217k
  R( cl, dl, el, al, bl, F3, K3,  7,  5 );
331
217k
  R( cr, dr, er, ar, br, F1, KK3,  2, 12);
332
217k
  R( bl, cl, dl, el, al, F3, K3, 15,  6 );
333
217k
  R( br, cr, dr, er, ar, F1, KK3, 13,  9);
334
217k
  R( al, bl, cl, dl, el, F3, K3, 14,  8 );
335
217k
  R( ar, br, cr, dr, er, F1, KK3,  9, 12);
336
217k
  R( el, al, bl, cl, dl, F3, K3,  5,  6 );
337
217k
  R( er, ar, br, cr, dr, F1, KK3,  7,  5);
338
217k
  R( dl, el, al, bl, cl, F3, K3,  6,  5 );
339
217k
  R( dr, er, ar, br, cr, F1, KK3, 10, 15);
340
217k
  R( cl, dl, el, al, bl, F3, K3,  2, 12 );
341
217k
  R( cr, dr, er, ar, br, F1, KK3, 14,  8);
342
217k
  R( bl, cl, dl, el, al, F4, K4,  4,  9 );
343
217k
  R( br, cr, dr, er, ar, F0, KK4, 12,  8);
344
217k
  R( al, bl, cl, dl, el, F4, K4,  0, 15 );
345
217k
  R( ar, br, cr, dr, er, F0, KK4, 15,  5);
346
217k
  R( el, al, bl, cl, dl, F4, K4,  5,  5 );
347
217k
  R( er, ar, br, cr, dr, F0, KK4, 10, 12);
348
217k
  R( dl, el, al, bl, cl, F4, K4,  9, 11 );
349
217k
  R( dr, er, ar, br, cr, F0, KK4,  4,  9);
350
217k
  R( cl, dl, el, al, bl, F4, K4,  7,  6 );
351
217k
  R( cr, dr, er, ar, br, F0, KK4,  1, 12);
352
217k
  R( bl, cl, dl, el, al, F4, K4, 12,  8 );
353
217k
  R( br, cr, dr, er, ar, F0, KK4,  5,  5);
354
217k
  R( al, bl, cl, dl, el, F4, K4,  2, 13 );
355
217k
  R( ar, br, cr, dr, er, F0, KK4,  8, 14);
356
217k
  R( el, al, bl, cl, dl, F4, K4, 10, 12 );
357
217k
  R( er, ar, br, cr, dr, F0, KK4,  7,  6);
358
217k
  R( dl, el, al, bl, cl, F4, K4, 14,  5 );
359
217k
  R( dr, er, ar, br, cr, F0, KK4,  6,  8);
360
217k
  R( cl, dl, el, al, bl, F4, K4,  1, 12 );
361
217k
  R( cr, dr, er, ar, br, F0, KK4,  2, 13);
362
217k
  R( bl, cl, dl, el, al, F4, K4,  3, 13 );
363
217k
  R( br, cr, dr, er, ar, F0, KK4, 13,  6);
364
217k
  R( al, bl, cl, dl, el, F4, K4,  8, 14 );
365
217k
  R( ar, br, cr, dr, er, F0, KK4, 14,  5);
366
217k
  R( el, al, bl, cl, dl, F4, K4, 11, 11 );
367
217k
  R( er, ar, br, cr, dr, F0, KK4,  0, 15);
368
217k
  R( dl, el, al, bl, cl, F4, K4,  6,  8 );
369
217k
  R( dr, er, ar, br, cr, F0, KK4,  3, 13);
370
217k
  R( cl, dl, el, al, bl, F4, K4, 15,  5 );
371
217k
  R( cr, dr, er, ar, br, F0, KK4,  9, 11);
372
217k
  R( bl, cl, dl, el, al, F4, K4, 13,  6 );
373
217k
  R( br, cr, dr, er, ar, F0, KK4, 11, 11);
374
375
217k
  dr += cl + hd->h1;
376
217k
  hd->h1 = hd->h2 + dl + er;
377
217k
  hd->h2 = hd->h3 + el + ar;
378
217k
  hd->h3 = hd->h4 + al + br;
379
217k
  hd->h4 = hd->h0 + bl + cr;
380
217k
  hd->h0 = dr;
381
382
217k
  return /*burn_stack*/ 104+5*sizeof(void*);
383
217k
}
384
385
386
static unsigned int
387
transform ( void *c, const unsigned char *data, size_t nblks )
388
{
389
  unsigned int burn;
390
391
  do
392
    {
393
      burn = transform_blk (c, data);
394
      data += 64;
395
    }
396
  while (--nblks);
397
398
  return burn;
399
}
400
401
402
/*
403
 * The routine terminates the computation
404
 */
405
static void
406
rmd160_final( void *context )
407
{
408
  RMD160_CONTEXT *hd = context;
409
  u32 t, th, msb, lsb;
410
  byte *p;
411
  unsigned int burn;
412
413
  t = hd->bctx.nblocks;
414
  if (sizeof t == sizeof hd->bctx.nblocks)
415
    th = hd->bctx.nblocks_high;
416
  else
417
    th = hd->bctx.nblocks >> 32;
418
419
  /* multiply by 64 to make a byte count */
420
  lsb = t << 6;
421
  msb = (th << 6) | (t >> 26);
422
  /* add the count */
423
  t = lsb;
424
  if( (lsb += hd->bctx.count) < t )
425
    msb++;
426
  /* multiply by 8 to make a bit count */
427
  t = lsb;
428
  lsb <<= 3;
429
  msb <<= 3;
430
  msb |= t >> 29;
431
432
  if (hd->bctx.count < 56)  /* enough room */
433
    {
434
      hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */
435
      if (hd->bctx.count < 56)
436
  memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count);
437
438
      /* append the 64 bit count */
439
      buf_put_le32(hd->bctx.buf + 56, lsb);
440
      buf_put_le32(hd->bctx.buf + 60, msb);
441
      burn = transform (hd, hd->bctx.buf, 1);
442
    }
443
  else /* need one extra block */
444
    {
445
      hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */
446
      /* fill pad and next block with zeroes */
447
      memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56);
448
449
      /* append the 64 bit count */
450
      buf_put_le32(hd->bctx.buf + 64 + 56, lsb);
451
      buf_put_le32(hd->bctx.buf + 64 + 60, msb);
452
      burn = transform (hd, hd->bctx.buf, 2);
453
    }
454
455
  p = hd->bctx.buf;
456
#define X(a) do { buf_put_le32(p, hd->h##a); p += 4; } while(0)
457
  X(0);
458
  X(1);
459
  X(2);
460
  X(3);
461
  X(4);
462
#undef X
463
464
  hd->bctx.count = 0;
465
466
  _gcry_burn_stack (burn);
467
}
468
469
static byte *
470
rmd160_read( void *context )
471
685
{
472
685
  RMD160_CONTEXT *hd = context;
473
474
685
  return hd->bctx.buf;
475
685
}
476
477
478
479
/****************
480
 * Shortcut functions which puts the hash value of the supplied buffer iov
481
 * into outbuf which must have a size of 20 bytes.
482
 */
483
static void
484
_gcry_rmd160_hash_buffers (void *outbuf, size_t nbytes,
485
         const gcry_buffer_t *iov, int iovcnt)
486
0
{
487
0
  RMD160_CONTEXT hd;
488
489
0
  (void)nbytes;
490
491
0
  rmd160_init (&hd, 0);
492
0
  for (;iovcnt > 0; iov++, iovcnt--)
493
0
    _gcry_md_block_write (&hd,
494
0
                          (const char*)iov[0].data + iov[0].off, iov[0].len);
495
0
  rmd160_final ( &hd );
496
0
  memcpy ( outbuf, hd.bctx.buf, 20 );
497
0
}
498
499
500
static const byte asn[15] = /* Object ID is 1.3.36.3.2.1 */
501
  { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03,
502
    0x02, 0x01, 0x05, 0x00, 0x04, 0x14 };
503
504
static const gcry_md_oid_spec_t oid_spec_rmd160[] =
505
  {
506
    /* rsaSignatureWithripemd160 */
507
    { "1.3.36.3.3.1.2" },
508
    /* TeleTrust hash algorithm.  */
509
    { "1.3.36.3.2.1" },
510
    { NULL }
511
  };
512
513
const gcry_md_spec_t _gcry_digest_spec_rmd160 =
514
  {
515
    GCRY_MD_RMD160, {0, 0},
516
    "RIPEMD160", asn, DIM (asn), oid_spec_rmd160, 20,
517
    rmd160_init, _gcry_md_block_write, rmd160_final, rmd160_read, NULL,
518
    _gcry_rmd160_hash_buffers,
519
    sizeof (RMD160_CONTEXT)
520
  };