summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2026-03-29 06:31:07 +0000
committertb <>2026-03-29 06:31:07 +0000
commita05eb59f42ce4d1df74a595e48b369757dc58547 (patch)
tree393e238430d498290858efaf374d10276432d4d1 /src/lib
parent66d7751c9972254d6d0f07fca49cf3533f291b5c (diff)
downloadopenbsd-a05eb59f42ce4d1df74a595e48b369757dc58547.tar.gz
openbsd-a05eb59f42ce4d1df74a595e48b369757dc58547.tar.bz2
openbsd-a05eb59f42ce4d1df74a595e48b369757dc58547.zip
ML-KEM: ensure that key_768 is only dereferenced with 768-bit keys
This looks like a NULL dereference that should crash, but for some reason it doesn't, even with -O0 with all compilers i tried. At the very least it may result in compilers deducing that key_768 != NULL and lead to incorrect optimizations. ok claudio jsing kenjiro miod
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/mlkem/mlkem_internal.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/lib/libcrypto/mlkem/mlkem_internal.c b/src/lib/libcrypto/mlkem/mlkem_internal.c
index dec841312e..12b1c3e235 100644
--- a/src/lib/libcrypto/mlkem/mlkem_internal.c
+++ b/src/lib/libcrypto/mlkem/mlkem_internal.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: mlkem_internal.c,v 1.7 2026/03/06 09:22:29 kenjiro Exp $ */ 1/* $OpenBSD: mlkem_internal.c,v 1.8 2026/03/29 06:31:07 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2024, Google Inc. 3 * Copyright (c) 2024, Google Inc.
4 * Copyright (c) 2024, 2025 Bob Beck <beck@obtuse.com> 4 * Copyright (c) 2024, 2025 Bob Beck <beck@obtuse.com>
@@ -828,11 +828,13 @@ public_key_from_external(const MLKEM_public_key *external,
828 struct public_key *pub) 828 struct public_key *pub)
829{ 829{
830 size_t vector_size = external->rank * sizeof(scalar); 830 size_t vector_size = external->rank * sizeof(scalar);
831 uint8_t *bytes = external->key_768->bytes;
832 size_t offset = 0; 831 size_t offset = 0;
832 uint8_t *bytes;
833 833
834 if (external->rank == MLKEM1024_RANK) 834 if (external->rank == MLKEM1024_RANK)
835 bytes = external->key_1024->bytes; 835 bytes = external->key_1024->bytes;
836 else
837 bytes = external->key_768->bytes;
836 838
837 pub->t = (struct scalar *)bytes + offset; 839 pub->t = (struct scalar *)bytes + offset;
838 offset += vector_size; 840 offset += vector_size;
@@ -856,10 +858,12 @@ private_key_from_external(const MLKEM_private_key *external,
856{ 858{
857 size_t vector_size = external->rank * sizeof(scalar); 859 size_t vector_size = external->rank * sizeof(scalar);
858 size_t offset = 0; 860 size_t offset = 0;
859 uint8_t *bytes = external->key_768->bytes; 861 uint8_t *bytes;
860 862
861 if (external->rank == MLKEM1024_RANK) 863 if (external->rank == MLKEM1024_RANK)
862 bytes = external->key_1024->bytes; 864 bytes = external->key_1024->bytes;
865 else
866 bytes = external->key_768->bytes;
863 867
864 priv->pub.t = (struct scalar *)(bytes + offset); 868 priv->pub.t = (struct scalar *)(bytes + offset);
865 offset += vector_size; 869 offset += vector_size;