| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | # @root/pem
 | 
					
						
							| 
									
										
										
										
											2019-10-12 18:25:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | Built by [The Root Company](https://therootcompany.com) | 
					
						
							|  |  |  | for [Greenlock](https://greenlock.domains) | 
					
						
							|  |  |  | and [ACME.js](https://git.rootprojects.org/root/acme.js) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | Lightweight, Zero-Dependency PEM encoder and decoder. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | | ~300b gzipped | 
					
						
							|  |  |  | | ~650b minified | 
					
						
							|  |  |  | | ~1k full | 
					
						
							|  |  |  | | | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | -   [x] Zero Dependencies | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | -   [x] Universal Support | 
					
						
							|  |  |  |     -   [x] Node.js | 
					
						
							|  |  |  |     -   [x] Browsers | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | -   [x] VanillaJS | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | This library supports PEM, which is pretty boring on its own. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Most likely you are also interested in some of the following: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -   [keypairs.js](https://git.rootprojects.org/root/keypairs.js) | 
					
						
							|  |  |  |     -   RSA | 
					
						
							|  |  |  |     -   EC / ECDSA | 
					
						
							|  |  |  | -   [x509.js](https://git.rootprojects.org/root/x509.js) | 
					
						
							|  |  |  | -   [asn1.js](https://git.rootprojects.org/root/asn1.js) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | Want to [contribute](#contributions)? | 
					
						
							|  |  |  | Need [commercial support](#commercial-support)? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | # Usage
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -   PEM.parseBlock(str) | 
					
						
							|  |  |  | -   PEM.packBlock(options) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var PEM = require('@root/pem/parser'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var block = PEM.parseBlock( | 
					
						
							|  |  |  | 	'-----BEGIN Type-----\nSGVsbG8sIOS4lueVjCE=\n-----END Type-----\n' | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bytes: `<48 65 6c 6c 6f 2c 20 e4 b8 96 e7 95 8c 21>`; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Packing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var PEM = require('@root/pem/packer'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var block = PEM.packBlock({ | 
					
						
							|  |  |  |   type: 'Type', | 
					
						
							|  |  |  |   // Buffer or Uint8Array or Array | 
					
						
							|  |  |  |   bytes: [0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0xe4, 0xb8, 0x96, 0xe7, 0x95, 0x8c, 0x21] | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```txt | 
					
						
							|  |  |  | -----BEGIN Type----- | 
					
						
							|  |  |  | SGVsbG8sIOS4lueVjCE= | 
					
						
							|  |  |  | -----END Type----- | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Install
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | This works equally well in Browsers and Node.js, | 
					
						
							|  |  |  | but has slightly different code. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Node (and Webpack)
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 00:43:49 -06:00
										 |  |  | ```bash | 
					
						
							|  |  |  | npm install --save @root/pem | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var PEM = require('@root/pem'); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2019-10-13 00:43:49 -06:00
										 |  |  | // just the packer | 
					
						
							|  |  |  | var PEM = require('@root/pem/packer'); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | // just the parser | 
					
						
							|  |  |  | var PEM = require('@root/pem/parser'); | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | ## Browsers (Vanilla JS)
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							|  |  |  | <script src="https://unpkg.com/@root/pem/dist/pem.all.js"></script> | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							|  |  |  | <script src="https://unpkg.com/@root/pem/dist/pem.all.min.js"></script> | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # A PEM Block
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A Block represents a PEM encoded structure. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The encoded form is: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```txt | 
					
						
							|  |  |  | -----BEGIN Type----- | 
					
						
							|  |  |  | Headers | 
					
						
							|  |  |  | base64-encoded Bytes | 
					
						
							|  |  |  | -----END Type----- | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | where Headers is a possibly empty sequence of Key: Value lines. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (credit: https://golang.org/pkg/encoding/pem/) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # PEM History
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PEM was introduced in 1993 via RFC 1421, but not formally | 
					
						
							|  |  |  | standardized until RFC 7468 in April of 2015. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It has served as the _de facto_ standard for a variety of | 
					
						
							|  |  |  | DER-encoded X509 schemas of ASN.1 data for cryptographic | 
					
						
							|  |  |  | keys and certificates such as: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -   [x] PKCS#10 (Certificate Signing Request [CSR]) | 
					
						
							|  |  |  | -   [x] X509 Certificate (fullchain.pem, site.crt) | 
					
						
							|  |  |  | -   [x] PKIX (cert.pem, privkey.pem, priv.key) | 
					
						
							|  |  |  |     -   [x] PKCS#1 (RSA Public and Private Keys) | 
					
						
							|  |  |  |     -   [x] PKCS#8 (RSA and ECDSA Keypairs) | 
					
						
							|  |  |  | -   [x] SEC#1 (ECDSARSA Public and Private Keys) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | # Contributions
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | Did this project save you some time? Maybe make your day? Even save the day? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Please say "thanks" via Paypal or Patreon: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -   Paypal: [\$5](https://paypal.me/rootprojects/5) | [\$10](https://paypal.me/rootprojects/10) | Any amount: <paypal@therootcompany.com> | 
					
						
							|  |  |  | -   Patreon: <https://patreon.com/rootprojects> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Where does your contribution go? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | [Root](https://therootcompany.com) is a collection of experts | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | who trust each other and enjoy working together on deep-tech, | 
					
						
							|  |  |  | Indie Web projects. | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | Our goal is to operate as a sustainable community. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Your contributions - both in code and _especially_ monetarily - | 
					
						
							|  |  |  | help to not just this project, but also our broader work | 
					
						
							|  |  |  | of [projects](https://rootprojects.org) that fuel the **Indie Web**. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:38:25 -06:00
										 |  |  | Also, we chat on [Keybase](https://keybase.io) | 
					
						
							|  |  |  | in [#rootprojects](https://keybase.io/team/rootprojects) | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Commercial Support
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Do you need... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -   more features? | 
					
						
							|  |  |  | -   bugfixes, on _your_ timeline? | 
					
						
							|  |  |  | -   custom code, built by experts? | 
					
						
							|  |  |  | -   commercial support and licensing? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Contact <aj@therootcompany.com> for support options. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | # Legal
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 19:31:19 -06:00
										 |  |  | Copyright [AJ ONeal](https://coolaj86.com), | 
					
						
							|  |  |  | [Root](https://therootcompany.com) 2018-2019 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 17:45:32 -06:00
										 |  |  | MPL-2.0 | | 
					
						
							|  |  |  | [Terms of Use](https://therootcompany.com/legal/#terms) | | 
					
						
							|  |  |  | [Privacy Policy](https://therootcompany.com/legal/#privacy) |