Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 379 lines (348 sloc) 12.059 kb
3d44f15 @DonDiego Add proper license header.
DonDiego authored
1 /*
2 * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
3 * Copyright (C) 2009 Konstantin Shishkov
3d44f15 @DonDiego Add proper license header.
DonDiego authored
4 * based on public domain SHA-1 code by Steve Reid <steve@edmweb.com>
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
5 * and on BSD-licensed SHA-2 code by Aaron D. Gifford
3d44f15 @DonDiego Add proper license header.
DonDiego authored
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
23
2ed6f39 @mansr Replace many includes of libavutil/common.h with what is actually needed
mansr authored
24 #include <string.h>
32f40ac @mansr sha: add missing include
mansr authored
25 #include "avutil.h"
69ae947 @attilakinali add missing include of bswap.h
attilakinali authored
26 #include "bswap.h"
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
27 #include "sha.h"
045b60b Make SHA digest function write digest value with AV_WN32 instead of assu...
Kostya Shishkov authored
28 #include "intreadwrite.h"
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
29
4364fc9 Document SHA-1 functions and structures
Kostya Shishkov authored
30 /** hash context */
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
31 typedef struct AVSHA {
01cc628 Extend AVSHA1 so it can be used in future SHA-2 code as well
Kostya Shishkov authored
32 uint8_t digest_len; ///< digest length in 32-bit words
4364fc9 Document SHA-1 functions and structures
Kostya Shishkov authored
33 uint64_t count; ///< number of bytes in buffer
3a7c650 cosmetics: vertical align AVSHA1 members
Kostya Shishkov authored
34 uint8_t buffer[64]; ///< 512-bit buffer of input values used in hash updating
01cc628 Extend AVSHA1 so it can be used in future SHA-2 code as well
Kostya Shishkov authored
35 uint32_t state[8]; ///< current hash value
2c6361e Use pointer to hash transform function to make adding SHA-2 support easi...
Kostya Shishkov authored
36 /** function used to update hash for 512-bit input block */
37 void (*transform)(uint32_t *state, const uint8_t buffer[64]);
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
38 } AVSHA;
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
39
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
40 const int av_sha_size = sizeof(AVSHA);
537c8e7 @lu-zero Provide sha1 to outside applications
lu-zero authored
41
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
42 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
43
44 /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
3e2aa26 sha: use AV_RB32() instead of assuming buffer can be cast to uint32_t*
Kostya Shishkov authored
45 #define blk0(i) (block[i] = AV_RB32(buffer + 4 * (i)))
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
46 #define blk(i) (block[i] = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1))
d6cf780 @michaelni revert 2% speed loss change (r8360)
michaelni authored
47
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
48 #define R0(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk0(i) + 0x5A827999 + rol(v, 5); w = rol(w, 30);
49 #define R1(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk (i) + 0x5A827999 + rol(v, 5); w = rol(w, 30);
50 #define R2(v,w,x,y,z,i) z += ( w^x ^y) + blk (i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
51 #define R3(v,w,x,y,z,i) z += (((w|x)&y)|(w&x)) + blk (i) + 0x8F1BBCDC + rol(v, 5); w = rol(w, 30);
52 #define R4(v,w,x,y,z,i) z += ( w^x ^y) + blk (i) + 0xCA62C1D6 + rol(v, 5); w = rol(w, 30);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
53
54 /* Hash a single 512-bit block. This is the core of the algorithm. */
55
0d73abb Rename function to sha1_transform so it won't be confused with SHA-2 tra...
Kostya Shishkov authored
56 static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
57 {
aa59433 @michaelni avoid silly ring buffer logic (faster with -O2, -O3 is always slower the...
michaelni authored
58 uint32_t block[80];
5fd7f87 @michaelni cosmetic
michaelni authored
59 unsigned int i, a, b, c, d, e;
3479b72 @michaelni its faster to copy the data to the stack it seems ...
michaelni authored
60
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
61 a = state[0];
62 b = state[1];
63 c = state[2];
64 d = state[3];
65 e = state[4];
b250f9c @aurelj Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurelj authored
66 #if CONFIG_SMALL
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
67 for (i = 0; i < 80; i++) {
476f9b7 @michaelni simplify
michaelni authored
68 int t;
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
69 if (i < 16)
3e2aa26 sha: use AV_RB32() instead of assuming buffer can be cast to uint32_t*
Kostya Shishkov authored
70 t = AV_RB32(buffer + 4 * i);
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
71 else
72 t = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1);
73 block[i] = t;
74 t += e + rol(a, 5);
75 if (i < 40) {
76 if (i < 20)
77 t += ((b&(c^d))^d) + 0x5A827999;
78 else
79 t += ( b^c ^d) + 0x6ED9EBA1;
80 } else {
81 if (i < 60)
82 t += (((b|c)&d)|(b&c)) + 0x8F1BBCDC;
83 else
84 t += ( b^c ^d) + 0xCA62C1D6;
2fa3a22 @michaelni factorize VARIANT2 (smaller and slower)
michaelni authored
85 }
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
86 e = d;
87 d = c;
88 c = rol(b, 30);
89 b = a;
90 a = t;
6573578 @michaelni 2 other variants of how to implement the core part
michaelni authored
91 }
92 #else
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
93 for (i = 0; i < 15; i += 5) {
94 R0(a, b, c, d, e, 0 + i);
95 R0(e, a, b, c, d, 1 + i);
96 R0(d, e, a, b, c, 2 + i);
97 R0(c, d, e, a, b, 3 + i);
98 R0(b, c, d, e, a, 4 + i);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
99 }
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
100 R0(a, b, c, d, e, 15);
101 R1(e, a, b, c, d, 16);
102 R1(d, e, a, b, c, 17);
103 R1(c, d, e, a, b, 18);
104 R1(b, c, d, e, a, 19);
105 for (i = 20; i < 40; i += 5) {
106 R2(a, b, c, d, e, 0 + i);
107 R2(e, a, b, c, d, 1 + i);
108 R2(d, e, a, b, c, 2 + i);
109 R2(c, d, e, a, b, 3 + i);
110 R2(b, c, d, e, a, 4 + i);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
111 }
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
112 for (; i < 60; i += 5) {
113 R3(a, b, c, d, e, 0 + i);
114 R3(e, a, b, c, d, 1 + i);
115 R3(d, e, a, b, c, 2 + i);
116 R3(c, d, e, a, b, 3 + i);
117 R3(b, c, d, e, a, 4 + i);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
118 }
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
119 for (; i < 80; i += 5) {
120 R4(a, b, c, d, e, 0 + i);
121 R4(e, a, b, c, d, 1 + i);
122 R4(d, e, a, b, c, 2 + i);
123 R4(c, d, e, a, b, 3 + i);
124 R4(b, c, d, e, a, 4 + i);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
125 }
6573578 @michaelni 2 other variants of how to implement the core part
michaelni authored
126 #endif
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
127 state[0] += a;
128 state[1] += b;
129 state[2] += c;
130 state[3] += d;
131 state[4] += e;
132 }
133
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
134 static const uint32_t K256[64] = {
135 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
136 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
137 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
138 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
139 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
140 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
141 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
142 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
143 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
144 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
145 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
146 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
147 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
148 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
149 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
150 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
151 };
152
153
154 #define Ch(x,y,z) (((x) & ((y) ^ (z))) ^ (z))
155 #define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y)))
156
157 #define Sigma0_256(x) (rol((x), 30) ^ rol((x), 19) ^ rol((x), 10))
158 #define Sigma1_256(x) (rol((x), 26) ^ rol((x), 21) ^ rol((x), 7))
159 #define sigma0_256(x) (rol((x), 25) ^ rol((x), 14) ^ ((x) >> 3))
160 #define sigma1_256(x) (rol((x), 15) ^ rol((x), 13) ^ ((x) >> 10))
161
162 #undef blk
163 #define blk(i) (block[i] = block[i - 16] + sigma0_256(block[i - 15]) + \
164 sigma1_256(block[i - 2]) + block[i - 7])
165
166 #define ROUND256(a,b,c,d,e,f,g,h) \
167 T1 += (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[i]; \
168 (d) += T1; \
169 (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
170 i++
171
172 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
173 T1 = blk0(i); \
174 ROUND256(a,b,c,d,e,f,g,h)
175
176 #define ROUND256_16_TO_63(a,b,c,d,e,f,g,h) \
177 T1 = blk(i); \
178 ROUND256(a,b,c,d,e,f,g,h)
179
180 static void sha256_transform(uint32_t *state, const uint8_t buffer[64])
181 {
182 unsigned int i, a, b, c, d, e, f, g, h;
183 uint32_t block[64];
6df5c52 @DonDiego Move some conditionally used variables into the block where they are use...
DonDiego authored
184 uint32_t T1;
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
185
186 a = state[0];
187 b = state[1];
188 c = state[2];
189 d = state[3];
190 e = state[4];
191 f = state[5];
192 g = state[6];
193 h = state[7];
194 #if CONFIG_SMALL
195 for (i = 0; i < 64; i++) {
6df5c52 @DonDiego Move some conditionally used variables into the block where they are use...
DonDiego authored
196 uint32_t T2;
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
197 if (i < 16)
198 T1 = blk0(i);
199 else
200 T1 = blk(i);
201 T1 += h + Sigma1_256(e) + Ch(e, f, g) + K256[i];
202 T2 = Sigma0_256(a) + Maj(a, b, c);
203 h = g;
204 g = f;
205 f = e;
206 e = d + T1;
207 d = c;
208 c = b;
209 b = a;
210 a = T1 + T2;
211 }
212 #else
213 for (i = 0; i < 16;) {
214 ROUND256_0_TO_15(a, b, c, d, e, f, g, h);
215 ROUND256_0_TO_15(h, a, b, c, d, e, f, g);
216 ROUND256_0_TO_15(g, h, a, b, c, d, e, f);
217 ROUND256_0_TO_15(f, g, h, a, b, c, d, e);
218 ROUND256_0_TO_15(e, f, g, h, a, b, c, d);
219 ROUND256_0_TO_15(d, e, f, g, h, a, b, c);
220 ROUND256_0_TO_15(c, d, e, f, g, h, a, b);
221 ROUND256_0_TO_15(b, c, d, e, f, g, h, a);
222 }
223
224 for (; i < 64;) {
225 ROUND256_16_TO_63(a, b, c, d, e, f, g, h);
226 ROUND256_16_TO_63(h, a, b, c, d, e, f, g);
227 ROUND256_16_TO_63(g, h, a, b, c, d, e, f);
228 ROUND256_16_TO_63(f, g, h, a, b, c, d, e);
229 ROUND256_16_TO_63(e, f, g, h, a, b, c, d);
230 ROUND256_16_TO_63(d, e, f, g, h, a, b, c);
231 ROUND256_16_TO_63(c, d, e, f, g, h, a, b);
232 ROUND256_16_TO_63(b, c, d, e, f, g, h, a);
233 }
234 #endif
235 state[0] += a;
236 state[1] += b;
237 state[2] += c;
238 state[3] += d;
239 state[4] += e;
240 state[5] += f;
241 state[6] += g;
242 state[7] += h;
243 }
244
245
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
246 int av_sha_init(AVSHA* ctx, int bits)
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
247 {
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
248 ctx->digest_len = bits >> 5;
249 switch (bits) {
250 case 160: // SHA-1
87d718a cosmetics: reindent after last commit
Kostya Shishkov authored
251 ctx->state[0] = 0x67452301;
252 ctx->state[1] = 0xEFCDAB89;
253 ctx->state[2] = 0x98BADCFE;
254 ctx->state[3] = 0x10325476;
255 ctx->state[4] = 0xC3D2E1F0;
256 ctx->transform = sha1_transform;
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
257 break;
258 case 224: // SHA-224
259 ctx->state[0] = 0xC1059ED8;
260 ctx->state[1] = 0x367CD507;
261 ctx->state[2] = 0x3070DD17;
262 ctx->state[3] = 0xF70E5939;
263 ctx->state[4] = 0xFFC00B31;
264 ctx->state[5] = 0x68581511;
265 ctx->state[6] = 0x64F98FA7;
266 ctx->state[7] = 0xBEFA4FA4;
267 ctx->transform = sha256_transform;
268 break;
269 case 256: // SHA-256
270 ctx->state[0] = 0x6A09E667;
271 ctx->state[1] = 0xBB67AE85;
272 ctx->state[2] = 0x3C6EF372;
273 ctx->state[3] = 0xA54FF53A;
274 ctx->state[4] = 0x510E527F;
275 ctx->state[5] = 0x9B05688C;
276 ctx->state[6] = 0x1F83D9AB;
277 ctx->state[7] = 0x5BE0CD19;
278 ctx->transform = sha256_transform;
279 break;
280 default:
281 return -1;
282 }
283 ctx->count = 0;
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
284 return 0;
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
285 }
286
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
287 void av_sha_update(AVSHA* ctx, const uint8_t* data, unsigned int len)
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
288 {
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
289 unsigned int i, j;
290
248b25f @michaelni s/context/ctx/
michaelni authored
291 j = ctx->count & 63;
292 ctx->count += len;
b250f9c @aurelj Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurelj authored
293 #if CONFIG_SMALL
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
294 for (i = 0; i < len; i++) {
295 ctx->buffer[j++] = data[i];
296 if (64 == j) {
2c6361e Use pointer to hash transform function to make adding SHA-2 support easi...
Kostya Shishkov authored
297 ctx->transform(ctx->state, ctx->buffer);
36c7fa7 @michaelni smaller av_sha1_update()
michaelni authored
298 j = 0;
299 }
300 }
301 #else
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
302 if ((j + len) > 63) {
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
303 memcpy(&ctx->buffer[j], data, (i = 64 - j));
2c6361e Use pointer to hash transform function to make adding SHA-2 support easi...
Kostya Shishkov authored
304 ctx->transform(ctx->state, ctx->buffer);
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
305 for (; i + 63 < len; i += 64)
2c6361e Use pointer to hash transform function to make adding SHA-2 support easi...
Kostya Shishkov authored
306 ctx->transform(ctx->state, &data[i]);
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
307 j = 0;
308 } else
309 i = 0;
248b25f @michaelni s/context/ctx/
michaelni authored
310 memcpy(&ctx->buffer[j], &data[i], len - i);
36c7fa7 @michaelni smaller av_sha1_update()
michaelni authored
311 #endif
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
312 }
313
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
314 void av_sha_final(AVSHA* ctx, uint8_t *digest)
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
315 {
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
316 int i;
8fc0162 @mansr Add av_ prefix to bswap macros
mansr authored
317 uint64_t finalcount = av_be2ne64(ctx->count << 3);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
318
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
319 av_sha_update(ctx, "\200", 1);
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
320 while ((ctx->count & 63) != 56)
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
321 av_sha_update(ctx, "", 1);
322 av_sha_update(ctx, (uint8_t *)&finalcount, 8); /* Should cause a transform() */
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
323 for (i = 0; i < ctx->digest_len; i++)
a768816 Simplify expression as suggested by Måns Rullgård
Kostya Shishkov authored
324 AV_WB32(digest + i*4, ctx->state[i]);
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
325 }
326
327 #ifdef TEST
328 #include <stdio.h>
329 #undef printf
330
0ef37cd @DonDiego cosmetics: Reformat file to K&R style upon Kostya's request.
DonDiego authored
331 int main(void)
332 {
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
333 int i, j, k;
451ae25 Prepare SHA code to handle SHA-2 as well. For now rename files and funct...
Kostya Shishkov authored
334 AVSHA ctx;
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
335 unsigned char digest[32];
336 const int lengths[3] = { 160, 224, 256 };
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
337
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
338 for (j = 0; j < 3; j++) {
339 printf("Testing SHA-%d\n", lengths[j]);
87d718a cosmetics: reindent after last commit
Kostya Shishkov authored
340 for (k = 0; k < 3; k++) {
341 av_sha_init(&ctx, lengths[j]);
342 if (k == 0)
343 av_sha_update(&ctx, "abc", 3);
344 else if (k == 1)
345 av_sha_update(&ctx, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56);
346 else
347 for (i = 0; i < 1000*1000; i++)
348 av_sha_update(&ctx, "a", 1);
349 av_sha_final(&ctx, digest);
350 for (i = 0; i < lengths[j] >> 3; i++)
351 printf("%02X", digest[i]);
352 putchar('\n');
353 }
354 switch (j) {
355 case 0:
356 //test vectors (from FIPS PUB 180-1)
357 printf("A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\n"
358 "84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\n"
359 "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\n");
360 break;
361 case 1:
362 //test vectors (from FIPS PUB 180-2 Appendix A)
363 printf("23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7\n"
364 "75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525\n"
365 "20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67\n");
366 break;
367 case 2:
368 //test vectors (from FIPS PUB 180-2)
369 printf("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad\n"
370 "248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1\n"
371 "cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0\n");
372 break;
373 }
aa5a99a Add SHA-2 hashing
Kostya Shishkov authored
374 }
7c60e55 @michaelni simple SHA-1 implementation
michaelni authored
375
376 return 0;
377 }
378 #endif
Something went wrong with that request. Please try again.