Don't include every field in every EVP_PKEY_ALG
We can just subclass things. (Really we should make EVP_PKEY_ALG a C++
interface and implement virtual methods, but I'd like to namespace our
types internally first.)
Change-Id: Ia2165581ca7a98d447dc8a53261edea4714f700f
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/81987
Reviewed-by: Lily Chen <chlily@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Lily Chen <chlily@google.com>
diff --git a/crypto/evp/internal.h b/crypto/evp/internal.h
index b4a25d9..3cf0f9d 100644
--- a/crypto/evp/internal.h
+++ b/crypto/evp/internal.h
@@ -34,10 +34,6 @@
struct evp_pkey_alg_st {
// method implements operations for this |EVP_PKEY_ALG|.
const EVP_PKEY_ASN1_METHOD *method;
-
- // ec_group returns the |EC_GROUP| for this algorithm, if |method| is for
- // |EVP_PKEY_EC|.
- const EC_GROUP *(*ec_group)();
};
enum evp_decode_result_t {
diff --git a/crypto/evp/p_dsa_asn1.cc b/crypto/evp/p_dsa_asn1.cc
index 04c21fe..49797b9 100644
--- a/crypto/evp/p_dsa_asn1.cc
+++ b/crypto/evp/p_dsa_asn1.cc
@@ -235,10 +235,7 @@
};
const EVP_PKEY_ALG *EVP_pkey_dsa(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&dsa_asn1_meth,
- /*ec_group=*/nullptr,
- };
+ static const EVP_PKEY_ALG kAlg = {&dsa_asn1_meth};
return &kAlg;
}
diff --git a/crypto/evp/p_ec_asn1.cc b/crypto/evp/p_ec_asn1.cc
index c5a24fa..debc6c5 100644
--- a/crypto/evp/p_ec_asn1.cc
+++ b/crypto/evp/p_ec_asn1.cc
@@ -27,6 +27,13 @@
#include "internal.h"
+namespace {
+
+struct EVP_PKEY_ALG_EC : public EVP_PKEY_ALG {
+ // ec_group returns the |EC_GROUP| for this algorithm.
+ const EC_GROUP *(*ec_group)();
+};
+
static int eckey_pub_encode(CBB *out, const EVP_PKEY *key) {
const EC_KEY *ec_key = reinterpret_cast<const EC_KEY *>(key->pkey);
const EC_GROUP *group = EC_KEY_get0_group(ec_key);
@@ -57,7 +64,7 @@
// See RFC 5480, section 2.
// Check that |params| matches |alg|. Only the namedCurve form is allowed.
- const EC_GROUP *group = alg->ec_group();
+ const EC_GROUP *group = static_cast<const EVP_PKEY_ALG_EC*>(alg)->ec_group();
if (ec_key_parse_curve_name(params, bssl::Span(&group, 1)) == nullptr) {
if (ERR_equals(ERR_peek_last_error(), ERR_LIB_EC, EC_R_UNKNOWN_GROUP)) {
ERR_clear_error();
@@ -102,7 +109,7 @@
EVP_PKEY *out, CBS *params,
CBS *key) {
// See RFC 5915.
- const EC_GROUP *group = alg->ec_group();
+ const EC_GROUP *group = static_cast<const EVP_PKEY_ALG_EC*>(alg)->ec_group();
if (ec_key_parse_parameters(params, bssl::Span(&group, 1)) == nullptr) {
if (ERR_equals(ERR_peek_last_error(), ERR_LIB_EC, EC_R_UNKNOWN_GROUP)) {
ERR_clear_error();
@@ -243,6 +250,8 @@
return EC_KEY_is_opaque(ec_key);
}
+} // namespace
+
const EVP_PKEY_ASN1_METHOD ec_asn1_meth = {
EVP_PKEY_EC,
// 1.2.840.10045.2.1
@@ -278,38 +287,25 @@
};
const EVP_PKEY_ALG *EVP_pkey_ec_p224(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&ec_asn1_meth,
- /*ec_group=*/&EC_group_p224,
- };
+ static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p224};
return &kAlg;
}
const EVP_PKEY_ALG *EVP_pkey_ec_p256(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&ec_asn1_meth,
- /*ec_group=*/&EC_group_p256,
- };
+ static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p256};
return &kAlg;
}
const EVP_PKEY_ALG *EVP_pkey_ec_p384(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&ec_asn1_meth,
- /*ec_group=*/&EC_group_p384,
- };
+ static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p384};
return &kAlg;
}
const EVP_PKEY_ALG *EVP_pkey_ec_p521(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&ec_asn1_meth,
- /*ec_group=*/&EC_group_p521,
- };
+ static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p521};
return &kAlg;
}
-
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) {
if (EVP_PKEY_assign_EC_KEY(pkey, key)) {
EC_KEY_up_ref(key);
diff --git a/crypto/evp/p_ed25519_asn1.cc b/crypto/evp/p_ed25519_asn1.cc
index cdd05ba..15b4002 100644
--- a/crypto/evp/p_ed25519_asn1.cc
+++ b/crypto/evp/p_ed25519_asn1.cc
@@ -229,9 +229,6 @@
};
const EVP_PKEY_ALG *EVP_pkey_ed25519(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&ed25519_asn1_meth,
- /*ec_group=*/nullptr,
- };
+ static const EVP_PKEY_ALG kAlg = {&ed25519_asn1_meth};
return &kAlg;
}
diff --git a/crypto/evp/p_rsa_asn1.cc b/crypto/evp/p_rsa_asn1.cc
index fe79d8e..e0a9133 100644
--- a/crypto/evp/p_rsa_asn1.cc
+++ b/crypto/evp/p_rsa_asn1.cc
@@ -307,18 +307,12 @@
const EVP_PKEY_ALG *EVP_pkey_rsa(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&rsa_asn1_meth,
- /*ec_group=*/nullptr,
- };
+ static const EVP_PKEY_ALG kAlg = {&rsa_asn1_meth};
return &kAlg;
}
const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha256(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&rsa_pss_sha256_asn1_meth,
- /*ec_group=*/nullptr,
- };
+ static const EVP_PKEY_ALG kAlg = {&rsa_pss_sha256_asn1_meth};
return &kAlg;
}
diff --git a/crypto/evp/p_x25519_asn1.cc b/crypto/evp/p_x25519_asn1.cc
index 49e65ef..05f294a 100644
--- a/crypto/evp/p_x25519_asn1.cc
+++ b/crypto/evp/p_x25519_asn1.cc
@@ -243,9 +243,6 @@
};
const EVP_PKEY_ALG *EVP_pkey_x25519(void) {
- static const EVP_PKEY_ALG kAlg = {
- /*method=*/&x25519_asn1_meth,
- /*ec_group=*/nullptr,
- };
+ static const EVP_PKEY_ALG kAlg = {&x25519_asn1_meth};
return &kAlg;
}