comparison src/hashes/sha2/sha384.c @ 191:1c15b283127b libtomcrypt-orig

Import of libtomcrypt 1.02 with manual path rename rearrangement etc
author Matt Johnston <matt@ucc.asn.au>
date Fri, 06 May 2005 13:23:02 +0000
parents
children 39d5d58461d6
comparison
equal deleted inserted replaced
143:5d99163f7e32 191:1c15b283127b
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 * Tom St Denis, [email protected], http://libtomcrypt.org
10 */
11 /**
12 @param sha384.c
13 SHA384 hash included in sha512.c, Tom St Denis
14 */
15
16 const struct ltc_hash_descriptor sha384_desc =
17 {
18 "sha384",
19 4,
20 48,
21 128,
22
23 /* DER identifier */
24 { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
25 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
26 0x00, 0x04, 0x30 },
27 19,
28
29 &sha384_init,
30 &sha512_process,
31 &sha384_done,
32 &sha384_test
33 };
34
35 /**
36 Initialize the hash state
37 @param md The hash state you wish to initialize
38 @return CRYPT_OK if successful
39 */
40 int sha384_init(hash_state * md)
41 {
42 LTC_ARGCHK(md != NULL);
43
44 md->sha512.curlen = 0;
45 md->sha512.length = 0;
46 md->sha512.state[0] = CONST64(0xcbbb9d5dc1059ed8);
47 md->sha512.state[1] = CONST64(0x629a292a367cd507);
48 md->sha512.state[2] = CONST64(0x9159015a3070dd17);
49 md->sha512.state[3] = CONST64(0x152fecd8f70e5939);
50 md->sha512.state[4] = CONST64(0x67332667ffc00b31);
51 md->sha512.state[5] = CONST64(0x8eb44a8768581511);
52 md->sha512.state[6] = CONST64(0xdb0c2e0d64f98fa7);
53 md->sha512.state[7] = CONST64(0x47b5481dbefa4fa4);
54 return CRYPT_OK;
55 }
56
57 /**
58 Terminate the hash to get the digest
59 @param md The hash state
60 @param out [out] The destination of the hash (48 bytes)
61 @return CRYPT_OK if successful
62 */
63 int sha384_done(hash_state * md, unsigned char *out)
64 {
65 unsigned char buf[64];
66
67 LTC_ARGCHK(md != NULL);
68 LTC_ARGCHK(out != NULL);
69
70 if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
71 return CRYPT_INVALID_ARG;
72 }
73
74 sha512_done(md, buf);
75 XMEMCPY(out, buf, 48);
76 #ifdef LTC_CLEAN_STACK
77 zeromem(buf, sizeof(buf));
78 #endif
79 return CRYPT_OK;
80 }
81
82 /**
83 Self-test the hash
84 @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
85 */
86 int sha384_test(void)
87 {
88 #ifndef LTC_TEST
89 return CRYPT_NOP;
90 #else
91 static const struct {
92 char *msg;
93 unsigned char hash[48];
94 } tests[] = {
95 { "abc",
96 { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
97 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
98 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
99 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
100 0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
101 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
102 },
103 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
104 { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
105 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
106 0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
107 0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
108 0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
109 0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39 }
110 },
111 };
112
113 int i;
114 unsigned char tmp[48];
115 hash_state md;
116
117 for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
118 sha384_init(&md);
119 sha384_process(&md, (unsigned char*)tests[i].msg, (unsigned long)strlen(tests[i].msg));
120 sha384_done(&md, tmp);
121 if (memcmp(tmp, tests[i].hash, 48) != 0) {
122 return CRYPT_FAIL_TESTVECTOR;
123 }
124 }
125 return CRYPT_OK;
126 #endif
127 }
128
129
130
131
132