annotate ffmpeg/libavutil/sha.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
yading@11 3 * Copyright (C) 2009 Konstantin Shishkov
yading@11 4 * based on public domain SHA-1 code by Steve Reid <steve@edmweb.com>
yading@11 5 * and on BSD-licensed SHA-2 code by Aaron D. Gifford
yading@11 6 *
yading@11 7 * This file is part of FFmpeg.
yading@11 8 *
yading@11 9 * FFmpeg is free software; you can redistribute it and/or
yading@11 10 * modify it under the terms of the GNU Lesser General Public
yading@11 11 * License as published by the Free Software Foundation; either
yading@11 12 * version 2.1 of the License, or (at your option) any later version.
yading@11 13 *
yading@11 14 * FFmpeg is distributed in the hope that it will be useful,
yading@11 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 17 * Lesser General Public License for more details.
yading@11 18 *
yading@11 19 * You should have received a copy of the GNU Lesser General Public
yading@11 20 * License along with FFmpeg; if not, write to the Free Software
yading@11 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 22 */
yading@11 23
yading@11 24 #include <string.h>
yading@11 25 #include "avutil.h"
yading@11 26 #include "bswap.h"
yading@11 27 #include "sha.h"
yading@11 28 #include "intreadwrite.h"
yading@11 29 #include "mem.h"
yading@11 30
yading@11 31 /** hash context */
yading@11 32 typedef struct AVSHA {
yading@11 33 uint8_t digest_len; ///< digest length in 32-bit words
yading@11 34 uint64_t count; ///< number of bytes in buffer
yading@11 35 uint8_t buffer[64]; ///< 512-bit buffer of input values used in hash updating
yading@11 36 uint32_t state[8]; ///< current hash value
yading@11 37 /** function used to update hash for 512-bit input block */
yading@11 38 void (*transform)(uint32_t *state, const uint8_t buffer[64]);
yading@11 39 } AVSHA;
yading@11 40
yading@11 41 const int av_sha_size = sizeof(AVSHA);
yading@11 42
yading@11 43 struct AVSHA *av_sha_alloc(void)
yading@11 44 {
yading@11 45 return av_mallocz(sizeof(struct AVSHA));
yading@11 46 }
yading@11 47
yading@11 48 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
yading@11 49
yading@11 50 /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
yading@11 51 #define blk0(i) (block[i] = AV_RB32(buffer + 4 * (i)))
yading@11 52 #define blk(i) (block[i] = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1))
yading@11 53
yading@11 54 #define R0(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk0(i) + 0x5A827999 + rol(v, 5); w = rol(w, 30);
yading@11 55 #define R1(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk (i) + 0x5A827999 + rol(v, 5); w = rol(w, 30);
yading@11 56 #define R2(v,w,x,y,z,i) z += ( w^x ^y) + blk (i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
yading@11 57 #define R3(v,w,x,y,z,i) z += (((w|x)&y)|(w&x)) + blk (i) + 0x8F1BBCDC + rol(v, 5); w = rol(w, 30);
yading@11 58 #define R4(v,w,x,y,z,i) z += ( w^x ^y) + blk (i) + 0xCA62C1D6 + rol(v, 5); w = rol(w, 30);
yading@11 59
yading@11 60 /* Hash a single 512-bit block. This is the core of the algorithm. */
yading@11 61
yading@11 62 static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
yading@11 63 {
yading@11 64 uint32_t block[80];
yading@11 65 unsigned int i, a, b, c, d, e;
yading@11 66
yading@11 67 a = state[0];
yading@11 68 b = state[1];
yading@11 69 c = state[2];
yading@11 70 d = state[3];
yading@11 71 e = state[4];
yading@11 72 #if CONFIG_SMALL
yading@11 73 for (i = 0; i < 80; i++) {
yading@11 74 int t;
yading@11 75 if (i < 16)
yading@11 76 t = AV_RB32(buffer + 4 * i);
yading@11 77 else
yading@11 78 t = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1);
yading@11 79 block[i] = t;
yading@11 80 t += e + rol(a, 5);
yading@11 81 if (i < 40) {
yading@11 82 if (i < 20)
yading@11 83 t += ((b&(c^d))^d) + 0x5A827999;
yading@11 84 else
yading@11 85 t += ( b^c ^d) + 0x6ED9EBA1;
yading@11 86 } else {
yading@11 87 if (i < 60)
yading@11 88 t += (((b|c)&d)|(b&c)) + 0x8F1BBCDC;
yading@11 89 else
yading@11 90 t += ( b^c ^d) + 0xCA62C1D6;
yading@11 91 }
yading@11 92 e = d;
yading@11 93 d = c;
yading@11 94 c = rol(b, 30);
yading@11 95 b = a;
yading@11 96 a = t;
yading@11 97 }
yading@11 98 #else
yading@11 99 for (i = 0; i < 15; i += 5) {
yading@11 100 R0(a, b, c, d, e, 0 + i);
yading@11 101 R0(e, a, b, c, d, 1 + i);
yading@11 102 R0(d, e, a, b, c, 2 + i);
yading@11 103 R0(c, d, e, a, b, 3 + i);
yading@11 104 R0(b, c, d, e, a, 4 + i);
yading@11 105 }
yading@11 106 R0(a, b, c, d, e, 15);
yading@11 107 R1(e, a, b, c, d, 16);
yading@11 108 R1(d, e, a, b, c, 17);
yading@11 109 R1(c, d, e, a, b, 18);
yading@11 110 R1(b, c, d, e, a, 19);
yading@11 111 for (i = 20; i < 40; i += 5) {
yading@11 112 R2(a, b, c, d, e, 0 + i);
yading@11 113 R2(e, a, b, c, d, 1 + i);
yading@11 114 R2(d, e, a, b, c, 2 + i);
yading@11 115 R2(c, d, e, a, b, 3 + i);
yading@11 116 R2(b, c, d, e, a, 4 + i);
yading@11 117 }
yading@11 118 for (; i < 60; i += 5) {
yading@11 119 R3(a, b, c, d, e, 0 + i);
yading@11 120 R3(e, a, b, c, d, 1 + i);
yading@11 121 R3(d, e, a, b, c, 2 + i);
yading@11 122 R3(c, d, e, a, b, 3 + i);
yading@11 123 R3(b, c, d, e, a, 4 + i);
yading@11 124 }
yading@11 125 for (; i < 80; i += 5) {
yading@11 126 R4(a, b, c, d, e, 0 + i);
yading@11 127 R4(e, a, b, c, d, 1 + i);
yading@11 128 R4(d, e, a, b, c, 2 + i);
yading@11 129 R4(c, d, e, a, b, 3 + i);
yading@11 130 R4(b, c, d, e, a, 4 + i);
yading@11 131 }
yading@11 132 #endif
yading@11 133 state[0] += a;
yading@11 134 state[1] += b;
yading@11 135 state[2] += c;
yading@11 136 state[3] += d;
yading@11 137 state[4] += e;
yading@11 138 }
yading@11 139
yading@11 140 static const uint32_t K256[64] = {
yading@11 141 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
yading@11 142 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
yading@11 143 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
yading@11 144 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
yading@11 145 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
yading@11 146 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
yading@11 147 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
yading@11 148 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
yading@11 149 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
yading@11 150 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
yading@11 151 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
yading@11 152 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
yading@11 153 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
yading@11 154 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
yading@11 155 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
yading@11 156 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
yading@11 157 };
yading@11 158
yading@11 159
yading@11 160 #define Ch(x,y,z) (((x) & ((y) ^ (z))) ^ (z))
yading@11 161 #define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y)))
yading@11 162
yading@11 163 #define Sigma0_256(x) (rol((x), 30) ^ rol((x), 19) ^ rol((x), 10))
yading@11 164 #define Sigma1_256(x) (rol((x), 26) ^ rol((x), 21) ^ rol((x), 7))
yading@11 165 #define sigma0_256(x) (rol((x), 25) ^ rol((x), 14) ^ ((x) >> 3))
yading@11 166 #define sigma1_256(x) (rol((x), 15) ^ rol((x), 13) ^ ((x) >> 10))
yading@11 167
yading@11 168 #undef blk
yading@11 169 #define blk(i) (block[i] = block[i - 16] + sigma0_256(block[i - 15]) + \
yading@11 170 sigma1_256(block[i - 2]) + block[i - 7])
yading@11 171
yading@11 172 #define ROUND256(a,b,c,d,e,f,g,h) \
yading@11 173 T1 += (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[i]; \
yading@11 174 (d) += T1; \
yading@11 175 (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
yading@11 176 i++
yading@11 177
yading@11 178 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
yading@11 179 T1 = blk0(i); \
yading@11 180 ROUND256(a,b,c,d,e,f,g,h)
yading@11 181
yading@11 182 #define ROUND256_16_TO_63(a,b,c,d,e,f,g,h) \
yading@11 183 T1 = blk(i); \
yading@11 184 ROUND256(a,b,c,d,e,f,g,h)
yading@11 185
yading@11 186 static void sha256_transform(uint32_t *state, const uint8_t buffer[64])
yading@11 187 {
yading@11 188 unsigned int i, a, b, c, d, e, f, g, h;
yading@11 189 uint32_t block[64];
yading@11 190 uint32_t T1;
yading@11 191
yading@11 192 a = state[0];
yading@11 193 b = state[1];
yading@11 194 c = state[2];
yading@11 195 d = state[3];
yading@11 196 e = state[4];
yading@11 197 f = state[5];
yading@11 198 g = state[6];
yading@11 199 h = state[7];
yading@11 200 #if CONFIG_SMALL
yading@11 201 for (i = 0; i < 64; i++) {
yading@11 202 uint32_t T2;
yading@11 203 if (i < 16)
yading@11 204 T1 = blk0(i);
yading@11 205 else
yading@11 206 T1 = blk(i);
yading@11 207 T1 += h + Sigma1_256(e) + Ch(e, f, g) + K256[i];
yading@11 208 T2 = Sigma0_256(a) + Maj(a, b, c);
yading@11 209 h = g;
yading@11 210 g = f;
yading@11 211 f = e;
yading@11 212 e = d + T1;
yading@11 213 d = c;
yading@11 214 c = b;
yading@11 215 b = a;
yading@11 216 a = T1 + T2;
yading@11 217 }
yading@11 218 #else
yading@11 219 for (i = 0; i < 16 - 7;) {
yading@11 220 ROUND256_0_TO_15(a, b, c, d, e, f, g, h);
yading@11 221 ROUND256_0_TO_15(h, a, b, c, d, e, f, g);
yading@11 222 ROUND256_0_TO_15(g, h, a, b, c, d, e, f);
yading@11 223 ROUND256_0_TO_15(f, g, h, a, b, c, d, e);
yading@11 224 ROUND256_0_TO_15(e, f, g, h, a, b, c, d);
yading@11 225 ROUND256_0_TO_15(d, e, f, g, h, a, b, c);
yading@11 226 ROUND256_0_TO_15(c, d, e, f, g, h, a, b);
yading@11 227 ROUND256_0_TO_15(b, c, d, e, f, g, h, a);
yading@11 228 }
yading@11 229
yading@11 230 for (; i < 64 - 7;) {
yading@11 231 ROUND256_16_TO_63(a, b, c, d, e, f, g, h);
yading@11 232 ROUND256_16_TO_63(h, a, b, c, d, e, f, g);
yading@11 233 ROUND256_16_TO_63(g, h, a, b, c, d, e, f);
yading@11 234 ROUND256_16_TO_63(f, g, h, a, b, c, d, e);
yading@11 235 ROUND256_16_TO_63(e, f, g, h, a, b, c, d);
yading@11 236 ROUND256_16_TO_63(d, e, f, g, h, a, b, c);
yading@11 237 ROUND256_16_TO_63(c, d, e, f, g, h, a, b);
yading@11 238 ROUND256_16_TO_63(b, c, d, e, f, g, h, a);
yading@11 239 }
yading@11 240 #endif
yading@11 241 state[0] += a;
yading@11 242 state[1] += b;
yading@11 243 state[2] += c;
yading@11 244 state[3] += d;
yading@11 245 state[4] += e;
yading@11 246 state[5] += f;
yading@11 247 state[6] += g;
yading@11 248 state[7] += h;
yading@11 249 }
yading@11 250
yading@11 251
yading@11 252 int av_sha_init(AVSHA* ctx, int bits)
yading@11 253 {
yading@11 254 ctx->digest_len = bits >> 5;
yading@11 255 switch (bits) {
yading@11 256 case 160: // SHA-1
yading@11 257 ctx->state[0] = 0x67452301;
yading@11 258 ctx->state[1] = 0xEFCDAB89;
yading@11 259 ctx->state[2] = 0x98BADCFE;
yading@11 260 ctx->state[3] = 0x10325476;
yading@11 261 ctx->state[4] = 0xC3D2E1F0;
yading@11 262 ctx->transform = sha1_transform;
yading@11 263 break;
yading@11 264 case 224: // SHA-224
yading@11 265 ctx->state[0] = 0xC1059ED8;
yading@11 266 ctx->state[1] = 0x367CD507;
yading@11 267 ctx->state[2] = 0x3070DD17;
yading@11 268 ctx->state[3] = 0xF70E5939;
yading@11 269 ctx->state[4] = 0xFFC00B31;
yading@11 270 ctx->state[5] = 0x68581511;
yading@11 271 ctx->state[6] = 0x64F98FA7;
yading@11 272 ctx->state[7] = 0xBEFA4FA4;
yading@11 273 ctx->transform = sha256_transform;
yading@11 274 break;
yading@11 275 case 256: // SHA-256
yading@11 276 ctx->state[0] = 0x6A09E667;
yading@11 277 ctx->state[1] = 0xBB67AE85;
yading@11 278 ctx->state[2] = 0x3C6EF372;
yading@11 279 ctx->state[3] = 0xA54FF53A;
yading@11 280 ctx->state[4] = 0x510E527F;
yading@11 281 ctx->state[5] = 0x9B05688C;
yading@11 282 ctx->state[6] = 0x1F83D9AB;
yading@11 283 ctx->state[7] = 0x5BE0CD19;
yading@11 284 ctx->transform = sha256_transform;
yading@11 285 break;
yading@11 286 default:
yading@11 287 return -1;
yading@11 288 }
yading@11 289 ctx->count = 0;
yading@11 290 return 0;
yading@11 291 }
yading@11 292
yading@11 293 void av_sha_update(AVSHA* ctx, const uint8_t* data, unsigned int len)
yading@11 294 {
yading@11 295 unsigned int i, j;
yading@11 296
yading@11 297 j = ctx->count & 63;
yading@11 298 ctx->count += len;
yading@11 299 #if CONFIG_SMALL
yading@11 300 for (i = 0; i < len; i++) {
yading@11 301 ctx->buffer[j++] = data[i];
yading@11 302 if (64 == j) {
yading@11 303 ctx->transform(ctx->state, ctx->buffer);
yading@11 304 j = 0;
yading@11 305 }
yading@11 306 }
yading@11 307 #else
yading@11 308 if ((j + len) > 63) {
yading@11 309 memcpy(&ctx->buffer[j], data, (i = 64 - j));
yading@11 310 ctx->transform(ctx->state, ctx->buffer);
yading@11 311 for (; i + 63 < len; i += 64)
yading@11 312 ctx->transform(ctx->state, &data[i]);
yading@11 313 j = 0;
yading@11 314 } else
yading@11 315 i = 0;
yading@11 316 memcpy(&ctx->buffer[j], &data[i], len - i);
yading@11 317 #endif
yading@11 318 }
yading@11 319
yading@11 320 void av_sha_final(AVSHA* ctx, uint8_t *digest)
yading@11 321 {
yading@11 322 int i;
yading@11 323 uint64_t finalcount = av_be2ne64(ctx->count << 3);
yading@11 324
yading@11 325 av_sha_update(ctx, "\200", 1);
yading@11 326 while ((ctx->count & 63) != 56)
yading@11 327 av_sha_update(ctx, "", 1);
yading@11 328 av_sha_update(ctx, (uint8_t *)&finalcount, 8); /* Should cause a transform() */
yading@11 329 for (i = 0; i < ctx->digest_len; i++)
yading@11 330 AV_WB32(digest + i*4, ctx->state[i]);
yading@11 331 }
yading@11 332
yading@11 333 #ifdef TEST
yading@11 334 #include <stdio.h>
yading@11 335
yading@11 336 int main(void)
yading@11 337 {
yading@11 338 int i, j, k;
yading@11 339 AVSHA ctx;
yading@11 340 unsigned char digest[32];
yading@11 341 const int lengths[3] = { 160, 224, 256 };
yading@11 342
yading@11 343 for (j = 0; j < 3; j++) {
yading@11 344 printf("Testing SHA-%d\n", lengths[j]);
yading@11 345 for (k = 0; k < 3; k++) {
yading@11 346 av_sha_init(&ctx, lengths[j]);
yading@11 347 if (k == 0)
yading@11 348 av_sha_update(&ctx, "abc", 3);
yading@11 349 else if (k == 1)
yading@11 350 av_sha_update(&ctx, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56);
yading@11 351 else
yading@11 352 for (i = 0; i < 1000*1000; i++)
yading@11 353 av_sha_update(&ctx, "a", 1);
yading@11 354 av_sha_final(&ctx, digest);
yading@11 355 for (i = 0; i < lengths[j] >> 3; i++)
yading@11 356 printf("%02X", digest[i]);
yading@11 357 putchar('\n');
yading@11 358 }
yading@11 359 switch (j) {
yading@11 360 case 0:
yading@11 361 //test vectors (from FIPS PUB 180-1)
yading@11 362 printf("A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\n"
yading@11 363 "84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\n"
yading@11 364 "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\n");
yading@11 365 break;
yading@11 366 case 1:
yading@11 367 //test vectors (from FIPS PUB 180-2 Appendix A)
yading@11 368 printf("23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7\n"
yading@11 369 "75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525\n"
yading@11 370 "20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67\n");
yading@11 371 break;
yading@11 372 case 2:
yading@11 373 //test vectors (from FIPS PUB 180-2)
yading@11 374 printf("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad\n"
yading@11 375 "248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1\n"
yading@11 376 "cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0\n");
yading@11 377 break;
yading@11 378 }
yading@11 379 }
yading@11 380
yading@11 381 return 0;
yading@11 382 }
yading@11 383 #endif