Add support for setting raw private SIPHASH keys

Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5520)
This commit is contained in:
Matt Caswell 2018-03-05 16:17:24 +00:00
parent e32b52a27e
commit 5539c5d634

View File

@ -13,6 +13,7 @@
#include "internal/asn1_int.h" #include "internal/asn1_int.h"
#include "internal/siphash.h" #include "internal/siphash.h"
#include "siphash_local.h" #include "siphash_local.h"
#include "internal/evp_int.h"
/* /*
* SIPHASH "ASN1" method. This is just here to indicate the maximum * SIPHASH "ASN1" method. This is just here to indicate the maximum
@ -46,6 +47,27 @@ static int siphash_pkey_public_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
return ASN1_OCTET_STRING_cmp(EVP_PKEY_get0(a), EVP_PKEY_get0(b)); return ASN1_OCTET_STRING_cmp(EVP_PKEY_get0(a), EVP_PKEY_get0(b));
} }
static int siphash_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
size_t len)
{
ASN1_OCTET_STRING *os;
if (pkey->pkey.ptr != NULL || len != SIPHASH_KEY_SIZE)
return 0;
os = ASN1_OCTET_STRING_new();
if (os == NULL)
return 0;
if (!ASN1_OCTET_STRING_set(os, priv, len)) {
ASN1_OCTET_STRING_free(os);
return 0;
}
pkey->pkey.ptr = os;
return 1;
}
const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = { const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
EVP_PKEY_SIPHASH, EVP_PKEY_SIPHASH,
EVP_PKEY_SIPHASH, EVP_PKEY_SIPHASH,
@ -64,5 +86,17 @@ const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
siphash_key_free, siphash_key_free,
siphash_pkey_ctrl, siphash_pkey_ctrl,
0, 0 NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
siphash_set_priv_key,
NULL,
}; };