Version bump
This commit is contained in:
+111
@@ -1035,3 +1035,114 @@ int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file)
|
||||
BIO_free(bin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ssl_set_cert_and_key(SSL *ssl, SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
int ret = 0;
|
||||
size_t i;
|
||||
int j;
|
||||
int rv;
|
||||
CERT *c = ssl != NULL ? ssl->cert : ctx->cert;
|
||||
STACK_OF(X509) *dup_chain = NULL;
|
||||
EVP_PKEY *pubkey = NULL;
|
||||
|
||||
/* Do all security checks before anything else */
|
||||
rv = ssl_security_cert(ssl, ctx, x509, 0, 1);
|
||||
if (rv != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, rv);
|
||||
goto out;
|
||||
}
|
||||
for (j = 0; j < sk_X509_num(chain); j++) {
|
||||
rv = ssl_security_cert(ssl, ctx, sk_X509_value(chain, j), 0, 0);
|
||||
if (rv != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, rv);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
pubkey = X509_get_pubkey(x509); /* bumps reference */
|
||||
if (pubkey == NULL)
|
||||
goto out;
|
||||
if (privatekey == NULL) {
|
||||
privatekey = pubkey;
|
||||
} else {
|
||||
/* For RSA, which has no parameters, missing returns 0 */
|
||||
if (EVP_PKEY_missing_parameters(privatekey)) {
|
||||
if (EVP_PKEY_missing_parameters(pubkey)) {
|
||||
/* nobody has parameters? - error */
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_MISSING_PARAMETERS);
|
||||
goto out;
|
||||
} else {
|
||||
/* copy to privatekey from pubkey */
|
||||
EVP_PKEY_copy_parameters(privatekey, pubkey);
|
||||
}
|
||||
} else if (EVP_PKEY_missing_parameters(pubkey)) {
|
||||
/* copy to pubkey from privatekey */
|
||||
EVP_PKEY_copy_parameters(pubkey, privatekey);
|
||||
} /* else both have parameters */
|
||||
|
||||
/* Copied from ssl_set_cert/pkey */
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
if ((EVP_PKEY_id(privatekey) == EVP_PKEY_RSA) &&
|
||||
((RSA_flags(EVP_PKEY_get0_RSA(privatekey)) & RSA_METHOD_FLAG_NO_CHECK)))
|
||||
/* no-op */ ;
|
||||
else
|
||||
#endif
|
||||
/* check that key <-> cert match */
|
||||
if (EVP_PKEY_cmp(pubkey, privatekey) != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_PRIVATE_KEY_MISMATCH);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (ssl_cert_lookup_by_pkey(pubkey, &i) == NULL) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!override && (c->pkeys[i].x509 != NULL
|
||||
|| c->pkeys[i].privatekey != NULL
|
||||
|| c->pkeys[i].chain != NULL)) {
|
||||
/* No override, and something already there */
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_NOT_REPLACING_CERTIFICATE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (chain != NULL) {
|
||||
dup_chain = X509_chain_up_ref(chain);
|
||||
if (dup_chain == NULL) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, ERR_R_MALLOC_FAILURE);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
sk_X509_pop_free(c->pkeys[i].chain, X509_free);
|
||||
c->pkeys[i].chain = dup_chain;
|
||||
|
||||
X509_free(c->pkeys[i].x509);
|
||||
X509_up_ref(x509);
|
||||
c->pkeys[i].x509 = x509;
|
||||
|
||||
EVP_PKEY_free(c->pkeys[i].privatekey);
|
||||
EVP_PKEY_up_ref(privatekey);
|
||||
c->pkeys[i].privatekey = privatekey;
|
||||
|
||||
c->key = &(c->pkeys[i]);
|
||||
|
||||
ret = 1;
|
||||
out:
|
||||
EVP_PKEY_free(pubkey);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
return ssl_set_cert_and_key(ssl, NULL, x509, privatekey, chain, override);
|
||||
}
|
||||
|
||||
int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
return ssl_set_cert_and_key(NULL, ctx, x509, privatekey, chain, override);
|
||||
}
|
||||
Reference in New Issue
Block a user