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:
Nicolas Williams
2021-02-24 21:08:17 -06:00
parent fb2c81f3e8
commit ece3c688e0
4 changed files with 911 additions and 35 deletions

View File

@@ -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();
}
}
}