Hey All,

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]

Reply via email to