Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* SHA-256 and SHA-512 implementation based on code by Oliver Gay | 1 /* SHA-256 and SHA-512 implementation based on code by Oliver Gay |
| 2 * <olivier.gay@a3.epfl.ch> under a BSD-style license. See below. | 2 * <olivier.gay@a3.epfl.ch> under a BSD-style license. See below. |
| 3 */ | 3 */ |
| 4 | 4 |
| 5 /* | 5 /* |
| 6 * FIPS 180-2 SHA-224/256/384/512 implementation | 6 * FIPS 180-2 SHA-224/256/384/512 implementation |
| 7 * Last update: 02/02/2007 | 7 * Last update: 02/02/2007 |
| 8 * Issue date: 04/30/2005 | 8 * Issue date: 04/30/2005 |
| 9 * | 9 * |
| 10 * Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch> | 10 * Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch> |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 | 332 |
| 333 | 333 |
| 334 | 334 |
| 335 void SHA256_update(SHA256_CTX* ctx, const uint8_t* data, uint64_t len) { | 335 void SHA256_update(SHA256_CTX* ctx, const uint8_t* data, uint64_t len) { |
| 336 unsigned int block_nb; | 336 unsigned int block_nb; |
| 337 unsigned int new_len, rem_len, tmp_len; | 337 unsigned int new_len, rem_len, tmp_len; |
| 338 const uint8_t *shifted_data; | 338 const uint8_t *shifted_data; |
| 339 | 339 |
| 340 if (len > UINT32_MAX) | |
| 341 return; | |
| 342 | |
| 340 tmp_len = SHA256_BLOCK_SIZE - ctx->len; | 343 tmp_len = SHA256_BLOCK_SIZE - ctx->len; |
| 341 rem_len = len < tmp_len ? (unsigned int)len : tmp_len; | 344 rem_len = len < tmp_len ? (unsigned int)len : tmp_len; |
| 342 | 345 |
| 343 Memcpy(&ctx->block[ctx->len], data, rem_len); | 346 Memcpy(&ctx->block[ctx->len], data, rem_len); |
| 344 | 347 |
| 345 if (ctx->len + len < SHA256_BLOCK_SIZE) { | 348 if (ctx->len + len < SHA256_BLOCK_SIZE) { |
| 346 ctx->len += (uint32_t)len; | 349 ctx->len += (uint32_t)len; |
| 347 return; | 350 return; |
| 348 } | 351 } |
| 349 | 352 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 518 } | 521 } |
| 519 } | 522 } |
| 520 | 523 |
| 521 | 524 |
| 522 void SHA512_update(SHA512_CTX* ctx, const uint8_t* data, | 525 void SHA512_update(SHA512_CTX* ctx, const uint8_t* data, |
| 523 uint64_t len) { | 526 uint64_t len) { |
| 524 unsigned int block_nb; | 527 unsigned int block_nb; |
| 525 unsigned int new_len, rem_len, tmp_len; | 528 unsigned int new_len, rem_len, tmp_len; |
| 526 const uint8_t* shifted_data; | 529 const uint8_t* shifted_data; |
| 527 | 530 |
| 531 if (len > UINT32_MAX) | |
| 532 return; | |
| 533 | |
| 528 tmp_len = SHA512_BLOCK_SIZE - ctx->len; | 534 tmp_len = SHA512_BLOCK_SIZE - ctx->len; |
| 529 rem_len = len < tmp_len ? (unsigned int)len : tmp_len; | 535 rem_len = len < tmp_len ? (unsigned int)len : tmp_len; |
| 530 | 536 |
| 531 Memcpy(&ctx->block[ctx->len], data, rem_len); | 537 Memcpy(&ctx->block[ctx->len], data, rem_len); |
| 532 | 538 |
| 533 if (ctx->len + len < SHA512_BLOCK_SIZE) { | 539 if (ctx->len + len < SHA512_BLOCK_SIZE) { |
| 534 ctx->len += (uint32_t)len; | 540 ctx->len += (uint32_t)len; |
| 535 return; | 541 return; |
| 536 } | 542 } |
| 537 | 543 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 593 } | 599 } |
| 594 | 600 |
| 595 | 601 |
| 596 | 602 |
| 597 /* Convenient functions. */ | 603 /* Convenient functions. */ |
| 598 uint8_t* SHA256(const uint8_t* data, uint64_t len, uint8_t* digest) { | 604 uint8_t* SHA256(const uint8_t* data, uint64_t len, uint8_t* digest) { |
| 599 const uint8_t* p; | 605 const uint8_t* p; |
| 600 int i; | 606 int i; |
| 601 SHA256_CTX ctx; | 607 SHA256_CTX ctx; |
| 602 SHA256_init(&ctx); | 608 SHA256_init(&ctx); |
| 603 SHA256_update(&ctx, data, len); | 609 SHA256_update(&ctx, data, len); |
|
Randall Spangler
2011/03/26 02:02:46
Is SHA256_update() used anywhere else? If not, we
gauravsh
2011/03/26 23:21:41
Well, I figured that we will pretty much never try
| |
| 604 p = SHA256_final(&ctx); | 610 p = SHA256_final(&ctx); |
| 605 for (i = 0; i < SHA256_DIGEST_SIZE; ++i) { | 611 for (i = 0; i < SHA256_DIGEST_SIZE; ++i) { |
| 606 digest[i] = *p++; | 612 digest[i] = *p++; |
| 607 } | 613 } |
| 608 return digest; | 614 return digest; |
| 609 } | 615 } |
| 610 | 616 |
| 611 | 617 |
| 612 uint8_t* SHA512(const uint8_t* data, uint64_t len, uint8_t* digest) { | 618 uint8_t* SHA512(const uint8_t* data, uint64_t len, uint8_t* digest) { |
| 613 const uint8_t* p; | 619 const uint8_t* p; |
| 614 int i; | 620 int i; |
| 615 SHA512_CTX ctx; | 621 SHA512_CTX ctx; |
| 616 SHA512_init(&ctx); | 622 SHA512_init(&ctx); |
| 617 SHA512_update(&ctx, data, len); | 623 SHA512_update(&ctx, data, len); |
| 618 p = SHA512_final(&ctx); | 624 p = SHA512_final(&ctx); |
| 619 for (i = 0; i < SHA512_DIGEST_SIZE; ++i) { | 625 for (i = 0; i < SHA512_DIGEST_SIZE; ++i) { |
| 620 digest[i] = *p++; | 626 digest[i] = *p++; |
| 621 } | 627 } |
| 622 return digest; | 628 return digest; |
| 623 } | 629 } |
| OLD | NEW |