}
}
else
- SetLastError(ERROR_INVALID_DATA);
+ {
+ DWORD size;
+
+ ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CERT,
+ pCertContext->pbCertEncoded, pCertContext->cbCertEncoded, 0,
+ NULL, NULL, &size);
+ if (ret)
+ {
+ CERT_PUBLIC_KEY_INFO *info =
+ &pCertContext->pCertInfo->SubjectPublicKeyInfo;
+
+ ret = CryptEncodeObject(X509_ASN_ENCODING,
+ X509_PUBLIC_KEY_INFO, info, NULL, &size);
+ if (ret)
+ {
+ PBYTE encoded = CryptMemAlloc(size);
+
+ if (encoded)
+ {
+ ret = CryptEncodeObject(X509_ASN_ENCODING,
+ X509_PUBLIC_KEY_INFO, info, encoded, &size);
+ if (ret)
+ ret = CertContext_GetHashProp(context, dwPropId,
+ CALG_SHA1, encoded, size, pvData, pcbData);
+ CryptMemFree(encoded);
+ }
+ }
+ }
+ else
+ SetLastError(ERROR_INVALID_DATA);
+ }
break;
}
default: