83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Bluecrypt ASN.1 Packer
 | |
| 
 | |
| An ASN.1 builder in less than 100 lines of Vanilla JavaScript,
 | |
| part of the Bluecrypt suite.
 | |
| <br>
 | |
| <small>(< 150 with newlines and comments)</small>
 | |
| 
 | |
| # Features
 | |
| 
 | |
| | <100 lines of code | <1k gzipped | 1.8k minified | 3.3k with comments |
 | |
| 
 | |
| * [x] Complete ASN.1 packer
 | |
|   * [x] Parses x.509 certificates
 | |
|   * [x] PEM (base64-encoded DER)
 | |
| * [x] VanillaJS, Zero Dependencies
 | |
|   * [x] Browsers (even old ones)
 | |
|   * [x] Online [Demo](https://coolaj86.com/demos/asn1-packer/)
 | |
|   * [ ] Node.js (built, publishing soon)
 | |
| 
 | |
| # Demo
 | |
| 
 | |
| <https://coolaj86.com/demos/asn1-packer/>
 | |
| 
 | |
| <img border="1" src="https://i.imgur.com/phGeuMw.png" />
 | |
| 
 | |
| # Usage
 | |
| 
 | |
| ```html
 | |
| <script src="https://git.coolaj86.com/coolaj86/asn1-packer.js/raw/branch/master/asn1-packer.js"></script>
 | |
| ```
 | |
| 
 | |
| ```js
 | |
| 'use strict';
 | |
| 
 | |
| var ASN1 = window.ASN1  // 62 lines
 | |
| var Enc = window.Enc    // 27 lines
 | |
| var PEM = window.PEM    //  6 lines
 | |
| 
 | |
| var arr = [
 | |
|   0x30,
 | |
|   [
 | |
|     [ 0x30, [ [ 0x06, "2a8648ce3d0201" ], [ 0x06, "2a8648ce3d030107" ] ] ],
 | |
|     [ 0x03, "04213d5258bc6c69c3e2139675ea3928a409fcffef39acc8e0c82a24ae78c37ede98fd89c0e00e74c997bb0a716ca9e0dca673dbb9b3fa72962255c9debcd218ca" ]
 | |
|   ]
 | |
| ];
 | |
| 
 | |
| var hex = ASN1.pack(arr);
 | |
| var buf = Enc.hexToBuf(hex);
 | |
| var pem = PEM.packBlock({ type: "PUBLIC KEY", bytes: buf });
 | |
| 
 | |
| console.log(pem);
 | |
| ```
 | |
| 
 | |
| ```
 | |
| -----BEGIN PUBLIC KEY-----
 | |
| MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIT1SWLxsacPiE5Z16jkopAn8/+85
 | |
| rMjgyCokrnjDft6Y/YnA4A50yZe7CnFsqeDcpnPbubP6cpYiVcnevNIYyg==
 | |
| -----END PUBLIC KEY-----
 | |
| ```
 | |
| 
 | |
| ### Simple Packing
 | |
| 
 | |
| All types are handled by the same rules except for Integer (0x02)
 | |
| and Bit String (0x03), which require special padding.
 | |
| 
 | |
| This is sufficient for RSA and EC keypairs, and CSRs.
 | |
| 
 | |
| I don't know of any format for which it is not sufficient,
 | |
| but if you find one I'd like to know about it.
 | |
| 
 | |
| ### 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
 | |
| 
 | |
| [Bluecrypt VanillaJS ASN.1 Packer](https://git.coolaj86.com/coolaj86/asn1-packer.js) |
 | |
| MPL-2.0
 |