paypro: fix pem/der functions.

This commit is contained in:
Christopher Jeffrey 2014-07-21 12:58:10 -07:00
parent 14966082ae
commit ec5a948400
1 changed files with 19 additions and 42 deletions

View File

@ -251,7 +251,7 @@ PayPro.prototype.x509Sign = function(key) {
var trusted = [].concat(pki_data).every(function(cert) { var trusted = [].concat(pki_data).every(function(cert) {
var der = cert.toString('hex'); var der = cert.toString('hex');
var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(der, 'CERTIFICATE'); var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(der, 'CERTIFICATE');
// var pem = DERtoPEM(der, 'CERTIFICATE'); // var pem = this._DERtoPEM(der, 'CERTIFICATE');
return !!RootCerts[pem.replace(/\s+/g, '')]; return !!RootCerts[pem.replace(/\s+/g, '')];
}); });
@ -281,7 +281,7 @@ PayPro.prototype.x509Verify = function() {
return [].concat(pki_data).every(function(cert) { return [].concat(pki_data).every(function(cert) {
var der = cert.toString('hex'); var der = cert.toString('hex');
var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(der, 'CERTIFICATE'); var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(der, 'CERTIFICATE');
// var pem = DERtoPEM(der, 'CERTIFICATE'); // var pem = this._DERtoPEM(der, 'CERTIFICATE');
if (!RootCerts[pem.replace(/\s+/g, '')]) { if (!RootCerts[pem.replace(/\s+/g, '')]) {
// throw new Error('Unstrusted certificate.'); // throw new Error('Unstrusted certificate.');
@ -308,56 +308,33 @@ PayPro.prototype.sinVerify = function() {
// Helpers // Helpers
function PEMtoDER(pem) { PayPro.prototype._PEMtoDER = function(pem) {
pem = pem.replace(/^-----END [^-]+-----$/gmi, ''); return this._PEMtoDERParam(pem);
var parts = pem.split(/-----BEGIN [^-]+-----/); };
return parts.map(function(part) {
part = part.replace(/\s+/g, '');
return new Buffer(part, 'base64');
});
}
function PEMtoDERParam(pem, param) { PayPro.prototype._PEMtoDERParam = function(pem, param) {
var start = new RegExp('(?=-----BEGIN ' + param + '-----)', 'i'); var start = new RegExp('(?=-----BEGIN ' + (param || '[^-]+') + '-----)', 'i');
var end = new RegExp('^-----END ' + param + '-----$', 'gmi'); var end = new RegExp('^-----END ' + (param || '[^-]+') + '-----$', 'gmi');
pem = pem.replace(end, ''); pem = pem.replace(end, '');
var parts = pem.split(start); var parts = pem.split(start);
return parts.map(function(part) { return parts.map(function(part) {
part = part.replace(/\s+/g, '');
var type = /-----BEGIN ([^-]+)-----/.exec(part)[1]; var type = /-----BEGIN ([^-]+)-----/.exec(part)[1];
part = part.replace(/-----BEGIN ([^-]+)-----/g, ''); part = part.replace(/-----BEGIN ([^-]+)-----/g, '');
if (type !== param) return; part = part.replace(/\s+/g, '');
if (!param || type !== param) return;
return new Buffer(part, 'base64'); return new Buffer(part, 'base64');
}).filter(Boolean); }).filter(Boolean);
} };
function wrapText(text, cols) { PayPro.prototype._DERtoPEM = function(der, type) {
var j = 0;
var part = '';
var parts = [];
for (var i = 0; i < text.length; i++) {
if (j === cols) {
parts.push(part);
j = 0;
part = ''
continue;
}
part += text[i];
j++;
}
var total = parts.join('').length;
if (total < text.length) {
parts.push(text.slice(-(text.length - total)));
}
return parts.join('\n');
}
function DERtoPEM(der, type) {
var type = type || 'UNKNOWN'; var type = type || 'UNKNOWN';
der = der.toString('base64');
der = der.replace(/(.{64})/g, '$1\r\n');
der = der.replace(/\r\n$/, '');
return '' return ''
+ '-----BEGIN ' + type + '-----\n' + '-----BEGIN ' + type + '-----\r\n'
+ wrapText(der.toString('base64'), 64) + '\n' + der
+ '-----END ' + type + '-----\n'; + '\r\n-----END ' + type + '-----\r\n';
} };
module.exports = PayPro; module.exports = PayPro;