aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid Benjamin <davidben@google.com>2024-03-17 15:40:03 +1000
committerBoringssl LUCI CQ <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-03-21 03:34:31 +0000
commite57ab142c0cabf30b6d4e85b8038003cc179716b (patch)
treecbccf40f6f618455bfef822f3ba150cb278fca97 /include
parent021ec339112553e3211cdeea98d29fd659d455ef (diff)
downloadboringssl-e57ab142c0cabf30b6d4e85b8038003cc179716b.zip
boringssl-e57ab142c0cabf30b6d4e85b8038003cc179716b.tar.gz
boringssl-e57ab142c0cabf30b6d4e85b8038003cc179716b.tar.bz2
Add some barebones support for DH in EVP
OpenSSH needs this. Features that have been intentionally omitted for now: - X9.42-style Diffie-Hellman ("DHX"). We continue not to support this. Use ECDH or X25519 instead. - SPKI and PKCS#8 serialization. Use ECDH or X25519 instead. The format is a bit ill-defined. Moreover, until we solve the serialization aspects of https://crbug.com/boringssl/497, adding them would put this legacy algorithm on path for every caller. - Most of the random options like stapling a KDF, etc. Though I did add EVP_PKEY_CTX_set_dh_pad because it's the only way to undo OpenSSL's bug where they chop off leading zeros by default. - Parameter generation. Diffie-Hellman parameters should not be generated at runtime. This means you need to bootstrap with a DH object and then wrap it in an EVP_PKEY. This matches the limitations of the EVP API in OpenSSL 1.1.x. Unfortunately the OpenSSL 3.x APIs are unsuitable for many, many reasons, so I expect when we get further along in https://crbug.com/boringssl/535, we'll have established some patterns here that we can apply to EVP_PKEY_DH too. Change-Id: I34b4e8799afb266ea5602a70115cc2146f19c6a7 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/67207 Reviewed-by: Theo Buehler <theorbuehler@gmail.com> Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Bob Beck <bbe@google.com>
Diffstat (limited to 'include')
-rw-r--r--include/openssl/evp.h32
-rw-r--r--include/openssl/evp_errors.h1
2 files changed, 23 insertions, 10 deletions
diff --git a/include/openssl/evp.h b/include/openssl/evp.h
index 93b2eb3..43180f2 100644
--- a/include/openssl/evp.h
+++ b/include/openssl/evp.h
@@ -167,6 +167,11 @@ OPENSSL_EXPORT int EVP_PKEY_assign_EC_KEY(EVP_PKEY *pkey, EC_KEY *key);
OPENSSL_EXPORT EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey);
OPENSSL_EXPORT EC_KEY *EVP_PKEY_get1_EC_KEY(const EVP_PKEY *pkey);
+OPENSSL_EXPORT int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key);
+OPENSSL_EXPORT int EVP_PKEY_assign_DH(EVP_PKEY *pkey, DH *key);
+OPENSSL_EXPORT DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey);
+OPENSSL_EXPORT DH *EVP_PKEY_get1_DH(const EVP_PKEY *pkey);
+
#define EVP_PKEY_NONE NID_undef
#define EVP_PKEY_RSA NID_rsaEncryption
#define EVP_PKEY_RSA_PSS NID_rsassaPss
@@ -175,6 +180,7 @@ OPENSSL_EXPORT EC_KEY *EVP_PKEY_get1_EC_KEY(const EVP_PKEY *pkey);
#define EVP_PKEY_ED25519 NID_ED25519
#define EVP_PKEY_X25519 NID_X25519
#define EVP_PKEY_HKDF NID_hkdf
+#define EVP_PKEY_DH NID_dhKeyAgreement
// EVP_PKEY_set_type sets the type of |pkey| to |type|. It returns one if
// successful or zero if the |type| argument is not one of the |EVP_PKEY_*|
@@ -810,11 +816,23 @@ OPENSSL_EXPORT int EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx,
int nid);
-// Deprecated functions.
+// Diffie-Hellman-specific control functions.
-// EVP_PKEY_DH is defined for compatibility, but it is impossible to create an
-// |EVP_PKEY| of that type.
-#define EVP_PKEY_DH NID_dhKeyAgreement
+// EVP_PKEY_CTX_set_dh_pad configures configures whether |ctx|, which must be an
+// |EVP_PKEY_derive| operation, configures the handling of leading zeros in the
+// Diffie-Hellman shared secret. If |pad| is zero, leading zeros are removed
+// from the secret. If |pad| is non-zero, the fixed-width shared secret is used
+// unmodified, as in PKCS #3. If this function is not called, the default is to
+// remove leading zeros.
+//
+// WARNING: The behavior when |pad| is zero leaks information about the shared
+// secret. This may result in side channel attacks such as
+// https://raccoon-attack.com/, particularly when the same private key is used
+// for multiple operations.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad);
+
+
+// Deprecated functions.
// EVP_PKEY_RSA2 was historically an alternate form for RSA public keys (OID
// 2.5.8.1.1), but is no longer accepted.
@@ -913,12 +931,6 @@ OPENSSL_EXPORT EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **out, const uint8_t **inp,
OPENSSL_EXPORT EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **out,
const uint8_t **inp, long len);
-// EVP_PKEY_get0_DH returns NULL.
-OPENSSL_EXPORT DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey);
-
-// EVP_PKEY_get1_DH returns NULL.
-OPENSSL_EXPORT DH *EVP_PKEY_get1_DH(const EVP_PKEY *pkey);
-
// EVP_PKEY_CTX_set_ec_param_enc returns one if |encoding| is
// |OPENSSL_EC_NAMED_CURVE| or zero with an error otherwise.
OPENSSL_EXPORT int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx,
diff --git a/include/openssl/evp_errors.h b/include/openssl/evp_errors.h
index 8583f52..163f17e 100644
--- a/include/openssl/evp_errors.h
+++ b/include/openssl/evp_errors.h
@@ -95,5 +95,6 @@
#define EVP_R_NOT_XOF_OR_INVALID_LENGTH 135
#define EVP_R_EMPTY_PSK 136
#define EVP_R_INVALID_BUFFER_SIZE 137
+#define EVP_R_EXPECTING_A_DH_KEY 138
#endif // OPENSSL_HEADER_EVP_ERRORS_H