This commit is contained in:
Juliusz Sosinowicz
2021-06-07 15:37:58 +02:00
parent 06ebcca913
commit 69948b3648
2 changed files with 169 additions and 125 deletions

View File

@@ -32057,7 +32057,8 @@ int wolfSSL_RSA_set0_crt_params(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *dmp1,
r->iqmp = iqmp; r->iqmp = iqmp;
} }
return WOLFSSL_SUCCESS; return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
} }
void wolfSSL_RSA_get0_factors(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **p, void wolfSSL_RSA_get0_factors(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **p,
@@ -32099,7 +32100,8 @@ int wolfSSL_RSA_set0_factors(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *p, WOLFSSL_BIGNUM *
r->q = q; r->q = q;
} }
return WOLFSSL_SUCCESS; return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
} }
void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n, void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
@@ -33842,7 +33844,8 @@ int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
} }
/* private key */ /* private key */
key->type = ECC_PRIVATEKEY; if (!mp_iszero(&key->k))
key->type = ECC_PRIVATEKEY;
} }
eckey->inSet = 1; eckey->inSet = 1;
@@ -37908,7 +37911,7 @@ void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
int wolfSSL_RSA_test_flags(const WOLFSSL_RSA *r, int flags) int wolfSSL_RSA_test_flags(const WOLFSSL_RSA *r, int flags)
{ {
return r ? r->meth->flags & flags : 0; return r && r->meth ? r->meth->flags & flags : 0;
} }
#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
@@ -38014,7 +38017,8 @@ int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
r->d = d; r->d = d;
} }
return 1; return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
} }
#endif /* OPENSSL_EXTRA */ #endif /* OPENSSL_EXTRA */
#endif /* NO_RSA */ #endif /* NO_RSA */
@@ -38141,6 +38145,15 @@ int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal, ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
derSz); derSz);
} }
if (ret < 0 && opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
/* Might be in PKCS8 format so let's try */
idx = 0;
ret = ToTraditionalInline(derBuf, &idx, (word32)derSz);
if (ret > 0) {
ret = wc_EccPrivateKeyDecode(derBuf, &idx,
(ecc_key*)key->internal, derSz);
}
}
if (ret < 0) { if (ret < 0) {
if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) { if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
WOLFSSL_MSG("wc_EccPrivateKeyDecode failed"); WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
@@ -48134,14 +48147,18 @@ int SetRsaInternal(WOLFSSL_RSA* rsa)
key = (RsaKey*)rsa->internal; key = (RsaKey*)rsa->internal;
if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) { if (rsa->n != NULL) {
WOLFSSL_MSG("rsa n key error"); if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
return WOLFSSL_FATAL_ERROR; WOLFSSL_MSG("rsa n key error");
return WOLFSSL_FATAL_ERROR;
}
} }
if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) { if (rsa->e != NULL) {
WOLFSSL_MSG("rsa e key error"); if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
return WOLFSSL_FATAL_ERROR; WOLFSSL_MSG("rsa e key error");
return WOLFSSL_FATAL_ERROR;
}
} }
/* public key */ /* public key */

View File

