int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) { /* Try UTC, if that fails, try GENERALIZED */ if (ASN1_UTCTIME_set_string(s, str)) return 1; return ASN1_GENERALIZEDTIME_set_string(s, str); }
static void timestamp_print(BIO *out, uint64_t timestamp) { ASN1_GENERALIZEDTIME *gen; char genstr[20]; gen = ASN1_GENERALIZEDTIME_new(); ASN1_GENERALIZEDTIME_adj(gen, (time_t)0, (int)(timestamp / 86400000), (timestamp % 86400000) / 1000); /* * Note GeneralizedTime from ASN1_GENERALIZETIME_adj is always 15 * characters long with a final Z. Update it with fractional seconds. */ BIO_snprintf(genstr, sizeof(genstr), "%.14s.%03dZ", ASN1_STRING_data(gen), (unsigned int)(timestamp % 1000)); ASN1_GENERALIZEDTIME_set_string(gen, genstr); ASN1_GENERALIZEDTIME_print(out, gen); ASN1_GENERALIZEDTIME_free(gen); }
PyObject* _set_asn1_time(char *format, ASN1_TIME* timestamp, PyObject *args) { char *when; if (!PyArg_ParseTuple(args, format, &when)) return NULL; if (ASN1_GENERALIZEDTIME_set_string(timestamp, when) == 0) { ASN1_GENERALIZEDTIME dummy; dummy.type = V_ASN1_GENERALIZEDTIME; dummy.length = strlen(when); dummy.data = (unsigned char *)when; if (!ASN1_GENERALIZEDTIME_check(&dummy)) { PyErr_SetString(PyExc_ValueError, "Invalid string"); } else { PyErr_SetString(PyExc_RuntimeError, "Unknown ASN1_GENERALIZEDTIME_set_string failure"); } return NULL; } Py_INCREF(Py_None); return Py_None; }