Home | History | Annotate | Line # | Download | only in hmacsha512256
      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
     14 crypto_auth_hmacsha512256_bytes(void)
     15 {
     16     return crypto_auth_hmacsha512256_BYTES;
     17 }
     18 
     19 size_t
     20 crypto_auth_hmacsha512256_keybytes(void)
     21 {
     22     return crypto_auth_hmacsha512256_KEYBYTES;
     23 }
     24 
     25 size_t
     26 crypto_auth_hmacsha512256_statebytes(void)
     27 {
     28     return sizeof(crypto_auth_hmacsha512256_state);
     29 }
     30 
     31 void
     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
     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
     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
     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
     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
     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