summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/asn1/ameth_lib.c16
-rw-r--r--src/lib/libcrypto/asn1/asn1_locl.h4
-rw-r--r--src/lib/libcrypto/dh/dh_ameth.c32
-rw-r--r--src/lib/libcrypto/ec/ec_ameth.c26
-rw-r--r--src/lib/libcrypto/evp/evp.h12
-rw-r--r--src/lib/libcrypto/evp/evp_locl.h4
-rw-r--r--src/lib/libcrypto/evp/pmeth_gn.c44
-rw-r--r--src/lib/libcrypto/evp/pmeth_lib.c16
8 files changed, 146 insertions, 8 deletions
diff --git a/src/lib/libcrypto/asn1/ameth_lib.c b/src/lib/libcrypto/asn1/ameth_lib.c
index 96669bbd2f..8ff5a35d78 100644
--- a/src/lib/libcrypto/asn1/ameth_lib.c
+++ b/src/lib/libcrypto/asn1/ameth_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ameth_lib.c,v 1.24 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: ameth_lib.c,v 1.25 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -436,3 +436,17 @@ EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth,
436{ 436{
437 ameth->pkey_check = pkey_check; 437 ameth->pkey_check = pkey_check;
438} 438}
439
440void
441EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth,
442 int (*pkey_public_check)(const EVP_PKEY *pk))
443{
444 ameth->pkey_public_check = pkey_public_check;
445}
446
447void
448EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth,
449 int (*pkey_param_check)(const EVP_PKEY *pk))
450{
451 ameth->pkey_param_check = pkey_param_check;
452}
diff --git a/src/lib/libcrypto/asn1/asn1_locl.h b/src/lib/libcrypto/asn1/asn1_locl.h
index 31fcbef20d..76b165e77f 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.16 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: asn1_locl.h,v 1.17 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -125,6 +125,8 @@ struct evp_pkey_asn1_method_st {
125 X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig); 125 X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig);
126 126
127 int (*pkey_check)(const EVP_PKEY *pk); 127 int (*pkey_check)(const EVP_PKEY *pk);
128 int (*pkey_public_check)(const EVP_PKEY *pk);
129 int (*pkey_param_check)(const EVP_PKEY *pk);
128} /* EVP_PKEY_ASN1_METHOD */; 130} /* EVP_PKEY_ASN1_METHOD */;
129 131
130/* Method to handle CRL access. 132/* Method to handle CRL access.
diff --git a/src/lib/libcrypto/dh/dh_ameth.c b/src/lib/libcrypto/dh/dh_ameth.c
index bbb687da8b..eaca890a50 100644
--- a/src/lib/libcrypto/dh/dh_ameth.c
+++ b/src/lib/libcrypto/dh/dh_ameth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dh_ameth.c,v 1.21 2022/01/10 00:09:06 tb Exp $ */ 1/* $OpenBSD: dh_ameth.c,v 1.22 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -466,6 +466,32 @@ DHparams_print(BIO *bp, const DH *x)
466 return do_dh_print(bp, x, 4, NULL, 0); 466 return do_dh_print(bp, x, 4, NULL, 0);
467} 467}
468 468
469static int
470dh_pkey_public_check(const EVP_PKEY *pkey)
471{
472 DH *dh = pkey->pkey.dh;
473
474 if (dh->pub_key == NULL) {
475 DHerror(DH_R_MISSING_PUBKEY);
476 return 0;
477 }
478
479 return DH_check_pub_key_ex(dh, dh->pub_key);
480}
481
482static int
483dh_pkey_param_check(const EVP_PKEY *pkey)
484{
485 DH *dh = pkey->pkey.dh;
486
487 /*
488 * It would have made more sense to support EVP_PKEY_check() for DH
489 * keys and call DH_check_ex() there and keeping this as a wrapper
490 * for DH_param_check_ex(). We follow OpenSSL's choice.
491 */
492 return DH_check_ex(dh);
493}
494
469const EVP_PKEY_ASN1_METHOD dh_asn1_meth = { 495const EVP_PKEY_ASN1_METHOD dh_asn1_meth = {
470 .pkey_id = EVP_PKEY_DH, 496 .pkey_id = EVP_PKEY_DH,
471 .pkey_base_id = EVP_PKEY_DH, 497 .pkey_base_id = EVP_PKEY_DH,
@@ -493,4 +519,8 @@ const EVP_PKEY_ASN1_METHOD dh_asn1_meth = {
493 .param_print = dh_param_print, 519 .param_print = dh_param_print,
494 520
495 .pkey_free = int_dh_free, 521 .pkey_free = int_dh_free,
522
523 .pkey_check = NULL,
524 .pkey_public_check = dh_pkey_public_check,
525 .pkey_param_check = dh_pkey_param_check,
496}; 526};
diff --git a/src/lib/libcrypto/ec/ec_ameth.c b/src/lib/libcrypto/ec/ec_ameth.c
index 8316683f8f..86f509b736 100644
--- a/src/lib/libcrypto/ec/ec_ameth.c
+++ b/src/lib/libcrypto/ec/ec_ameth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_ameth.c,v 1.30 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: ec_ameth.c,v 1.31 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -634,6 +634,28 @@ ec_pkey_check(const EVP_PKEY *pkey)
634 return EC_KEY_check_key(eckey); 634 return EC_KEY_check_key(eckey);
635} 635}
636 636
637static int
638ec_pkey_public_check(const EVP_PKEY *pkey)
639{
640 EC_KEY *eckey = pkey->pkey.ec;
641
642 /* This also checks the private key, but oh, well... */
643 return EC_KEY_check_key(eckey);
644}
645
646static int
647ec_pkey_param_check(const EVP_PKEY *pkey)
648{
649 EC_KEY *eckey = pkey->pkey.ec;
650
651 if (eckey->group == NULL) {
652 ECerror(EC_R_MISSING_PARAMETERS);
653 return 0;
654 }
655
656 return EC_GROUP_check(eckey->group, NULL);
657}
658
637#ifndef OPENSSL_NO_CMS 659#ifndef OPENSSL_NO_CMS
638 660
639static int 661static int
@@ -998,4 +1020,6 @@ const EVP_PKEY_ASN1_METHOD eckey_asn1_meth = {
998 .old_priv_encode = old_ec_priv_encode, 1020 .old_priv_encode = old_ec_priv_encode,
999 1021
1000 .pkey_check = ec_pkey_check, 1022 .pkey_check = ec_pkey_check,
1023 .pkey_public_check = ec_pkey_public_check,
1024 .pkey_param_check = ec_pkey_param_check,
1001}; 1025};
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h
index e122a6b329..a3a55caf88 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.93 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: evp.h,v 1.94 2022/01/10 12:10:26 tb 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 *
@@ -1090,6 +1090,10 @@ void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth,
1090#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API) 1090#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API)
1091void EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth, 1091void EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth,
1092 int (*pkey_check)(const EVP_PKEY *pk)); 1092 int (*pkey_check)(const EVP_PKEY *pk));
1093void EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth,
1094 int (*pkey_public_check)(const EVP_PKEY *pk));
1095void EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth,
1096 int (*pkey_check)(const EVP_PKEY *pk));
1093#endif 1097#endif
1094 1098
1095#define EVP_PKEY_OP_UNDEFINED 0 1099#define EVP_PKEY_OP_UNDEFINED 0
@@ -1220,6 +1224,8 @@ int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx);
1220int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); 1224int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);
1221#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API) 1225#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API)
1222int EVP_PKEY_check(EVP_PKEY_CTX *ctx); 1226int EVP_PKEY_check(EVP_PKEY_CTX *ctx);
1227int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx);
1228int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx);
1223#endif 1229#endif
1224 1230
1225void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); 1231void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb);
@@ -1290,6 +1296,10 @@ void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
1290#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API) 1296#if defined(LIBRESSL_CRYPTO_INTERNAL) || defined(LIBRESSL_NEXT_API)
1291void EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth, 1297void EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth,
1292 int (*check)(EVP_PKEY *pkey)); 1298 int (*check)(EVP_PKEY *pkey));
1299void EVP_PKEY_meth_set_public_check(EVP_PKEY_METHOD *pmeth,
1300 int (*public_check)(EVP_PKEY *pkey));
1301void EVP_PKEY_meth_set_param_check(EVP_PKEY_METHOD *pmeth,
1302 int (*param_check)(EVP_PKEY *pkey));
1293#endif 1303#endif
1294 1304
1295/* Authenticated Encryption with Additional Data. 1305/* Authenticated Encryption with Additional Data.
diff --git a/src/lib/libcrypto/evp/evp_locl.h b/src/lib/libcrypto/evp/evp_locl.h
index 3ff8e8ad99..44e2d5cadb 100644
--- a/src/lib/libcrypto/evp/evp_locl.h
+++ b/src/lib/libcrypto/evp/evp_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: evp_locl.h,v 1.19 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: evp_locl.h,v 1.20 2022/01/10 12:10:26 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 2000. 3 * project 2000.
4 */ 4 */
@@ -349,6 +349,8 @@ struct evp_pkey_method_st {
349 int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value); 349 int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value);
350 350
351 int (*check)(EVP_PKEY *pkey); 351 int (*check)(EVP_PKEY *pkey);
352 int (*public_check)(EVP_PKEY *pkey);
353 int (*param_check)(EVP_PKEY *pkey);
352} /* EVP_PKEY_METHOD */; 354} /* EVP_PKEY_METHOD */;
353 355
354void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx); 356void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx);
diff --git a/src/lib/libcrypto/evp/pmeth_gn.c b/src/lib/libcrypto/evp/pmeth_gn.c
index a8a4cc97db..7d921d23b4 100644
--- a/src/lib/libcrypto/evp/pmeth_gn.c
+++ b/src/lib/libcrypto/evp/pmeth_gn.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pmeth_gn.c,v 1.9 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: pmeth_gn.c,v 1.10 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -244,3 +244,45 @@ EVP_PKEY_check(EVP_PKEY_CTX *ctx)
244 244
245 return pkey->ameth->pkey_check(pkey); 245 return pkey->ameth->pkey_check(pkey);
246} 246}
247
248int
249EVP_PKEY_public_check(EVP_PKEY_CTX *ctx)
250{
251 EVP_PKEY *pkey;
252
253 if ((pkey = ctx->pkey) == NULL) {
254 EVPerror(EVP_R_NO_KEY_SET);
255 return 0;
256 }
257
258 if (ctx->pmeth->public_check != NULL)
259 return ctx->pmeth->public_check(pkey);
260
261 if (pkey->ameth == NULL || pkey->ameth->pkey_public_check == NULL) {
262 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
263 return -2;
264 }
265
266 return pkey->ameth->pkey_public_check(pkey);
267}
268
269int
270EVP_PKEY_param_check(EVP_PKEY_CTX *ctx)
271{
272 EVP_PKEY *pkey;
273
274 if ((pkey = ctx->pkey) == NULL) {
275 EVPerror(EVP_R_NO_KEY_SET);
276 return 0;
277 }
278
279 if (ctx->pmeth->param_check != NULL)
280 return ctx->pmeth->param_check(pkey);
281
282 if (pkey->ameth == NULL || pkey->ameth->pkey_param_check == NULL) {
283 EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
284 return -2;
285 }
286
287 return pkey->ameth->pkey_param_check(pkey);
288}
diff --git a/src/lib/libcrypto/evp/pmeth_lib.c b/src/lib/libcrypto/evp/pmeth_lib.c
index 92328dd246..d265e2aced 100644
--- a/src/lib/libcrypto/evp/pmeth_lib.c
+++ b/src/lib/libcrypto/evp/pmeth_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pmeth_lib.c,v 1.19 2022/01/10 11:52:43 tb Exp $ */ 1/* $OpenBSD: pmeth_lib.c,v 1.20 2022/01/10 12:10:26 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 2006. 3 * project 2006.
4 */ 4 */
@@ -588,3 +588,17 @@ EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth, int (*check)(EVP_PKEY *pkey))
588{ 588{
589 pmeth->check = check; 589 pmeth->check = check;
590} 590}
591
592void
593EVP_PKEY_meth_set_public_check(EVP_PKEY_METHOD *pmeth,
594 int (*public_check)(EVP_PKEY *pkey))
595{
596 pmeth->public_check = public_check;
597}
598
599void
600EVP_PKEY_meth_set_param_check(EVP_PKEY_METHOD *pmeth,
601 int (*param_check)(EVP_PKEY *pkey))
602{
603 pmeth->param_check = param_check;
604}