crypt32: Add support for decoding PKCS_SMIME_CAPABILITIES.
This commit is contained in:
parent
db6c8e23b6
commit
ac5c7d22d0
|
@ -1997,6 +1997,8 @@ static BOOL CRYPT_AsnDecodeCopyBytes(const BYTE *pbEncoded,
|
||||||
|
|
||||||
*pcbStructInfo = bytesNeeded;
|
*pcbStructInfo = bytesNeeded;
|
||||||
blob->cbData = encodedLen;
|
blob->cbData = encodedLen;
|
||||||
|
if (encodedLen)
|
||||||
|
{
|
||||||
if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG)
|
if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG)
|
||||||
blob->pbData = (LPBYTE)pbEncoded;
|
blob->pbData = (LPBYTE)pbEncoded;
|
||||||
else
|
else
|
||||||
|
@ -2005,6 +2007,9 @@ static BOOL CRYPT_AsnDecodeCopyBytes(const BYTE *pbEncoded,
|
||||||
memcpy(blob->pbData, pbEncoded, blob->cbData);
|
memcpy(blob->pbData, pbEncoded, blob->cbData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
blob->pbData = NULL;
|
||||||
|
}
|
||||||
if (pcbDecoded)
|
if (pcbDecoded)
|
||||||
*pcbDecoded = encodedLen;
|
*pcbDecoded = encodedLen;
|
||||||
}
|
}
|
||||||
|
@ -2028,6 +2033,97 @@ static BOOL CRYPT_DecodeDERArray(const BYTE *pbEncoded, DWORD cbEncoded,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL CRYPT_AsnDecodeSMIMECapability(const BYTE *pbEncoded,
|
||||||
|
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||||
|
DWORD *pcbDecoded)
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
struct AsnDecodeSequenceItem items[] = {
|
||||||
|
{ ASN_OBJECTIDENTIFIER, offsetof(CRYPT_SMIME_CAPABILITY, pszObjId),
|
||||||
|
CRYPT_AsnDecodeOidIgnoreTag, sizeof(LPSTR), FALSE, TRUE,
|
||||||
|
offsetof(CRYPT_SMIME_CAPABILITY, pszObjId), 0 },
|
||||||
|
{ 0, offsetof(CRYPT_SMIME_CAPABILITY, Parameters),
|
||||||
|
CRYPT_AsnDecodeCopyBytes, sizeof(CRYPT_OBJID_BLOB), TRUE, TRUE,
|
||||||
|
offsetof(CRYPT_SMIME_CAPABILITY, Parameters.pbData), 0 },
|
||||||
|
};
|
||||||
|
PCRYPT_SMIME_CAPABILITY capability = (PCRYPT_SMIME_CAPABILITY)pvStructInfo;
|
||||||
|
|
||||||
|
TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
|
||||||
|
pvStructInfo, *pcbStructInfo);
|
||||||
|
|
||||||
|
ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]),
|
||||||
|
pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo,
|
||||||
|
pcbDecoded, capability ? capability->pszObjId : NULL);
|
||||||
|
TRACE("returning %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL CRYPT_AsnDecodeSMIMECapabilitiesInternal(const BYTE *pbEncoded,
|
||||||
|
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||||
|
DWORD *pcbDecoded)
|
||||||
|
{
|
||||||
|
struct AsnArrayDescriptor arrayDesc = { 0,
|
||||||
|
CRYPT_AsnDecodeSMIMECapability, sizeof(CRYPT_SMIME_CAPABILITY), TRUE,
|
||||||
|
offsetof(CRYPT_SMIME_CAPABILITY, pszObjId) };
|
||||||
|
PCRYPT_SMIME_CAPABILITIES capabilities =
|
||||||
|
(PCRYPT_SMIME_CAPABILITIES)pvStructInfo;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags,
|
||||||
|
NULL, pvStructInfo, pcbStructInfo, pcbDecoded,
|
||||||
|
capabilities ? capabilities->rgCapability : NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI CRYPT_AsnDecodeSMIMECapabilities(DWORD dwCertEncodingType,
|
||||||
|
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||||
|
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
|
||||||
|
pDecodePara, pvStructInfo, *pcbStructInfo);
|
||||||
|
|
||||||
|
__TRY
|
||||||
|
{
|
||||||
|
DWORD bytesNeeded;
|
||||||
|
|
||||||
|
if (!cbEncoded)
|
||||||
|
SetLastError(CRYPT_E_ASN1_EOD);
|
||||||
|
else if (pbEncoded[0] != ASN_SEQUENCEOF)
|
||||||
|
SetLastError(CRYPT_E_ASN1_CORRUPT);
|
||||||
|
else if ((ret = CRYPT_AsnDecodeSMIMECapabilitiesInternal(pbEncoded,
|
||||||
|
cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded,
|
||||||
|
NULL)))
|
||||||
|
{
|
||||||
|
if (!pvStructInfo)
|
||||||
|
*pcbStructInfo = bytesNeeded;
|
||||||
|
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
|
||||||
|
pvStructInfo, pcbStructInfo, bytesNeeded)))
|
||||||
|
{
|
||||||
|
PCRYPT_SMIME_CAPABILITIES capabilities;
|
||||||
|
|
||||||
|
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||||
|
pvStructInfo = *(BYTE **)pvStructInfo;
|
||||||
|
capabilities = (PCRYPT_SMIME_CAPABILITIES)pvStructInfo;
|
||||||
|
capabilities->rgCapability =
|
||||||
|
(PCRYPT_SMIME_CAPABILITY)((BYTE *)pvStructInfo +
|
||||||
|
sizeof(CRYPT_SMIME_CAPABILITIES));
|
||||||
|
ret = CRYPT_AsnDecodeSMIMECapabilitiesInternal(pbEncoded,
|
||||||
|
cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo,
|
||||||
|
&bytesNeeded, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__EXCEPT_PAGE_FAULT
|
||||||
|
{
|
||||||
|
SetLastError(STATUS_ACCESS_VIOLATION);
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
TRACE("returning %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL CRYPT_AsnDecodePKCSAttributeInternal(const BYTE *pbEncoded,
|
static BOOL CRYPT_AsnDecodePKCSAttributeInternal(const BYTE *pbEncoded,
|
||||||
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||||
DWORD *pcbDecoded)
|
DWORD *pcbDecoded)
|
||||||
|
@ -4603,6 +4699,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||||
case LOWORD(X509_ENHANCED_KEY_USAGE):
|
case LOWORD(X509_ENHANCED_KEY_USAGE):
|
||||||
decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage;
|
decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage;
|
||||||
break;
|
break;
|
||||||
|
case LOWORD(PKCS_SMIME_CAPABILITIES):
|
||||||
|
decodeFunc = CRYPT_AsnDecodeSMIMECapabilities;
|
||||||
|
break;
|
||||||
case LOWORD(PKCS_ATTRIBUTES):
|
case LOWORD(PKCS_ATTRIBUTES):
|
||||||
decodeFunc = CRYPT_AsnDecodePKCSAttributes;
|
decodeFunc = CRYPT_AsnDecodePKCSAttributes;
|
||||||
break;
|
break;
|
||||||
|
@ -4624,6 +4723,8 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||||
decodeFunc = CRYPT_AsnDecodeExtensions;
|
decodeFunc = CRYPT_AsnDecodeExtensions;
|
||||||
else if (!strcmp(lpszStructType, szOID_RSA_signingTime))
|
else if (!strcmp(lpszStructType, szOID_RSA_signingTime))
|
||||||
decodeFunc = CRYPT_AsnDecodeUtcTime;
|
decodeFunc = CRYPT_AsnDecodeUtcTime;
|
||||||
|
else if (!strcmp(lpszStructType, szOID_RSA_SMIMECapabilities))
|
||||||
|
decodeFunc = CRYPT_AsnDecodeSMIMECapabilities;
|
||||||
else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER))
|
else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER))
|
||||||
decodeFunc = CRYPT_AsnDecodeAuthorityKeyId;
|
decodeFunc = CRYPT_AsnDecodeAuthorityKeyId;
|
||||||
else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2))
|
else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2))
|
||||||
|
|
|
@ -5262,7 +5262,6 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding)
|
||||||
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
||||||
emptySequence, sizeof(emptySequence),
|
emptySequence, sizeof(emptySequence),
|
||||||
CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
|
CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
@ -5274,7 +5273,6 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding)
|
||||||
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
||||||
singleCapability, sizeof(singleCapability), CRYPT_DECODE_ALLOC_FLAG, NULL,
|
singleCapability, sizeof(singleCapability), CRYPT_DECODE_ALLOC_FLAG, NULL,
|
||||||
(BYTE *)&ptr, &size);
|
(BYTE *)&ptr, &size);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
@ -5289,7 +5287,6 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding)
|
||||||
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
||||||
singleCapabilitywithNULL, sizeof(singleCapabilitywithNULL),
|
singleCapabilitywithNULL, sizeof(singleCapabilitywithNULL),
|
||||||
CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
|
CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
@ -5307,7 +5304,6 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding)
|
||||||
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
|
||||||
twoCapabilities, sizeof(twoCapabilities), CRYPT_DECODE_ALLOC_FLAG, NULL,
|
twoCapabilities, sizeof(twoCapabilities), CRYPT_DECODE_ALLOC_FLAG, NULL,
|
||||||
(BYTE *)&ptr, &size);
|
(BYTE *)&ptr, &size);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue