diff --git a/src/Certs.c b/src/Certs.c index ec2310d71..564e6ba0e 100644 --- a/src/Certs.c +++ b/src/Certs.c @@ -305,16 +305,56 @@ int Certs_VerifyChain(struct X509CertContext* x509) { #include */ /* Compatibility versions so compiling works on older Windows SDKs */ -#include "../misc/windows/min-wincrypt.h" +//#include "../misc/windows/min-wincrypt.h" + +#include void CertsBackend_Init(void) { - Crypt32_LoadDynamicFuncs(); + //Crypt32_LoadDynamicFuncs(); } int Certs_VerifyChain(struct X509CertContext* x509) { + struct X509Cert* cert = &x509->certs[0]; + int i; + + HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, NULL); + if (!store) return ERR_NOT_SUPPORTED; + + PCCERT_CONTEXT primary_cert = NULL; + BOOL ok = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, cert->data, cert->offset, + CERT_STORE_ADD_ALWAYS, &primary_cert); + if (!ok || !primary_cert) + return -1; + + for (i = 1; i < x509->numCerts; i++) + { + cert = &x509->certs[i]; + ok = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, cert->data, cert->offset, + CERT_STORE_ADD_ALWAYS, NULL); + } //if (!_CertGetCertificateChain) return ERR_NOT_SUPPORTED; + static const LPCSTR usage[] = { + szOID_PKIX_KP_SERVER_AUTH, + szOID_SERVER_GATED_CRYPTO, + szOID_SGC_NETSCAPE + }; + + CERT_CHAIN_PARA para = { 0 }; + para.cbSize = sizeof(para); + + para.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; + para.RequestedUsage.Usage.cUsageIdentifier = Array_Elems(usage); + para.RequestedUsage.Usage.rgpszUsageIdentifier = usage; + + PCCERT_CHAIN_CONTEXT chain = NULL; + ok = CertGetCertificateChain(NULL, primary_cert, NULL, NULL, ¶, 0, NULL, &chain); //_CertGetCertificateChain(NULL, PCCERT_CONTEXT certContext, NULL, HCERTSTORE additionalStore, PCERT_CHAIN_PARA chainPara, DWORD flags, PVOID reserved, PCCERT_CHAIN_CONTEXT* chainContext); + + CertFreeCertificateChain(chain); + ok = CertFreeCertificateContext(primary_cert); + ok = CertCloseStore(store, CERT_CLOSE_STORE_CHECK_FLAG); return ERR_NOT_SUPPORTED; } diff --git a/src/ClassiCube.vcxproj b/src/ClassiCube.vcxproj index 726532d38..80aa3886a 100644 --- a/src/ClassiCube.vcxproj +++ b/src/ClassiCube.vcxproj @@ -188,7 +188,7 @@ true 5.02 main - opengl32.lib;Winmm.lib;crypt32.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;crypt32.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) @@ -208,7 +208,7 @@ Windows true main - opengl32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) @@ -230,7 +230,7 @@ true 5.02 main - opengl32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) @@ -252,7 +252,7 @@ true 5.02 main - opengl32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;ucrtd.lib;vcruntimed.lib;msvcrtd.lib;%(AdditionalDependencies) @@ -281,7 +281,7 @@ 5.02 Default main - opengl32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -308,7 +308,7 @@ true true main - opengl32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -338,7 +338,7 @@ 5.02 Default main - opengl32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -368,7 +368,7 @@ 5.02 Default main - opengl32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) + crypt32.lib;Winmm.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies)