diff options
Diffstat (limited to 'linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c')
-rw-r--r--[-rwxr-xr-x] | linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c | 1138 |
1 files changed, 569 insertions, 569 deletions
diff --git a/linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c b/linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c index f963d3d..d6bdab4 100755..100644 --- a/linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c +++ b/linden/indra/libgcrypt/libgcrypt-1.2.2/cipher/rmd160.c | |||
@@ -1,569 +1,569 @@ | |||
1 | /* rmd160.c - RIPE-MD160 | 1 | /* rmd160.c - RIPE-MD160 |
2 | * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. | 2 | * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. |
3 | * | 3 | * |
4 | * This file is part of Libgcrypt. | 4 | * This file is part of Libgcrypt. |
5 | * | 5 | * |
6 | * Libgcrypt is free software; you can redistribute it and/or modify | 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 | 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 | 8 | * published by the Free Software Foundation; either version 2.1 of |
9 | * the License, or (at your option) any later version. | 9 | * the License, or (at your option) any later version. |
10 | * | 10 | * |
11 | * Libgcrypt is distributed in the hope that it will be useful, | 11 | * Libgcrypt is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU Lesser General Public License for more details. | 14 | * GNU Lesser General Public License for more details. |
15 | * | 15 | * |
16 | * You should have received a copy of the GNU Lesser General Public | 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 | 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 | 18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <config.h> | 21 | #include <config.h> |
22 | #include <stdio.h> | 22 | #include <stdio.h> |
23 | #include <stdlib.h> | 23 | #include <stdlib.h> |
24 | #include <string.h> | 24 | #include <string.h> |
25 | #include <assert.h> | 25 | #include <assert.h> |
26 | #include "g10lib.h" | 26 | #include "g10lib.h" |
27 | #include "memory.h" | 27 | #include "memory.h" |
28 | #include "rmd.h" | 28 | #include "rmd.h" |
29 | #include "cipher.h" /* only used for the rmd160_hash_buffer() prototype */ | 29 | #include "cipher.h" /* only used for the rmd160_hash_buffer() prototype */ |
30 | 30 | ||
31 | #include "bithelp.h" | 31 | #include "bithelp.h" |
32 | 32 | ||
33 | /********************************* | 33 | /********************************* |
34 | * RIPEMD-160 is not patented, see (as of 25.10.97) | 34 | * RIPEMD-160 is not patented, see (as of 25.10.97) |
35 | * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html | 35 | * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html |
36 | * Note that the code uses Little Endian byteorder, which is good for | 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. | 37 | * 386 etc, but we must add some conversion when used on a big endian box. |
38 | * | 38 | * |
39 | * | 39 | * |
40 | * Pseudo-code for RIPEMD-160 | 40 | * Pseudo-code for RIPEMD-160 |
41 | * | 41 | * |
42 | * RIPEMD-160 is an iterative hash function that operates on 32-bit words. | 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 | 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 | 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. | 45 | * defined on 32-bit words. Padding is identical to that of MD4. |
46 | * | 46 | * |
47 | * | 47 | * |
48 | * RIPEMD-160: definitions | 48 | * RIPEMD-160: definitions |
49 | * | 49 | * |
50 | * | 50 | * |
51 | * nonlinear functions at bit level: exor, mux, -, mux, - | 51 | * nonlinear functions at bit level: exor, mux, -, mux, - |
52 | * | 52 | * |
53 | * f(j, x, y, z) = x XOR y XOR z (0 <= j <= 15) | 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) | 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) | 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) | 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) | 57 | * f(j, x, y, z) = x XOR (y OR NOT(z)) (64 <= j <= 79) |
58 | * | 58 | * |
59 | * | 59 | * |
60 | * added constants (hexadecimal) | 60 | * added constants (hexadecimal) |
61 | * | 61 | * |
62 | * K(j) = 0x00000000 (0 <= j <= 15) | 62 | * K(j) = 0x00000000 (0 <= j <= 15) |
63 | * K(j) = 0x5A827999 (16 <= j <= 31) int(2**30 x sqrt(2)) | 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)) | 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)) | 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)) | 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)) | 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)) | 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)) | 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)) | 70 | * K'(j) = 0x7A6D76E9 (48 <= j <= 63) int(2**30 x cbrt(7)) |
71 | * K'(j) = 0x00000000 (64 <= j <= 79) | 71 | * K'(j) = 0x00000000 (64 <= j <= 79) |
72 | * | 72 | * |
73 | * | 73 | * |
74 | * selection of message word | 74 | * selection of message word |
75 | * | 75 | * |
76 | * r(j) = j (0 <= j <= 15) | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 85 | * r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 |
86 | * | 86 | * |
87 | * | 87 | * |
88 | * amount for rotate left (rol) | 88 | * amount for rotate left (rol) |
89 | * | 89 | * |
90 | * s(0..15) = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 99 | * s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 |
100 | * | 100 | * |
101 | * | 101 | * |
102 | * initial value (hexadecimal) | 102 | * initial value (hexadecimal) |
103 | * | 103 | * |
104 | * h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; | 104 | * h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; |
105 | * h4 = 0xC3D2E1F0; | 105 | * h4 = 0xC3D2E1F0; |
106 | * | 106 | * |
107 | * | 107 | * |
108 | * RIPEMD-160: pseudo-code | 108 | * RIPEMD-160: pseudo-code |
109 | * | 109 | * |
110 | * It is assumed that the message after padding consists of t 16-word blocks | 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. | 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 | 112 | * The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left |
113 | * shift (rotate) over s positions. | 113 | * shift (rotate) over s positions. |
114 | * | 114 | * |
115 | * | 115 | * |
116 | * for i := 0 to t-1 { | 116 | * for i := 0 to t-1 { |
117 | * A := h0; B := h1; C := h2; D = h3; E = h4; | 117 | * A := h0; B := h1; C := h2; D = h3; E = h4; |
118 | * 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 { | 119 | * for j := 0 to 79 { |
120 | * T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E; | 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; | 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)] | 122 | * T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)] |
123 | [+] K'(j)) [+] E'; | 123 | [+] K'(j)) [+] E'; |
124 | * A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T; | 124 | * A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T; |
125 | * } | 125 | * } |
126 | * T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A'; | 126 | * T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A'; |
127 | * h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T; | 127 | * h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T; |
128 | * } | 128 | * } |
129 | */ | 129 | */ |
130 | 130 | ||
131 | /* Some examples: | 131 | /* Some examples: |
132 | * "" 9c1185a5c5e9fc54612808977ee8f548b2258d31 | 132 | * "" 9c1185a5c5e9fc54612808977ee8f548b2258d31 |
133 | * "a" 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe | 133 | * "a" 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe |
134 | * "abc" 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc | 134 | * "abc" 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc |
135 | * "message digest" 5d0689ef49d2fae572b881b123a85ffa21595f36 | 135 | * "message digest" 5d0689ef49d2fae572b881b123a85ffa21595f36 |
136 | * "a...z" f71c27109c692c1b56bbdceb5b9d2865b3708dbc | 136 | * "a...z" f71c27109c692c1b56bbdceb5b9d2865b3708dbc |
137 | * "abcdbcde...nopq" 12a053384a9c0c88e405a06c27dcf49ada62eb2b | 137 | * "abcdbcde...nopq" 12a053384a9c0c88e405a06c27dcf49ada62eb2b |
138 | * "A...Za...z0...9" b0e20b6e3116640286ed3a87a5713079b21f5189 | 138 | * "A...Za...z0...9" b0e20b6e3116640286ed3a87a5713079b21f5189 |
139 | * 8 times "1234567890" 9b752e45573d4b39f4dbd3323cab82bf63326bfb | 139 | * 8 times "1234567890" 9b752e45573d4b39f4dbd3323cab82bf63326bfb |
140 | * 1 million times "a" 52783243c1697bdbe16d37f97f68f08325dc1528 | 140 | * 1 million times "a" 52783243c1697bdbe16d37f97f68f08325dc1528 |
141 | */ | 141 | */ |
142 | 142 | ||
143 | 143 | ||
144 | void | 144 | void |
145 | _gcry_rmd160_init (void *context) | 145 | _gcry_rmd160_init (void *context) |
146 | { | 146 | { |
147 | RMD160_CONTEXT *hd = context; | 147 | RMD160_CONTEXT *hd = context; |
148 | 148 | ||
149 | hd->h0 = 0x67452301; | 149 | hd->h0 = 0x67452301; |
150 | hd->h1 = 0xEFCDAB89; | 150 | hd->h1 = 0xEFCDAB89; |
151 | hd->h2 = 0x98BADCFE; | 151 | hd->h2 = 0x98BADCFE; |
152 | hd->h3 = 0x10325476; | 152 | hd->h3 = 0x10325476; |
153 | hd->h4 = 0xC3D2E1F0; | 153 | hd->h4 = 0xC3D2E1F0; |
154 | hd->nblocks = 0; | 154 | hd->nblocks = 0; |
155 | hd->count = 0; | 155 | hd->count = 0; |
156 | } | 156 | } |
157 | 157 | ||
158 | 158 | ||
159 | 159 | ||
160 | /**************** | 160 | /**************** |
161 | * Transform the message X which consists of 16 32-bit-words | 161 | * Transform the message X which consists of 16 32-bit-words |
162 | */ | 162 | */ |
163 | static void | 163 | static void |
164 | transform( RMD160_CONTEXT *hd, byte *data ) | 164 | transform( RMD160_CONTEXT *hd, byte *data ) |
165 | { | 165 | { |
166 | register u32 a,b,c,d,e; | 166 | register u32 a,b,c,d,e; |
167 | u32 aa,bb,cc,dd,ee,t; | 167 | u32 aa,bb,cc,dd,ee,t; |
168 | #ifdef WORDS_BIGENDIAN | 168 | #ifdef WORDS_BIGENDIAN |
169 | u32 x[16]; | 169 | u32 x[16]; |
170 | { | 170 | { |
171 | int i; | 171 | int i; |
172 | byte *p2, *p1; | 172 | byte *p2, *p1; |
173 | for (i=0, p1=data, p2=(byte*)x; i < 16; i++, p2 += 4 ) | 173 | for (i=0, p1=data, p2=(byte*)x; i < 16; i++, p2 += 4 ) |
174 | { | 174 | { |
175 | p2[3] = *p1++; | 175 | p2[3] = *p1++; |
176 | p2[2] = *p1++; | 176 | p2[2] = *p1++; |
177 | p2[1] = *p1++; | 177 | p2[1] = *p1++; |
178 | p2[0] = *p1++; | 178 | p2[0] = *p1++; |
179 | } | 179 | } |
180 | } | 180 | } |
181 | #else | 181 | #else |
182 | /* This version is better because it is always aligned; | 182 | /* This version is better because it is always aligned; |
183 | * The performance penalty on a 586-100 is about 6% which | 183 | * The performance penalty on a 586-100 is about 6% which |
184 | * is acceptable - because the data is more local it might | 184 | * is acceptable - because the data is more local it might |
185 | * also be possible that this is faster on some machines. | 185 | * also be possible that this is faster on some machines. |
186 | * This function (when compiled with -02 on gcc 2.7.2) | 186 | * This function (when compiled with -02 on gcc 2.7.2) |
187 | * executes on a 586-100 (39.73 bogomips) at about 1900kb/sec; | 187 | * executes on a 586-100 (39.73 bogomips) at about 1900kb/sec; |
188 | * [measured with a 4MB data and "gpgm --print-md rmd160"] */ | 188 | * [measured with a 4MB data and "gpgm --print-md rmd160"] */ |
189 | u32 x[16]; | 189 | u32 x[16]; |
190 | memcpy( x, data, 64 ); | 190 | memcpy( x, data, 64 ); |
191 | #endif | 191 | #endif |
192 | 192 | ||
193 | 193 | ||
194 | #define K0 0x00000000 | 194 | #define K0 0x00000000 |
195 | #define K1 0x5A827999 | 195 | #define K1 0x5A827999 |
196 | #define K2 0x6ED9EBA1 | 196 | #define K2 0x6ED9EBA1 |
197 | #define K3 0x8F1BBCDC | 197 | #define K3 0x8F1BBCDC |
198 | #define K4 0xA953FD4E | 198 | #define K4 0xA953FD4E |
199 | #define KK0 0x50A28BE6 | 199 | #define KK0 0x50A28BE6 |
200 | #define KK1 0x5C4DD124 | 200 | #define KK1 0x5C4DD124 |
201 | #define KK2 0x6D703EF3 | 201 | #define KK2 0x6D703EF3 |
202 | #define KK3 0x7A6D76E9 | 202 | #define KK3 0x7A6D76E9 |
203 | #define KK4 0x00000000 | 203 | #define KK4 0x00000000 |
204 | #define F0(x,y,z) ( (x) ^ (y) ^ (z) ) | 204 | #define F0(x,y,z) ( (x) ^ (y) ^ (z) ) |
205 | #define F1(x,y,z) ( ((x) & (y)) | (~(x) & (z)) ) | 205 | #define F1(x,y,z) ( ((x) & (y)) | (~(x) & (z)) ) |
206 | #define F2(x,y,z) ( ((x) | ~(y)) ^ (z) ) | 206 | #define F2(x,y,z) ( ((x) | ~(y)) ^ (z) ) |
207 | #define F3(x,y,z) ( ((x) & (z)) | ((y) & ~(z)) ) | 207 | #define F3(x,y,z) ( ((x) & (z)) | ((y) & ~(z)) ) |
208 | #define F4(x,y,z) ( (x) ^ ((y) | ~(z)) ) | 208 | #define F4(x,y,z) ( (x) ^ ((y) | ~(z)) ) |
209 | #define R(a,b,c,d,e,f,k,r,s) do { t = a + f(b,c,d) + k + x[r]; \ | 209 | #define R(a,b,c,d,e,f,k,r,s) do { t = a + f(b,c,d) + k + x[r]; \ |
210 | a = rol(t,s) + e; \ | 210 | a = rol(t,s) + e; \ |
211 | c = rol(c,10); \ | 211 | c = rol(c,10); \ |
212 | } while(0) | 212 | } while(0) |
213 | 213 | ||
214 | /* left lane */ | 214 | /* left lane */ |
215 | a = hd->h0; | 215 | a = hd->h0; |
216 | b = hd->h1; | 216 | b = hd->h1; |
217 | c = hd->h2; | 217 | c = hd->h2; |
218 | d = hd->h3; | 218 | d = hd->h3; |
219 | e = hd->h4; | 219 | e = hd->h4; |
220 | R( a, b, c, d, e, F0, K0, 0, 11 ); | 220 | R( a, b, c, d, e, F0, K0, 0, 11 ); |
221 | R( e, a, b, c, d, F0, K0, 1, 14 ); | 221 | R( e, a, b, c, d, F0, K0, 1, 14 ); |
222 | R( d, e, a, b, c, F0, K0, 2, 15 ); | 222 | R( d, e, a, b, c, F0, K0, 2, 15 ); |
223 | R( c, d, e, a, b, F0, K0, 3, 12 ); | 223 | R( c, d, e, a, b, F0, K0, 3, 12 ); |
224 | R( b, c, d, e, a, F0, K0, 4, 5 ); | 224 | R( b, c, d, e, a, F0, K0, 4, 5 ); |
225 | R( a, b, c, d, e, F0, K0, 5, 8 ); | 225 | R( a, b, c, d, e, F0, K0, 5, 8 ); |
226 | R( e, a, b, c, d, F0, K0, 6, 7 ); | 226 | R( e, a, b, c, d, F0, K0, 6, 7 ); |
227 | R( d, e, a, b, c, F0, K0, 7, 9 ); | 227 | R( d, e, a, b, c, F0, K0, 7, 9 ); |
228 | R( c, d, e, a, b, F0, K0, 8, 11 ); | 228 | R( c, d, e, a, b, F0, K0, 8, 11 ); |
229 | R( b, c, d, e, a, F0, K0, 9, 13 ); | 229 | R( b, c, d, e, a, F0, K0, 9, 13 ); |
230 | R( a, b, c, d, e, F0, K0, 10, 14 ); | 230 | R( a, b, c, d, e, F0, K0, 10, 14 ); |
231 | R( e, a, b, c, d, F0, K0, 11, 15 ); | 231 | R( e, a, b, c, d, F0, K0, 11, 15 ); |
232 | R( d, e, a, b, c, F0, K0, 12, 6 ); | 232 | R( d, e, a, b, c, F0, K0, 12, 6 ); |
233 | R( c, d, e, a, b, F0, K0, 13, 7 ); | 233 | R( c, d, e, a, b, F0, K0, 13, 7 ); |
234 | R( b, c, d, e, a, F0, K0, 14, 9 ); | 234 | R( b, c, d, e, a, F0, K0, 14, 9 ); |
235 | R( a, b, c, d, e, F0, K0, 15, 8 ); | 235 | R( a, b, c, d, e, F0, K0, 15, 8 ); |
236 | R( e, a, b, c, d, F1, K1, 7, 7 ); | 236 | R( e, a, b, c, d, F1, K1, 7, 7 ); |
237 | R( d, e, a, b, c, F1, K1, 4, 6 ); | 237 | R( d, e, a, b, c, F1, K1, 4, 6 ); |
238 | R( c, d, e, a, b, F1, K1, 13, 8 ); | 238 | R( c, d, e, a, b, F1, K1, 13, 8 ); |
239 | R( b, c, d, e, a, F1, K1, 1, 13 ); | 239 | R( b, c, d, e, a, F1, K1, 1, 13 ); |
240 | R( a, b, c, d, e, F1, K1, 10, 11 ); | 240 | R( a, b, c, d, e, F1, K1, 10, 11 ); |
241 | R( e, a, b, c, d, F1, K1, 6, 9 ); | 241 | R( e, a, b, c, d, F1, K1, 6, 9 ); |
242 | R( d, e, a, b, c, F1, K1, 15, 7 ); | 242 | R( d, e, a, b, c, F1, K1, 15, 7 ); |
243 | R( c, d, e, a, b, F1, K1, 3, 15 ); | 243 | R( c, d, e, a, b, F1, K1, 3, 15 ); |
244 | R( b, c, d, e, a, F1, K1, 12, 7 ); | 244 | R( b, c, d, e, a, F1, K1, 12, 7 ); |
245 | R( a, b, c, d, e, F1, K1, 0, 12 ); | 245 | R( a, b, c, d, e, F1, K1, 0, 12 ); |
246 | R( e, a, b, c, d, F1, K1, 9, 15 ); | 246 | R( e, a, b, c, d, F1, K1, 9, 15 ); |
247 | R( d, e, a, b, c, F1, K1, 5, 9 ); | 247 | R( d, e, a, b, c, F1, K1, 5, 9 ); |
248 | R( c, d, e, a, b, F1, K1, 2, 11 ); | 248 | R( c, d, e, a, b, F1, K1, 2, 11 ); |
249 | R( b, c, d, e, a, F1, K1, 14, 7 ); | 249 | R( b, c, d, e, a, F1, K1, 14, 7 ); |
250 | R( a, b, c, d, e, F1, K1, 11, 13 ); | 250 | R( a, b, c, d, e, F1, K1, 11, 13 ); |
251 | R( e, a, b, c, d, F1, K1, 8, 12 ); | 251 | R( e, a, b, c, d, F1, K1, 8, 12 ); |
252 | R( d, e, a, b, c, F2, K2, 3, 11 ); | 252 | R( d, e, a, b, c, F2, K2, 3, 11 ); |
253 | R( c, d, e, a, b, F2, K2, 10, 13 ); | 253 | R( c, d, e, a, b, F2, K2, 10, 13 ); |
254 | R( b, c, d, e, a, F2, K2, 14, 6 ); | 254 | R( b, c, d, e, a, F2, K2, 14, 6 ); |
255 | R( a, b, c, d, e, F2, K2, 4, 7 ); | 255 | R( a, b, c, d, e, F2, K2, 4, 7 ); |
256 | R( e, a, b, c, d, F2, K2, 9, 14 ); | 256 | R( e, a, b, c, d, F2, K2, 9, 14 ); |
257 | R( d, e, a, b, c, F2, K2, 15, 9 ); | 257 | R( d, e, a, b, c, F2, K2, 15, 9 ); |
258 | R( c, d, e, a, b, F2, K2, 8, 13 ); | 258 | R( c, d, e, a, b, F2, K2, 8, 13 ); |
259 | R( b, c, d, e, a, F2, K2, 1, 15 ); | 259 | R( b, c, d, e, a, F2, K2, 1, 15 ); |
260 | R( a, b, c, d, e, F2, K2, 2, 14 ); | 260 | R( a, b, c, d, e, F2, K2, 2, 14 ); |
261 | R( e, a, b, c, d, F2, K2, 7, 8 ); | 261 | R( e, a, b, c, d, F2, K2, 7, 8 ); |
262 | R( d, e, a, b, c, F2, K2, 0, 13 ); | 262 | R( d, e, a, b, c, F2, K2, 0, 13 ); |
263 | R( c, d, e, a, b, F2, K2, 6, 6 ); | 263 | R( c, d, e, a, b, F2, K2, 6, 6 ); |
264 | R( b, c, d, e, a, F2, K2, 13, 5 ); | 264 | R( b, c, d, e, a, F2, K2, 13, 5 ); |
265 | R( a, b, c, d, e, F2, K2, 11, 12 ); | 265 | R( a, b, c, d, e, F2, K2, 11, 12 ); |
266 | R( e, a, b, c, d, F2, K2, 5, 7 ); | 266 | R( e, a, b, c, d, F2, K2, 5, 7 ); |
267 | R( d, e, a, b, c, F2, K2, 12, 5 ); | 267 | R( d, e, a, b, c, F2, K2, 12, 5 ); |
268 | R( c, d, e, a, b, F3, K3, 1, 11 ); | 268 | R( c, d, e, a, b, F3, K3, 1, 11 ); |
269 | R( b, c, d, e, a, F3, K3, 9, 12 ); | 269 | R( b, c, d, e, a, F3, K3, 9, 12 ); |
270 | R( a, b, c, d, e, F3, K3, 11, 14 ); | 270 | R( a, b, c, d, e, F3, K3, 11, 14 ); |
271 | R( e, a, b, c, d, F3, K3, 10, 15 ); | 271 | R( e, a, b, c, d, F3, K3, 10, 15 ); |
272 | R( d, e, a, b, c, F3, K3, 0, 14 ); | 272 | R( d, e, a, b, c, F3, K3, 0, 14 ); |
273 | R( c, d, e, a, b, F3, K3, 8, 15 ); | 273 | R( c, d, e, a, b, F3, K3, 8, 15 ); |
274 | R( b, c, d, e, a, F3, K3, 12, 9 ); | 274 | R( b, c, d, e, a, F3, K3, 12, 9 ); |
275 | R( a, b, c, d, e, F3, K3, 4, 8 ); | 275 | R( a, b, c, d, e, F3, K3, 4, 8 ); |
276 | R( e, a, b, c, d, F3, K3, 13, 9 ); | 276 | R( e, a, b, c, d, F3, K3, 13, 9 ); |
277 | R( d, e, a, b, c, F3, K3, 3, 14 ); | 277 | R( d, e, a, b, c, F3, K3, 3, 14 ); |
278 | R( c, d, e, a, b, F3, K3, 7, 5 ); | 278 | R( c, d, e, a, b, F3, K3, 7, 5 ); |
279 | R( b, c, d, e, a, F3, K3, 15, 6 ); | 279 | R( b, c, d, e, a, F3, K3, 15, 6 ); |
280 | R( a, b, c, d, e, F3, K3, 14, 8 ); | 280 | R( a, b, c, d, e, F3, K3, 14, 8 ); |
281 | R( e, a, b, c, d, F3, K3, 5, 6 ); | 281 | R( e, a, b, c, d, F3, K3, 5, 6 ); |
282 | R( d, e, a, b, c, F3, K3, 6, 5 ); | 282 | R( d, e, a, b, c, F3, K3, 6, 5 ); |
283 | R( c, d, e, a, b, F3, K3, 2, 12 ); | 283 | R( c, d, e, a, b, F3, K3, 2, 12 ); |
284 | R( b, c, d, e, a, F4, K4, 4, 9 ); | 284 | R( b, c, d, e, a, F4, K4, 4, 9 ); |
285 | R( a, b, c, d, e, F4, K4, 0, 15 ); | 285 | R( a, b, c, d, e, F4, K4, 0, 15 ); |
286 | R( e, a, b, c, d, F4, K4, 5, 5 ); | 286 | R( e, a, b, c, d, F4, K4, 5, 5 ); |
287 | R( d, e, a, b, c, F4, K4, 9, 11 ); | 287 | R( d, e, a, b, c, F4, K4, 9, 11 ); |
288 | R( c, d, e, a, b, F4, K4, 7, 6 ); | 288 | R( c, d, e, a, b, F4, K4, 7, 6 ); |
289 | R( b, c, d, e, a, F4, K4, 12, 8 ); | 289 | R( b, c, d, e, a, F4, K4, 12, 8 ); |
290 | R( a, b, c, d, e, F4, K4, 2, 13 ); | 290 | R( a, b, c, d, e, F4, K4, 2, 13 ); |
291 | R( e, a, b, c, d, F4, K4, 10, 12 ); | 291 | R( e, a, b, c, d, F4, K4, 10, 12 ); |
292 | R( d, e, a, b, c, F4, K4, 14, 5 ); | 292 | R( d, e, a, b, c, F4, K4, 14, 5 ); |
293 | R( c, d, e, a, b, F4, K4, 1, 12 ); | 293 | R( c, d, e, a, b, F4, K4, 1, 12 ); |
294 | R( b, c, d, e, a, F4, K4, 3, 13 ); | 294 | R( b, c, d, e, a, F4, K4, 3, 13 ); |
295 | R( a, b, c, d, e, F4, K4, 8, 14 ); | 295 | R( a, b, c, d, e, F4, K4, 8, 14 ); |
296 | R( e, a, b, c, d, F4, K4, 11, 11 ); | 296 | R( e, a, b, c, d, F4, K4, 11, 11 ); |
297 | R( d, e, a, b, c, F4, K4, 6, 8 ); | 297 | R( d, e, a, b, c, F4, K4, 6, 8 ); |
298 | R( c, d, e, a, b, F4, K4, 15, 5 ); | 298 | R( c, d, e, a, b, F4, K4, 15, 5 ); |
299 | R( b, c, d, e, a, F4, K4, 13, 6 ); | 299 | R( b, c, d, e, a, F4, K4, 13, 6 ); |
300 | 300 | ||
301 | aa = a; bb = b; cc = c; dd = d; ee = e; | 301 | aa = a; bb = b; cc = c; dd = d; ee = e; |
302 | 302 | ||
303 | /* right lane */ | 303 | /* right lane */ |
304 | a = hd->h0; | 304 | a = hd->h0; |
305 | b = hd->h1; | 305 | b = hd->h1; |
306 | c = hd->h2; | 306 | c = hd->h2; |
307 | d = hd->h3; | 307 | d = hd->h3; |
308 | e = hd->h4; | 308 | e = hd->h4; |
309 | R( a, b, c, d, e, F4, KK0, 5, 8); | 309 | R( a, b, c, d, e, F4, KK0, 5, 8); |
310 | R( e, a, b, c, d, F4, KK0, 14, 9); | 310 | R( e, a, b, c, d, F4, KK0, 14, 9); |
311 | R( d, e, a, b, c, F4, KK0, 7, 9); | 311 | R( d, e, a, b, c, F4, KK0, 7, 9); |
312 | R( c, d, e, a, b, F4, KK0, 0, 11); | 312 | R( c, d, e, a, b, F4, KK0, 0, 11); |
313 | R( b, c, d, e, a, F4, KK0, 9, 13); | 313 | R( b, c, d, e, a, F4, KK0, 9, 13); |
314 | R( a, b, c, d, e, F4, KK0, 2, 15); | 314 | R( a, b, c, d, e, F4, KK0, 2, 15); |
315 | R( e, a, b, c, d, F4, KK0, 11, 15); | 315 | R( e, a, b, c, d, F4, KK0, 11, 15); |
316 | R( d, e, a, b, c, F4, KK0, 4, 5); | 316 | R( d, e, a, b, c, F4, KK0, 4, 5); |
317 | R( c, d, e, a, b, F4, KK0, 13, 7); | 317 | R( c, d, e, a, b, F4, KK0, 13, 7); |
318 | R( b, c, d, e, a, F4, KK0, 6, 7); | 318 | R( b, c, d, e, a, F4, KK0, 6, 7); |
319 | R( a, b, c, d, e, F4, KK0, 15, 8); | 319 | R( a, b, c, d, e, F4, KK0, 15, 8); |
320 | R( e, a, b, c, d, F4, KK0, 8, 11); | 320 | R( e, a, b, c, d, F4, KK0, 8, 11); |
321 | R( d, e, a, b, c, F4, KK0, 1, 14); | 321 | R( d, e, a, b, c, F4, KK0, 1, 14); |
322 | R( c, d, e, a, b, F4, KK0, 10, 14); | 322 | R( c, d, e, a, b, F4, KK0, 10, 14); |
323 | R( b, c, d, e, a, F4, KK0, 3, 12); | 323 | R( b, c, d, e, a, F4, KK0, 3, 12); |
324 | R( a, b, c, d, e, F4, KK0, 12, 6); | 324 | R( a, b, c, d, e, F4, KK0, 12, 6); |
325 | R( e, a, b, c, d, F3, KK1, 6, 9); | 325 | R( e, a, b, c, d, F3, KK1, 6, 9); |
326 | R( d, e, a, b, c, F3, KK1, 11, 13); | 326 | R( d, e, a, b, c, F3, KK1, 11, 13); |
327 | R( c, d, e, a, b, F3, KK1, 3, 15); | 327 | R( c, d, e, a, b, F3, KK1, 3, 15); |
328 | R( b, c, d, e, a, F3, KK1, 7, 7); | 328 | R( b, c, d, e, a, F3, KK1, 7, 7); |
329 | R( a, b, c, d, e, F3, KK1, 0, 12); | 329 | R( a, b, c, d, e, F3, KK1, 0, 12); |
330 | R( e, a, b, c, d, F3, KK1, 13, 8); | 330 | R( e, a, b, c, d, F3, KK1, 13, 8); |
331 | R( d, e, a, b, c, F3, KK1, 5, 9); | 331 | R( d, e, a, b, c, F3, KK1, 5, 9); |
332 | R( c, d, e, a, b, F3, KK1, 10, 11); | 332 | R( c, d, e, a, b, F3, KK1, 10, 11); |
333 | R( b, c, d, e, a, F3, KK1, 14, 7); | 333 | R( b, c, d, e, a, F3, KK1, 14, 7); |
334 | R( a, b, c, d, e, F3, KK1, 15, 7); | 334 | R( a, b, c, d, e, F3, KK1, 15, 7); |
335 | R( e, a, b, c, d, F3, KK1, 8, 12); | 335 | R( e, a, b, c, d, F3, KK1, 8, 12); |
336 | R( d, e, a, b, c, F3, KK1, 12, 7); | 336 | R( d, e, a, b, c, F3, KK1, 12, 7); |
337 | R( c, d, e, a, b, F3, KK1, 4, 6); | 337 | R( c, d, e, a, b, F3, KK1, 4, 6); |
338 | R( b, c, d, e, a, F3, KK1, 9, 15); | 338 | R( b, c, d, e, a, F3, KK1, 9, 15); |
339 | R( a, b, c, d, e, F3, KK1, 1, 13); | 339 | R( a, b, c, d, e, F3, KK1, 1, 13); |
340 | R( e, a, b, c, d, F3, KK1, 2, 11); | 340 | R( e, a, b, c, d, F3, KK1, 2, 11); |
341 | R( d, e, a, b, c, F2, KK2, 15, 9); | 341 | R( d, e, a, b, c, F2, KK2, 15, 9); |
342 | R( c, d, e, a, b, F2, KK2, 5, 7); | 342 | R( c, d, e, a, b, F2, KK2, 5, 7); |
343 | R( b, c, d, e, a, F2, KK2, 1, 15); | 343 | R( b, c, d, e, a, F2, KK2, 1, 15); |
344 | R( a, b, c, d, e, F2, KK2, 3, 11); | 344 | R( a, b, c, d, e, F2, KK2, 3, 11); |
345 | R( e, a, b, c, d, F2, KK2, 7, 8); | 345 | R( e, a, b, c, d, F2, KK2, 7, 8); |
346 | R( d, e, a, b, c, F2, KK2, 14, 6); | 346 | R( d, e, a, b, c, F2, KK2, 14, 6); |
347 | R( c, d, e, a, b, F2, KK2, 6, 6); | 347 | R( c, d, e, a, b, F2, KK2, 6, 6); |
348 | R( b, c, d, e, a, F2, KK2, 9, 14); | 348 | R( b, c, d, e, a, F2, KK2, 9, 14); |
349 | R( a, b, c, d, e, F2, KK2, 11, 12); | 349 | R( a, b, c, d, e, F2, KK2, 11, 12); |
350 | R( e, a, b, c, d, F2, KK2, 8, 13); | 350 | R( e, a, b, c, d, F2, KK2, 8, 13); |
351 | R( d, e, a, b, c, F2, KK2, 12, 5); | 351 | R( d, e, a, b, c, F2, KK2, 12, 5); |
352 | R( c, d, e, a, b, F2, KK2, 2, 14); | 352 | R( c, d, e, a, b, F2, KK2, 2, 14); |
353 | R( b, c, d, e, a, F2, KK2, 10, 13); | 353 | R( b, c, d, e, a, F2, KK2, 10, 13); |
354 | R( a, b, c, d, e, F2, KK2, 0, 13); | 354 | R( a, b, c, d, e, F2, KK2, 0, 13); |
355 | R( e, a, b, c, d, F2, KK2, 4, 7); | 355 | R( e, a, b, c, d, F2, KK2, 4, 7); |
356 | R( d, e, a, b, c, F2, KK2, 13, 5); | 356 | R( d, e, a, b, c, F2, KK2, 13, 5); |
357 | R( c, d, e, a, b, F1, KK3, 8, 15); | 357 | R( c, d, e, a, b, F1, KK3, 8, 15); |
358 | R( b, c, d, e, a, F1, KK3, 6, 5); | 358 | R( b, c, d, e, a, F1, KK3, 6, 5); |
359 | R( a, b, c, d, e, F1, KK3, 4, 8); | 359 | R( a, b, c, d, e, F1, KK3, 4, 8); |
360 | R( e, a, b, c, d, F1, KK3, 1, 11); | 360 | R( e, a, b, c, d, F1, KK3, 1, 11); |
361 | R( d, e, a, b, c, F1, KK3, 3, 14); | 361 | R( d, e, a, b, c, F1, KK3, 3, 14); |
362 | R( c, d, e, a, b, F1, KK3, 11, 14); | 362 | R( c, d, e, a, b, F1, KK3, 11, 14); |
363 | R( b, c, d, e, a, F1, KK3, 15, 6); | 363 | R( b, c, d, e, a, F1, KK3, 15, 6); |
364 | R( a, b, c, d, e, F1, KK3, 0, 14); | 364 | R( a, b, c, d, e, F1, KK3, 0, 14); |
365 | R( e, a, b, c, d, F1, KK3, 5, 6); | 365 | R( e, a, b, c, d, F1, KK3, 5, 6); |
366 | R( d, e, a, b, c, F1, KK3, 12, 9); | 366 | R( d, e, a, b, c, F1, KK3, 12, 9); |
367 | R( c, d, e, a, b, F1, KK3, 2, 12); | 367 | R( c, d, e, a, b, F1, KK3, 2, 12); |
368 | R( b, c, d, e, a, F1, KK3, 13, 9); | 368 | R( b, c, d, e, a, F1, KK3, 13, 9); |
369 | R( a, b, c, d, e, F1, KK3, 9, 12); | 369 | R( a, b, c, d, e, F1, KK3, 9, 12); |
370 | R( e, a, b, c, d, F1, KK3, 7, 5); | 370 | R( e, a, b, c, d, F1, KK3, 7, 5); |
371 | R( d, e, a, b, c, F1, KK3, 10, 15); | 371 | R( d, e, a, b, c, F1, KK3, 10, 15); |
372 | R( c, d, e, a, b, F1, KK3, 14, 8); | 372 | R( c, d, e, a, b, F1, KK3, 14, 8); |
373 | R( b, c, d, e, a, F0, KK4, 12, 8); | 373 | R( b, c, d, e, a, F0, KK4, 12, 8); |
374 | R( a, b, c, d, e, F0, KK4, 15, 5); | 374 | R( a, b, c, d, e, F0, KK4, 15, 5); |
375 | R( e, a, b, c, d, F0, KK4, 10, 12); | 375 | R( e, a, b, c, d, F0, KK4, 10, 12); |
376 | R( d, e, a, b, c, F0, KK4, 4, 9); | 376 | R( d, e, a, b, c, F0, KK4, 4, 9); |
377 | R( c, d, e, a, b, F0, KK4, 1, 12); | 377 | R( c, d, e, a, b, F0, KK4, 1, 12); |
378 | R( b, c, d, e, a, F0, KK4, 5, 5); | 378 | R( b, c, d, e, a, F0, KK4, 5, 5); |
379 | R( a, b, c, d, e, F0, KK4, 8, 14); | 379 | R( a, b, c, d, e, F0, KK4, 8, 14); |
380 | R( e, a, b, c, d, F0, KK4, 7, 6); | 380 | R( e, a, b, c, d, F0, KK4, 7, 6); |
381 | R( d, e, a, b, c, F0, KK4, 6, 8); | 381 | R( d, e, a, b, c, F0, KK4, 6, 8); |
382 | R( c, d, e, a, b, F0, KK4, 2, 13); | 382 | R( c, d, e, a, b, F0, KK4, 2, 13); |
383 | R( b, c, d, e, a, F0, KK4, 13, 6); | 383 | R( b, c, d, e, a, F0, KK4, 13, 6); |
384 | R( a, b, c, d, e, F0, KK4, 14, 5); | 384 | R( a, b, c, d, e, F0, KK4, 14, 5); |
385 | R( e, a, b, c, d, F0, KK4, 0, 15); | 385 | R( e, a, b, c, d, F0, KK4, 0, 15); |
386 | R( d, e, a, b, c, F0, KK4, 3, 13); | 386 | R( d, e, a, b, c, F0, KK4, 3, 13); |
387 | R( c, d, e, a, b, F0, KK4, 9, 11); | 387 | R( c, d, e, a, b, F0, KK4, 9, 11); |
388 | R( b, c, d, e, a, F0, KK4, 11, 11); | 388 | R( b, c, d, e, a, F0, KK4, 11, 11); |
389 | 389 | ||
390 | 390 | ||
391 | t = hd->h1 + d + cc; | 391 | t = hd->h1 + d + cc; |
392 | hd->h1 = hd->h2 + e + dd; | 392 | hd->h1 = hd->h2 + e + dd; |
393 | hd->h2 = hd->h3 + a + ee; | 393 | hd->h2 = hd->h3 + a + ee; |
394 | hd->h3 = hd->h4 + b + aa; | 394 | hd->h3 = hd->h4 + b + aa; |
395 | hd->h4 = hd->h0 + c + bb; | 395 | hd->h4 = hd->h0 + c + bb; |
396 | hd->h0 = t; | 396 | hd->h0 = t; |
397 | } | 397 | } |
398 | 398 | ||
399 | 399 | ||
400 | /* Update the message digest with the contents | 400 | /* Update the message digest with the contents |
401 | * of INBUF with length INLEN. | 401 | * of INBUF with length INLEN. |
402 | */ | 402 | */ |
403 | static void | 403 | static void |
404 | rmd160_write( void *context, byte *inbuf, size_t inlen) | 404 | rmd160_write( void *context, byte *inbuf, size_t inlen) |
405 | { | 405 | { |
406 | RMD160_CONTEXT *hd = context; | 406 | RMD160_CONTEXT *hd = context; |
407 | 407 | ||
408 | if( hd->count == 64 ) /* flush the buffer */ | 408 | if( hd->count == 64 ) /* flush the buffer */ |
409 | { | 409 | { |
410 | transform( hd, hd->buf ); | 410 | transform( hd, hd->buf ); |
411 | _gcry_burn_stack (108+5*sizeof(void*)); | 411 | _gcry_burn_stack (108+5*sizeof(void*)); |
412 | hd->count = 0; | 412 | hd->count = 0; |
413 | hd->nblocks++; | 413 | hd->nblocks++; |
414 | } | 414 | } |
415 | if( !inbuf ) | 415 | if( !inbuf ) |
416 | return; | 416 | return; |
417 | if( hd->count ) | 417 | if( hd->count ) |
418 | { | 418 | { |
419 | for( ; inlen && hd->count < 64; inlen-- ) | 419 | for( ; inlen && hd->count < 64; inlen-- ) |
420 | hd->buf[hd->count++] = *inbuf++; | 420 | hd->buf[hd->count++] = *inbuf++; |
421 | rmd160_write( hd, NULL, 0 ); | 421 | rmd160_write( hd, NULL, 0 ); |
422 | if( !inlen ) | 422 | if( !inlen ) |
423 | return; | 423 | return; |
424 | } | 424 | } |
425 | 425 | ||
426 | while( inlen >= 64 ) | 426 | while( inlen >= 64 ) |
427 | { | 427 | { |
428 | transform( hd, inbuf ); | 428 | transform( hd, inbuf ); |
429 | hd->count = 0; | 429 | hd->count = 0; |
430 | hd->nblocks++; | 430 | hd->nblocks++; |
431 | inlen -= 64; | 431 | inlen -= 64; |
432 | inbuf += 64; | 432 | inbuf += 64; |
433 | } | 433 | } |
434 | _gcry_burn_stack (108+5*sizeof(void*)); | 434 | _gcry_burn_stack (108+5*sizeof(void*)); |
435 | for( ; inlen && hd->count < 64; inlen-- ) | 435 | for( ; inlen && hd->count < 64; inlen-- ) |
436 | hd->buf[hd->count++] = *inbuf++; | 436 | hd->buf[hd->count++] = *inbuf++; |
437 | } | 437 | } |
438 | 438 | ||
439 | /**************** | 439 | /**************** |
440 | * Apply the rmd160 transform function on the buffer which must have | 440 | * Apply the rmd160 transform function on the buffer which must have |
441 | * a length 64 bytes. Do not use this function together with the | 441 | * a length 64 bytes. Do not use this function together with the |
442 | * other functions, use rmd160_init to initialize internal variables. | 442 | * other functions, use rmd160_init to initialize internal variables. |
443 | * Returns: 16 bytes in buffer with the mixed contentes of buffer. | 443 | * Returns: 16 bytes in buffer with the mixed contentes of buffer. |
444 | */ | 444 | */ |
445 | void | 445 | void |
446 | _gcry_rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer ) | 446 | _gcry_rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer ) |
447 | { | 447 | { |
448 | char *p = buffer; | 448 | char *p = buffer; |
449 | 449 | ||
450 | transform( hd, (unsigned char *)buffer ); | 450 | transform( hd, (unsigned char *)buffer ); |
451 | #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0) | 451 | #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0) |
452 | X(0); | 452 | X(0); |
453 | X(1); | 453 | X(1); |
454 | X(2); | 454 | X(2); |
455 | X(3); | 455 | X(3); |
456 | X(4); | 456 | X(4); |
457 | #undef X | 457 | #undef X |
458 | } | 458 | } |
459 | 459 | ||
460 | 460 | ||
461 | /* The routine terminates the computation | 461 | /* The routine terminates the computation |
462 | */ | 462 | */ |
463 | 463 | ||
464 | static void | 464 | static void |
465 | rmd160_final( void *context ) | 465 | rmd160_final( void *context ) |
466 | { | 466 | { |
467 | RMD160_CONTEXT *hd = context; | 467 | RMD160_CONTEXT *hd = context; |
468 | u32 t, msb, lsb; | 468 | u32 t, msb, lsb; |
469 | byte *p; | 469 | byte *p; |
470 | 470 | ||
471 | rmd160_write(hd, NULL, 0); /* flush */; | 471 | rmd160_write(hd, NULL, 0); /* flush */; |
472 | 472 | ||
473 | t = hd->nblocks; | 473 | t = hd->nblocks; |
474 | /* multiply by 64 to make a byte count */ | 474 | /* multiply by 64 to make a byte count */ |
475 | lsb = t << 6; | 475 | lsb = t << 6; |
476 | msb = t >> 26; | 476 | msb = t >> 26; |
477 | /* add the count */ | 477 | /* add the count */ |
478 | t = lsb; | 478 | t = lsb; |
479 | if( (lsb += hd->count) < t ) | 479 | if( (lsb += hd->count) < t ) |
480 | msb++; | 480 | msb++; |
481 | /* multiply by 8 to make a bit count */ | 481 | /* multiply by 8 to make a bit count */ |
482 | t = lsb; | 482 | t = lsb; |
483 | lsb <<= 3; | 483 | lsb <<= 3; |
484 | msb <<= 3; | 484 | msb <<= 3; |
485 | msb |= t >> 29; | 485 | msb |= t >> 29; |
486 | 486 | ||
487 | if( hd->count < 56 ) /* enough room */ | 487 | if( hd->count < 56 ) /* enough room */ |
488 | { | 488 | { |
489 | hd->buf[hd->count++] = 0x80; /* pad */ | 489 | hd->buf[hd->count++] = 0x80; /* pad */ |
490 | while( hd->count < 56 ) | 490 | while( hd->count < 56 ) |
491 | hd->buf[hd->count++] = 0; /* pad */ | 491 | hd->buf[hd->count++] = 0; /* pad */ |
492 | } | 492 | } |
493 | else /* need one extra block */ | 493 | else /* need one extra block */ |
494 | { | 494 | { |
495 | hd->buf[hd->count++] = 0x80; /* pad character */ | 495 | hd->buf[hd->count++] = 0x80; /* pad character */ |
496 | while( hd->count < 64 ) | 496 | while( hd->count < 64 ) |
497 | hd->buf[hd->count++] = 0; | 497 | hd->buf[hd->count++] = 0; |
498 | rmd160_write(hd, NULL, 0); /* flush */; | 498 | rmd160_write(hd, NULL, 0); /* flush */; |
499 | memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ | 499 | memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ |
500 | } | 500 | } |
501 | /* append the 64 bit count */ | 501 | /* append the 64 bit count */ |
502 | hd->buf[56] = lsb ; | 502 | hd->buf[56] = lsb ; |
503 | hd->buf[57] = lsb >> 8; | 503 | hd->buf[57] = lsb >> 8; |
504 | hd->buf[58] = lsb >> 16; | 504 | hd->buf[58] = lsb >> 16; |
505 | hd->buf[59] = lsb >> 24; | 505 | hd->buf[59] = lsb >> 24; |
506 | hd->buf[60] = msb ; | 506 | hd->buf[60] = msb ; |
507 | hd->buf[61] = msb >> 8; | 507 | hd->buf[61] = msb >> 8; |
508 | hd->buf[62] = msb >> 16; | 508 | hd->buf[62] = msb >> 16; |
509 | hd->buf[63] = msb >> 24; | 509 | hd->buf[63] = msb >> 24; |
510 | transform( hd, hd->buf ); | 510 | transform( hd, hd->buf ); |
511 | _gcry_burn_stack (108+5*sizeof(void*)); | 511 | _gcry_burn_stack (108+5*sizeof(void*)); |
512 | 512 | ||
513 | p = hd->buf; | 513 | p = hd->buf; |
514 | #ifdef WORDS_BIGENDIAN | 514 | #ifdef WORDS_BIGENDIAN |
515 | #define X(a) do { *p++ = hd->h##a ; *p++ = hd->h##a >> 8; \ | 515 | #define X(a) do { *p++ = hd->h##a ; *p++ = hd->h##a >> 8; \ |
516 | *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 24; } while(0) | 516 | *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 24; } while(0) |
517 | #else /* little endian */ | 517 | #else /* little endian */ |
518 | #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0) | 518 | #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0) |
519 | #endif | 519 | #endif |
520 | X(0); | 520 | X(0); |
521 | X(1); | 521 | X(1); |
522 | X(2); | 522 | X(2); |
523 | X(3); | 523 | X(3); |
524 | X(4); | 524 | X(4); |
525 | #undef X | 525 | #undef X |
526 | } | 526 | } |
527 | 527 | ||
528 | static byte * | 528 | static byte * |
529 | rmd160_read( void *context ) | 529 | rmd160_read( void *context ) |
530 | { | 530 | { |
531 | RMD160_CONTEXT *hd = context; | 531 | RMD160_CONTEXT *hd = context; |
532 | 532 | ||
533 | return hd->buf; | 533 | return hd->buf; |
534 | } | 534 | } |
535 | 535 | ||
536 | 536 | ||
537 | 537 | ||
538 | /**************** | 538 | /**************** |
539 | * Shortcut functions which puts the hash value of the supplied buffer | 539 | * Shortcut functions which puts the hash value of the supplied buffer |
540 | * into outbuf which must have a size of 20 bytes. | 540 | * into outbuf which must have a size of 20 bytes. |
541 | */ | 541 | */ |
542 | void | 542 | void |
543 | _gcry_rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ) | 543 | _gcry_rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ) |
544 | { | 544 | { |
545 | RMD160_CONTEXT hd; | 545 | RMD160_CONTEXT hd; |
546 | 546 | ||
547 | _gcry_rmd160_init( &hd ); | 547 | _gcry_rmd160_init( &hd ); |
548 | rmd160_write( &hd, (byte*)buffer, length ); | 548 | rmd160_write( &hd, (byte*)buffer, length ); |
549 | rmd160_final( &hd ); | 549 | rmd160_final( &hd ); |
550 | memcpy( outbuf, hd.buf, 20 ); | 550 | memcpy( outbuf, hd.buf, 20 ); |
551 | } | 551 | } |
552 | 552 | ||
553 | static byte asn[15] = /* Object ID is 1.3.36.3.2.1 */ | 553 | static byte asn[15] = /* Object ID is 1.3.36.3.2.1 */ |
554 | { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03, | 554 | { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03, |
555 | 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }; | 555 | 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }; |
556 | 556 | ||
557 | static gcry_md_oid_spec_t oid_spec_rmd160[] = | 557 | static gcry_md_oid_spec_t oid_spec_rmd160[] = |
558 | { | 558 | { |
559 | /* rsaSignatureWithripemd160 */ | 559 | /* rsaSignatureWithripemd160 */ |
560 | { "1.3.36.3.3.1.2" }, | 560 | { "1.3.36.3.3.1.2" }, |
561 | { NULL }, | 561 | { NULL }, |
562 | }; | 562 | }; |
563 | 563 | ||
564 | gcry_md_spec_t _gcry_digest_spec_rmd160 = | 564 | gcry_md_spec_t _gcry_digest_spec_rmd160 = |
565 | { | 565 | { |
566 | "RIPEMD160", asn, DIM (asn), oid_spec_rmd160, 20, | 566 | "RIPEMD160", asn, DIM (asn), oid_spec_rmd160, 20, |
567 | _gcry_rmd160_init, rmd160_write, rmd160_final, rmd160_read, | 567 | _gcry_rmd160_init, rmd160_write, rmd160_final, rmd160_read, |
568 | sizeof (RMD160_CONTEXT) | 568 | sizeof (RMD160_CONTEXT) |
569 | }; | 569 | }; |