annotate sha.c @ 834:3423ae1276e2 libavutil

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