asn1: Enrich asn1_print with schema
Our asn1_print, like OpenSSL's, just knows how to parse and dump DER. Ours can attempt to decode OCTET STRING and IMPLICIT-tagged constructed values as DER, which is very useful. But _now_ it's even better. Now it knows about all types exported from all ASN.1 modules in `lib/asn1/` in Heimdal, and if told to print as some type, it will use the new printing interface to print JSON-like representations of values: ``` $ ./asn1_print /tmp/t490/ek2.crt Certificate | jq '.tbsCertificate.extensions[3]._extnValue[]._values' [ { "_type": "TPMSpecification", "family": "2.0", "level": "0", "revision": "138" } ] [ { "_type": "TPMSecurityAssertions", "version": "0", "fieldUpgradable": true, "ekGenerationType": "655617", "ekGenerationLocation": "655616", "ekCertificateGenerationLocation": "655616", "ccInfo": { "_type": "CommonCriteriaMeasures", "version": "3.1", "assurancelevel": "4", "evaluationStatus": "2", "plus": true, "strengthOfFunction": null, "profileOid": null, "profileUri": null, "targetOid": null, "targetUri": null }, "fipsLevel": { "_type": "FIPSLevel", "version": "140-2", "level": "2", "plus": false }, "iso9000Certified": false, "iso9000Uri": null } ] ```
This commit is contained in:
@@ -41,6 +41,7 @@ extern int prefix_enum;
|
||||
RCSID("$Id$");
|
||||
|
||||
FILE *privheaderfile, *headerfile, *oidsfile, *codefile, *logfile, *templatefile;
|
||||
FILE *symsfile;
|
||||
|
||||
#define STEM "asn1"
|
||||
|
||||
@@ -285,6 +286,11 @@ init_generate (const char *filename, const char *base)
|
||||
oidsfile = fopen(fn, "w");
|
||||
if (oidsfile == NULL)
|
||||
err (1, "open %s", fn);
|
||||
if (asprintf(&fn, "%s_syms.x", base) < 0 || fn == NULL)
|
||||
errx(1, "malloc");
|
||||
symsfile = fopen(fn, "w");
|
||||
if (symsfile == NULL)
|
||||
err (1, "open %s", fn);
|
||||
free(fn);
|
||||
fn = NULL;
|
||||
|
||||
@@ -462,6 +468,10 @@ generate_constant (const Symbol *s)
|
||||
"enum { %s = %lld };\n\n",
|
||||
s->gen_name, s->gen_name, s->gen_name,
|
||||
(long long)s->value->u.integervalue);
|
||||
if (is_export(s->name))
|
||||
fprintf(symsfile, "ASN1_SYM_INTVAL(\"%s\", \"%s\", %s, %lld)\n",
|
||||
s->name, s->gen_name, s->gen_name,
|
||||
(long long)s->value->u.integervalue);
|
||||
break;
|
||||
case nullvalue:
|
||||
break;
|
||||
@@ -508,6 +518,9 @@ generate_constant (const Symbol *s)
|
||||
s->gen_name, (unsigned long)len, s->gen_name);
|
||||
|
||||
fprintf(oidsfile, "DEFINE_OID_WITH_NAME(%s)\n", s->gen_name);
|
||||
if (is_export(s->name))
|
||||
fprintf(symsfile, "ASN1_SYM_OID(\"%s\", \"%s\", %s)\n",
|
||||
s->name, s->gen_name, s->gen_name);
|
||||
|
||||
free(list);
|
||||
|
||||
@@ -1606,6 +1619,9 @@ generate_type_header (const Symbol *s)
|
||||
if (s->emitted_definition)
|
||||
return;
|
||||
|
||||
if (is_export(s->name))
|
||||
fprintf(symsfile, "ASN1_SYM_TYPE(\"%s\", \"%s\", %s)\n",
|
||||
s->name, s->gen_name, s->gen_name);
|
||||
fprintf(headerfile, "typedef ");
|
||||
define_type(0, s->gen_name, s->gen_name, NULL, s->type, TRUE,
|
||||
preserve_type(s->name) ? TRUE : FALSE);
|
||||
@@ -1632,7 +1648,7 @@ generate_type (const Symbol *s)
|
||||
if (!one_code_file)
|
||||
generate_header_of_codefile(s->gen_name);
|
||||
|
||||
generate_type_header (s);
|
||||
generate_type_header(s);
|
||||
|
||||
if (template_flag)
|
||||
generate_template(s);
|
||||
@@ -1691,5 +1707,5 @@ generate_type (const Symbol *s)
|
||||
if (!one_code_file) {
|
||||
fprintf(codefile, "\n\n");
|
||||
close_codefile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user