1
mirror of https://github.com/jedisct1/libsodium.git synced 2024-12-19 10:05:05 -07:00
This commit is contained in:
Frank Denis 2023-01-05 14:06:26 +01:00
parent f842b157e0
commit 337fba6c23
3 changed files with 62 additions and 9 deletions

View File

@ -1,7 +1,7 @@
/*
* ISC License
*
* Copyright (c) 2013-2022
* Copyright (c) 2013-2023
* Frank Denis <j at pureftpd dot org>
*
* Permission to use, copy, modify, and/or distribute this software for any

View File

@ -7,20 +7,42 @@
#include "randombytes.h"
#include "utils.h"
int
crypto_kdf_hkdf_sha256_extract_init(crypto_kdf_hkdf_sha256_state *state,
const unsigned char *salt, size_t salt_len)
{
return crypto_auth_hmacsha256_init(&state->st, salt, salt_len);
}
int
crypto_kdf_hkdf_sha256_extract_update(crypto_kdf_hkdf_sha256_state *state,
const unsigned char *ikm, size_t ikm_len)
{
return crypto_auth_hmacsha256_update(&state->st, ikm, ikm_len);
}
int
crypto_kdf_hkdf_sha256_extract_final(crypto_kdf_hkdf_sha256_state *state,
unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES])
{
crypto_auth_hmacsha256_final(&state->st, prk);
sodium_memzero(state, sizeof state);
return 0;
}
int
crypto_kdf_hkdf_sha256_extract(
unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES],
const unsigned char *salt, size_t salt_len, const unsigned char *ikm,
size_t ikm_len)
{
crypto_auth_hmacsha256_state st;
crypto_kdf_hkdf_sha256_state state;
crypto_auth_hmacsha256_init(&st, salt, salt_len);
crypto_auth_hmacsha256_update(&st, ikm, ikm_len);
crypto_auth_hmacsha256_final(&st, prk);
sodium_memzero(&st, sizeof st);
crypto_kdf_hkdf_sha256_extract_init(&state, salt, salt_len);
crypto_kdf_hkdf_sha256_extract_update(&state, ikm, ikm_len);
return 0;
return crypto_kdf_hkdf_sha256_extract_final(&state, prk);
}
void
@ -94,3 +116,8 @@ crypto_kdf_hkdf_sha256_bytes_max(void)
{
return crypto_kdf_hkdf_sha256_BYTES_MAX;
}
size_t crypto_kdf_hkdf_sha256_statebytes(void)
{
return sizeof(crypto_kdf_hkdf_sha256_state);
}

View File

@ -31,7 +31,8 @@ size_t crypto_kdf_hkdf_sha256_bytes_max(void);
SODIUM_EXPORT
int crypto_kdf_hkdf_sha256_extract(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES],
const unsigned char *salt, size_t salt_len,
const unsigned char *ikm, size_t ikm_len);
const unsigned char *ikm, size_t ikm_len)
__attribute__ ((nonnull(4)));
SODIUM_EXPORT
void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]);
@ -39,7 +40,32 @@ void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYB
SODIUM_EXPORT
int crypto_kdf_hkdf_sha256_expand(unsigned char *out, size_t out_len,
const char *ctx, size_t ctx_len,
const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]);
const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES])
__attribute__ ((nonnull(1)));
/* ------------------------------------------------------------------------- */
typedef struct crypto_kdf_hkdf_sha256_state {
crypto_auth_hmacsha256_state st;
} crypto_kdf_hkdf_sha256_state;
SODIUM_EXPORT
size_t crypto_kdf_hkdf_sha256_statebytes(void);
SODIUM_EXPORT
int crypto_kdf_hkdf_sha256_extract_init(crypto_kdf_hkdf_sha256_state *state,
const unsigned char *salt, size_t salt_len)
__attribute__ ((nonnull(1)));
SODIUM_EXPORT
int crypto_kdf_hkdf_sha256_extract_update(crypto_kdf_hkdf_sha256_state *state,
const unsigned char *ikm, size_t ikm_len)
__attribute__ ((nonnull));
SODIUM_EXPORT
int crypto_kdf_hkdf_sha256_extract_final(crypto_kdf_hkdf_sha256_state *state,
unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES])
__attribute__ ((nonnull));
#ifdef __cplusplus
}