RTDECL(int) RTCrStoreCertAddFromFile(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename, PRTERRINFO pErrInfo) { AssertReturn(!fFlags, VERR_INVALID_FLAGS); #if 0 RTCRX509CERTIFICATES Certs; int rc = RTCrX509Certificates_ReadFromFile(pszFilename, 0, &Certs, pErrInfo); if (RT_SUCCESS(rc)) { for (uint32_t i = 0; i < Certs.cCerts; i++) { int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER, RTASN1CORE_GET_RAW_ASN1_PTR(&Certs.paCerts[i].SeqCore.Asn1Core), RTASN1CORE_GET_RAW_ASN1_SIZE(&Certs.paCerts[i].SeqCore.Asn1Core), RT_SUCCESS(rc) ? pErrInfo : NULL); if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) rc = rc2; } RTAsn1Destroy(&Certs.SetCore.Asn1Core); } return rc; #else PCRTCRPEMSECTION pSectionHead; int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo); if (RT_SUCCESS(rc)) { PCRTCRPEMSECTION pCurSec = pSectionHead; while (pCurSec) { int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER, pCurSec->pbData, pCurSec->cbData, RT_SUCCESS(rc) ? pErrInfo : NULL); if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) rc = rc2; pCurSec = pCurSec->pNext; } RTCrPemFreeSections(pSectionHead); } return rc; #endif }
static int rtCrStoreAddCertsFromNative(RTCRSTORE hStore, DWORD fStore, PCRTUTF16 pwszStoreName, PFNCERTOPENSTORE pfnOpenStore, PFNCERTCLOSESTORE pfnCloseStore, PFNCERTENUMCERTIFICATESINSTORE pfnEnumCerts, int rc, PRTERRINFO pErrInfo) { DWORD fOpenStore = CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG; HCERTSTORE hNativeStore = pfnOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, NULL /* hCryptProv = default */, fStore | fOpenStore, pwszStoreName); if (hStore) { PCCERT_CONTEXT pCurCtx = NULL; while ((pCurCtx = pfnEnumCerts(hNativeStore, pCurCtx)) != NULL) { if (pCurCtx->dwCertEncodingType & X509_ASN_ENCODING) { RTERRINFOSTATIC StaticErrInfo; RTASN1CURSORPRIMARY PrimaryCursor; RTAsn1CursorInitPrimary(&PrimaryCursor, pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, RTErrInfoInitStatic(&StaticErrInfo), &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "CurCtx"); RTCRX509CERTIFICATE MyCert; int rc2 = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &MyCert, "Cert"); if (RT_SUCCESS(rc2)) { rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER | RTCRCERTCTX_F_ADD_IF_NOT_FOUND, pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, RTErrInfoInitStatic(&StaticErrInfo)); RTCrX509Certificate_Delete(&MyCert); } if (RT_FAILURE(rc2)) { if (RTErrInfoIsSet(&StaticErrInfo.Core)) RTErrInfoAddF(pErrInfo, -rc2, " %s", StaticErrInfo.Core.pszMsg); else RTErrInfoAddF(pErrInfo, -rc2, " %Rrc adding cert", rc2); rc = -rc2; } } } pfnCloseStore(hNativeStore, CERT_CLOSE_STORE_CHECK_FLAG); } else { DWORD uLastErr = GetLastError(); if (uLastErr != ERROR_FILE_NOT_FOUND) rc = RTErrInfoAddF(pErrInfo, -RTErrConvertFromWin32(uLastErr), " CertOpenStore(%#x,'%ls') failed: %u", fStore, pwszStoreName); } return rc; }