OLD | NEW |
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/include/fx_crypt.h" | 7 #include "core/fdrm/crypto/include/fx_crypt.h" |
8 | 8 |
9 #ifdef __cplusplus | 9 #ifdef __cplusplus |
10 extern "C" { | 10 extern "C" { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 digest[2] += c; | 77 digest[2] += c; |
78 digest[3] += d; | 78 digest[3] += d; |
79 digest[4] += e; | 79 digest[4] += e; |
80 } | 80 } |
81 void CRYPT_SHA1Start(void* context) { | 81 void CRYPT_SHA1Start(void* context) { |
82 SHA_State* s = (SHA_State*)context; | 82 SHA_State* s = (SHA_State*)context; |
83 SHA_Core_Init(s->h); | 83 SHA_Core_Init(s->h); |
84 s->blkused = 0; | 84 s->blkused = 0; |
85 s->lenhi = s->lenlo = 0; | 85 s->lenhi = s->lenlo = 0; |
86 } | 86 } |
87 void CRYPT_SHA1Update(void* context, const uint8_t* data, FX_DWORD size) { | 87 void CRYPT_SHA1Update(void* context, const uint8_t* data, uint32_t size) { |
88 SHA_State* s = (SHA_State*)context; | 88 SHA_State* s = (SHA_State*)context; |
89 unsigned char* q = (unsigned char*)data; | 89 unsigned char* q = (unsigned char*)data; |
90 unsigned int wordblock[16]; | 90 unsigned int wordblock[16]; |
91 int len = size; | 91 int len = size; |
92 unsigned int lenw = len; | 92 unsigned int lenw = len; |
93 int i; | 93 int i; |
94 s->lenlo += lenw; | 94 s->lenlo += lenw; |
95 s->lenhi += (s->lenlo < lenw); | 95 s->lenhi += (s->lenlo < lenw); |
96 if (s->blkused && s->blkused + len < 64) { | 96 if (s->blkused && s->blkused + len < 64) { |
97 FXSYS_memcpy(s->block + s->blkused, q, len); | 97 FXSYS_memcpy(s->block + s->blkused, q, len); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 c[7] = (lenlo >> 0) & 0xFF; | 140 c[7] = (lenlo >> 0) & 0xFF; |
141 CRYPT_SHA1Update(s, c, 8); | 141 CRYPT_SHA1Update(s, c, 8); |
142 for (i = 0; i < 5; i++) { | 142 for (i = 0; i < 5; i++) { |
143 digest[i * 4] = (s->h[i] >> 24) & 0xFF; | 143 digest[i * 4] = (s->h[i] >> 24) & 0xFF; |
144 digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF; | 144 digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF; |
145 digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF; | 145 digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF; |
146 digest[i * 4 + 3] = (s->h[i]) & 0xFF; | 146 digest[i * 4 + 3] = (s->h[i]) & 0xFF; |
147 } | 147 } |
148 } | 148 } |
149 void CRYPT_SHA1Generate(const uint8_t* data, | 149 void CRYPT_SHA1Generate(const uint8_t* data, |
150 FX_DWORD size, | 150 uint32_t size, |
151 uint8_t digest[20]) { | 151 uint8_t digest[20]) { |
152 SHA_State s; | 152 SHA_State s; |
153 CRYPT_SHA1Start(&s); | 153 CRYPT_SHA1Start(&s); |
154 CRYPT_SHA1Update(&s, data, size); | 154 CRYPT_SHA1Update(&s, data, size); |
155 CRYPT_SHA1Finish(&s, digest); | 155 CRYPT_SHA1Finish(&s, digest); |
156 } | 156 } |
157 typedef struct { | 157 typedef struct { |
158 FX_DWORD total[2]; | 158 uint32_t total[2]; |
159 FX_DWORD state[8]; | 159 uint32_t state[8]; |
160 uint8_t buffer[64]; | 160 uint8_t buffer[64]; |
161 } sha256_context; | 161 } sha256_context; |
162 #define GET_FX_DWORD(n, b, i) \ | 162 #define GET_FX_DWORD(n, b, i) \ |
163 { \ | 163 { \ |
164 (n) = ((FX_DWORD)(b)[(i)] << 24) | ((FX_DWORD)(b)[(i) + 1] << 16) | \ | 164 (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \ |
165 ((FX_DWORD)(b)[(i) + 2] << 8) | ((FX_DWORD)(b)[(i) + 3]); \ | 165 ((uint32_t)(b)[(i) + 2] << 8) | ((uint32_t)(b)[(i) + 3]); \ |
166 } | 166 } |
167 #define PUT_FX_DWORD(n, b, i) \ | 167 #define PUT_FX_DWORD(n, b, i) \ |
168 { \ | 168 { \ |
169 (b)[(i)] = (uint8_t)((n) >> 24); \ | 169 (b)[(i)] = (uint8_t)((n) >> 24); \ |
170 (b)[(i) + 1] = (uint8_t)((n) >> 16); \ | 170 (b)[(i) + 1] = (uint8_t)((n) >> 16); \ |
171 (b)[(i) + 2] = (uint8_t)((n) >> 8); \ | 171 (b)[(i) + 2] = (uint8_t)((n) >> 8); \ |
172 (b)[(i) + 3] = (uint8_t)((n)); \ | 172 (b)[(i) + 3] = (uint8_t)((n)); \ |
173 } | 173 } |
174 void CRYPT_SHA256Start(void* context) { | 174 void CRYPT_SHA256Start(void* context) { |
175 sha256_context* ctx = (sha256_context*)context; | 175 sha256_context* ctx = (sha256_context*)context; |
176 ctx->total[0] = 0; | 176 ctx->total[0] = 0; |
177 ctx->total[1] = 0; | 177 ctx->total[1] = 0; |
178 ctx->state[0] = 0x6A09E667; | 178 ctx->state[0] = 0x6A09E667; |
179 ctx->state[1] = 0xBB67AE85; | 179 ctx->state[1] = 0xBB67AE85; |
180 ctx->state[2] = 0x3C6EF372; | 180 ctx->state[2] = 0x3C6EF372; |
181 ctx->state[3] = 0xA54FF53A; | 181 ctx->state[3] = 0xA54FF53A; |
182 ctx->state[4] = 0x510E527F; | 182 ctx->state[4] = 0x510E527F; |
183 ctx->state[5] = 0x9B05688C; | 183 ctx->state[5] = 0x9B05688C; |
184 ctx->state[6] = 0x1F83D9AB; | 184 ctx->state[6] = 0x1F83D9AB; |
185 ctx->state[7] = 0x5BE0CD19; | 185 ctx->state[7] = 0x5BE0CD19; |
186 } | 186 } |
187 static void sha256_process(sha256_context* ctx, const uint8_t data[64]) { | 187 static void sha256_process(sha256_context* ctx, const uint8_t data[64]) { |
188 FX_DWORD temp1, temp2, W[64]; | 188 uint32_t temp1, temp2, W[64]; |
189 FX_DWORD A, B, C, D, E, F, G, H; | 189 uint32_t A, B, C, D, E, F, G, H; |
190 GET_FX_DWORD(W[0], data, 0); | 190 GET_FX_DWORD(W[0], data, 0); |
191 GET_FX_DWORD(W[1], data, 4); | 191 GET_FX_DWORD(W[1], data, 4); |
192 GET_FX_DWORD(W[2], data, 8); | 192 GET_FX_DWORD(W[2], data, 8); |
193 GET_FX_DWORD(W[3], data, 12); | 193 GET_FX_DWORD(W[3], data, 12); |
194 GET_FX_DWORD(W[4], data, 16); | 194 GET_FX_DWORD(W[4], data, 16); |
195 GET_FX_DWORD(W[5], data, 20); | 195 GET_FX_DWORD(W[5], data, 20); |
196 GET_FX_DWORD(W[6], data, 24); | 196 GET_FX_DWORD(W[6], data, 24); |
197 GET_FX_DWORD(W[7], data, 28); | 197 GET_FX_DWORD(W[7], data, 28); |
198 GET_FX_DWORD(W[8], data, 32); | 198 GET_FX_DWORD(W[8], data, 32); |
199 GET_FX_DWORD(W[9], data, 36); | 199 GET_FX_DWORD(W[9], data, 36); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2); | 293 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2); |
294 ctx->state[0] += A; | 294 ctx->state[0] += A; |
295 ctx->state[1] += B; | 295 ctx->state[1] += B; |
296 ctx->state[2] += C; | 296 ctx->state[2] += C; |
297 ctx->state[3] += D; | 297 ctx->state[3] += D; |
298 ctx->state[4] += E; | 298 ctx->state[4] += E; |
299 ctx->state[5] += F; | 299 ctx->state[5] += F; |
300 ctx->state[6] += G; | 300 ctx->state[6] += G; |
301 ctx->state[7] += H; | 301 ctx->state[7] += H; |
302 } | 302 } |
303 void CRYPT_SHA256Update(void* context, const uint8_t* input, FX_DWORD length) { | 303 void CRYPT_SHA256Update(void* context, const uint8_t* input, uint32_t length) { |
304 sha256_context* ctx = (sha256_context*)context; | 304 sha256_context* ctx = (sha256_context*)context; |
305 FX_DWORD left, fill; | 305 uint32_t left, fill; |
306 if (!length) { | 306 if (!length) { |
307 return; | 307 return; |
308 } | 308 } |
309 left = ctx->total[0] & 0x3F; | 309 left = ctx->total[0] & 0x3F; |
310 fill = 64 - left; | 310 fill = 64 - left; |
311 ctx->total[0] += length; | 311 ctx->total[0] += length; |
312 ctx->total[0] &= 0xFFFFFFFF; | 312 ctx->total[0] &= 0xFFFFFFFF; |
313 if (ctx->total[0] < length) { | 313 if (ctx->total[0] < length) { |
314 ctx->total[1]++; | 314 ctx->total[1]++; |
315 } | 315 } |
(...skipping 12 matching lines...) Expand all Loading... |
328 if (length) { | 328 if (length) { |
329 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); | 329 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); |
330 } | 330 } |
331 } | 331 } |
332 static const uint8_t sha256_padding[64] = { | 332 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, | 333 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, | 334 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}; | 335 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]) { | 336 void CRYPT_SHA256Finish(void* context, uint8_t digest[32]) { |
337 sha256_context* ctx = (sha256_context*)context; | 337 sha256_context* ctx = (sha256_context*)context; |
338 FX_DWORD last, padn; | 338 uint32_t last, padn; |
339 FX_DWORD high, low; | 339 uint32_t high, low; |
340 uint8_t msglen[8]; | 340 uint8_t msglen[8]; |
341 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); | 341 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); |
342 low = (ctx->total[0] << 3); | 342 low = (ctx->total[0] << 3); |
343 PUT_FX_DWORD(high, msglen, 0); | 343 PUT_FX_DWORD(high, msglen, 0); |
344 PUT_FX_DWORD(low, msglen, 4); | 344 PUT_FX_DWORD(low, msglen, 4); |
345 last = ctx->total[0] & 0x3F; | 345 last = ctx->total[0] & 0x3F; |
346 padn = (last < 56) ? (56 - last) : (120 - last); | 346 padn = (last < 56) ? (56 - last) : (120 - last); |
347 CRYPT_SHA256Update(ctx, sha256_padding, padn); | 347 CRYPT_SHA256Update(ctx, sha256_padding, padn); |
348 CRYPT_SHA256Update(ctx, msglen, 8); | 348 CRYPT_SHA256Update(ctx, msglen, 8); |
349 PUT_FX_DWORD(ctx->state[0], digest, 0); | 349 PUT_FX_DWORD(ctx->state[0], digest, 0); |
350 PUT_FX_DWORD(ctx->state[1], digest, 4); | 350 PUT_FX_DWORD(ctx->state[1], digest, 4); |
351 PUT_FX_DWORD(ctx->state[2], digest, 8); | 351 PUT_FX_DWORD(ctx->state[2], digest, 8); |
352 PUT_FX_DWORD(ctx->state[3], digest, 12); | 352 PUT_FX_DWORD(ctx->state[3], digest, 12); |
353 PUT_FX_DWORD(ctx->state[4], digest, 16); | 353 PUT_FX_DWORD(ctx->state[4], digest, 16); |
354 PUT_FX_DWORD(ctx->state[5], digest, 20); | 354 PUT_FX_DWORD(ctx->state[5], digest, 20); |
355 PUT_FX_DWORD(ctx->state[6], digest, 24); | 355 PUT_FX_DWORD(ctx->state[6], digest, 24); |
356 PUT_FX_DWORD(ctx->state[7], digest, 28); | 356 PUT_FX_DWORD(ctx->state[7], digest, 28); |
357 } | 357 } |
358 void CRYPT_SHA256Generate(const uint8_t* data, | 358 void CRYPT_SHA256Generate(const uint8_t* data, |
359 FX_DWORD size, | 359 uint32_t size, |
360 uint8_t digest[32]) { | 360 uint8_t digest[32]) { |
361 sha256_context ctx; | 361 sha256_context ctx; |
362 CRYPT_SHA256Start(&ctx); | 362 CRYPT_SHA256Start(&ctx); |
363 CRYPT_SHA256Update(&ctx, data, size); | 363 CRYPT_SHA256Update(&ctx, data, size); |
364 CRYPT_SHA256Finish(&ctx, digest); | 364 CRYPT_SHA256Finish(&ctx, digest); |
365 } | 365 } |
366 typedef struct { | 366 typedef struct { |
367 uint64_t total[2]; | 367 uint64_t total[2]; |
368 uint64_t state[8]; | 368 uint64_t state[8]; |
369 uint8_t buffer[128]; | 369 uint8_t buffer[128]; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 } | 539 } |
540 ctx->state[0] += A; | 540 ctx->state[0] += A; |
541 ctx->state[1] += B; | 541 ctx->state[1] += B; |
542 ctx->state[2] += C; | 542 ctx->state[2] += C; |
543 ctx->state[3] += D; | 543 ctx->state[3] += D; |
544 ctx->state[4] += E; | 544 ctx->state[4] += E; |
545 ctx->state[5] += F; | 545 ctx->state[5] += F; |
546 ctx->state[6] += G; | 546 ctx->state[6] += G; |
547 ctx->state[7] += H; | 547 ctx->state[7] += H; |
548 } | 548 } |
549 void CRYPT_SHA384Update(void* context, const uint8_t* input, FX_DWORD length) { | 549 void CRYPT_SHA384Update(void* context, const uint8_t* input, uint32_t length) { |
550 sha384_context* ctx = (sha384_context*)context; | 550 sha384_context* ctx = (sha384_context*)context; |
551 FX_DWORD left, fill; | 551 uint32_t left, fill; |
552 if (!length) { | 552 if (!length) { |
553 return; | 553 return; |
554 } | 554 } |
555 left = (FX_DWORD)ctx->total[0] & 0x7F; | 555 left = (uint32_t)ctx->total[0] & 0x7F; |
556 fill = 128 - left; | 556 fill = 128 - left; |
557 ctx->total[0] += length; | 557 ctx->total[0] += length; |
558 if (ctx->total[0] < length) { | 558 if (ctx->total[0] < length) { |
559 ctx->total[1]++; | 559 ctx->total[1]++; |
560 } | 560 } |
561 if (left && length >= fill) { | 561 if (left && length >= fill) { |
562 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); | 562 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); |
563 sha384_process(ctx, ctx->buffer); | 563 sha384_process(ctx, ctx->buffer); |
564 length -= fill; | 564 length -= fill; |
565 input += fill; | 565 input += fill; |
566 left = 0; | 566 left = 0; |
567 } | 567 } |
568 while (length >= 128) { | 568 while (length >= 128) { |
569 sha384_process(ctx, input); | 569 sha384_process(ctx, input); |
570 length -= 128; | 570 length -= 128; |
571 input += 128; | 571 input += 128; |
572 } | 572 } |
573 if (length) { | 573 if (length) { |
574 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); | 574 FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); |
575 } | 575 } |
576 } | 576 } |
577 void CRYPT_SHA384Finish(void* context, uint8_t digest[48]) { | 577 void CRYPT_SHA384Finish(void* context, uint8_t digest[48]) { |
578 sha384_context* ctx = (sha384_context*)context; | 578 sha384_context* ctx = (sha384_context*)context; |
579 FX_DWORD last, padn; | 579 uint32_t last, padn; |
580 uint8_t msglen[16]; | 580 uint8_t msglen[16]; |
581 FXSYS_memset(msglen, 0, 16); | 581 FXSYS_memset(msglen, 0, 16); |
582 uint64_t high, low; | 582 uint64_t high, low; |
583 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); | 583 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); |
584 low = (ctx->total[0] << 3); | 584 low = (ctx->total[0] << 3); |
585 PUT_FX_64DWORD(high, msglen, 0); | 585 PUT_FX_64DWORD(high, msglen, 0); |
586 PUT_FX_64DWORD(low, msglen, 8); | 586 PUT_FX_64DWORD(low, msglen, 8); |
587 last = (FX_DWORD)ctx->total[0] & 0x7F; | 587 last = (uint32_t)ctx->total[0] & 0x7F; |
588 padn = (last < 112) ? (112 - last) : (240 - last); | 588 padn = (last < 112) ? (112 - last) : (240 - last); |
589 CRYPT_SHA384Update(ctx, sha384_padding, padn); | 589 CRYPT_SHA384Update(ctx, sha384_padding, padn); |
590 CRYPT_SHA384Update(ctx, msglen, 16); | 590 CRYPT_SHA384Update(ctx, msglen, 16); |
591 PUT_FX_64DWORD(ctx->state[0], digest, 0); | 591 PUT_FX_64DWORD(ctx->state[0], digest, 0); |
592 PUT_FX_64DWORD(ctx->state[1], digest, 8); | 592 PUT_FX_64DWORD(ctx->state[1], digest, 8); |
593 PUT_FX_64DWORD(ctx->state[2], digest, 16); | 593 PUT_FX_64DWORD(ctx->state[2], digest, 16); |
594 PUT_FX_64DWORD(ctx->state[3], digest, 24); | 594 PUT_FX_64DWORD(ctx->state[3], digest, 24); |
595 PUT_FX_64DWORD(ctx->state[4], digest, 32); | 595 PUT_FX_64DWORD(ctx->state[4], digest, 32); |
596 PUT_FX_64DWORD(ctx->state[5], digest, 40); | 596 PUT_FX_64DWORD(ctx->state[5], digest, 40); |
597 } | 597 } |
598 void CRYPT_SHA384Generate(const uint8_t* data, | 598 void CRYPT_SHA384Generate(const uint8_t* data, |
599 FX_DWORD size, | 599 uint32_t size, |
600 uint8_t digest[64]) { | 600 uint8_t digest[64]) { |
601 sha384_context context; | 601 sha384_context context; |
602 CRYPT_SHA384Start(&context); | 602 CRYPT_SHA384Start(&context); |
603 CRYPT_SHA384Update(&context, data, size); | 603 CRYPT_SHA384Update(&context, data, size); |
604 CRYPT_SHA384Finish(&context, digest); | 604 CRYPT_SHA384Finish(&context, digest); |
605 } | 605 } |
606 void CRYPT_SHA512Start(void* context) { | 606 void CRYPT_SHA512Start(void* context) { |
607 if (!context) { | 607 if (!context) { |
608 return; | 608 return; |
609 } | 609 } |
610 sha384_context* ctx = (sha384_context*)context; | 610 sha384_context* ctx = (sha384_context*)context; |
611 FXSYS_memset(ctx, 0, sizeof(sha384_context)); | 611 FXSYS_memset(ctx, 0, sizeof(sha384_context)); |
612 ctx->state[0] = FX_ato64i("6a09e667f3bcc908"); | 612 ctx->state[0] = FX_ato64i("6a09e667f3bcc908"); |
613 ctx->state[1] = FX_ato64i("bb67ae8584caa73b"); | 613 ctx->state[1] = FX_ato64i("bb67ae8584caa73b"); |
614 ctx->state[2] = FX_ato64i("3c6ef372fe94f82b"); | 614 ctx->state[2] = FX_ato64i("3c6ef372fe94f82b"); |
615 ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1"); | 615 ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1"); |
616 ctx->state[4] = FX_ato64i("510e527fade682d1"); | 616 ctx->state[4] = FX_ato64i("510e527fade682d1"); |
617 ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f"); | 617 ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f"); |
618 ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b"); | 618 ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b"); |
619 ctx->state[7] = FX_ato64i("5be0cd19137e2179"); | 619 ctx->state[7] = FX_ato64i("5be0cd19137e2179"); |
620 } | 620 } |
621 void CRYPT_SHA512Update(void* context, const uint8_t* data, FX_DWORD size) { | 621 void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) { |
622 CRYPT_SHA384Update(context, data, size); | 622 CRYPT_SHA384Update(context, data, size); |
623 } | 623 } |
624 void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) { | 624 void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) { |
625 sha384_context* ctx = (sha384_context*)context; | 625 sha384_context* ctx = (sha384_context*)context; |
626 FX_DWORD last, padn; | 626 uint32_t last, padn; |
627 uint8_t msglen[16]; | 627 uint8_t msglen[16]; |
628 FXSYS_memset(msglen, 0, 16); | 628 FXSYS_memset(msglen, 0, 16); |
629 uint64_t high, low; | 629 uint64_t high, low; |
630 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); | 630 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); |
631 low = (ctx->total[0] << 3); | 631 low = (ctx->total[0] << 3); |
632 PUT_FX_64DWORD(high, msglen, 0); | 632 PUT_FX_64DWORD(high, msglen, 0); |
633 PUT_FX_64DWORD(low, msglen, 8); | 633 PUT_FX_64DWORD(low, msglen, 8); |
634 last = (FX_DWORD)ctx->total[0] & 0x7F; | 634 last = (uint32_t)ctx->total[0] & 0x7F; |
635 padn = (last < 112) ? (112 - last) : (240 - last); | 635 padn = (last < 112) ? (112 - last) : (240 - last); |
636 CRYPT_SHA512Update(ctx, sha384_padding, padn); | 636 CRYPT_SHA512Update(ctx, sha384_padding, padn); |
637 CRYPT_SHA512Update(ctx, msglen, 16); | 637 CRYPT_SHA512Update(ctx, msglen, 16); |
638 PUT_FX_64DWORD(ctx->state[0], digest, 0); | 638 PUT_FX_64DWORD(ctx->state[0], digest, 0); |
639 PUT_FX_64DWORD(ctx->state[1], digest, 8); | 639 PUT_FX_64DWORD(ctx->state[1], digest, 8); |
640 PUT_FX_64DWORD(ctx->state[2], digest, 16); | 640 PUT_FX_64DWORD(ctx->state[2], digest, 16); |
641 PUT_FX_64DWORD(ctx->state[3], digest, 24); | 641 PUT_FX_64DWORD(ctx->state[3], digest, 24); |
642 PUT_FX_64DWORD(ctx->state[4], digest, 32); | 642 PUT_FX_64DWORD(ctx->state[4], digest, 32); |
643 PUT_FX_64DWORD(ctx->state[5], digest, 40); | 643 PUT_FX_64DWORD(ctx->state[5], digest, 40); |
644 PUT_FX_64DWORD(ctx->state[6], digest, 48); | 644 PUT_FX_64DWORD(ctx->state[6], digest, 48); |
645 PUT_FX_64DWORD(ctx->state[7], digest, 56); | 645 PUT_FX_64DWORD(ctx->state[7], digest, 56); |
646 } | 646 } |
647 void CRYPT_SHA512Generate(const uint8_t* data, | 647 void CRYPT_SHA512Generate(const uint8_t* data, |
648 FX_DWORD size, | 648 uint32_t size, |
649 uint8_t digest[64]) { | 649 uint8_t digest[64]) { |
650 sha384_context context; | 650 sha384_context context; |
651 CRYPT_SHA512Start(&context); | 651 CRYPT_SHA512Start(&context); |
652 CRYPT_SHA512Update(&context, data, size); | 652 CRYPT_SHA512Update(&context, data, size); |
653 CRYPT_SHA512Finish(&context, digest); | 653 CRYPT_SHA512Finish(&context, digest); |
654 } | 654 } |
655 #ifdef __cplusplus | 655 #ifdef __cplusplus |
656 }; | 656 }; |
657 #endif | 657 #endif |
OLD | NEW |