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 141 matching lines...) Loading... |
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 uint32_t total[2]; | 158 uint32_t total[2]; |
159 uint32_t 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_UINT32(n, b, i) \ |
163 { \ | 163 { \ |
164 (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \ | 164 (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \ |
165 ((uint32_t)(b)[(i) + 2] << 8) | ((uint32_t)(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_UINT32(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 uint32_t temp1, temp2, W[64]; | 188 uint32_t temp1, temp2, W[64]; |
189 uint32_t 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_UINT32(W[0], data, 0); |
191 GET_FX_DWORD(W[1], data, 4); | 191 GET_UINT32(W[1], data, 4); |
192 GET_FX_DWORD(W[2], data, 8); | 192 GET_UINT32(W[2], data, 8); |
193 GET_FX_DWORD(W[3], data, 12); | 193 GET_UINT32(W[3], data, 12); |
194 GET_FX_DWORD(W[4], data, 16); | 194 GET_UINT32(W[4], data, 16); |
195 GET_FX_DWORD(W[5], data, 20); | 195 GET_UINT32(W[5], data, 20); |
196 GET_FX_DWORD(W[6], data, 24); | 196 GET_UINT32(W[6], data, 24); |
197 GET_FX_DWORD(W[7], data, 28); | 197 GET_UINT32(W[7], data, 28); |
198 GET_FX_DWORD(W[8], data, 32); | 198 GET_UINT32(W[8], data, 32); |
199 GET_FX_DWORD(W[9], data, 36); | 199 GET_UINT32(W[9], data, 36); |
200 GET_FX_DWORD(W[10], data, 40); | 200 GET_UINT32(W[10], data, 40); |
201 GET_FX_DWORD(W[11], data, 44); | 201 GET_UINT32(W[11], data, 44); |
202 GET_FX_DWORD(W[12], data, 48); | 202 GET_UINT32(W[12], data, 48); |
203 GET_FX_DWORD(W[13], data, 52); | 203 GET_UINT32(W[13], data, 52); |
204 GET_FX_DWORD(W[14], data, 56); | 204 GET_UINT32(W[14], data, 56); |
205 GET_FX_DWORD(W[15], data, 60); | 205 GET_UINT32(W[15], data, 60); |
206 #define SHR(x, n) ((x & 0xFFFFFFFF) >> n) | 206 #define SHR(x, n) ((x & 0xFFFFFFFF) >> n) |
207 #define ROTR(x, n) (SHR(x, n) | (x << (32 - n))) | 207 #define ROTR(x, n) (SHR(x, n) | (x << (32 - n))) |
208 #define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) | 208 #define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) |
209 #define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) | 209 #define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) |
210 #define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) | 210 #define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) |
211 #define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) | 211 #define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) |
212 #define F0(x, y, z) ((x & y) | (z & (x | y))) | 212 #define F0(x, y, z) ((x & y) | (z & (x | y))) |
213 #define F1(x, y, z) (z ^ (x & (y ^ z))) | 213 #define F1(x, y, z) (z ^ (x & (y ^ z))) |
214 #define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + S0(W[t - 15]) + W[t - 16]) | 214 #define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + S0(W[t - 15]) + W[t - 16]) |
215 #define P(a, b, c, d, e, f, g, h, x, K) \ | 215 #define P(a, b, c, d, e, f, g, h, x, K) \ |
(...skipping 117 matching lines...) Loading... |
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 uint32_t last, padn; | 338 uint32_t last, padn; |
339 uint32_t 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_UINT32(high, msglen, 0); |
344 PUT_FX_DWORD(low, msglen, 4); | 344 PUT_UINT32(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_UINT32(ctx->state[0], digest, 0); |
350 PUT_FX_DWORD(ctx->state[1], digest, 4); | 350 PUT_UINT32(ctx->state[1], digest, 4); |
351 PUT_FX_DWORD(ctx->state[2], digest, 8); | 351 PUT_UINT32(ctx->state[2], digest, 8); |
352 PUT_FX_DWORD(ctx->state[3], digest, 12); | 352 PUT_UINT32(ctx->state[3], digest, 12); |
353 PUT_FX_DWORD(ctx->state[4], digest, 16); | 353 PUT_UINT32(ctx->state[4], digest, 16); |
354 PUT_FX_DWORD(ctx->state[5], digest, 20); | 354 PUT_UINT32(ctx->state[5], digest, 20); |
355 PUT_FX_DWORD(ctx->state[6], digest, 24); | 355 PUT_UINT32(ctx->state[6], digest, 24); |
356 PUT_FX_DWORD(ctx->state[7], digest, 28); | 356 PUT_UINT32(ctx->state[7], digest, 28); |
357 } | 357 } |
358 void CRYPT_SHA256Generate(const uint8_t* data, | 358 void CRYPT_SHA256Generate(const uint8_t* data, |
359 uint32_t 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 { |
(...skipping 94 matching lines...) Loading... |
461 "431d67c49c100d4c", "4cc5d4becb3e42b6", "597f299cfc657e2a", | 461 "431d67c49c100d4c", "4cc5d4becb3e42b6", "597f299cfc657e2a", |
462 "5fcb6fab3ad6faec", "6c44198c4a475817", | 462 "5fcb6fab3ad6faec", "6c44198c4a475817", |
463 }; | 463 }; |
464 #define GET_FX_64WORD(n, b, i) \ | 464 #define GET_FX_64WORD(n, b, i) \ |
465 { \ | 465 { \ |
466 (n) = ((uint64_t)(b)[(i)] << 56) | ((uint64_t)(b)[(i) + 1] << 48) | \ | 466 (n) = ((uint64_t)(b)[(i)] << 56) | ((uint64_t)(b)[(i) + 1] << 48) | \ |
467 ((uint64_t)(b)[(i) + 2] << 40) | ((uint64_t)(b)[(i) + 3] << 32) | \ | 467 ((uint64_t)(b)[(i) + 2] << 40) | ((uint64_t)(b)[(i) + 3] << 32) | \ |
468 ((uint64_t)(b)[(i) + 4] << 24) | ((uint64_t)(b)[(i) + 5] << 16) | \ | 468 ((uint64_t)(b)[(i) + 4] << 24) | ((uint64_t)(b)[(i) + 5] << 16) | \ |
469 ((uint64_t)(b)[(i) + 6] << 8) | ((uint64_t)(b)[(i) + 7]); \ | 469 ((uint64_t)(b)[(i) + 6] << 8) | ((uint64_t)(b)[(i) + 7]); \ |
470 } | 470 } |
471 #define PUT_FX_64DWORD(n, b, i) \ | 471 #define PUT_UINT64(n, b, i) \ |
472 { \ | 472 { \ |
473 (b)[(i)] = (uint8_t)((n) >> 56); \ | 473 (b)[(i)] = (uint8_t)((n) >> 56); \ |
474 (b)[(i) + 1] = (uint8_t)((n) >> 48); \ | 474 (b)[(i) + 1] = (uint8_t)((n) >> 48); \ |
475 (b)[(i) + 2] = (uint8_t)((n) >> 40); \ | 475 (b)[(i) + 2] = (uint8_t)((n) >> 40); \ |
476 (b)[(i) + 3] = (uint8_t)((n) >> 32); \ | 476 (b)[(i) + 3] = (uint8_t)((n) >> 32); \ |
477 (b)[(i) + 4] = (uint8_t)((n) >> 24); \ | 477 (b)[(i) + 4] = (uint8_t)((n) >> 24); \ |
478 (b)[(i) + 5] = (uint8_t)((n) >> 16); \ | 478 (b)[(i) + 5] = (uint8_t)((n) >> 16); \ |
479 (b)[(i) + 6] = (uint8_t)((n) >> 8); \ | 479 (b)[(i) + 6] = (uint8_t)((n) >> 8); \ |
480 (b)[(i) + 7] = (uint8_t)((n)); \ | 480 (b)[(i) + 7] = (uint8_t)((n)); \ |
481 } | 481 } |
(...skipping 93 matching lines...) Loading... |
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 uint32_t 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_UINT64(high, msglen, 0); |
586 PUT_FX_64DWORD(low, msglen, 8); | 586 PUT_UINT64(low, msglen, 8); |
587 last = (uint32_t)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_UINT64(ctx->state[0], digest, 0); |
592 PUT_FX_64DWORD(ctx->state[1], digest, 8); | 592 PUT_UINT64(ctx->state[1], digest, 8); |
593 PUT_FX_64DWORD(ctx->state[2], digest, 16); | 593 PUT_UINT64(ctx->state[2], digest, 16); |
594 PUT_FX_64DWORD(ctx->state[3], digest, 24); | 594 PUT_UINT64(ctx->state[3], digest, 24); |
595 PUT_FX_64DWORD(ctx->state[4], digest, 32); | 595 PUT_UINT64(ctx->state[4], digest, 32); |
596 PUT_FX_64DWORD(ctx->state[5], digest, 40); | 596 PUT_UINT64(ctx->state[5], digest, 40); |
597 } | 597 } |
598 void CRYPT_SHA384Generate(const uint8_t* data, | 598 void CRYPT_SHA384Generate(const uint8_t* data, |
599 uint32_t 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) { |
(...skipping 15 matching lines...) Loading... |
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 uint32_t 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_UINT64(high, msglen, 0); |
633 PUT_FX_64DWORD(low, msglen, 8); | 633 PUT_UINT64(low, msglen, 8); |
634 last = (uint32_t)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_UINT64(ctx->state[0], digest, 0); |
639 PUT_FX_64DWORD(ctx->state[1], digest, 8); | 639 PUT_UINT64(ctx->state[1], digest, 8); |
640 PUT_FX_64DWORD(ctx->state[2], digest, 16); | 640 PUT_UINT64(ctx->state[2], digest, 16); |
641 PUT_FX_64DWORD(ctx->state[3], digest, 24); | 641 PUT_UINT64(ctx->state[3], digest, 24); |
642 PUT_FX_64DWORD(ctx->state[4], digest, 32); | 642 PUT_UINT64(ctx->state[4], digest, 32); |
643 PUT_FX_64DWORD(ctx->state[5], digest, 40); | 643 PUT_UINT64(ctx->state[5], digest, 40); |
644 PUT_FX_64DWORD(ctx->state[6], digest, 48); | 644 PUT_UINT64(ctx->state[6], digest, 48); |
645 PUT_FX_64DWORD(ctx->state[7], digest, 56); | 645 PUT_UINT64(ctx->state[7], digest, 56); |
646 } | 646 } |
647 void CRYPT_SHA512Generate(const uint8_t* data, | 647 void CRYPT_SHA512Generate(const uint8_t* data, |
648 uint32_t 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 |