Name Last Update
..
browser Loading commit data...
dist Loading commit data...
node Loading commit data...
LICENSE Loading commit data...
README.md Loading commit data...
index.js Loading commit data...
package.json Loading commit data...
packer.js Loading commit data...
parser.js Loading commit data...

@root/pem

Built by The Root Company for Greenlock and ACME.js

Lightweight, Zero-Dependency PEM encoder and decoder.

| ~300b gzipped | ~650b minified | ~1k full |

  • Zero Dependencies
  • Universal Support
    • Node.js
    • Browsers
  • VanillaJS

This library supports PEM, which is pretty boring on its own.

Most likely you are also interested in some of the following:

Want to contribute? Need commercial support?

Usage

  • PEM.parseBlock(str)
  • PEM.packBlock(options)

Parsing

var PEM = require('@root/pem/parser');

var block = PEM.parseBlock(
    '-----BEGIN Type-----\nSGVsbG8sIOS4lueVjCE=\n-----END Type-----\n'
);
{
    bytes: `<48 65 6c 6c 6f 2c 20 e4 b8 96 e7 95 8c 21>`;
}

Packing

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]
);
-----BEGIN Type-----
SGVsbG8sIOS4lueVjCE=
-----END Type-----

Install

This works equally well in Browsers and Node.js, but has slightly different code.

Node (and Webpack)

npm install --save @root/pem
var PEM = require('@root/pem');
// just the packer
var PEM = require('@root/pem/packer');
// just the parser
var PEM = require('@root/pem/parser');

Browsers (Vanilla JS)

<script src="https://unpkg.com/@root/pem/dist/pem.all.js"></script>
<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:

-----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:

  • PKCS#10 (Certificate Signing Request [CSR])
  • X509 Certificate (fullchain.pem, site.crt)
  • PKIX (cert.pem, privkey.pem, priv.key)
    • PKCS#1 (RSA Public and Private Keys)
    • PKCS#8 (RSA and ECDSA Keypairs)
  • SEC#1 (ECDSARSA Public and Private Keys)

Contributions

Did this project save you some time? Maybe make your day? Even save the day?

Please say "thanks" via Paypal or Patreon:

Where does your contribution go?

Root is a collection of experts who trust each other and enjoy working together on deep-tech, Indie Web projects.

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 that fuel the Indie Web.

Also, we chat on Keybase in #rootprojects

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.

Legal

Copyright AJ ONeal, Root 2018-2019

MPL-2.0 | Terms of Use | Privacy Policy