]> pd.if.org Git - zpackage/blob - libtomcrypt/src/hashes/sha2/sha384.c
ocb mode fixup
[zpackage] / libtomcrypt / src / hashes / sha2 / sha384.c
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 /* ref:         $Format:%D$ */
133 /* git commit:  $Format:%H$ */
134 /* commit time: $Format:%ai$ */