diff --git a/src/ssl.c b/src/ssl.c index 55ffc0b6d..366472e00 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -8073,13 +8073,16 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, DhKey dh; word32 keyIdx = 0; DhKey* key = NULL; - + int ret; + Element_Set elements; /* test if DH-public key */ if (wc_InitDhKey(&dh) != 0) return NULL; - if (wc_DhPublicKeyDecode(mem, &keyIdx, &dh, (word32)memSz) == 0) { - wc_FreeDhKey(&dh); + ret = wc_DhPublicKeyDecode(mem, &keyIdx, &dh, (word32)memSz); + wc_FreeDhKey(&dh); + + if (ret == 0) { pkey = wolfSSL_EVP_PKEY_new(); if (pkey != NULL) { pkey->type = EVP_PKEY_DH; @@ -8106,6 +8109,12 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, keyIdx = 0; if (wc_DhPublicKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0) { + elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | ELEMENT_PUB; + if( SetDhExternal_ex(pkey->dh, elements) + == WOLFSSL_SUCCESS ){ + return pkey; + } + /* if (SetIndividualExternal(&(pkey->dh->p), &key->p) == WOLFSSL_SUCCESS && SetIndividualExternal(&(pkey->dh->g), &key->g) @@ -8115,17 +8124,14 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, SetIndividualExternal(&(pkey->dh->pub_key), &key->pub) == WOLFSSL_SUCCESS) { return pkey; - } + } */ } else { wolfSSL_EVP_PKEY_free(pkey); return NULL; } } - wolfSSL_EVP_PKEY_free(pkey); } - else - wc_FreeDhKey(&dh); } #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */ @@ -33354,7 +33360,7 @@ int SetDhInternal(WOLFSSL_DH* dh) } #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) \ - || defined(WOLFSSL_OPENSSH)) + || defined(WOLFSSL_OPENSSH)) || defined(OPENSSL_EXTRA) #ifdef WOLFSSL_DH_EXTRA WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh) @@ -33398,10 +33404,10 @@ WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh) /* Set the members of DhKey into WOLFSSL_DH * DhKey was populated from wc_DhKeyDecode */ -int SetDhExternal(WOLFSSL_DH *dh) +int SetDhExternal_ex(WOLFSSL_DH *dh, Element_Set elm) { DhKey *key; - WOLFSSL_MSG("Entering SetDhExternal"); + WOLFSSL_MSG("Entering SetDhExternal_ex"); if (dh == NULL || dh->internal == NULL) { WOLFSSL_MSG("dh key NULL error"); @@ -33410,25 +33416,36 @@ int SetDhExternal(WOLFSSL_DH *dh) key = (DhKey*)dh->internal; - if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("dh param p error"); - return WOLFSSL_FATAL_ERROR; + if( elm & ELEMENT_P) { + if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("dh param p error"); + return WOLFSSL_FATAL_ERROR; + } } - - if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("dh param g error"); - return WOLFSSL_FATAL_ERROR; + if( elm & ELEMENT_Q) { + if (SetIndividualExternal(&dh->q, &key->q) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("dh param q error"); + return WOLFSSL_FATAL_ERROR; + } + } + if( elm & ELEMENT_G) { + if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("dh param g error"); + return WOLFSSL_FATAL_ERROR; + } } - #ifdef WOLFSSL_DH_EXTRA - if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("No DH Private Key"); - return WOLFSSL_FATAL_ERROR; + if( elm & ELEMENT_PRV) { + if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("No DH Private Key"); + return WOLFSSL_FATAL_ERROR; + } } - - if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("No DH Public Key"); - return WOLFSSL_FATAL_ERROR; + if( elm & ELEMENT_PUB) { + if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("No DH Public Key"); + return WOLFSSL_FATAL_ERROR; + } } #endif /* WOLFSSL_DH_EXTRA */ @@ -33436,6 +33453,20 @@ int SetDhExternal(WOLFSSL_DH *dh) return WOLFSSL_SUCCESS; } +/* Set the members of DhKey into WOLFSSL_DH + * DhKey was populated from wc_DhKeyDecode + */ +int SetDhExternal(WOLFSSL_DH *dh) +{ + Element_Set elements = ELEMENT_P | ELEMENT_G; + WOLFSSL_MSG("Entering SetDhExternal"); + +#ifdef WOLFSSL_DH_EXTRA + elements |= ( ELEMENT_PUB | ELEMENT_PRV ); +#endif /* WOLFSSL_DH_EXTRA */ + + return SetDhExternal_ex(dh, elements); +} #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ /* return code compliant with OpenSSL : diff --git a/tests/api.c b/tests/api.c index 2f4e7eb4d..bcfd0f171 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2604,8 +2604,10 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) WOLFSSL_BIO* wbio = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; char line[256] = { 0 }; + char line1[256] = { 0 }; int i; + (void)line1; printf(testingFmt, "EVP_PKEY_print_public()"); /* test error cases */ AssertIntEQ( EVP_PKEY_print_public(NULL,NULL,0,NULL),0L); @@ -2629,19 +2631,16 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) AssertIntEQ(EVP_PKEY_print_public(wbio, pkey,3,NULL),1); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, " RSA Public-Key: (1024 bit)\n", - sizeof(" RSA Public-Key: (1024 bit)\n")),0); - + strcpy(line1, " RSA Public-Key: (1024 bit)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, " Modulus:\n", - sizeof(" Modulus:\n")),0); - + strcpy(line1, " Modulus:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - " 00:BC:73:0E:A8:49:F3:74:A2:A9:EF:18:A5:DA:55:\n", - sizeof(" 00:BC:73:0E:A8:49:F3:74:A2:A9:EF:18:A5:DA:55:\n")),0); + strcpy(line1, " 00:BC:73:0E:A8:49:F3:74:A2:A9:EF:18:A5:DA:55:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of modulus element*/ @@ -2650,8 +2649,8 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, " Exponent: 65537 (0x010001)\n", - sizeof(" Exponent: 65537 (0x010001)\n")),0); + strcpy(line1, " Exponent: 65537 (0x010001)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* should reach EOF */ @@ -2683,17 +2682,17 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) AssertIntEQ(EVP_PKEY_print_public(wbio, pkey,0,NULL),1); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "DSA Public-Key: (2048 bit)\n", - sizeof("DSA Public-Key: (2048 bit)\n")),0); + strcpy(line1, "DSA Public-Key: (2048 bit)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "pub:\n", - sizeof("pub:\n")),0); + strcpy(line1, "pub:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - " 00:C2:35:2D:EC:83:83:6C:73:13:9E:52:7C:74:C8:\n", - sizeof(" 00:C2:35:2D:EC:83:83:6C:73:13:9E:52:7C:74:C8:\n")),0); + strcpy(line1, + " 00:C2:35:2D:EC:83:83:6C:73:13:9E:52:7C:74:C8:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of pub element*/ for( i = 0; i < 17 ;i++) { @@ -2701,9 +2700,8 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - "P:\n", - sizeof("P:\n")),0); + strcpy(line1, "P:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of P element*/ for( i = 0; i < 18 ;i++) { @@ -2711,18 +2709,16 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - "Q:\n", - sizeof("Q:\n")),0); + strcpy(line1, "Q:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of Q element*/ for( i = 0; i < 3 ;i++) { BIO_gets(wbio, line, sizeof(line)); } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - "G:\n", - sizeof("G:\n")),0); + strcpy(line1, "G:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of G element*/ for( i = 0; i < 18 ;i++) { @@ -2758,17 +2754,17 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) AssertIntEQ(EVP_PKEY_print_public(wbio, pkey,0,NULL),1); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "Public-Key: (256 bit)\n", - sizeof("Public-Key: (256 bit)\n")),0); + strcpy(line1, "Public-Key: (256 bit)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "pub:\n", - sizeof("pub:\n")),0); + strcpy(line1, "pub:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - " 04:55:BF:F4:0F:44:50:9A:3D:CE:9B:B7:F0:C5:4D:\n", - sizeof(" 04:55:BF:F4:0F:44:50:9A:3D:CE:9B:B7:F0:C5:4D:\n")),0); + strcpy(line1, + " 04:55:BF:F4:0F:44:50:9A:3D:CE:9B:B7:F0:C5:4D:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of pub element*/ for( i = 0; i < 4 ;i++) { @@ -2776,12 +2772,12 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "ASN1 OID: prime256v1\n", - sizeof("ASN1 OID: prime256v1\n")),0); + strcpy(line1, "ASN1 OID: prime256v1\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "NIST CURVE: P-256\n", - sizeof("NIST CURVE: P-256")),0); + strcpy(line1, "NIST CURVE: P-256\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* should reach EOF */ @@ -2814,17 +2810,17 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) AssertIntEQ(EVP_PKEY_print_public(wbio, pkey,0,NULL),1); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "DH Public-Key: (2048 bit)\n", - sizeof("DH Public-Key: (2048 bit)\n")),0); + strcpy(line1, "DH Public-Key: (2048 bit)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, "public-key:\n", - sizeof("public-key:\n")),0); + strcpy(line1, "public-key:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - " 34:41:BF:E9:F2:11:BF:05:DB:B2:72:A8:29:CC:BD:\n", - sizeof(" 34:41:BF:E9:F2:11:BF:05:DB:B2:72:A8:29:CC:BD:\n")),0); + strcpy(line1, + " 34:41:BF:E9:F2:11:BF:05:DB:B2:72:A8:29:CC:BD:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of public-key element*/ for( i = 0; i < 17 ;i++) { @@ -2832,14 +2828,13 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - "prime:\n", - sizeof("prime:\n")),0); + strcpy(line1, "prime:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - " 00:D3:B2:99:84:5C:0A:4C:E7:37:CC:FC:18:37:01:\n", - sizeof(" 00:D3:B2:99:84:5C:0A:4C:E7:37:CC:FC:18:37:01:\n")),0); + strcpy(line1, + " 00:D3:B2:99:84:5C:0A:4C:E7:37:CC:FC:18:37:01:\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* skip to the end of prime element*/ for( i = 0; i < 17 ;i++) { @@ -2847,9 +2842,8 @@ static void test_wolfSSL_EVP_PKEY_print_public(void) } BIO_gets(wbio, line, sizeof(line)); - AssertIntEQ(XSTRNCMP( line, - "generator: 2 (0x02)\n", - sizeof("generator: 2 (0x02)\n")),0); + strcpy(line1, "generator: 2 (0x02)\n"); + AssertIntEQ(XSTRNCMP( line, line1, strlen(line1)), 0); /* should reach EOF */ AssertIntLE(BIO_gets(wbio, line, sizeof(line)) ,0); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 9b3870649..4af4ac572 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4819,6 +4819,15 @@ WOLFSSL_LOCAL int SetDsaExternal(WOLFSSL_DSA* dsa); WOLFSSL_LOCAL int SetRsaExternal(WOLFSSL_RSA* rsa); WOLFSSL_LOCAL int SetRsaInternal(WOLFSSL_RSA* rsa); #endif + +typedef enum elem_set { + ELEMENT_P = 0x01, + ELEMENT_Q = 0x02, + ELEMENT_G = 0x04, + ELEMENT_PUB = 0x08, + ELEMENT_PRV = 0x0A, +} Element_Set; +WOLFSSL_LOCAL int SetDhExternal_ex(WOLFSSL_DH *dh, Element_Set elm ); WOLFSSL_LOCAL int SetDhInternal(WOLFSSL_DH* dh); WOLFSSL_LOCAL int SetDhExternal(WOLFSSL_DH *dh); diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index ecee6b6a7..1376de168 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -376,7 +376,7 @@ struct WOLFSSL_EVP_PKEY_CTX { typedef struct WOLFSSL_ASN1_PCTX { int dummy; -}WOLFSSL_ASN1_PCTX; +} WOLFSSL_ASN1_PCTX; typedef int WOLFSSL_ENGINE ; typedef WOLFSSL_ENGINE ENGINE;