Js逆向爬虫

学习目标:

  1. 了解 混淆的作用
  2. 了解 ob混淆的方式
  3. 了解 如何将代码进行混淆
  4. 熟悉 解析混淆网站的过程

一、混淆简介

1.为什么要进行混淆?


网页的逻辑通常依赖 JavaScript 实现,而 JavaScript 具有以下特点:

  • JavaScript 代码运行于客户端,必须在用户浏览器中加载并执行。

  • JavaScript 代码对用户是可见的,浏览器能够直接获取并查看正在运行的 JavaScript 源码。

2.压缩、混淆与加密技术


为增强代码安全性,常采用以下三种技术手段:

  • 代码压缩:移除 JavaScript 代码中不必要的空格、换行等内容,将源码压缩为少量行,以降低可读性,同时提升网站加载速度。

  • 代码混淆:通过变量替换、字符串阵列化、控制流平坦化、多态变异、僵尸函数、调试保护等方法,使代码难以阅读和分析,从而实现有效保护。这种方式不影响代码原有功能,是一种理想且实用的 JavaScript 保护方案。

  • 代码加密:采用更高级的手段对 JavaScript 代码进行加密,将其转换为难以阅读或解析的形式,例如 eval 加密。此外,还有更强大的加密技术,如通过 Emscripten 或 WebAssembly 将 JavaScript 核心功能用 C/C++ 实现,并编译成二进制文件,由 JavaScript 调用执行。

二、ob混淆

OB 混淆全称 Obfuscator , Obfuscator 其实就是混淆的意思,官网:https://obfuscator.io/,其作者是一位叫 Timofey Kachalov 的俄罗斯 JavaScript 开发工程师,早在2016年就发布了第一个版本。

1.ob混淆的特点

1.一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;

2.函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或者字母组合;

3.自执行函数,进行移位操作,有明显的 push、shift关键字;

混淆之前的代码

 
  1. source code
  2.  
  3. function hi() {
  4. console.log("Hello World!");
  5. }
  6.  
  7. hi();
 
javascript

混淆之后的代码

 
  1. var _0x3ed0 = ['1241023ikpdYM', 'Hello\x20World!', '291190xIUkft', '1251274vQVPdI', '124952hgHyOi', '1983KQSSIW', '247DipWFn', '7354VgseoG', '49680CQWPxl', '1ZTWTUo', '648lISKkF'];
  2.  
  3. function _0x4ed9(_0x475ec5, _0x372034) {
  4. return _0x4ed9 = function (_0x3ed0df, _0x4ed9c4) {
  5. _0x3ed0df = _0x3ed0df - 0x96;
  6. var _0x5a22f3 = _0x3ed0[_0x3ed0df];
  7. return _0x5a22f3;
  8. }, _0x4ed9(_0x475ec5, _0x372034);
  9. }
  10.  
  11. (function (_0xa942b4, _0x57410c) {
  12. var _0x4e4980 = _0x4ed9;
  13.  
  14. while (!![]) {
  15. try {
  16. var _0x1e86fa = parseInt(_0x4e4980(0x9b)) + parseInt(_0x4e4980(0x9e)) + -parseInt(_0x4e4980(0x97)) + -parseInt(_0x4e4980(0x9c)) * -parseInt(_0x4e4980(0xa0)) + -parseInt(_0x4e4980(0x98)) * parseInt(_0x4e4980(0x9d)) + -parseInt(_0x4e4980(0x96)) + parseInt(_0x4e4980(0x99)) * parseInt(_0x4e4980(0x9a));
  17.  
  18. if (_0x1e86fa === _0x57410c) break; else _0xa942b4['push'](_0xa942b4['shift']());
  19. } catch (_0x178fbf) {
  20. _0xa942b4['push'](_0xa942b4['shift']());
  21. }
  22. }
  23. })(_0x3ed0, 0xb3f61);
  24.  
  25. function hi() {
  26. var _0x81b55a = _0x4ed9;
  27. console['log'](_0x81b55a(0x9f));
  28. }
  29.  
  30. hi();
 
javascript

2.ob混淆结构

JavaScript Obfuscator 的混淆结构通常包含以下几个关键部分,不同项目或版本可能略有差异,但整体可归纳如下:


1. 初始加密数组

混淆后的代码通常以一个或多个加密数组开头,这些数组存储了经过编码的字符串、函数名或其他关键数据。数组本身可能被进一步混淆(如拆分、嵌套或编码),使其不易被直接识别。数组的位置不一定在代码开头,也可能被隐藏在其他逻辑中。


2. 数组重组与解码逻辑

混淆器通常会通过一系列函数对初始数组进行重组或解码(例如元素顺序重排、映射变换、解密函数等)。这些函数可能是立即执行的(IIFE)或延迟执行的,且可能涉及复杂的操作(如位运算、哈希计算等)。注意: 此类代码格式化或修改可能导致内存泄漏或执行异常,建议谨慎处理。


3. 自解密机制与反调试

部分混淆代码包含自解密逻辑,可能在运行时动态解密关键函数或数据。此类机制常与反调试措施(如 debugger 语句、定时器检测、控制流陷阱)结合,干扰分析工具的动态调试。解密函数可能延迟执行或分段触发,增加分析难度。


4. 真实逻辑与控制流平坦化

核心业务逻辑通常被控制流平坦化(Control Flow Flattening)技术打散,即通过一个状态机或调度器分散原始代码的执行流程。真实代码块被拆分为多个片段,并通过开关(switch-case)或跳转表动态调度。这是混淆的核心防御层,需重点分析。


5. 垃圾代码与冗余结构

混淆代码中常注入大量无用的代码块(死代码、冗余循环、虚假条件判断等),目的是掩盖真实逻辑。此类代码通常不影响业务功能,但可能包含反调试(如无限 debugger)或环境检测(如浏览器特性检查)。删除时需谨慎,避免误删真实逻辑。


注意:
  • 上述结构不一定按固定顺序出现,例如数组定义可能被嵌入到函数内部,解密逻辑可能早于数组初始化。

  • 不同版本的 Obfuscator 或自定义配置可能导致结构差异,需具体问题具体分析。

  • 建议结合静态分析(如 AST 解析)与动态调试(浏览器 DevTools 条件断点)逐步还原代码逻辑。

三、ob混淆介绍

JavaScript 混淆是一种通过对代码进行变形和加密,使其难以被阅读与分析,从而保护知识产权和逻辑机密的技术手段。其主要混淆方式包括以下几类:


1.核心数据混淆

  1. 变量/函数名混淆
    将有意义标识符(变量、函数、常量)替换为无意义的短名称(如 _0x1a2bab),大幅降低代码可读性。

  2. 字符串加密与阵列化
    将明文字符串进行编码(Base64、Hex、MD5 等)或拆分为数组元素,使用时动态解密,防止通过字符串搜索快速定位关键逻辑。

  3. 属性名加密
    对对象属性名进行转换或哈希处理,隐藏属性访问关系,增加代码跟踪难度。


2.结构与逻辑混淆

  1. 控制流平坦化
    将原有线性或分支代码逻辑拆分为多个基本块,并通过中央调度器(如 switch-case 结构)控制执行流程,使代码执行顺序混乱无序。

  2. 僵尸代码注入
    插入无效代码、冗余逻辑或永不执行的条件分支,干扰分析人员阅读与自动化分析工具。

  3. 多态变异技术
    每次代码执行时自动重构自身(如更改变量名、调整语句顺序),实现功能不变而形态变化,避免被动态调试捕捉固定模式。


3.执行环境检测与防护

  1. 反调试机制
    检测开发者工具环境,触发 debugger 语句或异常逻辑,阻碍调试过程。可能结合定时器、控制台检查等方式增强对抗。

  2. 域名锁定
    验证当前运行域名,若非指定域名则阻止执行,防止代码被非法迁移或滥用。

  3. 反格式化对抗
    检测代码是否被格式化(如通过函数名或栈特征),触发异常执行流程(如死循环),导致浏览器假死或逻辑失效。


4.高级编码与动态保护

  1. 特殊编码转换
    将代码转换为非常规形式(如 Unicode 转义序列、表情符号、自定义编码),使得人工阅读几乎不可行。

  2. 动态解密与实时执行
    关键代码段在运行时动态解密并执行(如通过 eval 或 Function 构造函数),避免以明文形式出现在静态代码中。


总结:

JavaScript 混淆技术从数据隐藏结构变形环境检测动态行为多个层面构建保护体系。实际应用中常组合多种方式,形成深度防御。但需注意,混淆可能影响代码性能与可维护性,需根据安全需求与执行环境权衡使用。

四、实现ob混淆

安装ob混淆库

npm install javascript-obfuscator -g
bash

安装完成后,javascript-obfuscator 就是一个独立的可执行命令了。

代码压缩

这里 javascript-obfuscator 也提供了代码压缩的功能,使用其参数 compact 即可完成 JavaScript 代码的压缩,输出为一行内容。默认是ture,如果定义为false,则混淆后的代码会分行显示。

 
  1. const JavaScriptObfuscator = require('javascript-obfuscator');
  2.  
  3. const sourceCode = `
  4. function myFunction() {
  5. var myVariable = 'Hello, World!';
  6. console.log(myVariable);
  7. }
  8. myFunction();
  9. `;
  10.  
  11. const options = {
  12. compact: true, // 启用压缩
  13. controlFlowFlattening: true, // 控制流 平坦化
  14. controlFlowFlatteningThreshold: 0.75, // 控制流平坦化阈值
  15. deadCodeInjection: true, // 使死代码注入
  16. deadCodeInjectionThreshold: 0.4, // 死代码注入阈值
  17. identifierNamesGenerator: 'hexadecimal', // 生成标识符的方式
  18. log: false, // 关闭日志
  19. rotateStringArray: true, // 旋转字符串数组
  20. selfDefending: true, // 启用自我防御
  21. stringArray: true, // 启用字符串数组
  22. stringArrayThreshold: 0.75, // 字符串数组阈值
  23. // domainLock: ['example.com'], // 锁定域名
  24. debugProtection: true, // 调试保护
  25. disableConsoleOutput: true, // 禁用控制台输出
  26. unicodeEscapeSequence: false, // 禁用 Unicode 转义序列
  27. rotateUnicodeArray: true, // 旋转 Unicode 数组
  28. };
  29.  
  30. const obfuscatedCode = JavaScriptObfuscator.obfuscate(sourceCode, options).getObfuscatedCode();
  31.  
  32. console.log(obfuscatedCode);
 
javascript

五、案例

案例一

1.逆向目标

网址:https://hangzhou.qccqcc.com/

接口:https://newopenapiweb.17qcc.com/api/services/app/SearchFactory/GetPageList

加密参数:

2.逆向分析

xhr进行定位:

加密的请求载荷的核心代码的定位:

hook定位:

 
  1. var my_parse = JSON.parse;
  2.  
  3. JSON.parse = function (params) {
  4.  
  5. //这里可以添加其他逻辑比如 debugger
  6. debugger;
  7.  
  8. console.log("json_parse params:",params);
  9.  
  10. return my_parse(params);
  11.  
  12. };
 
javascript

解密响应数据的核心代码的定位:

3.代码实现

