UNPKG

native-crypto

Version:
57 lines (54 loc) 2.35 kB
'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()); });