Messy hack, but here's what I arrived at. Please yell out if you smell anything too foul;
//============================================================================== // Based on X509_cmp_time() for intitial buffer hacking. //============================================================================== time_t KeyStore::ParseCRL::getTimeFromASN1(const ASN1_TIME * aTime) const { time_t lResult = 0;
char lBuffer[24]; char * pBuffer = lBuffer;
size_t lTimeLength = aTime->length; char * pString = (char *)aTime->data;
if (aTime->type == V_ASN1_UTCTIME) { if ((lTimeLength < 11) || (lTimeLength > 17)) { return 0; }
memcpy(pBuffer, pString, 10); pBuffer += 10; pString += 10; } else { if (lTimeLength < 13) { return 0; }
memcpy(pBuffer, pString, 12); pBuffer += 12; pString += 12; }
if ((*pString == 'Z') || (*pString == '-') || (*pString == '+')) { *(pBuffer++) = '0'; *(pBuffer++) = '0'; } else { *(pBuffer++) = *(pString++); *(pBuffer++) = *(pString++); // Skip any fractional seconds... if (*pString == '.') { pString++; while ((*pString >= '0') && (*pString <= '9')) { pString++; } } }
*(pBuffer++) = 'Z'; *(pBuffer++) = '\0';
time_t lSecondsFromUCT; if (*pString == 'Z') { lSecondsFromUCT = 0; } else { if ((*pString != '+') && (pString[5] != '-')) { return 0; }
lSecondsFromUCT = ((pString[1]-'0') * 10 + (pString[2]-'0')) * 60; lSecondsFromUCT += (pString[3]-'0') * 10 + (pString[4]-'0'); if (*pString == '-') { lSecondsFromUCT = -lSecondsFromUCT; } }
tm lTime; lTime.tm_sec = ((lBuffer[10] - '0') * 10) + (lBuffer[11] - '0'); lTime.tm_min = ((lBuffer[8] - '0') * 10) + (lBuffer[9] - '0'); lTime.tm_hour = ((lBuffer[6] - '0') * 10) + (lBuffer[7] - '0'); lTime.tm_mday = ((lBuffer[4] - '0') * 10) + (lBuffer[5] - '0'); lTime.tm_mon = (((lBuffer[2] - '0') * 10) + (lBuffer[3] - '0')) - 1; lTime.tm_year = ((lBuffer[0] - '0') * 10) + (lBuffer[1] - '0'); if (lTime.tm_year < 50) { lTime.tm_year += 100; // RFC 2459 } lTime.tm_wday = 0; lTime.tm_yday = 0; lTime.tm_isdst = 0; // No DST adjustment requested
lResult = mktime(&lTime);
if ((time_t)-1 != lResult)
{
if (0 != lTime.tm_isdst)
{
lResult -= 3600; // mktime may adjust for DST (OS dependent)
}
lResult += lSecondsFromUCT;
}
else
{
lResult = 0;
}
return lResult; }
Later - Jay
Jay Case wrote:
By chance, does anyone have a utility or example to get a time_t value from an ASN1_TIME? Something like;
time_t getTimeFromASN1(const ASN1_TIME *);
Thanks - Jay
______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]
______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]