summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2022-11-10 14:46:44 +0000
committerjsing <>2022-11-10 14:46:44 +0000
commit6623faac9f3d27790e325c99444e616c01b31c0e (patch)
treeef48aeb73c5571d76798a66112018ab93ba7bed2 /src
parent6cfcf5c709af8f66b8747a256f9649e7e1f2c614 (diff)
downloadopenbsd-6623faac9f3d27790e325c99444e616c01b31c0e.tar.gz
openbsd-6623faac9f3d27790e325c99444e616c01b31c0e.tar.bz2
openbsd-6623faac9f3d27790e325c99444e616c01b31c0e.zip
Port EVP raw key API from OpenSSL.
This will be needed to deal with Curve25519 based keys. ok beck@ tb@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/asn1/asn1_locl.h11
-rw-r--r--src/lib/libcrypto/evp/evp.h14
-rw-r--r--src/lib/libcrypto/evp/evp_err.c3
-rw-r--r--src/lib/libcrypto/evp/p_lib.c93
4 files changed, 116 insertions, 5 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_locl.h b/src/lib/libcrypto/asn1/asn1_locl.h
index e15b98b7c3..8180e9b0fc 100644
--- a/src/lib/libcrypto/asn1/asn1_locl.h
+++ b/src/lib/libcrypto/asn1/asn1_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: asn1_locl.h,v 1.40 2022/11/08 12:56:00 beck Exp $ */ 1/* $OpenBSD: asn1_locl.h,v 1.41 2022/11/10 14:46:44 jsing 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 2006. 3 * project 2006.
4 */ 4 */
@@ -142,6 +142,15 @@ struct evp_pkey_asn1_method_st {
142 int (*pkey_check)(const EVP_PKEY *pk); 142 int (*pkey_check)(const EVP_PKEY *pk);
143 int (*pkey_public_check)(const EVP_PKEY *pk); 143 int (*pkey_public_check)(const EVP_PKEY *pk);
144 int (*pkey_param_check)(const EVP_PKEY *pk); 144 int (*pkey_param_check)(const EVP_PKEY *pk);
145
146 int (*set_priv_key)(EVP_PKEY *pk, const unsigned char *private_key,
147 size_t len);
148 int (*set_pub_key)(EVP_PKEY *pk, const unsigned char *public_key,
149 size_t len);
150 int (*get_priv_key)(const EVP_PKEY *pk, unsigned char *out_private_key,
151 size_t *out_len);
152 int (*get_pub_key)(const EVP_PKEY *pk, unsigned char *out_public_key,
153 size_t *out_len);
145} /* EVP_PKEY_ASN1_METHOD */; 154} /* EVP_PKEY_ASN1_METHOD */;
146 155
147/* Method to handle CRL access. 156/* Method to handle CRL access.
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h
index ec6141e39e..31c26b4444 100644
--- a/src/lib/libcrypto/evp/evp.h
+++ b/src/lib/libcrypto/evp/evp.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: evp.h,v 1.108 2022/11/09 19:18:08 jsing Exp $ */ 1/* $OpenBSD: evp.h,v 1.109 2022/11/10 14:46:44 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -399,6 +399,17 @@ unsigned char *EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx);
399unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); 399unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx);
400#define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) 400#define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE)
401 401
402#if defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL)
403EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *engine,
404 const unsigned char *private_key, size_t len);
405EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *engine,
406 const unsigned char *public_key, size_t len);
407int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey,
408 unsigned char *out_private_key, size_t *out_len);
409int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey,
410 unsigned char *out_public_key, size_t *out_len);
411#endif
412
402#define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) 413#define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80)
403#define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) 414#define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80)
404 415
@@ -1414,6 +1425,7 @@ void ERR_load_EVP_strings(void);
1414#define EVP_R_EXPECTING_A_ECDSA_KEY 141 1425#define EVP_R_EXPECTING_A_ECDSA_KEY 141
1415#define EVP_R_EXPECTING_A_EC_KEY 142 1426#define EVP_R_EXPECTING_A_EC_KEY 142
1416#define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 1427#define EVP_R_FIPS_MODE_NOT_SUPPORTED 167
1428#define EVP_R_GET_RAW_KEY_FAILED 182
1417#define EVP_R_INITIALIZATION_ERROR 134 1429#define EVP_R_INITIALIZATION_ERROR 134
1418#define EVP_R_INPUT_NOT_INITIALIZED 111 1430#define EVP_R_INPUT_NOT_INITIALIZED 111
1419#define EVP_R_INVALID_DIGEST 152 1431#define EVP_R_INVALID_DIGEST 152
diff --git a/src/lib/libcrypto/evp/evp_err.c b/src/lib/libcrypto/evp/evp_err.c
index 4feea1aabf..109d2d4b2e 100644
--- a/src/lib/libcrypto/evp/evp_err.c
+++ b/src/lib/libcrypto/evp/evp_err.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: evp_err.c,v 1.28 2022/07/12 14:42:49 kn Exp $ */ 1/* $OpenBSD: evp_err.c,v 1.29 2022/11/10 14:46:44 jsing Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -101,6 +101,7 @@ static ERR_STRING_DATA EVP_str_reasons[] = {
101 {ERR_REASON(EVP_R_EXPECTING_A_ECDSA_KEY) , "expecting a ecdsa key"}, 101 {ERR_REASON(EVP_R_EXPECTING_A_ECDSA_KEY) , "expecting a ecdsa key"},
102 {ERR_REASON(EVP_R_EXPECTING_A_EC_KEY) , "expecting a ec key"}, 102 {ERR_REASON(EVP_R_EXPECTING_A_EC_KEY) , "expecting a ec key"},
103 {ERR_REASON(EVP_R_FIPS_MODE_NOT_SUPPORTED), "fips mode not supported"}, 103 {ERR_REASON(EVP_R_FIPS_MODE_NOT_SUPPORTED), "fips mode not supported"},
104 {ERR_REASON(EVP_R_GET_RAW_KEY_FAILED) , "get raw key failed"},
104 {ERR_REASON(EVP_R_INITIALIZATION_ERROR) , "initialization error"}, 105 {ERR_REASON(EVP_R_INITIALIZATION_ERROR) , "initialization error"},
105 {ERR_REASON(EVP_R_INPUT_NOT_INITIALIZED) , "input not initialized"}, 106 {ERR_REASON(EVP_R_INPUT_NOT_INITIALIZED) , "input not initialized"},
106 {ERR_REASON(EVP_R_INVALID_DIGEST) , "invalid digest"}, 107 {ERR_REASON(EVP_R_INVALID_DIGEST) , "invalid digest"},
diff --git a/src/lib/libcrypto/evp/p_lib.c b/src/lib/libcrypto/evp/p_lib.c
index b6cef5a14c..2e0830b96e 100644
--- a/src/lib/libcrypto/evp/p_lib.c
+++ b/src/lib/libcrypto/evp/p_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p_lib.c,v 1.29 2022/06/27 12:36:05 tb Exp $ */ 1/* $OpenBSD: p_lib.c,v 1.30 2022/11/10 14:46:44 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -279,6 +279,96 @@ EVP_PKEY_set_type(EVP_PKEY *pkey, int type)
279} 279}
280 280
281EVP_PKEY * 281EVP_PKEY *
282EVP_PKEY_new_raw_private_key(int type, ENGINE *engine,
283 const unsigned char *private_key, size_t len)
284{
285 EVP_PKEY *ret;
286
287 if ((ret = EVP_PKEY_new()) == NULL)
288 goto err;
289
290 if (!pkey_set_type(ret, engine, type, NULL, -1))
291 goto err;
292
293 if (ret->ameth->set_priv_key == NULL) {
294 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
295 goto err;
296 }
297 if (!ret->ameth->set_priv_key(ret, private_key, len)) {
298 EVPerror(EVP_R_KEY_SETUP_FAILED);
299 goto err;
300 }
301
302 return ret;
303
304 err:
305 EVP_PKEY_free(ret);
306
307 return NULL;
308}
309
310EVP_PKEY *
311EVP_PKEY_new_raw_public_key(int type, ENGINE *engine,
312 const unsigned char *public_key, size_t len)
313{
314 EVP_PKEY *ret;
315
316 if ((ret = EVP_PKEY_new()) == NULL)
317 goto err;
318
319 if (!pkey_set_type(ret, engine, type, NULL, -1))
320 goto err;
321
322 if (ret->ameth->set_pub_key == NULL) {
323 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
324 goto err;
325 }
326 if (!ret->ameth->set_pub_key(ret, public_key, len)) {
327 EVPerror(EVP_R_KEY_SETUP_FAILED);
328 goto err;
329 }
330
331 return ret;
332
333 err:
334 EVP_PKEY_free(ret);
335
336 return NULL;
337}
338
339int
340EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey,
341 unsigned char *out_private_key, size_t *out_len)
342{
343 if (pkey->ameth->get_priv_key == NULL) {
344 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
345 return 0;
346 }
347 if (!pkey->ameth->get_priv_key(pkey, out_private_key, out_len)) {
348 EVPerror(EVP_R_GET_RAW_KEY_FAILED);
349 return 0;
350 }
351
352 return 1;
353}
354
355int
356EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey,
357 unsigned char *out_public_key, size_t *out_len)
358{
359 if (pkey->ameth->get_pub_key == NULL) {
360 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
361 return 0;
362 }
363 if (!pkey->ameth->get_pub_key(pkey, out_public_key, out_len)) {
364 EVPerror(EVP_R_GET_RAW_KEY_FAILED);
365 return 0;
366 }
367
368 return 1;
369}
370
371EVP_PKEY *
282EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv, size_t len, 372EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv, size_t len,
283 const EVP_CIPHER *cipher) 373 const EVP_CIPHER *cipher)
284{ 374{
@@ -581,4 +671,3 @@ EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid)
581 return pkey->ameth->pkey_ctrl(pkey, ASN1_PKEY_CTRL_DEFAULT_MD_NID, 671 return pkey->ameth->pkey_ctrl(pkey, ASN1_PKEY_CTRL_DEFAULT_MD_NID,
582 0, pnid); 672 0, pnid);
583} 673}
584