native-crypto
Version:
native-crypto ===
57 lines (54 loc) • 2.35 kB
JavaScript
'use strict';
var asn1 = require('asn1.js');
var base64url = require('./base64url');
var pemstrip = require('pemstrip');
module.exports = parseRSA;
module.exports.parsePublic = parsePublic;
module.exports.parsePrivate = parsePrivate;
function parsePublic(publicKey) {
var striped = pemstrip.strip(publicKey);
var parsedPublic1 = PublicKey.decode(new Buffer(striped.base64, 'base64'), 'der');
var parsedPublic = RSAPublicKey.decode(parsedPublic1.subjectPublicKey.data, 'der');
return {
kty: 'RSA',
n: base64url.encode(parsedPublic.n.toBuffer()),
e: base64url.encode(parsedPublic.e.toBuffer()),
key_ops: ['verify'],
ext: true
};
}
function parsePrivate(privateKey) {
var striped = pemstrip.strip(privateKey);
var parsedPrivate = RSAPrivateKey.decode(new Buffer(striped.base64, 'base64'), 'der');
return {
kty: 'RSA',
n: base64url.encode(parsedPrivate.n.toBuffer()),
e: base64url.encode(parsedPrivate.e.toBuffer()),
d: base64url.encode(parsedPrivate.d.toBuffer()),
p: base64url.encode(parsedPrivate.p.toBuffer()),
q: base64url.encode(parsedPrivate.q.toBuffer()),
dp: base64url.encode(parsedPrivate.dp.toBuffer()),
dq: base64url.encode(parsedPrivate.dq.toBuffer()),
qi: base64url.encode(parsedPrivate.qi.toBuffer()),
key_ops: ['sign'],
ext: true
};
}
function parseRSA(pair) {
return {
publicKey: parsePublic(pair.publicKey),
privateKey: parsePrivate(pair.privateKey)
};
}
var RSAPrivateKey = asn1.define('RSAPrivateKey', function () {
this.seq().obj(this.key('version').int(), this.key('n').int(), this.key('e').int(), this.key('d').int(), this.key('p').int(), this.key('q').int(), this.key('dp').int(), this.key('dq').int(), this.key('qi').int());
});
var RSAPublicKey = asn1.define('RSAPublicKey', function () {
this.seq().obj(this.key('n').int(), this.key('e').int());
});
var PublicKey = asn1.define('SubjectPublicKeyInfo', function () {
this.seq().obj(this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPublicKey').bitstr());
});
var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () {
this.seq().obj(this.key('algorithm').objid(), this.key('none').null_().optional(), this.key('curve').objid().optional(), this.key('params').seq().obj(this.key('p').int(), this.key('q').int(), this.key('g').int()).optional());
});