diff options
author | jsing <> | 2023-04-14 10:45:15 +0000 |
---|---|---|
committer | jsing <> | 2023-04-14 10:45:15 +0000 |
commit | 3e308f6a6cd5c9ecce0f92a26ab43e5f3caa6a0c (patch) | |
tree | 0c2cc5494f42b9056f080802ba999645a01d7e0e | |
parent | 38e781696b993f5328727fb10c9758dbf229fa61 (diff) | |
download | openbsd-3e308f6a6cd5c9ecce0f92a26ab43e5f3caa6a0c.tar.gz openbsd-3e308f6a6cd5c9ecce0f92a26ab43e5f3caa6a0c.tar.bz2 openbsd-3e308f6a6cd5c9ecce0f92a26ab43e5f3caa6a0c.zip |
Add support for truncated SHA512 variants.
This adds support for SHA512/224 and SHA512/256, as specified in FIPS
FIPS 180-4. These are truncated versions of the SHA512 hash.
ok tb@
-rw-r--r-- | src/lib/libcrypto/sha/sha512.c | 81 | ||||
-rw-r--r-- | src/lib/libcrypto/sha/sha_internal.h | 36 |
2 files changed, 115 insertions, 2 deletions
diff --git a/src/lib/libcrypto/sha/sha512.c b/src/lib/libcrypto/sha/sha512.c index a702d7d23b..4a4194350b 100644 --- a/src/lib/libcrypto/sha/sha512.c +++ b/src/lib/libcrypto/sha/sha512.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sha512.c,v 1.33 2023/04/14 10:41:34 jsing Exp $ */ | 1 | /* $OpenBSD: sha512.c,v 1.34 2023/04/14 10:45:15 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -62,6 +62,7 @@ | |||
62 | #include <openssl/sha.h> | 62 | #include <openssl/sha.h> |
63 | 63 | ||
64 | #include "crypto_internal.h" | 64 | #include "crypto_internal.h" |
65 | #include "sha_internal.h" | ||
65 | 66 | ||
66 | #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512) | 67 | #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512) |
67 | 68 | ||
@@ -547,6 +548,19 @@ SHA512_Final(unsigned char *md, SHA512_CTX *c) | |||
547 | 548 | ||
548 | /* Let compiler decide if it's appropriate to unroll... */ | 549 | /* Let compiler decide if it's appropriate to unroll... */ |
549 | switch (c->md_len) { | 550 | switch (c->md_len) { |
551 | case SHA512_224_DIGEST_LENGTH: | ||
552 | for (n = 0; n < SHA512_224_DIGEST_LENGTH/8; n++) { | ||
553 | crypto_store_htobe64(md, c->h[n]); | ||
554 | md += 8; | ||
555 | } | ||
556 | crypto_store_htobe32(md, c->h[n] >> 32); | ||
557 | break; | ||
558 | case SHA512_256_DIGEST_LENGTH: | ||
559 | for (n = 0; n < SHA512_256_DIGEST_LENGTH/8; n++) { | ||
560 | crypto_store_htobe64(md, c->h[n]); | ||
561 | md += 8; | ||
562 | } | ||
563 | break; | ||
550 | case SHA384_DIGEST_LENGTH: | 564 | case SHA384_DIGEST_LENGTH: |
551 | for (n = 0; n < SHA384_DIGEST_LENGTH/8; n++) { | 565 | for (n = 0; n < SHA384_DIGEST_LENGTH/8; n++) { |
552 | crypto_store_htobe64(md, c->h[n]); | 566 | crypto_store_htobe64(md, c->h[n]); |
@@ -559,7 +573,6 @@ SHA512_Final(unsigned char *md, SHA512_CTX *c) | |||
559 | md += 8; | 573 | md += 8; |
560 | } | 574 | } |
561 | break; | 575 | break; |
562 | /* ... as well as make sure md_len is not abused. */ | ||
563 | default: | 576 | default: |
564 | return 0; | 577 | return 0; |
565 | } | 578 | } |
@@ -585,4 +598,68 @@ SHA512(const unsigned char *d, size_t n, unsigned char *md) | |||
585 | return (md); | 598 | return (md); |
586 | } | 599 | } |
587 | 600 | ||
601 | int | ||
602 | SHA512_224_Init(SHA512_CTX *c) | ||
603 | { | ||
604 | memset(c, 0, sizeof(*c)); | ||
605 | |||
606 | /* FIPS 180-4 section 5.3.6.1. */ | ||
607 | c->h[0] = U64(0x8c3d37c819544da2); | ||
608 | c->h[1] = U64(0x73e1996689dcd4d6); | ||
609 | c->h[2] = U64(0x1dfab7ae32ff9c82); | ||
610 | c->h[3] = U64(0x679dd514582f9fcf); | ||
611 | c->h[4] = U64(0x0f6d2b697bd44da8); | ||
612 | c->h[5] = U64(0x77e36f7304c48942); | ||
613 | c->h[6] = U64(0x3f9d85a86a1d36c8); | ||
614 | c->h[7] = U64(0x1112e6ad91d692a1); | ||
615 | |||
616 | c->md_len = SHA512_224_DIGEST_LENGTH; | ||
617 | |||
618 | return 1; | ||
619 | } | ||
620 | |||
621 | int | ||
622 | SHA512_224_Update(SHA512_CTX *c, const void *data, size_t len) | ||
623 | { | ||
624 | return SHA512_Update(c, data, len); | ||
625 | } | ||
626 | |||
627 | int | ||
628 | SHA512_224_Final(unsigned char *md, SHA512_CTX *c) | ||
629 | { | ||
630 | return SHA512_Final(md, c); | ||
631 | } | ||
632 | |||
633 | int | ||
634 | SHA512_256_Init(SHA512_CTX *c) | ||
635 | { | ||
636 | memset(c, 0, sizeof(*c)); | ||
637 | |||
638 | /* FIPS 180-4 section 5.3.6.2. */ | ||
639 | c->h[0] = U64(0x22312194fc2bf72c); | ||
640 | c->h[1] = U64(0x9f555fa3c84c64c2); | ||
641 | c->h[2] = U64(0x2393b86b6f53b151); | ||
642 | c->h[3] = U64(0x963877195940eabd); | ||
643 | c->h[4] = U64(0x96283ee2a88effe3); | ||
644 | c->h[5] = U64(0xbe5e1e2553863992); | ||
645 | c->h[6] = U64(0x2b0199fc2c85b8aa); | ||
646 | c->h[7] = U64(0x0eb72ddc81c52ca2); | ||
647 | |||
648 | c->md_len = SHA512_256_DIGEST_LENGTH; | ||
649 | |||
650 | return 1; | ||
651 | } | ||
652 | |||
653 | int | ||
654 | SHA512_256_Update(SHA512_CTX *c, const void *data, size_t len) | ||
655 | { | ||
656 | return SHA512_Update(c, data, len); | ||
657 | } | ||
658 | |||
659 | int | ||
660 | SHA512_256_Final(unsigned char *md, SHA512_CTX *c) | ||
661 | { | ||
662 | return SHA512_Final(md, c); | ||
663 | } | ||
664 | |||
588 | #endif /* !OPENSSL_NO_SHA512 */ | 665 | #endif /* !OPENSSL_NO_SHA512 */ |
diff --git a/src/lib/libcrypto/sha/sha_internal.h b/src/lib/libcrypto/sha/sha_internal.h new file mode 100644 index 0000000000..c479993185 --- /dev/null +++ b/src/lib/libcrypto/sha/sha_internal.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* $OpenBSD: sha_internal.h,v 1.1 2023/04/14 10:45:15 jsing Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <openssl/sha.h> | ||
19 | |||
20 | #ifndef HEADER_SHA_INTERNAL_H | ||
21 | #define HEADER_SHA_INTERNAL_H | ||
22 | |||
23 | #define SHA512_224_DIGEST_LENGTH 28 | ||
24 | #define SHA512_256_DIGEST_LENGTH 32 | ||
25 | |||
26 | int SHA512_224_Init(SHA512_CTX *c); | ||
27 | int SHA512_224_Update(SHA512_CTX *c, const void *data, size_t len) | ||
28 | __attribute__ ((__bounded__(__buffer__,2,3))); | ||
29 | int SHA512_224_Final(unsigned char *md, SHA512_CTX *c); | ||
30 | |||
31 | int SHA512_256_Init(SHA512_CTX *c); | ||
32 | int SHA512_256_Update(SHA512_CTX *c, const void *data, size_t len) | ||
33 | __attribute__ ((__bounded__(__buffer__,2,3))); | ||
34 | int SHA512_256_Final(unsigned char *md, SHA512_CTX *c); | ||
35 | |||
36 | #endif | ||