diff options
Diffstat (limited to 'providers/implementations/kdfs/scrypt.c')
-rw-r--r-- | providers/implementations/kdfs/scrypt.c | 65 |
1 files changed, 48 insertions, 17 deletions
diff --git a/providers/implementations/kdfs/scrypt.c b/providers/implementations/kdfs/scrypt.c index 6fa4192600fd..e27b09eb99a4 100644 --- a/providers/implementations/kdfs/scrypt.c +++ b/providers/implementations/kdfs/scrypt.c @@ -20,11 +20,12 @@ #include "prov/implementations.h" #include "prov/provider_ctx.h" #include "prov/providercommon.h" -#include "prov/implementations.h" +#include "prov/provider_util.h" #ifndef OPENSSL_NO_SCRYPT static OSSL_FUNC_kdf_newctx_fn kdf_scrypt_new; +static OSSL_FUNC_kdf_dupctx_fn kdf_scrypt_dup; static OSSL_FUNC_kdf_freectx_fn kdf_scrypt_free; static OSSL_FUNC_kdf_reset_fn kdf_scrypt_reset; static OSSL_FUNC_kdf_derive_fn kdf_scrypt_derive; @@ -54,7 +55,7 @@ typedef struct { static void kdf_scrypt_init(KDF_SCRYPT *ctx); -static void *kdf_scrypt_new(void *provctx) +static void *kdf_scrypt_new_inner(OSSL_LIB_CTX *libctx) { KDF_SCRYPT *ctx; @@ -62,15 +63,18 @@ static void *kdf_scrypt_new(void *provctx) return NULL; ctx = OPENSSL_zalloc(sizeof(*ctx)); - if (ctx == NULL) { - ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); + if (ctx == NULL) return NULL; - } - ctx->libctx = PROV_LIBCTX_OF(provctx); + ctx->libctx = libctx; kdf_scrypt_init(ctx); return ctx; } +static void *kdf_scrypt_new(void *provctx) +{ + return kdf_scrypt_new_inner(PROV_LIBCTX_OF(provctx)); +} + static void kdf_scrypt_free(void *vctx) { KDF_SCRYPT *ctx = (KDF_SCRYPT *)vctx; @@ -94,6 +98,38 @@ static void kdf_scrypt_reset(void *vctx) kdf_scrypt_init(ctx); } +static void *kdf_scrypt_dup(void *vctx) +{ + const KDF_SCRYPT *src = (const KDF_SCRYPT *)vctx; + KDF_SCRYPT *dest; + + dest = kdf_scrypt_new_inner(src->libctx); + if (dest != NULL) { + if (src->sha256 != NULL && !EVP_MD_up_ref(src->sha256)) + goto err; + if (src->propq != NULL) { + dest->propq = OPENSSL_strdup(src->propq); + if (dest->propq == NULL) + goto err; + } + if (!ossl_prov_memdup(src->salt, src->salt_len, + &dest->salt, &dest->salt_len) + || !ossl_prov_memdup(src->pass, src->pass_len, + &dest->pass , &dest->pass_len)) + goto err; + dest->N = src->N; + dest->r = src->r; + dest->p = src->p; + dest->maxmem_bytes = src->maxmem_bytes; + dest->sha256 = src->sha256; + } + return dest; + + err: + kdf_scrypt_free(dest); + return NULL; +} + static void kdf_scrypt_init(KDF_SCRYPT *ctx) { /* Default values are the most conservative recommendation given in the @@ -114,10 +150,8 @@ static int scrypt_set_membuf(unsigned char **buffer, size_t *buflen, *buflen = 0; if (p->data_size == 0) { - if ((*buffer = OPENSSL_malloc(1)) == NULL) { - ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); + if ((*buffer = OPENSSL_malloc(1)) == NULL) return 0; - } } else if (p->data != NULL) { if (!OSSL_PARAM_get_octet_string(p, (void **)buffer, 0, buflen)) return 0; @@ -142,10 +176,8 @@ static int set_property_query(KDF_SCRYPT *ctx, const char *propq) ctx->propq = NULL; if (propq != NULL) { ctx->propq = OPENSSL_strdup(propq); - if (ctx->propq == NULL) { - ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); + if (ctx->propq == NULL) return 0; - } } return 1; } @@ -188,7 +220,7 @@ static int kdf_scrypt_set_ctx_params(void *vctx, const OSSL_PARAM params[]) KDF_SCRYPT *ctx = vctx; uint64_t u64_value; - if (params == NULL) + if (ossl_param_is_empty(params)) return 1; if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PASSWORD)) != NULL) @@ -276,6 +308,7 @@ static const OSSL_PARAM *kdf_scrypt_gettable_ctx_params(ossl_unused void *ctx, const OSSL_DISPATCH ossl_kdf_scrypt_functions[] = { { OSSL_FUNC_KDF_NEWCTX, (void(*)(void))kdf_scrypt_new }, + { OSSL_FUNC_KDF_DUPCTX, (void(*)(void))kdf_scrypt_dup }, { OSSL_FUNC_KDF_FREECTX, (void(*)(void))kdf_scrypt_free }, { OSSL_FUNC_KDF_RESET, (void(*)(void))kdf_scrypt_reset }, { OSSL_FUNC_KDF_DERIVE, (void(*)(void))kdf_scrypt_derive }, @@ -285,7 +318,7 @@ const OSSL_DISPATCH ossl_kdf_scrypt_functions[] = { { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, (void(*)(void))kdf_scrypt_gettable_ctx_params }, { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void(*)(void))kdf_scrypt_get_ctx_params }, - { 0, NULL } + OSSL_DISPATCH_END }; #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) @@ -489,10 +522,8 @@ static int scrypt_alg(const char *pass, size_t passlen, return 1; B = OPENSSL_malloc((size_t)(Blen + Vlen)); - if (B == NULL) { - ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE); + if (B == NULL) return 0; - } X = (uint32_t *)(B + Blen); T = X + 32 * r; V = T + 32 * r; |