Module: wine Branch: master Commit: 99a2514fdaa335271cf806c355e2ca41031f5f11 URL: https://source.winehq.org/git/wine.git/?a=commit;h=99a2514fdaa335271cf806c35...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Fri Nov 2 17:07:03 2018 +0300
crypt32: Add support for 3rd party CSPs to CertGetPublicKeyLength.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/crypt32/cert.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index c44e4bc..faf70de 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -1317,9 +1317,30 @@ DWORD WINAPI CertGetPublicKeyLength(DWORD dwCertEncodingType, } else { + PCCRYPT_OID_INFO info; DWORD size; PBYTE buf; - BOOL ret = CryptDecodeObjectEx(dwCertEncodingType, + BOOL ret; + + info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, pPublicKey->Algorithm.pszObjId, 0); + if (info) + { + HCRYPTKEY key; + + TRACE("public key algid %#x (%s)\n", info->u.Algid, debugstr_a(pPublicKey->Algorithm.pszObjId)); + + ret = CryptImportPublicKeyInfo(I_CryptGetDefaultCryptProv(0), dwCertEncodingType, pPublicKey, &key); + if (ret) + { + size = sizeof(len); + ret = CryptGetKeyParam(key, KP_KEYLEN, (BYTE *)&len, &size, 0); + CryptDestroyKey(key); + return len; + } + /* fallback to RSA */ + } + + ret = CryptDecodeObjectEx(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, pPublicKey->PublicKey.pbData, pPublicKey->PublicKey.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size);