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(); }
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(); }
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(); }