2018-11-26 04:23:26 +00:00
|
|
|
# Bluecrypt ASN.1 Parser
|
2018-11-26 04:17:00 +00:00
|
|
|
|
2018-11-28 16:53:44 +00:00
|
|
|
An ASN.1 decoder in less than 100 lines of Vanilla JavaScript,
|
2018-11-26 04:23:26 +00:00
|
|
|
part of the Bluecrypt suite.
|
2018-11-26 04:17:00 +00:00
|
|
|
<br>
|
|
|
|
<small>(< 150 with newlines and comments)</small>
|
|
|
|
|
|
|
|
# Features
|
|
|
|
|
2018-11-26 06:05:26 +00:00
|
|
|
| <100 lines of code | 1.1k gzipped | 2.5k minified | 4.7k with comments |
|
|
|
|
|
2018-11-26 04:17:00 +00:00
|
|
|
* [x] Complete ASN.1 parser
|
|
|
|
* [x] Parses x.509 certificates
|
|
|
|
* [x] PEM (base64-encoded DER)
|
|
|
|
* [x] VanillaJS, Zero Dependencies
|
2018-11-26 06:05:26 +00:00
|
|
|
* [x] Browsers (even old ones)
|
|
|
|
* [x] Online [Demo](https://coolaj86.com/demos/asn1-parser/)
|
2018-11-26 04:17:00 +00:00
|
|
|
* [ ] Node.js (built, publishing soon)
|
|
|
|
|
2018-11-28 16:53:44 +00:00
|
|
|
### Need an ASN.1 Builder too?
|
2018-11-28 16:52:03 +00:00
|
|
|
|
|
|
|
Check out https://git.coolaj86.com/coolaj86/asn1-packer.js/
|
|
|
|
|
2018-11-26 04:17:00 +00:00
|
|
|
# Demo
|
|
|
|
|
|
|
|
<https://coolaj86.com/demos/asn1-parser/>
|
2018-11-26 06:05:26 +00:00
|
|
|
|
|
|
|
<img border="1" src="https://i.imgur.com/gV7w7bM.png" />
|
2018-11-26 04:17:00 +00:00
|
|
|
|
|
|
|
# Usage
|
|
|
|
|
|
|
|
```html
|
|
|
|
<script src="https://git.coolaj86.com/coolaj86/asn1-parser.js/raw/branch/master/asn1-parser.js"></script>
|
|
|
|
```
|
|
|
|
|
|
|
|
```js
|
2018-11-26 04:23:26 +00:00
|
|
|
'use strict';
|
2018-11-26 04:17:00 +00:00
|
|
|
|
|
|
|
var ASN1 = window.ASN1 // 62 lines
|
|
|
|
var Enc = window.Enc // 27 lines
|
|
|
|
var PEM = window.PEM // 6 lines
|
|
|
|
|
|
|
|
var pem = [ '-----BEGIN EC PRIVATE KEY-----'
|
|
|
|
+ 'MHcCAQEEIImMnaNu2jRjvQwVFnhhDw/KDYtS2Q6n8T5kJYniwY1UoAoGCCqGSM49'
|
|
|
|
+ 'AwEHoUQDQgAEIT1SWLxsacPiE5Z16jkopAn8/+85rMjgyCokrnjDft6Y/YnA4A50'
|
|
|
|
+ 'yZe7CnFsqeDcpnPbubP6cpYiVcnevNIYyg=='
|
|
|
|
+ '-----END EC PRIVATE KEY-----'
|
|
|
|
].join('\n');
|
|
|
|
|
|
|
|
var der = PEM.parseBlock(pem).der;
|
|
|
|
var json = ASN1.parse(der);
|
|
|
|
|
|
|
|
console.log(json);
|
|
|
|
```
|
|
|
|
|
2018-11-26 04:30:21 +00:00
|
|
|
```js
|
2018-11-26 04:17:00 +00:00
|
|
|
{ "type": 48 /*0x30*/, "lengthSize": 0, "length": 89
|
|
|
|
, "children": [
|
|
|
|
{ "type": 48 /*0x30*/, "lengthSize": 0, "length": 19
|
|
|
|
, "children": [
|
2018-11-26 04:30:21 +00:00
|
|
|
{ "type": 6, "lengthSize": 0, "length": 7, "value": "<0x2a8648ce3d0201>" },
|
|
|
|
{ "type": 6, "lengthSize": 0, "length": 8, "value": "<0x2a8648ce3d030107>" }
|
2018-11-26 04:17:00 +00:00
|
|
|
]
|
|
|
|
},
|
|
|
|
{ "type": 3, "lengthSize": 0, "length": 66,
|
|
|
|
"value": "<0x04213d5258bc6c69c3e2139675ea3928a409fcffef39acc8e0c82a24ae78c37ede98fd89c0e00e74c997bb0a716ca9e0dca673dbb9b3fa72962255c9debcd218ca>"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Note: `value` will be a `Uint8Array`, not a hex string.
|
|
|
|
|
|
|
|
### Optimistic Parsing
|
|
|
|
|
2018-11-26 05:53:43 +00:00
|
|
|
This is a dumbed-down, minimal ASN1 parser
|
|
|
|
(though quite clever in its simplicity).
|
|
|
|
|
|
|
|
There are some ASN.1 types (at least Bit String and Octet String,
|
|
|
|
possibly others) that can be treated either as primitive values or
|
|
|
|
as container types base on the schema being used.
|
|
|
|
|
|
|
|
Rather than incorporating knowledge of each possible x509 schema,
|
|
|
|
this parser will return values for types that are _always_ values,
|
|
|
|
it recurse on types that are _always_ containers and, for ambigiuous
|
|
|
|
types, it will first try to recurse and, on error, will fall back to
|
|
|
|
returning a value.
|
|
|
|
|
|
|
|
In theory, it is possible that it will produce false positives,
|
|
|
|
but that would be highly unlikely in real-world scenarios
|
|
|
|
(PEM, x509, PKCS#1, SEC1, PKCS#8, SPKI, PKIX, CSR, etc).
|
2018-11-26 04:17:00 +00:00
|
|
|
|
|
|
|
I'd be interested to hear if you encounter such a case.
|
|
|
|
|
|
|
|
### Zero Dependencies
|
|
|
|
|
|
|
|
> A little copying is better than a little dependency - Golang Proverbs by Rob Pike
|
|
|
|
|
|
|
|
Rather than requiring hundreds (or thousands) of lines of dependencies,
|
|
|
|
this library takes the approach of including from other libraries in its suite
|
|
|
|
to produce a small, focused file that does exactly what it needs to do.
|
|
|
|
|
|
|
|
# Legal
|
|
|
|
|
2018-11-26 04:23:26 +00:00
|
|
|
[Bluecrypt VanillaJS ASN.1 Parser](https://git.coolaj86.com/coolaj86/asn1-parser.js) |
|
2018-11-26 04:17:00 +00:00
|
|
|
MPL-2.0
|