int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)
	{
	char *v;
	int gmt=0;
	int i;
	int y=0,M=0,d=0,h=0,m=0,s=0;
	char *f = NULL;
	int f_len = 0;
	i=tm->length;
	v=(char *)tm->data;
	if (i < 12) goto err;
	if (v[i-1] == 'Z') gmt=1;
	for (i=0; i<12; i++)
		if ((v[i] > '9') || (v[i] < '0')) goto err;
	y= (v[0]-'0')*1000+(v[1]-'0')*100 + (v[2]-'0')*10+(v[3]-'0');
	M= (v[4]-'0')*10+(v[5]-'0');
	if ((M > 12) || (M < 1)) goto err;
	d= (v[6]-'0')*10+(v[7]-'0');
	h= (v[8]-'0')*10+(v[9]-'0');
	m=  (v[10]-'0')*10+(v[11]-'0');
	if (	(v[12] >= '0') && (v[12] <= '9') &&
		(v[13] >= '0') && (v[13] <= '9'))
		{
		s=  (v[12]-'0')*10+(v[13]-'0');
		if (v[14] == '.')
			{
			int l = tm->length;
			f = &v[14];
			f_len = 1;
			while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9')
				++f_len;
			}
		}
	if (BIO_printf(bp,"%s %2d %02d:%02d:%02d%.*s %d%s",
		mon[M-1],d,h,m,s,f_len,f,y,(gmt)?" GMT":"") <= 0)
		return(0);
	else
		return(1);
err:
	BIO_write(bp,"Bad time value",14);
	return(0);
	}
