| 
									
										
										
										
											2018-11-25 21:23:26 -07:00
										 |  |  | # Bluecrypt ASN.1 Parser
 | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | An ASN.1 parser in less than 100 lines of Vanilla JavaScript, | 
					
						
							| 
									
										
										
										
											2018-11-25 21:23:26 -07:00
										 |  |  | part of the Bluecrypt suite. | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | <br> | 
					
						
							|  |  |  | <small>(< 150 with newlines and comments)</small> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Features
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-25 23:05:26 -07:00
										 |  |  | | <100 lines of code | 1.1k gzipped | 2.5k minified | 4.7k with comments | | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | * [x] Complete ASN.1 parser | 
					
						
							|  |  |  |   * [x] Parses x.509 certificates | 
					
						
							|  |  |  |   * [x] PEM (base64-encoded DER) | 
					
						
							|  |  |  | * [x] VanillaJS, Zero Dependencies | 
					
						
							| 
									
										
										
										
											2018-11-25 23:05:26 -07:00
										 |  |  |   * [x] Browsers (even old ones) | 
					
						
							|  |  |  |   * [x] Online [Demo](https://coolaj86.com/demos/asn1-parser/) | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  |   * [ ] Node.js (built, publishing soon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Demo
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <https://coolaj86.com/demos/asn1-parser/> | 
					
						
							| 
									
										
										
										
											2018-11-25 23:05:26 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | <img border="1" src="https://i.imgur.com/gV7w7bM.png" /> | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Usage
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							|  |  |  | <script src="https://git.coolaj86.com/coolaj86/asn1-parser.js/raw/branch/master/asn1-parser.js"></script> | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							| 
									
										
										
										
											2018-11-25 21:23:26 -07:00
										 |  |  | 'use strict'; | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07: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-25 21:30:21 -07:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | { "type": 48 /*0x30*/, "lengthSize": 0, "length": 89 | 
					
						
							|  |  |  | , "children": [ | 
					
						
							|  |  |  |     { "type": 48 /*0x30*/, "lengthSize": 0, "length": 19 | 
					
						
							|  |  |  | 		, "children": [ | 
					
						
							| 
									
										
										
										
											2018-11-25 21:30:21 -07:00
										 |  |  |         { "type": 6, "lengthSize": 0, "length": 7, "value": "<0x2a8648ce3d0201>" }, | 
					
						
							|  |  |  |         { "type": 6, "lengthSize": 0, "length": 8, "value": "<0x2a8648ce3d030107>" } | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  |       ] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { "type": 3, "lengthSize": 0, "length": 66, | 
					
						
							|  |  |  |       "value": "<0x04213d5258bc6c69c3e2139675ea3928a409fcffef39acc8e0c82a24ae78c37ede98fd89c0e00e74c997bb0a716ca9e0dca673dbb9b3fa72962255c9debcd218ca>" | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note: `value` will be a `Uint8Array`, not a hex string. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Optimistic Parsing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-25 22:53:43 -07: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-25 21:17:00 -07: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-25 21:23:26 -07:00
										 |  |  | [Bluecrypt VanillaJS ASN.1 Parser](https://git.coolaj86.com/coolaj86/asn1-parser.js) | | 
					
						
							| 
									
										
										
										
											2018-11-25 21:17:00 -07:00
										 |  |  | MPL-2.0 |