summaryrefslogtreecommitdiffstats
path: root/crypto/siphash/siphash_ameth.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2018-06-01 13:22:28 +0200
committerMatt Caswell <matt@openssl.org>2018-06-08 11:04:09 +0200
commit0d124b0a51d3ad8c8807cab280ea18fc68489155 (patch)
tree0a77711f66e26da760c452c867999b024806bad6 /crypto/siphash/siphash_ameth.c
parentDo not free a session before calling the remove_session_cb (diff)
downloadopenssl-0d124b0a51d3ad8c8807cab280ea18fc68489155.tar.xz
openssl-0d124b0a51d3ad8c8807cab280ea18fc68489155.zip
Add support getting raw private/public keys
Only applies to algorithms that support it. Both raw private and public keys can be obtained for X25519, Ed25519, X448, Ed448. Raw private keys only can be obtained for HMAC, Poly1305 and SipHash Fixes #6259 Reviewed-by: Rich Salz <rsalz@openssl.org> Reviewed-by: Tim Hudson <tjh@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6394)
Diffstat (limited to 'crypto/siphash/siphash_ameth.c')
-rw-r--r--crypto/siphash/siphash_ameth.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/crypto/siphash/siphash_ameth.c b/crypto/siphash/siphash_ameth.c
index 6411501bc0..c0ab7efae4 100644
--- a/crypto/siphash/siphash_ameth.c
+++ b/crypto/siphash/siphash_ameth.c
@@ -68,6 +68,25 @@ static int siphash_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
return 1;
}
+static int siphash_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
+ size_t *len)
+{
+ ASN1_OCTET_STRING *os = (ASN1_OCTET_STRING *)pkey->pkey.ptr;
+
+ if (priv == NULL) {
+ *len = SIPHASH_KEY_SIZE;
+ return 1;
+ }
+
+ if (os == NULL || *len < SIPHASH_KEY_SIZE)
+ return 0;
+
+ memcpy(priv, ASN1_STRING_get0_data(os), ASN1_STRING_length(os));
+ *len = SIPHASH_KEY_SIZE;
+
+ return 1;
+}
+
const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
EVP_PKEY_SIPHASH,
EVP_PKEY_SIPHASH,
@@ -99,4 +118,6 @@ const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
siphash_set_priv_key,
NULL,
+ siphash_get_priv_key,
+ NULL,
};