Add wolfSSL_PEM_write_RSAPublicKey and wolfSSL_PEM_write_EC_PUBKEY.

These were compatibility layer stubs before.
This commit is contained in:
Hayden Roche
2022-04-14 10:17:10 -07:00
parent 947c72937f
commit d7085069d6
3 changed files with 92 additions and 25 deletions

101
src/ssl.c
View File

@ -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

View File

@ -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

View File

@ -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,