asn1_error_code k5_asn1_decode_generaltime(const unsigned char *asn1, size_t len, time_t *time_out) { const char *s = (char *)asn1; struct tm ts; time_t t; *time_out = 0; if (len != 15) return ASN1_BAD_LENGTH; /* Time encoding: YYYYMMDDhhmmssZ */ if (s[14] != 'Z') return ASN1_BAD_FORMAT; if (memcmp(s, "19700101000000Z", 15) == 0) { *time_out = 0; return 0; } #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); if (t == -1) return ASN1_BAD_TIMEFORMAT; *time_out = t; return 0; }
static krb5_error_code getepochtime(char *strtime, krb5_timestamp *epochtime) { struct tm tme; memset(&tme, 0, sizeof(tme)); if (strptime(strtime,"%Y%m%d%H%M%SZ", &tme) == NULL) { *epochtime = 0; return EINVAL; } *epochtime = krb5int_gmt_mktime(&tme); return 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(); }