javascript代码:

 
  1. var CryptoJS = require('crypto-js')
  2. var JSEncrypt = require('jsencrypt')
  3.  
  4. window = global;
  5.  
  6. navigator = {
  7. appName: "Netscape"
  8. }
  9.  
  10.  
  11. var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  12. var b64pad = "=";
  13.  
  14. function hex2b64(d) {
  15. var b;
  16. var e;
  17. var a = "";
  18. for (b = 0; b + 3 <= d.length; b += 3) {
  19. e = parseInt(d.substring(b, b + 3), 16);
  20. a += b64map.charAt(e >> 6) + b64map.charAt(e & 63)
  21. }
  22. if (b + 1 == d.length) {
  23. e = parseInt(d.substring(b, b + 1), 16);
  24. a += b64map.charAt(e << 2)
  25. } else {
  26. if (b + 2 == d.length) {
  27. e = parseInt(d.substring(b, b + 2), 16);
  28. a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4)
  29. }
  30. }
  31. if (b64pad) {
  32. while ((a.length & 3) > 0) {
  33. a += b64pad
  34. }
  35. }
  36. return a
  37. }
  38.  
  39. function b64tohex(f) {
  40. var d = "";
  41. var e;
  42. var b = 0;
  43. var c;
  44. var a;
  45. for (e = 0; e < f.length; ++e) {
  46. if (f.charAt(e) == b64pad) {
  47. break
  48. }
  49. a = b64map.indexOf(f.charAt(e));
  50. if (a < 0) {
  51. continue
  52. }
  53. if (b == 0) {
  54. d += int2char(a >> 2);
  55. c = a & 3;
  56. b = 1
  57. } else {
  58. if (b == 1) {
  59. d += int2char((c << 2) | (a >> 4));
  60. c = a & 15;
  61. b = 2
  62. } else {
  63. if (b == 2) {
  64. d += int2char(c);
  65. d += int2char(a >> 2);
  66. c = a & 3;
  67. b = 3
  68. } else {
  69. d += int2char((c << 2) | (a >> 4));
  70. d += int2char(a & 15);
  71. b = 0
  72. }
  73. }
  74. }
  75. }
  76. if (b == 1) {
  77. d += int2char(c << 2)
  78. }
  79. return d
  80. }
  81.  
  82. function b64toBA(e) {
  83. var d = b64tohex(e);
  84. var c;
  85. var b = new Array();
  86. for (c = 0; 2 * c < d.length; ++c) {
  87. b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16)
  88. }
  89. return b
  90. }
  91. ;var dbits;
  92. var canary = 244837814094590;
  93. var j_lm = ((canary & 16777215) == 15715070);
  94.  
  95. function BigInteger(e, d, f) {
  96. if (e != null) {
  97. if ("number" == typeof e) {
  98. this.fromNumber(e, d, f)
  99. } else {
  100. if (d == null && "string" != typeof e) {
  101. this.fromString(e, 256)
  102. } else {
  103. this.fromString(e, d)
  104. }
  105. }
  106. }
  107. }
  108.  
  109. function nbi() {
  110. return new BigInteger(null)
  111. }
  112.  
  113. function am1(f, a, b, e, h, g) {
  114. while (--g >= 0) {
  115. var d = a * this[f++] + b[e] + h;
  116. h = Math.floor(d / 67108864);
  117. b[e++] = d & 67108863
  118. }
  119. return h
  120. }
  121.  
  122. function am2(f, q, r, e, o, a) {
  123. var k = q & 32767
  124. , p = q >> 15;
  125. while (--a >= 0) {
  126. var d = this[f] & 32767;
  127. var g = this[f++] >> 15;
  128. var b = p * d + g * k;
  129. d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);
  130. o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);
  131. r[e++] = d & 1073741823
  132. }
  133. return o
  134. }
  135.  
  136. function am3(f, q, r, e, o, a) {
  137. var k = q & 16383
  138. , p = q >> 14;
  139. while (--a >= 0) {
  140. var d = this[f] & 16383;
  141. var g = this[f++] >> 14;
  142. var b = p * d + g * k;
  143. d = k * d + ((b & 16383) << 14) + r[e] + o;
  144. o = (d >> 28) + (b >> 14) + p * g;
  145. r[e++] = d & 268435455
  146. }
  147. return o
  148. }
  149.  
  150. if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
  151. BigInteger.prototype.am = am2;
  152. dbits = 30
  153. } else {
  154. if (j_lm && (navigator.appName != "Netscape")) {
  155. BigInteger.prototype.am = am1;
  156. dbits = 26
  157. } else {
  158. BigInteger.prototype.am = am3;
  159. dbits = 28
  160. }
  161. }
  162. BigInteger.prototype.DB = dbits;
  163. BigInteger.prototype.DM = ((1 << dbits) - 1);
  164. BigInteger.prototype.DV = (1 << dbits);
  165. var BI_FP = 52;
  166. BigInteger.prototype.FV = Math.pow(2, BI_FP);
  167. BigInteger.prototype.F1 = BI_FP - dbits;
  168. BigInteger.prototype.F2 = 2 * dbits - BI_FP;
  169. var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
  170. var BI_RC = new Array();
  171. var rr, vv;
  172. rr = "0".charCodeAt(0);
  173. for (vv = 0; vv <= 9; ++vv) {
  174. BI_RC[rr++] = vv
  175. }
  176. rr = "a".charCodeAt(0);
  177. for (vv = 10; vv < 36; ++vv) {
  178. BI_RC[rr++] = vv
  179. }
  180. rr = "A".charCodeAt(0);
  181. for (vv = 10; vv < 36; ++vv) {
  182. BI_RC[rr++] = vv
  183. }
  184.  
  185. function int2char(a) {
  186. return BI_RM.charAt(a)
  187. }
  188.  
  189. function intAt(b, a) {
  190. var d = BI_RC[b.charCodeAt(a)];
  191. return (d == null) ? -1 : d
  192. }
  193.  
  194. function bnpCopyTo(b) {
  195. for (var a = this.t - 1; a >= 0; --a) {
  196. b[a] = this[a]
  197. }
  198. b.t = this.t;
  199. b.s = this.s
  200. }
  201.  
  202. function bnpFromInt(a) {
  203. this.t = 1;
  204. this.s = (a < 0) ? -1 : 0;
  205. if (a > 0) {
  206. this[0] = a
  207. } else {
  208. if (a < -1) {
  209. this[0] = a + this.DV
  210. } else {
  211. this.t = 0
  212. }
  213. }
  214. }
  215.  
  216. function nbv(a) {
  217. var b = nbi();
  218. b.fromInt(a);
  219. return b
  220. }
  221.  
  222. function bnpFromString(h, c) {
  223. var e;
  224. if (c == 16) {
  225. e = 4
  226. } else {
  227. if (c == 8) {
  228. e = 3
  229. } else {
  230. if (c == 256) {
  231. e = 8
  232. } else {
  233. if (c == 2) {
  234. e = 1
  235. } else {
  236. if (c == 32) {
  237. e = 5
  238. } else {
  239. if (c == 4) {
  240. e = 2
  241. } else {
  242. this.fromRadix(h, c);
  243. return
  244. }
  245. }
  246. }
  247. }
  248. }
  249. }
  250. this.t = 0;
  251. this.s = 0;
  252. var g = h.length
  253. , d = false
  254. , f = 0;
  255. while (--g >= 0) {
  256. var a = (e == 8) ? h[g] & 255 : intAt(h, g);
  257. if (a < 0) {
  258. if (h.charAt(g) == "-") {
  259. d = true
  260. }
  261. continue
  262. }
  263. d = false;
  264. if (f == 0) {
  265. this[this.t++] = a
  266. } else {
  267. if (f + e > this.DB) {
  268. this[this.t - 1] |= (a & ((1 << (this.DB - f)) - 1)) << f;
  269. this[this.t++] = (a >> (this.DB - f))
  270. } else {
  271. this[this.t - 1] |= a << f
  272. }
  273. }
  274. f += e;
  275. if (f >= this.DB) {
  276. f -= this.DB
  277. }
  278. }
  279. if (e == 8 && (h[0] & 128) != 0) {
  280. this.s = -1;
  281. if (f > 0) {
  282. this[this.t - 1] |= ((1 << (this.DB - f)) - 1) << f
  283. }
  284. }
  285. this.clamp();
  286. if (d) {
  287. BigInteger.ZERO.subTo(this, this)
  288. }
  289. }
  290.  
  291. function bnpClamp() {
  292. var a = this.s & this.DM;
  293. while (this.t > 0 && this[this.t - 1] == a) {
  294. --this.t
  295. }
  296. }
  297.  
  298. function bnToString(c) {
  299. if (this.s < 0) {
  300. return "-" + this.negate().toString(c)
  301. }
  302. var e;
  303. if (c == 16) {
  304. e = 4
  305. } else {
  306. if (c == 8) {
  307. e = 3
  308. } else {
  309. if (c == 2) {
  310. e = 1
  311. } else {
  312. if (c == 32) {
  313. e = 5
  314. } else {
  315. if (c == 4) {
  316. e = 2
  317. } else {
  318. return this.toRadix(c)
  319. }
  320. }
  321. }
  322. }
  323. }
  324. var g = (1 << e) - 1, l, a = false, h = "", f = this.t;
  325. var j = this.DB - (f * this.DB) % e;
  326. if (f-- > 0) {
  327. if (j < this.DB && (l = this[f] >> j) > 0) {
  328. a = true;
  329. h = int2char(l)
  330. }
  331. while (f >= 0) {
  332. if (j < e) {
  333. l = (this[f] & ((1 << j) - 1)) << (e - j);
  334. l |= this[--f] >> (j += this.DB - e)
  335. } else {
  336. l = (this[f] >> (j -= e)) & g;
  337. if (j <= 0) {
  338. j += this.DB;
  339. --f
  340. }
  341. }
  342. if (l > 0) {
  343. a = true
  344. }
  345. if (a) {
  346. h += int2char(l)
  347. }
  348. }
  349. }
  350. return a ? h : "0"
  351. }
  352.  
  353. function bnNegate() {
  354. var a = nbi();
  355. BigInteger.ZERO.subTo(this, a);
  356. return a
  357. }
  358.  
  359. function bnAbs() {
  360. return (this.s < 0) ? this.negate() : this
  361. }
  362.  
  363. function bnCompareTo(b) {
  364. var d = this.s - b.s;
  365. if (d != 0) {
  366. return d
  367. }
  368. var c = this.t;
  369. d = c - b.t;
  370. if (d != 0) {
  371. return (this.s < 0) ? -d : d
  372. }
  373. while (--c >= 0) {
  374. if ((d = this[c] - b[c]) != 0) {
  375. return d
  376. }
  377. }
  378. return 0
  379. }
  380.  
  381. function nbits(a) {
  382. var c = 1, b;
  383. if ((b = a >>> 16) != 0) {
  384. a = b;
  385. c += 16
  386. }
  387. if ((b = a >> 8) != 0) {
  388. a = b;
  389. c += 8
  390. }
  391. if ((b = a >> 4) != 0) {
  392. a = b;
  393. c += 4
  394. }
  395. if ((b = a >> 2) != 0) {
  396. a = b;
  397. c += 2
  398. }
  399. if ((b = a >> 1) != 0) {
  400. a = b;
  401. c += 1
  402. }
  403. return c
  404. }
  405.  
  406. function bnBitLength() {
  407. if (this.t <= 0) {
  408. return 0
  409. }
  410. return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM))
  411. }
  412.  
  413. function bnpDLShiftTo(c, b) {
  414. var a;
  415. for (a = this.t - 1; a >= 0; --a) {
  416. b[a + c] = this[a]
  417. }
  418. for (a = c - 1; a >= 0; --a) {
  419. b[a] = 0
  420. }
  421. b.t = this.t + c;
  422. b.s = this.s
  423. }
  424.  
  425. function bnpDRShiftTo(c, b) {
  426. for (var a = c; a < this.t; ++a) {
  427. b[a - c] = this[a]
  428. }
  429. b.t = Math.max(this.t - c, 0);
  430. b.s = this.s
  431. }
  432.  
  433. function bnpLShiftTo(j, e) {
  434. var b = j % this.DB;
  435. var a = this.DB - b;
  436. var g = (1 << a) - 1;
  437. var f = Math.floor(j / this.DB), h = (this.s << b) & this.DM, d;
  438. for (d = this.t - 1; d >= 0; --d) {
  439. e[d + f + 1] = (this[d] >> a) | h;
  440. h = (this[d] & g) << b
  441. }
  442. for (d = f - 1; d >= 0; --d) {
  443. e[d] = 0
  444. }
  445. e[f] = h;
  446. e.t = this.t + f + 1;
  447. e.s = this.s;
  448. e.clamp()
  449. }
  450.  
  451. function bnpRShiftTo(g, d) {
  452. d.s = this.s;
  453. var e = Math.floor(g / this.DB);
  454. if (e >= this.t) {
  455. d.t = 0;
  456. return
  457. }
  458. var b = g % this.DB;
  459. var a = this.DB - b;
  460. var f = (1 << b) - 1;
  461. d[0] = this[e] >> b;
  462. for (var c = e + 1; c < this.t; ++c) {
  463. d[c - e - 1] |= (this[c] & f) << a;
  464. d[c - e] = this[c] >> b
  465. }
  466. if (b > 0) {
  467. d[this.t - e - 1] |= (this.s & f) << a
  468. }
  469. d.t = this.t - e;
  470. d.clamp()
  471. }
  472.  
  473. function bnpSubTo(d, f) {
  474. var e = 0
  475. , g = 0
  476. , b = Math.min(d.t, this.t);
  477. while (e < b) {
  478. g += this[e] - d[e];
  479. f[e++] = g & this.DM;
  480. g >>= this.DB
  481. }
  482. if (d.t < this.t) {
  483. g -= d.s;
  484. while (e < this.t) {
  485. g += this[e];
  486. f[e++] = g & this.DM;
  487. g >>= this.DB
  488. }
  489. g += this.s
  490. } else {
  491. g += this.s;
  492. while (e < d.t) {
  493. g -= d[e];
  494. f[e++] = g & this.DM;
  495. g >>= this.DB
  496. }
  497. g -= d.s
  498. }
  499. f.s = (g < 0) ? -1 : 0;
  500. if (g < -1) {
  501. f[e++] = this.DV + g
  502. } else {
  503. if (g > 0) {
  504. f[e++] = g
  505. }
  506. }
  507. f.t = e;
  508. f.clamp()
  509. }
  510.  
  511. function bnpMultiplyTo(c, e) {
  512. var b = this.abs()
  513. , f = c.abs();
  514. var d = b.t;
  515. e.t = d + f.t;
  516. while (--d >= 0) {
  517. e[d] = 0
  518. }
  519. for (d = 0; d < f.t; ++d) {
  520. e[d + b.t] = b.am(0, f[d], e, d, 0, b.t)
  521. }
  522. e.s = 0;
  523. e.clamp();
  524. if (this.s != c.s) {
  525. BigInteger.ZERO.subTo(e, e)
  526. }
  527. }
  528.  
  529. function bnpSquareTo(d) {
  530. var a = this.abs();
  531. var b = d.t = 2 * a.t;
  532. while (--b >= 0) {
  533. d[b] = 0
  534. }
  535. for (b = 0; b < a.t - 1; ++b) {
  536. var e = a.am(b, a[b], d, 2 * b, 0, 1);
  537. if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
  538. d[b + a.t] -= a.DV;
  539. d[b + a.t + 1] = 1
  540. }
  541. }
  542. if (d.t > 0) {
  543. d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1)
  544. }
  545. d.s = 0;
  546. d.clamp()
  547. }
  548.  
  549. function bnpDivRemTo(n, h, g) {
  550. var w = n.abs();
  551. if (w.t <= 0) {
  552. return
  553. }
  554. var k = this.abs();
  555. if (k.t < w.t) {
  556. if (h != null) {
  557. h.fromInt(0)
  558. }
  559. if (g != null) {
  560. this.copyTo(g)
  561. }
  562. return
  563. }
  564. if (g == null) {
  565. g = nbi()
  566. }
  567. var d = nbi()
  568. , a = this.s
  569. , l = n.s;
  570. var v = this.DB - nbits(w[w.t - 1]);
  571. if (v > 0) {
  572. w.lShiftTo(v, d);
  573. k.lShiftTo(v, g)
  574. } else {
  575. w.copyTo(d);
  576. k.copyTo(g)
  577. }
  578. var p = d.t;
  579. var b = d[p - 1];
  580. if (b == 0) {
  581. return
  582. }
  583. var o = b * (1 << this.F1) + ((p > 1) ? d[p - 2] >> this.F2 : 0);
  584. var A = this.FV / o
  585. , z = (1 << this.F1) / o
  586. , x = 1 << this.F2;
  587. var u = g.t
  588. , s = u - p
  589. , f = (h == null) ? nbi() : h;
  590. d.dlShiftTo(s, f);
  591. if (g.compareTo(f) >= 0) {
  592. g[g.t++] = 1;
  593. g.subTo(f, g)
  594. }
  595. BigInteger.ONE.dlShiftTo(p, f);
  596. f.subTo(d, d);
  597. while (d.t < p) {
  598. d[d.t++] = 0
  599. }
  600. while (--s >= 0) {
  601. var c = (g[--u] == b) ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);
  602. if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
  603. d.dlShiftTo(s, f);
  604. g.subTo(f, g);
  605. while (g[u] < --c) {
  606. g.subTo(f, g)
  607. }
  608. }
  609. }
  610. if (h != null) {
  611. g.drShiftTo(p, h);
  612. if (a != l) {
  613. BigInteger.ZERO.subTo(h, h)
  614. }
  615. }
  616. g.t = p;
  617. g.clamp();
  618. if (v > 0) {
  619. g.rShiftTo(v, g)
  620. }
  621. if (a < 0) {
  622. BigInteger.ZERO.subTo(g, g)
  623. }
  624. }
  625.  
  626. function bnMod(b) {
  627. var c = nbi();
  628. this.abs().divRemTo(b, null, c);
  629. if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {
  630. b.subTo(c, c)
  631. }
  632. return c
  633. }
  634.  
  635. function Classic(a) {
  636. this.m = a
  637. }
  638.  
  639. function cConvert(a) {
  640. if (a.s < 0 || a.compareTo(this.m) >= 0) {
  641. return a.mod(this.m)
  642. } else {
  643. return a
  644. }
  645. }
  646.  
  647. function cRevert(a) {
  648. return a
  649. }
  650.  
  651. function cReduce(a) {
  652. a.divRemTo(this.m, null, a)
  653. }
  654.  
  655. function cMulTo(a, c, b) {
  656. a.multiplyTo(c, b);
  657. this.reduce(b)
  658. }
  659.  
  660. function cSqrTo(a, b) {
  661. a.squareTo(b);
  662. this.reduce(b)
  663. }
  664.  
  665. Classic.prototype.convert = cConvert;
  666. Classic.prototype.revert = cRevert;
  667. Classic.prototype.reduce = cReduce;
  668. Classic.prototype.mulTo = cMulTo;
  669. Classic.prototype.sqrTo = cSqrTo;
  670.  
  671. function bnpInvDigit() {
  672. if (this.t < 1) {
  673. return 0
  674. }
  675. var a = this[0];
  676. if ((a & 1) == 0) {
  677. return 0
  678. }
  679. var b = a & 3;
  680. b = (b * (2 - (a & 15) * b)) & 15;
  681. b = (b * (2 - (a & 255) * b)) & 255;
  682. b = (b * (2 - (((a & 65535) * b) & 65535))) & 65535;
  683. b = (b * (2 - a * b % this.DV)) % this.DV;
  684. return (b > 0) ? this.DV - b : -b
  685. }
  686.  
  687. function Montgomery(a) {
  688. this.m = a;
  689. this.mp = a.invDigit();
  690. this.mpl = this.mp & 32767;
  691. this.mph = this.mp >> 15;
  692. this.um = (1 << (a.DB - 15)) - 1;
  693. this.mt2 = 2 * a.t
  694. }
  695.  
  696. function montConvert(a) {
  697. var b = nbi();
  698. a.abs().dlShiftTo(this.m.t, b);
  699. b.divRemTo(this.m, null, b);
  700. if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {
  701. this.m.subTo(b, b)
  702. }
  703. return b
  704. }
  705.  
  706. function montRevert(a) {
  707. var b = nbi();
  708. a.copyTo(b);
  709. this.reduce(b);
  710. return b
  711. }
  712.  
  713. function montReduce(a) {
  714. while (a.t <= this.mt2) {
  715. a[a.t++] = 0
  716. }
  717. for (var c = 0; c < this.m.t; ++c) {
  718. var b = a[c] & 32767;
  719. var d = (b * this.mpl + (((b * this.mph + (a[c] >> 15) * this.mpl) & this.um) << 15)) & a.DM;
  720. b = c + this.m.t;
  721. a[b] += this.m.am(0, d, a, c, 0, this.m.t);
  722. while (a[b] >= a.DV) {
  723. a[b] -= a.DV;
  724. a[++b]++
  725. }
  726. }
  727. a.clamp();
  728. a.drShiftTo(this.m.t, a);
  729. if (a.compareTo(this.m) >= 0) {
  730. a.subTo(this.m, a)
  731. }
  732. }
  733.  
  734. function montSqrTo(a, b) {
  735. a.squareTo(b);
  736. this.reduce(b)
  737. }
  738.  
  739. function montMulTo(a, c, b) {
  740. a.multiplyTo(c, b);
  741. this.reduce(b)
  742. }
  743.  
  744. Montgomery.prototype.convert = montConvert;
  745. Montgomery.prototype.revert = montRevert;
  746. Montgomery.prototype.reduce = montReduce;
  747. Montgomery.prototype.mulTo = montMulTo;
  748. Montgomery.prototype.sqrTo = montSqrTo;
  749.  
  750. function bnpIsEven() {
  751. return ((this.t > 0) ? (this[0] & 1) : this.s) == 0
  752. }
  753.  
  754. function bnpExp(h, j) {
  755. if (h > 4294967295 || h < 1) {
  756. return BigInteger.ONE
  757. }
  758. var f = nbi()
  759. , a = nbi()
  760. , d = j.convert(this)
  761. , c = nbits(h) - 1;
  762. d.copyTo(f);
  763. while (--c >= 0) {
  764. j.sqrTo(f, a);
  765. if ((h & (1 << c)) > 0) {
  766. j.mulTo(a, d, f)
  767. } else {
  768. var b = f;
  769. f = a;
  770. a = b
  771. }
  772. }
  773. return j.revert(f)
  774. }
  775.  
  776. function bnModPowInt(b, a) {
  777. var c;
  778. if (b < 256 || a.isEven()) {
  779. c = new Classic(a)
  780. } else {
  781. c = new Montgomery(a)
  782. }
  783. return this.exp(b, c)
  784. }
  785.  
  786. BigInteger.prototype.copyTo = bnpCopyTo;
  787. BigInteger.prototype.fromInt = bnpFromInt;
  788. BigInteger.prototype.fromString = bnpFromString;
  789. BigInteger.prototype.clamp = bnpClamp;
  790. BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
  791. BigInteger.prototype.drShiftTo = bnpDRShiftTo;
  792. BigInteger.prototype.lShiftTo = bnpLShiftTo;
  793. BigInteger.prototype.rShiftTo = bnpRShiftTo;
  794. BigInteger.prototype.subTo = bnpSubTo;
  795. BigInteger.prototype.multiplyTo = bnpMultiplyTo;
  796. BigInteger.prototype.squareTo = bnpSquareTo;
  797. BigInteger.prototype.divRemTo = bnpDivRemTo;
  798. BigInteger.prototype.invDigit = bnpInvDigit;
  799. BigInteger.prototype.isEven = bnpIsEven;
  800. BigInteger.prototype.exp = bnpExp;
  801. BigInteger.prototype.toString = bnToString;
  802. BigInteger.prototype.negate = bnNegate;
  803. BigInteger.prototype.abs = bnAbs;
  804. BigInteger.prototype.compareTo = bnCompareTo;
  805. BigInteger.prototype.bitLength = bnBitLength;
  806. BigInteger.prototype.mod = bnMod;
  807. BigInteger.prototype.modPowInt = bnModPowInt;
  808. BigInteger.ZERO = nbv(0);
  809. BigInteger.ONE = nbv(1);
  810.  
  811. function bnClone() {
  812. var a = nbi();
  813. this.copyTo(a);
  814. return a
  815. }
  816.  
  817. function bnIntValue() {
  818. if (this.s < 0) {
  819. if (this.t == 1) {
  820. return this[0] - this.DV
  821. } else {
  822. if (this.t == 0) {
  823. return -1
  824. }
  825. }
  826. } else {
  827. if (this.t == 1) {
  828. return this[0]
  829. } else {
  830. if (this.t == 0) {
  831. return 0
  832. }
  833. }
  834. }
  835. return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]
  836. }
  837.  
  838. function bnByteValue() {
  839. return (this.t == 0) ? this.s : (this[0] << 24) >> 24
  840. }
  841.  
  842. function bnShortValue() {
  843. return (this.t == 0) ? this.s : (this[0] << 16) >> 16
  844. }
  845.  
  846. function bnpChunkSize(a) {
  847. return Math.floor(Math.LN2 * this.DB / Math.log(a))
  848. }
  849.  
  850. function bnSigNum() {
  851. if (this.s < 0) {
  852. return -1
  853. } else {
  854. if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
  855. return 0
  856. } else {
  857. return 1
  858. }
  859. }
  860. }
  861.  
  862. function bnpToRadix(c) {
  863. if (c == null) {
  864. c = 10
  865. }
  866. if (this.signum() == 0 || c < 2 || c > 36) {
  867. return "0"
  868. }
  869. var f = this.chunkSize(c);
  870. var e = Math.pow(c, f);
  871. var i = nbv(e)
  872. , j = nbi()
  873. , h = nbi()
  874. , g = "";
  875. this.divRemTo(i, j, h);
  876. while (j.signum() > 0) {
  877. g = (e + h.intValue()).toString(c).substr(1) + g;
  878. j.divRemTo(i, j, h)
  879. }
  880. return h.intValue().toString(c) + g
  881. }
  882.  
  883. function bnpFromRadix(m, h) {
  884. this.fromInt(0);
  885. if (h == null) {
  886. h = 10
  887. }
  888. var f = this.chunkSize(h);
  889. var g = Math.pow(h, f)
  890. , e = false
  891. , a = 0
  892. , l = 0;
  893. for (var c = 0; c < m.length; ++c) {
  894. var k = intAt(m, c);
  895. if (k < 0) {
  896. if (m.charAt(c) == "-" && this.signum() == 0) {
  897. e = true
  898. }
  899. continue
  900. }
  901. l = h * l + k;
  902. if (++a >= f) {
  903. this.dMultiply(g);
  904. this.dAddOffset(l, 0);
  905. a = 0;
  906. l = 0
  907. }
  908. }
  909. if (a > 0) {
  910. this.dMultiply(Math.pow(h, a));
  911. this.dAddOffset(l, 0)
  912. }
  913. if (e) {
  914. BigInteger.ZERO.subTo(this, this)
  915. }
  916. }
  917.  
  918. function bnpFromNumber(f, e, h) {
  919. if ("number" == typeof e) {
  920. if (f < 2) {
  921. this.fromInt(1)
  922. } else {
  923. this.fromNumber(f, h);
  924. if (!this.testBit(f - 1)) {
  925. this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this)
  926. }
  927. if (this.isEven()) {
  928. this.dAddOffset(1, 0)
  929. }
  930. while (!this.isProbablePrime(e)) {
  931. this.dAddOffset(2, 0);
  932. if (this.bitLength() > f) {
  933. this.subTo(BigInteger.ONE.shiftLeft(f - 1), this)
  934. }
  935. }
  936. }
  937. } else {
  938. var d = new Array()
  939. , g = f & 7;
  940. d.length = (f >> 3) + 1;
  941. e.nextBytes(d);
  942. if (g > 0) {
  943. d[0] &= ((1 << g) - 1)
  944. } else {
  945. d[0] = 0
  946. }
  947. this.fromString(d, 256)
  948. }
  949. }
  950.  
  951. function bnToByteArray() {
  952. var b = this.t
  953. , c = new Array();
  954. c[0] = this.s;
  955. var e = this.DB - (b * this.DB) % 8, f, a = 0;
  956. if (b-- > 0) {
  957. if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
  958. c[a++] = f | (this.s << (this.DB - e))
  959. }
  960. while (b >= 0) {
  961. if (e < 8) {
  962. f = (this[b] & ((1 << e) - 1)) << (8 - e);
  963. f |= this[--b] >> (e += this.DB - 8)
  964. } else {
  965. f = (this[b] >> (e -= 8)) & 255;
  966. if (e <= 0) {
  967. e += this.DB;
  968. --b
  969. }
  970. }
  971. if ((f & 128) != 0) {
  972. f |= -256
  973. }
  974. if (a == 0 && (this.s & 128) != (f & 128)) {
  975. ++a
  976. }
  977. if (a > 0 || f != this.s) {
  978. c[a++] = f
  979. }
  980. }
  981. }
  982. return c
  983. }
  984.  
  985. function bnEquals(b) {
  986. return (this.compareTo(b) == 0)
  987. }
  988.  
  989. function bnMin(b) {
  990. return (this.compareTo(b) < 0) ? this : b
  991. }
  992.  
  993. function bnMax(b) {
  994. return (this.compareTo(b) > 0) ? this : b
  995. }
  996.  
  997. function bnpBitwiseTo(c, h, e) {
  998. var d, g, b = Math.min(c.t, this.t);
  999. for (d = 0; d < b; ++d) {
  1000. e[d] = h(this[d], c[d])
  1001. }
  1002. if (c.t < this.t) {
  1003. g = c.s & this.DM;
  1004. for (d = b; d < this.t; ++d) {
  1005. e[d] = h(this[d], g)
  1006. }
  1007. e.t = this.t
  1008. } else {
  1009. g = this.s & this.DM;
  1010. for (d = b; d < c.t; ++d) {
  1011. e[d] = h(g, c[d])
  1012. }
  1013. e.t = c.t
  1014. }
  1015. e.s = h(this.s, c.s);
  1016. e.clamp()
  1017. }
  1018.  
  1019. function op_and(a, b) {
  1020. return a & b
  1021. }
  1022.  
  1023. function bnAnd(b) {
  1024. var c = nbi();
  1025. this.bitwiseTo(b, op_and, c);
  1026. return c
  1027. }
  1028.  
  1029. function op_or(a, b) {
  1030. return a | b
  1031. }
  1032.  
  1033. function bnOr(b) {
  1034. var c = nbi();
  1035. this.bitwiseTo(b, op_or, c);
  1036. return c
  1037. }
  1038.  
  1039. function op_xor(a, b) {
  1040. return a ^ b
  1041. }
  1042.  
  1043. function bnXor(b) {
  1044. var c = nbi();
  1045. this.bitwiseTo(b, op_xor, c);
  1046. return c
  1047. }
  1048.  
  1049. function op_andnot(a, b) {
  1050. return a & ~b
  1051. }
  1052.  
  1053. function bnAndNot(b) {
  1054. var c = nbi();
  1055. this.bitwiseTo(b, op_andnot, c);
  1056. return c
  1057. }
  1058.  
  1059. function bnNot() {
  1060. var b = nbi();
  1061. for (var a = 0; a < this.t; ++a) {
  1062. b[a] = this.DM & ~this[a]
  1063. }
  1064. b.t = this.t;
  1065. b.s = ~this.s;
  1066. return b
  1067. }
  1068.  
  1069. function bnShiftLeft(b) {
  1070. var a = nbi();
  1071. if (b < 0) {
  1072. this.rShiftTo(-b, a)
  1073. } else {
  1074. this.lShiftTo(b, a)
  1075. }
  1076. return a
  1077. }
  1078.  
  1079. function bnShiftRight(b) {
  1080. var a = nbi();
  1081. if (b < 0) {
  1082. this.lShiftTo(-b, a)
  1083. } else {
  1084. this.rShiftTo(b, a)
  1085. }
  1086. return a
  1087. }
  1088.  
  1089. function lbit(a) {
  1090. if (a == 0) {
  1091. return -1
  1092. }
  1093. var b = 0;
  1094. if ((a & 65535) == 0) {
  1095. a >>= 16;
  1096. b += 16
  1097. }
  1098. if ((a & 255) == 0) {
  1099. a >>= 8;
  1100. b += 8
  1101. }
  1102. if ((a & 15) == 0) {
  1103. a >>= 4;
  1104. b += 4
  1105. }
  1106. if ((a & 3) == 0) {
  1107. a >>= 2;
  1108. b += 2
  1109. }
  1110. if ((a & 1) == 0) {
  1111. ++b
  1112. }
  1113. return b
  1114. }
  1115.  
  1116. function bnGetLowestSetBit() {
  1117. for (var a = 0; a < this.t; ++a) {
  1118. if (this[a] != 0) {
  1119. return a * this.DB + lbit(this[a])
  1120. }
  1121. }
  1122. if (this.s < 0) {
  1123. return this.t * this.DB
  1124. }
  1125. return -1
  1126. }
  1127.  
  1128. function cbit(a) {
  1129. var b = 0;
  1130. while (a != 0) {
  1131. a &= a - 1;
  1132. ++b
  1133. }
  1134. return b
  1135. }
  1136.  
  1137. function bnBitCount() {
  1138. var c = 0
  1139. , a = this.s & this.DM;
  1140. for (var b = 0; b < this.t; ++b) {
  1141. c += cbit(this[b] ^ a)
  1142. }
  1143. return c
  1144. }
  1145.  
  1146. function bnTestBit(b) {
  1147. var a = Math.floor(b / this.DB);
  1148. if (a >= this.t) {
  1149. return (this.s != 0)
  1150. }
  1151. return ((this[a] & (1 << (b % this.DB))) != 0)
  1152. }
  1153.  
  1154. function bnpChangeBit(c, b) {
  1155. var a = BigInteger.ONE.shiftLeft(c);
  1156. this.bitwiseTo(a, b, a);
  1157. return a
  1158. }
  1159.  
  1160. function bnSetBit(a) {
  1161. return this.changeBit(a, op_or)
  1162. }
  1163.  
  1164. function bnClearBit(a) {
  1165. return this.changeBit(a, op_andnot)
  1166. }
  1167.  
  1168. function bnFlipBit(a) {
  1169. return this.changeBit(a, op_xor)
  1170. }
  1171.  
  1172. function bnpAddTo(d, f) {
  1173. var e = 0
  1174. , g = 0
  1175. , b = Math.min(d.t, this.t);
  1176. while (e < b) {
  1177. g += this[e] + d[e];
  1178. f[e++] = g & this.DM;
  1179. g >>= this.DB
  1180. }
  1181. if (d.t < this.t) {
  1182. g += d.s;
  1183. while (e < this.t) {
  1184. g += this[e];
  1185. f[e++] = g & this.DM;
  1186. g >>= this.DB
  1187. }
  1188. g += this.s
  1189. } else {
  1190. g += this.s;
  1191. while (e < d.t) {
  1192. g += d[e];
  1193. f[e++] = g & this.DM;
  1194. g >>= this.DB
  1195. }
  1196. g += d.s
  1197. }
  1198. f.s = (g < 0) ? -1 : 0;
  1199. if (g > 0) {
  1200. f[e++] = g
  1201. } else {
  1202. if (g < -1) {
  1203. f[e++] = this.DV + g
  1204. }
  1205. }
  1206. f.t = e;
  1207. f.clamp()
  1208. }
  1209.  
  1210. function bnAdd(b) {
  1211. var c = nbi();
  1212. this.addTo(b, c);
  1213. return c
  1214. }
  1215.  
  1216. function bnSubtract(b) {
  1217. var c = nbi();
  1218. this.subTo(b, c);
  1219. return c
  1220. }
  1221.  
  1222. function bnMultiply(b) {
  1223. var c = nbi();
  1224. this.multiplyTo(b, c);
  1225. return c
  1226. }
  1227.  
  1228. function bnSquare() {
  1229. var a = nbi();
  1230. this.squareTo(a);
  1231. return a
  1232. }
  1233.  
  1234. function bnDivide(b) {
  1235. var c = nbi();
  1236. this.divRemTo(b, c, null);
  1237. return c
  1238. }
  1239.  
  1240. function bnRemainder(b) {
  1241. var c = nbi();
  1242. this.divRemTo(b, null, c);
  1243. return c
  1244. }
  1245.  
  1246. function bnDivideAndRemainder(b) {
  1247. var d = nbi()
  1248. , c = nbi();
  1249. this.divRemTo(b, d, c);
  1250. return new Array(d, c)
  1251. }
  1252.  
  1253. function bnpDMultiply(a) {
  1254. this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);
  1255. ++this.t;
  1256. this.clamp()
  1257. }
  1258.  
  1259. function bnpDAddOffset(b, a) {
  1260. if (b == 0) {
  1261. return
  1262. }
  1263. while (this.t <= a) {
  1264. this[this.t++] = 0
  1265. }
  1266. this[a] += b;
  1267. while (this[a] >= this.DV) {
  1268. this[a] -= this.DV;
  1269. if (++a >= this.t) {
  1270. this[this.t++] = 0
  1271. }
  1272. ++this[a]
  1273. }
  1274. }
  1275.  
  1276. function NullExp() {
  1277. }
  1278.  
  1279. function nNop(a) {
  1280. return a
  1281. }
  1282.  
  1283. function nMulTo(a, c, b) {
  1284. a.multiplyTo(c, b)
  1285. }
  1286.  
  1287. function nSqrTo(a, b) {
  1288. a.squareTo(b)
  1289. }
  1290.  
  1291. NullExp.prototype.convert = nNop;
  1292. NullExp.prototype.revert = nNop;
  1293. NullExp.prototype.mulTo = nMulTo;
  1294. NullExp.prototype.sqrTo = nSqrTo;
  1295.  
  1296. function bnPow(a) {
  1297. return this.exp(a, new NullExp())
  1298. }
  1299.  
  1300. function bnpMultiplyLowerTo(b, f, e) {
  1301. var d = Math.min(this.t + b.t, f);
  1302. e.s = 0;
  1303. e.t = d;
  1304. while (d > 0) {
  1305. e[--d] = 0
  1306. }
  1307. var c;
  1308. for (c = e.t - this.t; d < c; ++d) {
  1309. e[d + this.t] = this.am(0, b[d], e, d, 0, this.t)
  1310. }
  1311. for (c = Math.min(b.t, f); d < c; ++d) {
  1312. this.am(0, b[d], e, d, 0, f - d)
  1313. }
  1314. e.clamp()
  1315. }
  1316.  
  1317. function bnpMultiplyUpperTo(b, e, d) {
  1318. --e;
  1319. var c = d.t = this.t + b.t - e;
  1320. d.s = 0;
  1321. while (--c >= 0) {
  1322. d[c] = 0
  1323. }
  1324. for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
  1325. d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e)
  1326. }
  1327. d.clamp();
  1328. d.drShiftTo(1, d)
  1329. }
  1330.  
  1331. function Barrett(a) {
  1332. this.r2 = nbi();
  1333. this.q3 = nbi();
  1334. BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
  1335. this.mu = this.r2.divide(a);
  1336. this.m = a
  1337. }
  1338.  
  1339. function barrettConvert(a) {
  1340. if (a.s < 0 || a.t > 2 * this.m.t) {
  1341. return a.mod(this.m)
  1342. } else {
  1343. if (a.compareTo(this.m) < 0) {
  1344. return a
  1345. } else {
  1346. var b = nbi();
  1347. a.copyTo(b);
  1348. this.reduce(b);
  1349. return b
  1350. }
  1351. }
  1352. }
  1353.  
  1354. function barrettRevert(a) {
  1355. return a
  1356. }
  1357.  
  1358. function barrettReduce(a) {
  1359. a.drShiftTo(this.m.t - 1, this.r2);
  1360. if (a.t > this.m.t + 1) {
  1361. a.t = this.m.t + 1;
  1362. a.clamp()
  1363. }
  1364. this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
  1365. this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
  1366. while (a.compareTo(this.r2) < 0) {
  1367. a.dAddOffset(1, this.m.t + 1)
  1368. }
  1369. a.subTo(this.r2, a);
  1370. while (a.compareTo(this.m) >= 0) {
  1371. a.subTo(this.m, a)
  1372. }
  1373. }
  1374.  
  1375. function barrettSqrTo(a, b) {
  1376. a.squareTo(b);
  1377. this.reduce(b)
  1378. }
  1379.  
  1380. function barrettMulTo(a, c, b) {
  1381. a.multiplyTo(c, b);
  1382. this.reduce(b)
  1383. }
  1384.  
  1385. Barrett.prototype.convert = barrettConvert;
  1386. Barrett.prototype.revert = barrettRevert;
  1387. Barrett.prototype.reduce = barrettReduce;
  1388. Barrett.prototype.mulTo = barrettMulTo;
  1389. Barrett.prototype.sqrTo = barrettSqrTo;
  1390.  
  1391. function bnModPow(q, f) {
  1392. var o = q.bitLength(), h, b = nbv(1), v;
  1393. if (o <= 0) {
  1394. return b
  1395. } else {
  1396. if (o < 18) {
  1397. h = 1
  1398. } else {
  1399. if (o < 48) {
  1400. h = 3
  1401. } else {
  1402. if (o < 144) {
  1403. h = 4
  1404. } else {
  1405. if (o < 768) {
  1406. h = 5
  1407. } else {
  1408. h = 6
  1409. }
  1410. }
  1411. }
  1412. }
  1413. }
  1414. if (o < 8) {
  1415. v = new Classic(f)
  1416. } else {
  1417. if (f.isEven()) {
  1418. v = new Barrett(f)
  1419. } else {
  1420. v = new Montgomery(f)
  1421. }
  1422. }
  1423. var p = new Array()
  1424. , d = 3
  1425. , s = h - 1
  1426. , a = (1 << h) - 1;
  1427. p[1] = v.convert(this);
  1428. if (h > 1) {
  1429. var A = nbi();
  1430. v.sqrTo(p[1], A);
  1431. while (d <= a) {
  1432. p[d] = nbi();
  1433. v.mulTo(A, p[d - 2], p[d]);
  1434. d += 2
  1435. }
  1436. }
  1437. var l = q.t - 1, x, u = true, c = nbi(), y;
  1438. o = nbits(q[l]) - 1;
  1439. while (l >= 0) {
  1440. if (o >= s) {
  1441. x = (q[l] >> (o - s)) & a
  1442. } else {
  1443. x = (q[l] & ((1 << (o + 1)) - 1)) << (s - o);
  1444. if (l > 0) {
  1445. x |= q[l - 1] >> (this.DB + o - s)
  1446. }
  1447. }
  1448. d = h;
  1449. while ((x & 1) == 0) {
  1450. x >>= 1;
  1451. --d
  1452. }
  1453. if ((o -= d) < 0) {
  1454. o += this.DB;
  1455. --l
  1456. }
  1457. if (u) {
  1458. p[x].copyTo(b);
  1459. u = false
  1460. } else {
  1461. while (d > 1) {
  1462. v.sqrTo(b, c);
  1463. v.sqrTo(c, b);
  1464. d -= 2
  1465. }
  1466. if (d > 0) {
  1467. v.sqrTo(b, c)
  1468. } else {
  1469. y = b;
  1470. b = c;
  1471. c = y
  1472. }
  1473. v.mulTo(c, p[x], b)
  1474. }
  1475. while (l >= 0 && (q[l] & (1 << o)) == 0) {
  1476. v.sqrTo(b, c);
  1477. y = b;
  1478. b = c;
  1479. c = y;
  1480. if (--o < 0) {
  1481. o = this.DB - 1;
  1482. --l
  1483. }
  1484. }
  1485. }
  1486. return v.revert(b)
  1487. }
  1488.  
  1489. function bnGCD(c) {
  1490. var b = (this.s < 0) ? this.negate() : this.clone();
  1491. var h = (c.s < 0) ? c.negate() : c.clone();
  1492. if (b.compareTo(h) < 0) {
  1493. var e = b;
  1494. b = h;
  1495. h = e
  1496. }
  1497. var d = b.getLowestSetBit()
  1498. , f = h.getLowestSetBit();
  1499. if (f < 0) {
  1500. return b
  1501. }
  1502. if (d < f) {
  1503. f = d
  1504. }
  1505. if (f > 0) {
  1506. b.rShiftTo(f, b);
  1507. h.rShiftTo(f, h)
  1508. }
  1509. while (b.signum() > 0) {
  1510. if ((d = b.getLowestSetBit()) > 0) {
  1511. b.rShiftTo(d, b)
  1512. }
  1513. if ((d = h.getLowestSetBit()) > 0) {
  1514. h.rShiftTo(d, h)
  1515. }
  1516. if (b.compareTo(h) >= 0) {
  1517. b.subTo(h, b);
  1518. b.rShiftTo(1, b)
  1519. } else {
  1520. h.subTo(b, h);
  1521. h.rShiftTo(1, h)
  1522. }
  1523. }
  1524. if (f > 0) {
  1525. h.lShiftTo(f, h)
  1526. }
  1527. return h
  1528. }
  1529.  
  1530. function bnpModInt(e) {
  1531. if (e <= 0) {
  1532. return 0
  1533. }
  1534. var c = this.DV % e
  1535. , b = (this.s < 0) ? e - 1 : 0;
  1536. if (this.t > 0) {
  1537. if (c == 0) {
  1538. b = this[0] % e
  1539. } else {
  1540. for (var a = this.t - 1; a >= 0; --a) {
  1541. b = (c * b + this[a]) % e
  1542. }
  1543. }
  1544. }
  1545. return b
  1546. }
  1547.  
  1548. function bnModInverse(f) {
  1549. var j = f.isEven();
  1550. if ((this.isEven() && j) || f.signum() == 0) {
  1551. return BigInteger.ZERO
  1552. }
  1553. var i = f.clone()
  1554. , h = this.clone();
  1555. var g = nbv(1)
  1556. , e = nbv(0)
  1557. , l = nbv(0)
  1558. , k = nbv(1);
  1559. while (i.signum() != 0) {
  1560. while (i.isEven()) {
  1561. i.rShiftTo(1, i);
  1562. if (j) {
  1563. if (!g.isEven() || !e.isEven()) {
  1564. g.addTo(this, g);
  1565. e.subTo(f, e)
  1566. }
  1567. g.rShiftTo(1, g)
  1568. } else {
  1569. if (!e.isEven()) {
  1570. e.subTo(f, e)
  1571. }
  1572. }
  1573. e.rShiftTo(1, e)
  1574. }
  1575. while (h.isEven()) {
  1576. h.rShiftTo(1, h);
  1577. if (j) {
  1578. if (!l.isEven() || !k.isEven()) {
  1579. l.addTo(this, l);
  1580. k.subTo(f, k)
  1581. }
  1582. l.rShiftTo(1, l)
  1583. } else {
  1584. if (!k.isEven()) {
  1585. k.subTo(f, k)
  1586. }
  1587. }
  1588. k.rShiftTo(1, k)
  1589. }
  1590. if (i.compareTo(h) >= 0) {
  1591. i.subTo(h, i);
  1592. if (j) {
  1593. g.subTo(l, g)
  1594. }
  1595. e.subTo(k, e)
  1596. } else {
  1597. h.subTo(i, h);
  1598. if (j) {
  1599. l.subTo(g, l)
  1600. }
  1601. k.subTo(e, k)
  1602. }
  1603. }
  1604. if (h.compareTo(BigInteger.ONE) != 0) {
  1605. return BigInteger.ZERO
  1606. }
  1607. if (k.compareTo(f) >= 0) {
  1608. return k.subtract(f)
  1609. }
  1610. if (k.signum() < 0) {
  1611. k.addTo(f, k)
  1612. } else {
  1613. return k
  1614. }
  1615. if (k.signum() < 0) {
  1616. return k.add(f)
  1617. } else {
  1618. return k
  1619. }
  1620. }
  1621.  
  1622. var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
  1623. var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
  1624.  
  1625. function bnIsProbablePrime(e) {
  1626. var d, b = this.abs();
  1627. if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
  1628. for (d = 0; d < lowprimes.length; ++d) {
  1629. if (b[0] == lowprimes[d]) {
  1630. return true
  1631. }
  1632. }
  1633. return false
  1634. }
  1635. if (b.isEven()) {
  1636. return false
  1637. }
  1638. d = 1;
  1639. while (d < lowprimes.length) {
  1640. var a = lowprimes[d]
  1641. , c = d + 1;
  1642. while (c < lowprimes.length && a < lplim) {
  1643. a *= lowprimes[c++]
  1644. }
  1645. a = b.modInt(a);
  1646. while (d < c) {
  1647. if (a % lowprimes[d++] == 0) {
  1648. return false
  1649. }
  1650. }
  1651. }
  1652. return b.millerRabin(e)
  1653. }
  1654.  
  1655. function bnpMillerRabin(f) {
  1656. var g = this.subtract(BigInteger.ONE);
  1657. var c = g.getLowestSetBit();
  1658. if (c <= 0) {
  1659. return false
  1660. }
  1661. var h = g.shiftRight(c);
  1662. f = (f + 1) >> 1;
  1663. if (f > lowprimes.length) {
  1664. f = lowprimes.length
  1665. }
  1666. var b = nbi();
  1667. for (var e = 0; e < f; ++e) {
  1668. b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
  1669. var l = b.modPow(h, this);
  1670. if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
  1671. var d = 1;
  1672. while (d++ < c && l.compareTo(g) != 0) {
  1673. l = l.modPowInt(2, this);
  1674. if (l.compareTo(BigInteger.ONE) == 0) {
  1675. return false
  1676. }
  1677. }
  1678. if (l.compareTo(g) != 0) {
  1679. return false
  1680. }
  1681. }
  1682. }
  1683. return true
  1684. }
  1685.  
  1686. BigInteger.prototype.chunkSize = bnpChunkSize;
  1687. BigInteger.prototype.toRadix = bnpToRadix;
  1688. BigInteger.prototype.fromRadix = bnpFromRadix;
  1689. BigInteger.prototype.fromNumber = bnpFromNumber;
  1690. BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
  1691. BigInteger.prototype.changeBit = bnpChangeBit;
  1692. BigInteger.prototype.addTo = bnpAddTo;
  1693. BigInteger.prototype.dMultiply = bnpDMultiply;
  1694. BigInteger.prototype.dAddOffset = bnpDAddOffset;
  1695. BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
  1696. BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
  1697. BigInteger.prototype.modInt = bnpModInt;
  1698. BigInteger.prototype.millerRabin = bnpMillerRabin;
  1699. BigInteger.prototype.clone = bnClone;
  1700. BigInteger.prototype.intValue = bnIntValue;
  1701. BigInteger.prototype.byteValue = bnByteValue;
  1702. BigInteger.prototype.shortValue = bnShortValue;
  1703. BigInteger.prototype.signum = bnSigNum;
  1704. BigInteger.prototype.toByteArray = bnToByteArray;
  1705. BigInteger.prototype.equals = bnEquals;
  1706. BigInteger.prototype.min = bnMin;
  1707. BigInteger.prototype.max = bnMax;
  1708. BigInteger.prototype.and = bnAnd;
  1709. BigInteger.prototype.or = bnOr;
  1710. BigInteger.prototype.xor = bnXor;
  1711. BigInteger.prototype.andNot = bnAndNot;
  1712. BigInteger.prototype.not = bnNot;
  1713. BigInteger.prototype.shiftLeft = bnShiftLeft;
  1714. BigInteger.prototype.shiftRight = bnShiftRight;
  1715. BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
  1716. BigInteger.prototype.bitCount = bnBitCount;
  1717. BigInteger.prototype.testBit = bnTestBit;
  1718. BigInteger.prototype.setBit = bnSetBit;
  1719. BigInteger.prototype.clearBit = bnClearBit;
  1720. BigInteger.prototype.flipBit = bnFlipBit;
  1721. BigInteger.prototype.add = bnAdd;
  1722. BigInteger.prototype.subtract = bnSubtract;
  1723. BigInteger.prototype.multiply = bnMultiply;
  1724. BigInteger.prototype.divide = bnDivide;
  1725. BigInteger.prototype.remainder = bnRemainder;
  1726. BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
  1727. BigInteger.prototype.modPow = bnModPow;
  1728. BigInteger.prototype.modInverse = bnModInverse;
  1729. BigInteger.prototype.pow = bnPow;
  1730. BigInteger.prototype.gcd = bnGCD;
  1731. BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
  1732. BigInteger.prototype.square = bnSquare;
  1733.  
  1734. function Arcfour() {
  1735. this.i = 0;
  1736. this.j = 0;
  1737. this.S = new Array()
  1738. }
  1739.  
  1740. function ARC4init(d) {
  1741. var c, a, b;
  1742. for (c = 0; c < 256; ++c) {
  1743. this.S[c] = c
  1744. }
  1745. a = 0;
  1746. for (c = 0; c < 256; ++c) {
  1747. a = (a + this.S[c] + d[c % d.length]) & 255;
  1748. b = this.S[c];
  1749. this.S[c] = this.S[a];
  1750. this.S[a] = b
  1751. }
  1752. this.i = 0;
  1753. this.j = 0
  1754. }
  1755.  
  1756. function ARC4next() {
  1757. var a;
  1758. this.i = (this.i + 1) & 255;
  1759. this.j = (this.j + this.S[this.i]) & 255;
  1760. a = this.S[this.i];
  1761. this.S[this.i] = this.S[this.j];
  1762. this.S[this.j] = a;
  1763. return this.S[(a + this.S[this.i]) & 255]
  1764. }
  1765.  
  1766. Arcfour.prototype.init = ARC4init;
  1767. Arcfour.prototype.next = ARC4next;
  1768.  
  1769. function prng_newstate() {
  1770. return new Arcfour()
  1771. }
  1772.  
  1773. var rng_psize = 256;
  1774. var rng_state;
  1775. var rng_pool;
  1776. var rng_pptr;
  1777.  
  1778. function rng_seed_int(a) {
  1779. rng_pool[rng_pptr++] ^= a & 255;
  1780. rng_pool[rng_pptr++] ^= (a >> 8) & 255;
  1781. rng_pool[rng_pptr++] ^= (a >> 16) & 255;
  1782. rng_pool[rng_pptr++] ^= (a >> 24) & 255;
  1783. if (rng_pptr >= rng_psize) {
  1784. rng_pptr -= rng_psize
  1785. }
  1786. }
  1787.  
  1788. function rng_seed_time() {
  1789. rng_seed_int(new Date().getTime())
  1790. }
  1791.  
  1792. if (rng_pool == null) {
  1793. rng_pool = new Array();
  1794. rng_pptr = 0;
  1795. var t;
  1796. if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) {
  1797. var crypto = window.crypto || window.msCrypto;
  1798. if (crypto.getRandomValues) {
  1799. var ua = new Uint8Array(32);
  1800. crypto.getRandomValues(ua);
  1801. for (t = 0; t < 32; ++t) {
  1802. rng_pool[rng_pptr++] = ua[t]
  1803. }
  1804. } else {
  1805. if (navigator.appName == "Netscape" && navigator.appVersion < "5") {
  1806. var z = window.crypto.random(32);
  1807. for (t = 0; t < z.length; ++t) {
  1808. rng_pool[rng_pptr++] = z.charCodeAt(t) & 255
  1809. }
  1810. }
  1811. }
  1812. }
  1813. while (rng_pptr < rng_psize) {
  1814. t = Math.floor(65536 * Math.random());
  1815. rng_pool[rng_pptr++] = t >>> 8;
  1816. rng_pool[rng_pptr++] = t & 255
  1817. }
  1818. rng_pptr = 0;
  1819. rng_seed_time()
  1820. }
  1821.  
  1822. function rng_get_byte() {
  1823. if (rng_state == null) {
  1824. rng_seed_time();
  1825. rng_state = prng_newstate();
  1826. rng_state.init(rng_pool);
  1827. for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
  1828. rng_pool[rng_pptr] = 0
  1829. }
  1830. rng_pptr = 0
  1831. }
  1832. return rng_state.next()
  1833. }
  1834.  
  1835. function rng_get_bytes(b) {
  1836. var a;
  1837. for (a = 0; a < b.length; ++a) {
  1838. b[a] = rng_get_byte()
  1839. }
  1840. }
  1841.  
  1842. function SecureRandom() {
  1843. }
  1844.  
  1845. SecureRandom.prototype.nextBytes = rng_get_bytes;
  1846.  
  1847. function parseBigInt(b, a) {
  1848. return new BigInteger(b, a)
  1849. }
  1850.  
  1851. function linebrk(c, d) {
  1852. var a = "";
  1853. var b = 0;
  1854. while (b + d < c.length) {
  1855. a += c.substring(b, b + d) + "\n";
  1856. b += d
  1857. }
  1858. return a + c.substring(b, c.length)
  1859. }
  1860.  
  1861. function byte2Hex(a) {
  1862. if (a < 16) {
  1863. return "0" + a.toString(16)
  1864. } else {
  1865. return a.toString(16)
  1866. }
  1867. }
  1868.  
  1869. function pkcs1pad2(e, h) {
  1870. if (h < e.length + 11) {
  1871. throw "Message too long for RSA";
  1872. return null
  1873. }
  1874. var g = new Array();
  1875. var d = e.length - 1;
  1876. while (d >= 0 && h > 0) {
  1877. var f = e.charCodeAt(d--);
  1878. if (f < 128) {
  1879. g[--h] = f
  1880. } else {
  1881. if ((f > 127) && (f < 2048)) {
  1882. g[--h] = (f & 63) | 128;
  1883. g[--h] = (f >> 6) | 192
  1884. } else {
  1885. g[--h] = (f & 63) | 128;
  1886. g[--h] = ((f >> 6) & 63) | 128;
  1887. g[--h] = (f >> 12) | 224
  1888. }
  1889. }
  1890. }
  1891. g[--h] = 0;
  1892. var b = new SecureRandom();
  1893. var a = new Array();
  1894. while (h > 2) {
  1895. a[0] = 0;
  1896. while (a[0] == 0) {
  1897. b.nextBytes(a)
  1898. }
  1899. g[--h] = a[0]
  1900. }
  1901. g[--h] = 2;
  1902. g[--h] = 0;
  1903. return new BigInteger(g)
  1904. }
  1905.  
  1906. function oaep_mgf1_arr(c, a, e) {
  1907. var b = ""
  1908. , d = 0;
  1909. while (b.length < a) {
  1910. b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));
  1911. d += 1
  1912. }
  1913. return b
  1914. }
  1915.  
  1916. function oaep_pad(q, a, f, l) {
  1917. var c = KJUR.crypto.MessageDigest;
  1918. var o = KJUR.crypto.Util;
  1919. var b = null;
  1920. if (!f) {
  1921. f = "sha1"
  1922. }
  1923. if (typeof f === "string") {
  1924. b = c.getCanonicalAlgName(f);
  1925. l = c.getHashLength(b);
  1926. f = function (i) {
  1927. return hextorstr(o.hashHex(rstrtohex(i), b))
  1928. }
  1929. }
  1930. if (q.length + 2 * l + 2 > a) {
  1931. throw "Message too long for RSA"
  1932. }
  1933. var k = "", e;
  1934. for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {
  1935. k += "\x00"
  1936. }
  1937. var h = f("") + k + "\x01" + q;
  1938. var g = new Array(l);
  1939. new SecureRandom().nextBytes(g);
  1940. var j = oaep_mgf1_arr(g, h.length, f);
  1941. var p = [];
  1942. for (e = 0; e < h.length; e += 1) {
  1943. p[e] = h.charCodeAt(e) ^ j.charCodeAt(e)
  1944. }
  1945. var m = oaep_mgf1_arr(p, g.length, f);
  1946. var d = [0];
  1947. for (e = 0; e < g.length; e += 1) {
  1948. d[e + 1] = g[e] ^ m.charCodeAt(e)
  1949. }
  1950. return new BigInteger(d.concat(p))
  1951. }
  1952.  
  1953. function RSAKey() {
  1954. this.n = null;
  1955. this.e = 0;
  1956. this.d = null;
  1957. this.p = null;
  1958. this.q = null;
  1959. this.dmp1 = null;
  1960. this.dmq1 = null;
  1961. this.coeff = null
  1962. }
  1963.  
  1964. function RSASetPublic(b, a) {
  1965. this.isPublic = true;
  1966. this.isPrivate = false;
  1967. if (typeof b !== "string") {
  1968. this.n = b;
  1969. this.e = a
  1970. } else {
  1971. if (b != null && a != null && b.length > 0 && a.length > 0) {
  1972. this.n = parseBigInt(b, 16);
  1973. this.e = parseInt(a, 16)
  1974. } else {
  1975. throw "Invalid RSA public key"
  1976. }
  1977. }
  1978. }
  1979.  
  1980. function RSADoPublic(a) {
  1981. return a.modPowInt(this.e, this.n)
  1982. }
  1983.  
  1984. function RSAEncrypt(d) {
  1985. var a = pkcs1pad2(d, (this.n.bitLength() + 7) >> 3);
  1986. if (a == null) {
  1987. return null
  1988. }
  1989. var e = this.doPublic(a);
  1990. if (e == null) {
  1991. return null
  1992. }
  1993. var b = e.toString(16);
  1994. if ((b.length & 1) == 0) {
  1995. return b
  1996. } else {
  1997. return "0" + b
  1998. }
  1999. }
  2000.  
  2001. function RSAEncryptOAEP(f, e, b) {
  2002. var a = oaep_pad(f, (this.n.bitLength() + 7) >> 3, e, b);
  2003. if (a == null) {
  2004. return null
  2005. }
  2006. var g = this.doPublic(a);
  2007. if (g == null) {
  2008. return null
  2009. }
  2010. var d = g.toString(16);
  2011. if ((d.length & 1) == 0) {
  2012. return d
  2013. } else {
  2014. return "0" + d
  2015. }
  2016. }
  2017.  
  2018. RSAKey.prototype.doPublic = RSADoPublic;
  2019. RSAKey.prototype.setPublic = RSASetPublic;
  2020. RSAKey.prototype.encrypt = RSAEncrypt;
  2021. RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
  2022. RSAKey.prototype.type = "RSA";
  2023.  
  2024. function pkcs1unpad2(g, j) {
  2025. var a = g.toByteArray();
  2026. var f = 0;
  2027. while (f < a.length && a[f] == 0) {
  2028. ++f
  2029. }
  2030. if (a.length - f != j - 1 || a[f] != 2) {
  2031. return null
  2032. }
  2033. ++f;
  2034. while (a[f] != 0) {
  2035. if (++f >= a.length) {
  2036. return null
  2037. }
  2038. }
  2039. var e = "";
  2040. while (++f < a.length) {
  2041. var h = a[f] & 255;
  2042. if (h < 128) {
  2043. e += String.fromCharCode(h)
  2044. } else {
  2045. if ((h > 191) && (h < 224)) {
  2046. e += String.fromCharCode(((h & 31) << 6) | (a[f + 1] & 63));
  2047. ++f
  2048. } else {
  2049. e += String.fromCharCode(((h & 15) << 12) | ((a[f + 1] & 63) << 6) | (a[f + 2] & 63));
  2050. f += 2
  2051. }
  2052. }
  2053. }
  2054. return e
  2055. }
  2056.  
  2057. function oaep_mgf1_str(c, a, e) {
  2058. var b = ""
  2059. , d = 0;
  2060. while (b.length < a) {
  2061. b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));
  2062. d += 1
  2063. }
  2064. return b
  2065. }
  2066.  
  2067. function oaep_unpad(o, b, g, p) {
  2068. var e = KJUR.crypto.MessageDigest;
  2069. var r = KJUR.crypto.Util;
  2070. var c = null;
  2071. if (!g) {
  2072. g = "sha1"
  2073. }
  2074. if (typeof g === "string") {
  2075. c = e.getCanonicalAlgName(g);
  2076. p = e.getHashLength(c);
  2077. g = function (d) {
  2078. return hextorstr(r.hashHex(rstrtohex(d), c))
  2079. }
  2080. }
  2081. o = o.toByteArray();
  2082. var h;
  2083. for (h = 0; h < o.length; h += 1) {
  2084. o[h] &= 255
  2085. }
  2086. while (o.length < b) {
  2087. o.unshift(0)
  2088. }
  2089. o = String.fromCharCode.apply(String, o);
  2090. if (o.length < 2 * p + 2) {
  2091. throw "Cipher too short"
  2092. }
  2093. var f = o.substr(1, p);
  2094. var s = o.substr(p + 1);
  2095. var q = oaep_mgf1_str(s, p, g);
  2096. var k = [], h;
  2097. for (h = 0; h < f.length; h += 1) {
  2098. k[h] = f.charCodeAt(h) ^ q.charCodeAt(h)
  2099. }
  2100. var l = oaep_mgf1_str(String.fromCharCode.apply(String, k), o.length - p, g);
  2101. var j = [];
  2102. for (h = 0; h < s.length; h += 1) {
  2103. j[h] = s.charCodeAt(h) ^ l.charCodeAt(h)
  2104. }
  2105. j = String.fromCharCode.apply(String, j);
  2106. if (j.substr(0, p) !== g("")) {
  2107. throw "Hash mismatch"
  2108. }
  2109. j = j.substr(p);
  2110. var a = j.indexOf("\x01");
  2111. var m = (a != -1) ? j.substr(0, a).lastIndexOf("\x00") : -1;
  2112. if (m + 1 != a) {
  2113. throw "Malformed data"
  2114. }
  2115. return j.substr(a + 1)
  2116. }
  2117.  
  2118. function RSASetPrivate(c, a, b) {
  2119. this.isPrivate = true;
  2120. if (typeof c !== "string") {
  2121. this.n = c;
  2122. this.e = a;
  2123. this.d = b
  2124. } else {
  2125. if (c != null && a != null && c.length > 0 && a.length > 0) {
  2126. this.n = parseBigInt(c, 16);
  2127. this.e = parseInt(a, 16);
  2128. this.d = parseBigInt(b, 16)
  2129. } else {
  2130. throw "Invalid RSA private key"
  2131. }
  2132. }
  2133. }
  2134.  
  2135. function RSASetPrivateEx(g, d, e, c, b, a, h, f) {
  2136. this.isPrivate = true;
  2137. this.isPublic = false;
  2138. if (g == null) {
  2139. throw "RSASetPrivateEx N == null"
  2140. }
  2141. if (d == null) {
  2142. throw "RSASetPrivateEx E == null"
  2143. }
  2144. if (g.length == 0) {
  2145. throw "RSASetPrivateEx N.length == 0"
  2146. }
  2147. if (d.length == 0) {
  2148. throw "RSASetPrivateEx E.length == 0"
  2149. }
  2150. if (g != null && d != null && g.length > 0 && d.length > 0) {
  2151. this.n = parseBigInt(g, 16);
  2152. this.e = parseInt(d, 16);
  2153. this.d = parseBigInt(e, 16);
  2154. this.p = parseBigInt(c, 16);
  2155. this.q = parseBigInt(b, 16);
  2156. this.dmp1 = parseBigInt(a, 16);
  2157. this.dmq1 = parseBigInt(h, 16);
  2158. this.coeff = parseBigInt(f, 16)
  2159. } else {
  2160. throw "Invalid RSA private key in RSASetPrivateEx"
  2161. }
  2162. }
  2163.  
  2164. function RSAGenerate(b, i) {
  2165. var a = new SecureRandom();
  2166. var f = b >> 1;
  2167. this.e = parseInt(i, 16);
  2168. var c = new BigInteger(i, 16);
  2169. for (; ;) {
  2170. for (; ;) {
  2171. this.p = new BigInteger(b - f, 1, a);
  2172. if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
  2173. break
  2174. }
  2175. }
  2176. for (; ;) {
  2177. this.q = new BigInteger(f, 1, a);
  2178. if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
  2179. break
  2180. }
  2181. }
  2182. if (this.p.compareTo(this.q) <= 0) {
  2183. var h = this.p;
  2184. this.p = this.q;
  2185. this.q = h
  2186. }
  2187. var g = this.p.subtract(BigInteger.ONE);
  2188. var d = this.q.subtract(BigInteger.ONE);
  2189. var e = g.multiply(d);
  2190. if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {
  2191. this.n = this.p.multiply(this.q);
  2192. this.d = c.modInverse(e);
  2193. this.dmp1 = this.d.mod(g);
  2194. this.dmq1 = this.d.mod(d);
  2195. this.coeff = this.q.modInverse(this.p);
  2196. break
  2197. }
  2198. }
  2199. this.isPrivate = true
  2200. }
  2201.  
  2202. function RSADoPrivate(a) {
  2203. if (this.p == null || this.q == null) {
  2204. return a.modPow(this.d, this.n)
  2205. }
  2206. var c = a.mod(this.p).modPow(this.dmp1, this.p);
  2207. var b = a.mod(this.q).modPow(this.dmq1, this.q);
  2208. while (c.compareTo(b) < 0) {
  2209. c = c.add(this.p)
  2210. }
  2211. return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)
  2212. }
  2213.  
  2214. function RSADecrypt(b) {
  2215. var d = parseBigInt(b, 16);
  2216. var a = this.doPrivate(d);
  2217. if (a == null) {
  2218. return null
  2219. }
  2220. return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
  2221. }
  2222.  
  2223. function RSADecryptOAEP(e, d, b) {
  2224. var f = parseBigInt(e, 16);
  2225. var a = this.doPrivate(f);
  2226. if (a == null) {
  2227. return null
  2228. }
  2229. return oaep_unpad(a, (this.n.bitLength() + 7) >> 3, d, b)
  2230. }
  2231.  
  2232. RSAKey.prototype.doPrivate = RSADoPrivate;
  2233. RSAKey.prototype.setPrivate = RSASetPrivate;
  2234. RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
  2235. RSAKey.prototype.generate = RSAGenerate;
  2236. RSAKey.prototype.decrypt = RSADecrypt;
  2237. RSAKey.prototype.decryptOAEP = RSADecryptOAEP;
  2238. var ASN1HEX = new function () {
  2239. }
  2240. ;
  2241. ASN1HEX.getLblen = function (c, a) {
  2242. if (c.substr(a + 2, 1) != "8") {
  2243. return 1
  2244. }
  2245. var b = parseInt(c.substr(a + 3, 1));
  2246. if (b == 0) {
  2247. return -1
  2248. }
  2249. if (0 < b && b < 10) {
  2250. return b + 1
  2251. }
  2252. return -2
  2253. }
  2254. ;
  2255. ASN1HEX.getL = function (c, b) {
  2256. var a = ASN1HEX.getLblen(c, b);
  2257. if (a < 1) {
  2258. return ""
  2259. }
  2260. return c.substr(b + 2, a * 2)
  2261. }
  2262. ;
  2263. ASN1HEX.getVblen = function (d, a) {
  2264. var c, b;
  2265. c = ASN1HEX.getL(d, a);
  2266. if (c == "") {
  2267. return -1
  2268. }
  2269. if (c.substr(0, 1) === "8") {
  2270. b = new BigInteger(c.substr(2), 16)
  2271. } else {
  2272. b = new BigInteger(c, 16)
  2273. }
  2274. return b.intValue()
  2275. }
  2276. ;
  2277. ASN1HEX.getVidx = function (c, b) {
  2278. var a = ASN1HEX.getLblen(c, b);
  2279. if (a < 0) {
  2280. return a
  2281. }
  2282. return b + (a + 1) * 2
  2283. }
  2284. ;
  2285. ASN1HEX.getV = function (d, a) {
  2286. var c = ASN1HEX.getVidx(d, a);
  2287. var b = ASN1HEX.getVblen(d, a);
  2288. return d.substr(c, b * 2)
  2289. }
  2290. ;
  2291. ASN1HEX.getTLV = function (b, a) {
  2292. return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a)
  2293. }
  2294. ;
  2295. ASN1HEX.getNextSiblingIdx = function (d, a) {
  2296. var c = ASN1HEX.getVidx(d, a);
  2297. var b = ASN1HEX.getVblen(d, a);
  2298. return c + b * 2
  2299. }
  2300. ;
  2301. ASN1HEX.getChildIdx = function (e, f) {
  2302. var j = ASN1HEX;
  2303. var g = new Array();
  2304. var i = j.getVidx(e, f);
  2305. if (e.substr(f, 2) == "03") {
  2306. g.push(i + 2)
  2307. } else {
  2308. g.push(i)
  2309. }
  2310. var l = j.getVblen(e, f);
  2311. var c = i;
  2312. var d = 0;
  2313. while (1) {
  2314. var b = j.getNextSiblingIdx(e, c);
  2315. if (b == null || (b - i >= (l * 2))) {
  2316. break
  2317. }
  2318. if (d >= 200) {
  2319. break
  2320. }
  2321. g.push(b);
  2322. c = b;
  2323. d++
  2324. }
  2325. return g
  2326. }
  2327. ;
  2328. ASN1HEX.getNthChildIdx = function (d, b, e) {
  2329. var c = ASN1HEX.getChildIdx(d, b);
  2330. return c[e]
  2331. }
  2332. ;
  2333. ASN1HEX.getIdxbyList = function (e, d, c, i) {
  2334. var g = ASN1HEX;
  2335. var f, b;
  2336. if (c.length == 0) {
  2337. if (i !== undefined) {
  2338. if (e.substr(d, 2) !== i) {
  2339. throw "checking tag doesn't match: " + e.substr(d, 2) + "!=" + i
  2340. }
  2341. }
  2342. return d
  2343. }
  2344. f = c.shift();
  2345. b = g.getChildIdx(e, d);
  2346. return g.getIdxbyList(e, b[f], c, i)
  2347. }
  2348. ;
  2349. ASN1HEX.getTLVbyList = function (d, c, b, f) {
  2350. var e = ASN1HEX;
  2351. var a = e.getIdxbyList(d, c, b);
  2352. if (a === undefined) {
  2353. throw "can't find nthList object"
  2354. }
  2355. if (f !== undefined) {
  2356. if (d.substr(a, 2) != f) {
  2357. throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + f
  2358. }
  2359. }
  2360. return e.getTLV(d, a)
  2361. }
  2362. ;
  2363. ASN1HEX.getVbyList = function (e, c, b, g, i) {
  2364. var f = ASN1HEX;
  2365. var a, d;
  2366. a = f.getIdxbyList(e, c, b, g);
  2367. if (a === undefined) {
  2368. throw "can't find nthList object"
  2369. }
  2370. d = f.getV(e, a);
  2371. if (i === true) {
  2372. d = d.substr(2)
  2373. }
  2374. return d
  2375. }
  2376. ;
  2377. ASN1HEX.hextooidstr = function (e) {
  2378. var h = function (b, a) {
  2379. if (b.length >= a) {
  2380. return b
  2381. }
  2382. return new Array(a - b.length + 1).join("0") + b
  2383. };
  2384. var l = [];
  2385. var o = e.substr(0, 2);
  2386. var f = parseInt(o, 16);
  2387. l[0] = new String(Math.floor(f / 40));
  2388. l[1] = new String(f % 40);
  2389. var m = e.substr(2);
  2390. var k = [];
  2391. for (var g = 0; g < m.length / 2; g++) {
  2392. k.push(parseInt(m.substr(g * 2, 2), 16))
  2393. }
  2394. var j = [];
  2395. var d = "";
  2396. for (var g = 0; g < k.length; g++) {
  2397. if (k[g] & 128) {
  2398. d = d + h((k[g] & 127).toString(2), 7)
  2399. } else {
  2400. d = d + h((k[g] & 127).toString(2), 7);
  2401. j.push(new String(parseInt(d, 2)));
  2402. d = ""
  2403. }
  2404. }
  2405. var n = l.join(".");
  2406. if (j.length > 0) {
  2407. n = n + "." + j.join(".")
  2408. }
  2409. return n
  2410. }
  2411. ;
  2412. ASN1HEX.dump = function (t, c, l, g) {
  2413. var p = ASN1HEX;
  2414. var j = p.getV;
  2415. var y = p.dump;
  2416. var w = p.getChildIdx;
  2417. var e = t;
  2418. if (t instanceof KJUR.asn1.ASN1Object) {
  2419. e = t.getEncodedHex()
  2420. }
  2421. var q = function (A, i) {
  2422. if (A.length <= i * 2) {
  2423. return A
  2424. } else {
  2425. var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);
  2426. return v
  2427. }
  2428. };
  2429. if (c === undefined) {
  2430. c = {
  2431. ommit_long_octet: 32
  2432. }
  2433. }
  2434. if (l === undefined) {
  2435. l = 0
  2436. }
  2437. if (g === undefined) {
  2438. g = ""
  2439. }
  2440. var x = c.ommit_long_octet;
  2441. if (e.substr(l, 2) == "01") {
  2442. var h = j(e, l);
  2443. if (h == "00") {
  2444. return g + "BOOLEAN FALSE\n"
  2445. } else {
  2446. return g + "BOOLEAN TRUE\n"
  2447. }
  2448. }
  2449. if (e.substr(l, 2) == "02") {
  2450. var h = j(e, l);
  2451. return g + "INTEGER " + q(h, x) + "\n"
  2452. }
  2453. if (e.substr(l, 2) == "03") {
  2454. var h = j(e, l);
  2455. return g + "BITSTRING " + q(h, x) + "\n"
  2456. }
  2457. if (e.substr(l, 2) == "04") {
  2458. var h = j(e, l);
  2459. if (p.isASN1HEX(h)) {
  2460. var k = g + "OCTETSTRING, encapsulates\n";
  2461. k = k + y(h, c, 0, g + " ");
  2462. return k
  2463. } else {
  2464. return g + "OCTETSTRING " + q(h, x) + "\n"
  2465. }
  2466. }
  2467. if (e.substr(l, 2) == "05") {
  2468. return g + "NULL\n"
  2469. }
  2470. if (e.substr(l, 2) == "06") {
  2471. var m = j(e, l);
  2472. var a = KJUR.asn1.ASN1Util.oidHexToInt(m);
  2473. var o = KJUR.asn1.x509.OID.oid2name(a);
  2474. var b = a.replace(/\./g, " ");
  2475. if (o != "") {
  2476. return g + "ObjectIdentifier " + o + " (" + b + ")\n"
  2477. } else {
  2478. return g + "ObjectIdentifier (" + b + ")\n"
  2479. }
  2480. }
  2481. if (e.substr(l, 2) == "0c") {
  2482. return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n"
  2483. }
  2484. if (e.substr(l, 2) == "13") {
  2485. return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n"
  2486. }
  2487. if (e.substr(l, 2) == "14") {
  2488. return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n"
  2489. }
  2490. if (e.substr(l, 2) == "16") {
  2491. return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n"
  2492. }
  2493. if (e.substr(l, 2) == "17") {
  2494. return g + "UTCTime " + hextoutf8(j(e, l)) + "\n"
  2495. }
  2496. if (e.substr(l, 2) == "18") {
  2497. return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n"
  2498. }
  2499. if (e.substr(l, 2) == "30") {
  2500. if (e.substr(l, 4) == "3000") {
  2501. return g + "SEQUENCE {}\n"
  2502. }
  2503. var k = g + "SEQUENCE\n";
  2504. var d = w(e, l);
  2505. var f = c;
  2506. if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {
  2507. var o = p.oidname(j(e, d[0]));
  2508. var r = JSON.parse(JSON.stringify(c));
  2509. r.x509ExtName = o;
  2510. f = r
  2511. }
  2512. for (var u = 0; u < d.length; u++) {
  2513. k = k + y(e, f, d[u], g + " ")
  2514. }
  2515. return k
  2516. }
  2517. if (e.substr(l, 2) == "31") {
  2518. var k = g + "SET\n";
  2519. var d = w(e, l);
  2520. for (var u = 0; u < d.length; u++) {
  2521. k = k + y(e, c, d[u], g + " ")
  2522. }
  2523. return k
  2524. }
  2525. var z = parseInt(e.substr(l, 2), 16);
  2526. if ((z & 128) != 0) {
  2527. var n = z & 31;
  2528. if ((z & 32) != 0) {
  2529. var k = g + "[" + n + "]\n";
  2530. var d = w(e, l);
  2531. for (var u = 0; u < d.length; u++) {
  2532. k = k + y(e, c, d[u], g + " ")
  2533. }
  2534. return k
  2535. } else {
  2536. var h = j(e, l);
  2537. if (h.substr(0, 8) == "68747470") {
  2538. h = hextoutf8(h)
  2539. }
  2540. if (c.x509ExtName === "subjectAltName" && n == 2) {
  2541. h = hextoutf8(h)
  2542. }
  2543. var k = g + "[" + n + "] " + h + "\n";
  2544. return k
  2545. }
  2546. }
  2547. return g + "UNKNOWN(" + e.substr(l, 2) + ") " + j(e, l) + "\n"
  2548. }
  2549. ;
  2550. ASN1HEX.isASN1HEX = function (e) {
  2551. var d = ASN1HEX;
  2552. if (e.length % 2 == 1) {
  2553. return false
  2554. }
  2555. var c = d.getVblen(e, 0);
  2556. var b = e.substr(0, 2);
  2557. var f = d.getL(e, 0);
  2558. var a = e.length - b.length - f.length;
  2559. if (a == c * 2) {
  2560. return true
  2561. }
  2562. return false
  2563. }
  2564. ;
  2565. ASN1HEX.oidname = function (a) {
  2566. var c = KJUR.asn1;
  2567. if (KJUR.lang.String.isHex(a)) {
  2568. a = c.ASN1Util.oidHexToInt(a)
  2569. }
  2570. var b = c.x509.OID.oid2name(a);
  2571. if (b === "") {
  2572. b = a
  2573. }
  2574. return b
  2575. }
  2576. ;
  2577. var KJUR;
  2578. if (typeof KJUR == "undefined" || !KJUR) {
  2579. KJUR = {}
  2580. }
  2581. if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
  2582. KJUR.lang = {}
  2583. }
  2584. KJUR.lang.String = function () {
  2585. }
  2586. ;
  2587.  
  2588. function Base64x() {
  2589. }
  2590.  
  2591. function stoBA(d) {
  2592. var b = new Array();
  2593. for (var c = 0; c < d.length; c++) {
  2594. b[c] = d.charCodeAt(c)
  2595. }
  2596. return b
  2597. }
  2598.  
  2599. function BAtos(b) {
  2600. var d = "";
  2601. for (var c = 0; c < b.length; c++) {
  2602. d = d + String.fromCharCode(b[c])
  2603. }
  2604. return d
  2605. }
  2606.  
  2607. function BAtohex(b) {
  2608. var e = "";
  2609. for (var d = 0; d < b.length; d++) {
  2610. var c = b[d].toString(16);
  2611. if (c.length == 1) {
  2612. c = "0" + c
  2613. }
  2614. e = e + c
  2615. }
  2616. return e
  2617. }
  2618.  
  2619. function stohex(a) {
  2620. return BAtohex(stoBA(a))
  2621. }
  2622.  
  2623. function stob64(a) {
  2624. return hex2b64(stohex(a))
  2625. }
  2626.  
  2627. function stob64u(a) {
  2628. return b64tob64u(hex2b64(stohex(a)))
  2629. }
  2630.  
  2631. function b64utos(a) {
  2632. return BAtos(b64toBA(b64utob64(a)))
  2633. }
  2634.  
  2635. function b64tob64u(a) {
  2636. a = a.replace(/\=/g, "");
  2637. a = a.replace(/\+/g, "-");
  2638. a = a.replace(/\//g, "_");
  2639. return a
  2640. }
  2641.  
  2642. function b64utob64(a) {
  2643. if (a.length % 4 == 2) {
  2644. a = a + "=="
  2645. } else {
  2646. if (a.length % 4 == 3) {
  2647. a = a + "="
  2648. }
  2649. }
  2650. a = a.replace(/-/g, "+");
  2651. a = a.replace(/_/g, "/");
  2652. return a
  2653. }
  2654.  
  2655. function hextob64u(a) {
  2656. if (a.length % 2 == 1) {
  2657. a = "0" + a
  2658. }
  2659. return b64tob64u(hex2b64(a))
  2660. }
  2661.  
  2662. function b64utohex(a) {
  2663. return b64tohex(b64utob64(a))
  2664. }
  2665.  
  2666. var utf8tob64u, b64utoutf8;
  2667. if (typeof Buffer === "function") {
  2668. utf8tob64u = function (a) {
  2669. return b64tob64u(new Buffer(a, "utf8").toString("base64"))
  2670. }
  2671. ;
  2672. b64utoutf8 = function (a) {
  2673. return new Buffer(b64utob64(a), "base64").toString("utf8")
  2674. }
  2675. } else {
  2676. utf8tob64u = function (a) {
  2677. return hextob64u(uricmptohex(encodeURIComponentAll(a)))
  2678. }
  2679. ;
  2680. b64utoutf8 = function (a) {
  2681. return decodeURIComponent(hextouricmp(b64utohex(a)))
  2682. }
  2683. }
  2684.  
  2685. function utf8tob64(a) {
  2686. return hex2b64(uricmptohex(encodeURIComponentAll(a)))
  2687. }
  2688.  
  2689. function b64toutf8(a) {
  2690. return decodeURIComponent(hextouricmp(b64tohex(a)))
  2691. }
  2692.  
  2693. function utf8tohex(a) {
  2694. return uricmptohex(encodeURIComponentAll(a))
  2695. }
  2696.  
  2697. function hextoutf8(a) {
  2698. return decodeURIComponent(hextouricmp(a))
  2699. }
  2700.  
  2701. function hextorstr(c) {
  2702. var b = "";
  2703. for (var a = 0; a < c.length - 1; a += 2) {
  2704. b += String.fromCharCode(parseInt(c.substr(a, 2), 16))
  2705. }
  2706. return b
  2707. }
  2708.  
  2709. function rstrtohex(c) {
  2710. var a = "";
  2711. for (var b = 0; b < c.length; b++) {
  2712. a += ("0" + c.charCodeAt(b).toString(16)).slice(-2)
  2713. }
  2714. return a
  2715. }
  2716.  
  2717. function hextob64(a) {
  2718. return hex2b64(a)
  2719. }
  2720.  
  2721. function hextob64nl(b) {
  2722. var a = hextob64(b);
  2723. var c = a.replace(/(.{64})/g, "$1\r\n");
  2724. c = c.replace(/\r\n$/, "");
  2725. return c
  2726. }
  2727.  
  2728. function b64nltohex(b) {
  2729. var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");
  2730. var c = b64tohex(a);
  2731. return c
  2732. }
  2733.  
  2734. function hextopem(a, b) {
  2735. var c = hextob64nl(a);
  2736. return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n"
  2737. }
  2738.  
  2739. function pemtohex(a, b) {
  2740. if (a.indexOf("-----BEGIN ") == -1) {
  2741. throw "can't find PEM header: " + b
  2742. }
  2743. if (b !== undefined) {
  2744. a = a.replace("-----BEGIN " + b + "-----", "");
  2745. a = a.replace("-----END " + b + "-----", "")
  2746. } else {
  2747. a = a.replace(/-----BEGIN [^-]+-----/, "");
  2748. a = a.replace(/-----END [^-]+-----/, "")
  2749. }
  2750. return b64nltohex(a)
  2751. }
  2752.  
  2753. function hextoArrayBuffer(d) {
  2754. if (d.length % 2 != 0) {
  2755. throw "input is not even length"
  2756. }
  2757. if (d.match(/^[0-9A-Fa-f]+$/) == null) {
  2758. throw "input is not hexadecimal"
  2759. }
  2760. var b = new ArrayBuffer(d.length / 2);
  2761. var a = new DataView(b);
  2762. for (var c = 0; c < d.length / 2; c++) {
  2763. a.setUint8(c, parseInt(d.substr(c * 2, 2), 16))
  2764. }
  2765. return b
  2766. }
  2767.  
  2768. function ArrayBuffertohex(b) {
  2769. var d = "";
  2770. var a = new DataView(b);
  2771. for (var c = 0; c < b.byteLength; c++) {
  2772. d += ("00" + a.getUint8(c).toString(16)).slice(-2)
  2773. }
  2774. return d
  2775. }
  2776.  
  2777. function zulutomsec(n) {
  2778. var l, j, m, e, f, i, b, k;
  2779. var a, h, g, c;
  2780. c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);
  2781. if (c) {
  2782. a = c[1];
  2783. l = parseInt(a);
  2784. if (a.length === 2) {
  2785. if (50 <= l && l < 100) {
  2786. l = 1900 + l
  2787. } else {
  2788. if (0 <= l && l < 50) {
  2789. l = 2000 + l
  2790. }
  2791. }
  2792. }
  2793. j = parseInt(c[2]) - 1;
  2794. m = parseInt(c[3]);
  2795. e = parseInt(c[4]);
  2796. f = parseInt(c[5]);
  2797. i = parseInt(c[6]);
  2798. b = 0;
  2799. h = c[7];
  2800. if (h !== "") {
  2801. g = (h.substr(1) + "00").substr(0, 3);
  2802. b = parseInt(g)
  2803. }
  2804. return Date.UTC(l, j, m, e, f, i, b)
  2805. }
  2806. throw "unsupported zulu format: " + n
  2807. }
  2808.  
  2809. function zulutosec(a) {
  2810. var b = zulutomsec(a);
  2811. return ~~(b / 1000)
  2812. }
  2813.  
  2814. function zulutodate(a) {
  2815. return new Date(zulutomsec(a))
  2816. }
  2817.  
  2818. function datetozulu(g, e, f) {
  2819. var b;
  2820. var a = g.getUTCFullYear();
  2821. if (e) {
  2822. if (a < 1950 || 2049 < a) {
  2823. throw "not proper year for UTCTime: " + a
  2824. }
  2825. b = ("" + a).slice(-2)
  2826. } else {
  2827. b = ("000" + a).slice(-4)
  2828. }
  2829. b += ("0" + (g.getUTCMonth() + 1)).slice(-2);
  2830. b += ("0" + g.getUTCDate()).slice(-2);
  2831. b += ("0" + g.getUTCHours()).slice(-2);
  2832. b += ("0" + g.getUTCMinutes()).slice(-2);
  2833. b += ("0" + g.getUTCSeconds()).slice(-2);
  2834. if (f) {
  2835. var c = g.getUTCMilliseconds();
  2836. if (c !== 0) {
  2837. c = ("00" + c).slice(-3);
  2838. c = c.replace(/0+$/g, "");
  2839. b += "." + c
  2840. }
  2841. }
  2842. b += "Z";
  2843. return b
  2844. }
  2845.  
  2846. function uricmptohex(a) {
  2847. return a.replace(/%/g, "")
  2848. }
  2849.  
  2850. function hextouricmp(a) {
  2851. return a.replace(/(..)/g, "%$1")
  2852. }
  2853.  
  2854. function ipv6tohex(g) {
  2855. var b = "malformed IPv6 address";
  2856. if (!g.match(/^[0-9A-Fa-f:]+$/)) {
  2857. throw b
  2858. }
  2859. g = g.toLowerCase();
  2860. var d = g.split(":").length - 1;
  2861. if (d < 2) {
  2862. throw b
  2863. }
  2864. var e = ":".repeat(7 - d + 2);
  2865. g = g.replace("::", e);
  2866. var c = g.split(":");
  2867. if (c.length != 8) {
  2868. throw b
  2869. }
  2870. for (var f = 0; f < 8; f++) {
  2871. c[f] = ("0000" + c[f]).slice(-4)
  2872. }
  2873. return c.join("")
  2874. }
  2875.  
  2876. function hextoipv6(e) {
  2877. if (!e.match(/^[0-9A-Fa-f]{32}$/)) {
  2878. throw "malformed IPv6 address octet"
  2879. }
  2880. e = e.toLowerCase();
  2881. var b = e.match(/.{1,4}/g);
  2882. for (var d = 0; d < 8; d++) {
  2883. b[d] = b[d].replace(/^0+/, "");
  2884. if (b[d] == "") {
  2885. b[d] = "0"
  2886. }
  2887. }
  2888. e = ":" + b.join(":") + ":";
  2889. var c = e.match(/:(0:){2,}/g);
  2890. if (c === null) {
  2891. return e.slice(1, -1)
  2892. }
  2893. var f = "";
  2894. for (var d = 0; d < c.length; d++) {
  2895. if (c[d].length > f.length) {
  2896. f = c[d]
  2897. }
  2898. }
  2899. e = e.replace(f, "::");
  2900. return e.slice(1, -1)
  2901. }
  2902.  
  2903. function hextoip(b) {
  2904. var d = "malformed hex value";
  2905. if (!b.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) {
  2906. throw d
  2907. }
  2908. if (b.length == 8) {
  2909. var c;
  2910. try {
  2911. c = parseInt(b.substr(0, 2), 16) + "." + parseInt(b.substr(2, 2), 16) + "." + parseInt(b.substr(4, 2), 16) + "." + parseInt(b.substr(6, 2), 16);
  2912. return c
  2913. } catch (a) {
  2914. throw d
  2915. }
  2916. } else {
  2917. if (b.length == 32) {
  2918. return hextoipv6(b)
  2919. } else {
  2920. return b
  2921. }
  2922. }
  2923. }
  2924.  
  2925. function iptohex(f) {
  2926. var j = "malformed IP address";
  2927. f = f.toLowerCase(f);
  2928. if (f.match(/^[0-9.]+$/)) {
  2929. var b = f.split(".");
  2930. if (b.length !== 4) {
  2931. throw j
  2932. }
  2933. var g = "";
  2934. try {
  2935. for (var e = 0; e < 4; e++) {
  2936. var h = parseInt(b[e]);
  2937. g += ("0" + h.toString(16)).slice(-2)
  2938. }
  2939. return g
  2940. } catch (c) {
  2941. throw j
  2942. }
  2943. } else {
  2944. if (f.match(/^[0-9a-f:]+$/) && f.indexOf(":") !== -1) {
  2945. return ipv6tohex(f)
  2946. } else {
  2947. throw j
  2948. }
  2949. }
  2950. }
  2951.  
  2952. function encodeURIComponentAll(a) {
  2953. var d = encodeURIComponent(a);
  2954. var b = "";
  2955. for (var c = 0; c < d.length; c++) {
  2956. if (d[c] == "%") {
  2957. b = b + d.substr(c, 3);
  2958. c = c + 2
  2959. } else {
  2960. b = b + "%" + stohex(d[c])
  2961. }
  2962. }
  2963. return b
  2964. }
  2965.  
  2966. function newline_toUnix(a) {
  2967. a = a.replace(/\r\n/mg, "\n");
  2968. return a
  2969. }
  2970.  
  2971. function newline_toDos(a) {
  2972. a = a.replace(/\r\n/mg, "\n");
  2973. a = a.replace(/\n/mg, "\r\n");
  2974. return a
  2975. }
  2976.  
  2977. KJUR.lang.String.isInteger = function (a) {
  2978. if (a.match(/^[0-9]+$/)) {
  2979. return true
  2980. } else {
  2981. if (a.match(/^-[0-9]+$/)) {
  2982. return true
  2983. } else {
  2984. return false
  2985. }
  2986. }
  2987. }
  2988. ;
  2989. KJUR.lang.String.isHex = function (a) {
  2990. if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {
  2991. return true
  2992. } else {
  2993. return false
  2994. }
  2995. }
  2996. ;
  2997. KJUR.lang.String.isBase64 = function (a) {
  2998. a = a.replace(/\s+/g, "");
  2999. if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {
  3000. return true
  3001. } else {
  3002. return false
  3003. }
  3004. }
  3005. ;
  3006. KJUR.lang.String.isBase64URL = function (a) {
  3007. if (a.match(/[+/=]/)) {
  3008. return false
  3009. }
  3010. a = b64utob64(a);
  3011. return KJUR.lang.String.isBase64(a)
  3012. }
  3013. ;
  3014. KJUR.lang.String.isIntegerArray = function (a) {
  3015. a = a.replace(/\s+/g, "");
  3016. if (a.match(/^\[[0-9,]+\]$/)) {
  3017. return true
  3018. } else {
  3019. return false
  3020. }
  3021. }
  3022. ;
  3023.  
  3024. function hextoposhex(a) {
  3025. if (a.length % 2 == 1) {
  3026. return "0" + a
  3027. }
  3028. if (a.substr(0, 1) > "7") {
  3029. return "00" + a
  3030. }
  3031. return a
  3032. }
  3033.  
  3034. function intarystrtohex(b) {
  3035. b = b.replace(/^\s*\[\s*/, "");
  3036. b = b.replace(/\s*\]\s*$/, "");
  3037. b = b.replace(/\s*/g, "");
  3038. try {
  3039. var c = b.split(/,/).map(function (g, e, h) {
  3040. var f = parseInt(g);
  3041. if (f < 0 || 255 < f) {
  3042. throw "integer not in range 0-255"
  3043. }
  3044. var d = ("00" + f.toString(16)).slice(-2);
  3045. return d
  3046. }).join("");
  3047. return c
  3048. } catch (a) {
  3049. throw "malformed integer array string: " + a
  3050. }
  3051. }
  3052.  
  3053. var strdiffidx = function (c, a) {
  3054. var d = c.length;
  3055. if (c.length > a.length) {
  3056. d = a.length
  3057. }
  3058. for (var b = 0; b < d; b++) {
  3059. if (c.charCodeAt(b) != a.charCodeAt(b)) {
  3060. return b
  3061. }
  3062. }
  3063. if (c.length != a.length) {
  3064. return d
  3065. }
  3066. return -1
  3067. };
  3068. if (typeof KJUR == "undefined" || !KJUR) {
  3069. KJUR = {}
  3070. }
  3071. if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  3072. KJUR.crypto = {}
  3073. }
  3074. KJUR.crypto.Util = new function () {
  3075. this.DIGESTINFOHEAD = {
  3076. sha1: "3021300906052b0e03021a05000414",
  3077. sha224: "302d300d06096086480165030402040500041c",
  3078. sha256: "3031300d060960864801650304020105000420",
  3079. sha384: "3041300d060960864801650304020205000430",
  3080. sha512: "3051300d060960864801650304020305000440",
  3081. md2: "3020300c06082a864886f70d020205000410",
  3082. md5: "3020300c06082a864886f70d020505000410",
  3083. ripemd160: "3021300906052b2403020105000414",
  3084. };
  3085. this.DEFAULTPROVIDER = {
  3086. md5: "cryptojs",
  3087. sha1: "cryptojs",
  3088. sha224: "cryptojs",
  3089. sha256: "cryptojs",
  3090. sha384: "cryptojs",
  3091. sha512: "cryptojs",
  3092. ripemd160: "cryptojs",
  3093. hmacmd5: "cryptojs",
  3094. hmacsha1: "cryptojs",
  3095. hmacsha224: "cryptojs",
  3096. hmacsha256: "cryptojs",
  3097. hmacsha384: "cryptojs",
  3098. hmacsha512: "cryptojs",
  3099. hmacripemd160: "cryptojs",
  3100. MD5withRSA: "cryptojs/jsrsa",
  3101. SHA1withRSA: "cryptojs/jsrsa",
  3102. SHA224withRSA: "cryptojs/jsrsa",
  3103. SHA256withRSA: "cryptojs/jsrsa",
  3104. SHA384withRSA: "cryptojs/jsrsa",
  3105. SHA512withRSA: "cryptojs/jsrsa",
  3106. RIPEMD160withRSA: "cryptojs/jsrsa",
  3107. MD5withECDSA: "cryptojs/jsrsa",
  3108. SHA1withECDSA: "cryptojs/jsrsa",
  3109. SHA224withECDSA: "cryptojs/jsrsa",
  3110. SHA256withECDSA: "cryptojs/jsrsa",
  3111. SHA384withECDSA: "cryptojs/jsrsa",
  3112. SHA512withECDSA: "cryptojs/jsrsa",
  3113. RIPEMD160withECDSA: "cryptojs/jsrsa",
  3114. SHA1withDSA: "cryptojs/jsrsa",
  3115. SHA224withDSA: "cryptojs/jsrsa",
  3116. SHA256withDSA: "cryptojs/jsrsa",
  3117. MD5withRSAandMGF1: "cryptojs/jsrsa",
  3118. SHA1withRSAandMGF1: "cryptojs/jsrsa",
  3119. SHA224withRSAandMGF1: "cryptojs/jsrsa",
  3120. SHA256withRSAandMGF1: "cryptojs/jsrsa",
  3121. SHA384withRSAandMGF1: "cryptojs/jsrsa",
  3122. SHA512withRSAandMGF1: "cryptojs/jsrsa",
  3123. RIPEMD160withRSAandMGF1: "cryptojs/jsrsa",
  3124. };
  3125. this.CRYPTOJSMESSAGEDIGESTNAME = {
  3126. md5: CryptoJS.algo.MD5,
  3127. sha1: CryptoJS.algo.SHA1,
  3128. sha224: CryptoJS.algo.SHA224,
  3129. sha256: CryptoJS.algo.SHA256,
  3130. sha384: CryptoJS.algo.SHA384,
  3131. sha512: CryptoJS.algo.SHA512,
  3132. ripemd160: CryptoJS.algo.RIPEMD160
  3133. };
  3134. this.getDigestInfoHex = function (a, b) {
  3135. if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
  3136. throw "alg not supported in Util.DIGESTINFOHEAD: " + b
  3137. }
  3138. return this.DIGESTINFOHEAD[b] + a
  3139. }
  3140. ;
  3141. this.getPaddedDigestInfoHex = function (h, a, j) {
  3142. var c = this.getDigestInfoHex(h, a);
  3143. var d = j / 4;
  3144. if (c.length + 22 > d) {
  3145. throw "key is too short for SigAlg: keylen=" + j + "," + a
  3146. }
  3147. var b = "0001";
  3148. var k = "00" + c;
  3149. var g = "";
  3150. var l = d - b.length - k.length;
  3151. for (var f = 0; f < l; f += 2) {
  3152. g += "ff"
  3153. }
  3154. var e = b + g + k;
  3155. return e
  3156. }
  3157. ;
  3158. this.hashString = function (a, c) {
  3159. var b = new KJUR.crypto.MessageDigest({
  3160. alg: c
  3161. });
  3162. return b.digestString(a)
  3163. }
  3164. ;
  3165. this.hashHex = function (b, c) {
  3166. var a = new KJUR.crypto.MessageDigest({
  3167. alg: c
  3168. });
  3169. return a.digestHex(b)
  3170. }
  3171. ;
  3172. this.sha1 = function (a) {
  3173. var b = new KJUR.crypto.MessageDigest({
  3174. alg: "sha1",
  3175. prov: "cryptojs"
  3176. });
  3177. return b.digestString(a)
  3178. }
  3179. ;
  3180. this.sha256 = function (a) {
  3181. var b = new KJUR.crypto.MessageDigest({
  3182. alg: "sha256",
  3183. prov: "cryptojs"
  3184. });
  3185. return b.digestString(a)
  3186. }
  3187. ;
  3188. this.sha256Hex = function (a) {
  3189. var b = new KJUR.crypto.MessageDigest({
  3190. alg: "sha256",
  3191. prov: "cryptojs"
  3192. });
  3193. return b.digestHex(a)
  3194. }
  3195. ;
  3196. this.sha512 = function (a) {
  3197. var b = new KJUR.crypto.MessageDigest({
  3198. alg: "sha512",
  3199. prov: "cryptojs"
  3200. });
  3201. return b.digestString(a)
  3202. }
  3203. ;
  3204. this.sha512Hex = function (a) {
  3205. var b = new KJUR.crypto.MessageDigest({
  3206. alg: "sha512",
  3207. prov: "cryptojs"
  3208. });
  3209. return b.digestHex(a)
  3210. }
  3211. }
  3212. ;
  3213. KJUR.crypto.Util.md5 = function (a) {
  3214. var b = new KJUR.crypto.MessageDigest({
  3215. alg: "md5",
  3216. prov: "cryptojs"
  3217. });
  3218. return b.digestString(a)
  3219. }
  3220. ;
  3221. KJUR.crypto.Util.ripemd160 = function (a) {
  3222. var b = new KJUR.crypto.MessageDigest({
  3223. alg: "ripemd160",
  3224. prov: "cryptojs"
  3225. });
  3226. return b.digestString(a)
  3227. }
  3228. ;
  3229. KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();
  3230. KJUR.crypto.Util.getRandomHexOfNbytes = function (b) {
  3231. var a = new Array(b);
  3232. KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);
  3233. return BAtohex(a)
  3234. }
  3235. ;
  3236. KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (a) {
  3237. return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16)
  3238. }
  3239. ;
  3240. KJUR.crypto.Util.getRandomHexOfNbits = function (d) {
  3241. var c = d % 8;
  3242. var a = (d - c) / 8;
  3243. var b = new Array(a + 1);
  3244. KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);
  3245. b[0] = (((255 << c) & 255) ^ 255) & b[0];
  3246. return BAtohex(b)
  3247. }
  3248. ;
  3249. KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (a) {
  3250. return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16)
  3251. }
  3252. ;
  3253. KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (b) {
  3254. var a = b.bitLength();
  3255. while (1) {
  3256. var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);
  3257. if (b.compareTo(c) != -1) {
  3258. return c
  3259. }
  3260. }
  3261. }
  3262. ;
  3263. KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (e, b) {
  3264. var c = e.compareTo(b);
  3265. if (c == 1) {
  3266. throw "biMin is greater than biMax"
  3267. }
  3268. if (c == 0) {
  3269. return e
  3270. }
  3271. var a = b.subtract(e);
  3272. var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);
  3273. return d.add(e)
  3274. }
  3275. ;
  3276. KJUR.crypto.MessageDigest = function (c) {
  3277. var b = null;
  3278. var a = null;
  3279. var d = null;
  3280. this.setAlgAndProvider = function (g, f) {
  3281. g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);
  3282. if (g !== null && f === undefined) {
  3283. f = KJUR.crypto.Util.DEFAULTPROVIDER[g]
  3284. }
  3285. if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {
  3286. try {
  3287. this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create()
  3288. } catch (e) {
  3289. throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
  3290. }
  3291. this.updateString = function (h) {
  3292. this.md.update(h)
  3293. }
  3294. ;
  3295. this.updateHex = function (h) {
  3296. var i = CryptoJS.enc.Hex.parse(h);
  3297. this.md.update(i)
  3298. }
  3299. ;
  3300. this.digest = function () {
  3301. var h = this.md.finalize();
  3302. return h.toString(CryptoJS.enc.Hex)
  3303. }
  3304. ;
  3305. this.digestString = function (h) {
  3306. this.updateString(h);
  3307. return this.digest()
  3308. }
  3309. ;
  3310. this.digestHex = function (h) {
  3311. this.updateHex(h);
  3312. return this.digest()
  3313. }
  3314. }
  3315. if (":sha256:".indexOf(g) != -1 && f == "sjcl") {
  3316. try {
  3317. this.md = new sjcl.hash.sha256()
  3318. } catch (e) {
  3319. throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
  3320. }
  3321. this.updateString = function (h) {
  3322. this.md.update(h)
  3323. }
  3324. ;
  3325. this.updateHex = function (i) {
  3326. var h = sjcl.codec.hex.toBits(i);
  3327. this.md.update(h)
  3328. }
  3329. ;
  3330. this.digest = function () {
  3331. var h = this.md.finalize();
  3332. return sjcl.codec.hex.fromBits(h)
  3333. }
  3334. ;
  3335. this.digestString = function (h) {
  3336. this.updateString(h);
  3337. return this.digest()
  3338. }
  3339. ;
  3340. this.digestHex = function (h) {
  3341. this.updateHex(h);
  3342. return this.digest()
  3343. }
  3344. }
  3345. }
  3346. ;
  3347. this.updateString = function (e) {
  3348. throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
  3349. }
  3350. ;
  3351. this.updateHex = function (e) {
  3352. throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName
  3353. }
  3354. ;
  3355. this.digest = function () {
  3356. throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName
  3357. }
  3358. ;
  3359. this.digestString = function (e) {
  3360. throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
  3361. }
  3362. ;
  3363. this.digestHex = function (e) {
  3364. throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName
  3365. }
  3366. ;
  3367. if (c !== undefined) {
  3368. if (c.alg !== undefined) {
  3369. this.algName = c.alg;
  3370. if (c.prov === undefined) {
  3371. this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
  3372. }
  3373. this.setAlgAndProvider(this.algName, this.provName)
  3374. }
  3375. }
  3376. }
  3377. ;
  3378. KJUR.crypto.MessageDigest.getCanonicalAlgName = function (a) {
  3379. if (typeof a === "string") {
  3380. a = a.toLowerCase();
  3381. a = a.replace(/-/, "")
  3382. }
  3383. return a
  3384. }
  3385. ;
  3386. KJUR.crypto.MessageDigest.getHashLength = function (c) {
  3387. var b = KJUR.crypto.MessageDigest;
  3388. var a = b.getCanonicalAlgName(c);
  3389. if (b.HASHLENGTH[a] === undefined) {
  3390. throw "not supported algorithm: " + c
  3391. }
  3392. return b.HASHLENGTH[a]
  3393. }
  3394. ;
  3395. KJUR.crypto.MessageDigest.HASHLENGTH = {
  3396. md5: 16,
  3397. sha1: 20,
  3398. sha224: 28,
  3399. sha256: 32,
  3400. sha384: 48,
  3401. sha512: 64,
  3402. ripemd160: 20
  3403. };
  3404. KJUR.crypto.Mac = function (d) {
  3405. var f = null;
  3406. var c = null;
  3407. var a = null;
  3408. var e = null;
  3409. var b = null;
  3410. this.setAlgAndProvider = function (k, i) {
  3411. k = k.toLowerCase();
  3412. if (k == null) {
  3413. k = "hmacsha1"
  3414. }
  3415. k = k.toLowerCase();
  3416. if (k.substr(0, 4) != "hmac") {
  3417. throw "setAlgAndProvider unsupported HMAC alg: " + k
  3418. }
  3419. if (i === undefined) {
  3420. i = KJUR.crypto.Util.DEFAULTPROVIDER[k]
  3421. }
  3422. this.algProv = k + "/" + i;
  3423. var g = k.substr(4);
  3424. if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {
  3425. try {
  3426. var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];
  3427. this.mac = CryptoJS.algo.HMAC.create(j, this.pass)
  3428. } catch (h) {
  3429. throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h
  3430. }
  3431. this.updateString = function (l) {
  3432. this.mac.update(l)
  3433. }
  3434. ;
  3435. this.updateHex = function (l) {
  3436. var m = CryptoJS.enc.Hex.parse(l);
  3437. this.mac.update(m)
  3438. }
  3439. ;
  3440. this.doFinal = function () {
  3441. var l = this.mac.finalize();
  3442. return l.toString(CryptoJS.enc.Hex)
  3443. }
  3444. ;
  3445. this.doFinalString = function (l) {
  3446. this.updateString(l);
  3447. return this.doFinal()
  3448. }
  3449. ;
  3450. this.doFinalHex = function (l) {
  3451. this.updateHex(l);
  3452. return this.doFinal()
  3453. }
  3454. }
  3455. }
  3456. ;
  3457. this.updateString = function (g) {
  3458. throw "updateString(str) not supported for this alg/prov: " + this.algProv
  3459. }
  3460. ;
  3461. this.updateHex = function (g) {
  3462. throw "updateHex(hex) not supported for this alg/prov: " + this.algProv
  3463. }
  3464. ;
  3465. this.doFinal = function () {
  3466. throw "digest() not supported for this alg/prov: " + this.algProv
  3467. }
  3468. ;
  3469. this.doFinalString = function (g) {
  3470. throw "digestString(str) not supported for this alg/prov: " + this.algProv
  3471. }
  3472. ;
  3473. this.doFinalHex = function (g) {
  3474. throw "digestHex(hex) not supported for this alg/prov: " + this.algProv
  3475. }
  3476. ;
  3477. this.setPassword = function (h) {
  3478. if (typeof h == "string") {
  3479. var g = h;
  3480. if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) {
  3481. g = rstrtohex(h)
  3482. }
  3483. this.pass = CryptoJS.enc.Hex.parse(g);
  3484. return
  3485. }
  3486. if (typeof h != "object") {
  3487. throw "KJUR.crypto.Mac unsupported password type: " + h
  3488. }
  3489. var g = null;
  3490. if (h.hex !== undefined) {
  3491. if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) {
  3492. throw "Mac: wrong hex password: " + h.hex
  3493. }
  3494. g = h.hex
  3495. }
  3496. if (h.utf8 !== undefined) {
  3497. g = utf8tohex(h.utf8)
  3498. }
  3499. if (h.rstr !== undefined) {
  3500. g = rstrtohex(h.rstr)
  3501. }
  3502. if (h.b64 !== undefined) {
  3503. g = b64tohex(h.b64)
  3504. }
  3505. if (h.b64u !== undefined) {
  3506. g = b64utohex(h.b64u)
  3507. }
  3508. if (g == null) {
  3509. throw "KJUR.crypto.Mac unsupported password type: " + h
  3510. }
  3511. this.pass = CryptoJS.enc.Hex.parse(g)
  3512. }
  3513. ;
  3514. if (d !== undefined) {
  3515. if (d.pass !== undefined) {
  3516. this.setPassword(d.pass)
  3517. }
  3518. if (d.alg !== undefined) {
  3519. this.algName = d.alg;
  3520. if (d.prov === undefined) {
  3521. this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
  3522. }
  3523. this.setAlgAndProvider(this.algName, this.provName)
  3524. }
  3525. }
  3526. }
  3527. ;
  3528. KJUR.crypto.Signature = function (o) {
  3529. var q = null;
  3530. var n = null;
  3531. var r = null;
  3532. var c = null;
  3533. var l = null;
  3534. var d = null;
  3535. var k = null;
  3536. var h = null;
  3537. var p = null;
  3538. var e = null;
  3539. var b = -1;
  3540. var g = null;
  3541. var j = null;
  3542. var a = null;
  3543. var i = null;
  3544. var f = null;
  3545. this._setAlgNames = function () {
  3546. var s = this.algName.match(/^(.+)with(.+)$/);
  3547. if (s) {
  3548. this.mdAlgName = s[1].toLowerCase();
  3549. this.pubkeyAlgName = s[2].toLowerCase()
  3550. }
  3551. }
  3552. ;
  3553. this._zeroPaddingOfSignature = function (x, w) {
  3554. var v = "";
  3555. var t = w / 4 - x.length;
  3556. for (var u = 0; u < t; u++) {
  3557. v = v + "0"
  3558. }
  3559. return v + x
  3560. }
  3561. ;
  3562. this.setAlgAndProvider = function (u, t) {
  3563. this._setAlgNames();
  3564. if (t != "cryptojs/jsrsa") {
  3565. throw "provider not supported: " + t
  3566. }
  3567. if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
  3568. try {
  3569. this.md = new KJUR.crypto.MessageDigest({
  3570. alg: this.mdAlgName
  3571. })
  3572. } catch (s) {
  3573. throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s
  3574. }
  3575. this.init = function (w, x) {
  3576. var y = null;
  3577. try {
  3578. if (x === undefined) {
  3579. y = KEYUTIL.getKey(w)
  3580. } else {
  3581. y = KEYUTIL.getKey(w, x)
  3582. }
  3583. } catch (v) {
  3584. throw "init failed:" + v
  3585. }
  3586. if (y.isPrivate === true) {
  3587. this.prvKey = y;
  3588. this.state = "SIGN"
  3589. } else {
  3590. if (y.isPublic === true) {
  3591. this.pubKey = y;
  3592. this.state = "VERIFY"
  3593. } else {
  3594. throw "init failed.:" + y
  3595. }
  3596. }
  3597. }
  3598. ;
  3599. this.updateString = function (v) {
  3600. this.md.updateString(v)
  3601. }
  3602. ;
  3603. this.updateHex = function (v) {
  3604. this.md.updateHex(v)
  3605. }
  3606. ;
  3607. this.sign = function () {
  3608. this.sHashHex = this.md.digest();
  3609. if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
  3610. var v = new KJUR.crypto.ECDSA({
  3611. curve: this.eccurvename
  3612. });
  3613. this.hSign = v.signHex(this.sHashHex, this.ecprvhex)
  3614. } else {
  3615. if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
  3616. this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen)
  3617. } else {
  3618. if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
  3619. this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName)
  3620. } else {
  3621. if (this.prvKey instanceof KJUR.crypto.ECDSA) {
  3622. this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
  3623. } else {
  3624. if (this.prvKey instanceof KJUR.crypto.DSA) {
  3625. this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
  3626. } else {
  3627. throw "Signature: unsupported private key alg: " + this.pubkeyAlgName
  3628. }
  3629. }
  3630. }
  3631. }
  3632. }
  3633. return this.hSign
  3634. }
  3635. ;
  3636. this.signString = function (v) {
  3637. this.updateString(v);
  3638. return this.sign()
  3639. }
  3640. ;
  3641. this.signHex = function (v) {
  3642. this.updateHex(v);
  3643. return this.sign()
  3644. }
  3645. ;
  3646. this.verify = function (v) {
  3647. this.sHashHex = this.md.digest();
  3648. if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
  3649. var w = new KJUR.crypto.ECDSA({
  3650. curve: this.eccurvename
  3651. });
  3652. return w.verifyHex(this.sHashHex, v, this.ecpubhex)
  3653. } else {
  3654. if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
  3655. return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen)
  3656. } else {
  3657. if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
  3658. return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
  3659. } else {
  3660. if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) {
  3661. return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
  3662. } else {
  3663. if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) {
  3664. return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
  3665. } else {
  3666. throw "Signature: unsupported public key alg: " + this.pubkeyAlgName
  3667. }
  3668. }
  3669. }
  3670. }
  3671. }
  3672. }
  3673. }
  3674. }
  3675. ;
  3676. this.init = function (s, t) {
  3677. throw "init(key, pass) not supported for this alg:prov=" + this.algProvName
  3678. }
  3679. ;
  3680. this.updateString = function (s) {
  3681. throw "updateString(str) not supported for this alg:prov=" + this.algProvName
  3682. }
  3683. ;
  3684. this.updateHex = function (s) {
  3685. throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName
  3686. }
  3687. ;
  3688. this.sign = function () {
  3689. throw "sign() not supported for this alg:prov=" + this.algProvName
  3690. }
  3691. ;
  3692. this.signString = function (s) {
  3693. throw "digestString(str) not supported for this alg:prov=" + this.algProvName
  3694. }
  3695. ;
  3696. this.signHex = function (s) {
  3697. throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName
  3698. }
  3699. ;
  3700. this.verify = function (s) {
  3701. throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName
  3702. }
  3703. ;
  3704. this.initParams = o;
  3705. if (o !== undefined) {
  3706. if (o.alg !== undefined) {
  3707. this.algName = o.alg;
  3708. if (o.prov === undefined) {
  3709. this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
  3710. } else {
  3711. this.provName = o.prov
  3712. }
  3713. this.algProvName = this.algName + ":" + this.provName;
  3714. this.setAlgAndProvider(this.algName, this.provName);
  3715. this._setAlgNames()
  3716. }
  3717. if (o.psssaltlen !== undefined) {
  3718. this.pssSaltLen = o.psssaltlen
  3719. }
  3720. if (o.prvkeypem !== undefined) {
  3721. if (o.prvkeypas !== undefined) {
  3722. throw "both prvkeypem and prvkeypas parameters not supported"
  3723. } else {
  3724. try {
  3725. var q = KEYUTIL.getKey(o.prvkeypem);
  3726. this.init(q)
  3727. } catch (m) {
  3728. throw "fatal error to load pem private key: " + m
  3729. }
  3730. }
  3731. }
  3732. }
  3733. }
  3734. ;
  3735. KJUR.crypto.Cipher = function (a) {
  3736. }
  3737. ;
  3738. KJUR.crypto.Cipher.encrypt = function (e, f, d) {
  3739. if (f instanceof RSAKey && f.isPublic) {
  3740. var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
  3741. if (c === "RSA") {
  3742. return f.encrypt(e)
  3743. }
  3744. if (c === "RSAOAEP") {
  3745. return f.encryptOAEP(e, "sha1")
  3746. }
  3747. var b = c.match(/^RSAOAEP(\d+)$/);
  3748. if (b !== null) {
  3749. return f.encryptOAEP(e, "sha" + b[1])
  3750. }
  3751. throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d
  3752. } else {
  3753. throw "Cipher.encrypt: unsupported key or algorithm"
  3754. }
  3755. }
  3756. ;
  3757. KJUR.crypto.Cipher.decrypt = function (e, f, d) {
  3758. if (f instanceof RSAKey && f.isPrivate) {
  3759. var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
  3760. if (c === "RSA") {
  3761. return f.decrypt(e)
  3762. }
  3763. if (c === "RSAOAEP") {
  3764. return f.decryptOAEP(e, "sha1")
  3765. }
  3766. var b = c.match(/^RSAOAEP(\d+)$/);
  3767. if (b !== null) {
  3768. return f.decryptOAEP(e, "sha" + b[1])
  3769. }
  3770. throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d
  3771. } else {
  3772. throw "Cipher.decrypt: unsupported key or algorithm"
  3773. }
  3774. }
  3775. ;
  3776. KJUR.crypto.Cipher.getAlgByKeyAndName = function (b, a) {
  3777. if (b instanceof RSAKey) {
  3778. if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {
  3779. return a
  3780. }
  3781. if (a === null || a === undefined) {
  3782. return "RSA"
  3783. }
  3784. throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a
  3785. }
  3786. throw "getAlgByKeyAndName: not supported algorithm name: " + a
  3787. }
  3788. ;
  3789. KJUR.crypto.OID = new function () {
  3790. this.oidhex2name = {
  3791. "2a864886f70d010101": "rsaEncryption",
  3792. "2a8648ce3d0201": "ecPublicKey",
  3793. "2a8648ce380401": "dsa",
  3794. "2a8648ce3d030107": "secp256r1",
  3795. "2b8104001f": "secp192k1",
  3796. "2b81040021": "secp224r1",
  3797. "2b8104000a": "secp256k1",
  3798. "2b81040023": "secp521r1",
  3799. "2b81040022": "secp384r1",
  3800. "2a8648ce380403": "SHA1withDSA",
  3801. "608648016503040301": "SHA224withDSA",
  3802. "608648016503040302": "SHA256withDSA",
  3803. }
  3804. }
  3805. ;
  3806. var KEYUTIL = function () {
  3807. var d = function (p, r, q) {
  3808. return k(CryptoJS.AES, p, r, q)
  3809. };
  3810. var e = function (p, r, q) {
  3811. return k(CryptoJS.TripleDES, p, r, q)
  3812. };
  3813. var a = function (p, r, q) {
  3814. return k(CryptoJS.DES, p, r, q)
  3815. };
  3816. var k = function (s, x, u, q) {
  3817. var r = CryptoJS.enc.Hex.parse(x);
  3818. var w = CryptoJS.enc.Hex.parse(u);
  3819. var p = CryptoJS.enc.Hex.parse(q);
  3820. var t = {};
  3821. t.key = w;
  3822. t.iv = p;
  3823. t.ciphertext = r;
  3824. var v = s.decrypt(t, w, {
  3825. iv: p
  3826. });
  3827. return CryptoJS.enc.Hex.stringify(v)
  3828. };
  3829. var l = function (p, r, q) {
  3830. return g(CryptoJS.AES, p, r, q)
  3831. };
  3832. var o = function (p, r, q) {
  3833. return g(CryptoJS.TripleDES, p, r, q)
  3834. };
  3835. var f = function (p, r, q) {
  3836. return g(CryptoJS.DES, p, r, q)
  3837. };
  3838. var g = function (t, y, v, q) {
  3839. var s = CryptoJS.enc.Hex.parse(y);
  3840. var x = CryptoJS.enc.Hex.parse(v);
  3841. var p = CryptoJS.enc.Hex.parse(q);
  3842. var w = t.encrypt(s, x, {
  3843. iv: p
  3844. });
  3845. var r = CryptoJS.enc.Hex.parse(w.toString());
  3846. var u = CryptoJS.enc.Base64.stringify(r);
  3847. return u
  3848. };
  3849. var i = {
  3850. "AES-256-CBC": {
  3851. proc: d,
  3852. eproc: l,
  3853. keylen: 32,
  3854. ivlen: 16
  3855. },
  3856. "AES-192-CBC": {
  3857. proc: d,
  3858. eproc: l,
  3859. keylen: 24,
  3860. ivlen: 16
  3861. },
  3862. "AES-128-CBC": {
  3863. proc: d,
  3864. eproc: l,
  3865. keylen: 16,
  3866. ivlen: 16
  3867. },
  3868. "DES-EDE3-CBC": {
  3869. proc: e,
  3870. eproc: o,
  3871. keylen: 24,
  3872. ivlen: 8
  3873. },
  3874. "DES-CBC": {
  3875. proc: a,
  3876. eproc: f,
  3877. keylen: 8,
  3878. ivlen: 8
  3879. }
  3880. };
  3881. var c = function (p) {
  3882. return i[p]["proc"]
  3883. };
  3884. var m = function (p) {
  3885. var r = CryptoJS.lib.WordArray.random(p);
  3886. var q = CryptoJS.enc.Hex.stringify(r);
  3887. return q
  3888. };
  3889. var n = function (v) {
  3890. var w = {};
  3891. var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));
  3892. if (q) {
  3893. w.cipher = q[1];
  3894. w.ivsalt = q[2]
  3895. }
  3896. var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));
  3897. if (p) {
  3898. w.type = p[1]
  3899. }
  3900. var u = -1;
  3901. var x = 0;
  3902. if (v.indexOf("\r\n\r\n") != -1) {
  3903. u = v.indexOf("\r\n\r\n");
  3904. x = 2
  3905. }
  3906. if (v.indexOf("\n\n") != -1) {
  3907. u = v.indexOf("\n\n");
  3908. x = 1
  3909. }
  3910. var t = v.indexOf("-----END");
  3911. if (u != -1 && t != -1) {
  3912. var r = v.substring(u + x * 2, t - x);
  3913. r = r.replace(/\s+/g, "");
  3914. w.data = r
  3915. }
  3916. return w
  3917. };
  3918. var j = function (q, y, p) {
  3919. var v = p.substring(0, 16);
  3920. var t = CryptoJS.enc.Hex.parse(v);
  3921. var r = CryptoJS.enc.Utf8.parse(y);
  3922. var u = i[q]["keylen"] + i[q]["ivlen"];
  3923. var x = "";
  3924. var w = null;
  3925. for (; ;) {
  3926. var s = CryptoJS.algo.MD5.create();
  3927. if (w != null) {
  3928. s.update(w)
  3929. }
  3930. s.update(r);
  3931. s.update(t);
  3932. w = s.finalize();
  3933. x = x + CryptoJS.enc.Hex.stringify(w);
  3934. if (x.length >= u * 2) {
  3935. break
  3936. }
  3937. }
  3938. var z = {};
  3939. z.keyhex = x.substr(0, i[q]["keylen"] * 2);
  3940. z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);
  3941. return z
  3942. };
  3943. var b = function (p, v, r, w) {
  3944. var s = CryptoJS.enc.Base64.parse(p);
  3945. var q = CryptoJS.enc.Hex.stringify(s);
  3946. var u = i[v]["proc"];
  3947. var t = u(q, r, w);
  3948. return t
  3949. };
  3950. var h = function (p, s, q, u) {
  3951. var r = i[s]["eproc"];
  3952. var t = r(p, q, u);
  3953. return t
  3954. };
  3955. return {
  3956. version: "1.0.0",
  3957. parsePKCS5PEM: function (p) {
  3958. return n(p)
  3959. },
  3960. getKeyAndUnusedIvByPasscodeAndIvsalt: function (q, p, r) {
  3961. return j(q, p, r)
  3962. },
  3963. decryptKeyB64: function (p, r, q, s) {
  3964. return b(p, r, q, s)
  3965. },
  3966. getDecryptedKeyHex: function (y, x) {
  3967. var q = n(y);
  3968. var t = q.type;
  3969. var r = q.cipher;
  3970. var p = q.ivsalt;
  3971. var s = q.data;
  3972. var w = j(r, x, p);
  3973. var v = w.keyhex;
  3974. var u = b(s, r, v, p);
  3975. return u
  3976. },
  3977. getEncryptedPKCS5PEMFromPrvKeyHex: function (x, s, A, t, r) {
  3978. var p = "";
  3979. if (typeof t == "undefined" || t == null) {
  3980. t = "AES-256-CBC"
  3981. }
  3982. if (typeof i[t] == "undefined") {
  3983. throw "KEYUTIL unsupported algorithm: " + t
  3984. }
  3985. if (typeof r == "undefined" || r == null) {
  3986. var v = i[t]["ivlen"];
  3987. var u = m(v);
  3988. r = u.toUpperCase()
  3989. }
  3990. var z = j(t, A, r);
  3991. var y = z.keyhex;
  3992. var w = h(s, t, y, r);
  3993. var q = w.replace(/(.{64})/g, "$1\r\n");
  3994. var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";
  3995. p += "Proc-Type: 4,ENCRYPTED\r\n";
  3996. p += "DEK-Info: " + t + "," + r + "\r\n";
  3997. p += "\r\n";
  3998. p += q;
  3999. p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";
  4000. return p
  4001. },
  4002. parseHexOfEncryptedPKCS8: function (y) {
  4003. var B = ASN1HEX;
  4004. var z = B.getChildIdx;
  4005. var w = B.getV;
  4006. var t = {};
  4007. var r = z(y, 0);
  4008. if (r.length != 2) {
  4009. throw "malformed format: SEQUENCE(0).items != 2: " + r.length
  4010. }
  4011. t.ciphertext = w(y, r[1]);
  4012. var A = z(y, r[0]);
  4013. if (A.length != 2) {
  4014. throw "malformed format: SEQUENCE(0.0).items != 2: " + A.length
  4015. }
  4016. if (w(y, A[0]) != "2a864886f70d01050d") {
  4017. throw "this only supports pkcs5PBES2"
  4018. }
  4019. var p = z(y, A[1]);
  4020. if (A.length != 2) {
  4021. throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length
  4022. }
  4023. var q = z(y, p[1]);
  4024. if (q.length != 2) {
  4025. throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length
  4026. }
  4027. if (w(y, q[0]) != "2a864886f70d0307") {
  4028. throw "this only supports TripleDES"
  4029. }
  4030. t.encryptionSchemeAlg = "TripleDES";
  4031. t.encryptionSchemeIV = w(y, q[1]);
  4032. var s = z(y, p[0]);
  4033. if (s.length != 2) {
  4034. throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length
  4035. }
  4036. if (w(y, s[0]) != "2a864886f70d01050c") {
  4037. throw "this only supports pkcs5PBKDF2"
  4038. }
  4039. var x = z(y, s[1]);
  4040. if (x.length < 2) {
  4041. throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length
  4042. }
  4043. t.pbkdf2Salt = w(y, x[0]);
  4044. var u = w(y, x[1]);
  4045. try {
  4046. t.pbkdf2Iter = parseInt(u, 16)
  4047. } catch (v) {
  4048. throw "malformed format pbkdf2Iter: " + u
  4049. }
  4050. return t
  4051. },
  4052. getPBKDF2KeyHexFromParam: function (u, p) {
  4053. var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);
  4054. var q = u.pbkdf2Iter;
  4055. var s = CryptoJS.PBKDF2(p, t, {
  4056. keySize: 192 / 32,
  4057. iterations: q
  4058. });
  4059. var r = CryptoJS.enc.Hex.stringify(s);
  4060. return r
  4061. },
  4062. _getPlainPKCS8HexFromEncryptedPKCS8PEM: function (x, y) {
  4063. var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");
  4064. var p = this.parseHexOfEncryptedPKCS8(r);
  4065. var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);
  4066. var v = {};
  4067. v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);
  4068. var t = CryptoJS.enc.Hex.parse(u);
  4069. var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);
  4070. var w = CryptoJS.TripleDES.decrypt(v, t, {
  4071. iv: s
  4072. });
  4073. var q = CryptoJS.enc.Hex.stringify(w);
  4074. return q
  4075. },
  4076. getKeyFromEncryptedPKCS8PEM: function (s, q) {
  4077. var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);
  4078. var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
  4079. return r
  4080. },
  4081. parsePlainPrivatePKCS8Hex: function (s) {
  4082. var v = ASN1HEX;
  4083. var u = v.getChildIdx;
  4084. var t = v.getV;
  4085. var q = {};
  4086. q.algparam = null;
  4087. if (s.substr(0, 2) != "30") {
  4088. throw "malformed plain PKCS8 private key(code:001)"
  4089. }
  4090. var r = u(s, 0);
  4091. if (r.length != 3) {
  4092. throw "malformed plain PKCS8 private key(code:002)"
  4093. }
  4094. if (s.substr(r[1], 2) != "30") {
  4095. throw "malformed PKCS8 private key(code:003)"
  4096. }
  4097. var p = u(s, r[1]);
  4098. if (p.length != 2) {
  4099. throw "malformed PKCS8 private key(code:004)"
  4100. }
  4101. if (s.substr(p[0], 2) != "06") {
  4102. throw "malformed PKCS8 private key(code:005)"
  4103. }
  4104. q.algoid = t(s, p[0]);
  4105. if (s.substr(p[1], 2) == "06") {
  4106. q.algparam = t(s, p[1])
  4107. }
  4108. if (s.substr(r[2], 2) != "04") {
  4109. throw "malformed PKCS8 private key(code:006)"
  4110. }
  4111. q.keyidx = v.getVidx(s, r[2]);
  4112. return q
  4113. },
  4114. getKeyFromPlainPrivatePKCS8PEM: function (q) {
  4115. var p = pemtohex(q, "PRIVATE KEY");
  4116. var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
  4117. return r
  4118. },
  4119. getKeyFromPlainPrivatePKCS8Hex: function (p) {
  4120. var q = this.parsePlainPrivatePKCS8Hex(p);
  4121. var r;
  4122. if (q.algoid == "2a864886f70d010101") {
  4123. r = new RSAKey()
  4124. } else {
  4125. if (q.algoid == "2a8648ce380401") {
  4126. r = new KJUR.crypto.DSA()
  4127. } else {
  4128. if (q.algoid == "2a8648ce3d0201") {
  4129. r = new KJUR.crypto.ECDSA()
  4130. } else {
  4131. throw "unsupported private key algorithm"
  4132. }
  4133. }
  4134. }
  4135. r.readPKCS8PrvKeyHex(p);
  4136. return r
  4137. },
  4138. _getKeyFromPublicPKCS8Hex: function (q) {
  4139. var p;
  4140. var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");
  4141. if (r === "2a864886f70d010101") {
  4142. p = new RSAKey()
  4143. } else {
  4144. if (r === "2a8648ce380401") {
  4145. p = new KJUR.crypto.DSA()
  4146. } else {
  4147. if (r === "2a8648ce3d0201") {
  4148. p = new KJUR.crypto.ECDSA()
  4149. } else {
  4150. throw "unsupported PKCS#8 public key hex"
  4151. }
  4152. }
  4153. }
  4154. p.readPKCS8PubKeyHex(q);
  4155. return p
  4156. },
  4157. parsePublicRawRSAKeyHex: function (r) {
  4158. var u = ASN1HEX;
  4159. var t = u.getChildIdx;
  4160. var s = u.getV;
  4161. var p = {};
  4162. if (r.substr(0, 2) != "30") {
  4163. throw "malformed RSA key(code:001)"
  4164. }
  4165. var q = t(r, 0);
  4166. if (q.length != 2) {
  4167. throw "malformed RSA key(code:002)"
  4168. }
  4169. if (r.substr(q[0], 2) != "02") {
  4170. throw "malformed RSA key(code:003)"
  4171. }
  4172. p.n = s(r, q[0]);
  4173. if (r.substr(q[1], 2) != "02") {
  4174. throw "malformed RSA key(code:004)"
  4175. }
  4176. p.e = s(r, q[1]);
  4177. return p
  4178. },
  4179. parsePublicPKCS8Hex: function (t) {
  4180. var v = ASN1HEX;
  4181. var u = v.getChildIdx;
  4182. var s = v.getV;
  4183. var q = {};
  4184. q.algparam = null;
  4185. var r = u(t, 0);
  4186. if (r.length != 2) {
  4187. throw "outer DERSequence shall have 2 elements: " + r.length
  4188. }
  4189. var w = r[0];
  4190. if (t.substr(w, 2) != "30") {
  4191. throw "malformed PKCS8 public key(code:001)"
  4192. }
  4193. var p = u(t, w);
  4194. if (p.length != 2) {
  4195. throw "malformed PKCS8 public key(code:002)"
  4196. }
  4197. if (t.substr(p[0], 2) != "06") {
  4198. throw "malformed PKCS8 public key(code:003)"
  4199. }
  4200. q.algoid = s(t, p[0]);
  4201. if (t.substr(p[1], 2) == "06") {
  4202. q.algparam = s(t, p[1])
  4203. } else {
  4204. if (t.substr(p[1], 2) == "30") {
  4205. q.algparam = {};
  4206. q.algparam.p = v.getVbyList(t, p[1], [0], "02");
  4207. q.algparam.q = v.getVbyList(t, p[1], [1], "02");
  4208. q.algparam.g = v.getVbyList(t, p[1], [2], "02")
  4209. }
  4210. }
  4211. if (t.substr(r[1], 2) != "03") {
  4212. throw "malformed PKCS8 public key(code:004)"
  4213. }
  4214. q.key = s(t, r[1]).substr(2);
  4215. return q
  4216. },
  4217. }
  4218. }();
  4219. KEYUTIL.getKey = function (l, k, n) {
  4220. var G = ASN1HEX
  4221. , L = G.getChildIdx
  4222. , v = G.getV
  4223. , d = G.getVbyList
  4224. , c = KJUR.crypto
  4225. , i = c.ECDSA
  4226. , C = c.DSA
  4227. , w = RSAKey
  4228. , M = pemtohex
  4229. , F = KEYUTIL;
  4230. if (typeof w != "undefined" && l instanceof w) {
  4231. return l
  4232. }
  4233. if (typeof i != "undefined" && l instanceof i) {
  4234. return l
  4235. }
  4236. if (typeof C != "undefined" && l instanceof C) {
  4237. return l
  4238. }
  4239. if (l.curve !== undefined && l.xy !== undefined && l.d === undefined) {
  4240. return new i({
  4241. pub: l.xy,
  4242. curve: l.curve
  4243. })
  4244. }
  4245. if (l.curve !== undefined && l.d !== undefined) {
  4246. return new i({
  4247. prv: l.d,
  4248. curve: l.curve
  4249. })
  4250. }
  4251. if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d === undefined) {
  4252. var P = new w();
  4253. P.setPublic(l.n, l.e);
  4254. return P
  4255. }
  4256. if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.co !== undefined && l.qi === undefined) {
  4257. var P = new w();
  4258. P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);
  4259. return P
  4260. }
  4261. if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p === undefined) {
  4262. var P = new w();
  4263. P.setPrivate(l.n, l.e, l.d);
  4264. return P
  4265. }
  4266. if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x === undefined) {
  4267. var P = new C();
  4268. P.setPublic(l.p, l.q, l.g, l.y);
  4269. return P
  4270. }
  4271. if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x !== undefined) {
  4272. var P = new C();
  4273. P.setPrivate(l.p, l.q, l.g, l.y, l.x);
  4274. return P
  4275. }
  4276. if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d === undefined) {
  4277. var P = new w();
  4278. P.setPublic(b64utohex(l.n), b64utohex(l.e));
  4279. return P
  4280. }
  4281. if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.qi !== undefined) {
  4282. var P = new w();
  4283. P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));
  4284. return P
  4285. }
  4286. if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined) {
  4287. var P = new w();
  4288. P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));
  4289. return P
  4290. }
  4291. if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d === undefined) {
  4292. var j = new i({
  4293. curve: l.crv
  4294. });
  4295. var t = j.ecparams.keylen / 4;
  4296. var B = ("0000000000" + b64utohex(l.x)).slice(-t);
  4297. var z = ("0000000000" + b64utohex(l.y)).slice(-t);
  4298. var u = "04" + B + z;
  4299. j.setPublicKeyHex(u);
  4300. return j
  4301. }
  4302. if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d !== undefined) {
  4303. var j = new i({
  4304. curve: l.crv
  4305. });
  4306. var t = j.ecparams.keylen / 4;
  4307. var B = ("0000000000" + b64utohex(l.x)).slice(-t);
  4308. var z = ("0000000000" + b64utohex(l.y)).slice(-t);
  4309. var u = "04" + B + z;
  4310. var b = ("0000000000" + b64utohex(l.d)).slice(-t);
  4311. j.setPublicKeyHex(u);
  4312. j.setPrivateKeyHex(b);
  4313. return j
  4314. }
  4315. if (n === "pkcs5prv") {
  4316. var J = l, G = ASN1HEX, N, P;
  4317. N = L(J, 0);
  4318. if (N.length === 9) {
  4319. P = new w();
  4320. P.readPKCS5PrvKeyHex(J)
  4321. } else {
  4322. if (N.length === 6) {
  4323. P = new C();
  4324. P.readPKCS5PrvKeyHex(J)
  4325. } else {
  4326. if (N.length > 2 && J.substr(N[1], 2) === "04") {
  4327. P = new i();
  4328. P.readPKCS5PrvKeyHex(J)
  4329. } else {
  4330. throw "unsupported PKCS#1/5 hexadecimal key"
  4331. }
  4332. }
  4333. }
  4334. return P
  4335. }
  4336. if (n === "pkcs8prv") {
  4337. var P = F.getKeyFromPlainPrivatePKCS8Hex(l);
  4338. return P
  4339. }
  4340. if (n === "pkcs8pub") {
  4341. return F._getKeyFromPublicPKCS8Hex(l)
  4342. }
  4343. if (n === "x509pub") {
  4344. return X509.getPublicKeyFromCertHex(l)
  4345. }
  4346. if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
  4347. return X509.getPublicKeyFromCertPEM(l)
  4348. }
  4349. if (l.indexOf("-END PUBLIC KEY-") != -1) {
  4350. var O = pemtohex(l, "PUBLIC KEY");
  4351. return F._getKeyFromPublicPKCS8Hex(O)
  4352. }
  4353. if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
  4354. var m = M(l, "RSA PRIVATE KEY");
  4355. return F.getKey(m, null, "pkcs5prv")
  4356. }
  4357. if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
  4358. var I = M(l, "DSA PRIVATE KEY");
  4359. var E = d(I, 0, [1], "02");
  4360. var D = d(I, 0, [2], "02");
  4361. var K = d(I, 0, [3], "02");
  4362. var r = d(I, 0, [4], "02");
  4363. var s = d(I, 0, [5], "02");
  4364. var P = new C();
  4365. P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
  4366. return P
  4367. }
  4368. if (l.indexOf("-END PRIVATE KEY-") != -1) {
  4369. return F.getKeyFromPlainPrivatePKCS8PEM(l)
  4370. }
  4371. if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
  4372. var o = F.getDecryptedKeyHex(l, k);
  4373. var H = new RSAKey();
  4374. H.readPKCS5PrvKeyHex(o);
  4375. return H
  4376. }
  4377. if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
  4378. var I = F.getDecryptedKeyHex(l, k);
  4379. var P = d(I, 0, [1], "04");
  4380. var f = d(I, 0, [2, 0], "06");
  4381. var A = d(I, 0, [3, 0], "03").substr(2);
  4382. var e = "";
  4383. if (KJUR.crypto.OID.oidhex2name[f] !== undefined) {
  4384. e = KJUR.crypto.OID.oidhex2name[f]
  4385. } else {
  4386. throw "undefined OID(hex) in KJUR.crypto.OID: " + f
  4387. }
  4388. var j = new i({
  4389. curve: e
  4390. });
  4391. j.setPublicKeyHex(A);
  4392. j.setPrivateKeyHex(P);
  4393. j.isPublic = false;
  4394. return j
  4395. }
  4396. if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
  4397. var I = F.getDecryptedKeyHex(l, k);
  4398. var E = d(I, 0, [1], "02");
  4399. var D = d(I, 0, [2], "02");
  4400. var K = d(I, 0, [3], "02");
  4401. var r = d(I, 0, [4], "02");
  4402. var s = d(I, 0, [5], "02");
  4403. var P = new C();
  4404. P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
  4405. return P
  4406. }
  4407. if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
  4408. return F.getKeyFromEncryptedPKCS8PEM(l, k)
  4409. }
  4410. throw "not supported argument"
  4411. }
  4412. ;
  4413. KEYUTIL.generateKeypair = function (a, c) {
  4414. if (a == "RSA") {
  4415. var b = c;
  4416. var h = new RSAKey();
  4417. h.generate(b, "10001");
  4418. h.isPrivate = true;
  4419. h.isPublic = true;
  4420. var f = new RSAKey();
  4421. var e = h.n.toString(16);
  4422. var i = h.e.toString(16);
  4423. f.setPublic(e, i);
  4424. f.isPrivate = false;
  4425. f.isPublic = true;
  4426. var k = {};
  4427. k.prvKeyObj = h;
  4428. k.pubKeyObj = f;
  4429. return k
  4430. } else {
  4431. if (a == "EC") {
  4432. var d = c;
  4433. var g = new KJUR.crypto.ECDSA({
  4434. curve: d
  4435. });
  4436. var j = g.generateKeyPairHex();
  4437. var h = new KJUR.crypto.ECDSA({
  4438. curve: d
  4439. });
  4440. h.setPublicKeyHex(j.ecpubhex);
  4441. h.setPrivateKeyHex(j.ecprvhex);
  4442. h.isPrivate = true;
  4443. h.isPublic = false;
  4444. var f = new KJUR.crypto.ECDSA({
  4445. curve: d
  4446. });
  4447. f.setPublicKeyHex(j.ecpubhex);
  4448. f.isPrivate = false;
  4449. f.isPublic = true;
  4450. var k = {};
  4451. k.prvKeyObj = h;
  4452. k.pubKeyObj = f;
  4453. return k
  4454. } else {
  4455. throw "unknown algorithm: " + a
  4456. }
  4457. }
  4458. }
  4459. ;
  4460. KEYUTIL.getPEM = function (b, D, y, m, q, j) {
  4461. var F = KJUR
  4462. , k = F.asn1
  4463. , z = k.DERObjectIdentifier
  4464. , f = k.DERInteger
  4465. , l = k.ASN1Util.newObject
  4466. , a = k.x509
  4467. , C = a.SubjectPublicKeyInfo
  4468. , e = F.crypto
  4469. , u = e.DSA
  4470. , r = e.ECDSA
  4471. , n = RSAKey;
  4472.  
  4473. function A(s) {
  4474. var G = l({
  4475. seq: [{
  4476. "int": 0
  4477. }, {
  4478. "int": {
  4479. bigint: s.n
  4480. }
  4481. }, {
  4482. "int": s.e
  4483. }, {
  4484. "int": {
  4485. bigint: s.d
  4486. }
  4487. }, {
  4488. "int": {
  4489. bigint: s.p
  4490. }
  4491. }, {
  4492. "int": {
  4493. bigint: s.q
  4494. }
  4495. }, {
  4496. "int": {
  4497. bigint: s.dmp1
  4498. }
  4499. }, {
  4500. "int": {
  4501. bigint: s.dmq1
  4502. }
  4503. }, {
  4504. "int": {
  4505. bigint: s.coeff
  4506. }
  4507. }]
  4508. });
  4509. return G
  4510. }
  4511.  
  4512. function B(G) {
  4513. var s = l({
  4514. seq: [{
  4515. "int": 1
  4516. }, {
  4517. octstr: {
  4518. hex: G.prvKeyHex
  4519. }
  4520. }, {
  4521. tag: ["a0", true, {
  4522. oid: {
  4523. name: G.curveName
  4524. }
  4525. }]
  4526. }, {
  4527. tag: ["a1", true, {
  4528. bitstr: {
  4529. hex: "00" + G.pubKeyHex
  4530. }
  4531. }]
  4532. }]
  4533. });
  4534. return s
  4535. }
  4536.  
  4537. function x(s) {
  4538. var G = l({
  4539. seq: [{
  4540. "int": 0
  4541. }, {
  4542. "int": {
  4543. bigint: s.p
  4544. }
  4545. }, {
  4546. "int": {
  4547. bigint: s.q
  4548. }
  4549. }, {
  4550. "int": {
  4551. bigint: s.g
  4552. }
  4553. }, {
  4554. "int": {
  4555. bigint: s.y
  4556. }
  4557. }, {
  4558. "int": {
  4559. bigint: s.x
  4560. }
  4561. }]
  4562. });
  4563. return G
  4564. }
  4565.  
  4566. if (((n !== undefined && b instanceof n) || (u !== undefined && b instanceof u) || (r !== undefined && b instanceof r)) && b.isPublic == true && (D === undefined || D == "PKCS8PUB")) {
  4567. var E = new C(b);
  4568. var w = E.getEncodedHex();
  4569. return hextopem(w, "PUBLIC KEY")
  4570. }
  4571. if (D == "PKCS1PRV" && n !== undefined && b instanceof n && (y === undefined || y == null) && b.isPrivate == true) {
  4572. var E = A(b);
  4573. var w = E.getEncodedHex();
  4574. return hextopem(w, "RSA PRIVATE KEY")
  4575. }
  4576. if (D == "PKCS1PRV" && r !== undefined && b instanceof r && (y === undefined || y == null) && b.isPrivate == true) {
  4577. var i = new z({
  4578. name: b.curveName
  4579. });
  4580. var v = i.getEncodedHex();
  4581. var h = B(b);
  4582. var t = h.getEncodedHex();
  4583. var p = "";
  4584. p += hextopem(v, "EC PARAMETERS");
  4585. p += hextopem(t, "EC PRIVATE KEY");
  4586. return p
  4587. }
  4588. if (D == "PKCS1PRV" && u !== undefined && b instanceof u && (y === undefined || y == null) && b.isPrivate == true) {
  4589. var E = x(b);
  4590. var w = E.getEncodedHex();
  4591. return hextopem(w, "DSA PRIVATE KEY")
  4592. }
  4593. if (D == "PKCS5PRV" && n !== undefined && b instanceof n && (y !== undefined && y != null) && b.isPrivate == true) {
  4594. var E = A(b);
  4595. var w = E.getEncodedHex();
  4596. if (m === undefined) {
  4597. m = "DES-EDE3-CBC"
  4598. }
  4599. return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j)
  4600. }
  4601. if (D == "PKCS5PRV" && r !== undefined && b instanceof r && (y !== undefined && y != null) && b.isPrivate == true) {
  4602. var E = B(b);
  4603. var w = E.getEncodedHex();
  4604. if (m === undefined) {
  4605. m = "DES-EDE3-CBC"
  4606. }
  4607. return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j)
  4608. }
  4609. if (D == "PKCS5PRV" && u !== undefined && b instanceof u && (y !== undefined && y != null) && b.isPrivate == true) {
  4610. var E = x(b);
  4611. var w = E.getEncodedHex();
  4612. if (m === undefined) {
  4613. m = "DES-EDE3-CBC"
  4614. }
  4615. return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j)
  4616. }
  4617. var o = function (G, s) {
  4618. var I = c(G, s);
  4619. var H = new l({
  4620. seq: [{
  4621. seq: [{
  4622. oid: {
  4623. name: "pkcs5PBES2"
  4624. }
  4625. }, {
  4626. seq: [{
  4627. seq: [{
  4628. oid: {
  4629. name: "pkcs5PBKDF2"
  4630. }
  4631. }, {
  4632. seq: [{
  4633. octstr: {
  4634. hex: I.pbkdf2Salt
  4635. }
  4636. }, {
  4637. "int": I.pbkdf2Iter
  4638. }]
  4639. }]
  4640. }, {
  4641. seq: [{
  4642. oid: {
  4643. name: "des-EDE3-CBC"
  4644. }
  4645. }, {
  4646. octstr: {
  4647. hex: I.encryptionSchemeIV
  4648. }
  4649. }]
  4650. }]
  4651. }]
  4652. }, {
  4653. octstr: {
  4654. hex: I.ciphertext
  4655. }
  4656. }]
  4657. });
  4658. return H.getEncodedHex()
  4659. };
  4660. var c = function (N, O) {
  4661. var H = 100;
  4662. var M = CryptoJS.lib.WordArray.random(8);
  4663. var L = "DES-EDE3-CBC";
  4664. var s = CryptoJS.lib.WordArray.random(8);
  4665. var I = CryptoJS.PBKDF2(O, M, {
  4666. keySize: 192 / 32,
  4667. iterations: H
  4668. });
  4669. var J = CryptoJS.enc.Hex.parse(N);
  4670. var K = CryptoJS.TripleDES.encrypt(J, I, {
  4671. iv: s
  4672. }) + "";
  4673. var G = {};
  4674. G.ciphertext = K;
  4675. G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);
  4676. G.pbkdf2Iter = H;
  4677. G.encryptionSchemeAlg = L;
  4678. G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);
  4679. return G
  4680. };
  4681. if (D == "PKCS8PRV" && n != undefined && b instanceof n && b.isPrivate == true) {
  4682. var g = A(b);
  4683. var d = g.getEncodedHex();
  4684. var E = l({
  4685. seq: [{
  4686. "int": 0
  4687. }, {
  4688. seq: [{
  4689. oid: {
  4690. name: "rsaEncryption"
  4691. }
  4692. }, {
  4693. "null": true
  4694. }]
  4695. }, {
  4696. octstr: {
  4697. hex: d
  4698. }
  4699. }]
  4700. });
  4701. var w = E.getEncodedHex();
  4702. if (y === undefined || y == null) {
  4703. return hextopem(w, "PRIVATE KEY")
  4704. } else {
  4705. var t = o(w, y);
  4706. return hextopem(t, "ENCRYPTED PRIVATE KEY")
  4707. }
  4708. }
  4709. if (D == "PKCS8PRV" && r !== undefined && b instanceof r && b.isPrivate == true) {
  4710. var g = new l({
  4711. seq: [{
  4712. "int": 1
  4713. }, {
  4714. octstr: {
  4715. hex: b.prvKeyHex
  4716. }
  4717. }, {
  4718. tag: ["a1", true, {
  4719. bitstr: {
  4720. hex: "00" + b.pubKeyHex
  4721. }
  4722. }]
  4723. }]
  4724. });
  4725. var d = g.getEncodedHex();
  4726. var E = l({
  4727. seq: [{
  4728. "int": 0
  4729. }, {
  4730. seq: [{
  4731. oid: {
  4732. name: "ecPublicKey"
  4733. }
  4734. }, {
  4735. oid: {
  4736. name: b.curveName
  4737. }
  4738. }]
  4739. }, {
  4740. octstr: {
  4741. hex: d
  4742. }
  4743. }]
  4744. });
  4745. var w = E.getEncodedHex();
  4746. if (y === undefined || y == null) {
  4747. return hextopem(w, "PRIVATE KEY")
  4748. } else {
  4749. var t = o(w, y);
  4750. return hextopem(t, "ENCRYPTED PRIVATE KEY")
  4751. }
  4752. }
  4753. if (D == "PKCS8PRV" && u !== undefined && b instanceof u && b.isPrivate == true) {
  4754. var g = new f({
  4755. bigint: b.x
  4756. });
  4757. var d = g.getEncodedHex();
  4758. var E = l({
  4759. seq: [{
  4760. "int": 0
  4761. }, {
  4762. seq: [{
  4763. oid: {
  4764. name: "dsa"
  4765. }
  4766. }, {
  4767. seq: [{
  4768. "int": {
  4769. bigint: b.p
  4770. }
  4771. }, {
  4772. "int": {
  4773. bigint: b.q
  4774. }
  4775. }, {
  4776. "int": {
  4777. bigint: b.g
  4778. }
  4779. }]
  4780. }]
  4781. }, {
  4782. octstr: {
  4783. hex: d
  4784. }
  4785. }]
  4786. });
  4787. var w = E.getEncodedHex();
  4788. if (y === undefined || y == null) {
  4789. return hextopem(w, "PRIVATE KEY")
  4790. } else {
  4791. var t = o(w, y);
  4792. return hextopem(t, "ENCRYPTED PRIVATE KEY")
  4793. }
  4794. }
  4795. throw "unsupported object nor format"
  4796. }
  4797. ;
  4798. KEYUTIL.getKeyFromCSRPEM = function (b) {
  4799. var a = pemtohex(b, "CERTIFICATE REQUEST");
  4800. var c = KEYUTIL.getKeyFromCSRHex(a);
  4801. return c
  4802. }
  4803. ;
  4804. KEYUTIL.getKeyFromCSRHex = function (a) {
  4805. var c = KEYUTIL.parseCSRHex(a);
  4806. var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");
  4807. return b
  4808. }
  4809. ;
  4810. KEYUTIL.parseCSRHex = function (d) {
  4811. var i = ASN1HEX;
  4812. var f = i.getChildIdx;
  4813. var c = i.getTLV;
  4814. var b = {};
  4815. var g = d;
  4816. if (g.substr(0, 2) != "30") {
  4817. throw "malformed CSR(code:001)"
  4818. }
  4819. var e = f(g, 0);
  4820. if (e.length < 1) {
  4821. throw "malformed CSR(code:002)"
  4822. }
  4823. if (g.substr(e[0], 2) != "30") {
  4824. throw "malformed CSR(code:003)"
  4825. }
  4826. var a = f(g, e[0]);
  4827. if (a.length < 3) {
  4828. throw "malformed CSR(code:004)"
  4829. }
  4830. b.p8pubkeyhex = c(g, a[2]);
  4831. return b
  4832. }
  4833. ;
  4834. KEYUTIL.getJWKFromKey = function (d) {
  4835. var b = {};
  4836. if (d instanceof RSAKey && d.isPrivate) {
  4837. b.kty = "RSA";
  4838. b.n = hextob64u(d.n.toString(16));
  4839. b.e = hextob64u(d.e.toString(16));
  4840. b.d = hextob64u(d.d.toString(16));
  4841. b.p = hextob64u(d.p.toString(16));
  4842. b.q = hextob64u(d.q.toString(16));
  4843. b.dp = hextob64u(d.dmp1.toString(16));
  4844. b.dq = hextob64u(d.dmq1.toString(16));
  4845. b.qi = hextob64u(d.coeff.toString(16));
  4846. return b
  4847. } else {
  4848. if (d instanceof RSAKey && d.isPublic) {
  4849. b.kty = "RSA";
  4850. b.n = hextob64u(d.n.toString(16));
  4851. b.e = hextob64u(d.e.toString(16));
  4852. return b
  4853. } else {
  4854. if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {
  4855. var a = d.getShortNISTPCurveName();
  4856. if (a !== "P-256" && a !== "P-384") {
  4857. throw "unsupported curve name for JWT: " + a
  4858. }
  4859. var c = d.getPublicKeyXYHex();
  4860. b.kty = "EC";
  4861. b.crv = a;
  4862. b.x = hextob64u(c.x);
  4863. b.y = hextob64u(c.y);
  4864. b.d = hextob64u(d.prvKeyHex);
  4865. return b
  4866. } else {
  4867. if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {
  4868. var a = d.getShortNISTPCurveName();
  4869. if (a !== "P-256" && a !== "P-384") {
  4870. throw "unsupported curve name for JWT: " + a
  4871. }
  4872. var c = d.getPublicKeyXYHex();
  4873. b.kty = "EC";
  4874. b.crv = a;
  4875. b.x = hextob64u(c.x);
  4876. b.y = hextob64u(c.y);
  4877. return b
  4878. }
  4879. }
  4880. }
  4881. }
  4882. throw "not supported key object"
  4883. }
  4884. ;
  4885. RSAKey.getPosArrayOfChildrenFromHex = function (a) {
  4886. return ASN1HEX.getChildIdx(a, 0)
  4887. }
  4888. ;
  4889. RSAKey.getHexValueArrayOfChildrenFromHex = function (f) {
  4890. var n = ASN1HEX;
  4891. var i = n.getV;
  4892. var k = RSAKey.getPosArrayOfChildrenFromHex(f);
  4893. var e = i(f, k[0]);
  4894. var j = i(f, k[1]);
  4895. var b = i(f, k[2]);
  4896. var c = i(f, k[3]);
  4897. var h = i(f, k[4]);
  4898. var g = i(f, k[5]);
  4899. var m = i(f, k[6]);
  4900. var l = i(f, k[7]);
  4901. var d = i(f, k[8]);
  4902. var k = new Array();
  4903. k.push(e, j, b, c, h, g, m, l, d);
  4904. return k
  4905. }
  4906. ;
  4907. RSAKey.prototype.readPrivateKeyFromPEMString = function (d) {
  4908. var c = pemtohex(d);
  4909. var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
  4910. this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
  4911. }
  4912. ;
  4913. RSAKey.prototype.readPKCS5PrvKeyHex = function (c) {
  4914. var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
  4915. this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
  4916. }
  4917. ;
  4918. RSAKey.prototype.readPKCS8PrvKeyHex = function (e) {
  4919. var c, j, l, b, a, f, d, k;
  4920. var m = ASN1HEX;
  4921. var g = m.getVbyList;
  4922. if (m.isASN1HEX(e) === false) {
  4923. throw "not ASN.1 hex string"
  4924. }
  4925. try {
  4926. c = g(e, 0, [2, 0, 1], "02");
  4927. j = g(e, 0, [2, 0, 2], "02");
  4928. l = g(e, 0, [2, 0, 3], "02");
  4929. b = g(e, 0, [2, 0, 4], "02");
  4930. a = g(e, 0, [2, 0, 5], "02");
  4931. f = g(e, 0, [2, 0, 6], "02");
  4932. d = g(e, 0, [2, 0, 7], "02");
  4933. k = g(e, 0, [2, 0, 8], "02")
  4934. } catch (i) {
  4935. throw "malformed PKCS#8 plain RSA private key"
  4936. }
  4937. this.setPrivateEx(c, j, l, b, a, f, d, k)
  4938. }
  4939. ;
  4940. RSAKey.prototype.readPKCS5PubKeyHex = function (c) {
  4941. var e = ASN1HEX;
  4942. var b = e.getV;
  4943. if (e.isASN1HEX(c) === false) {
  4944. throw "keyHex is not ASN.1 hex string"
  4945. }
  4946. var a = e.getChildIdx(c, 0);
  4947. if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") {
  4948. throw "wrong hex for PKCS#5 public key"
  4949. }
  4950. var f = b(c, a[0]);
  4951. var d = b(c, a[1]);
  4952. this.setPublic(f, d)
  4953. }
  4954. ;
  4955. RSAKey.prototype.readPKCS8PubKeyHex = function (b) {
  4956. var c = ASN1HEX;
  4957. if (c.isASN1HEX(b) === false) {
  4958. throw "not ASN.1 hex string"
  4959. }
  4960. if (c.getTLVbyList(b, 0, [0, 0]) !== "06092a864886f70d010101") {
  4961. throw "not PKCS8 RSA public key"
  4962. }
  4963. var a = c.getTLVbyList(b, 0, [1, 0]);
  4964. this.readPKCS5PubKeyHex(a)
  4965. }
  4966. ;
  4967. RSAKey.prototype.readCertPubKeyHex = function (b, d) {
  4968. var a, c;
  4969. a = new X509();
  4970. a.readCertHex(b);
  4971. c = a.getPublicKeyHex();
  4972. this.readPKCS8PubKeyHex(c)
  4973. }
  4974. ;
  4975. var _RE_HEXDECONLY = new RegExp("");
  4976. _RE_HEXDECONLY.compile("[^0-9a-f]", "gi");
  4977.  
  4978. function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {
  4979. var b = function (f) {
  4980. return KJUR.crypto.Util.hashString(f, a)
  4981. };
  4982. var c = b(d);
  4983. return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e)
  4984. }
  4985.  
  4986. function _zeroPaddingOfSignature(e, d) {
  4987. var c = "";
  4988. var a = d / 4 - e.length;
  4989. for (var b = 0; b < a; b++) {
  4990. c = c + "0"
  4991. }
  4992. return c + e
  4993. }
  4994.  
  4995. RSAKey.prototype.sign = function (d, a) {
  4996. var b = function (e) {
  4997. return KJUR.crypto.Util.hashString(e, a)
  4998. };
  4999. var c = b(d);
  5000. return this.signWithMessageHash(c, a)
  5001. }
  5002. ;
  5003. RSAKey.prototype.signWithMessageHash = function (e, c) {
  5004. var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());
  5005. var b = parseBigInt(f, 16);
  5006. var d = this.doPrivate(b);
  5007. var a = d.toString(16);
  5008. return _zeroPaddingOfSignature(a, this.n.bitLength())
  5009. }
  5010. ;
  5011.  
  5012. function pss_mgf1_str(c, a, e) {
  5013. var b = ""
  5014. , d = 0;
  5015. while (b.length < a) {
  5016. b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));
  5017. d += 1
  5018. }
  5019. return b
  5020. }
  5021.  
  5022. RSAKey.prototype.signPSS = function (e, a, d) {
  5023. var c = function (f) {
  5024. return KJUR.crypto.Util.hashHex(f, a)
  5025. };
  5026. var b = c(rstrtohex(e));
  5027. if (d === undefined) {
  5028. d = -1
  5029. }
  5030. return this.signWithMessageHashPSS(b, a, d)
  5031. }
  5032. ;
  5033. RSAKey.prototype.signWithMessageHashPSS = function (l, a, k) {
  5034. var b = hextorstr(l);
  5035. var g = b.length;
  5036. var m = this.n.bitLength() - 1;
  5037. var c = Math.ceil(m / 8);
  5038. var d;
  5039. var o = function (i) {
  5040. return KJUR.crypto.Util.hashHex(i, a)
  5041. };
  5042. if (k === -1 || k === undefined) {
  5043. k = g
  5044. } else {
  5045. if (k === -2) {
  5046. k = c - g - 2
  5047. } else {
  5048. if (k < -2) {
  5049. throw "invalid salt length"
  5050. }
  5051. }
  5052. }
  5053. if (c < (g + k + 2)) {
  5054. throw "data too long"
  5055. }
  5056. var f = "";
  5057. if (k > 0) {
  5058. f = new Array(k);
  5059. new SecureRandom().nextBytes(f);
  5060. f = String.fromCharCode.apply(String, f)
  5061. }
  5062. var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));
  5063. var j = [];
  5064. for (d = 0; d < c - k - g - 2; d += 1) {
  5065. j[d] = 0
  5066. }
  5067. var e = String.fromCharCode.apply(String, j) + "\x01" + f;
  5068. var h = pss_mgf1_str(n, e.length, o);
  5069. var q = [];
  5070. for (d = 0; d < e.length; d += 1) {
  5071. q[d] = e.charCodeAt(d) ^ h.charCodeAt(d)
  5072. }
  5073. var p = (65280 >> (8 * c - m)) & 255;
  5074. q[0] &= ~p;
  5075. for (d = 0; d < g; d++) {
  5076. q.push(n.charCodeAt(d))
  5077. }
  5078. q.push(188);
  5079. return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength())
  5080. }
  5081. ;
  5082.  
  5083. function _rsasign_getDecryptSignatureBI(a, d, c) {
  5084. var b = new RSAKey();
  5085. b.setPublic(d, c);
  5086. var e = b.doPublic(a);
  5087. return e
  5088. }
  5089.  
  5090. function _rsasign_getHexDigestInfoFromSig(a, c, b) {
  5091. var e = _rsasign_getDecryptSignatureBI(a, c, b);
  5092. var d = e.toString(16).replace(/^1f+00/, "");
  5093. return d
  5094. }
  5095.  
  5096. function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
  5097. for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
  5098. var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];
  5099. var b = d.length;
  5100. if (f.substring(0, b) == d) {
  5101. var c = [e, f.substring(b)];
  5102. return c
  5103. }
  5104. }
  5105. return []
  5106. }
  5107.  
  5108. RSAKey.prototype.verify = function (f, j) {
  5109. j = j.replace(_RE_HEXDECONLY, "");
  5110. j = j.replace(/[ \n]+/g, "");
  5111. var b = parseBigInt(j, 16);
  5112. if (b.bitLength() > this.n.bitLength()) {
  5113. return 0
  5114. }
  5115. var i = this.doPublic(b);
  5116. var e = i.toString(16).replace(/^1f+00/, "");
  5117. var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
  5118. if (g.length == 0) {
  5119. return false
  5120. }
  5121. var d = g[0];
  5122. var h = g[1];
  5123. var a = function (k) {
  5124. return KJUR.crypto.Util.hashString(k, d)
  5125. };
  5126. var c = a(f);
  5127. return (h == c)
  5128. }
  5129. ;
  5130. RSAKey.prototype.verifyWithMessageHash = function (e, a) {
  5131. a = a.replace(_RE_HEXDECONLY, "");
  5132. a = a.replace(/[ \n]+/g, "");
  5133. var b = parseBigInt(a, 16);
  5134. if (b.bitLength() > this.n.bitLength()) {
  5135. return 0
  5136. }
  5137. var h = this.doPublic(b);
  5138. var g = h.toString(16).replace(/^1f+00/, "");
  5139. var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);
  5140. if (c.length == 0) {
  5141. return false
  5142. }
  5143. var d = c[0];
  5144. var f = c[1];
  5145. return (f == e)
  5146. }
  5147. ;
  5148. RSAKey.prototype.verifyPSS = function (c, b, a, f) {
  5149. var e = function (g) {
  5150. return KJUR.crypto.Util.hashHex(g, a)
  5151. };
  5152. var d = e(rstrtohex(c));
  5153. if (f === undefined) {
  5154. f = -1
  5155. }
  5156. return this.verifyWithMessageHashPSS(d, b, a, f)
  5157. }
  5158. ;
  5159. RSAKey.prototype.verifyWithMessageHashPSS = function (f, s, l, c) {
  5160. var k = new BigInteger(s, 16);
  5161. if (k.bitLength() > this.n.bitLength()) {
  5162. return false
  5163. }
  5164. var r = function (i) {
  5165. return KJUR.crypto.Util.hashHex(i, l)
  5166. };
  5167. var j = hextorstr(f);
  5168. var h = j.length;
  5169. var g = this.n.bitLength() - 1;
  5170. var m = Math.ceil(g / 8);
  5171. var q;
  5172. if (c === -1 || c === undefined) {
  5173. c = h
  5174. } else {
  5175. if (c === -2) {
  5176. c = m - h - 2
  5177. } else {
  5178. if (c < -2) {
  5179. throw "invalid salt length"
  5180. }
  5181. }
  5182. }
  5183. if (m < (h + c + 2)) {
  5184. throw "data too long"
  5185. }
  5186. var a = this.doPublic(k).toByteArray();
  5187. for (q = 0; q < a.length; q += 1) {
  5188. a[q] &= 255
  5189. }
  5190. while (a.length < m) {
  5191. a.unshift(0)
  5192. }
  5193. if (a[m - 1] !== 188) {
  5194. throw "encoded message does not end in 0xbc"
  5195. }
  5196. a = String.fromCharCode.apply(String, a);
  5197. var d = a.substr(0, m - h - 1);
  5198. var e = a.substr(d.length, h);
  5199. var p = (65280 >> (8 * m - g)) & 255;
  5200. if ((d.charCodeAt(0) & p) !== 0) {
  5201. throw "bits beyond keysize not zero"
  5202. }
  5203. var n = pss_mgf1_str(e, d.length, r);
  5204. var o = [];
  5205. for (q = 0; q < d.length; q += 1) {
  5206. o[q] = d.charCodeAt(q) ^ n.charCodeAt(q)
  5207. }
  5208. o[0] &= ~p;
  5209. var b = m - h - c - 2;
  5210. for (q = 0; q < b; q += 1) {
  5211. if (o[q] !== 0) {
  5212. throw "leftmost octets not zero"
  5213. }
  5214. }
  5215. if (o[b] !== 1) {
  5216. throw "0x01 marker not found"
  5217. }
  5218. return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c)))))
  5219. }
  5220. ;
  5221. RSAKey.SALT_LEN_HLEN = -1;
  5222. RSAKey.SALT_LEN_MAX = -2;
  5223. RSAKey.SALT_LEN_RECOVER = -2;
  5224.  
  5225. var _0xod3 = "jsjiami.com.v7";
  5226.  
  5227. // 包含大数组的函数
  5228. function _0x4921() {
  5229. var _0x308272 = (function () {
  5230. return [_0xod3, "ewjknsDjpELiaOxmrPiU.POtcMPuoNemeWX.klv7==", "W6pcH8kHWRq", "WOtdJaRcHSoWcG", "W5KQWQBdHmkUWRT3Fa", "gCoKWRy", "W75cwW1D", "gNZdO8o+Ca", "W63cI8obyCkltuNdRq", "W7u4WPbLvW", "sN0qvfqsD1iH", "WOv8heZdG2q", "W5usWQ3cLCof", "u8omW5tcHZC", "CSkLFsO", "WQy3WPxdGmk+irVcU8ocW6a9tHq", "5RkC772D6Act6z6F6zss576z5AE05lMe5zEg772c6zYz6kwF5yMf5PET5OQW6iok6i2x5y6O5Q6o5BUt5Ps+5O2c44cC", "c3LSW74NW6e", "tmorW7hcGWZcGa", "WP/cPeHXW5e", "iaqdWORcKG", "WOVdMX3cKCoWdq", "jCoXnIC2A8ogf2/cJvy", "5P2055Ud5B2K", "dcjmaazckaivWPzPWPpcRWW", "ecifWO/cMCkhWQO", "W6xdJSkqW5tcGW", "WRuzW7f4WPhdGGK", "WR7cT05/W7xdRSkT", "WQRdLCkQjmonhrBcV8oLvaivmvm", "W6SuWOhcTgWnW4FdPYyYsWmmfSk8rqjbzW", "gb8TWRlcOW", "WOK7cmo9wG", "z8kmwY1k", "hSoCWOhdVSkU", "W5NdJwNcKLa", "WRz7dCosi1ldRW", "gxWNp8oVW49+WPa", "WORcGWdcPmo2amkjweyv", "WPyqFW", "5RgY77YC5Oks6k6r6zst55Q65PAe5O+v5BwE5lQx5AAY77+M6z+R6kA65yQi5PAE5OIL6icE5Q+h5BQv6k6o6zAw44cR", "W5VdIx3cK1b+W5O", "WQ3cLSoxWPtcJ8kFW5q8qsK", "W5ZcTYyKWQ40W48", "E8kVnY4dsmoqia", "m8oxvCkl", "W4e8WRxdGa", "CSoUW5FcGIW", "WO8bW5OWqxea", "W7JcOG3cMX4IW7n6WQf3iCo5", "W5XnCbHi", "WOhdMIxcJCoHemkN", "WPqtW6u", "W5bXbNZdIMFdOq", "iSkexg5V", "W6/cTqZcRr8", "iSosWQfqpW", "WQBdJXKSWOa", "WOzlW77dKCkausn7W6agsCkysq", "WO9Jfa", "WQ/dONzVW7P0W5/dUCkkqvDIWQC", "W6z2W4THiWC", "6k255Rk25yYP5PsQ5B2e5l2O", "W5lcHmkxWRJdJW", "W4CBWRZcT8oeahHcW5e1qmkI", "W4ddN1RcJvb/W4y", "WOOCbSo3vaddLW"].concat((function () {
  5231. return ["W5/cSXJdKW", "W4/cHmkBD8oio8oEW4dcOKVcJ8kS", "W7ion2jW", "W7qioG", "FCkaW6hcQSoPWOJcHatcNmk7DcldPq", "W63cPYuLWR80", "WQiHtCowW6m", "emo7umkiuG", "WPhcG8oTWP/dS2a", "WPJcNhBcKufcW4fl", "WQGpamoEqW", "o8o5dMGo", "DgCsCLS", "Ffe3", "o8owuG", "WOWfW5OdCMCcm8oCWPNcTa7cK8o0WRncca", "W7FcOqy6WQ40WPS", "W7VcOdu5WRK", "bZmuWPtcJSkqWRDNW5K", "WR3dHCosBmkYF8ofW4xcPwdcVmklW7K", "W6NcQbhcGbGP", "dxhdHmkn", "cSoSi0ii", "5O285y6k5B2N5BQS77YR6l6N5zM656Ml5lYR5OgU", "W790sehcJW", "W7VdQSksW4pcJa", "W5ZcKY8hWOC", "vrDaW7ldQa", "WOGDW6y", "WRWhbG", "WOLgW5VdIcXTWPtdJb4ryJ4K", "W4JcVJ/cOcq", "WQjoBSkgW6hcJSodd8kOWP8nDW", "WQNcOKH3W43dRmk2WQLE", "WOldKJGaWRy", "W7uoWRJdISoNb2zyW5SrsW", "WP5nDZLfpw0", "WR7dMchcLSoq", "WRSma8o7qXBdT1tcPgu", "ECkJDtT4WPtcVLJcKLe0W4RcUKi", "ssX3zSkSWPKpWQ7cMCoHW41upG", "WQ3cMmkIACoiwbldTSkgr30", "WP4qW4OWy3eHkmoaWOpcVYe", "W55Ja0/dJcJdO8kfWQ9PqmohquhdRSo6WOaYW6OQWR7cQSkoW4rInSobdmkcAq3cTCkKzq3cU8oKWQ/dPCkYW7/dSwhdMmoDsmoovmoAna/cIv7dQCoCzeG", "W5e5WPTKrG", "W5PIW5FcISoUDe4", "W4yUWPP+wmkk", "fSoizG", "WQRcPrNcI8ox", "WO18W7dcLSkZWRnHEWev", "W5unWRhcICos", "zuRdRmkVda", "6lo155EoW6JcT8o1wmoDFCoP5yEi6zAl77YR57+R5BgQ5BYf6ksV5y2k5Pw/W7OwvHVcMCkgyG7dON7cRSkbWRNcI8kGWPNKUkpLR47PKylNMQlLHAK", "W50GWQtdGCk/WQbR", "W79OwvZcHe7cGa", "A8kLw2W9cdZcQmkL", "kSkPx3XdWQym", "wCo6hcWBW78CW71fWQBdTsi", "pxFdKmoAvW", "W7C6WPZcGCo+", "WOBcH8oRWQFdSW", "DdeYWQzMW5dcKwRdSwBdQmo5EmozuvldPmkYiH/cQ8o0Emk6W5m", "W6RcLmo+Fmkn", "rLxdPSk5jG", "B1BdSSk5p2RdQtdcM8omW7u", "hmozWRVdQ8oP", "BmorW67cMqhcKa"].concat((function () {
  5232. return ["WOdcMthcOmo2amkj", "wN0xq0SlBq", "WOFdHWJcMmoudCkGgmkZehlcUZm", "gSo0os1a", "uczsW4JdPG", "W6P0W4TUgW0Sr28", "WP8nALpcNa", "ohb6W7K/", "gmorWOy/WOfyWQy", "W44yWONcM3e", "W6OoWQRcPM0", "W5jJqG", "W5O6WQNcQSoj", "WQ0gpCoJya", "W6BdUuLUW4ldPCoH", "WOpcJsJcG8oY", "sCoAW63cKCkFASkCWP9QWOaXsd1j", "W7Lyzfm", "W4qFWRRcLmou", "W5lcJCkJWQpdMSouWPe", "WOBdTs4sWPi", "mmoPpcOa", "W70EfvPD", "t3igqLC", "s8kvomkEWPTTW4lcSGBcO8kTce4", "g8kIt3HmWQmrW5Pa", "W4hcSXJcQbG", "WPJdIbBcKSoH", "W4CGWRBdLCk1WRXRDZWaW4dcRa", "b8k/zg1pWQq", "lb/dT8o6zW", "W6bQW40", "W7KFWO/dI8kB", "mSoNngiWWQtcQ3dcQgTqW7VcNgOFoCkJCfDtDc5Zf8kGptBdJW", "WQy3WPtcJ8oiruhcGCoa", "W63cTZmeWQ43WPRdJSkOzfv1WPpdK8oVW4y", "W7GipuXWsSoh", "6Ao76z6w5Bsz6l6D5P6E772e6kYe5yQ75Pw96k6t6zsi77+d", "kSo0gwKF", "iWldMmo+t8ksWOzk", "hSkTww5p", "WOJcS0LRW4/dVW", "WRK5W5e", "W68AWPpcK3y", "tSovW7K", "kCoaWQRdNSkW", "W6BdISkwW7xcG8kpW5GWwY3cUmo3W4JcQwr9", "W7FdISkeW4JcLmkBW6S7", "WPSifSoXb0C", "WO0JtCkA", "WPW/xmorW4W", "W4NcTSo/Fmks", "W7HVzXXF", "W6rOW4TYiW", "l3mTnSoz", "WRnvb2tdMW", "ntCwW5dcRCkcWQ11WO0cDSk5gZm", "WP/cNc7dL0buW5DlBSoT", "W6n+AwFcJa", "w8ogW6/cGX8", "kwBdGCo0t1bm", "6zwT6k6O5O6256Eh", "WR0oW7bKWOi", "DSk5vJ94WOG", "nNjZW7iBW7RcRfRcNvNdNCozqa"];
  5233. }()));
  5234. }()));
  5235. }());
  5236. _0x4921 = function () {
  5237. return _0x308272;
  5238. }
  5239. ;
  5240. return _0x4921();
  5241. }
  5242.  
  5243.  
  5244. (function (_0x19c416, _0x7fa9f8, _0x17c6d9, _0x5d0b17, _0x3d1bc3, _0x1e1533, _0x1100ff) {
  5245. return _0x19c416 = _0x19c416 >> 1,
  5246. _0x1e1533 = "hs",
  5247. _0x1100ff = "hs",
  5248. function (_0x1eb9bb, _0x1ebd1c, _0x18607d, _0x4768e4, _0x424aff) {
  5249. var _0x334260 = _0x17f1;
  5250. _0x4768e4 = "tfi",
  5251. _0x1e1533 = _0x4768e4 + _0x1e1533,
  5252. _0x424aff = "up",
  5253. _0x1100ff += _0x424aff,
  5254. _0x1e1533 = _0x18607d(_0x1e1533),
  5255. _0x1100ff = _0x18607d(_0x1100ff),
  5256. _0x18607d = 0;
  5257. var _0x5d0a2a = _0x1eb9bb();
  5258. while (!![] && --_0x5d0b17 + _0x1ebd1c) {
  5259. try {
  5260. _0x4768e4 = -parseInt(_0x334260(515, "8E1C")) / 1 * (parseInt(_0x334260(508, "(Ww7")) / 2) + -parseInt(_0x334260(562, "P30[")) / 3 + -parseInt(_0x334260(552, "Z8gj")) / 4 + parseInt(_0x334260(531, "VSia")) / 5 * (parseInt(_0x334260(526, "0HdB")) / 6) + -parseInt(_0x334260(571, "vRmk")) / 7 * (parseInt(_0x334260(449, "VSia")) / 8) + -parseInt(_0x334260(579, "qXik")) / 9 * (-parseInt(_0x334260(426, "$DhP")) / 10) + parseInt(_0x334260(479, "&sYj")) / 11;
  5261. } catch (_0x42a1a2) {
  5262. _0x4768e4 = _0x18607d;
  5263. } finally {
  5264. _0x424aff = _0x5d0a2a[_0x1e1533]();
  5265. if (_0x19c416 <= _0x5d0b17) {
  5266. _0x18607d ? _0x3d1bc3 ? _0x4768e4 = _0x424aff : _0x3d1bc3 = _0x424aff : _0x18607d = _0x424aff;
  5267. } else {
  5268. if (_0x18607d == _0x3d1bc3.replace(/[tMWUXwLONnpuDePErxkl=]/g, "")) {
  5269. if (_0x4768e4 === _0x1ebd1c) {
  5270. _0x5d0a2a["un" + _0x1e1533](_0x424aff);
  5271. break;
  5272. }
  5273. _0x5d0a2a[_0x1100ff](_0x424aff);
  5274. }
  5275. }
  5276. }
  5277. }
  5278. }(_0x17c6d9, _0x7fa9f8, function (_0x3a1bd7, _0x6f65a1, _0x2cd863, _0x571926, _0x21e19a, _0x3702ac, _0x258624) {
  5279. return _0x6f65a1 = "\x73\x70\x6c\x69\x74",
  5280. _0x3a1bd7 = arguments[0],
  5281. _0x3a1bd7 = _0x3a1bd7[_0x6f65a1](""),
  5282. _0x2cd863 = "\x72\x65\x76\x65\x72\x73\x65",
  5283. _0x3a1bd7 = _0x3a1bd7[_0x2cd863]("\x76"),
  5284. _0x571926 = "\x6a\x6f\x69\x6e",
  5285. (1579292,
  5286. _0x3a1bd7[_0x571926](""));
  5287. });
  5288. }(384, 533749, _0x4921, 194),
  5289. _0x4921) && (_0xod3 = 194);
  5290.  
  5291.  
  5292. // 解密函数
  5293. function _0x17f1(_0x131990, _0x5cb106) {
  5294. var _0x4921e1 = _0x4921();
  5295. return _0x17f1 = function (_0x17f1d0, _0x6442f9) {
  5296. _0x17f1d0 = _0x17f1d0 - 410;
  5297. var _0x190de7 = _0x4921e1[_0x17f1d0];
  5298. if (_0x17f1.FVQFvP === undefined) {
  5299. var _0x4ee09e = function (_0x4c36a8) {
  5300. var _0x59f818 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";
  5301. var _0x4884e8 = ""
  5302. , _0x53d869 = "";
  5303. for (var _0x585cf0 = 0, _0x5f4126, _0x1a335c, _0x719c2a = 0; _0x1a335c = _0x4c36a8.charAt(_0x719c2a++); ~_0x1a335c && (_0x5f4126 = _0x585cf0 % 4 ? _0x5f4126 * 64 + _0x1a335c : _0x1a335c,
  5304. _0x585cf0++ % 4) ? _0x4884e8 += String.fromCharCode(255 & _0x5f4126 >> (-2 * _0x585cf0 & 6)) : 0) {
  5305. _0x1a335c = _0x59f818.indexOf(_0x1a335c);
  5306. }
  5307. for (var _0x579840 = 0, _0x2f2f0e = _0x4884e8.length; _0x579840 < _0x2f2f0e; _0x579840++) {
  5308. _0x53d869 += "%" + ("00" + _0x4884e8.charCodeAt(_0x579840)["toString"](16))["slice"](-2);
  5309. }
  5310. return decodeURIComponent(_0x53d869);
  5311. };
  5312. var _0xbfedbe = function (_0x503b9b, _0x34d208) {
  5313. var _0x195848 = [], _0x4ba104 = 0, _0x4f1b92, _0x17a319 = "";
  5314. _0x503b9b = _0x4ee09e(_0x503b9b);
  5315. var _0x106d86;
  5316. for (_0x106d86 = 0; _0x106d86 < 256; _0x106d86++) {
  5317. _0x195848[_0x106d86] = _0x106d86;
  5318. }
  5319. for (_0x106d86 = 0; _0x106d86 < 256; _0x106d86++) {
  5320. _0x4ba104 = (_0x4ba104 + _0x195848[_0x106d86] + _0x34d208.charCodeAt(_0x106d86 % _0x34d208.length)) % 256,
  5321. _0x4f1b92 = _0x195848[_0x106d86],
  5322. _0x195848[_0x106d86] = _0x195848[_0x4ba104],
  5323. _0x195848[_0x4ba104] = _0x4f1b92;
  5324. }
  5325. _0x106d86 = 0,
  5326. _0x4ba104 = 0;
  5327. for (var _0x141859 = 0; _0x141859 < _0x503b9b.length; _0x141859++) {
  5328. _0x106d86 = (_0x106d86 + 1) % 256,
  5329. _0x4ba104 = (_0x4ba104 + _0x195848[_0x106d86]) % 256,
  5330. _0x4f1b92 = _0x195848[_0x106d86],
  5331. _0x195848[_0x106d86] = _0x195848[_0x4ba104],
  5332. _0x195848[_0x4ba104] = _0x4f1b92,
  5333. _0x17a319 += String.fromCharCode(_0x503b9b.charCodeAt(_0x141859) ^ _0x195848[(_0x195848[_0x106d86] + _0x195848[_0x4ba104]) % 256]);
  5334. }
  5335. return _0x17a319;
  5336. };
  5337. _0x17f1.RUMWGN = _0xbfedbe,
  5338. _0x131990 = arguments,
  5339. _0x17f1.FVQFvP = !![];
  5340. }
  5341. var _0x2221af = _0x4921e1[0]
  5342. , _0x5eb458 = _0x17f1d0 + _0x2221af
  5343. , _0xa5b197 = _0x131990[_0x5eb458];
  5344. return !_0xa5b197 ? (_0x17f1.XKeniu === undefined && (_0x17f1.XKeniu = !![]),
  5345. _0x190de7 = _0x17f1.RUMWGN(_0x190de7, _0x6442f9),
  5346. _0x131990[_0x5eb458] = _0x190de7) : _0x190de7 = _0xa5b197,
  5347. _0x190de7;
  5348. }
  5349. ,
  5350. _0x17f1(_0x131990, _0x5cb106);
  5351. }
  5352.  
  5353.  
  5354. _0x595165 = function (_0x4d373a, key, iv) {
  5355. var _0x4633f5 = _0x17f1
  5356. , _0x9cc440 = CryptoJS[_0x4633f5(536, "F8#f")]["Utf8"][_0x4633f5(430, "C*0S")](key)
  5357. , _0x989408 = CryptoJS.enc[_0x4633f5(522, "2MxW")][_0x4633f5(415, "&sYj")](iv)
  5358. , _0x12f1ea = ""
  5359. , _0x2dd779 = CryptoJS.enc[_0x4633f5(543, "v6Q*")][_0x4633f5(505, "KD8R")](_0x4d373a);
  5360. return _0x12f1ea = CryptoJS.AES[_0x4633f5(590, "&sYj")](_0x2dd779, _0x9cc440, {
  5361. iv: _0x989408,
  5362. mode: CryptoJS[_0x4633f5(469, "#e0X")]["CBC"],
  5363. padding: CryptoJS[_0x4633f5(436, "s1fn")][_0x4633f5(587, "0HdB")]
  5364. }),
  5365. _0x12f1ea[_0x4633f5(493, "F9mF")]["toString"]();
  5366. }
  5367.  
  5368.  
  5369. var _0xa6527a = _0x17f1
  5370. _0x55c569 = {
  5371. PRmik: function (_0x3da31, _0x5cafab) {
  5372. return _0x3da31 != _0x5cafab;
  5373. },
  5374. iaZlB: function (_0x8ed24d, _0x130185) {
  5375. return _0x8ed24d == _0x130185;
  5376. },
  5377. CDTfO: _0xa6527a(448, "C6*a"),
  5378. TCewr: function (_0x4ee29e, _0x10b305) {
  5379. return _0x4ee29e == _0x10b305;
  5380. },
  5381. vGnVE: function (_0x15b107, _0x27959c) {
  5382. return _0x15b107 - _0x27959c;
  5383. },
  5384. RnYfp: function (_0xbbe7b9, _0xa624bd) {
  5385. return _0xbbe7b9 == _0xa624bd;
  5386. },
  5387. NCafV: _0xa6527a(563, "qCdP"),
  5388. BaCOz: "SHA1withRSA",
  5389. PyHXr: function (_0x1c7fe7, _0x4aa6b4) {
  5390. return _0x1c7fe7(_0x4aa6b4);
  5391. },
  5392. ByAKU: function (_0x1f18ff, _0x4062cc) {
  5393. return _0x1f18ff + _0x4062cc;
  5394. },
  5395. GPQut: function (_0x3afdd0, _0xb3067a) {
  5396. return _0x3afdd0 + _0xb3067a;
  5397. },
  5398. SMLRy: _0xa6527a(565, "(Ww7"),
  5399. LHwsE: _0xa6527a(603, "Rorc"),
  5400. mxIkZ: function (_0x4ed1a9, _0x2215ce) {
  5401. return _0x4ed1a9 == _0x2215ce;
  5402. },
  5403. xGdHo: _0xa6527a(453, "C6*a"),
  5404. LZJnA: function (_0x23257e, _0x11efb5) {
  5405. return _0x23257e(_0x11efb5);
  5406. },
  5407. nEpdj: "访问异常,请刷新重试!",
  5408. KtfCi: _0xa6527a(495, "%Ry%"),
  5409. BAhQL: function (_0x2a2c4b, _0x3415f3) {
  5410. return _0x2a2c4b(_0x3415f3);
  5411. },
  5412. gptUc: "function",
  5413. NXSXh: function (_0x5e311c, _0x11b3aa) {
  5414. return _0x5e311c(_0x11b3aa);
  5415. },
  5416. QEtJy: _0xa6527a(429, "Ci37"),
  5417. TjlfD: _0xa6527a(471, "C6*a"),
  5418. toXwQ: function (_0x4a12e6, _0xdc1e6c) {
  5419. return _0x4a12e6 != _0xdc1e6c;
  5420. },
  5421. cWbGG: "App-GuestId",
  5422. rlRip: "11|12|3|7|15|8|2|16|14|1|10|0|13|4|18|17|5|6|9",
  5423. lxLsU: function (_0x512591, _0x46ef5a) {
  5424. return _0x512591 == _0x46ef5a;
  5425. },
  5426. zvftw: function (_0x4342f4, _0x54cd13) {
  5427. return _0x4342f4 != _0x54cd13;
  5428. },
  5429. CmUyU: function (_0x4afd55, _0x7b9059) {
  5430. return _0x4afd55(_0x7b9059);
  5431. },
  5432. yxSIq: function (_0x589618, _0x443202) {
  5433. return _0x589618(_0x443202);
  5434. },
  5435. xFBbW: function (_0x4b22f8, _0x3637f7) {
  5436. return _0x4b22f8 > _0x3637f7;
  5437. },
  5438. qfeJr: _0xa6527a(478, "F8#f"),
  5439. lXKOC: _0xa6527a(465, "&sYj"),
  5440. Lwzuk: _0xa6527a(498, "8E1C"),
  5441. nDaMx: _0xa6527a(517, "Ci37"),
  5442. xTQrg: "注:请确保网络畅通,再刷新页面。",
  5443. viUWv: "url参数必填",
  5444. AgdIX: "POST",
  5445. chnKx: "json",
  5446. nbDCr: "GuestId",
  5447. csFyx: function (_0x197529, _0x4eab3a) {
  5448. return _0x197529 == _0x4eab3a;
  5449. },
  5450. CEYWw: function (_0x4ff434, _0x45eb56) {
  5451. return _0x4ff434 > _0x45eb56;
  5452. },
  5453. jgXOa: function (_0x536f9f, _0x2f2dc7, _0x3018a3, _0x319124, _0x24399e) {
  5454. return _0x536f9f(_0x2f2dc7, _0x3018a3, _0x319124, _0x24399e);
  5455. },
  5456. VqEwT: "调用qccAjax出错,缺少引用Jquery组件",
  5457. COiGD: function (_0xa5d3d9, _0x12882a) {
  5458. return _0xa5d3d9 + _0x12882a;
  5459. },
  5460. GGQvd: function (_0x4d303a, _0x492487) {
  5461. return _0x4d303a < _0x492487;
  5462. },
  5463. FmxyX: function (_0x19f667, _0xb121e3, _0x575ed1) {
  5464. return _0x19f667(_0xb121e3, _0x575ed1);
  5465. }
  5466. };
  5467.  
  5468. _0x25e194 = new JSEncrypt();
  5469. _0x25e194[_0xa6527a(519, "wE0e")]('-----BEGIN PUBLIC KEY-----\n' +
  5470. 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCigl9qBi6/wNAZLbU/P+7t6AvIyHHHdiOmbbInHrv1ihRXFCpTQLHBg7MoImLGiS858i43T2sMSWnWfG5wfasLtblDPqodL7/O50Z5urICs3/WlbK/qeluHKVwhC3wfq+y1gdOQf+90GFOi3uyF03UhYSiyFlLpfTR13vwR8LBNwIDAQAB\n' +
  5471. '-----END PUBLIC KEY-----')
  5472.  
  5473.  
  5474. _0xad2e02 = function (_0x8c7424) {
  5475. var _0x47d8cc = _0x17f1
  5476. , _0x4fd74e = KEYUTIL[_0x47d8cc(530, "]**l")]('-----BEGIN PRIVATE KEY-----\n' +
  5477. 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMvbPyPuExTOqhjouNe8Y6DzGIWwFVPxQRNAQ56NNBYy67nKmr2YB44UXz49AUTagbjikQyJHvmcL6tnJtNwEKc2yrrtag1NY25oENOoGIC+ts0iTTiuvus0IOGy6m6LxGrlN9SvW8nCw3m3L0XDZnx6XyTxBu8J0m0HUJTI5zUBAgMBAAECgYBFWlmox54GPijwQHxiKN1cLFfzY2xeGn2hJwPaNP+7bad0ldD/H3GyjIu6iNadrhjj5XCjayL2mIQ/M+Cpnj6LiLvmEIlSqRy6X4hV/DbesVWvfFv+QnFV53wo5oEwGS8BxED11lbEVY59B6UWpPCNrWVSOaQhtgt3A23bw9MwgQJBAPkJdVodDqx5A4f0RejFj8J4mFWToMaQdaqp1QrzkHoFH0pe8Gq2JGME32FAc5QIa4J8iLPUiSqK0G6gEC0Igv0CQQDRjmXbgX+/sbPxcOe2isF+cXOyahvUKWcyuu0HAqQU4W546+G0SjgzWJ00YajTtJBNjTCBR8L8+zjaxOtIkcNVAkB/+IFKPjZFIKZU3YxzEdpO14OILiVnA+LDQSRNzV1HpowuvlySqWhHTcCwC9uYjT8ZvX7N0gBuUQjMYAoP6hjNAkB7NdNztXdsOUqIqg7DSGAuPPx+qV7FZraToE5e8dGRqV4v4NjrDTxwDCkaNFV0bFTwFBSx3oSqA/fQwTlpiLKlAkEAhbyo9sJAbo2RFo3trIPCpufgAlgHl45aDimleZbko5nC100R7t6rUUs5itzjiY1Psn0yb6darH3dXx0o795Jlg==\n' +
  5478. '-----END PRIVATE KEY-----')
  5479. , _0x26889a = new KJUR[(_0x47d8cc(476, "Z&5c"))]["Signature"]({
  5480. alg: _0x55c569[_0x47d8cc(549, "FHU%")]
  5481. });
  5482. return _0x26889a.init(_0x4fd74e),
  5483. _0x26889a[_0x47d8cc(564, "rEi5")](_0x8c7424),
  5484. _0x55c569[_0x47d8cc(599, "Z8gj")](hextob64, _0x26889a.sign());
  5485. }
  5486. var _0x4b42dc = function (_0x3bdde8, _0x4cb56d) {
  5487. var _0xaad1d8 = _0xa6527a
  5488. , _0x52764f = "";
  5489. do {
  5490. _0x52764f = _0x3bdde8[_0xaad1d8(576, "%Ry%")](_0x4cb56d);
  5491. var _0x350867 = _0x52764f[_0xaad1d8(527, "8E1C")](_0x55c569.vGnVE(_0x52764f[_0xaad1d8(458, "Z&5c")], 2), 2);
  5492. _0x55c569.iaZlB(_0x350867, "==") && (_0x52764f = "");
  5493. } while (_0x55c569[_0xaad1d8(489, "0HdB")](_0x52764f, ""));
  5494. return _0x52764f;
  5495. }
  5496.  
  5497.  
  5498.  
  5499. function get_params(page,key,iv,TimesTamp) {
  5500. _0x5182a9 = {
  5501. "Page": page,
  5502. "PageSize": 20,
  5503. "MarketIds": [
  5504. 14,
  5505. 17
  5506. ],
  5507. "ProductOrderType": 0,
  5508. "IsGetVipPrice": 0
  5509. }
  5510. // content
  5511. _0x963e97 = _0x595165(JSON.stringify(_0x5182a9), key, iv);
  5512.  
  5513. // sign
  5514. var _0x1c8141 = _0xad2e02(_0x963e97);
  5515.  
  5516. // RsaPubAes
  5517. _0x30ed66 = _0x4b42dc(_0x25e194, key)
  5518.  
  5519.  
  5520. _0x35c44f = {
  5521. Content: _0x963e97,
  5522. Sign: _0x1c8141,
  5523. RsaPubAes: _0x30ed66,
  5524. IV: iv,
  5525. TimesTamp: TimesTamp,
  5526. }
  5527.  
  5528. return _0x35c44f
  5529. }
  5530.  
  5531. // console.log(get_params('sgKMt6zD2jE1fLxbCki3JVsVWcB9dx8T','yJxpI1THbubhdieW','6E9D5678D76B63069AB23C4667515893'))
  5532. var data="87653B547CBC3313B84CC0210BF24236058B67D65313866E71B235E344D3550E1F15C1B9EF74BF33510033ECB4B1B4B42F727395CB5A926BF062E7E5DEFE2FCA6E3417B1445B8045141206F32BB527DCD2B1AE5CD76EFA02070BE1C328BA368765B61801A3D734FD0E635E451AB982DF584D63815AE9068D3BA7E74E59B2A92C95188D641FED9EEDC8FA6C44B81ACEE4CDC0FA4AE67944AF9EE250B1C1EC7737908AA0B29B2237AAA322391C16F2A248054D9021798B238106A70BC57C0F069E131761BE37DAB719CD04EBE19A43B0090AB3B1DE067402088F0D51D3697D6B50F96AA020DD87354451B6AA69535FCA7887B2ED25BACE17AB3599D1B94947E444F00A96DBEC594089CF54CDBE4DC868A96AD30542099A6492406DC916F673E189FC0B9ECD3532FE2929DF224C4629AF1C583FC8F75FA7481B0A9A88225B96CCCDE8911E21CE42880C260F945003D3F8E5D2CC079438B084C984D255CE9F24117A9659EEC32C4A11ADD2B548BC1A78921A9450329AEC97AA6F0E637F7ED4989833AEEF75A605EF0E34EFE150521DEBB6E2099985E76A4A1DEBB936D09A49266CF0DCB5276017FF22146626BD588D9B3893792BD600616457266CF26D2D6768509EC707992C5C2DFACC4000CFE28A453F6E43C8FDCBC2A011C05E07C58556678DBD75E46E630BE7057D3F0B117E7FA0242757F6AE5E57A1A555CBF5DF8BCE63A8B9B9623E5669483C4C1A6E3C3BC2F8DC18A1D132CA917E36F83C745AB9479A25D66164059C1B783F6931FB75B9F9F8463E40A44B5D44B974C43DB2EEDE6C542C7E8DDA0D9E3DCE6A629299BEC1F15E136C3BEC99DE3AABE11E90598314661C8C474A330175C907217DD5E859A5E63B58A7C5A8601C5D4AF4EB302287AF608EC6D2D70E9FDDA5B3354680A30F9B12D35B8D8F6B1A991E4E3D361C5F246FEF5829C759BE0A0669BD3A2FF94C3619CE9CBC50674BDA22914D028454C6CC3EBCE034181BB9C1733F0547560C67DD2DC266F3055518801AB7A96551848A68386E4402465F9550F302E93720426F0BD0546E8A78F749F5E32C3EC3E339FBE1F2D93466FCD1DE871E50054BA11ED2CB5892872B312FF52552A84B91C41B522B34903215E4E52D243057CB78694723595FC20F211239EDE0DD9B3AC35857F2E29B86D45D40A485E5AD758DD71242C6FBF641030259228E116D0192900FCB3417B29A73F3C6D2940BB2965A57903182963B5F89AA6C0762C20AE210F834D4F90CA900D9E44C657678333C676FFA4C14545E251559D3FC498C5DF3B2485D47EE63BE4A66A1361FE26BE8B38E50E696C37732557B937BACE13789497F0217E5512464FD203DF45C58FAC0D82FE632666A701BA3E5C863169E6FC66E7FA47F81F29F1CF6861C4CA9D999C4DDD9C65EC302D3B06FC16D5C0BC522AAFAB3F24CE10367B48C5214A63A12BDED4CEA9EDB04E0C8E1B99168D623BCC058990FE46C5373EC24CF4B67E549EA5B3B7DAD21B007B77D50AEE35DCEC573B966D13DCEBFB0F40B2B23D786A52CBD85A71CD418FC00F2ADEFE52443CBA96C6FE98849038E93C615D88BCAECED53F49EC85BAFDB57A22EEEF1E34406FB725A5603170E0D8117939559D39392B3312162D15F955A4E43B1663158DACBCDF8C1AAB99739B1D4517130DCCA39490CA559EEB08A9C8B4D9ED8761C0ED3473C487070418ED64D2B1B8F95E2F6098469DBDE69B2BA76AAF68D42691D9F9D7974285D69F66A8CF263D0D0E6FDEABAEB9D180619E6446B7A4E89DC9C4ECD1F104B690FC415EEDF1B2C06E56F8C9228098D74A48C7112464942C760CE57B67FDBDE66F7322B46D14C6C293EE822B1F38E1F14065771D390B72524A0912D3B5C2A19C6AA4428855DF5977F12208CA5F6B6A966E2B8FF5B709ADA5BB8C00A5EF2882C24B6A931AED1226B0EBE1494EB3545B5D2EC32F1F025DFF12AC5C1DDF0BA8C271AEB089DCF2A19F48CB1177913B80A9379F4B6CA35DB2D7272D2D5E35D2BAAD2E2F3D5E00BE1A4AB39CC7F183AE0F6DC88AA4C71356093E2B36BC0391BA098EDFA272CEE0274F0AAA3803157DEB27D22F2FA6AA91B92B1C9B06B8B71195D7B28A2B47F4F37E89C711EA9C668FBEFA37EC72113A08AB4BA2C21B33C2E0991A4B87837ADBBFE8E77BE3B3E2809BD2D8248370406AB5DF1834680FEEC4534A0846988A51DC9684B6BD6F90EFD83F4C43ED96637DA8BC1235549DD60FA848C747485EB72626A6F6ED734A375B1A8341BE6196DA2251477B435586C8F19791B1EA63F217568A1694DA22A5380E0530526B09F275DFB070C0E531C2DC915DBD77DC294BE10657479B9E854D22DA14E3A88EAA63BB8667F4A1769A6372515BDBA369414EAF9CA9F5CF2660C7B311202EC314661D1BDED3BD8A02487327BF62F7C8DB444A8A930D6B58CFA814C60D9BCAE4C12401A9872F0E05CAD6EACC9B7D136D0579D8EBB0F3F8FA00E9E07C7932608DD83A46251156620C8C06DE6C41CB9D7EC6A1E10545F99232E3C69A8951AE688B50C058155882B43F18F624D0ADC92A4DF0576F1D408FE841072EC5D86E96C3F45D6645EB793781EBD8254BF9BEC9E42D72E4868B6D0923DA0040142D75EF47AABE0E276D5FF2C234DCAF51402E3B53EC4E0AF2423276419E2E0515DD72CBF2B9871A8C489399342DE82B5AD6F73A0586AAD93D81F2F6CB9820CFF85E83A6E451697B1DE9C5FF463D5FE7A41D35B3475CD93D473ED669B152ED11CC2B3585F5FFEE60C08BC406CBE8CA910ED04D5F008FD6D2E07D7239C638702AD91BF9C1B9B24CCCFB6341DD821A2FD856BDE7055FC8AE1E5C0773DC62728EBA4410BA5620F106CF04BDA77F922682E01DF2B2359F55E931ECCFC90636AC7B8D36369823494C7ACE27C7FD41F8DD9EE759C6AB296BB53C63484AD4BDFC6224E7C6C833E91F2833096882D80108BB453B69692D590075D3349E34CDD70F7C7CCAD5B6AA6FA6C8B58B2AF9353A948646417EE1F36482F5DE094305FBFDD8ECF427FD39A9158685D3FB9058D7A58456F229508BB537821A8F6476FECA788105211288DCA0BCABA7562F67DF396A77EA93533CB1023C055610A11A1529EC827B8CC6BC62EA7679008E0F6C7FB374A63A5F3C57D87D64EDD6DB1A9B892F46E9BC97E31AE7BC8BAA56D1A1C7266734CC5B68853B08647F859F1193E63E227709AC98629DB28E533A4CE04A06FF95DF576A040106EEE5D26ADD5152F3A7FC0FA7A57779DC95F92845694831258526E1968E530CE562C2CF44F6854F6081B67211CA98720D8F2A2075FB5D7FCBD33E1C5EFE3107DA0F9AB393E2A3ECCAC2860B8668FF60374CE4FCABE743B1A91C74821FAB4D280DF0478188FA4E89EEC3A7A5DD6A3D8D77139AE287B7C1B86BC610C075B05742F184E187BBF9E4A7C9735431F5B08907E90602F695152EC4F6BC1D9DF599F25A720B51B57351806052F5B3850E8C5C05548990AA72CBF896B5AF675CE6ABC9C0229E6B46FB609A7E0352F2C5089AB9269F483F2FCE2B9EE54652491CFE37878718D6D3C1E3EBA5935430E5F6F5A173BA65113F3760A4EF37AD7FCC2A3107A1FDEDBB97AB7C633F069EC464DF3A2197C255E2503395F56F21C9FA34638335BAA8F8B9D2C3A48DE19BB28188A44430DC3E1A5DB970D4DB64483559025B2476C2AD0D9A20A9786BC9C2E6786B69E5E3F6A85D7CE5A93A41CFD65EFE77D753F9CBD3700DCFC42C39F797D23936138E6F4B62B67088E81323E5D5F14A1CAC1828FA7716C0D9EA684F30D1412720F42CB7993AC4D3E0B7A9DA02394900790BAAE687F8C02ECE3FFDD941A66277A46B8E726DCE0D732B49CA8678CEA3FCDBFDF53F7F91A2D60F499CD1C8696A09CB3311009F2CA0B4C40D3C4B4F9A891A9A4D0A62092FCE561D1F56F176A4D5DF2F2831B5025B6BE08E1A4531391D28031B04B6621A0A52A75D6189D68E7A31430F6020858FA2205CF5FE6573FC44658E0C3E713664D2D98E0A4733222CB89F3CAD7483B536872D03E147587750BFCBC4BCDD806AFDD95420DEA193A72611F5B5F21D85900E188388638567823B661CC49049EAA525B7B7E4310A77088B0F7D9EB19C0E590737BE467528A7356B9606ED06F59031B2C2FE8237CA3DED19752AC66514A96BD2F31B578618570098527079B7ED8A4330F97DE33DB4F056F0F98B8359E9C40064A515B219D92422E588CD41E17AC796C0CEB42B4943B932A034B5A8E0EE9022085F08D933E0C929FB8CEF59246F320AEF84201B5416123CC3F03628F54756B3E10A009E959B5B80DCC167B07404BBD09E24897D1C03BB225D6A5B6E2094A5ECE27E55141EFB16068B144C8A49B14ECAC86FCB15CD64D6381AE3F689F1DB5D34930C412F932CD1724D9987B686DC9CB7CE82F8138920F9102E65D9B454F0B1504378EAB56A38755CDC55617A81D0EB1BE262B1BD715E00B73477C79685ED2CF48868B8E5C4425795907BAB6CFCC4D92A5E5F15EDA3D3995AA727D3FABD53A867EA69880E736491AAB690FDB5096BD8399CCBC62384B6F49B507350B9D1447250ADD2DDA46A672E841B5DCC3143623B4B9C94B71C9A084E04CD906F211B88E8F83F080BCCD1EC1FCD7095A41B065DB079B48B56F81A69283751F31E8334200DB8462D5C036CA99C160CA16E3F2F73AF793F9E4107A5D71EB1C41877949DEE38F75FA6B43DE7F953F6FE0E9A37E1AD7EBCEF8E3A9CA9A9EC1A3B05DC7CECEA6CE5B2C1AA0EA5C58B2F37B2232A32CA0344C53D326074C957CFECCE80FD71F92D92E21D8FDDBDDA9B1446E0E87CA7B75D45A16CEFAF604CDE9C599525744F0CB415BA90A99C6EF30A0B357817B9AA6BF4D2D2304D5CD3DD20D018B2D158548CD04A1A93AAFF14FE2C09852DD648A1B24404E916EA8789342DB711893DC052ED9E4E1AA91280640AA689D8B533B4D845BF5B77DF8FEC49A7E7EDAEE3A69FFEBCEE1DD2E82D315D126FFA41A840A7E4AB1CE44982C0671492F397C6FD0CB870C3BB5C94F018140A3801B508876A64A7FB658BC1BF2B2570E5049CB6F0D9E4F64A7FD2C44E3FFDDF4D36C2FDE8D8EC5F3ED2AD107721C7202C69CBA1B0357136A745F756FB01A41840EC76AC727BEC0EA70A748DFE838E651E182C4B6A1E9F320CAE6E86AB61D9EE8600B16E535AAA0B1934BBBC97658150312AE9DCE4AE2CE9DFCA1B8D61095447851D7D3B2C4F78D0DE227C8B362050825447DB6E54F87AD8745544BF36E3103F09216F0043E60D78000F472FF36807962B9502CC400E49C2A133240625A031AB4A18A24456B5CBB3D6A22742333CE958CEF7DF855E2B7DC46F281EAAE5577DCC65EC7884B93DDCB1306D5289EFABE553DFBB7AC68F036773D6E82217508658FAD4D0021E0453798B48E09428DD6C570049F41A7CE8A7C17461039ED36D7938257BA28D412701551D4BF747596B6FE22ACB535A00CF8F3D7E8D8D0605F774B969E72CEAA4781001A753CC4DB343F8089449D071EC8A5BCD76075C1AB873D18BCD52FAFEB81DC1A32200C81BB892B83974531F6040CDF6BA32F69C8094DBF504D4E1BB289461BA2681143CAE3385FAA33B4791385BB2DBBDB077215EA69115B764E87C4163004B955B88BB0705ADD5F843CEC3776779F7F0806E7B88335E43CDC542BA1ED94889523496CE0549A3C4A4802B3486B2CCD23878C58C1923F351C49F65C7031C615DDEA22344EBD3996DD834CBE9E5B3CDF9C480DCC0DA24D1CA9C8BC81F37B0E7AD97E46C57F4D791DCDD68D5770F3FE29F150CAF596DCE874EAC66F6FD7E7BD2443FD447A395218ADF1F00C8797CCC822EE50F47D56B4C5201FEB01A7D720B0BBB6ABA4121327B5683844DCF28F58F5346FF3AAA09F6BC43B38B2C945B90DF503671EF2E0F872FAF7E0CF0B3D2967A483E2B3AA6CA038941295288A97B492A0B84D9E4D4871FCB89814D77C05FB49075ACC5DA4C152CB1195227AC656BA0464854E5E1DC690052EDFE2AEDA4C2672DB1B26204E2428F3F282308BDBC238556238791F89E4477E5CE672B16021E743100921402360DAF8F148204513D43C81110D0CBEC469C9F09333F638130493A2C5713DBFE9FF26F6A2705B3CE8C116A6C8EA2D288B98A6A589404CC8D3DFC8DF17AE4503A11861099635341F49AEBE2CFAFC65C6286E40069166C8CE19F93ED93694747988BDBBDACC5BE0F27837447CB81B2B034E4142E944711EB7CC6B11212ADA88A03A60850E6A32F3ABF2B47823F785C3FA2ADA9B6A3A98FB4DBBB78BF2C017DF101190B20EF2749DBD7ACCC61587121745DEA13F6175E66E3B3334C15E9F3D027C1DE553206735C46AC4A67A600AFE36913BB7AF5DFD623CB06219EE900DCBDE6328E4FDF6FFF6F3E977851DE3901055AF715EC6FD3D8C70A6812E68315BC4484A0932BF7A40CEDE17C400D476E011F9ED3AC076660AA2CD85530C8E68B5B99DA5B769ADFC5B0F4DE02771DAA7A0EE38A1B079338291D9E35E5EBDC9B9AB0803B03C3549611286360B6F584BF419AD0D263F7476086C5405647457C2B3B6E5D6923F094FCDEAE0856933F73D0506E5D469D51A9EE71230E8F6F01E5B301E38ABC85B5B2257810301AC33559D23483ABE92538418646FFA2848BF32B022C343AF1141BAEEB73099BBFED48CE166F7882F337EFD6BE43BE6CA5B606EFACA5B3A5A097F6DD367D32E7A91B89CC2871BACBAB593BF3A3BA639845F1F3D94C7107F39DDB0528731EF02052E4635077D63B69679F7DBE5DCEE3C955FD4561D3AF8D5A2DAA8EB0E7D6DFAB25B4C120F38A7213DE55788681F1AB5D8399F835F48345B752D64F94B6852347576EEB819CE96FF2D51A9E28A6B5BA292F15B35D8764E66A4A75AF2F71DE8F14AA378C80A33D792A58777FA980FBE01C7027CC4FDF6911D63399ADB1CD02AFB427643A121FAD5121820F4AA5A80702C6BCE46E38117A044C42E9168E8ACFCD27886E743ECCAEFB257B132BC8347695299A197E1E3A90F0A88B71827521933578AACEDC61F4D60E3CC3244880C7BA87CB03D136BD0043DC62FB52A4C0C0599A0C3B9B0C76F560015E33733BCCA08CEE…"
  5533.  
  5534. function res_data(data,key,iv){
  5535. _0x316c29 = function(_0x50d2de) {
  5536. var _0x57bf1e = _0xa6527a
  5537. , _0x19d8f6 = _0x55c569[_0x57bf1e(529, "F8#f")]["split"]("|")
  5538. , _0x9d1ea2 = 0;
  5539. while (!![]) {
  5540. switch (_0x19d8f6[_0x9d1ea2++]) {
  5541. case "0":
  5542. var _0x5393d5 = CryptoJS.enc[_0x57bf1e(606, "KD8R")][_0x57bf1e(410, "wE0e")](iv);
  5543. continue;
  5544. case "1":
  5545. var _0x59b62f = CryptoJS[_0x57bf1e(423, ")DW^")]["Base64"][_0x57bf1e(555, "Rorc")](CryptoJS[_0x57bf1e(525, "pstP")][_0x57bf1e(600, "%Ry%")][_0x57bf1e(582, "]**l")](_0x50d2de));
  5546. continue;
  5547. case "2":
  5548. return _0x47f47d[_0x57bf1e(463, "qCdP")](CryptoJS.enc[_0x57bf1e(441, "rl)n")]);
  5549. case "3":
  5550. var _0x47f47d = CryptoJS[_0x57bf1e(434, "toaS")][_0x57bf1e(480, "C6*a")](_0x11aca, _0x1d6ab3, {
  5551. iv: _0x5393d5,
  5552. mode: CryptoJS[_0x57bf1e(500, "F8#f")][_0x57bf1e(535, "&sYj")],
  5553. padding: CryptoJS[_0x57bf1e(550, "toaS")][_0x57bf1e(592, "65S[")]
  5554. });
  5555. continue;
  5556. case "4":
  5557. var _0x1d6ab3 = CryptoJS[_0x57bf1e(551, "c0j]")]["Utf8"][_0x57bf1e(432, "qXik")](key);
  5558. continue;
  5559. case "5":
  5560. var _0x11aca = CryptoJS.lib[_0x57bf1e(554, ")Mf!")][_0x57bf1e(516, ")DW^")]({
  5561. ciphertext: CryptoJS[_0x57bf1e(525, "pstP")][_0x57bf1e(440, "c0j]")][_0x57bf1e(419, "Z&5c")](_0x59b62f)
  5562. });
  5563. continue;
  5564. }
  5565. break;
  5566. }
  5567. }
  5568. return _0x316c29(data)
  5569. }
 
