Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: core/fdrm/crypto/fx_crypt_sha.cpp

Issue 2577223002: Better tests for password protected documents. (Closed)
Patch Set: revert pdfium_test Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fdrm/crypto/fx_crypt.h ('k') | core/fdrm/crypto/fx_crypt_unittest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/fdrm/crypto/fx_crypt.h" 7 #include "core/fdrm/crypto/fx_crypt.h"
8 8
9 #ifdef __cplusplus 9 #ifdef __cplusplus
10 extern "C" { 10 extern "C" {
11 #endif 11 #endif
12 typedef struct {
13 unsigned int h[5];
14 unsigned char block[64];
15 int blkused;
16 unsigned int lenhi, lenlo;
17 } SHA_State;
18 #define rol(x, y) (((x) << (y)) | (((unsigned int)x) >> (32 - y))) 12 #define rol(x, y) (((x) << (y)) | (((unsigned int)x) >> (32 - y)))
19 static void SHA_Core_Init(unsigned int h[5]) { 13 static void SHA_Core_Init(unsigned int h[5]) {
20 h[0] = 0x67452301; 14 h[0] = 0x67452301;
21 h[1] = 0xefcdab89; 15 h[1] = 0xefcdab89;
22 h[2] = 0x98badcfe; 16 h[2] = 0x98badcfe;
23 h[3] = 0x10325476; 17 h[3] = 0x10325476;
24 h[4] = 0xc3d2e1f0; 18 h[4] = 0xc3d2e1f0;
25 } 19 }
26 static void SHATransform(unsigned int* digest, unsigned int* block) { 20 static void SHATransform(unsigned int* digest, unsigned int* block) {
27 unsigned int w[80]; 21 unsigned int w[80];
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 c = rol(b, 30); 65 c = rol(b, 30);
72 b = a; 66 b = a;
73 a = tmp; 67 a = tmp;
74 } 68 }
75 digest[0] += a; 69 digest[0] += a;
76 digest[1] += b; 70 digest[1] += b;
77 digest[2] += c; 71 digest[2] += c;
78 digest[3] += d; 72 digest[3] += d;
79 digest[4] += e; 73 digest[4] += e;
80 } 74 }
81 void CRYPT_SHA1Start(void* context) { 75
82 SHA_State* s = (SHA_State*)context; 76 void CRYPT_SHA1Start(CRYPT_sha1_context* s) {
83 SHA_Core_Init(s->h); 77 SHA_Core_Init(s->h);
84 s->blkused = 0; 78 s->blkused = 0;
85 s->lenhi = s->lenlo = 0; 79 s->lenhi = s->lenlo = 0;
86 } 80 }
87 void CRYPT_SHA1Update(void* context, const uint8_t* data, uint32_t size) { 81
88 SHA_State* s = (SHA_State*)context; 82 void CRYPT_SHA1Update(CRYPT_sha1_context* s,
83 const uint8_t* data,
84 uint32_t size) {
89 unsigned char* q = (unsigned char*)data; 85 unsigned char* q = (unsigned char*)data;
90 unsigned int wordblock[16]; 86 unsigned int wordblock[16];
91 int len = size; 87 int len = size;
92 unsigned int lenw = len; 88 unsigned int lenw = len;
93 int i; 89 int i;
94 s->lenlo += lenw; 90 s->lenlo += lenw;
95 s->lenhi += (s->lenlo < lenw); 91 s->lenhi += (s->lenlo < lenw);
96 if (s->blkused && s->blkused + len < 64) { 92 if (s->blkused && s->blkused + len < 64) {
97 FXSYS_memcpy(s->block + s->blkused, q, len); 93 FXSYS_memcpy(s->block + s->blkused, q, len);
98 s->blkused += len; 94 s->blkused += len;
99 } else { 95 } else {
100 while (s->blkused + len >= 64) { 96 while (s->blkused + len >= 64) {
101 FXSYS_memcpy(s->block + s->blkused, q, 64 - s->blkused); 97 FXSYS_memcpy(s->block + s->blkused, q, 64 - s->blkused);
102 q += 64 - s->blkused; 98 q += 64 - s->blkused;
103 len -= 64 - s->blkused; 99 len -= 64 - s->blkused;
104 for (i = 0; i < 16; i++) { 100 for (i = 0; i < 16; i++) {
105 wordblock[i] = (((unsigned int)s->block[i * 4 + 0]) << 24) | 101 wordblock[i] = (((unsigned int)s->block[i * 4 + 0]) << 24) |
106 (((unsigned int)s->block[i * 4 + 1]) << 16) | 102 (((unsigned int)s->block[i * 4 + 1]) << 16) |
107 (((unsigned int)s->block[i * 4 + 2]) << 8) | 103 (((unsigned int)s->block[i * 4 + 2]) << 8) |
108 (((unsigned int)s->block[i * 4 + 3]) << 0); 104 (((unsigned int)s->block[i * 4 + 3]) << 0);
109 } 105 }
110 SHATransform(s->h, wordblock); 106 SHATransform(s->h, wordblock);
111 s->blkused = 0; 107 s->blkused = 0;
112 } 108 }
113 FXSYS_memcpy(s->block, q, len); 109 FXSYS_memcpy(s->block, q, len);
114 s->blkused = len; 110 s->blkused = len;
115 } 111 }
116 } 112 }
117 void CRYPT_SHA1Finish(void* context, uint8_t digest[20]) { 113
118 SHA_State* s = (SHA_State*)context; 114 void CRYPT_SHA1Finish(CRYPT_sha1_context* s, uint8_t digest[20]) {
119 int i; 115 int i;
120 int pad; 116 int pad;
121 unsigned char c[64]; 117 unsigned char c[64];
122 unsigned int lenhi, lenlo; 118 unsigned int lenhi, lenlo;
123 if (s->blkused >= 56) { 119 if (s->blkused >= 56) {
124 pad = 56 + 64 - s->blkused; 120 pad = 56 + 64 - s->blkused;
125 } else { 121 } else {
126 pad = 56 - s->blkused; 122 pad = 56 - s->blkused;
127 } 123 }
128 lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3)); 124 lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));
(...skipping 13 matching lines...) Expand all
142 for (i = 0; i < 5; i++) { 138 for (i = 0; i < 5; i++) {
143 digest[i * 4] = (s->h[i] >> 24) & 0xFF; 139 digest[i * 4] = (s->h[i] >> 24) & 0xFF;
144 digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF; 140 digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;
145 digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF; 141 digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;
146 digest[i * 4 + 3] = (s->h[i]) & 0xFF; 142 digest[i * 4 + 3] = (s->h[i]) & 0xFF;
147 } 143 }
148 } 144 }
149 void CRYPT_SHA1Generate(const uint8_t* data, 145 void CRYPT_SHA1Generate(const uint8_t* data,
150 uint32_t size, 146 uint32_t size,
151 uint8_t digest[20]) { 147 uint8_t digest[20]) {
152 SHA_State s; 148 CRYPT_sha1_context s;
153 CRYPT_SHA1Start(&s); 149 CRYPT_SHA1Start(&s);
154 CRYPT_SHA1Update(&s, data, size); 150 CRYPT_SHA1Update(&s, data, size);
155 CRYPT_SHA1Finish(&s, digest); 151 CRYPT_SHA1Finish(&s, digest);
156 } 152 }
157 typedef struct {
158 uint32_t total[2];
159 uint32_t state[8];
160 uint8_t buffer[64];
161 } sha256_context;
162 #define GET_UINT32(n, b, i) \ 153 #define GET_UINT32(n, b, i) \
163 { \ 154 { \
164 (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \ 155 (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \
165 ((uint32_t)(b)[(i) + 2] << 8) | ((uint32_t)(b)[(i) + 3]); \ 156 ((uint32_t)(b)[(i) + 2] << 8) | ((uint32_t)(b)[(i) + 3]); \
166 } 157 }
167 #define PUT_UINT32(n, b, i) \ 158 #define PUT_UINT32(n, b, i) \
168 { \ 159 { \
169 (b)[(i)] = (uint8_t)((n) >> 24); \ 160 (b)[(i)] = (uint8_t)((n) >> 24); \
170 (b)[(i) + 1] = (uint8_t)((n) >> 16); \ 161 (b)[(i) + 1] = (uint8_t)((n) >> 16); \
171 (b)[(i) + 2] = (uint8_t)((n) >> 8); \ 162 (b)[(i) + 2] = (uint8_t)((n) >> 8); \
172 (b)[(i) + 3] = (uint8_t)((n)); \ 163 (b)[(i) + 3] = (uint8_t)((n)); \
173 } 164 }
174 void CRYPT_SHA256Start(void* context) { 165
175 sha256_context* ctx = (sha256_context*)context; 166 void CRYPT_SHA256Start(CRYPT_sha256_context* ctx) {
176 ctx->total[0] = 0; 167 ctx->total[0] = 0;
177 ctx->total[1] = 0; 168 ctx->total[1] = 0;
178 ctx->state[0] = 0x6A09E667; 169 ctx->state[0] = 0x6A09E667;
179 ctx->state[1] = 0xBB67AE85; 170 ctx->state[1] = 0xBB67AE85;
180 ctx->state[2] = 0x3C6EF372; 171 ctx->state[2] = 0x3C6EF372;
181 ctx->state[3] = 0xA54FF53A; 172 ctx->state[3] = 0xA54FF53A;
182 ctx->state[4] = 0x510E527F; 173 ctx->state[4] = 0x510E527F;
183 ctx->state[5] = 0x9B05688C; 174 ctx->state[5] = 0x9B05688C;
184 ctx->state[6] = 0x1F83D9AB; 175 ctx->state[6] = 0x1F83D9AB;
185 ctx->state[7] = 0x5BE0CD19; 176 ctx->state[7] = 0x5BE0CD19;
186 } 177 }
187 static void sha256_process(sha256_context* ctx, const uint8_t data[64]) { 178
179 static void sha256_process(CRYPT_sha256_context* ctx, const uint8_t data[64]) {
188 uint32_t temp1, temp2, W[64]; 180 uint32_t temp1, temp2, W[64];
189 uint32_t A, B, C, D, E, F, G, H; 181 uint32_t A, B, C, D, E, F, G, H;
190 GET_UINT32(W[0], data, 0); 182 GET_UINT32(W[0], data, 0);
191 GET_UINT32(W[1], data, 4); 183 GET_UINT32(W[1], data, 4);
192 GET_UINT32(W[2], data, 8); 184 GET_UINT32(W[2], data, 8);
193 GET_UINT32(W[3], data, 12); 185 GET_UINT32(W[3], data, 12);
194 GET_UINT32(W[4], data, 16); 186 GET_UINT32(W[4], data, 16);
195 GET_UINT32(W[5], data, 20); 187 GET_UINT32(W[5], data, 20);
196 GET_UINT32(W[6], data, 24); 188 GET_UINT32(W[6], data, 24);
197 GET_UINT32(W[7], data, 28); 189 GET_UINT32(W[7], data, 28);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2); 285 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
294 ctx->state[0] += A; 286 ctx->state[0] += A;
295 ctx->state[1] += B; 287 ctx->state[1] += B;
296 ctx->state[2] += C; 288 ctx->state[2] += C;
297 ctx->state[3] += D; 289 ctx->state[3] += D;
298 ctx->state[4] += E; 290 ctx->state[4] += E;
299 ctx->state[5] += F; 291 ctx->state[5] += F;
300 ctx->state[6] += G; 292 ctx->state[6] += G;
301 ctx->state[7] += H; 293 ctx->state[7] += H;
302 } 294 }
303 void CRYPT_SHA256Update(void* context, const uint8_t* input, uint32_t length) { 295
304 sha256_context* ctx = (sha256_context*)context; 296 void CRYPT_SHA256Update(CRYPT_sha256_context* ctx,
305 uint32_t left, fill; 297 const uint8_t* input,
306 if (!length) { 298 uint32_t length) {
299 if (!length)
307 return; 300 return;
308 } 301
309 left = ctx->total[0] & 0x3F; 302 uint32_t left = ctx->total[0] & 0x3F;
310 fill = 64 - left; 303 uint32_t fill = 64 - left;
311 ctx->total[0] += length; 304 ctx->total[0] += length;
312 ctx->total[0] &= 0xFFFFFFFF; 305 ctx->total[0] &= 0xFFFFFFFF;
313 if (ctx->total[0] < length) { 306 if (ctx->total[0] < length) {
314 ctx->total[1]++; 307 ctx->total[1]++;
315 } 308 }
316 if (left && length >= fill) { 309 if (left && length >= fill) {
317 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); 310 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill);
318 sha256_process(ctx, ctx->buffer); 311 sha256_process(ctx, ctx->buffer);
319 length -= fill; 312 length -= fill;
320 input += fill; 313 input += fill;
321 left = 0; 314 left = 0;
322 } 315 }
323 while (length >= 64) { 316 while (length >= 64) {
324 sha256_process(ctx, input); 317 sha256_process(ctx, input);
325 length -= 64; 318 length -= 64;
326 input += 64; 319 input += 64;
327 } 320 }
328 if (length) { 321 if (length) {
329 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); 322 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length);
330 } 323 }
331 } 324 }
325
332 static const uint8_t sha256_padding[64] = { 326 static const uint8_t sha256_padding[64] = {
333 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 329 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
336 void CRYPT_SHA256Finish(void* context, uint8_t digest[32]) { 330
337 sha256_context* ctx = (sha256_context*)context; 331 void CRYPT_SHA256Finish(CRYPT_sha256_context* ctx, uint8_t digest[32]) {
338 uint32_t last, padn; 332 uint32_t last, padn;
339 uint32_t high, low; 333 uint32_t high, low;
340 uint8_t msglen[8]; 334 uint8_t msglen[8];
341 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); 335 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
342 low = (ctx->total[0] << 3); 336 low = (ctx->total[0] << 3);
343 PUT_UINT32(high, msglen, 0); 337 PUT_UINT32(high, msglen, 0);
344 PUT_UINT32(low, msglen, 4); 338 PUT_UINT32(low, msglen, 4);
345 last = ctx->total[0] & 0x3F; 339 last = ctx->total[0] & 0x3F;
346 padn = (last < 56) ? (56 - last) : (120 - last); 340 padn = (last < 56) ? (56 - last) : (120 - last);
347 CRYPT_SHA256Update(ctx, sha256_padding, padn); 341 CRYPT_SHA256Update(ctx, sha256_padding, padn);
348 CRYPT_SHA256Update(ctx, msglen, 8); 342 CRYPT_SHA256Update(ctx, msglen, 8);
349 PUT_UINT32(ctx->state[0], digest, 0); 343 PUT_UINT32(ctx->state[0], digest, 0);
350 PUT_UINT32(ctx->state[1], digest, 4); 344 PUT_UINT32(ctx->state[1], digest, 4);
351 PUT_UINT32(ctx->state[2], digest, 8); 345 PUT_UINT32(ctx->state[2], digest, 8);
352 PUT_UINT32(ctx->state[3], digest, 12); 346 PUT_UINT32(ctx->state[3], digest, 12);
353 PUT_UINT32(ctx->state[4], digest, 16); 347 PUT_UINT32(ctx->state[4], digest, 16);
354 PUT_UINT32(ctx->state[5], digest, 20); 348 PUT_UINT32(ctx->state[5], digest, 20);
355 PUT_UINT32(ctx->state[6], digest, 24); 349 PUT_UINT32(ctx->state[6], digest, 24);
356 PUT_UINT32(ctx->state[7], digest, 28); 350 PUT_UINT32(ctx->state[7], digest, 28);
357 } 351 }
352
358 void CRYPT_SHA256Generate(const uint8_t* data, 353 void CRYPT_SHA256Generate(const uint8_t* data,
359 uint32_t size, 354 uint32_t size,
360 uint8_t digest[32]) { 355 uint8_t digest[32]) {
361 sha256_context ctx; 356 CRYPT_sha256_context ctx;
362 CRYPT_SHA256Start(&ctx); 357 CRYPT_SHA256Start(&ctx);
363 CRYPT_SHA256Update(&ctx, data, size); 358 CRYPT_SHA256Update(&ctx, data, size);
364 CRYPT_SHA256Finish(&ctx, digest); 359 CRYPT_SHA256Finish(&ctx, digest);
365 } 360 }
366 typedef struct { 361
367 uint64_t total[2];
368 uint64_t state[8];
369 uint8_t buffer[128];
370 } sha384_context;
371 uint64_t FX_ato64i(const FX_CHAR* str) { 362 uint64_t FX_ato64i(const FX_CHAR* str) {
372 ASSERT(str); 363 ASSERT(str);
373 uint64_t ret = 0; 364 uint64_t ret = 0;
374 int len = (int)FXSYS_strlen(str); 365 int len = (int)FXSYS_strlen(str);
375 len = len > 16 ? 16 : len; 366 len = len > 16 ? 16 : len;
376 for (int i = 0; i < len; ++i) { 367 for (int i = 0; i < len; ++i) {
377 if (i) { 368 if (i) {
378 ret <<= 4; 369 ret <<= 4;
379 } 370 }
380 if (str[i] >= '0' && str[i] <= '9') { 371 if (str[i] >= '0' && str[i] <= '9') {
381 ret |= (str[i] - '0') & 0xFF; 372 ret |= (str[i] - '0') & 0xFF;
382 } else if (str[i] >= 'a' && str[i] <= 'f') { 373 } else if (str[i] >= 'a' && str[i] <= 'f') {
383 ret |= (str[i] - 'a' + 10) & 0xFF; 374 ret |= (str[i] - 'a' + 10) & 0xFF;
384 } else if (str[i] >= 'A' && str[i] <= 'F') { 375 } else if (str[i] >= 'A' && str[i] <= 'F') {
385 ret |= (str[i] - 'A' + 10) & 0xFF; 376 ret |= (str[i] - 'A' + 10) & 0xFF;
386 } else { 377 } else {
387 ASSERT(false); 378 ASSERT(false);
388 } 379 }
389 } 380 }
390 return ret; 381 return ret;
391 } 382 }
392 void CRYPT_SHA384Start(void* context) { 383
393 if (!context) { 384 void CRYPT_SHA384Start(CRYPT_sha384_context* ctx) {
385 if (!ctx)
394 return; 386 return;
395 } 387
396 sha384_context* ctx = (sha384_context*)context; 388 FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context));
397 FXSYS_memset(ctx, 0, sizeof(sha384_context));
398 ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8"); 389 ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");
399 ctx->state[1] = FX_ato64i("629a292a367cd507"); 390 ctx->state[1] = FX_ato64i("629a292a367cd507");
400 ctx->state[2] = FX_ato64i("9159015a3070dd17"); 391 ctx->state[2] = FX_ato64i("9159015a3070dd17");
401 ctx->state[3] = FX_ato64i("152fecd8f70e5939"); 392 ctx->state[3] = FX_ato64i("152fecd8f70e5939");
402 ctx->state[4] = FX_ato64i("67332667ffc00b31"); 393 ctx->state[4] = FX_ato64i("67332667ffc00b31");
403 ctx->state[5] = FX_ato64i("8eb44a8768581511"); 394 ctx->state[5] = FX_ato64i("8eb44a8768581511");
404 ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7"); 395 ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");
405 ctx->state[7] = FX_ato64i("47b5481dbefa4fa4"); 396 ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");
406 } 397 }
398
407 #define SHA384_F0(x, y, z) ((x & y) | (z & (x | y))) 399 #define SHA384_F0(x, y, z) ((x & y) | (z & (x | y)))
408 #define SHA384_F1(x, y, z) (z ^ (x & (y ^ z))) 400 #define SHA384_F1(x, y, z) (z ^ (x & (y ^ z)))
409 #define SHA384_SHR(x, n) (x >> n) 401 #define SHA384_SHR(x, n) (x >> n)
410 #define SHA384_ROTR(x, n) (SHA384_SHR(x, n) | x << (64 - n)) 402 #define SHA384_ROTR(x, n) (SHA384_SHR(x, n) | x << (64 - n))
411 #define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7)) 403 #define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7))
412 #define SHA384_S1(x) \ 404 #define SHA384_S1(x) \
413 (SHA384_ROTR(x, 19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6)) 405 (SHA384_ROTR(x, 19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6))
414 #define SHA384_S2(x) \ 406 #define SHA384_S2(x) \
415 (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39)) 407 (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))
416 #define SHA384_S3(x) \ 408 #define SHA384_S3(x) \
417 (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x, 18) ^ SHA384_ROTR(x, 41)) 409 (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x, 18) ^ SHA384_ROTR(x, 41))
418 #define SHA384_P(a, b, c, d, e, f, g, h, x, K) \ 410 #define SHA384_P(a, b, c, d, e, f, g, h, x, K) \
419 { \ 411 { \
420 temp1 = h + SHA384_S3(e) + SHA384_F1(e, f, g) + K + x; \ 412 temp1 = h + SHA384_S3(e) + SHA384_F1(e, f, g) + K + x; \
421 temp2 = SHA384_S2(a) + SHA384_F0(a, b, c); \ 413 temp2 = SHA384_S2(a) + SHA384_F0(a, b, c); \
422 d += temp1; \ 414 d += temp1; \
423 h = temp1 + temp2; \ 415 h = temp1 + temp2; \
424 } 416 }
417 #define SHA384_R(t) \
418 (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
419
425 static const uint8_t sha384_padding[128] = { 420 static const uint8_t sha384_padding[128] = {
426 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
427 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
429 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 424 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
430 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 }; 427 };
433 #define SHA384_R(t) \ 428
434 (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
435 static const FX_CHAR* constants[] = { 429 static const FX_CHAR* constants[] = {
436 "428a2f98d728ae22", "7137449123ef65cd", "b5c0fbcfec4d3b2f", 430 "428a2f98d728ae22", "7137449123ef65cd", "b5c0fbcfec4d3b2f",
437 "e9b5dba58189dbbc", "3956c25bf348b538", "59f111f1b605d019", 431 "e9b5dba58189dbbc", "3956c25bf348b538", "59f111f1b605d019",
438 "923f82a4af194f9b", "ab1c5ed5da6d8118", "d807aa98a3030242", 432 "923f82a4af194f9b", "ab1c5ed5da6d8118", "d807aa98a3030242",
439 "12835b0145706fbe", "243185be4ee4b28c", "550c7dc3d5ffb4e2", 433 "12835b0145706fbe", "243185be4ee4b28c", "550c7dc3d5ffb4e2",
440 "72be5d74f27b896f", "80deb1fe3b1696b1", "9bdc06a725c71235", 434 "72be5d74f27b896f", "80deb1fe3b1696b1", "9bdc06a725c71235",
441 "c19bf174cf692694", "e49b69c19ef14ad2", "efbe4786384f25e3", 435 "c19bf174cf692694", "e49b69c19ef14ad2", "efbe4786384f25e3",
442 "0fc19dc68b8cd5b5", "240ca1cc77ac9c65", "2de92c6f592b0275", 436 "0fc19dc68b8cd5b5", "240ca1cc77ac9c65", "2de92c6f592b0275",
443 "4a7484aa6ea6e483", "5cb0a9dcbd41fbd4", "76f988da831153b5", 437 "4a7484aa6ea6e483", "5cb0a9dcbd41fbd4", "76f988da831153b5",
444 "983e5152ee66dfab", "a831c66d2db43210", "b00327c898fb213f", 438 "983e5152ee66dfab", "a831c66d2db43210", "b00327c898fb213f",
(...skipping 27 matching lines...) Expand all
472 { \ 466 { \
473 (b)[(i)] = (uint8_t)((n) >> 56); \ 467 (b)[(i)] = (uint8_t)((n) >> 56); \
474 (b)[(i) + 1] = (uint8_t)((n) >> 48); \ 468 (b)[(i) + 1] = (uint8_t)((n) >> 48); \
475 (b)[(i) + 2] = (uint8_t)((n) >> 40); \ 469 (b)[(i) + 2] = (uint8_t)((n) >> 40); \
476 (b)[(i) + 3] = (uint8_t)((n) >> 32); \ 470 (b)[(i) + 3] = (uint8_t)((n) >> 32); \
477 (b)[(i) + 4] = (uint8_t)((n) >> 24); \ 471 (b)[(i) + 4] = (uint8_t)((n) >> 24); \
478 (b)[(i) + 5] = (uint8_t)((n) >> 16); \ 472 (b)[(i) + 5] = (uint8_t)((n) >> 16); \
479 (b)[(i) + 6] = (uint8_t)((n) >> 8); \ 473 (b)[(i) + 6] = (uint8_t)((n) >> 8); \
480 (b)[(i) + 7] = (uint8_t)((n)); \ 474 (b)[(i) + 7] = (uint8_t)((n)); \
481 } 475 }
482 static void sha384_process(sha384_context* ctx, const uint8_t data[128]) { 476
477 static void sha384_process(CRYPT_sha384_context* ctx, const uint8_t data[128]) {
483 uint64_t temp1, temp2; 478 uint64_t temp1, temp2;
484 uint64_t A, B, C, D, E, F, G, H; 479 uint64_t A, B, C, D, E, F, G, H;
485 uint64_t W[80]; 480 uint64_t W[80];
486 GET_FX_64WORD(W[0], data, 0); 481 GET_FX_64WORD(W[0], data, 0);
487 GET_FX_64WORD(W[1], data, 8); 482 GET_FX_64WORD(W[1], data, 8);
488 GET_FX_64WORD(W[2], data, 16); 483 GET_FX_64WORD(W[2], data, 16);
489 GET_FX_64WORD(W[3], data, 24); 484 GET_FX_64WORD(W[3], data, 24);
490 GET_FX_64WORD(W[4], data, 32); 485 GET_FX_64WORD(W[4], data, 32);
491 GET_FX_64WORD(W[5], data, 40); 486 GET_FX_64WORD(W[5], data, 40);
492 GET_FX_64WORD(W[6], data, 48); 487 GET_FX_64WORD(W[6], data, 48);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 } 534 }
540 ctx->state[0] += A; 535 ctx->state[0] += A;
541 ctx->state[1] += B; 536 ctx->state[1] += B;
542 ctx->state[2] += C; 537 ctx->state[2] += C;
543 ctx->state[3] += D; 538 ctx->state[3] += D;
544 ctx->state[4] += E; 539 ctx->state[4] += E;
545 ctx->state[5] += F; 540 ctx->state[5] += F;
546 ctx->state[6] += G; 541 ctx->state[6] += G;
547 ctx->state[7] += H; 542 ctx->state[7] += H;
548 } 543 }
549 void CRYPT_SHA384Update(void* context, const uint8_t* input, uint32_t length) { 544
550 sha384_context* ctx = (sha384_context*)context; 545 void CRYPT_SHA384Update(CRYPT_sha384_context* ctx,
546 const uint8_t* input,
547 uint32_t length) {
551 uint32_t left, fill; 548 uint32_t left, fill;
552 if (!length) { 549 if (!length) {
553 return; 550 return;
554 } 551 }
555 left = (uint32_t)ctx->total[0] & 0x7F; 552 left = (uint32_t)ctx->total[0] & 0x7F;
556 fill = 128 - left; 553 fill = 128 - left;
557 ctx->total[0] += length; 554 ctx->total[0] += length;
558 if (ctx->total[0] < length) { 555 if (ctx->total[0] < length) {
559 ctx->total[1]++; 556 ctx->total[1]++;
560 } 557 }
561 if (left && length >= fill) { 558 if (left && length >= fill) {
562 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); 559 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill);
563 sha384_process(ctx, ctx->buffer); 560 sha384_process(ctx, ctx->buffer);
564 length -= fill; 561 length -= fill;
565 input += fill; 562 input += fill;
566 left = 0; 563 left = 0;
567 } 564 }
568 while (length >= 128) { 565 while (length >= 128) {
569 sha384_process(ctx, input); 566 sha384_process(ctx, input);
570 length -= 128; 567 length -= 128;
571 input += 128; 568 input += 128;
572 } 569 }
573 if (length) { 570 if (length) {
574 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); 571 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length);
575 } 572 }
576 } 573 }
577 void CRYPT_SHA384Finish(void* context, uint8_t digest[48]) { 574
578 sha384_context* ctx = (sha384_context*)context; 575 void CRYPT_SHA384Finish(CRYPT_sha384_context* ctx, uint8_t digest[48]) {
579 uint32_t last, padn; 576 uint32_t last, padn;
580 uint8_t msglen[16]; 577 uint8_t msglen[16];
581 FXSYS_memset(msglen, 0, 16); 578 FXSYS_memset(msglen, 0, 16);
582 uint64_t high, low; 579 uint64_t high, low;
583 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); 580 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
584 low = (ctx->total[0] << 3); 581 low = (ctx->total[0] << 3);
585 PUT_UINT64(high, msglen, 0); 582 PUT_UINT64(high, msglen, 0);
586 PUT_UINT64(low, msglen, 8); 583 PUT_UINT64(low, msglen, 8);
587 last = (uint32_t)ctx->total[0] & 0x7F; 584 last = (uint32_t)ctx->total[0] & 0x7F;
588 padn = (last < 112) ? (112 - last) : (240 - last); 585 padn = (last < 112) ? (112 - last) : (240 - last);
589 CRYPT_SHA384Update(ctx, sha384_padding, padn); 586 CRYPT_SHA384Update(ctx, sha384_padding, padn);
590 CRYPT_SHA384Update(ctx, msglen, 16); 587 CRYPT_SHA384Update(ctx, msglen, 16);
591 PUT_UINT64(ctx->state[0], digest, 0); 588 PUT_UINT64(ctx->state[0], digest, 0);
592 PUT_UINT64(ctx->state[1], digest, 8); 589 PUT_UINT64(ctx->state[1], digest, 8);
593 PUT_UINT64(ctx->state[2], digest, 16); 590 PUT_UINT64(ctx->state[2], digest, 16);
594 PUT_UINT64(ctx->state[3], digest, 24); 591 PUT_UINT64(ctx->state[3], digest, 24);
595 PUT_UINT64(ctx->state[4], digest, 32); 592 PUT_UINT64(ctx->state[4], digest, 32);
596 PUT_UINT64(ctx->state[5], digest, 40); 593 PUT_UINT64(ctx->state[5], digest, 40);
597 } 594 }
595
598 void CRYPT_SHA384Generate(const uint8_t* data, 596 void CRYPT_SHA384Generate(const uint8_t* data,
599 uint32_t size, 597 uint32_t size,
600 uint8_t digest[64]) { 598 uint8_t digest[64]) {
601 sha384_context context; 599 CRYPT_sha384_context context;
602 CRYPT_SHA384Start(&context); 600 CRYPT_SHA384Start(&context);
603 CRYPT_SHA384Update(&context, data, size); 601 CRYPT_SHA384Update(&context, data, size);
604 CRYPT_SHA384Finish(&context, digest); 602 CRYPT_SHA384Finish(&context, digest);
605 } 603 }
604
606 void CRYPT_SHA512Start(void* context) { 605 void CRYPT_SHA512Start(void* context) {
607 if (!context) { 606 if (!context) {
608 return; 607 return;
609 } 608 }
610 sha384_context* ctx = (sha384_context*)context; 609 CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
611 FXSYS_memset(ctx, 0, sizeof(sha384_context)); 610 FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context));
612 ctx->state[0] = FX_ato64i("6a09e667f3bcc908"); 611 ctx->state[0] = FX_ato64i("6a09e667f3bcc908");
613 ctx->state[1] = FX_ato64i("bb67ae8584caa73b"); 612 ctx->state[1] = FX_ato64i("bb67ae8584caa73b");
614 ctx->state[2] = FX_ato64i("3c6ef372fe94f82b"); 613 ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");
615 ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1"); 614 ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1");
616 ctx->state[4] = FX_ato64i("510e527fade682d1"); 615 ctx->state[4] = FX_ato64i("510e527fade682d1");
617 ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f"); 616 ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f");
618 ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b"); 617 ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");
619 ctx->state[7] = FX_ato64i("5be0cd19137e2179"); 618 ctx->state[7] = FX_ato64i("5be0cd19137e2179");
620 } 619 }
620
621 void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) { 621 void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) {
622 CRYPT_SHA384Update(context, data, size); 622 CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
623 CRYPT_SHA384Update(ctx, data, size);
623 } 624 }
625
624 void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) { 626 void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) {
625 sha384_context* ctx = (sha384_context*)context; 627 CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
626 uint32_t last, padn; 628 uint32_t last, padn;
627 uint8_t msglen[16]; 629 uint8_t msglen[16];
628 FXSYS_memset(msglen, 0, 16); 630 FXSYS_memset(msglen, 0, 16);
629 uint64_t high, low; 631 uint64_t high, low;
630 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); 632 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
631 low = (ctx->total[0] << 3); 633 low = (ctx->total[0] << 3);
632 PUT_UINT64(high, msglen, 0); 634 PUT_UINT64(high, msglen, 0);
633 PUT_UINT64(low, msglen, 8); 635 PUT_UINT64(low, msglen, 8);
634 last = (uint32_t)ctx->total[0] & 0x7F; 636 last = (uint32_t)ctx->total[0] & 0x7F;
635 padn = (last < 112) ? (112 - last) : (240 - last); 637 padn = (last < 112) ? (112 - last) : (240 - last);
636 CRYPT_SHA512Update(ctx, sha384_padding, padn); 638 CRYPT_SHA512Update(ctx, sha384_padding, padn);
637 CRYPT_SHA512Update(ctx, msglen, 16); 639 CRYPT_SHA512Update(ctx, msglen, 16);
638 PUT_UINT64(ctx->state[0], digest, 0); 640 PUT_UINT64(ctx->state[0], digest, 0);
639 PUT_UINT64(ctx->state[1], digest, 8); 641 PUT_UINT64(ctx->state[1], digest, 8);
640 PUT_UINT64(ctx->state[2], digest, 16); 642 PUT_UINT64(ctx->state[2], digest, 16);
641 PUT_UINT64(ctx->state[3], digest, 24); 643 PUT_UINT64(ctx->state[3], digest, 24);
642 PUT_UINT64(ctx->state[4], digest, 32); 644 PUT_UINT64(ctx->state[4], digest, 32);
643 PUT_UINT64(ctx->state[5], digest, 40); 645 PUT_UINT64(ctx->state[5], digest, 40);
644 PUT_UINT64(ctx->state[6], digest, 48); 646 PUT_UINT64(ctx->state[6], digest, 48);
645 PUT_UINT64(ctx->state[7], digest, 56); 647 PUT_UINT64(ctx->state[7], digest, 56);
646 } 648 }
649
647 void CRYPT_SHA512Generate(const uint8_t* data, 650 void CRYPT_SHA512Generate(const uint8_t* data,
648 uint32_t size, 651 uint32_t size,
649 uint8_t digest[64]) { 652 uint8_t digest[64]) {
650 sha384_context context; 653 CRYPT_sha384_context context;
651 CRYPT_SHA512Start(&context); 654 CRYPT_SHA512Start(&context);
652 CRYPT_SHA512Update(&context, data, size); 655 CRYPT_SHA512Update(&context, data, size);
653 CRYPT_SHA512Finish(&context, digest); 656 CRYPT_SHA512Finish(&context, digest);
654 } 657 }
658
655 #ifdef __cplusplus 659 #ifdef __cplusplus
656 }; 660 };
657 #endif 661 #endif
OLDNEW
« no previous file with comments | « core/fdrm/crypto/fx_crypt.h ('k') | core/fdrm/crypto/fx_crypt_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698