@@ -6060,48 +6060,123 @@ const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id)
} }
#ifndef NO_RSA #ifndef NO_RSA
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey) #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA)
static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey)
{ {
if (!pkey) { int ret = 0;
return NULL; int derSz = 0;
} word32 pkcs8Sz = 0;
return pkey->rsa; byte* derBuf = NULL;
} RsaKey* rsa = NULL;
WOLFSSL_RSA *key = NULL;
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* key) if (pkey == NULL || pkey->rsa == NULL || pkey->rsa->internal == NULL) {
{ WOLFSSL_MSG("bad parameter");
WOLFSSL_RSA* local; return WOLFSSL_FAILURE;
WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
if (key == NULL) {
return NULL;
} }
local = wolfSSL_RSA_new(); key = pkey->rsa;
if (local == NULL) { rsa = (RsaKey*)pkey->rsa->internal;
WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
return NULL;
}
if (key->type == EVP_PKEY_RSA) { /* Get DER size */
if (wolfSSL_RSA_LoadDer(local, (const unsigned char*)key->pkey.ptr, if (rsa->type == RSA_PRIVATE) {
key->pkey_sz) != SSL_SUCCESS) { ret = wc_RsaKeyToDer(rsa, NULL, 0);
/* now try public key */ if (ret > 0) {
if (wolfSSL_RSA_LoadDer_ex(local, derSz = ret;
(const unsigned char*)key->pkey.ptr, key->pkey_sz, #ifdef HAVE_PKCS8
WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) { if (key->pkcs8HeaderSz) {
wolfSSL_RSA_free(local); ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, derSz,
local = NULL; RSAk, NULL, 0);
if (ret == LENGTH_ONLY_E)
ret = 0;
} }
#endif
} }
} }
else { else {
WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an RSA key"); ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
wolfSSL_RSA_free(local); if (ret > 0)
local = NULL; derSz = ret;
} }
return local;
if (derSz == 0 || ret < 0) {
WOLFSSL_MSG("Error getting RSA DER size");
return WOLFSSL_FAILURE;
}
derBuf = (byte*)XREALLOC(pkey->pkey.ptr, derSz,
pkey->heap, DYNAMIC_TYPE_DER);
if (derBuf == NULL) {
WOLFSSL_MSG("EVP_PKEY_set1_RSA malloc failed");
return WOLFSSL_FAILURE;
}
/* Old pointer is invalid from this point on */
pkey->pkey.ptr = (char*)derBuf;
if (rsa->type == RSA_PRIVATE) {
ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
if (ret > 0) {
derSz = ret;
#ifdef HAVE_PKCS8
if (key->pkcs8HeaderSz) {
byte* keyBuf = derBuf;
int keySz = derSz;
derSz = pkcs8Sz;
/* Need new buffer for PKCS8 since we can't
* do this in-place */
derBuf = (byte*)XMALLOC(pkcs8Sz, pkey->heap,
DYNAMIC_TYPE_DER);
if (derBuf != NULL) {
ret = wc_CreatePKCS8Key(derBuf, (word32*)&derSz, keyBuf,
keySz, RSAk, NULL, 0);
XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
pkey->pkey.ptr = (char*)derBuf;
}
else
ret = MEMORY_E;
}
#endif
}
}
else {
/* Public key to DER */
ret = wc_RsaKeyToPublicDer(rsa, derBuf, derSz);
if (ret > 0)
derSz = ret;
}
if (ret < 0) {
WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
return WOLFSSL_FAILURE;
}
else {
pkey->pkey_sz = derSz;
return WOLFSSL_SUCCESS;
}
}
#endif
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey)
{
WOLFSSL_MSG("wolfSSL_EVP_PKEY_get0_RSA");
if (pkey == NULL)
return NULL;
return pkey->rsa;
}
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* pkey)
{
WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
if (pkey == NULL || pkey->rsa == NULL)
return NULL;
if (wolfSSL_RSA_up_ref(pkey->rsa) != WOLFSSL_SUCCESS)
return NULL;
return pkey->rsa;
} }
/* with set1 functions the pkey struct does not own the RSA structure /* with set1 functions the pkey struct does not own the RSA structure
@@ -6110,13 +6185,6 @@ WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* key)
*/ */
int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key) int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
{ {
#if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(HAVE_USER_RSA)
int ret;
int derSz = 0;
int pkcs8Sz = 0;
byte* derBuf = NULL;
RsaKey* rsa = NULL;
#endif
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA"); WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA");
if (pkey == NULL || key == NULL) if (pkey == NULL || key == NULL)
return WOLFSSL_FAILURE; return WOLFSSL_FAILURE;
@@ -6140,82 +6208,12 @@ int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
} }
} }
#if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(HAVE_USER_RSA) #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA)
rsa = (RsaKey*)key->internal; if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) {
WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
/* Get DER size */
derSz = 0;
if (rsa->type == RSA_PRIVATE) {
ret = wc_RsaKeyToDer(rsa, NULL, 0);
if (ret > 0) {
derSz = ret;
#ifdef HAVE_PKCS8
if (key->pkcs8HeaderSz) {
ret = wc_CreatePKCS8Key(NULL, (word32*)&pkcs8Sz, NULL, derSz,
RSAk, NULL, 0);
if (ret == LENGTH_ONLY_E) ret = 0;
}
#endif
}
}
else {
ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
if (ret > 0)
derSz = ret;
}
if (ret >= 0 && derSz >= 0) {
derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER);
if (derBuf == NULL) {
WOLFSSL_MSG("EVP_PKEY_set1_RSA malloc failed");
return WOLFSSL_FAILURE;
}
if (rsa->type == RSA_PRIVATE) {
ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
if (ret > 0) {
derSz = ret;
#ifdef HAVE_PKCS8
if (key->pkcs8HeaderSz) {
byte* keyBuf = derBuf;
int keySz = derSz;
derSz = pkcs8Sz;
derBuf = (byte*)XMALLOC(pkcs8Sz, pkey->heap,
DYNAMIC_TYPE_DER);
if (derBuf == NULL)
ret = MEMORY_E;
else {
ret = wc_CreatePKCS8Key(derBuf, (word32*)&derSz, keyBuf,
keySz, RSAk, NULL, 0);
}
XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
}
#endif
}
}
else {
/* Public key to DER */
ret = wc_RsaKeyToPublicDer(rsa, derBuf, derSz);
if (ret > 0)
derSz = ret;
}
}
if (ret < 0) {
if (rsa->type == RSA_PRIVATE) {
WOLFSSL_MSG("EVP_PKEY_set1_RSA private failed");
}
else {
WOLFSSL_MSG("EVP_PKEY_set1_RSA public failed");
}
if (derBuf)
XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_DER);
return WOLFSSL_FAILURE; return WOLFSSL_FAILURE;
} }
#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */
pkey->pkey.ptr = (char*)derBuf;
pkey->pkey_sz = derSz;
#endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !HAVE_USER_RSA */
#ifdef WC_RSA_BLINDING #ifdef WC_RSA_BLINDING
if (key->ownRng == 0) { if (key->ownRng == 0) {
@@ -6565,6 +6563,7 @@ int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key)
/* try and populate public pkey_sz and pkey.ptr */ /* try and populate public pkey_sz and pkey.ptr */
static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key) static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
{ {
<<<<<<< master
int derSz = 0; int derSz = 0;
ecc_key* ecc; ecc_key* ecc;
@@ -6588,11 +6587,24 @@ static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
} }
else { else {
XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL); XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
=======
word32 derSz = 0;
byte* derBuf = NULL;
if (!pkey || !ecc)
return WOLFSSL_FAILURE;
if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) {
if (wc_EccKeyToPKCS8(ecc, NULL, &derSz) == LENGTH_ONLY_E) {
derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
if (derBuf != NULL) {
if (wc_EccKeyToPKCS8(ecc, derBuf, &derSz) < 0) {
XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
>>>>>>> WIP
derBuf = NULL; derBuf = NULL;
} }
} }
} }
} }
<<<<<<< master
else { else {
/* if not, the pkey will be traditional ecc key */ /* if not, the pkey will be traditional ecc key */
if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) { if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) {
@@ -6608,12 +6620,27 @@ static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
} }
else { else {
XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL); XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
=======
else if (ecc->type == ECC_PUBLICKEY) {
if ((derSz = (word32)wc_EccPublicKeyDerSize(ecc, 1)) > 0) {
derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
if (derBuf != NULL) {
if (wc_EccPublicKeyToDer(ecc, derBuf, derSz, 1) < 0) {
XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
>>>>>>> WIP
derBuf = NULL; derBuf = NULL;
} }
} }
} }
} }
return WOLFSSL_FAILURE; if (derBuf != NULL) {
pkey->pkey_sz = (int)derSz;
pkey->pkey.ptr = (char*)derBuf;
return WOLFSSL_SUCCESS;
}
else {
return WOLFSSL_FAILURE;
}
} }
int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key) int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)