bitcore/lib/paymentprotocol/rootcerts.js

76 lines
1.9 KiB
JavaScript

'use strict';
var RootCerts = exports;
var certs = require('./rootcerts.json');
// Use hash table for efficiency:
var trusted = Object.keys(certs).reduce(function(trusted, key) {
var pem = certs[key];
pem = pem.replace(/-----BEGIN CERTIFICATE-----/g, '');
pem = pem.replace(/-----END CERTIFICATE-----/g, '');
pem = pem.replace(/\s+/g, '');
trusted[pem] = key;
return trusted;
}, {});
RootCerts.getTrusted = function(pem) {
pem = RootCerts.parsePEM(pem)[0].pem;
if (!Object.prototype.hasOwnProperty.call(trusted, pem)) {
return;
}
return trusted[pem];
};
RootCerts.getCert = function(name) {
name = name.replace(/^s+|s+$/g, '');
if (!Object.prototype.hasOwnProperty.call(certs, name)) {
return;
}
return certs[name];
};
RootCerts.parsePEM = function(pem) {
pem = pem + '';
var concatted = pem.trim().split(/-----BEGIN [^\-\r\n]+-----/);
if (concatted.length > 2) {
return concatted.reduce(function(out, pem) {
if (!pem) {
return out;
}
pem = RootCerts.parsePEM(pem)[0].pem;
if (pem) {
out.push(pem);
}
return out;
}, []);
}
var type = /-----BEGIN ([^\-\r\n]+)-----/.exec(pem)[1];
pem = pem.replace(/-----BEGIN [^\-\r\n]+-----/, '');
pem = pem.replace(/-----END [^\-\r\n]+-----/, '');
var parts = pem.trim().split(/(?:\r?\n){2,}/);
var headers = {};
if (parts.length > 1) {
headers = parts[0].trim().split(/[\r\n]/).reduce(function(out, line) {
var parts = line.split(/:[ \t]+/);
var key = parts[0].trim().toLowerCase();
var value = (parts.slice(1).join('') || '').trim();
out[key] = value;
return out;
}, {});
pem = parts.slice(1).join('');
}
pem = pem.replace(/\s+/g, '');
var der = pem ? new Buffer(pem, 'base64') : null;
return [{
type: type,
headers: headers,
pem: pem,
der: der,
body: der || new Buffer([0])
}];
};
RootCerts.certs = certs;
RootCerts.trusted = trusted;