diff --git a/src/ssl.c b/src/ssl.c index b7e861980..f6caa5818 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -30165,6 +30165,46 @@ int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa) return ret; } + +#ifndef NO_FILESYSTEM +int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA* key) +{ + int ret = WOLFSSL_SUCCESS; + WOLFSSL_BIO* bio = NULL; + + WOLFSSL_ENTER("wolfSSL_PEM_write_RSAPublicKey"); + + if (fp == XBADFILE || key == NULL) { + WOLFSSL_MSG("Bad argument."); + ret = WOLFSSL_FAILURE; + } + + if (ret == WOLFSSL_SUCCESS) { + bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()); + if (bio == NULL) { + WOLFSSL_MSG("wolfSSL_BIO_new failed."); + ret = WOLFSSL_FAILURE; + } + else if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_BIO_set_fp failed."); + ret = WOLFSSL_FAILURE; + } + } + if (ret == WOLFSSL_SUCCESS && wolfSSL_PEM_write_bio_RSA_PUBKEY(bio, key) + != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_PEM_write_bio_RSA_PUBKEY failed."); + ret = WOLFSSL_FAILURE; + } + + if (bio != NULL) { + wolfSSL_BIO_free(bio); + } + + WOLFSSL_LEAVE("wolfSSL_PEM_write_RSAPublicKey", ret); + + return ret; +} +#endif /* !NO_FILESYSTEM */ #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */ @@ -33501,23 +33541,52 @@ int wolfSSL_ECDH_compute_key(void *out, size_t outlen, /* End ECDH */ #if !defined(NO_FILESYSTEM) + +#ifndef NO_BIO + +#ifdef WOLFSSL_KEY_GEN /* return code compliant with OpenSSL : * 1 if success, 0 if error */ -#ifndef NO_WOLFSSL_STUB -int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x) +int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY* key) { - (void)fp; - (void)x; - WOLFSSL_STUB("PEM_write_EC_PUBKEY"); - WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented"); + int ret = WOLFSSL_SUCCESS; + WOLFSSL_BIO* bio = NULL; - return WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_PEM_write_EC_PUBKEY"); + + if (fp == XBADFILE || key == NULL) { + WOLFSSL_MSG("Bad argument."); + ret = WOLFSSL_FAILURE; + } + + if (ret == WOLFSSL_SUCCESS) { + bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()); + if (bio == NULL) { + WOLFSSL_MSG("wolfSSL_BIO_new failed."); + ret = WOLFSSL_FAILURE; + } + else if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_BIO_set_fp failed."); + ret = WOLFSSL_FAILURE; + } + } + if (ret == WOLFSSL_SUCCESS && wolfSSL_PEM_write_bio_EC_PUBKEY(bio, key) + != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_PEM_write_bio_EC_PUBKEY failed."); + ret = WOLFSSL_FAILURE; + } + + if (bio != NULL) { + wolfSSL_BIO_free(bio); + } + + WOLFSSL_LEAVE("wolfSSL_PEM_write_EC_PUBKEY", ret); + + return ret; } #endif -#ifndef NO_BIO - /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects * the results to be an EC key. * @@ -34778,20 +34847,6 @@ WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x, return NULL; } #endif -/* return code compliant with OpenSSL : - * 1 if success, 0 if error - */ -#ifndef NO_WOLFSSL_STUB -int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x) -{ - (void)fp; - (void)x; - WOLFSSL_STUB("PEM_write_RSAPublicKey"); - WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented"); - - return WOLFSSL_FAILURE; -} -#endif /* return code compliant with OpenSSL : * 1 if success, 0 if error diff --git a/tests/api.c b/tests/api.c index f59f61364..76f491b7e 100644 --- a/tests/api.c +++ b/tests/api.c @@ -31664,6 +31664,12 @@ static void test_wolfSSL_PEM_bio_RSAKey(void) AssertNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); AssertIntEQ(PEM_write_bio_RSA_PUBKEY(bio, rsa), WOLFSSL_SUCCESS); BIO_free(bio); + + /* Same test as above, but with a file pointer rather than a BIO. */ + AssertIntEQ(PEM_write_RSAPublicKey(NULL, rsa), WOLFSSL_FAILURE); + AssertIntEQ(PEM_write_RSAPublicKey(stdout, NULL), WOLFSSL_FAILURE); + AssertIntEQ(PEM_write_RSAPublicKey(stdout, rsa), WOLFSSL_SUCCESS); + RSA_free(rsa); /* Ensure that keys beginning with BEGIN RSA PUBLIC KEY can be read, too. */ @@ -31810,6 +31816,12 @@ static void test_wolfSSL_PEM_bio_ECKey(void) AssertNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); AssertIntEQ(PEM_write_bio_EC_PUBKEY(bio, ec), WOLFSSL_SUCCESS); BIO_free(bio); + + /* Same test as above, but with a file pointer rather than a BIO. */ + AssertIntEQ(PEM_write_EC_PUBKEY(NULL, ec), WOLFSSL_FAILURE); + AssertIntEQ(PEM_write_EC_PUBKEY(stdout, NULL), WOLFSSL_FAILURE); + AssertIntEQ(PEM_write_EC_PUBKEY(stdout, ec), WOLFSSL_SUCCESS); + EC_KEY_free(ec); #ifndef NO_RSA diff --git a/wolfssl/openssl/pem.h b/wolfssl/openssl/pem.h index 079faa08f..946e6ff7c 100644 --- a/wolfssl/openssl/pem.h +++ b/wolfssl/openssl/pem.h @@ -77,7 +77,7 @@ WOLFSSL_API WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x, wc_pem_password_cb *cb, void *u); WOLFSSL_API -int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x); +int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA* key); WOLFSSL_API int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x); @@ -147,7 +147,7 @@ int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *key, unsigned char *kstr, int klen, wc_pem_password_cb *cb, void *u); WOLFSSL_API -int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *key); +int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY* key); WOLFSSL_API WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,