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/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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |