| 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 |