Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/tomcrypt/src/hashes/sha2/sha384.c
5972 views
1
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2
*
3
* LibTomCrypt is a library that provides various cryptographic
4
* algorithms in a highly modular and flexible manner.
5
*
6
* The library is free for all purposes without any express
7
* guarantee it works.
8
*/
9
/**
10
@param sha384.c
11
LTC_SHA384 hash included in sha512.c, Tom St Denis
12
*/
13
14
#include "tomcrypt.h"
15
16
#if defined(LTC_SHA384) && defined(LTC_SHA512)
17
18
const struct ltc_hash_descriptor sha384_desc =
19
{
20
"sha384",
21
4,
22
48,
23
128,
24
25
/* OID */
26
{ 2, 16, 840, 1, 101, 3, 4, 2, 2, },
27
9,
28
29
&sha384_init,
30
&sha512_process,
31
&sha384_done,
32
&sha384_test,
33
NULL
34
};
35
36
/**
37
Initialize the hash state
38
@param md The hash state you wish to initialize
39
@return CRYPT_OK if successful
40
*/
41
int sha384_init(hash_state * md)
42
{
43
LTC_ARGCHK(md != NULL);
44
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);
55
return CRYPT_OK;
56
}
57
58
/**
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
63
*/
64
int sha384_done(hash_state * md, unsigned char *out)
65
{
66
unsigned char buf[64];
67
68
LTC_ARGCHK(md != NULL);
69
LTC_ARGCHK(out != NULL);
70
71
if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
72
return CRYPT_INVALID_ARG;
73
}
74
75
sha512_done(md, buf);
76
XMEMCPY(out, buf, 48);
77
#ifdef LTC_CLEAN_STACK
78
zeromem(buf, sizeof(buf));
79
#endif
80
return CRYPT_OK;
81
}
82
83
/**
84
Self-test the hash
85
@return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
86
*/
87
int sha384_test(void)
88
{
89
#ifndef LTC_TEST
90
return CRYPT_NOP;
91
#else
92
static const struct {
93
const char *msg;
94
unsigned char hash[48];
95
} tests[] = {
96
{ "abc",
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 }
103
},
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 }
111
},
112
};
113
114
int i;
115
unsigned char tmp[48];
116
hash_state md;
117
118
for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
119
sha384_init(&md);
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;
124
}
125
}
126
return CRYPT_OK;
127
#endif
128
}
129
130
#endif /* defined(LTC_SHA384) && defined(LTC_SHA512) */
131
132