From 337fba6c23e1a45e6438cc89cec7908a808d677f Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Thu, 5 Jan 2023 14:06:26 +0100 Subject: [PATCH] 2023 --- LICENSE | 2 +- .../crypto_kdf/hkdf/kdf_hkdf_sha256.c | 39 ++++++++++++++++--- .../include/sodium/crypto_kdf_hkdf_sha256.h | 30 +++++++++++++- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/LICENSE b/LICENSE index 324bde66..17397208 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ /* * ISC License * - * Copyright (c) 2013-2022 + * Copyright (c) 2013-2023 * Frank Denis * * Permission to use, copy, modify, and/or distribute this software for any diff --git a/src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha256.c b/src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha256.c index c8238640..8eb7c878 100644 --- a/src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha256.c +++ b/src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha256.c @@ -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); +} diff --git a/src/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h b/src/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h index 899a6316..e7e7f4db 100644 --- a/src/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h +++ b/src/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h @@ -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 }