diff options
author | Matt Caswell <matt@openssl.org> | 2018-03-05 16:17:24 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2018-03-15 12:47:27 +0000 |
commit | 5539c5d63445e722b96bfe2798c0733a8e690b3c (patch) | |
tree | 765cb59091b84882b54c51dcefe27e6efde9c16d /crypto/siphash/siphash_ameth.c | |
parent | e32b52a27e20a45f51f489e4efc04d1ca72b9609 (diff) |
Add support for setting raw private SIPHASH keys
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5520)
Diffstat (limited to 'crypto/siphash/siphash_ameth.c')
-rw-r--r-- | crypto/siphash/siphash_ameth.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/crypto/siphash/siphash_ameth.c b/crypto/siphash/siphash_ameth.c index d819461f8d..078eb543af 100644 --- a/crypto/siphash/siphash_ameth.c +++ b/crypto/siphash/siphash_ameth.c @@ -13,6 +13,7 @@ #include "internal/asn1_int.h" #include "internal/siphash.h" #include "siphash_local.h" +#include "internal/evp_int.h" /* * 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)); } +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 = { EVP_PKEY_SIPHASH, EVP_PKEY_SIPHASH, @@ -64,5 +86,17 @@ const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = { siphash_key_free, siphash_pkey_ctrl, - 0, 0 + NULL, + NULL, + + NULL, + NULL, + NULL, + + NULL, + NULL, + NULL, + + siphash_set_priv_key, + NULL, }; |