Skip to content

Commit ab460b0

Browse files
committed
Fix DH PKI decode handling
1 parent eeab709 commit ab460b0

File tree

4 files changed

+136
-4
lines changed

4 files changed

+136
-4
lines changed

src/wp_dh_kmgmt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,14 +2121,14 @@ static int wp_dh_decode(wp_DhEncDecCtx* ctx, OSSL_CORE_BIO *cBio,
21212121
ok = 0;
21222122
}
21232123
if (ok && (ctx->format == WP_ENC_FORMAT_TYPE_SPECIFIC)) {
2124-
if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) {
2125-
if (!wp_dh_decode_params(dh, data, len)) {
2124+
if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0){
2125+
if (!wp_dh_decode_pki(dh, data, len)) {
21262126
ok = 0;
21272127
decoded = 0;
21282128
}
21292129
}
21302130
else {
2131-
if (!wp_dh_decode_pki(dh, data, len)) {
2131+
if (!wp_dh_decode_params(dh, data, len)) {
21322132
ok = 0;
21332133
decoded = 0;
21342134
}

test/test_dh.c

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,57 @@
2222

2323
#ifdef WP_HAVE_DH
2424

25+
/* dh pkcs8 private key der */
26+
static const unsigned char dh_der[] = {
27+
0x30, 0x82, 0x02, 0x26, 0x02, 0x01, 0x00, 0x30, 0x82, 0x01, 0x17, 0x06,
28+
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x03, 0x01, 0x30, 0x82,
29+
0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xBA, 0x58, 0x07, 0x7D, 0xB2,
30+
0x45, 0x41, 0x40, 0xF7, 0x72, 0xDF, 0x98, 0x98, 0x51, 0x7D, 0xBE, 0x17,
31+
0xE3, 0xD0, 0xB6, 0xCA, 0x38, 0xC3, 0x65, 0x7F, 0xE2, 0x13, 0xC1, 0x42,
32+
0x1A, 0x7A, 0x94, 0x2B, 0xB5, 0x58, 0xC0, 0x39, 0xD4, 0xB8, 0x41, 0xFD,
33+
0x21, 0xCF, 0xE3, 0x9C, 0x17, 0xB9, 0x8D, 0x34, 0x1A, 0x98, 0x81, 0xAF,
34+
0xAE, 0x19, 0xD5, 0x01, 0x9F, 0xD3, 0x29, 0xD1, 0x29, 0xEF, 0xDD, 0x73,
35+
0x4B, 0xF4, 0xEB, 0x87, 0xAC, 0xF3, 0xF9, 0xBD, 0x8B, 0xD5, 0xAD, 0x20,
36+
0xE4, 0xEB, 0x6C, 0x99, 0xDE, 0x40, 0x76, 0xF3, 0x18, 0x41, 0x85, 0xE9,
37+
0x1D, 0xFE, 0x8C, 0xEA, 0x5B, 0xAD, 0xB4, 0x11, 0xCA, 0x0D, 0x22, 0x0C,
38+
0xD7, 0x06, 0xAD, 0x06, 0x59, 0xFB, 0x1B, 0x61, 0xEB, 0xF4, 0x1B, 0xCA,
39+
0x6E, 0x8C, 0x0F, 0x92, 0x8D, 0xF3, 0x80, 0x1B, 0x4A, 0xAF, 0xF2, 0x9E,
40+
0x3F, 0x60, 0xFD, 0xB1, 0x49, 0x6D, 0xCA, 0x0B, 0xD4, 0x99, 0x3B, 0x45,
41+
0xA5, 0xB1, 0xED, 0xA1, 0xB7, 0x94, 0xD0, 0x33, 0xA5, 0x21, 0xEB, 0x29,
42+
0xC2, 0xEB, 0xFB, 0x5C, 0x1A, 0xD5, 0xAF, 0xC4, 0xC9, 0x02, 0xCD, 0x7A,
43+
0xEB, 0xB4, 0xC5, 0x7B, 0x34, 0xBD, 0x2F, 0x4F, 0xA0, 0xC4, 0x63, 0x6A,
44+
0xFE, 0x98, 0xD0, 0x83, 0xFA, 0xEF, 0x6F, 0xAF, 0xA8, 0x4B, 0x46, 0x59,
45+
0x77, 0xCA, 0xC5, 0x19, 0xDA, 0x8A, 0x77, 0xC6, 0x56, 0x08, 0xD6, 0x0A,
46+
0xAD, 0xFC, 0x04, 0x35, 0xFA, 0xDA, 0xAA, 0x08, 0x42, 0x1B, 0x48, 0xE8,
47+
0x42, 0x3C, 0x4F, 0x31, 0xA2, 0x22, 0xE9, 0xF3, 0x0F, 0xD7, 0x06, 0xCB,
48+
0x08, 0x54, 0x7C, 0x2C, 0xEA, 0x38, 0x11, 0x2B, 0x53, 0x7C, 0xE5, 0x86,
49+
0xC9, 0x74, 0xB9, 0x98, 0x68, 0x6D, 0xE4, 0xF0, 0x7A, 0x2B, 0xE5, 0xB9,
50+
0x4E, 0xAD, 0xD1, 0x34, 0xC7, 0x4C, 0xFE, 0x1A, 0x7C, 0x8A, 0x37, 0x02,
51+
0x01, 0x02, 0x04, 0x82, 0x01, 0x04, 0x02, 0x82, 0x01, 0x00, 0x45, 0xED,
52+
0x6E, 0x18, 0x44, 0x8F, 0xA0, 0x43, 0x04, 0xF7, 0xE0, 0x5E, 0x98, 0x23,
53+
0xFB, 0xE8, 0xDA, 0x49, 0x7E, 0x2A, 0x11, 0xEC, 0xD0, 0xCD, 0xB7, 0x13,
54+
0xE1, 0x11, 0xCB, 0xDA, 0x00, 0x34, 0x13, 0x16, 0x5A, 0xB5, 0xEA, 0x2D,
55+
0xCC, 0xAB, 0x0D, 0xE1, 0x75, 0x5D, 0xCA, 0xBC, 0x1E, 0xBD, 0x5D, 0x01,
56+
0xB4, 0xC3, 0xCA, 0x78, 0xDF, 0x4C, 0x4F, 0x1B, 0x21, 0x40, 0x8A, 0x64,
57+
0x7F, 0x4B, 0x45, 0xE3, 0x7F, 0x43, 0xD7, 0xFD, 0x4E, 0xA0, 0xA1, 0x4A,
58+
0x1C, 0x5A, 0x8D, 0x87, 0x7E, 0x5A, 0xB5, 0x26, 0x1A, 0xDC, 0x9B, 0xDD,
59+
0xD1, 0x8D, 0xD0, 0xBB, 0x45, 0x0F, 0x67, 0x41, 0xC1, 0xC0, 0xA5, 0x7B,
60+
0x6A, 0x35, 0x51, 0x06, 0x14, 0xC7, 0x61, 0x0D, 0xF7, 0x01, 0x30, 0x0A,
61+
0xB5, 0x07, 0xF6, 0x8F, 0x76, 0xCF, 0x99, 0x1F, 0xAF, 0x2C, 0x66, 0x20,
62+
0xB4, 0x69, 0x0A, 0xC3, 0x04, 0x76, 0x1B, 0xF4, 0x0D, 0x7C, 0x54, 0x0A,
63+
0xB8, 0xF6, 0xF8, 0x35, 0x17, 0x81, 0xDD, 0x6E, 0xCE, 0x17, 0xBD, 0x00,
64+
0x9C, 0x5D, 0x3F, 0x37, 0x37, 0xC4, 0x58, 0xBC, 0xA5, 0xB3, 0xD3, 0x0F,
65+
0x98, 0x0F, 0x6C, 0x0C, 0x78, 0x53, 0x92, 0x36, 0x94, 0x4D, 0xF5, 0x7D,
66+
0x1A, 0xD8, 0xC6, 0x54, 0x0A, 0xED, 0x79, 0xAA, 0xAC, 0x4F, 0xFF, 0x2B,
67+
0x41, 0xC6, 0x41, 0x7A, 0x4D, 0xBC, 0xB0, 0x43, 0xF9, 0x22, 0x33, 0xD4,
68+
0xAA, 0x43, 0x75, 0xAD, 0x97, 0xAB, 0xE8, 0xCC, 0x57, 0xFA, 0x0D, 0x48,
69+
0x08, 0x44, 0x99, 0x6A, 0x9D, 0x14, 0x14, 0x4D, 0x32, 0x00, 0x3E, 0x8A,
70+
0x82, 0x30, 0xB1, 0x85, 0x3E, 0xD2, 0xD3, 0x8C, 0xEF, 0x73, 0x72, 0x56,
71+
0x28, 0xF5, 0xBA, 0x2F, 0x85, 0x45, 0x46, 0xD1, 0xED, 0x42, 0x2E, 0x9A,
72+
0xAE, 0x4F, 0x41, 0x5B, 0xBD, 0x9C, 0xF9, 0x58, 0x8D, 0xFA, 0x13, 0xB4,
73+
0xDF, 0x31,
74+
};
75+
2576
/* dh1024 p */
2677
static const unsigned char dh_p[] =
2778
{
@@ -55,7 +106,7 @@ static int test_dh_pkey_keygen(EVP_PKEY *params)
55106
unsigned char *secretWolfProvider = NULL;
56107
size_t secretLenWolfProvider = 0;
57108

58-
PRINT_MSG("Generate DH key pair with OpenSSL and params from "
109+
PRINT_MSG("Generate DH key pair with WolfSSL and params from "
59110
"wolfProvider");
60111
ctx = EVP_PKEY_CTX_new_from_pkey(wpLibCtx, params, NULL);
61112
err = ctx == NULL;
@@ -217,4 +268,83 @@ int test_dh_pkey(void *data)
217268
return err;
218269
}
219270

271+
int test_dh_decode(void *data)
272+
{
273+
int err = 0;
274+
const unsigned char *p = NULL;
275+
int len = 0;
276+
PKCS8_PRIV_KEY_INFO* p8inf = NULL;
277+
EVP_PKEY* pkey1 = NULL;
278+
DH *dh1 = NULL;
279+
const BIGNUM *p1 = NULL;
280+
const BIGNUM *g1 = NULL;
281+
const BIGNUM *priv1 = NULL;
282+
const BIGNUM *pub1 = NULL;
283+
EVP_PKEY* pkey2 = NULL;
284+
DH *dh2 = NULL;
285+
const BIGNUM *p2 = NULL;
286+
const BIGNUM *g2 = NULL;
287+
const BIGNUM *priv2 = NULL;
288+
const BIGNUM *pub2 = NULL;
289+
290+
(void)data;
291+
292+
p = &dh_der[0];
293+
len = sizeof(dh_der);
294+
p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, (const unsigned char **)&p, len);
295+
err = p8inf == NULL;
296+
297+
if (err == 0) {
298+
PRINT_MSG("Decode with OpenSSL and Wolfprovider");
299+
pkey1 = EVP_PKCS82PKEY_ex(p8inf, osslLibCtx, NULL);
300+
pkey2 = EVP_PKCS82PKEY_ex(p8inf, wpLibCtx, NULL);
301+
PKCS8_PRIV_KEY_INFO_free(p8inf);
302+
err = (pkey1 == NULL || pkey2 == NULL);
303+
}
304+
305+
if (err == 0) {
306+
dh1 = EVP_PKEY_get1_DH(pkey1);
307+
dh2 = EVP_PKEY_get1_DH(pkey2);
308+
err = (dh1 == NULL || dh2 == NULL);
309+
}
310+
311+
if (err == 0) {
312+
DH_get0_pqg(dh1, &p1, NULL, &g1);
313+
err = (p1 == NULL || g1 == NULL);
314+
}
315+
if (err == 0) {
316+
DH_get0_pqg(dh2, &p2, NULL, &g2);
317+
err = (p2 == NULL || g2 == NULL);
318+
}
319+
320+
if (err == 0) {
321+
DH_get0_key(dh1, &pub1, &priv1);
322+
err = (pub1 == NULL || priv1 == NULL);
323+
}
324+
if (err == 0) {
325+
DH_get0_key(dh2, &pub2, &priv2);
326+
err = (pub2 == NULL || priv2 == NULL);
327+
}
328+
329+
if (err == 0) {
330+
err = BN_cmp(p1, p2) != 0;
331+
}
332+
if (err == 0) {
333+
err = BN_cmp(g1, g2) != 0;
334+
}
335+
if (err == 0) {
336+
err = BN_cmp(priv1, priv2) != 0;
337+
}
338+
if (err == 0) {
339+
err = BN_cmp(pub1, pub2) != 0;
340+
}
341+
342+
DH_free(dh1);
343+
DH_free(dh2);
344+
EVP_PKEY_free(pkey1);
345+
EVP_PKEY_free(pkey2);
346+
347+
return err;
348+
}
349+
220350
#endif /* WP_HAVE_DH */

test/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ TEST_CASE test_case[] = {
150150
#ifdef WP_HAVE_DH
151151
TEST_DECL(test_dh_pgen_pkey, NULL),
152152
TEST_DECL(test_dh_pkey, NULL),
153+
TEST_DECL(test_dh_decode, NULL),
153154
#endif /* WP_HAVE_DH */
154155
#ifdef WP_HAVE_RSA
155156
TEST_DECL(test_rsa_sign_sha1, NULL),

test/unit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ int test_rsa_load_cert(void* data);
248248
#ifdef WP_HAVE_DH
249249
int test_dh_pgen_pkey(void *data);
250250
int test_dh_pkey(void *data);
251+
int test_dh_decode(void *data);
251252
#endif /* WP_HAVE_DH */
252253

253254
#ifdef WP_HAVE_ECC

0 commit comments

Comments
 (0)