diff options
author | Matt Caswell <matt@openssl.org> | 2018-03-05 17:22:24 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2018-03-15 13:47:27 +0100 |
commit | 2621c8479e468d29419640c2bd900786612b4ade (patch) | |
tree | a8398b6257ac71699a1dd9266f6ce443b79db779 /crypto/poly1305/poly1305_ameth.c | |
parent | Add support for setting raw private SIPHASH keys (diff) | |
download | openssl-2621c8479e468d29419640c2bd900786612b4ade.tar.xz openssl-2621c8479e468d29419640c2bd900786612b4ade.zip |
Add support for setting raw private Poly1305 keys
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5520)
Diffstat (limited to 'crypto/poly1305/poly1305_ameth.c')
-rw-r--r-- | crypto/poly1305/poly1305_ameth.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/crypto/poly1305/poly1305_ameth.c b/crypto/poly1305/poly1305_ameth.c index 93c6bc0c33..3fbb24d5af 100644 --- a/crypto/poly1305/poly1305_ameth.c +++ b/crypto/poly1305/poly1305_ameth.c @@ -13,6 +13,7 @@ #include "internal/asn1_int.h" #include "internal/poly1305.h" #include "poly1305_local.h" +#include "internal/evp_int.h" /* * POLY1305 "ASN1" method. This is just here to indicate the maximum @@ -45,6 +46,27 @@ static int poly1305_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 poly1305_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv, + size_t len) +{ + ASN1_OCTET_STRING *os; + + if (pkey->pkey.ptr != NULL || len != POLY1305_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 poly1305_asn1_meth = { EVP_PKEY_POLY1305, EVP_PKEY_POLY1305, @@ -63,5 +85,17 @@ const EVP_PKEY_ASN1_METHOD poly1305_asn1_meth = { poly1305_key_free, poly1305_pkey_ctrl, - 0, 0 + NULL, + NULL, + + NULL, + NULL, + NULL, + + NULL, + NULL, + NULL, + + poly1305_set_priv_key, + NULL, }; |