1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
6 * The library is free for all purposes without any express
11 LTC_SHA384 hash included in sha512.c, Tom St Denis
16 #if defined(LTC_SHA384) && defined(LTC_SHA512)
18 const struct ltc_hash_descriptor sha384_desc =
26 { 2, 16, 840, 1, 101, 3, 4, 2, 2, },
37 Initialize the hash state
38 @param md The hash state you wish to initialize
39 @return CRYPT_OK if successful
41 int sha384_init(hash_state * md)
43 LTC_ARGCHK(md != NULL);
45 md->sha512.curlen = 0;
46 md->sha512.length = 0;
47 md->sha512.state[0] = CONST64(0xcbbb9d5dc1059ed8);
48 md->sha512.state[1] = CONST64(0x629a292a367cd507);
49 md->sha512.state[2] = CONST64(0x9159015a3070dd17);
50 md->sha512.state[3] = CONST64(0x152fecd8f70e5939);
51 md->sha512.state[4] = CONST64(0x67332667ffc00b31);
52 md->sha512.state[5] = CONST64(0x8eb44a8768581511);
53 md->sha512.state[6] = CONST64(0xdb0c2e0d64f98fa7);
54 md->sha512.state[7] = CONST64(0x47b5481dbefa4fa4);
59 Terminate the hash to get the digest
60 @param md The hash state
61 @param out [out] The destination of the hash (48 bytes)
62 @return CRYPT_OK if successful
64 int sha384_done(hash_state * md, unsigned char *out)
66 unsigned char buf[64];
68 LTC_ARGCHK(md != NULL);
69 LTC_ARGCHK(out != NULL);
71 if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
72 return CRYPT_INVALID_ARG;
76 XMEMCPY(out, buf, 48);
77 #ifdef LTC_CLEAN_STACK
78 zeromem(buf, sizeof(buf));
85 @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
94 unsigned char hash[48];
97 { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
98 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
99 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
100 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
101 0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
102 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
104 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
105 { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
106 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
107 0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
108 0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
109 0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
110 0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39 }
115 unsigned char tmp[48];
118 for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
120 sha384_process(&md, (unsigned char*)tests[i].msg, (unsigned long)strlen(tests[i].msg));
121 sha384_done(&md, tmp);
122 if (compare_testvector(tmp, sizeof(tmp), tests[i].hash, sizeof(tests[i].hash), "SHA384", i)) {
123 return CRYPT_FAIL_TESTVECTOR;
130 #endif /* defined(LTC_SHA384) && defined(LTC_SHA512) */
132 /* ref: $Format:%D$ */
133 /* git commit: $Format:%H$ */
134 /* commit time: $Format:%ai$ */