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
	 Nicolas Williams
					Nicolas Williams