PPH_STRING PhGetSignerNameFromCertificate( _In_ PCERT_CONTEXT Certificate ) { PCERT_INFO certInfo; PH_STRINGREF keyName; PPH_STRING name; PPH_STRING value; // Cert context -> Cert info certInfo = Certificate->pCertInfo; if (!certInfo) return NULL; // Cert info subject -> Subject X.500 string name = PhpGetCertNameString(&certInfo->Subject); // Subject X.500 string -> CN or OU value PhInitializeStringRef(&keyName, L"CN"); value = PhpGetX500Value(&name->sr, &keyName); if (!value) { PhInitializeStringRef(&keyName, L"OU"); value = PhpGetX500Value(&name->sr, &keyName); } PhDereferenceObject(name); return value; }
PPH_STRING PhpGetSignerNameFromStateData( __in HANDLE StateData ) { PCRYPT_PROVIDER_DATA provData; PCRYPT_PROVIDER_SGNR sgnr; PCRYPT_PROVIDER_CERT cert; PCCERT_CONTEXT certContext; PCERT_INFO certInfo; PH_STRINGREF keyName; PPH_STRING name; PPH_STRING value; // 1. State data -> provider data. provData = WTHelperProvDataFromStateData_I(StateData); if (!provData) return NULL; // 2. Provider data -> Provider signer sgnr = WTHelperGetProvSignerFromChain_I(provData, 0, FALSE, 0); if (!sgnr) return NULL; if (!sgnr->pasCertChain) return NULL; if (sgnr->csCertChain == 0) return NULL; // 3. Provider signer -> Provider cert cert = &sgnr->pasCertChain[0]; // 4. Provider cert -> Cert context certContext = cert->pCert; if (!certContext) return NULL; // 5. Cert context -> Cert info certInfo = certContext->pCertInfo; if (!certInfo) return NULL; // 6. Cert info subject -> Subject X.500 string name = PhpGetCertNameString(&certInfo->Subject); // 7. Subject X.500 string -> CN or OU value PhInitializeStringRef(&keyName, L"CN"); value = PhpGetX500Value(name, &keyName); if (!value) { PhInitializeStringRef(&keyName, L"OU"); value = PhpGetX500Value(name, &keyName); } PhDereferenceObject(name); return value; }