-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtn-crypto.js
56 lines (47 loc) · 1.63 KB
/
tn-crypto.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var crypto = require('crypto');
var isObject = function (val) { return Object.prototype.toString.call(val) === '[object Object]'; };
var hash_hmac = function (type, data, key) {
var hash = crypto.createHmac(type, key);
hash.update(data);
return hash.digest('hex');
};
var sign = function (data, apiSec) {
return hash_hmac('sha256', preSign(data), apiSec);
};
// Сортирует элементы массива в соотвествии с результатом применения колбэка к каждому элементу
var sortBy = function (arr, cb) {
return arr.sort(function (a, b) {
var aKey = cb(a);
var bKey = cb(b);
if (aKey < bKey) return -1;
if (aKey > bKey) return 1;
return 0;
});
};
// Возвращает пары ключ-значение
var pairs = function (collection) {
return Object.keys(collection).map(function (key) {
return [key, collection[key]];
});
};
// Возвращает пары ключ-значение, отсортированные по ключу
var ksort = function (collection) {
return sortBy(pairs(collection), function (a) {
return a[0];
});
};
// Метод для генерации строки для подписи
var preSign = function (collection) {
var keyVals = ksort(collection);
return keyVals.map(function (keyVal) {
var key = keyVal[0];
var value = keyVal[1];
if (isObject(value)) {
value = preSign(value);
}
return key + '=' + value;
}).join('&');
};
exports.pairs = pairs;
exports.ksort = ksort;
exports.sign = sign;