|
|
|
"use strict";
|
|
|
|
|
|
|
|
var Key = require('./Key');
|
|
|
|
var x509 = require('./x509');
|
|
|
|
var RSAKey = x509.RSAKey;
|
|
|
|
var assert = require('assert');
|
|
|
|
var PayPro = require('../PayPro');
|
|
|
|
|
|
|
|
/*
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyPSS = _rsasign_verifyStringPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signWithMessageHash = _rsasign_signWithMessageHash;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signString = _rsasign_signString;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signStringWithSHA1 = _rsasign_signStringWithSHA1;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signStringWithSHA256 = _rsasign_signStringWithSHA256;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.sign = _rsasign_signString;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signWithSHA1 = _rsasign_signStringWithSHA1;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signWithSHA256 = _rsasign_signStringWithSHA256;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signWithMessageHashPSS = _rsasign_signWithMessageHashPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signStringPSS = _rsasign_signStringPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.signPSS = _rsasign_signStringPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyWithMessageHash = _rsasign_verifyWithMessageHash;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyString = _rsasign_verifyString;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyHexSignatureForMessage = _rsasign_verifyHexSignatureForMessage;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verify = _rsasign_verifyString;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyHexSignatureForByteArrayMessage = _rsasign_verifyHexSignatureForMessage;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyWithMessageHashPSS = _rsasign_verifyWithMessageHashPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyStringPSS = _rsasign_verifyStringPSS;
|
|
|
|
rsasign-1.2.js:RSAKey.prototype.verifyPSS = _rsasign_verifyStringPSS;
|
|
|
|
*/
|
|
|
|
|
|
|
|
PayPro.sign = function(key) {
|
|
|
|
if (this.messageType !== 'PaymentRequest')
|
|
|
|
throw new Error('Signing can only be performed on a PaymentRequest');
|
|
|
|
|
|
|
|
var pki_type = this.get('pki_type');
|
|
|
|
|
|
|
|
if (pki_type === 'SIN') {
|
|
|
|
var sig = this.sinSign(key);
|
|
|
|
} else if (pki_type === 'none' || pki_type === 'x509+sha256' || pki_type === 'x509+sha1') {
|
|
|
|
throw new Error('x509 currently unsuported.');
|
|
|
|
} else if (pki_type === 'x509+sha1' || pki_type === 'x509+sha256') {
|
|
|
|
var crypto = require('crypto');
|
|
|
|
var pki_data = this.get('pki_data'); // contains one or more x509 certs
|
|
|
|
var type = pki_type.split('+').toUpperCase();
|
|
|
|
var buf = this.serializeForSig();
|
|
|
|
var hexSig = _rsasign_getHexPaddedDigestInfoForString(buf.toString(16), 2048, type);
|
|
|
|
var hexSig = RSAKey.signWith(buf.toString(16), 2048, type);
|
|
|
|
var size = hexSig.length / 2;
|
|
|
|
if (size % 2) size++
|
|
|
|
var sig = new Buffer(hexSign, 'hex');
|
|
|
|
} else if (pki_type === 'none') {
|
|
|
|
return this;
|
|
|
|
} else {
|
|
|
|
throw new Error('Unsupported pki_type');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('signature', sig);
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
|
|
|
PayPro.verify = function() {
|
|
|
|
if (this.messageType !== 'PaymentRequest')
|
|
|
|
throw new Error('Verifying can only be performed on a PaymentRequest');
|
|
|
|
|
|
|
|
var pki_type = this.get('pki_type');
|
|
|
|
|
|
|
|
if (pki_type === 'SIN') {
|
|
|
|
return this.sinVerify();
|
|
|
|
} else if (pki_type === 'x509+sha1' || pki_type === 'x509+sha256') {
|
|
|
|
var sig = this.get('signature');
|
|
|
|
var pki_data = this.get('pki_data');
|
|
|
|
var buf = this.serializeForSig();
|
|
|
|
var type = pki_type.split('+').toUpperCase();
|
|
|
|
var pubKey = PKCS5PKEY.getRSAKeyFromPublicPKCS8PEM(pki_data);
|
|
|
|
var result = pubKey.verifyPSS(buf, buf.toString(16), type, -1);
|
|
|
|
return result;
|
|
|
|
} else if (pki_type === 'none') {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new Error('Unsupported pki_type');
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = Point;
|