struct evp_pkey_st {
+ int ref;
+
void *pkey_pm;
const PKEY_METHOD *method;
struct x509_st {
+ int ref;
+
/* X509 certification platform private point */
void *x509_pm;
ssl->version = ctx->version;
ssl->options = ctx->options;
+ ssl->cert = ctx->cert;
+ ssl->client_CA = ctx->client_CA;
+
ret = SSL_METHOD_CALL(new, ssl);
if (ret)
SSL_RET(failed2, "ssl_new\n");
if (!ret)
SSL_RET(failed2, "SSL_CTX_use_PrivateKey\n");
+ ctx->cert->pkey->ref++;
+
return 1;
failed2:
int ret;
EVP_PKEY *pkey;
- pkey = d2i_PrivateKey(0, &ssl->cert->pkey, &d, len);
+ if (ssl->cert->pkey->ref)
+ SSL_RET(failed1);
+
+ pkey = d2i_PrivateKey(0, NULL, &d, len);
if (!pkey)
SSL_RET(failed1, "d2i_PrivateKey\n");
if (!ret)
SSL_RET(failed2, "SSL_CTX_use_PrivateKey\n");
+ ssl->cert->pkey->ref++;
+
return 1;
failed2:
} else {
x = X509_new();
if (!x)
- SSL_RET(failed1, "sk_X509_NAME_new_null\n");
+ SSL_RET(failed1, "X509_new\n");
m = 1;
}
{
int ret;
X509 *cert;
+ const unsigned char *pbuf;
cert = d2i_X509(&ctx->cert->x509, d, len);
if (!cert)
if (!ret)
SSL_RET(failed2, "SSL_CTX_use_certificate\n");
+ ctx->cert->x509->ref++;
+
return 1;
failed2:
int ret;
X509 *cert;
- cert = d2i_X509(&ssl->cert->x509, d, len);
+ if (ssl->cert->x509->ref)
+ SSL_RET(failed1);
+
+ cert = d2i_X509(NULL, d, len);
if (!cert)
SSL_RET(failed1, "d2i_X509\n");
if (!ret)
SSL_RET(failed2, "SSL_use_certificate\n");
+ ssl->cert->x509->ref++;
+
return 1;
failed2:
mbedtls_ssl_conf_dbg(&ssl_pm->conf, NULL, NULL);
- x509_pm = (struct x509_pm *)ctx->client_CA->x509_pm;
+ x509_pm = (struct x509_pm *)ssl->client_CA->x509_pm;
if (x509_pm->load) {
mbedtls_ssl_conf_ca_chain(&ssl_pm->conf, &x509_pm->x509_crt, NULL);
}
mbedtls_ssl_conf_authmode(&ssl_pm->conf, mode);
- pkey_pm = (struct pkey_pm *)ctx->cert->pkey->pkey_pm;
+ pkey_pm = (struct pkey_pm *)ssl->cert->pkey->pkey_pm;
if (pkey_pm->load) {
- x509_pm = (struct x509_pm *)ctx->cert->x509->x509_pm;
+ x509_pm = (struct x509_pm *)ssl->cert->x509->x509_pm;
ret = mbedtls_ssl_conf_own_cert(&ssl_pm->conf, &x509_pm->x509_crt, &pkey_pm->pkey);
if (ret)