BOOL WINAPI CertAddEncodedCRLToStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, const BYTE *pbCrlEncoded, DWORD cbCrlEncoded, DWORD dwAddDisposition, PCCRL_CONTEXT *ppCrlContext) { PCCRL_CONTEXT crl = CertCreateCRLContext(dwCertEncodingType, pbCrlEncoded, cbCrlEncoded); BOOL ret; TRACE("(%p, %08x, %p, %d, %08x, %p)\n", hCertStore, dwCertEncodingType, pbCrlEncoded, cbCrlEncoded, dwAddDisposition, ppCrlContext); if (crl) { ret = CertAddCRLContextToStore(hCertStore, crl, dwAddDisposition, ppCrlContext); CertFreeCRLContext(crl); } else ret = FALSE; return ret; }
/* {{{ static int ma_tls_set_client_certs(MARIADB_TLS *ctls) */ static int ma_tls_set_client_certs(MARIADB_TLS *ctls) { MYSQL *mysql= ctls->pvio->mysql; char *certfile= mysql->options.ssl_cert, *keyfile= mysql->options.ssl_key, *cafile= mysql->options.ssl_ca; PCERT_CONTEXT ca_ctx= NULL; PCRL_CONTEXT crl_ctx = NULL; SC_CTX *sctx= (SC_CTX *)ctls->ssl; MARIADB_PVIO *pvio= ctls->pvio; if (cafile) { if (!(ca_ctx = ma_schannel_create_cert_context(pvio, cafile))) goto end; /* Add ca to in-memory certificate store */ if (CertAddCertificateContextToStore(ca_CertStore, ca_ctx, CERT_STORE_ADD_NEWER, NULL) != TRUE && GetLastError() != CRYPT_E_EXISTS) { ma_schannel_set_win_error(sctx->mysql); goto end; } ca_Check= 0; CertFreeCertificateContext(ca_ctx); } if (!certfile && keyfile) certfile= keyfile; if (!keyfile && certfile) keyfile= certfile; if (certfile && certfile[0]) if (!(sctx->client_cert_ctx = ma_schannel_create_cert_context(ctls->pvio, certfile))) goto end; if (sctx->client_cert_ctx && keyfile[0]) if (!ma_schannel_load_private_key(pvio, sctx->client_cert_ctx, keyfile)) goto end; if (mysql->options.extension && mysql->options.extension->ssl_crl) { if (!(crl_ctx= (CRL_CONTEXT *)ma_schannel_create_crl_context(pvio, mysql->options.extension->ssl_crl))) goto end; /* Add ca to in-memory certificate store */ if (CertAddCRLContextToStore(crl_CertStore, crl_ctx, CERT_STORE_ADD_NEWER, NULL) != TRUE && GetLastError() != CRYPT_E_EXISTS) { ma_schannel_set_win_error(sctx->mysql); goto end; } crl_Check = 1; CertFreeCertificateContext(ca_ctx); } return 0; end: if (ca_ctx) CertFreeCertificateContext(ca_ctx); if (sctx->client_cert_ctx) CertFreeCertificateContext(sctx->client_cert_ctx); if (crl_ctx) CertFreeCRLContext(crl_ctx); sctx->client_cert_ctx= NULL; return 1; }