paypro: first pass at implementing payment protocol for x509.
This commit is contained in:
parent
b1722484a9
commit
1d0f01c133
|
@ -206,12 +206,25 @@ PayPro.prototype.sign = function(key) {
|
||||||
|
|
||||||
var pki_type = this.get('pki_type');
|
var pki_type = this.get('pki_type');
|
||||||
|
|
||||||
if (pki_type === 'SIN')
|
if (pki_type === 'SIN') {
|
||||||
var sig = this.sinSign(key);
|
var sig = this.sinSign(key);
|
||||||
else
|
} else if (pki_type === 'none'
|
||||||
|
|| 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 details = this.get('serialized_payment_details');
|
||||||
|
var signature = crypto.createSign('RSA-SHA256');
|
||||||
|
var buf = this.serializeForSig();
|
||||||
|
signature.update(buf);
|
||||||
|
var key = require('fs').readFileSync(__dirname + '/../test/data/x509.key');
|
||||||
|
var sig = signature.sign(key);
|
||||||
|
} else {
|
||||||
throw new Error('Unsupported pki_type');
|
throw new Error('Unsupported pki_type');
|
||||||
|
}
|
||||||
|
|
||||||
this.set('signature', sig);
|
this.set('signature', sig);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -221,10 +234,22 @@ PayPro.prototype.verify = function() {
|
||||||
|
|
||||||
var pki_type = this.get('pki_type');
|
var pki_type = this.get('pki_type');
|
||||||
|
|
||||||
if (pki_type === 'SIN')
|
if (pki_type === 'SIN') {
|
||||||
return this.sinVerify();
|
return this.sinVerify();
|
||||||
else
|
} else if (pki_type === 'none'
|
||||||
throw new Error('Unsupported pki_type');
|
|| pki_type === 'x509+sha1'
|
||||||
|
|| pki_type === 'x509+sha256') {
|
||||||
|
var crypto = require('crypto');
|
||||||
|
var sig = this.get('signature');
|
||||||
|
var pki_data = this.get('pki_data'); // contains one or more x509 certs
|
||||||
|
var details = this.get('serialized_payment_details');
|
||||||
|
var buf = this.serializeForSig();
|
||||||
|
var verifier = crypto.createVerify('RSA-SHA256');
|
||||||
|
verifier.update(buf);
|
||||||
|
return verifier.verify(buf, sig);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Unsupported pki_type');
|
||||||
};
|
};
|
||||||
|
|
||||||
//default signing function for prototype.sign
|
//default signing function for prototype.sign
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
"grunt-contrib-watch": "~0.5.3",
|
"grunt-contrib-watch": "~0.5.3",
|
||||||
"grunt-markdown": "~0.5.0",
|
"grunt-markdown": "~0.5.0",
|
||||||
"grunt-mocha-test": "~0.8.2",
|
"grunt-mocha-test": "~0.8.2",
|
||||||
"grunt-shell": "~0.6.4",
|
"grunt-shell": "~0.6.4",
|
||||||
"protobufjs": "=3.0.0",
|
"protobufjs": "=3.0.0",
|
||||||
"coveralls": "^2.10.0",
|
"coveralls": "^2.10.0",
|
||||||
"istanbul": "~0.2.6",
|
"istanbul": "~0.2.6",
|
||||||
|
@ -104,7 +104,8 @@
|
||||||
"./lib/Key.js": "./lib/browser/Key.js",
|
"./lib/Key.js": "./lib/browser/Key.js",
|
||||||
"./lib/Point.js": "./lib/browser/Point.js",
|
"./lib/Point.js": "./lib/browser/Point.js",
|
||||||
"./lib/ECIES.js": "./lib/browser/ECIES.js",
|
"./lib/ECIES.js": "./lib/browser/ECIES.js",
|
||||||
"./lib/SecureRandom.js": "./lib/browser/SecureRandom.js"
|
"./lib/SecureRandom.js": "./lib/browser/SecureRandom.js",
|
||||||
|
"./lib/PayPro.js": "./lib/browser/PayPro.js"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDBjCCAe4CCQDGf3j9NsTyjzANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
|
||||||
|
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
|
||||||
|
cyBQdHkgTHRkMB4XDTE0MDcxNTAyMTUyM1oXDTE1MDcxNTAyMTUyM1owRTELMAkG
|
||||||
|
A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
|
||||||
|
IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||||
|
API4A1LJKeWHpbz8bY1rFCeJ3YXPXz6YQdaCF1m8cTQYWy3vw8COou8d0Zogizgp
|
||||||
|
eXpNIYhREu1dl5yuAYmgpEMGpNr8I6euMx08j3f9jS/vY3SwJbW9nw2lIdiGwAmi
|
||||||
|
qOtqWOru/2nL1KE7n0rjEFto5UNyHIyIhuLN+KNcg0X1Ch9hSxydTRjBFThzTHRV
|
||||||
|
Qqba9KELbO4WI3JWaBQsxyer84TJf9eO8dW9ea3BxNgGkKt6XwHiDyXc+nc4vhUa
|
||||||
|
5upm1z+2nX4UlaokJTPRvAHWD5Exc1X/LbuaCOwNexrCNbPcwBYYjltcfMULmPka
|
||||||
|
zStX8clZJJDsHM/uBr5vZjcCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAQrU2R1Yw
|
||||||
|
WJuqZnMqrk+EGIL6tAlyqj1W9j65N0jnPsvBVy3fWJ3AdSzQcJO8PzPavj1R4Nu9
|
||||||
|
y55KZa6MZzAH7MkfPNZFoLUs4F7w0Sl+oHuMnw1HV4NeZBE653iQHx7Q+U8tJJKc
|
||||||
|
SnX0T5LXXPT9GuP/uzHlooKVNybcZ64ve89O8gw/GEidQdDOJ6RuWbdifADVInkP
|
||||||
|
dWQgsnMDGQmJGE7H77nZbrzMKZ2l0K44vEnxlxQiRqAOC3mDaSjaHfJmiGkfCjGZ
|
||||||
|
Pn7z8t051F8rXuzBHXUTqVtYd5kmeXN8BvGjF0g3QiQSF66CLm+bLEoRnyFEukfn
|
||||||
|
hDsMOVV628WjzA==
|
||||||
|
-----END CERTIFICATE-----
|
|
@ -0,0 +1,16 @@
|
||||||
|
-----BEGIN CERTIFICATE REQUEST-----
|
||||||
|
MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
|
||||||
|
ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
|
||||||
|
AQEBBQADggEPADCCAQoCggEBAPI4A1LJKeWHpbz8bY1rFCeJ3YXPXz6YQdaCF1m8
|
||||||
|
cTQYWy3vw8COou8d0ZogizgpeXpNIYhREu1dl5yuAYmgpEMGpNr8I6euMx08j3f9
|
||||||
|
jS/vY3SwJbW9nw2lIdiGwAmiqOtqWOru/2nL1KE7n0rjEFto5UNyHIyIhuLN+KNc
|
||||||
|
g0X1Ch9hSxydTRjBFThzTHRVQqba9KELbO4WI3JWaBQsxyer84TJf9eO8dW9ea3B
|
||||||
|
xNgGkKt6XwHiDyXc+nc4vhUa5upm1z+2nX4UlaokJTPRvAHWD5Exc1X/LbuaCOwN
|
||||||
|
exrCNbPcwBYYjltcfMULmPkazStX8clZJJDsHM/uBr5vZjcCAwEAAaAAMA0GCSqG
|
||||||
|
SIb3DQEBCwUAA4IBAQBxeYIgZsLUfHYhAwLudGkd8G2pc6/GBZKHTWUaDmzhbKzg
|
||||||
|
8PeZARBpgpjv2kVVsSmPL4wr3jZyb6N8ttA6WZ5l6VdSqP87r4mFSsqWMaW4yurD
|
||||||
|
ueubsbuM/+31H5rR4+cBtskpnn1RUM06hRRcaZX6RgbWk5SfwP9YWa0KnL/eslqC
|
||||||
|
2DOZCG0miG0STGE0MOzGcOw9Ncxq1tsOPxkL+jVNFveLVipQPqVhKb1O1Zv09Odo
|
||||||
|
x3tjNA1QAmcWLpnB0fuBUoe3FCt4JV1iP4hKXdb/JGAfNeZOem3tCpUT+SHOcnVI
|
||||||
|
+TUA26j6O8HLaqWI7zpfaqUmFjfanKFPVJEWAFk5
|
||||||
|
-----END CERTIFICATE REQUEST-----
|
Binary file not shown.
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEA8jgDUskp5YelvPxtjWsUJ4ndhc9fPphB1oIXWbxxNBhbLe/D
|
||||||
|
wI6i7x3RmiCLOCl5ek0hiFES7V2XnK4BiaCkQwak2vwjp64zHTyPd/2NL+9jdLAl
|
||||||
|
tb2fDaUh2IbACaKo62pY6u7/acvUoTufSuMQW2jlQ3IcjIiG4s34o1yDRfUKH2FL
|
||||||
|
HJ1NGMEVOHNMdFVCptr0oQts7hYjclZoFCzHJ6vzhMl/147x1b15rcHE2AaQq3pf
|
||||||
|
AeIPJdz6dzi+FRrm6mbXP7adfhSVqiQlM9G8AdYPkTFzVf8tu5oI7A17GsI1s9zA
|
||||||
|
FhiOW1x8xQuY+RrNK1fxyVkkkOwcz+4Gvm9mNwIDAQABAoIBAQDgYO8DM4JyNDRe
|
||||||
|
W2CIzpa/AcGKAU3zyEvFEIHdCOm9HorohOFLcVaSN4dBRcBx6Em199mGU8Q6yqZ1
|
||||||
|
5+NYwM0poe/5Q/Urkf2bqcwllWXC7/mr0Lk+IEhE9aHi2QDwbBQa8EsqZveH4+A2
|
||||||
|
8+peDvXKF+O5lO3JaXe6hp87ham9lLGm1JD1uUz+wDwtc0FJh3rQsfUhCTMYxXA7
|
||||||
|
ombGmbRbyZgHXOTXa6Q2KuKF+OpJETg6QpybGLzp8F6djfV7vCSNY5eeMQ2lPdtc
|
||||||
|
l05gdnExOtKwxjpoc5xAL1ScWMP0Oa4WUZtwTZT+xn37ZJezh4J9NDKdGWI0GjRz
|
||||||
|
MNFcOCCxAoGBAP+dhzJFpbaIrfqtzz2EGnCwFeupSdpJ53PSQZDho+ze//9UcD6n
|
||||||
|
n0NKaIdkEmaZZgBFaJbG1D07xeAaBKEMDboOiH4ccEcD+XjyxXdpiLTYrJeScvoU
|
||||||
|
iQuz52tyspwCl21kt8gwuEOFl4w5snxNH9u0CSDBtD2DcBEVEdhqLYl1AoGBAPKV
|
||||||
|
UvV8L/0UpQZ2b730zlI+6ClU3pM/qSl8QvHtb8RtIUyCXozPN+qmoGX74SzvDxJY
|
||||||
|
Ru9hYPUuPHpjfhixgSbqSg6cjfs7uaKDMFDNj/08Y/BTlN/dGjADhDXgujpqv/ZD
|
||||||
|
dPHQ2DhdNKN80rgPJ021hOj1cdCsF6RpyHyA7o97AoGAOLDwVib6PMSNiYZY6zTM
|
||||||
|
RGfZRL30AjTX32knX4GbwKIotrE8f7jfaqYrDrQUHKsy4yaBrscENVx3Y1+B3VH2
|
||||||
|
DWjBvu6BvE5WWwvE3doLFsjjZm51j59UUcMhtUPn9w/gE8P9uqmLhHYxiUkWm9jj
|
||||||
|
EvAYAirT1by78x3wKkZKOS0CgYARLMFS4BgFsxB8BKakrFBvQkTtqDSZ+EfhyAp1
|
||||||
|
VnozTgathA1tqr4qvuFcVxj6NXK7ucRL7nkO4tclUyX6WZbrSmsz3aGvx+q8ts0U
|
||||||
|
63jmVQA+Y6yGrQDNpXIW3nJQ8H3m0Z/V/xNP6klvycahgXEm71MZq0cDnyuNWG/5
|
||||||
|
YKeDQQKBgGTtNsOKl3A4z/nlrSEBHl/8n76kOVeRNbbbvaFvfbLD9twsmcbZk8o5
|
||||||
|
xHo9MJ/kAAJfCavXc/uhJsVl1TLN56pgjbnXqQSGB7rWpAtD08UTWaTLc7yyKRPq
|
||||||
|
70FEbd6tgfsu7zdGX69rPrNLcu+QFniytNwwu63qXp48LakIgeqq
|
||||||
|
-----END RSA PRIVATE KEY-----
|
|
@ -4,6 +4,7 @@ var chai = chai || require('chai');
|
||||||
var should = chai.should();
|
var should = chai.should();
|
||||||
var expect = chai.expect;
|
var expect = chai.expect;
|
||||||
var bitcore = bitcore || require('../bitcore');
|
var bitcore = bitcore || require('../bitcore');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
var PayPro = bitcore.PayPro;
|
var PayPro = bitcore.PayPro;
|
||||||
var Key = bitcore.Key;
|
var Key = bitcore.Key;
|
||||||
|
@ -319,4 +320,51 @@ describe('PayPro', function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var x509sig = new Buffer(0);
|
||||||
|
var x509path = __dirname + '/data/x509.der';
|
||||||
|
var x509cert = fs.readFileSync(x509path);
|
||||||
|
|
||||||
|
describe('#x509Sign', function() {
|
||||||
|
it('should sign assuming pki_type is x509', function() {
|
||||||
|
var pd = new PayPro.PaymentDetails();
|
||||||
|
pd.set('time', 0);
|
||||||
|
var pdbuf = pd.toBuffer();
|
||||||
|
var paypro = new PayPro();
|
||||||
|
paypro.makePaymentRequest();
|
||||||
|
paypro.set('serialized_payment_details', pdbuf);
|
||||||
|
paypro.set('pki_type', 'x509+sha256');
|
||||||
|
|
||||||
|
paypro.set('pki_data', x509cert); // contains one or more x509 certs
|
||||||
|
|
||||||
|
var key = new bitcore.Key();
|
||||||
|
key.private = bitcore.util.sha256('test key');
|
||||||
|
key.regenerateSync();
|
||||||
|
var sig = paypro.get('signature');
|
||||||
|
x509sig = sig;
|
||||||
|
sig.length.should.be.greaterThan(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#x509Verify', function() {
|
||||||
|
it('should verify assuming pki_type is x509', function() {
|
||||||
|
var pd = new PayPro.PaymentDetails();
|
||||||
|
pd.set('time', 0);
|
||||||
|
var pdbuf = pd.toBuffer();
|
||||||
|
var paypro = new PayPro();
|
||||||
|
paypro.makePaymentRequest();
|
||||||
|
paypro.set('serialized_payment_details', pdbuf);
|
||||||
|
paypro.set('pki_type', 'x509+sha256');
|
||||||
|
|
||||||
|
paypro.set('signature', x509sig); // sig buffer
|
||||||
|
paypro.set('pki_data', x509cert); // contains one or more x509 certs
|
||||||
|
|
||||||
|
var key = new bitcore.Key();
|
||||||
|
key.private = bitcore.util.sha256('test key');
|
||||||
|
key.regenerateSync();
|
||||||
|
paypro.sign(key);
|
||||||
|
var verify = paypro.verify();
|
||||||
|
verify.should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue