|
1 | 1 | const crypto = require('crypto'); |
2 | | -// @TODO Replace 3rd party http-build-query with native querystring |
3 | 2 | const httpBuildQuery = require('http-build-query'); |
4 | 3 |
|
5 | 4 | class Signature { |
6 | 5 | constructor(gateway) { |
7 | 6 | this.gateway = gateway; |
8 | 7 | } |
9 | 8 |
|
10 | | - calculateHash(parameters) { |
| 9 | + calculateHash(parameters, sign_version='v1') { |
11 | 10 | let keys = Object.keys(parameters); |
12 | | - let keysSorted = keys.sort(function(a, b) { return a[0] > b[0]; }); |
| 11 | + let keysSorted = keys.sort(function(a, b) { |
| 12 | + a = a.toLowerCase(); |
| 13 | + b = b.toLowerCase(); |
| 14 | + |
| 15 | + return (a < b) ? -1 : (a > b) ? 1 : 0; |
| 16 | + }); |
| 17 | + |
13 | 18 | let parametersSorted = {}; |
14 | 19 |
|
15 | 20 | keysSorted.forEach(key => { |
16 | 21 | parametersSorted[key] = parameters[key]; |
17 | 22 | }); |
18 | 23 |
|
19 | | - return crypto.createHash('sha256').update(`${httpBuildQuery(parametersSorted)}${this.gateway.getConfig().getPrivateKey()}`).digest('hex'); |
| 24 | + if(sign_version == 'v2'){ |
| 25 | + let encodedString = this.getEncodedString(parametersSorted); |
| 26 | + return crypto.createHmac('sha256', `${this.gateway.getConfig().getPrivateKey()}`).update(encodedString).digest('hex'); |
| 27 | + } else { |
| 28 | + return crypto.createHash('sha256').update(`${httpBuildQuery(parametersSorted)}${this.gateway.getConfig().getPrivateKey()}`).digest('hex'); |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + getEncodedString(parameters) { |
| 33 | + let encodedString = ''; |
| 34 | + let keys = Object.keys(parameters); |
| 35 | + |
| 36 | + keys.forEach(key => { |
| 37 | + encodedString += `${key}=${parameters[key]};`; |
| 38 | + }); |
| 39 | + |
| 40 | + return encodedString; |
| 41 | + } |
| 42 | + |
| 43 | + calculatePingbackHash(pingbackData, expectedSignature) { |
| 44 | + let expectedSignatureBuffer = Buffer.from(expectedSignature, 'hex'); |
| 45 | + let calculatedHashBuffer = Buffer.from(crypto.createHmac('sha256', `${this.gateway.getConfig().getPrivateKey()}`).update(pingbackData).digest('hex'), 'hex'); |
| 46 | + |
| 47 | + return crypto.timingSafeEqual(expectedSignatureBuffer, calculatedHashBuffer); |
20 | 48 | } |
21 | 49 | } |
22 | 50 |
|
|
0 commit comments