['static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,\n\t     STACK_OF(CONF_VALUE) *policy, CA_DB *db, BIGNUM *serial, char *subj,\n\t     unsigned long chtype, int multirdn,\n\t     int email_dn, char *startdate, char *enddate, long days, int batch,\n\t     int verbose, X509_REQ *req, char *ext_sect, CONF *lconf,\n\t     unsigned long certopt, unsigned long nameopt, int default_op,\n\t     int ext_copy, int selfsign)\n\t{\n\tX509_NAME *name=NULL,*CAname=NULL,*subject=NULL, *dn_subject=NULL;\n\tASN1_UTCTIME *tm,*tmptm;\n\tASN1_STRING *str,*str2;\n\tASN1_OBJECT *obj;\n\tX509 *ret=NULL;\n\tX509_CINF *ci;\n\tX509_NAME_ENTRY *ne;\n\tX509_NAME_ENTRY *tne,*push;\n\tEVP_PKEY *pktmp;\n\tint ok= -1,i,j,last,nid;\n\tconst char *p;\n\tCONF_VALUE *cv;\n\tSTRING row[DB_NUMBER];\n\tSTRING *irow=NULL;\n\tSTRING *rrow=NULL;\n\tchar buf[25];\n\ttmptm=ASN1_UTCTIME_new();\n\tif (tmptm == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"malloc error\\n");\n\t\treturn(0);\n\t\t}\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\trow[i]=NULL;\n\tif (subj)\n\t\t{\n\t\tX509_NAME *n = parse_name(subj, chtype, multirdn);\n\t\tif (!n)\n\t\t\t{\n\t\t\tERR_print_errors(bio_err);\n\t\t\tgoto err;\n\t\t\t}\n\t\tX509_REQ_set_subject_name(req,n);\n\t\treq->req_info->enc.modified = 1;\n\t\tX509_NAME_free(n);\n\t\t}\n\tif (default_op)\n\t\tBIO_printf(bio_err,"The Subject\'s Distinguished Name is as follows\\n");\n\tname=X509_REQ_get_subject_name(req);\n\tfor (i=0; i<X509_NAME_entry_count(name); i++)\n\t\t{\n\t\tne= X509_NAME_get_entry(name,i);\n\t\tstr=X509_NAME_ENTRY_get_data(ne);\n\t\tobj=X509_NAME_ENTRY_get_object(ne);\n\t\tif (msie_hack)\n\t\t\t{\n\t\t\tnid=OBJ_obj2nid(ne->object);\n\t\t\tif (str->type == V_ASN1_UNIVERSALSTRING)\n\t\t\t\tASN1_UNIVERSALSTRING_to_string(str);\n\t\t\tif ((str->type == V_ASN1_IA5STRING) &&\n\t\t\t\t(nid != NID_pkcs9_emailAddress))\n\t\t\t\tstr->type=V_ASN1_T61STRING;\n\t\t\tif ((nid == NID_pkcs9_emailAddress) &&\n\t\t\t\t(str->type == V_ASN1_PRINTABLESTRING))\n\t\t\t\tstr->type=V_ASN1_IA5STRING;\n\t\t\t}\n\t\tif ((OBJ_obj2nid(obj) == NID_pkcs9_emailAddress) && (!email_dn))\n\t\t\tcontinue;\n\t\tif ((OBJ_obj2nid(obj) == NID_pkcs9_emailAddress) &&\n\t\t\t(str->type != V_ASN1_IA5STRING))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"\\nemailAddress type needs to be of type IA5STRING\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif ((str->type != V_ASN1_BMPSTRING) && (str->type != V_ASN1_UTF8STRING))\n\t\t\t{\n\t\t\tj=ASN1_PRINTABLE_type(str->data,str->length);\n\t\t\tif (\t((j == V_ASN1_T61STRING) &&\n\t\t\t\t (str->type != V_ASN1_T61STRING)) ||\n\t\t\t\t((j == V_ASN1_IA5STRING) &&\n\t\t\t\t (str->type == V_ASN1_PRINTABLESTRING)))\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"\\nThe string contains characters that are illegal for the ASN.1 type\\n");\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\t}\n\t\tif (default_op)\n\t\t\told_entry_print(bio_err, obj, str);\n\t\t}\n\tif ((subject=X509_NAME_new()) == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\tgoto err;\n\t\t}\n\tif (selfsign)\n\t\tCAname=X509_NAME_dup(name);\n\telse\n\t\tCAname=X509_NAME_dup(x509->cert_info->subject);\n\tif (CAname == NULL) goto err;\n\tstr=str2=NULL;\n\tfor (i=0; i<sk_CONF_VALUE_num(policy); i++)\n\t\t{\n\t\tcv=sk_CONF_VALUE_value(policy,i);\n\t\tif ((j=OBJ_txt2nid(cv->name)) == NID_undef)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"%s:unknown object type in \'policy\' configuration\\n",cv->name);\n\t\t\tgoto err;\n\t\t\t}\n\t\tobj=OBJ_nid2obj(j);\n\t\tlast= -1;\n\t\tfor (;;)\n\t\t\t{\n\t\t\tj=X509_NAME_get_index_by_OBJ(name,obj,last);\n\t\t\tif (j < 0)\n\t\t\t\t{\n\t\t\t\tif (last != -1) break;\n\t\t\t\ttne=NULL;\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\ttne=X509_NAME_get_entry(name,j);\n\t\t\t\t}\n\t\t\tlast=j;\n\t\t\tpush=NULL;\n\t\t\tif (strcmp(cv->value,"optional") == 0)\n\t\t\t\t{\n\t\t\t\tif (tne != NULL)\n\t\t\t\t\tpush=tne;\n\t\t\t\t}\n\t\t\telse if (strcmp(cv->value,"supplied") == 0)\n\t\t\t\t{\n\t\t\t\tif (tne == NULL)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field needed to be supplied and was missing\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tpush=tne;\n\t\t\t\t}\n\t\t\telse if (strcmp(cv->value,"match") == 0)\n\t\t\t\t{\n\t\t\t\tint last2;\n\t\t\t\tif (tne == NULL)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The mandatory %s field was missing\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\tlast2= -1;\nagain2:\n\t\t\t\tj=X509_NAME_get_index_by_OBJ(CAname,obj,last2);\n\t\t\t\tif ((j < 0) && (last2 == -1))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field does not exist in the CA certificate,\\nthe \'policy\' is misconfigured\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\tif (j >= 0)\n\t\t\t\t\t{\n\t\t\t\t\tpush=X509_NAME_get_entry(CAname,j);\n\t\t\t\t\tstr=X509_NAME_ENTRY_get_data(tne);\n\t\t\t\t\tstr2=X509_NAME_ENTRY_get_data(push);\n\t\t\t\t\tlast2=j;\n\t\t\t\t\tif (ASN1_STRING_cmp(str,str2) != 0)\n\t\t\t\t\t\tgoto again2;\n\t\t\t\t\t}\n\t\t\t\tif (j < 0)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field needed to be the same in the\\nCA certificate (%s) and the request (%s)\\n",cv->name,((str2 == NULL)?"NULL":(char *)str2->data),((str == NULL)?"NULL":(char *)str->data));\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"%s:invalid type in \'policy\' configuration\\n",cv->value);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tif (push != NULL)\n\t\t\t\t{\n\t\t\t\tif (!X509_NAME_add_entry(subject,push, -1, 0))\n\t\t\t\t\t{\n\t\t\t\t\tif (push != NULL)\n\t\t\t\t\t\tX509_NAME_ENTRY_free(push);\n\t\t\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tif (j < 0) break;\n\t\t\t}\n\t\t}\n\tif (preserve)\n\t\t{\n\t\tX509_NAME_free(subject);\n\t\tsubject=X509_NAME_dup(name);\n\t\tif (subject == NULL) goto err;\n\t\t}\n\tif (verbose)\n\t\tBIO_printf(bio_err,"The subject name appears to be ok, checking data base for clashes\\n");\n\tif (email_dn)\n\t\tdn_subject = subject;\n\telse\n\t\t{\n\t\tX509_NAME_ENTRY *tmpne;\n\t\tif (!(dn_subject = X509_NAME_dup(subject)))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\twhile((i = X509_NAME_get_index_by_NID(dn_subject,\n\t\t\t\t\tNID_pkcs9_emailAddress, -1)) >= 0)\n\t\t\t{\n\t\t\ttmpne = X509_NAME_get_entry(dn_subject, i);\n\t\t\tX509_NAME_delete_entry(dn_subject, i);\n\t\t\tX509_NAME_ENTRY_free(tmpne);\n\t\t\t}\n\t\t}\n\tif (BN_is_zero(serial))\n\t\trow[DB_serial]=BUF_strdup("00");\n\telse\n\t\trow[DB_serial]=BN_bn2hex(serial);\n\tif (row[DB_serial] == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\tgoto err;\n\t\t}\n\tif (db->attributes.unique_subject)\n\t\t{\n\t\tSTRING *crow=row;\n\t\trrow=TXT_DB_get_by_index(db->db,DB_name,crow);\n\t\tif (rrow != NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,\n\t\t\t\t"ERROR:There is already a certificate for %s\\n",\n\t\t\t\trow[DB_name]);\n\t\t\t}\n\t\t}\n\tif (rrow == NULL)\n\t\t{\n\t\trrow=TXT_DB_get_by_index(db->db,DB_serial,row);\n\t\tif (rrow != NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"ERROR:Serial number %s has already been issued,\\n",\n\t\t\t\trow[DB_serial]);\n\t\t\tBIO_printf(bio_err,"      check the database/serial_file for corruption\\n");\n\t\t\t}\n\t\t}\n\tif (rrow != NULL)\n\t\t{\n\t\tBIO_printf(bio_err,\n\t\t\t"The matching entry has the following details\\n");\n\t\tif (rrow[DB_type][0] == \'E\')\n\t\t\tp="Expired";\n\t\telse if (rrow[DB_type][0] == \'R\')\n\t\t\tp="Revoked";\n\t\telse if (rrow[DB_type][0] == \'V\')\n\t\t\tp="Valid";\n\t\telse\n\t\t\tp="\\ninvalid type, Data base error\\n";\n\t\tBIO_printf(bio_err,"Type\t  :%s\\n",p);;\n\t\tif (rrow[DB_type][0] == \'R\')\n\t\t\t{\n\t\t\tp=rrow[DB_exp_date]; if (p == NULL) p="undef";\n\t\t\tBIO_printf(bio_err,"Was revoked on:%s\\n",p);\n\t\t\t}\n\t\tp=rrow[DB_exp_date]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Expires on    :%s\\n",p);\n\t\tp=rrow[DB_serial]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Serial Number :%s\\n",p);\n\t\tp=rrow[DB_file]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"File name     :%s\\n",p);\n\t\tp=rrow[DB_name]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Subject Name  :%s\\n",p);\n\t\tok= -1;\n\t\tgoto err;\n\t\t}\n\tif (verbose)\n\t\tBIO_printf(bio_err,"Everything appears to be ok, creating and signing the certificate\\n");\n\tif ((ret=X509_new()) == NULL) goto err;\n\tci=ret->cert_info;\n#ifdef X509_V3\n\tif (!X509_set_version(ret,2)) goto err;\n#endif\n\tif (BN_to_ASN1_INTEGER(serial,ci->serialNumber) == NULL)\n\t\tgoto err;\n\tif (selfsign)\n\t\t{\n\t\tif (!X509_set_issuer_name(ret,subject))\n\t\t\tgoto err;\n\t\t}\n\telse\n\t\t{\n\t\tif (!X509_set_issuer_name(ret,X509_get_subject_name(x509)))\n\t\t\tgoto err;\n\t\t}\n\tif (strcmp(startdate,"today") == 0)\n\t\tX509_gmtime_adj(X509_get_notBefore(ret),0);\n\telse ASN1_UTCTIME_set_string(X509_get_notBefore(ret),startdate);\n\tif (enddate == NULL)\n\t\tX509_gmtime_adj(X509_get_notAfter(ret),(long)60*60*24*days);\n\telse ASN1_UTCTIME_set_string(X509_get_notAfter(ret),enddate);\n\tif (!X509_set_subject_name(ret,subject)) goto err;\n\tpktmp=X509_REQ_get_pubkey(req);\n\ti = X509_set_pubkey(ret,pktmp);\n\tEVP_PKEY_free(pktmp);\n\tif (!i) goto err;\n\tif (ext_sect)\n\t\t{\n\t\tX509V3_CTX ctx;\n\t\tif (ci->version == NULL)\n\t\t\tif ((ci->version=ASN1_INTEGER_new()) == NULL)\n\t\t\t\tgoto err;\n\t\tASN1_INTEGER_set(ci->version,2);\n\t\tif (ci->extensions != NULL)\n\t\t\tsk_X509_EXTENSION_pop_free(ci->extensions,\n\t\t\t\t\t\t   X509_EXTENSION_free);\n\t\tci->extensions = NULL;\n\t\tif (selfsign)\n\t\t\tX509V3_set_ctx(&ctx, ret, ret, req, NULL, 0);\n\t\telse\n\t\t\tX509V3_set_ctx(&ctx, x509, ret, req, NULL, 0);\n\t\tif (extconf)\n\t\t\t{\n\t\t\tif (verbose)\n\t\t\t\tBIO_printf(bio_err, "Extra configuration file found\\n");\n\t\t\tX509V3_set_nconf(&ctx, extconf);\n\t\t\tif (!X509V3_EXT_add_nconf(extconf, &ctx, ext_sect,ret))\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,\n\t\t\t\t    "ERROR: adding extensions in section %s\\n",\n\t\t\t\t\t\t\t\text_sect);\n\t\t\t\tERR_print_errors(bio_err);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tif (verbose)\n\t\t\t\tBIO_printf(bio_err, "Successfully added extensions from file.\\n");\n\t\t\t}\n\t\telse if (ext_sect)\n\t\t\t{\n\t\t\tX509V3_set_nconf(&ctx, lconf);\n\t\t\tif(!X509V3_EXT_add_nconf(lconf, &ctx, ext_sect, ret))\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err, "ERROR: adding extensions in section %s\\n", ext_sect);\n\t\t\t\tERR_print_errors(bio_err);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tif (verbose)\n\t\t\t\tBIO_printf(bio_err, "Successfully added extensions from config\\n");\n\t\t\t}\n\t\t}\n\tif (!copy_extensions(ret, req, ext_copy))\n\t\t{\n\t\tBIO_printf(bio_err, "ERROR: adding extensions from request\\n");\n\t\tERR_print_errors(bio_err);\n\t\tgoto err;\n\t\t}\n\tif( email_dn == 0 )\n\t\t{\n\t\tif (!X509_set_subject_name(ret,dn_subject)) goto err;\n\t\t}\n\tif (!default_op)\n\t\t{\n\t\tBIO_printf(bio_err, "Certificate Details:\\n");\n\t\tcertopt |= X509_FLAG_NO_SIGDUMP | X509_FLAG_NO_SIGNAME;\n\t\tX509_print_ex(bio_err, ret, nameopt, certopt);\n\t\t}\n\tBIO_printf(bio_err,"Certificate is to be certified until ");\n\tASN1_UTCTIME_print(bio_err,X509_get_notAfter(ret));\n\tif (days) BIO_printf(bio_err," (%ld days)",days);\n\tBIO_printf(bio_err, "\\n");\n\tif (!batch)\n\t\t{\n\t\tBIO_printf(bio_err,"Sign the certificate? [y/n]:");\n\t\t(void)BIO_flush(bio_err);\n\t\tbuf[0]=\'\\0\';\n\t\tfgets(buf,sizeof(buf)-1,stdin);\n\t\tif (!((buf[0] == \'y\') || (buf[0] == \'Y\')))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"CERTIFICATE WILL NOT BE CERTIFIED\\n");\n\t\t\tok=0;\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\tpktmp=X509_get_pubkey(ret);\n\tif (EVP_PKEY_missing_parameters(pktmp) &&\n\t\t!EVP_PKEY_missing_parameters(pkey))\n\t\tEVP_PKEY_copy_parameters(pktmp,pkey);\n\tEVP_PKEY_free(pktmp);\n\tif (!X509_sign(ret,pkey,dgst))\n\t\tgoto err;\n\trow[DB_type]=(char *)OPENSSL_malloc(2);\n\ttm=X509_get_notAfter(ret);\n\trow[DB_exp_date]=(char *)OPENSSL_malloc(tm->length+1);\n\tmemcpy(row[DB_exp_date],tm->data,tm->length);\n\trow[DB_exp_date][tm->length]=\'\\0\';\n\trow[DB_rev_date]=NULL;\n\trow[DB_file]=(char *)OPENSSL_malloc(8);\n\trow[DB_name]=X509_NAME_oneline(X509_get_subject_name(ret),NULL,0);\n\tif ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||\n\t\t(row[DB_file] == NULL) || (row[DB_name] == NULL))\n\t\t{\n\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\tgoto err;\n\t\t}\n\tBUF_strlcpy(row[DB_file],"unknown",8);\n\trow[DB_type][0]=\'V\';\n\trow[DB_type][1]=\'\\0\';\n\tif ((irow=(char **)OPENSSL_malloc(sizeof(char *)*(DB_NUMBER+1))) == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\tgoto err;\n\t\t}\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\t{\n\t\tirow[i]=row[i];\n\t\trow[i]=NULL;\n\t\t}\n\tirow[DB_NUMBER]=NULL;\n\tif (!TXT_DB_insert(db->db,irow))\n\t\t{\n\t\tBIO_printf(bio_err,"failed to update database\\n");\n\t\tBIO_printf(bio_err,"TXT_DB error number %ld\\n",db->db->error);\n\t\tgoto err;\n\t\t}\n\tok=1;\nerr:\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\tif (row[i] != NULL) OPENSSL_free(row[i]);\n\tif (CAname != NULL)\n\t\tX509_NAME_free(CAname);\n\tif (subject != NULL)\n\t\tX509_NAME_free(subject);\n\tif ((dn_subject != NULL) && !email_dn)\n\t\tX509_NAME_free(dn_subject);\n\tif (tmptm != NULL)\n\t\tASN1_UTCTIME_free(tmptm);\n\tif (ok <= 0)\n\t\t{\n\t\tif (ret != NULL) X509_free(ret);\n\t\tret=NULL;\n\t\t}\n\telse\n\t\t*xret=ret;\n\treturn(ok);\n\t}', 'int X509_set_subject_name(X509 *x, X509_NAME *name)\n\t{\n\tif ((x == NULL) || (x->cert_info == NULL)) return(0);\n\treturn(X509_NAME_set(&x->cert_info->subject,name));\n\t}', 'int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, unsigned long cflag)\n\t{\n\tlong l;\n\tint ret=0,i;\n\tchar *m=NULL,mlch = \' \';\n\tint nmindent = 0;\n\tX509_CINF *ci;\n\tASN1_INTEGER *bs;\n\tEVP_PKEY *pkey=NULL;\n\tconst char *neg;\n\tif((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {\n\t\t\tmlch = \'\\n\';\n\t\t\tnmindent = 12;\n\t}\n\tif(nmflags == X509_FLAG_COMPAT)\n\t\tnmindent = 16;\n\tci=x->cert_info;\n\tif(!(cflag & X509_FLAG_NO_HEADER))\n\t\t{\n\t\tif (BIO_write(bp,"Certificate:\\n",13) <= 0) goto err;\n\t\tif (BIO_write(bp,"    Data:\\n",10) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_VERSION))\n\t\t{\n\t\tl=X509_get_version(x);\n\t\tif (BIO_printf(bp,"%8sVersion: %lu (0x%lx)\\n","",l+1,l) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_SERIAL))\n\t\t{\n\t\tif (BIO_write(bp,"        Serial Number:",22) <= 0) goto err;\n\t\tbs=X509_get_serialNumber(x);\n\t\tif (bs->length <= 4)\n\t\t\t{\n\t\t\tl=ASN1_INTEGER_get(bs);\n\t\t\tif (l < 0)\n\t\t\t\t{\n\t\t\t\tl= -l;\n\t\t\t\tneg="-";\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tneg="";\n\t\t\tif (BIO_printf(bp," %s%lu (%s0x%lx)\\n",neg,l,neg,l) <= 0)\n\t\t\t\tgoto err;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tneg=(bs->type == V_ASN1_NEG_INTEGER)?" (Negative)":"";\n\t\t\tif (BIO_printf(bp,"\\n%12s%s","",neg) <= 0) goto err;\n\t\t\tfor (i=0; i<bs->length; i++)\n\t\t\t\t{\n\t\t\t\tif (BIO_printf(bp,"%02x%c",bs->data[i],\n\t\t\t\t\t((i+1 == bs->length)?\'\\n\':\':\')) <= 0)\n\t\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_SIGNAME))\n\t\t{\n\t\tif (BIO_printf(bp,"%8sSignature Algorithm: ","") <= 0)\n\t\t\tgoto err;\n\t\tif (i2a_ASN1_OBJECT(bp, ci->signature->algorithm) <= 0)\n\t\t\tgoto err;\n\t\tif (BIO_puts(bp, "\\n") <= 0)\n\t\t\tgoto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_ISSUER))\n\t\t{\n\t\tif (BIO_printf(bp,"        Issuer:%c",mlch) <= 0) goto err;\n\t\tif (X509_NAME_print_ex(bp,X509_get_issuer_name(x),nmindent, nmflags) < 0) goto err;\n\t\tif (BIO_write(bp,"\\n",1) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_VALIDITY))\n\t\t{\n\t\tif (BIO_write(bp,"        Validity\\n",17) <= 0) goto err;\n\t\tif (BIO_write(bp,"            Not Before: ",24) <= 0) goto err;\n\t\tif (!ASN1_TIME_print(bp,X509_get_notBefore(x))) goto err;\n\t\tif (BIO_write(bp,"\\n            Not After : ",25) <= 0) goto err;\n\t\tif (!ASN1_TIME_print(bp,X509_get_notAfter(x))) goto err;\n\t\tif (BIO_write(bp,"\\n",1) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_SUBJECT))\n\t\t{\n\t\tif (BIO_printf(bp,"        Subject:%c",mlch) <= 0) goto err;\n\t\tif (X509_NAME_print_ex(bp,X509_get_subject_name(x),nmindent, nmflags) < 0) goto err;\n\t\tif (BIO_write(bp,"\\n",1) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_PUBKEY))\n\t\t{\n\t\tif (BIO_write(bp,"        Subject Public Key Info:\\n",33) <= 0)\n\t\t\tgoto err;\n\t\tif (BIO_printf(bp,"%12sPublic Key Algorithm: ","") <= 0)\n\t\t\tgoto err;\n\t\tif (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0)\n\t\t\tgoto err;\n\t\tif (BIO_puts(bp, "\\n") <= 0)\n\t\t\tgoto err;\n\t\tpkey=X509_get_pubkey(x);\n\t\tif (pkey == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bp,"%12sUnable to load Public Key\\n","");\n\t\t\tERR_print_errors(bp);\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tEVP_PKEY_print_public(bp, pkey, 16, NULL);\n\t\t\tEVP_PKEY_free(pkey);\n\t\t\t}\n\t\t}\n\tif (!(cflag & X509_FLAG_NO_EXTENSIONS))\n\t\tX509V3_extensions_print(bp, "X509v3 extensions",\n\t\t\t\t\tci->extensions, cflag, 8);\n\tif(!(cflag & X509_FLAG_NO_SIGDUMP))\n\t\t{\n\t\tif(X509_signature_print(bp, x->sig_alg, x->signature) <= 0) goto err;\n\t\t}\n\tif(!(cflag & X509_FLAG_NO_AUX))\n\t\t{\n\t\tif (!X509_CERT_AUX_print(bp, x->aux, 0)) goto err;\n\t\t}\n\tret=1;\nerr:\n\tif (m != NULL) OPENSSL_free(m);\n\treturn(ret);\n\t}', 'int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)\n{\n\tif(tm->type == V_ASN1_UTCTIME) return ASN1_UTCTIME_print(bp, tm);\n\tif(tm->type == V_ASN1_GENERALIZEDTIME)\n\t\t\t\treturn ASN1_GENERALIZEDTIME_print(bp, tm);\n\tBIO_write(bp,"Bad time value",14);\n\treturn(0);\n}', 'int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)\n\t{\n\tchar *v;\n\tint gmt=0;\n\tint i;\n\tint y=0,M=0,d=0,h=0,m=0,s=0;\n\tchar *f = NULL;\n\tint f_len = 0;\n\ti=tm->length;\n\tv=(char *)tm->data;\n\tif (i < 12) goto err;\n\tif (v[i-1] == \'Z\') gmt=1;\n\tfor (i=0; i<12; i++)\n\t\tif ((v[i] > \'9\') || (v[i] < \'0\')) goto err;\n\ty= (v[0]-\'0\')*1000+(v[1]-\'0\')*100 + (v[2]-\'0\')*10+(v[3]-\'0\');\n\tM= (v[4]-\'0\')*10+(v[5]-\'0\');\n\tif ((M > 12) || (M < 1)) goto err;\n\td= (v[6]-\'0\')*10+(v[7]-\'0\');\n\th= (v[8]-\'0\')*10+(v[9]-\'0\');\n\tm=  (v[10]-\'0\')*10+(v[11]-\'0\');\n\tif (\t(v[12] >= \'0\') && (v[12] <= \'9\') &&\n\t\t(v[13] >= \'0\') && (v[13] <= \'9\'))\n\t\t{\n\t\ts=  (v[12]-\'0\')*10+(v[13]-\'0\');\n\t\tif (v[14] == \'.\')\n\t\t\t{\n\t\t\tint l = tm->length;\n\t\t\tf = &v[14];\n\t\t\tf_len = 1;\n\t\t\twhile (14 + f_len < l && f[f_len] >= \'0\' && f[f_len] <= \'9\')\n\t\t\t\t++f_len;\n\t\t\t}\n\t\t}\n\tif (BIO_printf(bp,"%s %2d %02d:%02d:%02d%.*s %d%s",\n\t\tmon[M-1],d,h,m,s,f_len,f,y,(gmt)?" GMT":"") <= 0)\n\t\treturn(0);\n\telse\n\t\treturn(1);\nerr:\n\tBIO_write(bp,"Bad time value",14);\n\treturn(0);\n\t}']