1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3 /**
4 @param sha384.c
5 LTC_SHA384 hash included in sha512.c, Tom St Denis
6 */
7
8 #include "tomcrypt_private.h"
9
10 #if defined(LTC_SHA384) && defined(LTC_SHA512)
11
12 const struct ltc_hash_descriptor sha384_desc =
13 {
14 "sha384",
15 4,
16 48,
17 128,
18
19 /* OID */
20 { 2, 16, 840, 1, 101, 3, 4, 2, 2, },
21 9,
22
23 &sha384_init,
24 &sha512_process,
25 &sha384_done,
26 &sha384_test,
27 NULL
28 };
29
30 /**
31 Initialize the hash state
32 @param md The hash state you wish to initialize
33 @return CRYPT_OK if successful
34 */
sha384_init(hash_state * md)35 int sha384_init(hash_state * md)
36 {
37 LTC_ARGCHK(md != NULL);
38
39 md->sha512.curlen = 0;
40 md->sha512.length = 0;
41 md->sha512.state[0] = CONST64(0xcbbb9d5dc1059ed8);
42 md->sha512.state[1] = CONST64(0x629a292a367cd507);
43 md->sha512.state[2] = CONST64(0x9159015a3070dd17);
44 md->sha512.state[3] = CONST64(0x152fecd8f70e5939);
45 md->sha512.state[4] = CONST64(0x67332667ffc00b31);
46 md->sha512.state[5] = CONST64(0x8eb44a8768581511);
47 md->sha512.state[6] = CONST64(0xdb0c2e0d64f98fa7);
48 md->sha512.state[7] = CONST64(0x47b5481dbefa4fa4);
49 return CRYPT_OK;
50 }
51
52 /**
53 Terminate the hash to get the digest
54 @param md The hash state
55 @param out [out] The destination of the hash (48 bytes)
56 @return CRYPT_OK if successful
57 */
sha384_done(hash_state * md,unsigned char * out)58 int sha384_done(hash_state * md, unsigned char *out)
59 {
60 unsigned char buf[64];
61
62 LTC_ARGCHK(md != NULL);
63 LTC_ARGCHK(out != NULL);
64
65 if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
66 return CRYPT_INVALID_ARG;
67 }
68
69 sha512_done(md, buf);
70 XMEMCPY(out, buf, 48);
71 #ifdef LTC_CLEAN_STACK
72 zeromem(buf, sizeof(buf));
73 #endif
74 return CRYPT_OK;
75 }
76
77 /**
78 Self-test the hash
79 @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
80 */
sha384_test(void)81 int sha384_test(void)
82 {
83 #ifndef LTC_TEST
84 return CRYPT_NOP;
85 #else
86 static const struct {
87 const char *msg;
88 unsigned char hash[48];
89 } tests[] = {
90 { "abc",
91 { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
92 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
93 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
94 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
95 0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
96 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
97 },
98 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
99 { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
100 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
101 0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
102 0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
103 0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
104 0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39 }
105 },
106 };
107
108 int i;
109 unsigned char tmp[48];
110 hash_state md;
111
112 for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
113 sha384_init(&md);
114 sha384_process(&md, (unsigned char*)tests[i].msg, (unsigned long)XSTRLEN(tests[i].msg));
115 sha384_done(&md, tmp);
116 if (compare_testvector(tmp, sizeof(tmp), tests[i].hash, sizeof(tests[i].hash), "SHA384", i)) {
117 return CRYPT_FAIL_TESTVECTOR;
118 }
119 }
120 return CRYPT_OK;
121 #endif
122 }
123
124 #endif /* defined(LTC_SHA384) && defined(LTC_SHA512) */
125