ASN1_GENERALIZEDTIME *d2i_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME **a, unsigned char **pp, long length) { ASN1_GENERALIZEDTIME *ret=NULL; ret=(ASN1_GENERALIZEDTIME *)d2i_ASN1_bytes((ASN1_STRING **)a,pp,length, V_ASN1_GENERALIZEDTIME,V_ASN1_UNIVERSAL); if (ret == NULL) { ASN1err(ASN1_F_D2I_ASN1_GENERALIZEDTIME,ERR_R_NESTED_ASN1_ERROR); return(NULL); } #ifdef CHARSET_EBCDIC ascii2ebcdic(ret->data, ret->data, ret->length); #endif if (!ASN1_GENERALIZEDTIME_check(ret)) { ASN1err(ASN1_F_D2I_ASN1_GENERALIZEDTIME,ASN1_R_INVALID_TIME_FORMAT); goto err; } return(ret); err: if ((ret != NULL) && ((a == NULL) || (*a != ret))) M_ASN1_GENERALIZEDTIME_free(ret); return(NULL); }
int GT_GENERALIZEDTIME_get(const ASN1_GENERALIZEDTIME* genTime, struct tm* the_time) { assert(genTime != NULL && the_time != NULL); /* WARNING: This function cannot be used as a general decoder for * ASN1_GENERALIZEDTIME values because it assumes that input value is * expressed in UTC timezone (value ends with Z). However, this condition * is satisfied for values set by ASN1_GENERALIZEDTIME_set(). */ if (!ASN1_GENERALIZEDTIME_check((ASN1_GENERALIZEDTIME*)genTime) || genTime->data[genTime->length - 1] != 'Z') { return GT_INVALID_FORMAT; } memset(the_time, 0, sizeof(*the_time)); /* HACK: ASN1_GENERALIZEDTIME is actually ASN1_STRING. * OpenSSL doesn't provide any functions of getting the time out of * the structure. Such a pity... */ sscanf((const char*)genTime->data, "%04d%02d%02d%02d%02d%02d", &the_time->tm_year, &the_time->tm_mon, &the_time->tm_mday, &the_time->tm_hour, &the_time->tm_min, &the_time->tm_sec); the_time->tm_year -= 1900; the_time->tm_mon--; return GT_OK; }
int ASN1_TIME_check(ASN1_TIME *t) { if (t->type == V_ASN1_GENERALIZEDTIME) return ASN1_GENERALIZEDTIME_check(t); else if (t->type == V_ASN1_UTCTIME) return ASN1_UTCTIME_check(t); return 0; }
int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) { ASN1_GENERALIZEDTIME t; t.type = V_ASN1_GENERALIZEDTIME; t.length = strlen(str); t.data = (unsigned char *)str; if (ASN1_GENERALIZEDTIME_check(&t)) { if (s != NULL) { if (!ASN1_STRING_set((ASN1_STRING *)s, str, t.length)) return 0; s->type = V_ASN1_GENERALIZEDTIME; } return (1); } else return (0); }
int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) { ASN1_GENERALIZEDTIME t; t.type = V_ASN1_GENERALIZEDTIME; t.length = strlen(str); t.data = (unsigned char *)str; t.flags = 0; if (!ASN1_GENERALIZEDTIME_check(&t)) return 0; if (s != NULL && !ASN1_STRING_copy(s, &t)) return 0; return 1; }
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; }