javascript

python代码:

 
  1. import requests
  2. import json
  3. import re
  4. import execjs
  5.  
  6. class QingChuang():
  7. def __init__(self):
  8. self.headers = {
  9. "accept": "application/json, text/javascript, */*; q=0.01",
  10. "accept-language": "zh-CN,zh;q=0.9",
  11. "app-guestid": "CC0244A69B8E709E50371AA783B601CF",
  12. "app-version": "0",
  13. "cache-control": "no-cache",
  14. "content-type": "application/json",
  15. "origin": "https://hangzhou.qccqcc.com",
  16. "pragma": "no-cache",
  17. "priority": "u=1, i",
  18. "referer": "https://hangzhou.qccqcc.com/",
  19. "sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"",
  20. "sec-ch-ua-mobile": "?0",
  21. "sec-ch-ua-platform": "\"Windows\"",
  22. "sec-fetch-dest": "empty",
  23. "sec-fetch-mode": "cors",
  24. "sec-fetch-site": "cross-site",
  25. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
  26. }
  27. self.html_url = "https://hangzhou.qccqcc.com/"
  28. self.url = "https://newopenapiweb.17qcc.com/api/services/app/SearchFactory/GetPageList"
  29.  
  30. def get_info(self,page):
  31. # 获取key,iv,timestamp
  32. html_res=requests.get(self.html_url,headers=self.headers)
  33. qccppm=re.findall('var qccppm = "(.*?)";',html_res.text)
  34. key,iv,timestamp=qccppm[0].split('|')
  35.  
  36. # 获取新的加密好的请求载荷
  37. with open('青创网.js','r',encoding='utf-8')as f:
  38. js_code=f.read()
  39. js=execjs.compile(js_code)
  40. params=js.call('get_params',page,key,iv,timestamp)
  41.  
  42. data = {
  43. "Content": params['Content'],
  44. "Sign": params['Sign'],
  45. "RsaPubAes": params["RsaPubAes"],
  46. "IV": params['IV'],
  47. "TimesTamp":params['TimesTamp']
  48. }
  49. data = json.dumps(data, separators=(',', ':'))
  50. response = requests.post(self.url, headers=self.headers, data=data)
  51.  
  52. # 将加密的响应数据解密
  53. result=js.call('res_data',response.json()['Result'],key,iv)
  54. print(result)
  55.  
  56.  
  57. def main(self):
  58. for page in range(1,5):
  59. print(f'正在爬取第{page}页')
  60. self.get_info(page)
  61.  
  62.  
  63. if __name__ == '__main__':
  64. q=QingChuang()
  65. q.main()
 
