mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-31 03:07:29 +02:00
Merge pull request #6325 from SparkiDev/memusage_fix_4
Memory Usage fixes
This commit is contained in:
@ -5221,23 +5221,13 @@ int Ed25519CheckPubKey(WOLFSSL* ssl)
|
|||||||
|
|
||||||
/* Public key required for signing. */
|
/* Public key required for signing. */
|
||||||
if (key != NULL && !key->pubKeySet) {
|
if (key != NULL && !key->pubKeySet) {
|
||||||
DerBuffer* leaf = ssl->buffers.certificate;
|
const unsigned char* pubKey;
|
||||||
DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
|
word32 pubKeySz;
|
||||||
ssl->heap, DYNAMIC_TYPE_DCERT);
|
|
||||||
if (cert == NULL)
|
|
||||||
ret = MEMORY_E;
|
|
||||||
|
|
||||||
|
ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
|
||||||
|
ssl->buffers.certificate->length, &pubKey, &pubKeySz);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
|
ret = wc_ed25519_import_public(pubKey, pubKeySz, key);
|
||||||
ret = DecodeToKey(cert, 0);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
|
|
||||||
key);
|
|
||||||
}
|
|
||||||
if (cert != NULL) {
|
|
||||||
FreeDecodedCert(cert);
|
|
||||||
XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5555,23 +5545,13 @@ int Ed448CheckPubKey(WOLFSSL* ssl)
|
|||||||
|
|
||||||
/* Public key required for signing. */
|
/* Public key required for signing. */
|
||||||
if (key != NULL && !key->pubKeySet) {
|
if (key != NULL && !key->pubKeySet) {
|
||||||
DerBuffer* leaf = ssl->buffers.certificate;
|
const unsigned char* pubKey;
|
||||||
DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
|
word32 pubKeySz;
|
||||||
DYNAMIC_TYPE_DCERT);
|
|
||||||
if (cert == NULL)
|
|
||||||
ret = MEMORY_E;
|
|
||||||
|
|
||||||
|
ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
|
||||||
|
ssl->buffers.certificate->length, &pubKey, &pubKeySz);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
|
ret = wc_ed448_import_public(pubKey, pubKeySz, key);
|
||||||
ret = DecodeToKey(cert, 0);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
|
|
||||||
key);
|
|
||||||
}
|
|
||||||
if (cert != NULL) {
|
|
||||||
FreeDecodedCert(cert);
|
|
||||||
XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21473,6 +21473,109 @@ int CheckCertSignature(const byte* cert, word32 certSz, void* heap, void* cm)
|
|||||||
#endif /* WOLFSSL_SMALL_CERT_VERIFY */
|
#endif /* WOLFSSL_SMALL_CERT_VERIFY */
|
||||||
#endif /* WOLFSSL_SMALL_CERT_VERIFY || OPENSSL_EXTRA */
|
#endif /* WOLFSSL_SMALL_CERT_VERIFY || OPENSSL_EXTRA */
|
||||||
|
|
||||||
|
#if (defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) || \
|
||||||
|
(defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)))
|
||||||
|
/* ASN.1 DER decode instruction. */
|
||||||
|
typedef struct DecodeInstr {
|
||||||
|
/* Tag expected. */
|
||||||
|
byte tag;
|
||||||
|
/* Operation to perform: step in or go over */
|
||||||
|
byte op:1;
|
||||||
|
/* ASN.1 item is optional. */
|
||||||
|
byte optional:1;
|
||||||
|
} DecodeInstr;
|
||||||
|
|
||||||
|
/* Step into ASN.1 item. */
|
||||||
|
#define DECODE_INSTR_IN 0
|
||||||
|
/* Step over ASN.1 item. */
|
||||||
|
#define DECODE_INSTR_OVER 1
|
||||||
|
|
||||||
|
/* Get the public key data from the DER encoded X.509 certificate.
|
||||||
|
*
|
||||||
|
* Assumes data has previously been parsed for complete validity.
|
||||||
|
*
|
||||||
|
* @param [in] cert DER encoded X.509 certificate data.
|
||||||
|
* @param [in] certSz Length of DER encoding.
|
||||||
|
* @param [out] pubKey Public key data. (From the BIT_STRING.)
|
||||||
|
* @param [out] pubKeySz Length of public key data in bytes.
|
||||||
|
* @return 0 on success.
|
||||||
|
* @return BAD_FUNC_ARG when cert, pubKey or pubKeySz is NULL.
|
||||||
|
* @return ASN_PARSE_E when certificate encoding is invalid.
|
||||||
|
*/
|
||||||
|
int wc_CertGetPubKey(const byte* cert, word32 certSz,
|
||||||
|
const unsigned char** pubKey, word32* pubKeySz)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
int l;
|
||||||
|
word32 o = 0;
|
||||||
|
int i;
|
||||||
|
static DecodeInstr ops[] = {
|
||||||
|
/* Outer SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_IN , 0 },
|
||||||
|
/* TBSCertificate: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_IN , 0 },
|
||||||
|
/* Version: [0] */
|
||||||
|
{ ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED | ASN_X509_CERT_VERSION,
|
||||||
|
DECODE_INSTR_OVER, 1 },
|
||||||
|
/* CertificateSerialNumber: INT */
|
||||||
|
{ ASN_INTEGER, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* AlgorithmIdentifier: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* issuer: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* Validity: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* subject: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* subjectPublicKeyInfo SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_IN , 0 },
|
||||||
|
/* AlgorithmIdentifier: SEQ */
|
||||||
|
{ ASN_SEQUENCE | ASN_CONSTRUCTED, DECODE_INSTR_OVER, 0 },
|
||||||
|
/* PublicKey: BIT_STRING */
|
||||||
|
{ ASN_BIT_STRING, DECODE_INSTR_IN , 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Validate parameters. */
|
||||||
|
if ((cert == NULL) || (pubKey == NULL) || (pubKeySz == NULL)) {
|
||||||
|
ret = BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process each instruction to take us to public key data. */
|
||||||
|
for (i = 0; (ret == 0) && (i < (int)(sizeof(ops) / sizeof(*ops))); i++) {
|
||||||
|
DecodeInstr op = ops[i];
|
||||||
|
|
||||||
|
/* Check the current ASN.1 item has the expected tag. */
|
||||||
|
if (cert[o] != op.tag) {
|
||||||
|
/* If not optional then error, otherwise skip op. */
|
||||||
|
if (!op.optional) {
|
||||||
|
ret = ASN_PARSE_E;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Move past tag. */
|
||||||
|
o++;
|
||||||
|
/* Get the length of ASN.1 item and move past length encoding. */
|
||||||
|
if (GetLength(cert, &o, &l, certSz) < 0) {
|
||||||
|
ret = ASN_PARSE_E;
|
||||||
|
}
|
||||||
|
/* Skip data if required. */
|
||||||
|
else if (op.op == DECODE_INSTR_OVER) {
|
||||||
|
o += l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
/* Return the public key data and length.
|
||||||
|
* Skip first byte of BIT_STRING data: unused bits. */
|
||||||
|
*pubKey = cert + o + 1;
|
||||||
|
*pubKeySz = l - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm)
|
int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -1337,6 +1337,10 @@ enum {
|
|||||||
/* Integer/heap maths - support 4096-bit. */
|
/* Integer/heap maths - support 4096-bit. */
|
||||||
#define ENCRYPT_BASE_BITS 4096
|
#define ENCRYPT_BASE_BITS 4096
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(HAVE_CURVE448)
|
||||||
|
#define ENCRYPT_BASE_BITS (456 * 2)
|
||||||
|
#elif defined(HAVE_CURVE25519)
|
||||||
|
#define ENCRYPT_BASE_BITS (256 * 2)
|
||||||
#else
|
#else
|
||||||
/* No secret from public key operation but PSK key plus length used. */
|
/* No secret from public key operation but PSK key plus length used. */
|
||||||
#define ENCRYPT_BASE_BITS ((MAX_PSK_ID_LEN + 2) * 8)
|
#define ENCRYPT_BASE_BITS ((MAX_PSK_ID_LEN + 2) * 8)
|
||||||
|
@ -2045,6 +2045,11 @@ WOLFSSL_API int wc_CheckCertSigPubKey(const byte* cert, word32 certSz,
|
|||||||
void* heap, const byte* pubKey,
|
void* heap, const byte* pubKey,
|
||||||
word32 pubKeySz, int pubKeyOID);
|
word32 pubKeySz, int pubKeyOID);
|
||||||
#endif
|
#endif
|
||||||
|
#if (defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) || \
|
||||||
|
(defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)))
|
||||||
|
WOLFSSL_LOCAL int wc_CertGetPubKey(const byte* cert, word32 certSz,
|
||||||
|
const unsigned char** pubKey, word32* pubKeySz);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WOLFSSL_CERT_REQ
|
#ifdef WOLFSSL_CERT_REQ
|
||||||
WOLFSSL_LOCAL int CheckCSRSignaturePubKey(const byte* cert, word32 certSz,
|
WOLFSSL_LOCAL int CheckCSRSignaturePubKey(const byte* cert, word32 certSz,
|
||||||
|
Reference in New Issue
Block a user