blob: 49fc1e70519b0e0f67fd9fe20b3bfeb4bf9b378b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/* See LICENSE file for copyright and license details. */
#include "common.h"
/**
* Make a copy of an HMAC hashing-state
*
* @param dest The slot for the duplicate, must not be initialised (memory leak otherwise)
* @param src The state to duplicate
* @return Zero on success, -1 on error
*/
int
libkeccak_hmac_copy(libkeccak_hmac_state_t *restrict dest, const libkeccak_hmac_state_t *restrict src)
{
size_t size;
dest->key_opad = NULL;
dest->key_ipad = NULL;
if (libkeccak_state_copy(&dest->sponge, &src->sponge) < 0)
return -1;
dest->key_length = src->key_length;
dest->leftover = src->leftover;
size = (src->key_length + 7) >> 3;
dest->key_opad = malloc(2 * size);
if (dest->key_opad == NULL) {
libkeccak_state_destroy(&dest->sponge);
return -1;
}
dest->key_ipad = dest->key_opad + size / sizeof(char);
memcpy(dest->key_opad, src->key_opad, size);
memcpy(dest->key_ipad, src->key_ipad, size);
return 0;
}
|