python

案例二

0.postMessage方法

window.postMessage 是一种用于在不同的窗口、iframe 或者标签页之间安全地传递消息的API,它可以跨领域传递数据。它主要用来解决在同源策略下,不同来源的文档无法直接进行 JavaScript 交互的问题。 postMessage 方法为跨文档消息传递提供了安全的途径。

otherWindow.postMessage(message,targetOrigin,[transfer]);

  • otherWindow : 要发送消息的目标窗口对象,可以是window , iframe.contentWindow 等
  • message : 发送的消息内容。可以是字符串、对象或其他可以序列化的对象。
  • targetOrigin : 目标窗口的源(协议+域名+端口号),用于控制消息发送的安全性。值可以是一个具体的域名(例如 https://example.com)或 “*” (表示不限制域名)。
  • [transfer] : 可选的 Transferable 对象数组,通常用于转移 ArrayBuffer 或 MessagePort 等。

接收消息的窗口(例如 iframe 内部的脚本)可以通过监听 message 事件来获取消息:

 
  1. window.addEventListener('message',function(event){
  2. // 安全检查:确保消息来源是预期的
  3. if (event.origin !== "https://xxx.com"){
  4. return;
  5. }
  6. //处理消息
  7. console.log("Received message:",event.data);
  8. });
 
javascript

百度网址测试:

 
  1. window.postMessage('1234','https://www.baidu.com')
  2. window.addEventListener('message',function (event){
  3. console.log(event)
  4. })
 
javascript
 1.逆向目标

网址:https://www.jianyu360.cn/jylab/supsearch/index.html

接口:https://www.jianyu360.cn/jyapi/jybx/core/fType/searchList

加密参数:

2.逆向分析

hook定位:

 
  1. var my_parse = JSON.parse;
  2. JSON.parse = function (params) {
  3. //这里可以添加其他逻辑比如 debugger
  4. debugger;
  5. console.log("json_parse params:",params);
  6. return my_parse(params);
  7. };
 
javascript

进入解密函数我们发现我们进入了异步中,流程类似于:https://blog.csdn.net/ningmengjing_/article/details/150483877

下图的代码就是核心代码

3.代码实现

javascript代码:

在扣代码的时候碰到了这个错误解决方法:

混淆
    格式检测    压缩代码
    方法  把没格式化代码复制到本地    找到开头    删除前面的代码     再找到结尾  删除后面的代码

这里这个库导入比较特殊

 
  1. window=global;
  2. var JSEncrypt=require('jsencrypt')
  3. const crypto = require('crypto').webcrypto;
  4.  
  5. J = {
  6. rsaDecrypt: function(n, x) {
  7. const W = l;
  8. var e = new JSEncrypt;
  9. e[W(540, "U%DW") + W(836, "l1sA")](x);
  10. var o = e[W(830, "XK#8")](n);
  11. return o
  12. },
  13. async AESDecrypt(n, x) {
  14. const W = l
  15. , e = {
  16. RBiGj: function(f, d) {
  17. return f === d
  18. },
  19. qcqef: W(441, "DTyb"),
  20. eFzvS: W(471, "opxz"),
  21. ninbp: W(646, "l1sA"),
  22. daehd: W(680, "![lZ"),
  23. tTRoe: W(934, "vkxl"),
  24. TljzP: function(f) {
  25. return f()
  26. }
  27. }
  28. , o = new TextEncoder()[W(910, "PAdF")](x)
  29. , c = n
  30. , t = Uint8Array[W(944, "x]Q)")](window[W(617, "m38C")](c), f => f[W(581, "g2ho")](0))
  31. , u = async () => {
  32. const f = W;
  33. if (e[f(478, "qAuV")](e[f(829, "mGjC")], e[f(495, "jZkF")])) {
  34. const d = t[f(520, "Z&&L")](0, 16)
  35. , a = t[f(520, "Z&&L")](16)
  36. , s = await crypto[f(747, "Z5zh")][f(738, "qiv)")](e[f(483, "WV)0")], o, {
  37. name: e[f(580, "U%DW")]
  38. }, ![], [e[f(501, "vIPk")], e[f(839, "gz2i")]])
  39. , i = {};
  40. i[f(746, "Z&&L")] = e[f(930, "vIPk")],
  41. i[f(767, "qAuV")] = d,
  42. i[f(873, "DTyb")] = 128;
  43. const b = await crypto[f(725, "iN4Y")][f(686, "qAuV")](i, s, a)
  44. , h = new TextDecoder()[f(642, "![lZ")](b)
  45. , m = {};
  46. return m[f(563, "Cy7p")] = h,
  47. m
  48. } else {
  49. const d = _0x281caf ? function() {
  50. const a = f;
  51. if (_0x54acb5) {
  52. const s = _0x1fdcf1[a(726, "MOy0")](_0x3d8099, arguments);
  53. return _0x15f2c7 = null,
  54. s
  55. }
  56. }
  57. : function() {}
  58. ;
  59. return _0x36a51b = ![],
  60. d
  61. }
  62. }
  63. ;
  64. return await e[W(604, "Kn0I")](u)
  65. }
  66. }
  67.  
  68. // 自执行方法
  69. !(function(n, x) {
  70. const W = l
  71. , e = n();
  72. for (; []; )
  73. try {
  74. if (-parseInt(W(954, "m38C")) / 1 + -parseInt(W(696, "1G]f")) / 2 * (parseInt(W(877, "(eXE")) / 3) + -parseInt(W(859, "PAdF")) / 4 + -parseInt(W(885, "^[dc")) / 5 + -parseInt(W(476, "vkxl")) / 6 * (parseInt(W(534, "d1Xt")) / 7) + -parseInt(W(544, "Z5zh")) / 8 * (parseInt(W(803, "i[Q*")) / 9) + parseInt(W(898, "PAdF")) / 10 === x)
  75. break;
  76. e.push(e.shift())
  77. } catch (o) {
  78. e.push(e.shift())
  79. }
  80. }
  81. )(C, 862971);
  82.  
  83. // 大数组
  84. function C() {
  85. const n = ["WR9zWO3cNSow", "WOamW4dcV8kq", "W77cMdKBW4S", "d3BcMNtdGW", "tCkkc8kaWR7cKmkLWOnosCkxmeS", "WOOiW4xcJSky", "wSouWOddKYi", "WPhdUfFcGa", "puVcPHLq", "WQWSW7zFoW", "W6aGECkuWOa", "vGldUeW", "WOjtW59HyW", "pHyUW6Gx", "WPpcVu5gtCog", "WRFcOSoxW6xcHSoaEa7dIG", "W5tcG8kTWR3cSW", "W5pcGmo/FSoP", "WPuhW5ruceS", "W5RdTcHRfW", "W6NcRJuSW7C", "WONdU8orW6JdIa", "c1JcPHzCsgBcV8o/kdG", "W78TWOBcKgW", "W7BdImoVW5rH", "W5RcOSkbWPRcKa", "WOrKW6XCEa", "kZldRY8M", "y8oHWPRdKYi", "BCk7W6PQWRq", "WQ/cICkCWRqoz8kaW60HBMtcPxS", "uxTHWQm", "DbOiCxG", "WQmGWPDZCa", "gsKbxmoc", "WP4MWRXPAW", "WQpdMCoyW7/dKNT+", "WOf7WPDPW4VcJeZdVG", "W5W0WONcQW", "FJKMzgO", "WOeSWR5Bsq", "WRO7W6tcNmkX", "W5hcRYGYWRu", "tmkhbCknWRVcKCkMW7XAr8kOmvFcSq", "WO9ncJv8k8o7W5emWQW", "tXWqvwjj", "WOLbWOnJW4G", "WQTcW45Fwq", "WRFdL8oeW6i", "rmoZWOtdSta", "WPdcVLPDqmo3W5XDeG", "mgD2WPrH", "kglcVIO", "WQldQmoRAmkR", "exRcThhdHXC", "hmoqx8oxW6/dGa", "WRSKW7H5bq", "W7hcNIijW6G", "zL5Kqxu", "xYrOWRq", "W7y1B8kRWOCFW7XliCkw", "W4RdL8oiW6jp", "W7NcJmkKWR7cIW", "sWpdJvCxEfNcNq", "mCkIqCkb", "WOS6WRnJBsZdQG", "v8kBFx/cPSoYWPhcTGVdTq", "da84W7Wx", "W4e1WRpcQ3ubW4pdJW", "WP/dNHaYkq", "aftcN2lcQa", "pwPRWOnxW7RcPCkH", "WOldPKlcLW", "WRRdTs7cOdu", "gGKYW7eg", "traqugy", "fGNcO2GG", "aZlcR0lcIsxcMSoLW7W6", "gG/dGqK8", "bNRcTNhdNq/cSq", "WQBdUWlcRaq", "WQ8VW7FcP8kd", "jX8Tq8o9", "W6RdPZ5wgW", "xYaozq", "WPyEW5lcV8kNW4JcTCkBFW", "lMRcPc8", "WPpdSKRcLCom", "W4hdOYr2lG", "WQVdSstcOW", "aeHvWQ9G", "gNJcKKxdQW", "ENLlWQBdNG", "WQFdQKdcG8oV", "WP88gmoQW5m", "WQBdH2lcHCoE", "W6qviSkfx3/cUmorW6xdGq", "CCoLWO/dKt7dIG", "WPGgW552cKzXtZXa", "W6pdQSkgWRxdJ8knEXldPJ4YEW", "WRxcVCoHW7NcJG", "hLbIW6yc", "ssyZDx/cJ8k5W7C", "WOm8amo5W74", "WRFcT8oHW5a", "ogZcMt9wW4NdRmoV", "id0TwmoX", "jwX6WPfd", "cZy4W5W6", "EWGJEgm", "W74YA8k0WR4", "WRTgWRdcP8oE", "vCoWWRNdTse", "k8oKtCoFW6W", "W5iPW6ZcUZe", "dZSIzCoH", "aba0AmoJ", "WOD8W7rEyW", "fx7cP20", "wI4fCW", "kSkuWQWF", "WPOAdmosW48", "amoRD8o5W6K", "WPtcG3nDDG", "hfhdKCkfeG", "WRWLW7fgoW", "W5FdKcHTjG", "WR/cV8ohW7pcL8otDa", "h23dL8k/kG", "WR81W6bXna", "WPKxW57cLmkS", "WRdcS8oAW6q", "WQPvW55f", "WPRcQePazW", "gSoku8okWQpcH8oLWQL3sa", "jJNcIKFcIq", "WO81W6lcSCkT", "WQtdRtVcUWO", "fwfilYBdJ8o8WRKXWQK", "W7ddRCo8W7Dm", "WReRW6FcGSknWOBdLSo3bM0", "W4ekW5VcRdO", "WR90F8k2ka", "bSkArmkleq", "WPX/WP7dL8oU", "rJroyMlcImkKW6rOW7u", "W7qNDmk8W50qW6PlnSkr", "W7yJA8kIWOW", "g0ddL8kBha", "WRuoi8o9W6a", "deVcL1FdNa", "pgZcUt9PW4xdSCo7W7hdJq", "owTBWPjX", "h3hcGf3cKa", "WOldSghcHSoOW4/dLmoi", "xqxdSeC", "bcebFSoG", "bJ8LECof", "u8oBb3JcSa", "n8k6rG", "q8oNWQVdMIW", "WRpdK8oxW77dNN8", "WQddJmo5ASkB", "WOtcINShBSkNDCo6WPhcJq", "uYNdPdFdJXdcGCkwW6ik", "W7FcMSkbWOVcVa", "WQnvWP9hW48", "W4pcTCoDySoW", "WOrRWPdcPSoD", "eYNdIaWWW6ZdV8k3WOi", "xmkfkq", "WOldOJ0xpW", "E8oig0JcLW", "vmo/WRJdPG8", "W4ZcJZ0BW70", "tqZcMmkirSoTnmooWRS7", "WODEAmk3jq", "W4FcHCkZWQ7cLa", "vmoUWQZdPCox", "W7tdMSoGtCkZi8o/W691W54", "WOZdJHpcTXS", "W6lcH8kPWPlcOG", "vGldRLyr", "cHOZW7Gz", "ecWTwSoa", "bSkaWROwW5m", "WR1xCmk9bq", "W5lcGqCmBSkTFCoLWOVdUW", "WPX5WObVW40", "rXGBwNi", "nxZcO0ddIG", "pcRcQ1NcVW", "Auz+A3e", "sSo5WOZdNSow", "urDErN5ivIuOjW", "A8oDmN0", "WPCbW45Ae003eLa", "WOBdRvVcHmo7W5ldN8oKW6ek", "W6LYW4ddTvTb", "W4dcQWuqW70", "cJxdLW0R", "ofJcIMFcJSoPqCkS", "W7FcVHqtW6i", "W6OfWPdcTeqhW4pdNa/dMq", "WQ5zWRZcNmo5", "aSofW7XqW4HB", "WPvHWO/cOSoi", "ahBcU2C", "W6BcM8oZB8o7", "rSocmKpcJa", "W5ynWOJcJxe", "WO0hW4Lh", "W4ddRdzwjW", "uIhdIxej", "W77dMdjrl8oZmmkrW5tdMq", "W5OFWPlcIMS", "W7dcHCkLWORcKLhdGa1csa", "WOldHG8eoa", "sMbRWO/dIq", "qH8kv2qmqwjIFq", "kCkfWRuwW7fsfYdcLN4", "h0JdJ8kn", "W6ColmoCr2FcTCkYW73dJSok", "WRviA8kicW", "Evzzy3W", "WPpcT1PgtCol", "Ax5+A2e", "WOhdLIGmi8kpacdcOGO", "WPSWWQLaCcNdUCoUWOlcKW", "WRVdHb/cIJC", "WPRdSfu", "WPWWWQ5K", "EZ0iWPXTW53cVSkhnq", "WO1jdcvGmq", "jaJdQHCq", "a1LEeJyb", "W6hcKmoqxCo8", "WRtdMCoLW7JdJ351ka", "WOKLWQ18EW", "e3xdO8k9eW", "BColWRldNs8", "AGeny0i", "d8kJEmkZeG", "rLfYrh0", "rSkAm3JcOCo3WOC", "dNRcU2tdKbC", "WPa6WOXbWOJcNxBcO8ovWOK", "W7VcRb4GWQ0", "BSkHW6LK", "WOvgWR5PW70", "W6xcH8oBySoi", "WOuniCogW64", "WQ1FW5jdx8kBjCk6xdi", "zSoDiKJcGa", "WRPiWONcKW", "ASozW6rpWQ0RBHhcGvhdUG", "W7NdNmoiW7DciSoe", "W63cMrOuWOS", "W58UWOJcKwO", "lwxdSCkgaG", "y8knW7vvWPO", "WQ1+vmkMmq", "WRP9WRZcMmo3", "WO5YD8kipa", "dLxdGmkDdSoyf8kjWOqh", "W5dcOI49W7u", "WPLjcIe", "WRf9WRBcH8o6", "WOy8WRnYCG", "nrRcU3hcMHldSCkummoH", "vSkdW6zLWRu", "iHtcKu/cKq", "lXhcLgad", "B8osWOBdVmoj", "W6VcJSkhWRVcIa", "h2/cKGjg", "pHiXEmo9", "WPNcGSoNW7pcSG", "W6tdNmoiW4rF", "stSbyMG", "hK7dJ8kAh8oLamkaWPul", "WO3cShfwyW", "hMTBWPbr", "W6ZdIYHcEmkZhSk/W4G", "WQediMSUB8oZW4zqWOi", "ed7dHGO8W7a", "W6yak8kpoKVcJmk9W54", "WQFdH8kTpCkRtmkqWR9MW7lcOZJcQG", "A8kVW6jY", "WPb8ktj5", "W4FcSCoYwmow", "W5VcPIOyWOe", "WPPCW5zkEW", "WQKyWOvPzW", "W4BdJb10oG", "W6VdISokW7Xs", "WOtdPI4yiW", "WQDdWRVdV8op", "cMBdK8kEmW", "WPtdOmoECmk6", "WOKwW6pcHCkU", "cK3cV2RdKa", "WRhcSSovW6NcMa", "WQlcQSo1W67cOa", "WPjJWPLYWO3dPvVdOSo8WQC", "WRpcRSoBW6i", "W6iEWQ3cTvu", "W60iW6VcLZi", "WP0pW5tcUCk6", "pgxcS2tcQG", "WRddVCoMW4JdRq", "x8kBd2FcIG", "wGpdK3yu", "gby3W7mlWQtdGG", "WP0oW6XMnG", "WRPknaL/", "AW3dTKGD", "oK/dKmknhW", "WPRcOvDevW", "lMFdUmkNbW", "W73dNJPtk8oin8kWW5tdGW", "WQlcThD6nsVdHh1b", "W6lcHmkBWRJcJa", "mLVcHwZdJq", "W74/WPK", "W7dcRSkSpmoNwa49EM7cRG", "WQldUSoaW5RdVa", "uSo0muxcVa", "W5xcQmkOWRhcIa", "W5RdLa5qgG", "wsWdBMNcGW", "WQhdPIxcQqRdTa", "W63cLsymWRC", "BCkaW4X5WOW", "q8ouWRNcKHJdRha", "WQpdL8oAW6a", "WPNdImoiDmkH", "WRJcS35Dsa", "DdaUv3G", "W6aYW7lcMXXMsN9IW7C", "WRldK8ocW7NdJ3K7z8oMxG", "et7dKW0TW7BcPSoVWOfa", "mXxcSuVcIW", "gtyZrSozWOLUW7ajW40", "kftcJhtdRG", "WOJdHrpcQcC", "nSkOumkdia", "WOJdSWlcNrS", "WPX4WQRdTSo1", "hehcJN3cHa", "WOhdHW7cVd0", "W5dcQ8k+WPBcSG", "o2VcOYDbWOdcQSo8W6ldNW", "wsWcDa", "W5vqWOVdU8knW6JdMCksdXi", "zmkNW5DbWPS", "W6yyWPqEamoaE8oWa3q", "W67dNmofW6fRpCodW60IFa", "W7VdRWXIba", "W6pcOI08W4a", "sgvjWRNdJW", "c8kHW5FcH8kdW77cKh/cT8oAW5HOWPWy", "WRBcV8owW7u", "xmkylLlcGq", "WO5CdcLGiG", "WRWHo8o/W4q", "W6pcMmkKWO3cIvFdJb5t", "kstcOKW", "wcCdC3tcLSkJ", "WOpcVvvhwSorW4XgeIW", "W6ldT8knW6hdM8ooueZdVG4", "ttSpDwlcKSkUW6b/", "zhzgxG", "WPiCpCoFW7i", "WPvYWPvYW5ZcT10", "WO9HpdnG", "orJcR3hcJW", "W7BcMmo0F8oQc8ovWQHCW6O", "WRhcRmoqW7FcMa", "WPJcQgXNAW", "r8k5W551WR4", "WPZdMwKca8ktgJpcUre", "W5FdTa1/ja", "s8oxov7cLG", "WOrQW5lcLM8RW7xdGdW", "WRPcW51ttG", "WQeEpSoIW5O", "xHZdRK8C", "gmkcWPiRW6e", "W6u6uCk7WRq", "W4ieqSkbWR4", "WRhcS8oeW6JcK8ogrqtdNcu", "WR4zW4RcVmkY", "W6pdImojtCkeEXy2ghu", "uY/dPZBcNuBcR8kYW6mopmkY", "W7SKCmk8WPa", "W6xcQZGjW4a", "qCo/WQxdMI4", "WRWnW5zgfa", "WQiTWQX0AW", "WQtdRuhcO8ol", "qmknpM7cVSoVWOVdU0W", "WRbzB8kf", "WRFdT8oiCmkGuYWu", "j0BdUc7cIvldQmolWOfb", "WOaeW6VcNCkR", "emo7ESoSW6C", "tSk5W5fdWQ4", "pCklu8kxja", "WRpdQmoAASke", "FSk7W6zeWPpcPCkHB8o2bW", "W5hdTsTviCoZoSkfW64", "WP9SWQ7cTSokCSkBoCkzra", "gIWIrSo4WOK", "W7lcMSk7WPxcNW", "WQpdRSodW7VdNG", "iHFcQxC", "W63cSmo2Emo0", "WRK1c8ofW4e", "W4/dVmoHW4z/", "WOzIASkdfq", "WP9becq", "WQTglbLA", "WPFdR0lcNSoJ", "cSorsCokW6JdGa", "vLDntey", "jvRcQxZcJSo0zmkUkq", "W6a1W7pcLsD9thyRWRm", "W5afu20", "pYJcV1W", "pfVcUhRcKSolsSkY", "bZhcG0RcQW", "WOvaWPbyW5W", "WO/dPCozW7ZdSa", "W7VcLSo3Aq", "oNbAWOnjW7y", "Fcisueu", "WR3dQdivoq", "W5NdOHLqpG", "W5tdPGWmg8kwWOTQkZFdKvSo", "WRfOWP7cPCom", "W4ZcIJKwWQS", "eePhacmuqN9lqNFcGa", "WPadi8oaW79mpdxcRSku", "s8o1WOFdLt4", "WROJcCoxW60", "WRCkWQ1IBttdOmoqWQK", "uxTUWRG", "eNVdLSkkdq", "WQO3WP5juq", "WRjUWOZcSmoP", "zdm4Ah8", "vXWbCgq", "W4aeW6xcKay", "BJaWCwa", "WPj4WOnUW5hcOLS", "WOGNW5rQlW", "wSo7WPNdMSo2", "WOHcWR1bW4C", "lIK2Dmox", "W5KTWOVcRwi", "w8kXW47dICoo", "kSkTsmkohW", "WORcUmo3W5RcNq", "WOOxWRXFDq", "WQBdIZ3cRX8", "fh7cUxBdGq", "nWlcQM/cOa", "WP1KWQ5SW50", "W7ZcMCoZEa", "ax7cUw8", "xcOuAglcIa", "WPNdVCoDW6tdRW", "a39SWQnJ", "WQnDt8kReq", "W5GPF8kSWRG", "WPddRL7cS8od", "WOHNWOi", "dw7dM8kOlG", "g3bkWObI", "W7yWB8kNWPPC", "lvlcO0/dQW", "pCkcWRijW6aasJFcKgq", "WO4GWRnZDINdOmoHW5BdNa", "hXWHW68gWRhdHa", "W64hFCk/WPy", "WRHuW6Lbta", "WRRdVCo4rCk2", "frO2W7qqWQ/cMdVcSW", "WPuzi8oqW79xjJJdUSor", "kLbOWPPX", "cYyXW6xcRaz9bSkhWPNdNmo8", "CsOdueu", "bMrmWRvS", "W4FcQqpdHSoXW4NdVSo4W4Cy", "owrkWPjlW6C", "W4FcHIymWQu", "xIyvB3NcG8kL", "WQ/dId/cUrG", "WOldH8oGW4/dPq", "eGeKW6qp", "bKPqWQn1", "WOe4W4HLlW", "bdSkumoz", "W7/cLYiqW4S", "W7yQWQBcUMa", "l8o2AmoFW7G", "ed7dKYGTW7hdSmkMWPnq", "W7RdGqnNmq", "vde6vxm", "WQJdR8oFu8kJ", "WPOyWPFcUmkwo0VdOW3dUa", "msJcK14H", "W4RcQmoQFSoXdCopWPr3", "W57dO8ojW6TQ", "hcSLzmoC", "W7BcN8o7zCoW", "WRldU8oQyCk0", "qCkqpNNcT8oRWPy", "W63dHtvuoSo1imk5W4xdJW", "hK7dJ8kAbmo7ea", "WQFdLcpcJZi", "WO55y8kDgG", "W5aCWRJcT0m", "sCo0WPm", "W50/WPaA", "WQHuWONdNCoa", "A8oSe2BcGq", "oMPnWOvgW7y", "FmkdW7rQWPW", "C8oxjG", "nulcThVcQa", "qtW6qfa", "W7meW5ddN8kcu8kSb8kGFG", "y0tcVGK5oa", "pg/cQYjkW6VdP8oX", "atxdOrOq", "W6xdMcnZpa", "WPCBW4pcNCkz", "sJKUt34", "WOeAWQ17uG", "othcI3K0", "pvJcR1NcUq"];
  86. return C = function() {
  87. return n
  88. }
  89. ,
  90. C()
  91. }
  92.  
  93. // 解密函数
  94. function l(n,x){const W=C();return l=function(e,o){e=e-418;let c=W[e];if(l.WtxbIi===void 0){var t=function(a){const s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";let i="",b="",h=i+t;for(let m=0,k,O,G=0;O=a.charAt(G++);~O&&(k=m%4?k*64+O:O,m++%4)?i+=h.charCodeAt(G+10)-10!==0?String.fromCharCode(255&k>>(-2*m&6)):m:0)O=s.indexOf(O);for(let m=0,k=i.length;m<k;m++)b+="%"+("00"+i.charCodeAt(m).toString(16)).slice(-2);return decodeURIComponent(b)};const d=function(a,s){let i=[],b=0,h,m="";a=t(a);let k;for(k=0;k<256;k++)i[k]=k;for(k=0;k<256;k++)b=(b+i[k]+s.charCodeAt(k%s.length))%256,h=i[k],i[k]=i[b],i[b]=h;k=0,b=0;for(let O=0;O<a.length;O++)k=(k+1)%256,b=(b+i[k])%256,h=i[k],i[k]=i[b],i[b]=h,m+=String.fromCharCode(a.charCodeAt(O)^i[(i[k]+i[b])%256]);return m};l.MDoBrh=d,n=arguments,l.WtxbIi=!![]}const u=W[0],r=e+u,f=n[r];if(f)c=f;else{if(l.wyyAta===void 0){const d=function(a){this.MulPhG=a,this.HzuiZQ=[1,0,0],this.wqugmh=function(){return"newState"},this.xWHfrC="\\w+ *\\(\\) *{\\w+ *",this.rbcktE=`['|"].+['|"];? *}`};d.prototype.NGjtmC=function(){const a=new RegExp(this.xWHfrC+this.rbcktE),s=a.test(this.wqugmh.toString())?--this.HzuiZQ[1]:--this.HzuiZQ[0];return this.HTvSes(s)},d.prototype.HTvSes=function(a){return~a?this.SoJXui(this.MulPhG):a},d.prototype.SoJXui=function(a){for(let s=0,i=this.HzuiZQ.length;s<i;s++)this.HzuiZQ.push(Math.round(Math.random())),i=this.HzuiZQ.length;return a(this.HzuiZQ[0])},new d(l).NGjtmC(),l.wyyAta=!![]}c=l.MDoBrh(c,o),n[r]=c}return c},l(n,x)}
  95.  
  96. async function get_data(key,data){
  97. const x=l
  98. var t = J[x(722, "w#C%")](key, '-----BEGIN PRIVATE KEY-----\n' +
  99. ' MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOhM0pNOfGeiBr+t\n' +
  100. ' nunphCHReY3RiS4Fuc2nD3cbjKNdLezeViGmsZwHsb2SVUb6rpPHyX0+3xjXYn//\n' +
  101. ' n39/Q8uPjWRA332TtN8MDEkSR2HMbn8ufRRt2TnlfsFDFTgBywSP7cwd0CiEdvBX\n' +
  102. ' 5w8Jifc9VbedwbeplBWyDeLLqjRjAgMBAAECgYB4es+EAuLWxNwHMb8Hxkr3VzNZ\n' +
  103. ' 8GDbc7DIDmsg9TLdz4fwH+hAD7pyGDOBBJIh/AXrM2U3BhKjSaIWjLdmYtT/kzg8\n' +
  104. ' BxQDr9YoO7u2jvTcEE+/6p2YugYX/ngpinawFJqyM+N7Or8yRABaw6Aq8VuKtv6p980Y2BBVVYn+/KorYQJBAP+9lu8iolzKRzJrFt/rosdWkOpNg5ujcSCwbxhYnYC0\n' +
  105. ' UY85sPLsMvnLgegkpO8jocSAt586BmcsA+Q9o97qVCkCQQDoiSVegtOvG3U0mNlN\n' +
  106. ' rCVpPEL22s9Kkwps3ZCdTl3VtUtNiyfhE8rbw/qOGti3VxMCRhpKi9hTIgeq13UG\n' +
  107. ' 67WrAkEA/WQ1c5XGd9f4eU1AKffInmf4SB8rgn+L7I7EVMQgstB3a0kHOXqs+3IX\n' +
  108. ' shL01PliJFhBF+QfSgSDipdEke9uGQJBAOcw46xxmhDw1bizdulYi+Fy/oj7xzi3\n' +
  109. ' tJfEObGMZpLBKtsvzThkOz4APS3n1yuBMO8Dz8PqAeu1W7YpfLqiwv0CQF68N244\n' +
  110. ' dFebDSoZLl1hbCExpbtC7SDBpYxlIVNVqwN7ymr+Z0rIcAMVv5Ldp/bJEWaXJs9C\n' +
  111. ' 0sPCBpjDnyK9Z04=\n' +
  112. ' -----END PRIVATE KEY-----')
  113. var u = await J[x(724, "(0wh")](data, t)
  114. console.log(u.value)
  115. }
  116. key='aaaaa'
  117. data='bbbbb'
  118.  
  119. // key='XnQvC8xtVGmv7UeLrf3rN/yRlYuMEV/b8QIBhblw3YF1Htx4d37l0AIGWpfaeR+wLv6PtCYsBfta0z0vlzq2bSEVXHnE00oKaHCRSeQ0p9q3VRrfJv1U+uL+/ekfco+NgiuO0XeEd3ROTFneZDnglBD7YJ+XMrv/wJhvwe0fT6E='
  120. // data="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"
  121.  
  122. // get_data(key,data)
  123. get_data(key,data)
 
javascript

python代码:

 
  1. import requests
  2. import json
  3. import subprocess
  4.  
  5.  
  6. class JianYu():
  7. def __init__(self):
  8. self.headers = {
  9. "accept": "application/json, text/plain, */*",
  10. "accept-language": "zh-CN,zh;q=0.9",
  11. "content-type": "application/json",
  12. "origin": "https://www.jianyu360.cn",
  13. "priority": "u=1, i",
  14. "referer": "https://www.jianyu360.cn/jylab/supsearch/index.html",
  15. "sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"",
  16. "sec-ch-ua-mobile": "?0",
  17. "sec-ch-ua-platform": "\"Windows\"",
  18. "sec-fetch-dest": "empty",
  19. "sec-fetch-mode": "cors",
  20. "sec-fetch-site": "same-origin",
  21. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
  22. }
  23. self.url = "https://www.jianyu360.cn/jyapi/jybx/core/fType/searchList"
  24.  
  25. def get_info(self, page):
  26. data = {
  27. "searchGroup": 1,
  28. "reqType": "lastNews",
  29. "pageNum": page,
  30. "pageSize": 50,
  31. "searchMode": 0,
  32. "publishTime": "1727423038-1758959038",
  33. "selectType": "title,content",
  34.  
  35. }
  36. data = json.dumps(data, separators=(',', ':'))
  37. res_data = requests.post(self.url, headers=self.headers, data=data).json()
  38.  
  39. js_code = open('剑鱼.js', encoding='utf-8').read().replace('aaaaa', res_data["secretKey"]).replace('bbbbb',res_data['data'])
  40. open('剑鱼_替换.js', 'w', encoding='utf-8').write(js_code)
  41.  
  42. result_data = subprocess.run(['node', '剑鱼_替换.js'], capture_output=True, text=True).stdout
  43. print(json.loads(result_data))
  44.  
  45. def main(self):
  46. for page in range(1, 5):
  47. print(f'正在爬取第{page}页')
  48. self.get_info(page)
  49.  
  50.  
  51. if __name__ == '__main__':
  52. jy = JianYu()
  53. jy.main()
 

逆向爬虫——JavaScript混淆技术_javascript 代码混淆-CSDN博客

 

posted @ 2025-12-09 13:46  CharyGao  阅读(1)  评论(0)    收藏  举报