[openssh-commits] [openssh] branch master updated: upstream: fix ML-KEM/ECDH interop problem (does not affect
git+noreply at mindrot.org
git+noreply at mindrot.org
Mon Aug 3 16:44:08 AEST 2026
This is an automated email from the git hooks/post-receive script.
djm pushed a commit to branch master
in repository openssh.
The following commit(s) were added to refs/heads/master by this push:
new 2aee73ed9 upstream: fix ML-KEM/ECDH interop problem (does not affect
2aee73ed9 is described below
commit 2aee73ed90b3b47d0dd86875989003f0982ccf22
Author: djm at openbsd.org <djm at openbsd.org>
AuthorDate: Mon Aug 3 06:43:16 2026 +0000
upstream: fix ML-KEM/ECDH interop problem (does not affect
mlkem768x25519-sha256) from markus@
OpenBSD-Commit-ID: 9c72e9c0407906bb7d5fb16648b38282676391e9
---
kex.h | 4 ++--
kexecdh.c | 31 +++++++++++++++++++++----------
kexmlkem768ecdh.c | 7 ++++---
3 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/kex.h b/kex.h
index 373325686..3ce1c3328 100644
--- a/kex.h
+++ b/kex.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.h,v 1.132 2026/07/27 12:31:09 markus Exp $ */
+/* $OpenBSD: kex.h,v 1.133 2026/08/03 06:43:16 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
@@ -236,7 +236,7 @@ int kex_dh_enc(struct kex *, const struct sshbuf *, struct sshbuf **,
int kex_dh_dec(struct kex *, const struct sshbuf *, struct sshbuf **);
int kex_ecdh_dec_key_group(struct kex *, const struct sshbuf *, EC_KEY *key,
- const EC_GROUP *, struct sshbuf **);
+ const EC_GROUP *, int, struct sshbuf **);
int kex_ecdh_keypair(struct kex *);
int kex_ecdh_enc(struct kex *, const struct sshbuf *, struct sshbuf **,
diff --git a/kexecdh.c b/kexecdh.c
index f1a0b4765..a9dbf5c4b 100644
--- a/kexecdh.c
+++ b/kexecdh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexecdh.c,v 1.13 2026/07/27 12:28:52 markus Exp $ */
+/* $OpenBSD: kexecdh.c,v 1.14 2026/08/03 06:43:16 djm Exp $ */
/*
* Copyright (c) 2010 Damien Miller. All rights reserved.
* Copyright (c) 2019 Markus Friedl. All rights reserved.
@@ -119,7 +119,7 @@ kex_ecdh_enc(struct kex *kex, const struct sshbuf *client_blob,
(r = sshbuf_get_u32(server_blob, NULL)) != 0)
goto out;
if ((r = kex_ecdh_dec_key_group(kex, client_blob, server_key, group,
- shared_secretp)) != 0)
+ 0, shared_secretp)) != 0)
goto out;
*server_blobp = server_blob;
server_blob = NULL;
@@ -131,7 +131,7 @@ kex_ecdh_enc(struct kex *kex, const struct sshbuf *client_blob,
int
kex_ecdh_dec_key_group(struct kex *kex, const struct sshbuf *ec_blob,
- EC_KEY *key, const EC_GROUP *group, struct sshbuf **shared_secretp)
+ EC_KEY *key, const EC_GROUP *group, int raw, struct sshbuf **shared_secretp)
{
struct sshbuf *buf = NULL;
BIGNUM *shared_secret = NULL;
@@ -166,21 +166,32 @@ kex_ecdh_dec_key_group(struct kex *kex, const struct sshbuf *ec_blob,
goto out;
}
klen = (EC_GROUP_get_degree(group) + 7) / 8;
- if ((kbuf = malloc(klen)) == NULL ||
- (shared_secret = BN_new()) == NULL) {
+ if ((kbuf = malloc(klen)) == NULL) {
r = SSH_ERR_ALLOC_FAIL;
goto out;
}
- if (ECDH_compute_key(kbuf, klen, dh_pub, key, NULL) != (int)klen ||
- BN_bin2bn(kbuf, klen, shared_secret) == NULL) {
+ if (ECDH_compute_key(kbuf, klen, dh_pub, key, NULL) != (int)klen) {
r = SSH_ERR_LIBCRYPTO_ERROR;
goto out;
}
#ifdef DEBUG_KEXECDH
dump_digest("shared secret", kbuf, klen);
#endif
- if ((r = sshbuf_put_bignum2(buf, shared_secret)) != 0)
- goto out;
+ if (raw) {
+ if ((r = sshbuf_put(buf, kbuf, klen)) != 0)
+ goto out;
+ } else {
+ if ((shared_secret = BN_new()) == NULL) {
+ r = SSH_ERR_ALLOC_FAIL;
+ goto out;
+ }
+ if (BN_bin2bn(kbuf, klen, shared_secret) == NULL) {
+ r = SSH_ERR_LIBCRYPTO_ERROR;
+ goto out;
+ }
+ if ((r = sshbuf_put_bignum2(buf, shared_secret)) != 0)
+ goto out;
+ }
*shared_secretp = buf;
buf = NULL;
out:
@@ -198,7 +209,7 @@ kex_ecdh_dec(struct kex *kex, const struct sshbuf *server_blob,
int r;
r = kex_ecdh_dec_key_group(kex, server_blob, kex->ec_client_key,
- kex->ec_group, shared_secretp);
+ kex->ec_group, 0, shared_secretp);
EC_KEY_free(kex->ec_client_key);
kex->ec_client_key = NULL;
return r;
diff --git a/kexmlkem768ecdh.c b/kexmlkem768ecdh.c
index 04c7a8fd2..b43b1b3cb 100644
--- a/kexmlkem768ecdh.c
+++ b/kexmlkem768ecdh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexmlkem768ecdh.c,v 1.3 2026/07/30 07:30:41 dtucker Exp $ */
+/* $OpenBSD: kexmlkem768ecdh.c,v 1.4 2026/08/03 06:43:16 djm Exp $ */
/*
* Copyright (c) 2025 Markus Friedl. All rights reserved.
*
@@ -191,7 +191,7 @@ kex_kem_mlkem768ecdh_enc(struct kex *kex,
/* append ECDH shared key */
if ((r = kex_ecdh_dec_key_group(kex, ec_pub, server_key, group,
- &ec_shared)) != 0 ||
+ 1, &ec_shared)) != 0 ||
(r = sshbuf_putb(buf, ec_shared)) != 0)
goto out;
@@ -272,7 +272,8 @@ kex_kem_mlkem768ecdh_dec(struct kex *kex,
r = SSH_ERR_ALLOC_FAIL;
goto out;
}
- if ((r = kex_ecdh_dec(kex, ec_pub, &ec_shared)) != 0 ||
+ if ((r = kex_ecdh_dec_key_group(kex, ec_pub, kex->ec_client_key,
+ kex->ec_group, 1, &ec_shared)) != 0 ||
(r = sshbuf_putb(buf, ec_shared)) != 0)
goto out;
if ((r = ssh_digest_buffer(kex->hash_alg, buf,
--
To stop receiving notification emails like this one, please contact
djm at mindrot.org.
More information about the openssh-commits
mailing list