Files
wolfssl/tests/api/test_dh.h
T
Tobias Frauenschläger fd13b11755 Use random-witness primality test for untrusted DH modulus
wc_DhSetKey_ex loads DH parameters as untrusted and validates that the
modulus is prime, but it passed no RNG, so the check fell back to a
Miller-Rabin test using the fixed small-prime bases 2 through 19. That
test is defeatable: a composite crafted as a strong pseudoprime to those
known bases passes as prime, letting an attacker supply a composite
modulus with a smooth factorization for small-subgroup recovery of the
private exponent and shared secret.

When no RNG is supplied on the untrusted path, create a temporary RNG so
mp_prime_is_prime_ex runs with random witnesses, which such crafted
composites cannot reliably pass. Named FFDHE primes still short-circuit
the check, and builds without an RNG keep the deterministic test.

Fixes F-6776.
2026-08-01 13:13:00 +02:00

59 lines
2.5 KiB
C

/* test_dh.h
*
* Copyright (C) 2006-2026 wolfSSL Inc.
*
* This file is part of wolfSSL.
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
#ifndef WOLFCRYPT_TEST_DH_H
#define WOLFCRYPT_TEST_DH_H
#include <tests/api/api_decl.h>
int test_wc_DhPublicKeyDecode(void);
int test_wc_DhAgree_subgroup_check(void);
int test_wc_DhSetKey(void);
int test_wc_DhSetKey_ex_pseudoprime(void);
int test_wc_DhSetNamedKey_and_helpers(void);
int test_wc_DhGenerateKeyPair_bad_args(void);
int test_wc_DhGenerateKeyPair_and_Agree(void);
int test_wc_DhAgree_nonblock(void);
int test_wc_DhImportExportKeyPair(void);
int test_wc_DhCheckPubKey(void);
int test_wc_DhCheckPrivKey(void);
int test_wc_DhCheckKeyPair(void);
int test_wc_DhGenerateParams_and_ExportRaw(void);
int test_wc_DhGenerateKeyPair_CheckDhLN(void);
#define TEST_DH_DECLS \
TEST_DECL_GROUP("dh", test_wc_DhPublicKeyDecode), \
TEST_DECL_GROUP("dh", test_wc_DhAgree_subgroup_check), \
TEST_DECL_GROUP("dh", test_wc_DhSetKey), \
TEST_DECL_GROUP("dh", test_wc_DhSetKey_ex_pseudoprime), \
TEST_DECL_GROUP("dh", test_wc_DhSetNamedKey_and_helpers), \
TEST_DECL_GROUP("dh", test_wc_DhGenerateKeyPair_bad_args), \
TEST_DECL_GROUP("dh", test_wc_DhGenerateKeyPair_and_Agree), \
TEST_DECL_GROUP("dh", test_wc_DhAgree_nonblock), \
TEST_DECL_GROUP("dh", test_wc_DhImportExportKeyPair), \
TEST_DECL_GROUP("dh", test_wc_DhCheckPubKey), \
TEST_DECL_GROUP("dh", test_wc_DhCheckPrivKey), \
TEST_DECL_GROUP("dh", test_wc_DhCheckKeyPair), \
TEST_DECL_GROUP("dh", test_wc_DhGenerateParams_and_ExportRaw), \
TEST_DECL_GROUP("dh", test_wc_DhGenerateKeyPair_CheckDhLN)
#endif /* WOLFCRYPT_TEST_DH_H */