rsa-key
Version:
Converts between RSA key formats, detecting input format (PEM, DER, PKCS1, PKCS8). No OpenSSL needed.
188 lines (142 loc) • 6.2 kB
JavaScript
const { assert } = require('chai');
const NodeRSA = require('node-rsa');
const key = require('../src/key');
const RSAKeyError = require('../src/error');
const { PRIVATE, PUBLIC, PKCS1, PKCS8, PEM, DER, BASE64 } = require('../src/constants');
describe('Lib: key', function() {
describe('decode', function() {
let testKey;
before(function() {
testKey = new NodeRSA({ b: 256 });
});
describe('DER keys', function() {
it('should decode private PKCS8 DER key', function() {
const testEncoded = testKey.exportKey('pkcs8-private-der');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode public PKCS8 DER key', function() {
const testEncoded = testKey.exportKey('pkcs8-public-der');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode private PKCS1 DER key', function() {
const testEncoded = testKey.exportKey('pkcs1-private-der');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode public PKCS1 DER key', function() {
const testEncoded = testKey.exportKey('pkcs1-public-der');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode DER key provided in a string', function() {
const testEncoded = testKey.exportKey('pkcs1-public-der').toString(BASE64);
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
});
describe('PEM keys', function() {
it('should decode private PKCS8 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs8-private-pem');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode public PKCS8 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs8-public-pem');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode private PKCS1 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs1-private-pem');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
it('should decode public PKCS1 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs1-public-pem');
const decoded = key.decode(testEncoded);
assert.isObject(decoded);
});
});
describe('Wrong keys', function() {
it('should fail with a non-key string provided', function() {
assert.throws(() => {
key.decode('clearly not a key');
}, RSAKeyError);
});
it('should fail with a non-key buffer provided', function() {
assert.throws(() => {
key.decode(Buffer.from('clearly not a key', 'utf8'));
}, RSAKeyError);
});
});
});
describe('encode', function() {
describe('DER keys', function() {
let testKey, components;
before(function() {
testKey = new NodeRSA({ b: 256 });
components = key.decode(testKey.exportKey('pkcs8-private-der'));
});
it('should encode private PKCS8 DER key', function() {
const testEncoded = testKey.exportKey('pkcs8-private-der');
const encoded = key.encode(components, DER, PRIVATE, PKCS8);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode public PKCS8 DER key', function() {
const testEncoded = testKey.exportKey('pkcs8-public-der');
const encoded = key.encode(components, DER, PUBLIC, PKCS8);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode private PKCS1 DER key', function() {
const testEncoded = testKey.exportKey('pkcs1-private-der');
const encoded = key.encode(components, DER, PRIVATE, PKCS1);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode public PKCS1 DER key', function() {
const testEncoded = testKey.exportKey('pkcs1-public-der');
const encoded = key.encode(components, DER, PUBLIC, PKCS1);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
});
describe('PEM keys', function() {
let testKey, components;
before(function() {
testKey = new NodeRSA({ b: 256 });
components = key.decode(testKey.exportKey('pkcs8-private-pem'));
});
it('should encode private PKCS8 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs8-private-pem');
const encoded = key.encode(components, PEM, PRIVATE, PKCS8);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode public PKCS8 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs8-public-pem');
const encoded = key.encode(components, PEM, PUBLIC, PKCS8);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode private PKCS1 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs1-private-pem');
const encoded = key.encode(components, PEM, PRIVATE, PKCS1);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
it('should encode public PKCS1 PEM key', function() {
const testEncoded = testKey.exportKey('pkcs1-public-pem');
const encoded = key.encode(components, PEM, PUBLIC, PKCS1);
assert.equal(encoded.toString(BASE64), testEncoded.toString(BASE64));
});
});
describe('Unknown format', function() {
let testKey, components;
before(function() {
testKey = new NodeRSA({ b: 256 });
components = key.decode(testKey.exportKey('pkcs8-private-pem'));
});
it('should fail when unknown format is specified', function() {
assert.throws(() => {
key.encode(components, 'clearly unknown format', PRIVATE, PKCS8);
}, RSAKeyError);
});
});
});
});