mirror of
https://github.com/openssh/openssh-portable.git
synced 2026-11-06 05:16:43 +00:00
upstream: fix ML-KEM/ECDH interop problem (does not affect
mlkem768x25519-sha256) from markus@ OpenBSD-Commit-ID: 9c72e9c0407906bb7d5fb16648b38282676391e9
This commit is contained in:
1 parent
ec04856328
commit
2aee73ed90
3 files changed
+27
-15
No files matched your search
@@ -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 **,
|
||||
|
||||
@@ -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;
|
||||
|
||||
+4
-3
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user