jwa

A JSON Web Algorithmsarrow-up-right implementation focusing (exclusively, at this point) on the algorithms necessary for JSON Web Signaturesarrow-up-right.

This library supports all of the required, recommended and optional cryptographic algorithms for JWS:

alg Parameter Value
Digital Signature or MAC Algorithm

HS256

HMAC using SHA-256 hash algorithm

HS384

HMAC using SHA-384 hash algorithm

HS512

HMAC using SHA-512 hash algorithm

RS256

RSASSA using SHA-256 hash algorithm

RS384

RSASSA using SHA-384 hash algorithm

RS512

RSASSA using SHA-512 hash algorithm

PS256

RSASSA-PSS using SHA-256 hash algorithm

PS384

RSASSA-PSS using SHA-384 hash algorithm

PS512

RSASSA-PSS using SHA-512 hash algorithm

ES256

ECDSA using P-256 curve and SHA-256 hash algorithm

ES384

ECDSA using P-384 curve and SHA-384 hash algorithm

ES512

ECDSA using P-521 curve and SHA-512 hash algorithm

none

No digital signature or MAC value included

Please note that PS* only works on Node 6.12+ (excluding 7.x).

Requirements

In order to run the tests, a recent version of OpenSSL is required. The version that comes with OS X (OpenSSL 0.9.8r 8 Feb 2011) is not recent enough, as it does not fully support ECDSA keys. You'll need to use a version > 1.0.0; I tested with OpenSSL 1.0.1c 10 May 2012.

Testing

To run the tests, do

This will generate a bunch of keypairs to use in testing. If you want to generate new keypairs, do make clean before running npm test again.

Methodology

I spawn openssl dgst -sign to test OpenSSL sign → JS verify and openssl dgst -verify to test JS sign → OpenSSL verify for each of the RSA and ECDSA algorithms.

Usage

jwa(algorithm)

Creates a new jwa object with sign and verify methods for the algorithm. Valid values for algorithm can be found in the table above ('HS256', 'HS384', etc) and are case-insensitive. Passing an invalid algorithm value will throw a TypeError.

jwa#sign(input, secretOrPrivateKey)

Sign some input with either a secret for HMAC algorithms, or a private key for RSA and ECDSA algorithms.

If input is not already a string or buffer, JSON.stringify will be called on it to attempt to coerce it.

For the HMAC algorithm, secretOrPrivateKey should be a string or a buffer. For ECDSA and RSA, the value should be a string representing a PEM encoded private key.

Output base64urlarrow-up-right formatted. This is for convenience as JWS expects the signature in this format. If your application needs the output in a different format, please open an issuearrow-up-right. In the meantime, you can use brianloveswords/base64urlarrow-up-right to decode the signature.

As of nodejs v0.11.8, SPKAC support was introduce. If your nodeJs version satisfies, then you can pass an object { key: '..', passphrase: '...' }

jwa#verify(input, signature, secretOrPublicKey)

Verify a signature. Returns true or false.

signature should be a base64url encoded string.

For the HMAC algorithm, secretOrPublicKey should be a string or a buffer. For ECDSA and RSA, the value should be a string represented a PEM encoded public key.

Example

HMAC

With keys

License

MIT

Last updated