Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -7685,6 +7685,7 @@ static int SetSSL_CTX_CertsAndKeys(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
if (ret != 0) {
return ret;
}
ssl->buffers.weOwnAltKey = 1;
Comment thread
padelsbach marked this conversation as resolved.
Comment thread
padelsbach marked this conversation as resolved.
/* Blind the private key for the SSL with new random mask. */
wolfssl_priv_der_blind_toggle(ssl->buffers.altKey,
ctx->altPrivateKeyMask);
Expand Down
35 changes: 33 additions & 2 deletions src/ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -8861,6 +8861,19 @@ WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
ssl->buffers.weOwnCertChain = 1;
}
#else
/* drop what this object allocated itself before pointing at the ctx's */
if (ssl->buffers.weOwnCert) {
FreeDer(&ssl->buffers.certificate);
#ifdef KEEP_OUR_CERT
wolfSSL_X509_free(ssl->ourCert);
ssl->ourCert = NULL;
#endif
ssl->buffers.weOwnCert = 0;
}
if (ssl->buffers.weOwnCertChain) {
FreeDer(&ssl->buffers.certChain);
ssl->buffers.weOwnCertChain = 0;
}
/* ctx owns certificate, certChain and key */
ssl->buffers.certificate = ctx->certificate;
ssl->buffers.certChain = ctx->certChain;
Expand All @@ -8870,8 +8883,9 @@ WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
#endif
#ifndef WOLFSSL_BLIND_PRIVATE_KEY
#ifdef WOLFSSL_COPY_KEY
if (ssl->buffers.key != NULL && ssl->buffers.weOwnKey) {
if (ssl->buffers.weOwnKey) {
FreeDer(&ssl->buffers.key);
ssl->buffers.weOwnKey = 0;
}
if (ctx->privateKey != NULL) {
ret = AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer,
Expand All @@ -8887,19 +8901,26 @@ WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
ssl->buffers.key = ctx->privateKey;
}
#else
if (ssl->buffers.weOwnKey) {
FreeDer(&ssl->buffers.key);
ssl->buffers.weOwnKey = 0;
}
ssl->buffers.key = ctx->privateKey;
#endif
#else
if (ctx->privateKey != NULL) {
if (ssl->buffers.key != NULL && ssl->buffers.weOwnKey) {
if (ssl->buffers.weOwnKey) {
FreeDer(&ssl->buffers.key);
FreeDer(&ssl->buffers.keyMask);
ssl->buffers.weOwnKey = 0;
}
ret = AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer,
ctx->privateKey->length, ctx->privateKey->type,
ctx->privateKey->heap);
if (ret != 0) {
return NULL;
}
ssl->buffers.weOwnKey = 1;
/* Blind the private key for the SSL with new random mask. */
wolfssl_priv_der_blind_toggle(ssl->buffers.key, ctx->privateKeyMask);
ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key,
Expand All @@ -8925,15 +8946,25 @@ WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
ssl->options.haveSlhDsaSig = ctx->haveSlhDsaSig;
#ifdef WOLFSSL_DUAL_ALG_CERTS
#ifndef WOLFSSL_BLIND_PRIVATE_KEY
if (ssl->buffers.weOwnAltKey) {
FreeDer(&ssl->buffers.altKey);
ssl->buffers.weOwnAltKey = 0;
}
ssl->buffers.altKey = ctx->altPrivateKey;
#else
if (ctx->altPrivateKey != NULL) {
if (ssl->buffers.weOwnAltKey) {
FreeDer(&ssl->buffers.altKey);
FreeDer(&ssl->buffers.altKeyMask);
ssl->buffers.weOwnAltKey = 0;
}
ret = AllocCopyDer(&ssl->buffers.altKey, ctx->altPrivateKey->buffer,
ctx->altPrivateKey->length, ctx->altPrivateKey->type,
ctx->altPrivateKey->heap);
if (ret != 0) {
return NULL;
}
ssl->buffers.weOwnAltKey = 1;
/* Blind the private key for the SSL with new random mask. */
wolfssl_priv_der_blind_toggle(ssl->buffers.altKey,
ctx->altPrivateKeyMask);
Expand Down
13 changes: 11 additions & 2 deletions src/tls13.c
Original file line number Diff line number Diff line change
Expand Up @@ -10305,6 +10305,7 @@ typedef struct Scv13Args {
byte sigAlgo;
#ifdef WOLFSSL_DUAL_ALG_CERTS
byte altSigAlgo;
byte altSwapped; /* alternative key already moved into buffers.key */
#endif
byte fragActive; /* current fragment laid out, record build may pend */
} Scv13Args;
Expand Down Expand Up @@ -10468,7 +10469,8 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl)
else {
#ifdef WOLFSSL_DUAL_ALG_CERTS
if (ssl->sigSpec != NULL &&
*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE &&
!args->altSwapped) {
/* In the case of alternative, we swap in the alt. */
if (ssl->buffers.altKey == NULL) {
ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
Expand All @@ -10483,12 +10485,19 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl)
#endif
}

/* Swap keys */
/* Move the alternative key over. Ownership travels with
* the buffer so that only one field releases it. */
ssl->buffers.key = ssl->buffers.altKey;
ssl->buffers.weOwnKey = ssl->buffers.weOwnAltKey;
ssl->buffers.altKey = NULL;
ssl->buffers.weOwnAltKey = 0;
/* This state is re-entered after a pending asynchronous
* operation, so only move the key across once. */
args->altSwapped = 1;

#ifdef WOLFSSL_BLIND_PRIVATE_KEY
ssl->buffers.keyMask = ssl->buffers.altKeyMask;
ssl->buffers.altKeyMask = NULL;
/* Unblind the alternative key before decoding */
wolfssl_priv_der_blind_toggle(ssl->buffers.key, ssl->buffers.keyMask);
#endif
Expand Down
Loading
Loading