Example #1
0
asn1_error_code asn1_decode_generalstring(asn1buf *buf, unsigned int *retlen, char **val)
{
    setup();
    tag(ASN1_GENERALSTRING);
    retval = asn1buf_remove_charstring(buf,length,val);
    if (retval) return retval;
    *retlen = length;
    cleanup();
}
Example #2
0
asn1_error_code asn1_decode_ia5string(asn1buf *buf, int *retlen, char **val)
{
    setup();
    tag(ASN1_IA5STRING);
    retval = asn1buf_remove_charstring(buf,length,val);
    if (retval) return retval;
    *retlen = length;
    cleanup();
}
Example #3
0
asn1_error_code
asn1_decode_generaltime(asn1buf *buf, time_t *val)
{
    setup();
    char *s;
    struct tm ts;
    time_t t;

    tag(ASN1_GENERALTIME);

    if (length != 15) return ASN1_BAD_LENGTH;
    retval = asn1buf_remove_charstring(buf,15,&s);
    if (retval) return retval;
    /* Time encoding: YYYYMMDDhhmmssZ */
    if (s[14] != 'Z') {
        free(s);
        return ASN1_BAD_FORMAT;
    }
    if (s[0] == '1' && !memcmp("19700101000000Z", s, 15)) {
        t = 0;
        free(s);
        goto done;
    }
#define c2i(c) ((c)-'0')
    ts.tm_year = 1000*c2i(s[0]) + 100*c2i(s[1]) + 10*c2i(s[2]) + c2i(s[3])
        - 1900;
    ts.tm_mon = 10*c2i(s[4]) + c2i(s[5]) - 1;
    ts.tm_mday = 10*c2i(s[6]) + c2i(s[7]);
    ts.tm_hour = 10*c2i(s[8]) + c2i(s[9]);
    ts.tm_min = 10*c2i(s[10]) + c2i(s[11]);
    ts.tm_sec = 10*c2i(s[12]) + c2i(s[13]);
    ts.tm_isdst = -1;
    t = krb5int_gmt_mktime(&ts);
    free(s);

    if (t == -1) return ASN1_BAD_TIMEFORMAT;

done:
    *val = t;
    cleanup();
}