crypt32: Use simpler form for internal time decoding functions.
This commit is contained in:
parent
52be131a29
commit
a538e95c1d
|
@ -3444,32 +3444,20 @@ static BOOL CRYPT_AsnDecodeTimeZone(const BYTE *pbEncoded, DWORD len,
|
|||
|
||||
#define MIN_ENCODED_TIME_LENGTH 10
|
||||
|
||||
static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
|
||||
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||
static BOOL CRYPT_AsnDecodeUtcTimeInternal(const BYTE *pbEncoded,
|
||||
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||
DWORD *pcbDecoded)
|
||||
{
|
||||
BOOL ret;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (!pvStructInfo)
|
||||
{
|
||||
*pcbStructInfo = sizeof(FILETIME);
|
||||
return TRUE;
|
||||
}
|
||||
__TRY
|
||||
{
|
||||
ret = TRUE;
|
||||
if (pbEncoded[0] == ASN_UTCTIME)
|
||||
{
|
||||
if (cbEncoded <= 1)
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_EOD);
|
||||
ret = FALSE;
|
||||
}
|
||||
else if (pbEncoded[1] > 0x7f)
|
||||
{
|
||||
/* long-form date strings really can't be valid */
|
||||
SetLastError(CRYPT_E_ASN1_CORRUPT);
|
||||
ret = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3477,12 +3465,10 @@ static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
|
|||
BYTE len = pbEncoded[1];
|
||||
|
||||
if (len < MIN_ENCODED_TIME_LENGTH)
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_CORRUPT);
|
||||
ret = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = TRUE;
|
||||
pbEncoded += 2;
|
||||
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 2, sysTime.wYear);
|
||||
if (sysTime.wYear >= 50)
|
||||
|
@ -3506,12 +3492,12 @@ static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
|
|||
ret = CRYPT_AsnDecodeTimeZone(pbEncoded, len,
|
||||
&sysTime);
|
||||
}
|
||||
if (ret && (ret = CRYPT_DecodeEnsureSpace(dwFlags,
|
||||
pDecodePara, pvStructInfo, pcbStructInfo,
|
||||
sizeof(FILETIME))))
|
||||
if (ret)
|
||||
{
|
||||
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||
pvStructInfo = *(BYTE **)pvStructInfo;
|
||||
if (!pvStructInfo)
|
||||
*pcbStructInfo = sizeof(FILETIME);
|
||||
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, NULL,
|
||||
pvStructInfo, pcbStructInfo, sizeof(FILETIME))))
|
||||
ret = SystemTimeToFileTime(&sysTime,
|
||||
(FILETIME *)pvStructInfo);
|
||||
}
|
||||
|
@ -3519,60 +3505,71 @@ static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_BADTAG);
|
||||
ret = FALSE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
|
||||
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||
{
|
||||
BOOL ret = FALSE;
|
||||
|
||||
__TRY
|
||||
{
|
||||
DWORD bytesNeeded;
|
||||
|
||||
ret = CRYPT_AsnDecodeUtcTimeInternal(pbEncoded, cbEncoded,
|
||||
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
|
||||
if (ret)
|
||||
{
|
||||
if (!pvStructInfo)
|
||||
*pcbStructInfo = bytesNeeded;
|
||||
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags,
|
||||
pDecodePara, pvStructInfo, pcbStructInfo, bytesNeeded)))
|
||||
{
|
||||
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||
pvStructInfo = *(BYTE **)pvStructInfo;
|
||||
ret = CRYPT_AsnDecodeUtcTimeInternal(pbEncoded, cbEncoded,
|
||||
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo,
|
||||
&bytesNeeded, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
SetLastError(STATUS_ACCESS_VIOLATION);
|
||||
ret = FALSE;
|
||||
}
|
||||
__ENDTRY
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BOOL WINAPI CRYPT_AsnDecodeGeneralizedTime(DWORD dwCertEncodingType,
|
||||
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||
static BOOL CRYPT_AsnDecodeGeneralizedTime(const BYTE *pbEncoded,
|
||||
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||
DWORD *pcbDecoded)
|
||||
{
|
||||
BOOL ret;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (!pvStructInfo)
|
||||
{
|
||||
*pcbStructInfo = sizeof(FILETIME);
|
||||
return TRUE;
|
||||
}
|
||||
__TRY
|
||||
{
|
||||
ret = TRUE;
|
||||
if (pbEncoded[0] == ASN_GENERALTIME)
|
||||
{
|
||||
if (cbEncoded <= 1)
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_EOD);
|
||||
ret = FALSE;
|
||||
}
|
||||
else if (pbEncoded[1] > 0x7f)
|
||||
{
|
||||
/* long-form date strings really can't be valid */
|
||||
SetLastError(CRYPT_E_ASN1_CORRUPT);
|
||||
ret = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE len = pbEncoded[1];
|
||||
|
||||
if (len < MIN_ENCODED_TIME_LENGTH)
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_CORRUPT);
|
||||
ret = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SYSTEMTIME sysTime = { 0 };
|
||||
|
||||
ret = TRUE;
|
||||
pbEncoded += 2;
|
||||
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 4, sysTime.wYear);
|
||||
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 2, sysTime.wMonth);
|
||||
|
@ -3601,9 +3598,12 @@ static BOOL WINAPI CRYPT_AsnDecodeGeneralizedTime(DWORD dwCertEncodingType,
|
|||
ret = CRYPT_AsnDecodeTimeZone(pbEncoded, len,
|
||||
&sysTime);
|
||||
}
|
||||
if (ret && (ret = CRYPT_DecodeEnsureSpace(dwFlags,
|
||||
pDecodePara, pvStructInfo, pcbStructInfo,
|
||||
sizeof(FILETIME))))
|
||||
if (ret)
|
||||
{
|
||||
if (!pvStructInfo)
|
||||
*pcbStructInfo = sizeof(FILETIME);
|
||||
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, NULL,
|
||||
pvStructInfo, pcbStructInfo, sizeof(FILETIME))))
|
||||
{
|
||||
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||
pvStructInfo = *(BYTE **)pvStructInfo;
|
||||
|
@ -3613,18 +3613,31 @@ static BOOL WINAPI CRYPT_AsnDecodeGeneralizedTime(DWORD dwCertEncodingType,
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
SetLastError(CRYPT_E_ASN1_BADTAG);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BOOL CRYPT_AsnDecodeChoiceOfTimeInternal(const BYTE *pbEncoded,
|
||||
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
|
||||
DWORD *pcbDecoded)
|
||||
{
|
||||
BOOL ret;
|
||||
InternalDecodeFunc decode = NULL;
|
||||
|
||||
if (pbEncoded[0] == ASN_UTCTIME)
|
||||
decode = CRYPT_AsnDecodeUtcTimeInternal;
|
||||
else if (pbEncoded[0] == ASN_GENERALTIME)
|
||||
decode = CRYPT_AsnDecodeGeneralizedTime;
|
||||
if (decode)
|
||||
ret = decode(pbEncoded, cbEncoded, dwFlags, pvStructInfo,
|
||||
pcbStructInfo, pcbDecoded);
|
||||
else
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_BADTAG);
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
SetLastError(STATUS_ACCESS_VIOLATION);
|
||||
ret = FALSE;
|
||||
}
|
||||
__ENDTRY
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -3636,18 +3649,23 @@ static BOOL WINAPI CRYPT_AsnDecodeChoiceOfTime(DWORD dwCertEncodingType,
|
|||
|
||||
__TRY
|
||||
{
|
||||
if (pbEncoded[0] == ASN_UTCTIME)
|
||||
ret = CRYPT_AsnDecodeUtcTime(dwCertEncodingType, lpszStructType,
|
||||
pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo,
|
||||
pcbStructInfo);
|
||||
else if (pbEncoded[0] == ASN_GENERALTIME)
|
||||
ret = CRYPT_AsnDecodeGeneralizedTime(dwCertEncodingType,
|
||||
lpszStructType, pbEncoded, cbEncoded, dwFlags, pDecodePara,
|
||||
pvStructInfo, pcbStructInfo);
|
||||
else
|
||||
DWORD bytesNeeded;
|
||||
|
||||
ret = CRYPT_AsnDecodeChoiceOfTimeInternal(pbEncoded, cbEncoded,
|
||||
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
|
||||
if (ret)
|
||||
{
|
||||
SetLastError(CRYPT_E_ASN1_BADTAG);
|
||||
ret = FALSE;
|
||||
if (!pvStructInfo)
|
||||
*pcbStructInfo = bytesNeeded;
|
||||
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
|
||||
pvStructInfo, pcbStructInfo, bytesNeeded)))
|
||||
{
|
||||
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||
pvStructInfo = *(BYTE **)pvStructInfo;
|
||||
ret = CRYPT_AsnDecodeChoiceOfTimeInternal(pbEncoded, cbEncoded,
|
||||
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo,
|
||||
&bytesNeeded, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
|
|
Loading…
Reference in New Issue