/* test_ossl_dh.c * * Copyright (C) 2006-2025 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 */ #include #ifdef NO_INLINE #include #else #define WOLFSSL_MISC_INCLUDED #include #endif #include #include #include #include #include /******************************************************************************* * DH OpenSSL compatibility API Testing ******************************************************************************/ int test_wolfSSL_DH(void) { EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) DH *dh = NULL; BIGNUM* p; BIGNUM* q; BIGNUM* g; BIGNUM* pub = NULL; BIGNUM* priv = NULL; #if defined(OPENSSL_ALL) #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) FILE* f = NULL; unsigned char buf[268]; const unsigned char* pt = buf; long len = 0; dh = NULL; XMEMSET(buf, 0, sizeof(buf)); /* Test 2048 bit parameters */ ExpectTrue((f = XFOPEN("./certs/dh2048.der", "rb")) != XBADFILE); ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); if (f != XBADFILE) XFCLOSE(f); ExpectNotNull(dh = d2i_DHparams(NULL, &pt, len)); ExpectNotNull(dh->p); ExpectNotNull(dh->g); ExpectTrue(pt == buf); ExpectIntEQ(DH_generate_key(dh), 1); /* first, test for expected successful key agreement. */ if (EXPECT_SUCCESS()) { DH *dh2 = NULL; unsigned char buf2[268]; int sz1 = 0, sz2 = 0; ExpectNotNull(dh2 = d2i_DHparams(NULL, &pt, len)); ExpectIntEQ(DH_generate_key(dh2), 1); ExpectIntGT(sz1=DH_compute_key(buf, dh2->pub_key, dh), 0); ExpectIntGT(sz2=DH_compute_key(buf2, dh->pub_key, dh2), 0); ExpectIntEQ(sz1, sz2); ExpectIntEQ(XMEMCMP(buf, buf2, (size_t)sz1), 0); ExpectIntNE(sz1 = DH_size(dh), 0); ExpectIntEQ(DH_compute_key_padded(buf, dh2->pub_key, dh), sz1); ExpectIntEQ(DH_compute_key_padded(buf2, dh->pub_key, dh2), sz1); ExpectIntEQ(XMEMCMP(buf, buf2, (size_t)sz1), 0); if (dh2 != NULL) DH_free(dh2); } ExpectIntEQ(DH_generate_key(dh), 1); ExpectIntEQ(DH_compute_key(NULL, NULL, NULL), -1); ExpectNotNull(pub = BN_new()); ExpectIntEQ(BN_set_word(pub, 1), 1); ExpectIntEQ(DH_compute_key(buf, NULL, NULL), -1); ExpectIntEQ(DH_compute_key(NULL, pub, NULL), -1); ExpectIntEQ(DH_compute_key(NULL, NULL, dh), -1); ExpectIntEQ(DH_compute_key(buf, pub, NULL), -1); ExpectIntEQ(DH_compute_key(buf, NULL, dh), -1); ExpectIntEQ(DH_compute_key(NULL, pub, dh), -1); ExpectIntEQ(DH_compute_key(buf, pub, dh), -1); BN_free(pub); pub = NULL; DH_get0_pqg(dh, (const BIGNUM**)&p, (const BIGNUM**)&q, (const BIGNUM**)&g); ExpectPtrEq(p, dh->p); ExpectPtrEq(q, dh->q); ExpectPtrEq(g, dh->g); DH_get0_key(NULL, (const BIGNUM**)&pub, (const BIGNUM**)&priv); DH_get0_key(dh, (const BIGNUM**)&pub, (const BIGNUM**)&priv); ExpectPtrEq(pub, dh->pub_key); ExpectPtrEq(priv, dh->priv_key); DH_get0_key(dh, (const BIGNUM**)&pub, NULL); ExpectPtrEq(pub, dh->pub_key); DH_get0_key(dh, NULL, (const BIGNUM**)&priv); ExpectPtrEq(priv, dh->priv_key); pub = NULL; priv = NULL; ExpectNotNull(pub = BN_new()); ExpectNotNull(priv = BN_new()); ExpectIntEQ(DH_set0_key(NULL, pub, priv), 0); ExpectIntEQ(DH_set0_key(dh, pub, priv), 1); if (EXPECT_FAIL()) { BN_free(pub); BN_free(priv); } pub = NULL; priv = NULL; ExpectNotNull(pub = BN_new()); ExpectIntEQ(DH_set0_key(dh, pub, NULL), 1); if (EXPECT_FAIL()) { BN_free(pub); } ExpectNotNull(priv = BN_new()); ExpectIntEQ(DH_set0_key(dh, NULL, priv), 1); if (EXPECT_FAIL()) { BN_free(priv); } ExpectPtrEq(pub, dh->pub_key); ExpectPtrEq(priv, dh->priv_key); pub = NULL; priv = NULL; DH_free(dh); dh = NULL; ExpectNotNull(dh = DH_new()); p = NULL; ExpectNotNull(p = BN_new()); ExpectIntEQ(BN_set_word(p, 1), 1); ExpectIntEQ(DH_compute_key(buf, p, dh), -1); ExpectNotNull(pub = BN_new()); ExpectNotNull(priv = BN_new()); ExpectIntEQ(DH_set0_key(dh, pub, priv), 1); if (EXPECT_FAIL()) { BN_free(pub); BN_free(priv); } pub = NULL; priv = NULL; ExpectIntEQ(DH_compute_key(buf, p, dh), -1); BN_free(p); p = NULL; DH_free(dh); dh = NULL; #ifdef WOLFSSL_KEY_GEN ExpectNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); ExpectIntEQ(wolfSSL_DH_generate_parameters_ex(NULL, 2048, 2, NULL), 0); DH_free(dh); dh = NULL; #endif #endif /* !HAVE_FIPS || (HAVE_FIPS_VERSION && HAVE_FIPS_VERSION > 2) */ #endif /* OPENSSL_ALL */ (void)dh; (void)p; (void)q; (void)g; (void)pub; (void)priv; ExpectNotNull(dh = wolfSSL_DH_new()); /* invalid parameters test */ DH_get0_pqg(NULL, (const BIGNUM**)&p, (const BIGNUM**)&q, (const BIGNUM**)&g); DH_get0_pqg(dh, NULL, (const BIGNUM**)&q, (const BIGNUM**)&g); DH_get0_pqg(dh, NULL, NULL, (const BIGNUM**)&g); DH_get0_pqg(dh, NULL, NULL, NULL); DH_get0_pqg(dh, (const BIGNUM**)&p, (const BIGNUM**)&q, (const BIGNUM**)&g); ExpectPtrEq(p, NULL); ExpectPtrEq(q, NULL); ExpectPtrEq(g, NULL); DH_free(dh); dh = NULL; #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS) && !defined(WOLFSSL_DH_EXTRA)) \ || (defined(HAVE_FIPS_VERSION) && FIPS_VERSION_GT(2,0)) #if defined(OPENSSL_ALL) || \ defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L dh = wolfSSL_DH_new(); ExpectNotNull(dh); p = wolfSSL_BN_new(); ExpectNotNull(p); ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); ExpectNotNull(g); ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); ExpectNotNull(q); ExpectIntEQ(BN_set_word(q, 5), 1); ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, NULL), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, p, NULL, NULL), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, q, NULL), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, g), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, p, q, g), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, g), 0); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, NULL), 0); /* Don't need q. */ ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); if (EXPECT_FAIL()) { BN_free(p); BN_free(g); } p = NULL; g = NULL; /* Setting again will free the p and g. */ wolfSSL_BN_free(q); q = NULL; DH_free(dh); dh = NULL; dh = wolfSSL_DH_new(); ExpectNotNull(dh); p = wolfSSL_BN_new(); ExpectNotNull(p); ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); ExpectNotNull(g); ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); ExpectNotNull(q); ExpectIntEQ(BN_set_word(q, 5), 1); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, g), 1); /* p, q and g are now owned by dh - don't free. */ if (EXPECT_FAIL()) { BN_free(p); BN_free(q); BN_free(g); } p = NULL; q = NULL; g = NULL; p = wolfSSL_BN_new(); ExpectNotNull(p); ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); ExpectNotNull(g); ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); ExpectNotNull(q); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, NULL), 1); if (EXPECT_FAIL()) { BN_free(p); } p = NULL; ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, NULL), 1); if (EXPECT_FAIL()) { BN_free(q); } q = NULL; ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, g), 1); if (EXPECT_FAIL()) { BN_free(g); } g = NULL; ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 1); /* p, q and g are now owned by dh - don't free. */ DH_free(dh); dh = NULL; ExpectIntEQ(DH_generate_key(NULL), 0); ExpectNotNull(dh = DH_new()); ExpectIntEQ(DH_generate_key(dh), 0); p = wolfSSL_BN_new(); ExpectNotNull(p); ExpectIntEQ(BN_set_word(p, 0), 1); g = wolfSSL_BN_new(); ExpectNotNull(g); ExpectIntEQ(BN_set_word(g, 2), 1); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); if (EXPECT_FAIL()) { BN_free(p); BN_free(g); } p = NULL; g = NULL; ExpectIntEQ(DH_generate_key(dh), 0); DH_free(dh); dh = NULL; #endif #endif /* Test DH_up_ref() */ dh = wolfSSL_DH_new(); ExpectNotNull(dh); ExpectIntEQ(wolfSSL_DH_up_ref(NULL), WC_NO_ERR_TRACE(WOLFSSL_FAILURE)); ExpectIntEQ(wolfSSL_DH_up_ref(dh), WOLFSSL_SUCCESS); DH_free(dh); /* decrease ref count */ DH_free(dh); /* free WOLFSSL_DH */ dh = NULL; q = NULL; ExpectNull((dh = DH_new_by_nid(NID_sha1))); #if (defined(HAVE_PUBLIC_FFDHE) || (defined(HAVE_FIPS) && \ FIPS_VERSION_EQ(2,0))) || (!defined(HAVE_PUBLIC_FFDHE) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))) #ifdef HAVE_FFDHE_2048 ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe2048))); DH_free(dh); dh = NULL; q = NULL; #endif #ifdef HAVE_FFDHE_3072 ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe3072))); DH_free(dh); dh = NULL; q = NULL; #endif #ifdef HAVE_FFDHE_4096 ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe4096))); DH_free(dh); dh = NULL; q = NULL; #endif #else ExpectNull((dh = DH_new_by_nid(NID_ffdhe2048))); #endif /* (HAVE_PUBLIC_FFDHE || (HAVE_FIPS && HAVE_FIPS_VERSION == 2)) || * (!HAVE_PUBLIC_FFDHE && (!HAVE_FIPS || HAVE_FIPS_VERSION > 2))*/ ExpectIntEQ(wolfSSL_DH_size(NULL), -1); #endif /* OPENSSL_EXTRA && !NO_DH */ return EXPECT_RESULT(); } int test_wolfSSL_DH_dup(void) { EXPECT_DECLS; #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH) || \ defined(OPENSSL_EXTRA) DH *dh = NULL; DH *dhDup = NULL; ExpectNotNull(dh = wolfSSL_DH_new()); ExpectNull(dhDup = wolfSSL_DH_dup(NULL)); ExpectNull(dhDup = wolfSSL_DH_dup(dh)); #if defined(OPENSSL_ALL) || \ defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L { WOLFSSL_BIGNUM* p = NULL; WOLFSSL_BIGNUM* g = NULL; ExpectNotNull(p = wolfSSL_BN_new()); ExpectNotNull(g = wolfSSL_BN_new()); ExpectIntEQ(wolfSSL_BN_set_word(p, 11), WOLFSSL_SUCCESS); ExpectIntEQ(wolfSSL_BN_set_word(g, 2), WOLFSSL_SUCCESS); ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); if (EXPECT_FAIL()) { wolfSSL_BN_free(p); wolfSSL_BN_free(g); } ExpectNotNull(dhDup = wolfSSL_DH_dup(dh)); wolfSSL_DH_free(dhDup); } #endif wolfSSL_DH_free(dh); #endif #endif return EXPECT_RESULT(); } int test_wolfSSL_DH_check(void) { EXPECT_DECLS; #ifdef OPENSSL_ALL #ifndef NO_DH #ifndef NO_BIO #ifndef NO_DSA byte buf[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f = XBADFILE; int bytes = 0; BIO* bio = NULL; DSA* dsa = NULL; #elif !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0) static const byte dh2048[] = { 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0xa1, 0x08, 0x06, 0x9c, 0x08, 0x13, 0xba, 0x59, 0x06, 0x3c, 0xbc, 0x30, 0xd5, 0xf5, 0x00, 0xc1, 0x4f, 0x44, 0xa7, 0xd6, 0xef, 0x4a, 0xc6, 0x25, 0x27, 0x1c, 0xe8, 0xd2, 0x96, 0x53, 0x0a, 0x5c, 0x91, 0xdd, 0xa2, 0xc2, 0x94, 0x84, 0xbf, 0x7d, 0xb2, 0x44, 0x9f, 0x9b, 0xd2, 0xc1, 0x8a, 0xc5, 0xbe, 0x72, 0x5c, 0xa7, 0xe7, 0x91, 0xe6, 0xd4, 0x9f, 0x73, 0x07, 0x85, 0x5b, 0x66, 0x48, 0xc7, 0x70, 0xfa, 0xb4, 0xee, 0x02, 0xc9, 0x3d, 0x9a, 0x4a, 0xda, 0x3d, 0xc1, 0x46, 0x3e, 0x19, 0x69, 0xd1, 0x17, 0x46, 0x07, 0xa3, 0x4d, 0x9f, 0x2b, 0x96, 0x17, 0x39, 0x6d, 0x30, 0x8d, 0x2a, 0xf3, 0x94, 0xd3, 0x75, 0xcf, 0xa0, 0x75, 0xe6, 0xf2, 0x92, 0x1f, 0x1a, 0x70, 0x05, 0xaa, 0x04, 0x83, 0x57, 0x30, 0xfb, 0xda, 0x76, 0x93, 0x38, 0x50, 0xe8, 0x27, 0xfd, 0x63, 0xee, 0x3c, 0xe5, 0xb7, 0xc8, 0x09, 0xae, 0x6f, 0x50, 0x35, 0x8e, 0x84, 0xce, 0x4a, 0x00, 0xe9, 0x12, 0x7e, 0x5a, 0x31, 0xd7, 0x33, 0xfc, 0x21, 0x13, 0x76, 0xcc, 0x16, 0x30, 0xdb, 0x0c, 0xfc, 0xc5, 0x62, 0xa7, 0x35, 0xb8, 0xef, 0xb7, 0xb0, 0xac, 0xc0, 0x36, 0xf6, 0xd9, 0xc9, 0x46, 0x48, 0xf9, 0x40, 0x90, 0x00, 0x2b, 0x1b, 0xaa, 0x6c, 0xe3, 0x1a, 0xc3, 0x0b, 0x03, 0x9e, 0x1b, 0xc2, 0x46, 0xe4, 0x48, 0x4e, 0x22, 0x73, 0x6f, 0xc3, 0x5f, 0xd4, 0x9a, 0xd6, 0x30, 0x07, 0x48, 0xd6, 0x8c, 0x90, 0xab, 0xd4, 0xf6, 0xf1, 0xe3, 0x48, 0xd3, 0x58, 0x4b, 0xa6, 0xb9, 0xcd, 0x29, 0xbf, 0x68, 0x1f, 0x08, 0x4b, 0x63, 0x86, 0x2f, 0x5c, 0x6b, 0xd6, 0xb6, 0x06, 0x65, 0xf7, 0xa6, 0xdc, 0x00, 0x67, 0x6b, 0xbb, 0xc3, 0xa9, 0x41, 0x83, 0xfb, 0xc7, 0xfa, 0xc8, 0xe2, 0x1e, 0x7e, 0xaf, 0x00, 0x3f, 0x93, 0x02, 0x01, 0x02 }; const byte* params; #endif DH* dh = NULL; WOLFSSL_BIGNUM* p = NULL; WOLFSSL_BIGNUM* g = NULL; WOLFSSL_BIGNUM* pTmp = NULL; WOLFSSL_BIGNUM* gTmp = NULL; int codes = -1; #ifndef NO_DSA /* Initialize DH */ ExpectTrue((f = XFOPEN(file, "rb")) != XBADFILE); ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); if (f != XBADFILE) XFCLOSE(f); ExpectNotNull(bio = BIO_new_mem_buf((void*)buf, bytes)); ExpectNotNull(dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL)); ExpectNotNull(dh = wolfSSL_DSA_dup_DH(dsa)); ExpectNotNull(dh); BIO_free(bio); DSA_free(dsa); #elif !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0) params = dh2048; ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, ¶ms, (long)sizeof(dh2048))); #else ExpectNotNull(dh = wolfSSL_DH_new_by_nid(NID_ffdhe2048)); #endif /* Test assumed to be valid dh. * Should return WOLFSSL_SUCCESS * codes should be 0 * Invalid codes = {DH_NOT_SUITABLE_GENERATOR, DH_CHECK_P_NOT_PRIME} */ ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); ExpectIntEQ(codes, 0); /* Test NULL dh: expected BAD_FUNC_ARG */ ExpectIntEQ(wolfSSL_DH_check(NULL, &codes), 0); /* Break dh prime to test if codes = DH_CHECK_P_NOT_PRIME */ if (dh != NULL) { pTmp = dh->p; dh->p = NULL; } ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); ExpectIntEQ(codes, DH_CHECK_P_NOT_PRIME); /* set dh->p back to normal so it won't fail on next tests */ if (dh != NULL) { dh->p = pTmp; pTmp = NULL; } /* Break dh generator to test if codes = DH_NOT_SUITABLE_GENERATOR */ if (dh != NULL) { gTmp = dh->g; dh->g = NULL; } ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); ExpectIntEQ(codes, DH_NOT_SUITABLE_GENERATOR); if (dh != NULL) { dh->g = gTmp; gTmp = NULL; } /* Cleanup */ DH_free(dh); dh = NULL; dh = DH_new(); ExpectNotNull(dh); /* Check empty DH. */ ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); ExpectIntEQ(codes, DH_NOT_SUITABLE_GENERATOR | DH_CHECK_P_NOT_PRIME); /* Check non-prime valued p. */ ExpectNotNull(p = BN_new()); ExpectIntEQ(BN_set_word(p, 4), 1); ExpectNotNull(g = BN_new()); ExpectIntEQ(BN_set_word(g, 2), 1); ExpectIntEQ(DH_set0_pqg(dh, p, NULL, g), 1); if (EXPECT_FAIL()) { wolfSSL_BN_free(p); wolfSSL_BN_free(g); } ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); ExpectIntEQ(codes, DH_CHECK_P_NOT_PRIME); DH_free(dh); dh = NULL; #endif #endif /* !NO_DH && !NO_DSA */ #endif return EXPECT_RESULT(); } int test_wolfSSL_DH_prime(void) { EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) WOLFSSL_BIGNUM* bn = NULL; #if WOLFSSL_MAX_BN_BITS >= 768 WOLFSSL_BIGNUM* bn2 = NULL; #endif bn = wolfSSL_DH_768_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 768 ExpectNotNull(bn); bn2 = wolfSSL_DH_768_prime(bn); ExpectNotNull(bn2); ExpectTrue(bn == bn2); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_1024_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 1024 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_2048_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 2048 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_3072_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 3072 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_4096_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 4096 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_6144_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 6144 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif bn = wolfSSL_DH_8192_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 8192 ExpectNotNull(bn); wolfSSL_BN_free(bn); bn = NULL; #else ExpectNull(bn); #endif #endif return EXPECT_RESULT(); } int test_wolfSSL_DH_1536_prime(void) { EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) BIGNUM* bn = NULL; unsigned char bits[200]; int sz = 192; /* known binary size */ const byte expected[] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1, 0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22, 0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B, 0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45, 0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B, 0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5, 0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D, 0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A, 0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96, 0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D, 0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, 0xF1,0x74,0x6C,0x08,0xCA,0x23,0x73,0x27, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, }; ExpectNotNull(bn = get_rfc3526_prime_1536(NULL)); ExpectIntEQ(sz, BN_bn2bin((const BIGNUM*)bn, bits)); ExpectIntEQ(0, XMEMCMP(expected, bits, sz)); BN_free(bn); #endif return EXPECT_RESULT(); } int test_wolfSSL_DH_get_2048_256(void) { EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) WOLFSSL_DH* dh = NULL; const WOLFSSL_BIGNUM* pBn; const WOLFSSL_BIGNUM* gBn; const WOLFSSL_BIGNUM* qBn; const byte pExpected[] = { 0x87, 0xA8, 0xE6, 0x1D, 0xB4, 0xB6, 0x66, 0x3C, 0xFF, 0xBB, 0xD1, 0x9C, 0x65, 0x19, 0x59, 0x99, 0x8C, 0xEE, 0xF6, 0x08, 0x66, 0x0D, 0xD0, 0xF2, 0x5D, 0x2C, 0xEE, 0xD4, 0x43, 0x5E, 0x3B, 0x00, 0xE0, 0x0D, 0xF8, 0xF1, 0xD6, 0x19, 0x57, 0xD4, 0xFA, 0xF7, 0xDF, 0x45, 0x61, 0xB2, 0xAA, 0x30, 0x16, 0xC3, 0xD9, 0x11, 0x34, 0x09, 0x6F, 0xAA, 0x3B, 0xF4, 0x29, 0x6D, 0x83, 0x0E, 0x9A, 0x7C, 0x20, 0x9E, 0x0C, 0x64, 0x97, 0x51, 0x7A, 0xBD, 0x5A, 0x8A, 0x9D, 0x30, 0x6B, 0xCF, 0x67, 0xED, 0x91, 0xF9, 0xE6, 0x72, 0x5B, 0x47, 0x58, 0xC0, 0x22, 0xE0, 0xB1, 0xEF, 0x42, 0x75, 0xBF, 0x7B, 0x6C, 0x5B, 0xFC, 0x11, 0xD4, 0x5F, 0x90, 0x88, 0xB9, 0x41, 0xF5, 0x4E, 0xB1, 0xE5, 0x9B, 0xB8, 0xBC, 0x39, 0xA0, 0xBF, 0x12, 0x30, 0x7F, 0x5C, 0x4F, 0xDB, 0x70, 0xC5, 0x81, 0xB2, 0x3F, 0x76, 0xB6, 0x3A, 0xCA, 0xE1, 0xCA, 0xA6, 0xB7, 0x90, 0x2D, 0x52, 0x52, 0x67, 0x35, 0x48, 0x8A, 0x0E, 0xF1, 0x3C, 0x6D, 0x9A, 0x51, 0xBF, 0xA4, 0xAB, 0x3A, 0xD8, 0x34, 0x77, 0x96, 0x52, 0x4D, 0x8E, 0xF6, 0xA1, 0x67, 0xB5, 0xA4, 0x18, 0x25, 0xD9, 0x67, 0xE1, 0x44, 0xE5, 0x14, 0x05, 0x64, 0x25, 0x1C, 0xCA, 0xCB, 0x83, 0xE6, 0xB4, 0x86, 0xF6, 0xB3, 0xCA, 0x3F, 0x79, 0x71, 0x50, 0x60, 0x26, 0xC0, 0xB8, 0x57, 0xF6, 0x89, 0x96, 0x28, 0x56, 0xDE, 0xD4, 0x01, 0x0A, 0xBD, 0x0B, 0xE6, 0x21, 0xC3, 0xA3, 0x96, 0x0A, 0x54, 0xE7, 0x10, 0xC3, 0x75, 0xF2, 0x63, 0x75, 0xD7, 0x01, 0x41, 0x03, 0xA4, 0xB5, 0x43, 0x30, 0xC1, 0x98, 0xAF, 0x12, 0x61, 0x16, 0xD2, 0x27, 0x6E, 0x11, 0x71, 0x5F, 0x69, 0x38, 0x77, 0xFA, 0xD7, 0xEF, 0x09, 0xCA, 0xDB, 0x09, 0x4A, 0xE9, 0x1E, 0x1A, 0x15, 0x97 }; const byte gExpected[] = { 0x3F, 0xB3, 0x2C, 0x9B, 0x73, 0x13, 0x4D, 0x0B, 0x2E, 0x77, 0x50, 0x66, 0x60, 0xED, 0xBD, 0x48, 0x4C, 0xA7, 0xB1, 0x8F, 0x21, 0xEF, 0x20, 0x54, 0x07, 0xF4, 0x79, 0x3A, 0x1A, 0x0B, 0xA1, 0x25, 0x10, 0xDB, 0xC1, 0x50, 0x77, 0xBE, 0x46, 0x3F, 0xFF, 0x4F, 0xED, 0x4A, 0xAC, 0x0B, 0xB5, 0x55, 0xBE, 0x3A, 0x6C, 0x1B, 0x0C, 0x6B, 0x47, 0xB1, 0xBC, 0x37, 0x73, 0xBF, 0x7E, 0x8C, 0x6F, 0x62, 0x90, 0x12, 0x28, 0xF8, 0xC2, 0x8C, 0xBB, 0x18, 0xA5, 0x5A, 0xE3, 0x13, 0x41, 0x00, 0x0A, 0x65, 0x01, 0x96, 0xF9, 0x31, 0xC7, 0x7A, 0x57, 0xF2, 0xDD, 0xF4, 0x63, 0xE5, 0xE9, 0xEC, 0x14, 0x4B, 0x77, 0x7D, 0xE6, 0x2A, 0xAA, 0xB8, 0xA8, 0x62, 0x8A, 0xC3, 0x76, 0xD2, 0x82, 0xD6, 0xED, 0x38, 0x64, 0xE6, 0x79, 0x82, 0x42, 0x8E, 0xBC, 0x83, 0x1D, 0x14, 0x34, 0x8F, 0x6F, 0x2F, 0x91, 0x93, 0xB5, 0x04, 0x5A, 0xF2, 0x76, 0x71, 0x64, 0xE1, 0xDF, 0xC9, 0x67, 0xC1, 0xFB, 0x3F, 0x2E, 0x55, 0xA4, 0xBD, 0x1B, 0xFF, 0xE8, 0x3B, 0x9C, 0x80, 0xD0, 0x52, 0xB9, 0x85, 0xD1, 0x82, 0xEA, 0x0A, 0xDB, 0x2A, 0x3B, 0x73, 0x13, 0xD3, 0xFE, 0x14, 0xC8, 0x48, 0x4B, 0x1E, 0x05, 0x25, 0x88, 0xB9, 0xB7, 0xD2, 0xBB, 0xD2, 0xDF, 0x01, 0x61, 0x99, 0xEC, 0xD0, 0x6E, 0x15, 0x57, 0xCD, 0x09, 0x15, 0xB3, 0x35, 0x3B, 0xBB, 0x64, 0xE0, 0xEC, 0x37, 0x7F, 0xD0, 0x28, 0x37, 0x0D, 0xF9, 0x2B, 0x52, 0xC7, 0x89, 0x14, 0x28, 0xCD, 0xC6, 0x7E, 0xB6, 0x18, 0x4B, 0x52, 0x3D, 0x1D, 0xB2, 0x46, 0xC3, 0x2F, 0x63, 0x07, 0x84, 0x90, 0xF0, 0x0E, 0xF8, 0xD6, 0x47, 0xD1, 0x48, 0xD4, 0x79, 0x54, 0x51, 0x5E, 0x23, 0x27, 0xCF, 0xEF, 0x98, 0xC5, 0x82, 0x66, 0x4B, 0x4C, 0x0F, 0x6C, 0xC4, 0x16, 0x59 }; const byte qExpected[] = { 0x8C, 0xF8, 0x36, 0x42, 0xA7, 0x09, 0xA0, 0x97, 0xB4, 0x47, 0x99, 0x76, 0x40, 0x12, 0x9D, 0xA2, 0x99, 0xB1, 0xA4, 0x7D, 0x1E, 0xB3, 0x75, 0x0B, 0xA3, 0x08, 0xB0, 0xFE, 0x64, 0xF5, 0xFB, 0xD3 }; int pSz = 0; int qSz = 0; int gSz = 0; byte* pReturned = NULL; byte* qReturned = NULL; byte* gReturned = NULL; ExpectNotNull((dh = wolfSSL_DH_get_2048_256())); wolfSSL_DH_get0_pqg(dh, &pBn, &qBn, &gBn); ExpectIntGT((pSz = wolfSSL_BN_num_bytes(pBn)), 0); ExpectNotNull(pReturned = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); ExpectIntGT((pSz = wolfSSL_BN_bn2bin(pBn, pReturned)), 0); ExpectIntEQ(pSz, sizeof(pExpected)); ExpectIntEQ(XMEMCMP(pExpected, pReturned, pSz), 0); ExpectIntGT((qSz = wolfSSL_BN_num_bytes(qBn)), 0); ExpectNotNull(qReturned = (byte*)XMALLOC(qSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); ExpectIntGT((qSz = wolfSSL_BN_bn2bin(qBn, qReturned)), 0); ExpectIntEQ(qSz, sizeof(qExpected)); ExpectIntEQ(XMEMCMP(qExpected, qReturned, qSz), 0); ExpectIntGT((gSz = wolfSSL_BN_num_bytes(gBn)), 0); ExpectNotNull(gReturned = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); ExpectIntGT((gSz = wolfSSL_BN_bn2bin(gBn, gReturned)), 0); ExpectIntEQ(gSz, sizeof(gExpected)); ExpectIntEQ(XMEMCMP(gExpected, gReturned, gSz), 0); wolfSSL_DH_free(dh); XFREE(pReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(gReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(qReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); } int test_wolfSSL_PEM_read_DHparams(void) { EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && \ !defined(NO_FILESYSTEM) DH* dh = NULL; XFILE fp = XBADFILE; unsigned char derOut[300]; unsigned char* derOutBuf = derOut; int derOutSz = 0; unsigned char derExpected[300]; int derExpectedSz = 0; XMEMSET(derOut, 0, sizeof(derOut)); XMEMSET(derExpected, 0, sizeof(derExpected)); /* open DH param file, read into DH struct */ ExpectTrue((fp = XFOPEN(dhParamFile, "rb")) != XBADFILE); /* bad args */ ExpectNull(dh = PEM_read_DHparams(NULL, &dh, NULL, NULL)); ExpectNull(dh = PEM_read_DHparams(NULL, NULL, NULL, NULL)); /* good args */ ExpectNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); if (fp != XBADFILE) { XFCLOSE(fp); fp = XBADFILE; } /* read in certs/dh2048.der for comparison against exported params */ ExpectTrue((fp = XFOPEN("./certs/dh2048.der", "rb")) != XBADFILE); ExpectIntGT(derExpectedSz = (int)XFREAD(derExpected, 1, sizeof(derExpected), fp), 0); if (fp != XBADFILE) { XFCLOSE(fp); fp = XBADFILE; } /* export DH back to DER and compare */ derOutSz = wolfSSL_i2d_DHparams(dh, &derOutBuf); ExpectIntEQ(derOutSz, derExpectedSz); ExpectIntEQ(XMEMCMP(derOut, derExpected, derOutSz), 0); DH_free(dh); dh = NULL; /* Test parsing with X9.42 header */ ExpectTrue((fp = XFOPEN("./certs/x942dh2048.pem", "rb")) != XBADFILE); ExpectNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); if (fp != XBADFILE) XFCLOSE(fp); DH_free(dh); dh = NULL; #endif return EXPECT_RESULT(); } int test_wolfSSL_PEM_write_DHparams(void) { EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_BIO) && \ !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM) DH* dh = NULL; BIO* bio = NULL; XFILE fp = XBADFILE; byte pem[2048]; int pemSz = 0; const char expected[] = "-----BEGIN DH PARAMETERS-----\n" "MIIBCAKCAQEAsKEIBpwIE7pZBjy8MNX1AMFPRKfW70rGJScc6NKWUwpckd2iwpSE\n" "v32yRJ+b0sGKxb5yXKfnkebUn3MHhVtmSMdw+rTuAsk9mkraPcFGPhlp0RdGB6NN\n" "nyuWFzltMI0q85TTdc+gdebykh8acAWqBINXMPvadpM4UOgn/WPuPOW3yAmub1A1\n" "joTOSgDpEn5aMdcz/CETdswWMNsM/MVipzW477ewrMA29tnJRkj5QJAAKxuqbOMa\n" "wwsDnhvCRuRITiJzb8Nf1JrWMAdI1oyQq9T28eNI01hLprnNKb9oHwhLY4YvXGvW\n" "tgZl96bcAGdru8OpQYP7x/rI4h5+rwA/kwIBAg==\n" "-----END DH PARAMETERS-----\n"; const char badPem[] = "-----BEGIN DH PARAMETERS-----\n" "-----END DH PARAMETERS-----\n"; const char emptySeqPem[] = "-----BEGIN DH PARAMETERS-----\n" "MAA=\n" "-----END DH PARAMETERS-----\n"; ExpectTrue((fp = XFOPEN(dhParamFile, "rb")) != XBADFILE); ExpectIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); if (fp != XBADFILE) { XFCLOSE(fp); fp = XBADFILE; } ExpectNull(PEM_read_bio_DHparams(NULL, NULL, NULL, NULL)); ExpectNotNull(bio = BIO_new(BIO_s_mem())); ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); ExpectIntEQ(BIO_write(bio, badPem, (int)sizeof(badPem)), (int)sizeof(badPem)); ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); bio = NULL; ExpectNotNull(bio = BIO_new(BIO_s_mem())); ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); ExpectIntEQ(BIO_write(bio, emptySeqPem, (int)sizeof(emptySeqPem)), (int)sizeof(emptySeqPem)); ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); bio = NULL; ExpectNotNull(bio = BIO_new(BIO_s_mem())); ExpectIntEQ(BIO_write(bio, pem, pemSz), pemSz); ExpectNotNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); bio = NULL; ExpectNotNull(fp = XFOPEN("./test-write-dhparams.pem", "wb")); ExpectIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_SUCCESS); ExpectIntEQ(PEM_write_DHparams(fp, NULL), WC_NO_ERR_TRACE(WOLFSSL_FAILURE)); DH_free(dh); dh = NULL; dh = wolfSSL_DH_new(); ExpectIntEQ(PEM_write_DHparams(fp, dh), WC_NO_ERR_TRACE(WOLFSSL_FAILURE)); if (fp != XBADFILE) { XFCLOSE(fp); fp = XBADFILE; } wolfSSL_DH_free(dh); dh = NULL; /* check results */ XMEMSET(pem, 0, sizeof(pem)); ExpectTrue((fp = XFOPEN("./test-write-dhparams.pem", "rb")) != XBADFILE); ExpectIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); ExpectIntEQ(XMEMCMP(pem, expected, pemSz), 0); if (fp != XBADFILE) XFCLOSE(fp); #endif return EXPECT_RESULT(); } int test_wolfSSL_d2i_DHparams(void) { EXPECT_DECLS; #ifdef OPENSSL_ALL #if !defined(NO_DH) && (defined(HAVE_FFDHE_2048) || defined(HAVE_FFDHE_3072)) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) XFILE f = XBADFILE; unsigned char buf[4096]; const unsigned char* pt = buf; #ifdef HAVE_FFDHE_2048 const char* params1 = "./certs/dh2048.der"; #endif #ifdef HAVE_FFDHE_3072 const char* params2 = "./certs/dh3072.der"; #endif long len = 0; WOLFSSL_DH* dh = NULL; XMEMSET(buf, 0, sizeof(buf)); /* Test 2048 bit parameters */ #ifdef HAVE_FFDHE_2048 ExpectTrue((f = XFOPEN(params1, "rb")) != XBADFILE); ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); if (f != XBADFILE) { XFCLOSE(f); f = XBADFILE; } /* Valid case */ ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); ExpectNotNull(dh->p); ExpectNotNull(dh->g); ExpectTrue(pt == buf); ExpectIntEQ(DH_set_length(NULL, BN_num_bits(dh->p)), 0); ExpectIntEQ(DH_set_length(dh, BN_num_bits(dh->p)), 1); ExpectIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); /* Invalid cases */ ExpectNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, 10)); DH_free(dh); dh = NULL; *buf = 0; pt = buf; #endif /* HAVE_FFDHE_2048 */ /* Test 3072 bit parameters */ #ifdef HAVE_FFDHE_3072 ExpectTrue((f = XFOPEN(params2, "rb")) != XBADFILE); ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); if (f != XBADFILE) { XFCLOSE(f); f = XBADFILE; } /* Valid case */ ExpectNotNull(dh = wolfSSL_d2i_DHparams(&dh, &pt, len)); ExpectNotNull(dh->p); ExpectNotNull(dh->g); ExpectTrue(pt != buf); ExpectIntEQ(DH_generate_key(dh), 1); /* Invalid cases */ ExpectNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); DH_free(dh); dh = NULL; #endif /* HAVE_FFDHE_3072 */ #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH */ #endif return EXPECT_RESULT(); } int test_wolfSSL_DH_LoadDer(void) { EXPECT_DECLS; #if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)) && \ defined(OPENSSL_EXTRA) static const byte dh2048[] = { 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0xa1, 0x08, 0x06, 0x9c, 0x08, 0x13, 0xba, 0x59, 0x06, 0x3c, 0xbc, 0x30, 0xd5, 0xf5, 0x00, 0xc1, 0x4f, 0x44, 0xa7, 0xd6, 0xef, 0x4a, 0xc6, 0x25, 0x27, 0x1c, 0xe8, 0xd2, 0x96, 0x53, 0x0a, 0x5c, 0x91, 0xdd, 0xa2, 0xc2, 0x94, 0x84, 0xbf, 0x7d, 0xb2, 0x44, 0x9f, 0x9b, 0xd2, 0xc1, 0x8a, 0xc5, 0xbe, 0x72, 0x5c, 0xa7, 0xe7, 0x91, 0xe6, 0xd4, 0x9f, 0x73, 0x07, 0x85, 0x5b, 0x66, 0x48, 0xc7, 0x70, 0xfa, 0xb4, 0xee, 0x02, 0xc9, 0x3d, 0x9a, 0x4a, 0xda, 0x3d, 0xc1, 0x46, 0x3e, 0x19, 0x69, 0xd1, 0x17, 0x46, 0x07, 0xa3, 0x4d, 0x9f, 0x2b, 0x96, 0x17, 0x39, 0x6d, 0x30, 0x8d, 0x2a, 0xf3, 0x94, 0xd3, 0x75, 0xcf, 0xa0, 0x75, 0xe6, 0xf2, 0x92, 0x1f, 0x1a, 0x70, 0x05, 0xaa, 0x04, 0x83, 0x57, 0x30, 0xfb, 0xda, 0x76, 0x93, 0x38, 0x50, 0xe8, 0x27, 0xfd, 0x63, 0xee, 0x3c, 0xe5, 0xb7, 0xc8, 0x09, 0xae, 0x6f, 0x50, 0x35, 0x8e, 0x84, 0xce, 0x4a, 0x00, 0xe9, 0x12, 0x7e, 0x5a, 0x31, 0xd7, 0x33, 0xfc, 0x21, 0x13, 0x76, 0xcc, 0x16, 0x30, 0xdb, 0x0c, 0xfc, 0xc5, 0x62, 0xa7, 0x35, 0xb8, 0xef, 0xb7, 0xb0, 0xac, 0xc0, 0x36, 0xf6, 0xd9, 0xc9, 0x46, 0x48, 0xf9, 0x40, 0x90, 0x00, 0x2b, 0x1b, 0xaa, 0x6c, 0xe3, 0x1a, 0xc3, 0x0b, 0x03, 0x9e, 0x1b, 0xc2, 0x46, 0xe4, 0x48, 0x4e, 0x22, 0x73, 0x6f, 0xc3, 0x5f, 0xd4, 0x9a, 0xd6, 0x30, 0x07, 0x48, 0xd6, 0x8c, 0x90, 0xab, 0xd4, 0xf6, 0xf1, 0xe3, 0x48, 0xd3, 0x58, 0x4b, 0xa6, 0xb9, 0xcd, 0x29, 0xbf, 0x68, 0x1f, 0x08, 0x4b, 0x63, 0x86, 0x2f, 0x5c, 0x6b, 0xd6, 0xb6, 0x06, 0x65, 0xf7, 0xa6, 0xdc, 0x00, 0x67, 0x6b, 0xbb, 0xc3, 0xa9, 0x41, 0x83, 0xfb, 0xc7, 0xfa, 0xc8, 0xe2, 0x1e, 0x7e, 0xaf, 0x00, 0x3f, 0x93, 0x02, 0x01, 0x02 }; WOLFSSL_DH* dh = NULL; ExpectNotNull(dh = wolfSSL_DH_new()); ExpectIntEQ(wolfSSL_DH_LoadDer(NULL, NULL, 0), -1); ExpectIntEQ(wolfSSL_DH_LoadDer(dh, NULL, 0), -1); ExpectIntEQ(wolfSSL_DH_LoadDer(NULL, dh2048, sizeof(dh2048)), -1); ExpectIntEQ(wolfSSL_DH_LoadDer(dh, dh2048, sizeof(dh2048)), 1); wolfSSL_DH_free(dh); #endif return EXPECT_RESULT(); } int test_wolfSSL_i2d_DHparams(void) { EXPECT_DECLS; #ifdef OPENSSL_ALL #if !defined(NO_DH) && (defined(HAVE_FFDHE_2048) || defined(HAVE_FFDHE_3072)) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) XFILE f = XBADFILE; unsigned char buf[4096]; const unsigned char* pt; unsigned char* pt2; #ifdef HAVE_FFDHE_2048 const char* params1 = "./certs/dh2048.der"; #endif #ifdef HAVE_FFDHE_3072 const char* params2 = "./certs/dh3072.der"; #endif long len = 0; WOLFSSL_DH* dh = NULL; /* Test 2048 bit parameters */ #ifdef HAVE_FFDHE_2048 pt = buf; pt2 = buf; ExpectTrue((f = XFOPEN(params1, "rb")) != XBADFILE); ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); if (f != XBADFILE) { XFCLOSE(f); f = XBADFILE; } /* Valid case */ ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); ExpectTrue(pt == buf); ExpectIntEQ(DH_generate_key(dh), 1); ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 268); /* Invalid case */ ExpectIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); /* Return length only */ ExpectIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 268); DH_free(dh); dh = NULL; *buf = 0; #endif /* Test 3072 bit parameters */ #ifdef HAVE_FFDHE_3072 pt = buf; pt2 = buf; ExpectTrue((f = XFOPEN(params2, "rb")) != XBADFILE); ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); if (f != XBADFILE) { XFCLOSE(f); f = XBADFILE; } /* Valid case */ ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); ExpectTrue(pt == buf); ExpectIntEQ(DH_generate_key(dh), 1); ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 396); /* Invalid case */ ExpectIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); /* Return length only */ ExpectIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 396); DH_free(dh); dh = NULL; #endif dh = DH_new(); ExpectNotNull(dh); pt2 = buf; ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 0); DH_free(dh); dh = NULL; #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH && (HAVE_FFDHE_2048 || HAVE_FFDHE_3072) */ #endif return EXPECT_RESULT(); }