diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/hmac/hm_ameth.c | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/src/lib/libcrypto/hmac/hm_ameth.c b/src/lib/libcrypto/hmac/hm_ameth.c index 86e42bdfab..858110a561 100644 --- a/src/lib/libcrypto/hmac/hm_ameth.c +++ b/src/lib/libcrypto/hmac/hm_ameth.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: hm_ameth.c,v 1.13 2022/11/18 14:45:10 tb Exp $ */ | 1 | /* $OpenBSD: hm_ameth.c,v 1.14 2022/11/18 15:01:04 tb Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2007. | 3 | * project 2007. |
| 4 | */ | 4 | */ |
| @@ -56,6 +56,7 @@ | |||
| 56 | * | 56 | * |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #include <limits.h> | ||
| 59 | #include <stdio.h> | 60 | #include <stdio.h> |
| 60 | #include <string.h> | 61 | #include <string.h> |
| 61 | 62 | ||
| @@ -74,6 +75,13 @@ | |||
| 74 | */ | 75 | */ |
| 75 | 76 | ||
| 76 | static int | 77 | static int |
| 78 | hmac_pkey_public_cmp(const EVP_PKEY *a, const EVP_PKEY *b) | ||
| 79 | { | ||
| 80 | /* The ameth pub_cmp must return 1 on match, 0 on mismatch. */ | ||
| 81 | return ASN1_OCTET_STRING_cmp(a->pkey.ptr, b->pkey.ptr) == 0; | ||
| 82 | } | ||
| 83 | |||
| 84 | static int | ||
| 77 | hmac_size(const EVP_PKEY *pkey) | 85 | hmac_size(const EVP_PKEY *pkey) |
| 78 | { | 86 | { |
| 79 | return EVP_MAX_MD_SIZE; | 87 | return EVP_MAX_MD_SIZE; |
| @@ -103,6 +111,51 @@ hmac_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) | |||
| 103 | } | 111 | } |
| 104 | } | 112 | } |
| 105 | 113 | ||
| 114 | static int | ||
| 115 | hmac_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv, size_t len) | ||
| 116 | { | ||
| 117 | ASN1_OCTET_STRING *os = NULL; | ||
| 118 | |||
| 119 | if (pkey->pkey.ptr != NULL) | ||
| 120 | goto err; | ||
| 121 | |||
| 122 | if (len > INT_MAX) | ||
| 123 | goto err; | ||
| 124 | |||
| 125 | if ((os = ASN1_OCTET_STRING_new()) == NULL) | ||
| 126 | goto err; | ||
| 127 | |||
| 128 | if (!ASN1_OCTET_STRING_set(os, priv, len)) | ||
| 129 | goto err; | ||
| 130 | |||
| 131 | pkey->pkey.ptr = os; | ||
| 132 | |||
| 133 | return 1; | ||
| 134 | |||
| 135 | err: | ||
| 136 | ASN1_OCTET_STRING_free(os); | ||
| 137 | |||
| 138 | return 0; | ||
| 139 | } | ||
| 140 | |||
| 141 | static int | ||
| 142 | hmac_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv, size_t *len) | ||
| 143 | { | ||
| 144 | ASN1_OCTET_STRING *os = pkey->pkey.ptr; | ||
| 145 | CBS cbs; | ||
| 146 | |||
| 147 | if (priv == NULL) { | ||
| 148 | *len = os->length; | ||
| 149 | return 1; | ||
| 150 | } | ||
| 151 | |||
| 152 | if (os == NULL) | ||
| 153 | return 0; | ||
| 154 | |||
| 155 | CBS_init(&cbs, os->data, os->length); | ||
| 156 | return CBS_write_bytes(&cbs, priv, *len, len); | ||
| 157 | } | ||
| 158 | |||
| 106 | #ifdef HMAC_TEST_PRIVATE_KEY_FORMAT | 159 | #ifdef HMAC_TEST_PRIVATE_KEY_FORMAT |
| 107 | /* A bogus private key format for test purposes. This is simply the | 160 | /* A bogus private key format for test purposes. This is simply the |
| 108 | * HMAC key with "HMAC PRIVATE KEY" in the headers. When enabled the | 161 | * HMAC key with "HMAC PRIVATE KEY" in the headers. When enabled the |
| @@ -161,12 +214,18 @@ const EVP_PKEY_ASN1_METHOD hmac_asn1_meth = { | |||
| 161 | .pem_str = "HMAC", | 214 | .pem_str = "HMAC", |
| 162 | .info = "OpenSSL HMAC method", | 215 | .info = "OpenSSL HMAC method", |
| 163 | 216 | ||
| 217 | .pub_cmp = hmac_pkey_public_cmp, | ||
| 218 | |||
| 164 | .pkey_size = hmac_size, | 219 | .pkey_size = hmac_size, |
| 165 | 220 | ||
| 166 | .pkey_free = hmac_key_free, | 221 | .pkey_free = hmac_key_free, |
| 167 | .pkey_ctrl = hmac_pkey_ctrl, | 222 | .pkey_ctrl = hmac_pkey_ctrl, |
| 223 | |||
| 168 | #ifdef HMAC_TEST_PRIVATE_KEY_FORMAT | 224 | #ifdef HMAC_TEST_PRIVATE_KEY_FORMAT |
| 169 | .old_priv_decode = old_hmac_decode, | 225 | .old_priv_decode = old_hmac_decode, |
| 170 | .old_priv_encode = old_hmac_encode | 226 | .old_priv_encode = old_hmac_encode, |
| 171 | #endif | 227 | #endif |
| 228 | |||
| 229 | .set_priv_key = hmac_set_priv_key, | ||
| 230 | .get_priv_key = hmac_get_priv_key, | ||
| 172 | }; | 231 | }; |
