diff options
| author | tb <> | 2026-03-29 06:31:07 +0000 |
|---|---|---|
| committer | tb <> | 2026-03-29 06:31:07 +0000 |
| commit | a05eb59f42ce4d1df74a595e48b369757dc58547 (patch) | |
| tree | 393e238430d498290858efaf374d10276432d4d1 /src | |
| parent | 66d7751c9972254d6d0f07fca49cf3533f291b5c (diff) | |
| download | openbsd-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')
| -rw-r--r-- | src/lib/libcrypto/mlkem/mlkem_internal.c | 10 |
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; |
