crypt32: The KeyId member of an authority key identifier is an octet string, not an integer.
This commit is contained in:
parent
aa737174f0
commit
91fbdb561a
@ -3106,43 +3106,6 @@ static BOOL CRYPT_AsnDecodeAltNameInternal(const BYTE *pbEncoded,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like CRYPT_AsnDecodeIntegerInternal, but swaps the bytes */
|
|
||||||
static BOOL CRYPT_AsnDecodeIntegerSwapBytes(const BYTE *pbEncoded,
|
|
||||||
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
|
||||||
DWORD *pcbDecoded)
|
|
||||||
{
|
|
||||||
BOOL ret;
|
|
||||||
|
|
||||||
TRACE("(%p, %d, 0x%08x, %p, %d, %p)\n", pbEncoded, cbEncoded, dwFlags,
|
|
||||||
pvStructInfo, *pcbStructInfo, pcbDecoded);
|
|
||||||
|
|
||||||
/* Can't use the CRYPT_DECODE_NOCOPY_FLAG, because we modify the bytes in-
|
|
||||||
* place.
|
|
||||||
*/
|
|
||||||
ret = CRYPT_AsnDecodeIntegerInternal(pbEncoded, cbEncoded,
|
|
||||||
dwFlags & ~CRYPT_DECODE_NOCOPY_FLAG, pvStructInfo, pcbStructInfo,
|
|
||||||
pcbDecoded);
|
|
||||||
if (ret && pvStructInfo)
|
|
||||||
{
|
|
||||||
CRYPT_DATA_BLOB *blob = pvStructInfo;
|
|
||||||
|
|
||||||
if (blob->cbData)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
BYTE temp;
|
|
||||||
|
|
||||||
for (i = 0; i < blob->cbData / 2; i++)
|
|
||||||
{
|
|
||||||
temp = blob->pbData[i];
|
|
||||||
blob->pbData[i] = blob->pbData[blob->cbData - i - 1];
|
|
||||||
blob->pbData[blob->cbData - i - 1] = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TRACE("returning %d (%08x)\n", ret, GetLastError());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL WINAPI CRYPT_AsnDecodeAuthorityKeyId(DWORD dwCertEncodingType,
|
static BOOL WINAPI CRYPT_AsnDecodeAuthorityKeyId(DWORD dwCertEncodingType,
|
||||||
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||||
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||||
@ -3153,7 +3116,7 @@ static BOOL WINAPI CRYPT_AsnDecodeAuthorityKeyId(DWORD dwCertEncodingType,
|
|||||||
{
|
{
|
||||||
struct AsnDecodeSequenceItem items[] = {
|
struct AsnDecodeSequenceItem items[] = {
|
||||||
{ ASN_CONTEXT | 0, offsetof(CERT_AUTHORITY_KEY_ID_INFO, KeyId),
|
{ ASN_CONTEXT | 0, offsetof(CERT_AUTHORITY_KEY_ID_INFO, KeyId),
|
||||||
CRYPT_AsnDecodeIntegerSwapBytes, sizeof(CRYPT_DATA_BLOB),
|
CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB),
|
||||||
TRUE, TRUE, offsetof(CERT_AUTHORITY_KEY_ID_INFO, KeyId.pbData), 0 },
|
TRUE, TRUE, offsetof(CERT_AUTHORITY_KEY_ID_INFO, KeyId.pbData), 0 },
|
||||||
{ ASN_CONTEXT | ASN_CONSTRUCTOR| 1,
|
{ ASN_CONTEXT | ASN_CONSTRUCTOR| 1,
|
||||||
offsetof(CERT_AUTHORITY_KEY_ID_INFO, CertIssuer),
|
offsetof(CERT_AUTHORITY_KEY_ID_INFO, CertIssuer),
|
||||||
@ -3188,7 +3151,7 @@ static BOOL WINAPI CRYPT_AsnDecodeAuthorityKeyId2(DWORD dwCertEncodingType,
|
|||||||
{
|
{
|
||||||
struct AsnDecodeSequenceItem items[] = {
|
struct AsnDecodeSequenceItem items[] = {
|
||||||
{ ASN_CONTEXT | 0, offsetof(CERT_AUTHORITY_KEY_ID2_INFO, KeyId),
|
{ ASN_CONTEXT | 0, offsetof(CERT_AUTHORITY_KEY_ID2_INFO, KeyId),
|
||||||
CRYPT_AsnDecodeIntegerSwapBytes, sizeof(CRYPT_DATA_BLOB),
|
CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB),
|
||||||
TRUE, TRUE, offsetof(CERT_AUTHORITY_KEY_ID2_INFO, KeyId.pbData), 0 },
|
TRUE, TRUE, offsetof(CERT_AUTHORITY_KEY_ID2_INFO, KeyId.pbData), 0 },
|
||||||
{ ASN_CONTEXT | ASN_CONSTRUCTOR| 1,
|
{ ASN_CONTEXT | ASN_CONSTRUCTOR| 1,
|
||||||
offsetof(CERT_AUTHORITY_KEY_ID2_INFO, AuthorityCertIssuer),
|
offsetof(CERT_AUTHORITY_KEY_ID2_INFO, AuthorityCertIssuer),
|
||||||
|
@ -2438,45 +2438,6 @@ static BOOL WINAPI CRYPT_AsnEncodeAltNameEntry(DWORD dwCertEncodingType,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI CRYPT_AsnEncodeIntegerSwapBytes(DWORD dwCertEncodingType,
|
|
||||||
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
|
|
||||||
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
|
|
||||||
{
|
|
||||||
BOOL ret;
|
|
||||||
|
|
||||||
__TRY
|
|
||||||
{
|
|
||||||
const CRYPT_DATA_BLOB *blob = pvStructInfo;
|
|
||||||
CRYPT_DATA_BLOB newBlob = { blob->cbData, NULL };
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
if (newBlob.cbData)
|
|
||||||
{
|
|
||||||
newBlob.pbData = CryptMemAlloc(newBlob.cbData);
|
|
||||||
if (newBlob.pbData)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
|
|
||||||
for (i = 0; i < newBlob.cbData; i++)
|
|
||||||
newBlob.pbData[newBlob.cbData - i - 1] = blob->pbData[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ret = FALSE;
|
|
||||||
}
|
|
||||||
if (ret)
|
|
||||||
ret = CRYPT_AsnEncodeInteger(dwCertEncodingType, lpszStructType,
|
|
||||||
&newBlob, dwFlags, pEncodePara, pbEncoded, pcbEncoded);
|
|
||||||
CryptMemFree(newBlob.pbData);
|
|
||||||
}
|
|
||||||
__EXCEPT_PAGE_FAULT
|
|
||||||
{
|
|
||||||
SetLastError(STATUS_ACCESS_VIOLATION);
|
|
||||||
ret = FALSE;
|
|
||||||
}
|
|
||||||
__ENDTRY
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL WINAPI CRYPT_AsnEncodeAuthorityKeyId(DWORD dwCertEncodingType,
|
static BOOL WINAPI CRYPT_AsnEncodeAuthorityKeyId(DWORD dwCertEncodingType,
|
||||||
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
|
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
|
||||||
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
|
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
|
||||||
@ -2495,7 +2456,7 @@ static BOOL WINAPI CRYPT_AsnEncodeAuthorityKeyId(DWORD dwCertEncodingType,
|
|||||||
{
|
{
|
||||||
swapped[cSwapped].tag = ASN_CONTEXT | 0;
|
swapped[cSwapped].tag = ASN_CONTEXT | 0;
|
||||||
swapped[cSwapped].pvStructInfo = &info->KeyId;
|
swapped[cSwapped].pvStructInfo = &info->KeyId;
|
||||||
swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeIntegerSwapBytes;
|
swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeOctets;
|
||||||
items[cItem].pvStructInfo = &swapped[cSwapped];
|
items[cItem].pvStructInfo = &swapped[cSwapped];
|
||||||
items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
|
items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
|
||||||
cSwapped++;
|
cSwapped++;
|
||||||
@ -2626,7 +2587,7 @@ static BOOL WINAPI CRYPT_AsnEncodeAuthorityKeyId2(DWORD dwCertEncodingType,
|
|||||||
{
|
{
|
||||||
swapped[cSwapped].tag = ASN_CONTEXT | 0;
|
swapped[cSwapped].tag = ASN_CONTEXT | 0;
|
||||||
swapped[cSwapped].pvStructInfo = &info->KeyId;
|
swapped[cSwapped].pvStructInfo = &info->KeyId;
|
||||||
swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeIntegerSwapBytes;
|
swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeOctets;
|
||||||
items[cItem].pvStructInfo = &swapped[cSwapped];
|
items[cItem].pvStructInfo = &swapped[cSwapped];
|
||||||
items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
|
items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
|
||||||
cSwapped++;
|
cSwapped++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user