1
2 #include <stddef.h>
3 #include <stdint.h>
4 #include <string.h>
5
6 #include "crypto_auth_hmacsha512.h"
7 #include "crypto_auth_hmacsha512256.h"
8 #include "crypto_hash_sha512.h"
9 #include "crypto_verify_32.h"
10 #include "randombytes.h"
11 #include "utils.h"
12
13 size_t
crypto_auth_hmacsha512256_bytes(void)14 crypto_auth_hmacsha512256_bytes(void)
15 {
16 return crypto_auth_hmacsha512256_BYTES;
17 }
18
19 size_t
crypto_auth_hmacsha512256_keybytes(void)20 crypto_auth_hmacsha512256_keybytes(void)
21 {
22 return crypto_auth_hmacsha512256_KEYBYTES;
23 }
24
25 size_t
crypto_auth_hmacsha512256_statebytes(void)26 crypto_auth_hmacsha512256_statebytes(void)
27 {
28 return sizeof(crypto_auth_hmacsha512256_state);
29 }
30
31 void
crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES])32 crypto_auth_hmacsha512256_keygen(
33 unsigned char k[crypto_auth_hmacsha512256_KEYBYTES])
34 {
35 randombytes_buf(k, crypto_auth_hmacsha512256_KEYBYTES);
36 }
37
38 int
crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state * state,const unsigned char * key,size_t keylen)39 crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state,
40 const unsigned char *key, size_t keylen)
41 {
42 return crypto_auth_hmacsha512_init((crypto_auth_hmacsha512_state *) state,
43 key, keylen);
44 }
45
46 int
crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state * state,const unsigned char * in,unsigned long long inlen)47 crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state,
48 const unsigned char *in,
49 unsigned long long inlen)
50 {
51 return crypto_auth_hmacsha512_update((crypto_auth_hmacsha512_state *) state,
52 in, inlen);
53 }
54
55 int
crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state * state,unsigned char * out)56 crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state,
57 unsigned char *out)
58 {
59 unsigned char out0[64];
60
61 crypto_auth_hmacsha512_final((crypto_auth_hmacsha512_state *) state, out0);
62 memcpy(out, out0, 32);
63
64 return 0;
65 }
66
67 int
crypto_auth_hmacsha512256(unsigned char * out,const unsigned char * in,unsigned long long inlen,const unsigned char * k)68 crypto_auth_hmacsha512256(unsigned char *out, const unsigned char *in,
69 unsigned long long inlen, const unsigned char *k)
70 {
71 crypto_auth_hmacsha512256_state state;
72
73 crypto_auth_hmacsha512256_init(&state, k,
74 crypto_auth_hmacsha512256_KEYBYTES);
75 crypto_auth_hmacsha512256_update(&state, in, inlen);
76 crypto_auth_hmacsha512256_final(&state, out);
77
78 return 0;
79 }
80
81 int
crypto_auth_hmacsha512256_verify(const unsigned char * h,const unsigned char * in,unsigned long long inlen,const unsigned char * k)82 crypto_auth_hmacsha512256_verify(const unsigned char *h,
83 const unsigned char *in,
84 unsigned long long inlen,
85 const unsigned char *k)
86 {
87 unsigned char correct[32];
88
89 crypto_auth_hmacsha512256(correct, in, inlen, k);
90
91 return crypto_verify_32(h, correct) | (-(h == correct)) |
92 sodium_memcmp(correct, h, 32);
93 }
94