summaryrefslogtreecommitdiffstats
path: root/crypto/siphash
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2018-03-05 16:17:24 +0000
committerMatt Caswell <matt@openssl.org>2018-03-15 12:47:27 +0000
commit5539c5d63445e722b96bfe2798c0733a8e690b3c (patch)
tree765cb59091b84882b54c51dcefe27e6efde9c16d /crypto/siphash
parente32b52a27e20a45f51f489e4efc04d1ca72b9609 (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')
-rw-r--r--crypto/siphash/siphash_ameth.c36
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,
};