| # Object identifier (NID and OID) generator | |
| This directory provides NIDs (numbered values for ASN.1 object identifiers and | |
| other symbols, used by other libraries to identify cryptographic primitives), | |
| and code for generating NIDs and object identifiers (OIDs). | |
| The files `nid.h`, `obj_mac.num`, and `obj_dat.h` are generated from | |
| `objects.txt` and `obj_mac.num`. To regenerate them, run: | |
| ``` | |
| go run objects.go | |
| ``` | |
| The above command must be run from this directory, `crypto/obj`. | |
| ## Directory contents | |
| * [`objects.txt`](./objects.txt) contains the list of all built-in OIDs. It is | |
| processed by [`objects.go`](./objects.go) to output `obj_mac.num`, | |
| `obj_dat.h`, and `nid.h`. See below for the format used in `objects.txt`. | |
| * `obj_mac.num` is the list of NID values for each OID. This is an input/output | |
| file so NID values are stable across regenerations. | |
| * `nid.h` is the header which defines macros for all the built-in OIDs in C. | |
| * `obj_dat.h` contains the ASN1_OBJECTs corresponding to built-in OIDs | |
| themselves along with lookup tables for search by short name, OID, etc. | |
| ## `objects.txt` Format Reference | |
| `objects.txt` is a sequence of object definitions and directives, each on one | |
| line. | |
| ### Directives | |
| Directives begin with `!`. Supported directives are: | |
| * `!module <name>`: Prefixes subsequent object names with `<name>_`. | |
| * `!global`: Resets the module prefix. | |
| * `!Cname <name>`: Overrides the name used in C symbols (e.g. `NID_<name>`) | |
| for the next object. | |
| * `!Alias <alias_name> <parent_path> <sibling_numbers...>`: Defines a reusable | |
| OID alias without emitting an object. | |
| ### Object Definitions | |
| An object definition has the format `<OID_PATH> : <short_name> : <long_name>`: | |
| * `<OID_PATH>` defines the OID with space-separated integers (e.g. `1 2 840`), | |
| optionally beginning with a reference to a previously defined parent OID arc | |
| (e.g. `X500algorithms 1 1`). | |
| * `<short_name>` and `<long_name>` are the short and long names for the OID, | |
| respectively. At least one must be provided. If one is missing, it takes the | |
| value of the other, but the corresponding `LN_<name>` or `SN_<name>` symbol | |
| will not be defined. | |
| Each object definition generates an entry in the objects table, and C symbols | |
| like `NID_<name>`. By default, the C symbols are named after `long_name` (if it | |
| has no spaces) or `short_name`. Spaces, dashes, and dots are replaced by | |
| underscores. This can be overridden by `!Cname`. | |
| For more examples, see [crypto/obj/objects.txt](./objects.txt). |