@tmsfe/tms-core 0.0.151 → 0.0.153
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/encrypt/encrypt-util.ts +446 -0
- package/src/encrypt/index.ts +175 -0
- package/src/encrypt/nacl-util.min.js +2 -0
- package/src/encrypt/nacl.min.js +2 -0
- package/src/encrypt/traceUtils.js +24 -0
- package/src/index.js +0 -2
- package/src/request.js +56 -175
- package/src/runtime/login.ts +0 -2
- package/src/aes.js +0 -84
- package/src/encrypt.js +0 -327
- package/src/jsencrypt.min.js +0 -2
- package/src/traceUtils.ts +0 -23
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成traceparent Id
|
|
3
|
+
* 用途:用于生成version - trace-id - parent-id/span-id - trace-flags规则的id,方便链路追踪
|
|
4
|
+
*/
|
|
5
|
+
/* eslint-disable */
|
|
6
|
+
var CryptoJS=CryptoJS||function(t){var n={},i=n.lib={},s=function(){},r=i.Base={extend:function(t){s.prototype=this;var n=new s;return t&&n.mixIn(t),n.hasOwnProperty("init")||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},e=i.WordArray=r.extend({init:function(t,n){t=this.words=t||[],this.sigBytes=null!=n?n:4*t.length},toString:function(t){return(t||o).stringify(this)},concat:function(t){var n=this.words,i=t.words,r=this.sigBytes;if(t=t.sigBytes,this.clamp(),r%4)for(var e=0;e<t;e++)n[r+e>>>2]|=(i[e>>>2]>>>24-e%4*8&255)<<24-(r+e)%4*8;else if(65535<i.length)for(e=0;e<t;e+=4)n[r+e>>>2]=i[e>>>2];else n.push.apply(n,i);return this.sigBytes+=t,this},clamp:function(){var n=this.words,i=this.sigBytes;n[i>>>2]&=4294967295<<32-i%4*8,n.length=t.ceil(i/4)},clone:function(){var t=r.clone.call(this);return t.words=this.words.slice(0),t},random:function(n){for(var i=[],r=0;r<n;r+=4)i.push(4294967296*t.random()|0);return new e.init(i,n)}}),o=(n.enc={}).Hex={stringify:function(t){var n=t.words;t=t.sigBytes;for(var i=[],r=0;r<t;r++){var e=n[r>>>2]>>>24-r%4*8&255;i.push((e>>>4).toString(16)),i.push((15&e).toString(16))}return i.join("")},parse:function(t){for(var n=t.length,i=[],r=0;r<n;r+=2)i[r>>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new e.init(i,n/2)}};return n}(Math);
|
|
7
|
+
|
|
8
|
+
// 生成随机的16字节trace-id和8字节parent-id/span-id
|
|
9
|
+
function generateRandomHex(size) {
|
|
10
|
+
return CryptoJS.lib.WordArray.random(size).toString(CryptoJS.enc.Hex);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// 生成traceparent ID
|
|
14
|
+
function genTraceparent() {
|
|
15
|
+
const version = '00';
|
|
16
|
+
const traceId = generateRandomHex(16); // 16字节的trace-id
|
|
17
|
+
const parentId = generateRandomHex(8); // 8字节的parent-id/span-id
|
|
18
|
+
const traceFlags = '01'; // 示例标志,表示采样
|
|
19
|
+
return `${version}-${traceId}-${parentId}-${traceFlags}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
genTraceparent,
|
|
24
|
+
};
|
package/src/index.js
CHANGED
|
@@ -110,7 +110,6 @@ const getLocationBaseClass = () => LocationBase;
|
|
|
110
110
|
const init = (options = {}) => {
|
|
111
111
|
const {
|
|
112
112
|
appVersion, wxAppId, secretKey = '', client, defaultHost, cloudEnvId, appEnv, appPagePaths, homePage,
|
|
113
|
-
requestEncryptOpen,
|
|
114
113
|
} = options;
|
|
115
114
|
const envInfo = {
|
|
116
115
|
wxAppId,
|
|
@@ -152,7 +151,6 @@ const init = (options = {}) => {
|
|
|
152
151
|
|
|
153
152
|
Request.defaultHost = defaultHost;
|
|
154
153
|
Request.defaultSecretKey = secretKey;
|
|
155
|
-
Request.requestEncryptOpen = requestEncryptOpen;
|
|
156
154
|
// 初始化云环境
|
|
157
155
|
wx.cloud.init({ env: cloudEnvId });
|
|
158
156
|
};
|
package/src/request.js
CHANGED
|
@@ -11,12 +11,16 @@
|
|
|
11
11
|
import md5 from './md5';
|
|
12
12
|
import { getEnvInfo, getAuthInfo } from './env';
|
|
13
13
|
import { safeJsonParse } from './objUtils';
|
|
14
|
-
import
|
|
14
|
+
import { encryptObjInit } from './encrypt';
|
|
15
15
|
import reporter from './report/index';
|
|
16
|
-
import { genTraceparent } from './traceUtils';
|
|
17
16
|
|
|
18
17
|
const logger = wx.getLogManager({});
|
|
19
|
-
|
|
18
|
+
|
|
19
|
+
// 加密模块初始化
|
|
20
|
+
encryptObjInit({
|
|
21
|
+
composeParamsFunc: data => composeParam(data, true, {}),
|
|
22
|
+
report: (...args) => reporter.reportPerformance(...args),
|
|
23
|
+
});
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* 用于序列化需要签名的参数
|
|
@@ -161,8 +165,6 @@ export default class Request {
|
|
|
161
165
|
*/
|
|
162
166
|
static defaultSecretKey = '';
|
|
163
167
|
|
|
164
|
-
static requestEncryptOpen = true;
|
|
165
|
-
|
|
166
168
|
static getInstance() {
|
|
167
169
|
if (reqInstance === null) {
|
|
168
170
|
reqInstance = new Request();
|
|
@@ -348,94 +350,6 @@ export default class Request {
|
|
|
348
350
|
return Promise.resolve({ url });
|
|
349
351
|
}
|
|
350
352
|
|
|
351
|
-
// wx请求封装成promise
|
|
352
|
-
async wxRequest(path, method, header = {}, data, needReport, seqId) {
|
|
353
|
-
if (needReport && path.indexOf('basic/event/upload') < 0) {
|
|
354
|
-
logger.log(
|
|
355
|
-
'tms-performance-log',
|
|
356
|
-
'request_encrypt_log', 'main', 'send_unencrypt_request', seqId,
|
|
357
|
-
!!wx.$_publicKey, Request.requestEncryptOpen, path,
|
|
358
|
-
);
|
|
359
|
-
}
|
|
360
|
-
// 如果是获取pubKey的接口,但是没带userId, 则需要取消这次请求
|
|
361
|
-
if (path.indexOf('basic/crypto/lastkey') > -1 && !data.userId) {
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
return new Promise((resolve, reject) => {
|
|
365
|
-
wx.request({
|
|
366
|
-
url: path,
|
|
367
|
-
header: { ...header, 'X-Seq-Id': seqId, Traceparent: genTraceparent() },
|
|
368
|
-
method,
|
|
369
|
-
data,
|
|
370
|
-
enableHttp2: true,
|
|
371
|
-
success: (res) => {
|
|
372
|
-
resolve(res);
|
|
373
|
-
},
|
|
374
|
-
fail: (err) => {
|
|
375
|
-
reject(err);
|
|
376
|
-
},
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
async refreshEncryptKey() {
|
|
382
|
-
if (wx.$_encrypt_refreshDisable) {
|
|
383
|
-
return false;
|
|
384
|
-
}
|
|
385
|
-
if (!refreshPromise) {
|
|
386
|
-
refreshPromise = new Promise(async (resolve) => {
|
|
387
|
-
try {
|
|
388
|
-
const requestParam = await composeParam({}, true, {});
|
|
389
|
-
const data = sign(requestParam, this.secretKey);
|
|
390
|
-
const finalUrl = this.makeUrl('basic/crypto/lastkey');
|
|
391
|
-
const res = await this.wxRequest(finalUrl, 'GET', {}, data, true, data.seqId);
|
|
392
|
-
const success = res.data.errCode === 0;
|
|
393
|
-
if (!success) {
|
|
394
|
-
// 如果请求失败,则停止刷新加密秘钥,运行时永久关闭
|
|
395
|
-
wx.$_encrypt_refreshDisable = true;
|
|
396
|
-
}
|
|
397
|
-
encryptObj.updateDecryptKey(res.data.resData);
|
|
398
|
-
resolve(success);
|
|
399
|
-
} catch (e) {
|
|
400
|
-
encryptObj.updateDecryptKey(null);
|
|
401
|
-
resolve(false);
|
|
402
|
-
}
|
|
403
|
-
refreshPromise = null;
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
return refreshPromise;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// 如果全局请求加密开关关闭 || 当前请求内容不满足加密规则(publickey不为空且走sinan网关且非性能上报埋点)
|
|
410
|
-
checkIfNeedEncrypt(url, data) {
|
|
411
|
-
if (!Request.requestEncryptOpen || !encryptObj.needsEncryption(url, data)) {
|
|
412
|
-
return false;
|
|
413
|
-
}
|
|
414
|
-
return true;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
async dealEncryptionSwitch(resHeader, forceRefresh = false) {
|
|
418
|
-
if (!forceRefresh && (!resHeader || this.dealEncryptionSwitching)) {
|
|
419
|
-
return false;
|
|
420
|
-
}
|
|
421
|
-
this.dealEncryptionSwitching = true;
|
|
422
|
-
const formatHeader = {};
|
|
423
|
-
Object.keys(resHeader).forEach(key => formatHeader[key.toLowerCase()] = resHeader[key]);
|
|
424
|
-
const encryptionAvaliable = formatHeader['x-encryption-available'] === '0';
|
|
425
|
-
if (encryptionAvaliable) {
|
|
426
|
-
// 关闭接下来请求的加密开关
|
|
427
|
-
wx.$_publicKey = null;
|
|
428
|
-
return false;
|
|
429
|
-
}
|
|
430
|
-
let refreshSuccess = true;
|
|
431
|
-
// 打开开关,如果当前是关闭状态,则需要刷新加密key
|
|
432
|
-
if (forceRefresh || !wx.$_publicKey) {
|
|
433
|
-
refreshSuccess = await this.refreshEncryptKey();
|
|
434
|
-
}
|
|
435
|
-
this.dealEncryptionSwitching = false;
|
|
436
|
-
return refreshSuccess;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
353
|
/**
|
|
440
354
|
* 创建发送请求任务
|
|
441
355
|
* @memberof Request
|
|
@@ -445,94 +359,61 @@ export default class Request {
|
|
|
445
359
|
* @param {object} header 自定义的请求头
|
|
446
360
|
* @returns {Promise} 接口返回结果
|
|
447
361
|
*/
|
|
448
|
-
async createRequestTask(path, param = {}, method = 'POST', header = {}
|
|
362
|
+
async createRequestTask(path, param = {}, method = 'POST', header = {}) {
|
|
449
363
|
const requestParam = await composeParam(param, this.withAuth, this.baseParam);
|
|
450
364
|
const data = sign(requestParam, this.secretKey);
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
365
|
+
return new Promise((resolve, reject) => {
|
|
366
|
+
const requestTime = Date.now();
|
|
367
|
+
const printLog = (isSuccess, res) => {
|
|
368
|
+
// 埋点已经单独打日志了,接口请求数据日志太长影响分析
|
|
369
|
+
if (path.indexOf('basic/event/upload') !== -1) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
458
372
|
|
|
459
|
-
|
|
460
|
-
|
|
373
|
+
// 打车、代驾日志不截断,方便用于回放
|
|
374
|
+
const fullApi = path.indexOf('/takecar/') !== -1 || path.indexOf('dd/api/v2/order') !== -1;
|
|
461
375
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
376
|
+
let result = JSON.stringify(res);
|
|
377
|
+
if (isSuccess && !fullApi && result.length > 500) {
|
|
378
|
+
result = `${result.substring(0, 500)} 内容太长被截断`;
|
|
379
|
+
}
|
|
466
380
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
381
|
+
const obj = {
|
|
382
|
+
path,
|
|
383
|
+
method,
|
|
384
|
+
header: JSON.stringify(header),
|
|
385
|
+
params: JSON.stringify(data),
|
|
386
|
+
duration: Date.now() - requestTime,
|
|
387
|
+
};
|
|
388
|
+
if (isSuccess) {
|
|
389
|
+
obj.res = result;
|
|
390
|
+
} else {
|
|
391
|
+
obj.err = result;
|
|
392
|
+
}
|
|
479
393
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
const { seqId } = data;
|
|
488
|
-
try {
|
|
489
|
-
// 当前请求不加密 || 不满足加密前提
|
|
490
|
-
if (!doEncrypt || !this.checkIfNeedEncrypt(finalUrl, data)) {
|
|
491
|
-
const result = await this.wxRequest(finalUrl, method, header, data, true, seqId);
|
|
492
|
-
const { header: resHeader, data: resData } = result;
|
|
493
|
-
// 根据返回的响应头来控制接下来运行时的加密开关
|
|
494
|
-
this.dealEncryptionSwitch(resHeader);
|
|
495
|
-
printLog(true, resData);
|
|
496
|
-
return result;
|
|
497
|
-
}
|
|
498
|
-
// 1. 加密请求
|
|
499
|
-
const {
|
|
500
|
-
header: encryptHeader, data: encryptData, aesKey,
|
|
501
|
-
} = encryptObj.reqEncrypt(method, data, header, '');
|
|
502
|
-
// 2. 发送请求
|
|
503
|
-
const result = await this.wxRequest(finalUrl, method, encryptHeader, encryptData, false, seqId);
|
|
504
|
-
const { header: resHeader, data: resData } = result;
|
|
505
|
-
// 3. 解密响应
|
|
506
|
-
const { success, header: decryptHeader, data: decryptData } = encryptObj.resDecrypt(aesKey, resHeader, resData);
|
|
507
|
-
if (!success) {
|
|
508
|
-
reporter.reportPerformance('request_encrypt_log', 'main', 'local_response_decrypt_fail', seqId);
|
|
509
|
-
return this.createRequestTask(path, param, method, header, false);
|
|
510
|
-
}
|
|
511
|
-
// 4. 处理解密失败的响应
|
|
512
|
-
const errCodeType = encryptObj.getErrcodeType(decryptData.errCode, decryptData.errMsg);
|
|
513
|
-
if (errCodeType === encryptObj.reqErrType.pubKeyInvalid) { // 秘钥失效
|
|
514
|
-
const encryptSwitch = await this.dealEncryptionSwitch(resHeader, true);
|
|
515
|
-
if (retryTimes > 2) {
|
|
516
|
-
throw new Error('解密失败,请重试');
|
|
394
|
+
const str = JSON.stringify(obj, null, 2).replace(/\\"/ig, '\'');
|
|
395
|
+
if (isSuccess) {
|
|
396
|
+
logger.log(`接口请求成功:\n${str}`);
|
|
397
|
+
} else {
|
|
398
|
+
logger.warn(`接口请求失败:\n${str}`);
|
|
517
399
|
}
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
wx.request({
|
|
403
|
+
url: this.makeUrl(path),
|
|
404
|
+
header,
|
|
405
|
+
method,
|
|
406
|
+
data,
|
|
407
|
+
enableHttp2: true,
|
|
408
|
+
success: (res) => {
|
|
409
|
+
printLog(true, res.data);
|
|
410
|
+
resolve(res);
|
|
411
|
+
},
|
|
412
|
+
fail: (err) => {
|
|
413
|
+
printLog(false, err);
|
|
414
|
+
reject(err);
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
});
|
|
537
418
|
}
|
|
538
419
|
}
|
package/src/runtime/login.ts
CHANGED
package/src/aes.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
CryptoJS v3.1.2
|
|
3
|
-
code.google.com/p/crypto-js
|
|
4
|
-
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
|
5
|
-
code.google.com/p/crypto-js/wiki/License
|
|
6
|
-
*/
|
|
7
|
-
/* eslint-disable */
|
|
8
|
-
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
|
9
|
-
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
|
|
10
|
-
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
|
|
11
|
-
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
|
|
12
|
-
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
|
|
13
|
-
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
|
|
14
|
-
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
|
|
15
|
-
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
|
|
16
|
-
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
|
17
|
-
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
|
|
18
|
-
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
|
|
19
|
-
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
|
|
20
|
-
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
|
|
21
|
-
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
|
|
22
|
-
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
|
|
23
|
-
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
|
|
24
|
-
l)}})();
|
|
25
|
-
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
|
|
26
|
-
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
|
|
27
|
-
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
|
|
28
|
-
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
|
|
29
|
-
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
|
|
30
|
-
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
|
|
31
|
-
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
|
|
32
|
-
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
|
|
33
|
-
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
|
|
34
|
-
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
|
|
35
|
-
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
|
|
36
|
-
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
|
|
37
|
-
CryptoJS.mode.CBC = (function () {
|
|
38
|
-
var CBC = CryptoJS.lib.BlockCipherMode.extend();
|
|
39
|
-
|
|
40
|
-
CBC.Encryptor = CBC.extend({
|
|
41
|
-
processBlock: function (words, offset) {
|
|
42
|
-
var cipher = this._cipher;
|
|
43
|
-
var blockSize = cipher.blockSize;
|
|
44
|
-
|
|
45
|
-
xorBlock.call(this, words, offset, blockSize);
|
|
46
|
-
cipher.encryptBlock(words, offset);
|
|
47
|
-
|
|
48
|
-
this._prevBlock = words.slice(offset, offset + blockSize);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
CBC.Decryptor = CBC.extend({
|
|
53
|
-
processBlock: function (words, offset) {
|
|
54
|
-
var cipher = this._cipher;
|
|
55
|
-
var blockSize = cipher.blockSize;
|
|
56
|
-
|
|
57
|
-
var thisBlock = words.slice(offset, offset + blockSize);
|
|
58
|
-
cipher.decryptBlock(words, offset);
|
|
59
|
-
xorBlock.call(this, words, offset, blockSize);
|
|
60
|
-
|
|
61
|
-
this._prevBlock = thisBlock;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
function xorBlock(words, offset, blockSize) {
|
|
66
|
-
var block;
|
|
67
|
-
|
|
68
|
-
if (this._iv) {
|
|
69
|
-
block = this._iv;
|
|
70
|
-
this._iv = undefined;
|
|
71
|
-
} else {
|
|
72
|
-
block = this._prevBlock;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
for (var i = 0; i < blockSize; i++) {
|
|
76
|
-
words[offset + i] ^= block[i];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return CBC;
|
|
81
|
-
}());
|
|
82
|
-
module.exports = {
|
|
83
|
-
CryptoJS: CryptoJS
|
|
84
|
-
}
|