annotate sha.c @ 864:ec7c0dcf0836 libavutil

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