Commit 9e5df8e4 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Support custom primitive type printing routines and add one to LONG type.

parent 96d13fe6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -654,6 +654,7 @@ typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval,

typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx);

typedef struct ASN1_COMPAT_FUNCS_st {
	ASN1_new_func *asn1_new;
@@ -680,6 +681,7 @@ typedef struct ASN1_PRIMITIVE_FUNCS_st {
	ASN1_ex_free_func *prim_clear;
	ASN1_primitive_c2i *prim_c2i;
	ASN1_primitive_i2c *prim_i2c;
	ASN1_primitive_print *prim_print;
} ASN1_PRIMITIVE_FUNCS;

/* This is the ASN1_AUX structure: it handles various
+4 −0
Original line number Diff line number Diff line
@@ -522,8 +522,12 @@ static int asn1_primitive_print(BIO *out, ASN1_VALUE **fld,
	ASN1_STRING *str;
	int ret = 1, needlf = 1;
	const char *pname;
	const ASN1_PRIMITIVE_FUNCS *pf;
	pf = it->funcs;
	if (!asn1_print_fsname(out, indent, fname, sname, pctx))
			return 0;
	if (pf && pf->prim_print)
		return pf->prim_print(out, fld, it, indent, pctx);
	str = (ASN1_STRING *)*fld;
	if (it->itype == ASN1_ITYPE_MSTRING)
		utype = str->type & ~V_ASN1_NEG;
+9 −1
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ static void long_free(ASN1_VALUE **pval, const ASN1_ITEM *it);

static int long_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
static int long_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
static int long_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx);

static ASN1_PRIMITIVE_FUNCS long_pf = {
	NULL, 0,
@@ -78,7 +79,8 @@ static ASN1_PRIMITIVE_FUNCS long_pf = {
	long_free,
	long_free,	/* Clear should set to initial value */
	long_c2i,
	long_i2c
	long_i2c,
	long_print
};

ASN1_ITEM_start(LONG)
@@ -169,3 +171,9 @@ static int long_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
	memcpy(cp, &ltmp, sizeof(long));
	return 1;
}

static int long_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it,
			int indent, const ASN1_PCTX *pctx)
	{
	return BIO_printf(out, "%ld\n", *(long *)pval);
	}