From 718e9dce9cf49f4234fe968946136eb6f8d05d50 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20M=C3=BCller?= Date: Wed, 20 Jun 2018 10:37:57 +0300 Subject: [PATCH] crypt32: Implement decoding of X509_ECC_SIGNATURE. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/crypt32/decode.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index 4f11d0d60f5..080feeca0ad 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -6013,6 +6013,35 @@ static BOOL WINAPI CRYPT_AsnDecodeObjectIdentifier(DWORD dwCertEncodingType, return ret; } +static BOOL WINAPI CRYPT_AsnDecodeEccSignature(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret; + struct AsnDecodeSequenceItem items[] = { + { ASN_INTEGER, offsetof(CERT_ECC_SIGNATURE, r), + CRYPT_AsnDecodeUnsignedIntegerInternal, sizeof(CRYPT_UINT_BLOB), FALSE, + TRUE, offsetof(CERT_ECC_SIGNATURE, r.pbData), 0 }, + { ASN_INTEGER, offsetof(CERT_ECC_SIGNATURE, s), + CRYPT_AsnDecodeUnsignedIntegerInternal, sizeof(CRYPT_UINT_BLOB), FALSE, + TRUE, offsetof(CERT_ECC_SIGNATURE, s.pbData), 0 }, + }; + + __TRY + { + ret = CRYPT_AsnDecodeSequence(items, ARRAY_SIZE(items), + pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, + pcbStructInfo, NULL, NULL); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + ret = FALSE; + } + __ENDTRY + return ret; +} + static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, LPCSTR lpszStructType) { @@ -6155,6 +6184,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, case LOWORD(X509_OBJECT_IDENTIFIER): decodeFunc = CRYPT_AsnDecodeObjectIdentifier; break; + case LOWORD(X509_ECC_SIGNATURE): + decodeFunc = CRYPT_AsnDecodeEccSignature; + break; } } else if (!strcmp(lpszStructType, szOID_CERT_EXTENSIONS)) -- 2.11.4.GIT