8163 lines
768 KiB
HTML
8163 lines
768 KiB
HTML
<!doctype html>
|
||
<html>
|
||
<head>
|
||
<!--
|
||
Notice of Copyrights and Licenses:
|
||
***********************************
|
||
The bitaddress.org project, software and embedded resources are copyright bitaddress.org (pointbiz).
|
||
The bitaddress.org name and logo are not part of the open source license.
|
||
|
||
Portions of the all-in-one HTML document contain JavaScript codes that are the copyrights of others.
|
||
The individual copyrights are included throughout the document along with their licenses.
|
||
Included JavaScript libraries are separated with HTML script tags.
|
||
|
||
Summary of JavaScript functions with a redistributable license:
|
||
JavaScript function License
|
||
******************* ***************
|
||
window.Crypto BSD License
|
||
window.SecureRandom BSD License
|
||
window.EllipticCurve BSD License
|
||
window.BigInteger BSD License
|
||
window.QRCode MIT License
|
||
window.Bitcoin MIT License
|
||
window.Crypto_scrypt MIT License
|
||
|
||
The bitaddress.org software is available under The MIT License (MIT)
|
||
Copyright (c) 2011-2016 bitaddress.org (pointbiz)
|
||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||
sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject
|
||
to the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||
portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
||
GitHub Repository: https://github.com/SmartCash/PaperWalletGenerator
|
||
-->
|
||
|
||
<title>smartcash.cc</title>
|
||
<link rel="icon" href="https://smartcash.cc/wp-content/uploads/2017/08/smartfavi.ico" type="image/x-icon">
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<script type="text/javascript">
|
||
if((location.href).match("http://paperwallet.smartcash.cc")) {
|
||
location.href = "https://paperwallet.smartcash.cc";
|
||
}
|
||
var hash_keccak = function(s) { return CryptoJS.SHA3(s, { outputLength: 256, asBytes: true }); }
|
||
var hash_sha256 = function(s) { return CryptoJS.SHA256(s, { asBytes: true }); }
|
||
var hash_ripemd160 = function(s) { return CryptoJS.RIPEMD160(s, { asBytes: true }); }
|
||
var create_keypair = function() {
|
||
var keypair = KEYUTIL.generateKeypair("EC", "secp256k1");
|
||
return {prvKey: keypair.prvKeyObj.prvKeyHex, pubKey: keypair.pubKeyObj.pubKeyHex};
|
||
}
|
||
function wordArrayToByteArray(wordArray) {
|
||
var words = wordArray.words;
|
||
var sigBytes = wordArray.sigBytes;
|
||
var u8 = new Uint8Array(sigBytes);
|
||
for (var i = 0; i < sigBytes; i++) {
|
||
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||
u8[i]=byte;
|
||
}
|
||
return u8;
|
||
}
|
||
var prvKey_to_WIF = function(prvKey, compressed) {
|
||
prvKey = compressed ? prvKey+'01' : prvKey;
|
||
var baby = CryptoJS.enc.Hex.parse(prvKey);
|
||
var version = CryptoJS.enc.Hex.parse('BF');
|
||
var child = version.concat(baby);
|
||
var teenager = hash_keccak(child);
|
||
var checksum = CryptoJS.lib.WordArray.create(teenager.words.slice(0, 4), 4);
|
||
var adult = child.concat(checksum);
|
||
var bytes = wordArrayToByteArray(adult);
|
||
return bs58_encode(bytes);
|
||
}
|
||
var create_address = function(pubkey) {
|
||
var key = CryptoJS.enc.Hex.parse(pubkey);
|
||
var baby = hash_sha256(key);
|
||
var child = hash_ripemd160(baby);
|
||
var version = CryptoJS.enc.Hex.parse('3F');
|
||
version.concat(child);
|
||
var teenager = version;
|
||
var adult = hash_keccak(teenager);
|
||
var checksum = CryptoJS.lib.WordArray.create(adult.words.slice(0, 4), 4);
|
||
var pensioner = teenager;
|
||
pensioner.concat(checksum);
|
||
var bytes = wordArrayToByteArray(pensioner);
|
||
return bs58_encode(bytes);
|
||
}
|
||
function toggleClass(element, className){
|
||
if (!element || !className){ return; }
|
||
var classString = element.className, nameIndex = classString.indexOf(className);
|
||
if (nameIndex == -1) { classString += ' ' + className; }
|
||
else { classString = classString.substr(0, nameIndex) + classString.substr(nameIndex+className.length); }
|
||
element.className = classString;
|
||
}
|
||
function toggleSingelArt(hide) {
|
||
var SingleArt = document.getElementById('SingleArt');
|
||
toggleClass(SingleArt, 'removeImage');
|
||
}
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*
|
||
* jsrsasign 4.2.2 (c) 2010-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
/*
|
||
yahoo-min.js
|
||
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
|
||
Code licensed under the BSD License:
|
||
http://developer.yahoo.com/yui/license.html
|
||
version: 2.9.0
|
||
*/
|
||
if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var b=arguments,g=null,e,c,f;for(e=0;e<b.length;e=e+1){f=(""+b[e]).split(".");g=YAHOO;for(c=(f[0]=="YAHOO")?1:0;c<f.length;c=c+1){g[f[c]]=g[f[c]]||{};g=g[f[c]];}}return g;};YAHOO.log=function(d,a,c){var b=YAHOO.widget.Logger;if(b&&b.log){return b.log(d,a,c);}else{return false;}};YAHOO.register=function(a,f,e){var k=YAHOO.env.modules,c,j,h,g,d;if(!k[a]){k[a]={versions:[],builds:[]};}c=k[a];j=e.version;h=e.build;g=YAHOO.env.listeners;c.name=a;c.version=j;c.build=h;c.versions.push(j);c.builds.push(h);c.mainClass=f;for(d=0;d<g.length;d=d+1){g[d](c);}if(f){f.VERSION=j;f.BUILD=h;}else{YAHOO.log("mainClass is undefined for module "+a,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(a){return YAHOO.env.modules[a]||null;};YAHOO.env.parseUA=function(d){var e=function(i){var j=0;return parseFloat(i.replace(/\./g,function(){return(j++==1)?"":".";}));},h=navigator,g={ie:0,opera:0,gecko:0,webkit:0,chrome:0,mobile:null,air:0,ipad:0,iphone:0,ipod:0,ios:null,android:0,webos:0,caja:h&&h.cajaVersion,secure:false,os:null},c=d||(navigator&&navigator.userAgent),f=window&&window.location,b=f&&f.href,a;g.secure=b&&(b.toLowerCase().indexOf("https")===0);if(c){if((/windows|win32/i).test(c)){g.os="windows";}else{if((/macintosh/i).test(c)){g.os="macintosh";}else{if((/rhino/i).test(c)){g.os="rhino";}}}if((/KHTML/).test(c)){g.webkit=1;}a=c.match(/AppleWebKit\/([^\s]*)/);if(a&&a[1]){g.webkit=e(a[1]);if(/ Mobile\//.test(c)){g.mobile="Apple";a=c.match(/OS ([^\s]*)/);if(a&&a[1]){a=e(a[1].replace("_","."));}g.ios=a;g.ipad=g.ipod=g.iphone=0;a=c.match(/iPad|iPod|iPhone/);if(a&&a[0]){g[a[0].toLowerCase()]=g.ios;}}else{a=c.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);if(a){g.mobile=a[0];}if(/webOS/.test(c)){g.mobile="WebOS";a=c.match(/webOS\/([^\s]*);/);if(a&&a[1]){g.webos=e(a[1]);}}if(/ Android/.test(c)){g.mobile="Android";a=c.match(/Android ([^\s]*);/);if(a&&a[1]){g.android=e(a[1]);}}}a=c.match(/Chrome\/([^\s]*)/);if(a&&a[1]){g.chrome=e(a[1]);}else{a=c.match(/AdobeAIR\/([^\s]*)/);if(a){g.air=a[0];}}}if(!g.webkit){a=c.match(/Opera[\s\/]([^\s]*)/);if(a&&a[1]){g.opera=e(a[1]);a=c.match(/Version\/([^\s]*)/);if(a&&a[1]){g.opera=e(a[1]);}a=c.match(/Opera Mini[^;]*/);if(a){g.mobile=a[0];}}else{a=c.match(/MSIE\s([^;]*)/);if(a&&a[1]){g.ie=e(a[1]);}else{a=c.match(/Gecko\/([^\s]*)/);if(a){g.gecko=1;a=c.match(/rv:([^\s\)]*)/);if(a&&a[1]){g.gecko=e(a[1]);}}}}}}return g;};YAHOO.env.ua=YAHOO.env.parseUA();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var b=YAHOO_config.listener,a=YAHOO.env.listeners,d=true,c;if(b){for(c=0;c<a.length;c++){if(a[c]==b){d=false;break;}}if(d){a.push(b);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var f=YAHOO.lang,a=Object.prototype,c="[object Array]",h="[object Function]",i="[object Object]",b=[],g={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`"},d=["toString","valueOf"],e={isArray:function(j){return a.toString.apply(j)===c;},isBoolean:function(j){return typeof j==="boolean";},isFunction:function(j){return(typeof j==="function")||a.toString.apply(j)===h;},isNull:function(j){return j===null;},isNumber:function(j){return typeof j==="number"&&isFinite(j);},isObject:function(j){return(j&&(typeof j==="object"||f.isFunction(j)))||false;},isString:function(j){return typeof j==="string";},isUndefined:function(j){return typeof j==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(l,k){var j,n,m;for(j=0;j<d.length;j=j+1){n=d[j];m=k[n];if(f.isFunction(m)&&m!=a[n]){l[n]=m;}}}:function(){},escapeHTML:function(j){return j.replace(/[&<>"'\/`]/g,function(k){return g[k];});},extend:function(m,n,l){if(!n||!m){throw new Error("extend failed, please check that "+"all dependencies are included.");}var k=function(){},j;k.prototype=n.prototype;m.prototype=new k();m.prototype.constructor=m;m.superclass=n.prototype;if(n.prototype.constructor==a.constructor){n.prototype.constructor=n;}if(l){for(j in l){if(f.hasOwnProperty(l,j)){m.prototype[j]=l[j];}}f._IEEnumFix(m.prototype,l);}},augmentObject:function(n,m){if(!m||!n){throw new Error("Absorb failed, verify dependencies.");}var j=arguments,l,o,k=j[2];if(k&&k!==true){for(l=2;l<j.length;l=l+1){n[j[l]]=m[j[l]];}}else{for(o in m){if(k||!(o in n)){n[o]=m[o];}}f._IEEnumFix(n,m);}return n;},augmentProto:function(m,l){if(!l||!m){throw new Error("Augment failed, verify dependencies.");}var j=[m.prototype,l.prototype],k;for(k=2;k<arguments.length;k=k+1){j.push(arguments[k]);}f.augmentObject.apply(this,j);return m;},dump:function(j,p){var l,n,r=[],t="{...}",k="f(){...}",q=", ",m=" => ";if(!f.isObject(j)){return j+"";}else{if(j instanceof Date||("nodeType" in j&&"tagName" in j)){return j;}else{if(f.isFunction(j)){return k;}}}p=(f.isNumber(p))?p:3;if(f.isArray(j)){r.push("[");for(l=0,n=j.length;l<n;l=l+1){if(f.isObject(j[l])){r.push((p>0)?f.dump(j[l],p-1):t);}else{r.push(j[l]);}r.push(q);}if(r.length>1){r.pop();}r.push("]");}else{r.push("{");for(l in j){if(f.hasOwnProperty(j,l)){r.push(l+m);if(f.isObject(j[l])){r.push((p>0)?f.dump(j[l],p-1):t);}else{r.push(j[l]);}r.push(q);}}if(r.length>1){r.pop();}r.push("}");}return r.join("");},substitute:function(x,y,E,l){var D,C,B,G,t,u,F=[],p,z=x.length,A="dump",r=" ",q="{",m="}",n,w;for(;;){D=x.lastIndexOf(q,z);if(D<0){break;}C=x.indexOf(m,D);if(D+1>C){break;}p=x.substring(D+1,C);G=p;u=null;B=G.indexOf(r);if(B>-1){u=G.substring(B+1);G=G.substring(0,B);}t=y[G];if(E){t=E(G,t,u);}if(f.isObject(t)){if(f.isArray(t)){t=f.dump(t,parseInt(u,10));}else{u=u||"";n=u.indexOf(A);if(n>-1){u=u.substring(4);}w=t.toString();if(w===i||n>-1){t=f.dump(t,parseInt(u,10));}else{t=w;}}}else{if(!f.isString(t)&&!f.isNumber(t)){t="~-"+F.length+"-~";F[F.length]=p;}}x=x.substring(0,D)+t+x.substring(C+1);if(l===false){z=D-1;}}for(D=F.length-1;D>=0;D=D-1){x=x.replace(new RegExp("~-"+D+"-~"),"{"+F[D]+"}","g");}return x;},trim:function(j){try{return j.replace(/^\s+|\s+$/g,"");}catch(k){return j;
|
||
}},merge:function(){var n={},k=arguments,j=k.length,m;for(m=0;m<j;m=m+1){f.augmentObject(n,k[m],true);}return n;},later:function(t,k,u,n,p){t=t||0;k=k||{};var l=u,s=n,q,j;if(f.isString(u)){l=k[u];}if(!l){throw new TypeError("method undefined");}if(!f.isUndefined(n)&&!f.isArray(s)){s=[n];}q=function(){l.apply(k,s||b);};j=(p)?setInterval(q,t):setTimeout(q,t);return{interval:p,cancel:function(){if(this.interval){clearInterval(j);}else{clearTimeout(j);}}};},isValue:function(j){return(f.isObject(j)||f.isString(j)||f.isNumber(j)||f.isBoolean(j));}};f.hasOwnProperty=(a.hasOwnProperty)?function(j,k){return j&&j.hasOwnProperty&&j.hasOwnProperty(k);}:function(j,k){return !f.isUndefined(j[k])&&j.constructor.prototype[k]!==j[k];};e.augmentObject(f,e,true);YAHOO.util.Lang=f;f.augment=f.augmentProto;YAHOO.augment=f.augmentProto;YAHOO.extend=f.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.9.0",build:"2800"});
|
||
/*! CryptoJS v3.1.2 core-fix.js
|
||
* code.google.com/p/crypto-js
|
||
* (c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
* code.google.com/p/crypto-js/wiki/License
|
||
* THIS IS FIX of 'core.js' to fix Hmac issue.
|
||
* https://code.google.com/p/crypto-js/issues/detail?id=84
|
||
* https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js
|
||
*/
|
||
var CryptoJS=CryptoJS||(function(e,g){var a={};var b=a.lib={};var j=b.Base=(function(){function n(){}return{extend:function(p){n.prototype=this;var o=new n();if(p){o.mixIn(p)}if(!o.hasOwnProperty("init")){o.init=function(){o.$super.init.apply(this,arguments)}}o.init.prototype=o;o.$super=this;return o},create:function(){var o=this.extend();o.init.apply(o,arguments);return o},init:function(){},mixIn:function(p){for(var o in p){if(p.hasOwnProperty(o)){this[o]=p[o]}}if(p.hasOwnProperty("toString")){this.toString=p.toString}},clone:function(){return this.init.prototype.extend(this)}}}());var l=b.WordArray=j.extend({init:function(o,n){o=this.words=o||[];if(n!=g){this.sigBytes=n}else{this.sigBytes=o.length*4}},toString:function(n){return(n||h).stringify(this)},concat:function(t){var q=this.words;var p=t.words;var n=this.sigBytes;var s=t.sigBytes;this.clamp();if(n%4){for(var r=0;r<s;r++){var o=(p[r>>>2]>>>(24-(r%4)*8))&255;q[(n+r)>>>2]|=o<<(24-((n+r)%4)*8)}}else{for(var r=0;r<s;r+=4){q[(n+r)>>>2]=p[r>>>2]}}this.sigBytes+=s;return this},clamp:function(){var o=this.words;var n=this.sigBytes;o[n>>>2]&=4294967295<<(32-(n%4)*8);o.length=e.ceil(n/4)},clone:function(){var n=j.clone.call(this);n.words=this.words.slice(0);return n},random:function(p){var o=[];for(var n=0;n<p;n+=4){o.push((e.random()*4294967296)|0)}return new l.init(o,p)}});var m=a.enc={};var h=m.Hex={stringify:function(p){var r=p.words;var o=p.sigBytes;var q=[];for(var n=0;n<o;n++){var s=(r[n>>>2]>>>(24-(n%4)*8))&255;q.push((s>>>4).toString(16));q.push((s&15).toString(16))}return q.join("")},parse:function(p){var n=p.length;var q=[];for(var o=0;o<n;o+=2){q[o>>>3]|=parseInt(p.substr(o,2),16)<<(24-(o%8)*4)}return new l.init(q,n/2)}};var d=m.Latin1={stringify:function(q){var r=q.words;var p=q.sigBytes;var n=[];for(var o=0;o<p;o++){var s=(r[o>>>2]>>>(24-(o%4)*8))&255;n.push(String.fromCharCode(s))}return n.join("")},parse:function(p){var n=p.length;var q=[];for(var o=0;o<n;o++){q[o>>>2]|=(p.charCodeAt(o)&255)<<(24-(o%4)*8)}return new l.init(q,n)}};var c=m.Utf8={stringify:function(n){try{return decodeURIComponent(escape(d.stringify(n)))}catch(o){throw new Error("Malformed UTF-8 data")}},parse:function(n){return d.parse(unescape(encodeURIComponent(n)))}};var i=b.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new l.init();this._nDataBytes=0},_append:function(n){if(typeof n=="string"){n=c.parse(n)}this._data.concat(n);this._nDataBytes+=n.sigBytes},_process:function(w){var q=this._data;var x=q.words;var n=q.sigBytes;var t=this.blockSize;var v=t*4;var u=n/v;if(w){u=e.ceil(u)}else{u=e.max((u|0)-this._minBufferSize,0)}var s=u*t;var r=e.min(s*4,n);if(s){for(var p=0;p<s;p+=t){this._doProcessBlock(x,p)}var o=x.splice(0,s);q.sigBytes-=r}return new l.init(o,r)},clone:function(){var n=j.clone.call(this);n._data=this._data.clone();return n},_minBufferSize:0});var f=b.Hasher=i.extend({cfg:j.extend(),init:function(n){this.cfg=this.cfg.extend(n);this.reset()},reset:function(){i.reset.call(this);this._doReset()},update:function(n){this._append(n);this._process();return this},finalize:function(n){if(n){this._append(n)}var o=this._doFinalize();return o},blockSize:512/32,_createHelper:function(n){return function(p,o){return new n.init(o).finalize(p)}},_createHmacHelper:function(n){return function(p,o){return new k.HMAC.init(n,o).finalize(p)}}});var k=a.algo={};return a}(Math));/*
|
||
CryptoJS v3.1.2 x64-core-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(g){var a=CryptoJS,f=a.lib,e=f.Base,h=f.WordArray,a=a.x64={};a.Word=e.extend({init:function(b,c){this.high=b;this.low=c}});a.WordArray=e.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=g?c:8*b.length},toX32:function(){for(var b=this.words,c=b.length,a=[],d=0;d<c;d++){var e=b[d];a.push(e.high);a.push(e.low)}return h.create(a,this.sigBytes)},clone:function(){for(var b=e.clone.call(this),c=b.words=this.words.slice(0),a=c.length,d=0;d<a;d++)c[d]=c[d].clone();return b}})})();
|
||
/*
|
||
CryptoJS v3.1.2 hmac-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var c=CryptoJS,k=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=k.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;d<c;d++)h[d]^=1549556828,j[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
|
||
this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
|
||
/*
|
||
CryptoJS v3.1.2 sha256-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(k){for(var g=CryptoJS,h=g.lib,v=h.WordArray,j=h.Hasher,h=g.algo,s=[],t=[],u=function(q){return 4294967296*(q-(q|0))|0},l=2,b=0;64>b;){var d;a:{d=l;for(var w=k.sqrt(d),r=2;r<=w;r++)if(!(d%r)){d=!1;break a}d=!0}d&&(8>b&&(s[b]=u(k.pow(l,0.5))),t[b]=u(k.pow(l,1/3)),b++);l++}var n=[],h=h.SHA256=j.extend({_doReset:function(){this._hash=new v.init(s.slice(0))},_doProcessBlock:function(q,h){for(var a=this._hash.words,c=a[0],d=a[1],b=a[2],k=a[3],f=a[4],g=a[5],j=a[6],l=a[7],e=0;64>e;e++){if(16>e)n[e]=
|
||
q[h+e]|0;else{var m=n[e-15],p=n[e-2];n[e]=((m<<25|m>>>7)^(m<<14|m>>>18)^m>>>3)+n[e-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+n[e-16]}m=l+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&g^~f&j)+t[e]+n[e];p=((c<<30|c>>>2)^(c<<19|c>>>13)^(c<<10|c>>>22))+(c&d^c&b^d&b);l=j;j=g;g=f;f=k+m|0;k=b;b=d;d=c;c=m+p|0}a[0]=a[0]+c|0;a[1]=a[1]+d|0;a[2]=a[2]+b|0;a[3]=a[3]+k|0;a[4]=a[4]+f|0;a[5]=a[5]+g|0;a[6]=a[6]+j|0;a[7]=a[7]+l|0},_doFinalize:function(){var d=this._data,b=d.words,a=8*this._nDataBytes,c=8*d.sigBytes;
|
||
b[c>>>5]|=128<<24-c%32;b[(c+64>>>9<<4)+14]=k.floor(a/4294967296);b[(c+64>>>9<<4)+15]=a;d.sigBytes=4*b.length;this._process();return this._hash},clone:function(){var b=j.clone.call(this);b._hash=this._hash.clone();return b}});g.SHA256=j._createHelper(h);g.HmacSHA256=j._createHmacHelper(h)})(Math);
|
||
/*
|
||
CryptoJS v3.1.2 sha224-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var b=CryptoJS,d=b.lib.WordArray,a=b.algo,c=a.SHA256,a=a.SHA224=c.extend({_doReset:function(){this._hash=new d.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var a=c._doFinalize.call(this);a.sigBytes-=4;return a}});b.SHA224=c._createHelper(a);b.HmacSHA224=c._createHmacHelper(a)})();
|
||
/*
|
||
CryptoJS v3.1.2 sha512-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){function a(){return d.create.apply(d,arguments)}for(var n=CryptoJS,r=n.lib.Hasher,e=n.x64,d=e.Word,T=e.WordArray,e=n.algo,ea=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
|
||
a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
|
||
2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
|
||
a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
|
||
3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],w=0;80>w;w++)v[w]=a();e=e.SHA512=r.extend({_doReset:function(){this._hash=new T.init([new d.init(1779033703,4089235720),new d.init(3144134277,2227873595),new d.init(1013904242,4271175723),new d.init(2773480762,1595750129),new d.init(1359893119,2917565137),new d.init(2600822924,725511199),new d.init(528734635,4215389547),new d.init(1541459225,327033209)])},_doProcessBlock:function(a,d){for(var f=this._hash.words,
|
||
F=f[0],e=f[1],n=f[2],r=f[3],G=f[4],H=f[5],I=f[6],f=f[7],w=F.high,J=F.low,X=e.high,K=e.low,Y=n.high,L=n.low,Z=r.high,M=r.low,$=G.high,N=G.low,aa=H.high,O=H.low,ba=I.high,P=I.low,ca=f.high,Q=f.low,k=w,g=J,z=X,x=K,A=Y,y=L,U=Z,B=M,l=$,h=N,R=aa,C=O,S=ba,D=P,V=ca,E=Q,m=0;80>m;m++){var s=v[m];if(16>m)var j=s.high=a[d+2*m]|0,b=s.low=a[d+2*m+1]|0;else{var j=v[m-15],b=j.high,p=j.low,j=(b>>>1|p<<31)^(b>>>8|p<<24)^b>>>7,p=(p>>>1|b<<31)^(p>>>8|b<<24)^(p>>>7|b<<25),u=v[m-2],b=u.high,c=u.low,u=(b>>>19|c<<13)^(b<<
|
||
3|c>>>29)^b>>>6,c=(c>>>19|b<<13)^(c<<3|b>>>29)^(c>>>6|b<<26),b=v[m-7],W=b.high,t=v[m-16],q=t.high,t=t.low,b=p+b.low,j=j+W+(b>>>0<p>>>0?1:0),b=b+c,j=j+u+(b>>>0<c>>>0?1:0),b=b+t,j=j+q+(b>>>0<t>>>0?1:0);s.high=j;s.low=b}var W=l&R^~l&S,t=h&C^~h&D,s=k&z^k&A^z&A,T=g&x^g&y^x&y,p=(k>>>28|g<<4)^(k<<30|g>>>2)^(k<<25|g>>>7),u=(g>>>28|k<<4)^(g<<30|k>>>2)^(g<<25|k>>>7),c=ea[m],fa=c.high,da=c.low,c=E+((h>>>14|l<<18)^(h>>>18|l<<14)^(h<<23|l>>>9)),q=V+((l>>>14|h<<18)^(l>>>18|h<<14)^(l<<23|h>>>9))+(c>>>0<E>>>0?1:
|
||
0),c=c+t,q=q+W+(c>>>0<t>>>0?1:0),c=c+da,q=q+fa+(c>>>0<da>>>0?1:0),c=c+b,q=q+j+(c>>>0<b>>>0?1:0),b=u+T,s=p+s+(b>>>0<u>>>0?1:0),V=S,E=D,S=R,D=C,R=l,C=h,h=B+c|0,l=U+q+(h>>>0<B>>>0?1:0)|0,U=A,B=y,A=z,y=x,z=k,x=g,g=c+b|0,k=q+s+(g>>>0<c>>>0?1:0)|0}J=F.low=J+g;F.high=w+k+(J>>>0<g>>>0?1:0);K=e.low=K+x;e.high=X+z+(K>>>0<x>>>0?1:0);L=n.low=L+y;n.high=Y+A+(L>>>0<y>>>0?1:0);M=r.low=M+B;r.high=Z+U+(M>>>0<B>>>0?1:0);N=G.low=N+h;G.high=$+l+(N>>>0<h>>>0?1:0);O=H.low=O+C;H.high=aa+R+(O>>>0<C>>>0?1:0);P=I.low=P+D;
|
||
I.high=ba+S+(P>>>0<D>>>0?1:0);Q=f.low=Q+E;f.high=ca+V+(Q>>>0<E>>>0?1:0)},_doFinalize:function(){var a=this._data,d=a.words,f=8*this._nDataBytes,e=8*a.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+128>>>10<<5)+30]=Math.floor(f/4294967296);d[(e+128>>>10<<5)+31]=f;a.sigBytes=4*d.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});n.SHA512=r._createHelper(e);n.HmacSHA512=r._createHmacHelper(e)})();
|
||
/*
|
||
CryptoJS v3.1.2 sha384-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var c=CryptoJS,a=c.x64,b=a.Word,e=a.WordArray,a=c.algo,d=a.SHA512,a=a.SHA384=d.extend({_doReset:function(){this._hash=new e.init([new b.init(3418070365,3238371032),new b.init(1654270250,914150663),new b.init(2438529370,812702999),new b.init(355462360,4144912697),new b.init(1731405415,4290775857),new b.init(2394180231,1750603025),new b.init(3675008525,1694076839),new b.init(1203062813,3204075428)])},_doFinalize:function(){var a=d._doFinalize.call(this);a.sigBytes-=16;return a}});c.SHA384=
|
||
d._createHelper(a);c.HmacSHA384=d._createHmacHelper(a)})();
|
||
/*
|
||
CryptoJS v3.1.2 md5-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(E){function h(a,f,g,j,p,h,k){a=a+(f&g|~f&j)+p+k;return(a<<h|a>>>32-h)+f}function k(a,f,g,j,p,h,k){a=a+(f&j|g&~j)+p+k;return(a<<h|a>>>32-h)+f}function l(a,f,g,j,h,k,l){a=a+(f^g^j)+h+l;return(a<<k|a>>>32-k)+f}function n(a,f,g,j,h,k,l){a=a+(g^(f|~j))+h+l;return(a<<k|a>>>32-k)+f}for(var r=CryptoJS,q=r.lib,F=q.WordArray,s=q.Hasher,q=r.algo,a=[],t=0;64>t;t++)a[t]=4294967296*E.abs(E.sin(t+1))|0;q=q.MD5=s.extend({_doReset:function(){this._hash=new F.init([1732584193,4023233417,2562383102,271733878])},
|
||
_doProcessBlock:function(m,f){for(var g=0;16>g;g++){var j=f+g,p=m[j];m[j]=(p<<8|p>>>24)&16711935|(p<<24|p>>>8)&4278255360}var g=this._hash.words,j=m[f+0],p=m[f+1],q=m[f+2],r=m[f+3],s=m[f+4],t=m[f+5],u=m[f+6],v=m[f+7],w=m[f+8],x=m[f+9],y=m[f+10],z=m[f+11],A=m[f+12],B=m[f+13],C=m[f+14],D=m[f+15],b=g[0],c=g[1],d=g[2],e=g[3],b=h(b,c,d,e,j,7,a[0]),e=h(e,b,c,d,p,12,a[1]),d=h(d,e,b,c,q,17,a[2]),c=h(c,d,e,b,r,22,a[3]),b=h(b,c,d,e,s,7,a[4]),e=h(e,b,c,d,t,12,a[5]),d=h(d,e,b,c,u,17,a[6]),c=h(c,d,e,b,v,22,a[7]),
|
||
b=h(b,c,d,e,w,7,a[8]),e=h(e,b,c,d,x,12,a[9]),d=h(d,e,b,c,y,17,a[10]),c=h(c,d,e,b,z,22,a[11]),b=h(b,c,d,e,A,7,a[12]),e=h(e,b,c,d,B,12,a[13]),d=h(d,e,b,c,C,17,a[14]),c=h(c,d,e,b,D,22,a[15]),b=k(b,c,d,e,p,5,a[16]),e=k(e,b,c,d,u,9,a[17]),d=k(d,e,b,c,z,14,a[18]),c=k(c,d,e,b,j,20,a[19]),b=k(b,c,d,e,t,5,a[20]),e=k(e,b,c,d,y,9,a[21]),d=k(d,e,b,c,D,14,a[22]),c=k(c,d,e,b,s,20,a[23]),b=k(b,c,d,e,x,5,a[24]),e=k(e,b,c,d,C,9,a[25]),d=k(d,e,b,c,r,14,a[26]),c=k(c,d,e,b,w,20,a[27]),b=k(b,c,d,e,B,5,a[28]),e=k(e,b,
|
||
c,d,q,9,a[29]),d=k(d,e,b,c,v,14,a[30]),c=k(c,d,e,b,A,20,a[31]),b=l(b,c,d,e,t,4,a[32]),e=l(e,b,c,d,w,11,a[33]),d=l(d,e,b,c,z,16,a[34]),c=l(c,d,e,b,C,23,a[35]),b=l(b,c,d,e,p,4,a[36]),e=l(e,b,c,d,s,11,a[37]),d=l(d,e,b,c,v,16,a[38]),c=l(c,d,e,b,y,23,a[39]),b=l(b,c,d,e,B,4,a[40]),e=l(e,b,c,d,j,11,a[41]),d=l(d,e,b,c,r,16,a[42]),c=l(c,d,e,b,u,23,a[43]),b=l(b,c,d,e,x,4,a[44]),e=l(e,b,c,d,A,11,a[45]),d=l(d,e,b,c,D,16,a[46]),c=l(c,d,e,b,q,23,a[47]),b=n(b,c,d,e,j,6,a[48]),e=n(e,b,c,d,v,10,a[49]),d=n(d,e,b,c,
|
||
C,15,a[50]),c=n(c,d,e,b,t,21,a[51]),b=n(b,c,d,e,A,6,a[52]),e=n(e,b,c,d,r,10,a[53]),d=n(d,e,b,c,y,15,a[54]),c=n(c,d,e,b,p,21,a[55]),b=n(b,c,d,e,w,6,a[56]),e=n(e,b,c,d,D,10,a[57]),d=n(d,e,b,c,u,15,a[58]),c=n(c,d,e,b,B,21,a[59]),b=n(b,c,d,e,s,6,a[60]),e=n(e,b,c,d,z,10,a[61]),d=n(d,e,b,c,q,15,a[62]),c=n(c,d,e,b,x,21,a[63]);g[0]=g[0]+b|0;g[1]=g[1]+c|0;g[2]=g[2]+d|0;g[3]=g[3]+e|0},_doFinalize:function(){var a=this._data,f=a.words,g=8*this._nDataBytes,j=8*a.sigBytes;f[j>>>5]|=128<<24-j%32;var h=E.floor(g/
|
||
4294967296);f[(j+64>>>9<<4)+15]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;f[(j+64>>>9<<4)+14]=(g<<8|g>>>24)&16711935|(g<<24|g>>>8)&4278255360;a.sigBytes=4*(f.length+1);this._process();a=this._hash;f=a.words;for(g=0;4>g;g++)j=f[g],f[g]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=s.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=s._createHelper(q);r.HmacMD5=s._createHmacHelper(q)})(Math);
|
||
/*
|
||
CryptoJS v3.1.2 enc-base64-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
|
||
e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
||
/*
|
||
CryptoJS v3.1.2 cipher-core-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
CryptoJS.lib.Cipher||function(u){var g=CryptoJS,f=g.lib,k=f.Base,l=f.WordArray,q=f.BufferedBlockAlgorithm,r=g.enc.Base64,v=g.algo.EvpKDF,n=f.Cipher=q.extend({cfg:k.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){q.reset.call(this);this._doReset()},process:function(a){this._append(a);
|
||
return this._process()},finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?s:j).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?s:j).decrypt(a,b,c,d)}}}});f.StreamCipher=n.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var m=g.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=u:d=this._prevBlock;for(var e=
|
||
0;e<c;e++)a[b+e]^=d[e]},h=(f.BlockCipherMode=k.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();h.Encryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});h.Decryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,
|
||
b);t.call(this,a,b,d);this._prevBlock=e}});m=m.CBC=h;h=(g.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],f=0;f<c;f+=4)e.push(d);c=l.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};f.BlockCipher=n.extend({cfg:n.cfg.extend({mode:m,padding:h}),reset:function(){n.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;
|
||
this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var p=f.CipherParams=k.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),m=(g.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;
|
||
return(a?l.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=l.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return p.create({ciphertext:a,salt:c})}},j=f.SerializableCipher=k.extend({cfg:k.extend({format:m}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return p.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,
|
||
blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),g=(g.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=l.random(8));a=v.create({keySize:b+c}).compute(a,d);c=l.create(a.words.slice(b),4*c);a.sigBytes=4*b;return p.create({key:a,iv:c,salt:d})}},s=f.PasswordBasedCipher=j.extend({cfg:j.cfg.extend({kdf:g}),encrypt:function(a,
|
||
b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,a.keySize,a.ivSize);d.iv=c.iv;a=j.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return j.decrypt.call(this,a,b,c.key,d)}})}();
|
||
/*
|
||
CryptoJS v3.1.2 aes-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){for(var q=CryptoJS,x=q.lib.BlockCipher,r=q.algo,j=[],y=[],z=[],A=[],B=[],C=[],s=[],u=[],v=[],w=[],g=[],k=0;256>k;k++)g[k]=128>k?k<<1:k<<1^283;for(var n=0,l=0,k=0;256>k;k++){var f=l^l<<1^l<<2^l<<3^l<<4,f=f>>>8^f&255^99;j[n]=f;y[f]=n;var t=g[n],D=g[t],E=g[D],b=257*g[f]^16843008*f;z[n]=b<<24|b>>>8;A[n]=b<<16|b>>>16;B[n]=b<<8|b>>>24;C[n]=b;b=16843009*E^65537*D^257*t^16843008*n;s[f]=b<<24|b>>>8;u[f]=b<<16|b>>>16;v[f]=b<<8|b>>>24;w[f]=b;n?(n=t^g[g[g[E^t]]],l^=g[g[l]]):n=l=1}var F=[0,1,2,4,8,
|
||
16,32,64,128,27,54],r=r.AES=x.extend({_doReset:function(){for(var c=this._key,e=c.words,a=c.sigBytes/4,c=4*((this._nRounds=a+6)+1),b=this._keySchedule=[],h=0;h<c;h++)if(h<a)b[h]=e[h];else{var d=b[h-1];h%a?6<a&&4==h%a&&(d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255]):(d=d<<8|d>>>24,d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255],d^=F[h/a|0]<<24);b[h]=b[h-a]^d}e=this._invKeySchedule=[];for(a=0;a<c;a++)h=c-a,d=a%4?b[h]:b[h-4],e[a]=4>a||4>=h?d:s[j[d>>>24]]^u[j[d>>>16&255]]^v[j[d>>>
|
||
8&255]]^w[j[d&255]]},encryptBlock:function(c,e){this._doCryptBlock(c,e,this._keySchedule,z,A,B,C,j)},decryptBlock:function(c,e){var a=c[e+1];c[e+1]=c[e+3];c[e+3]=a;this._doCryptBlock(c,e,this._invKeySchedule,s,u,v,w,y);a=c[e+1];c[e+1]=c[e+3];c[e+3]=a},_doCryptBlock:function(c,e,a,b,h,d,j,m){for(var n=this._nRounds,f=c[e]^a[0],g=c[e+1]^a[1],k=c[e+2]^a[2],p=c[e+3]^a[3],l=4,t=1;t<n;t++)var q=b[f>>>24]^h[g>>>16&255]^d[k>>>8&255]^j[p&255]^a[l++],r=b[g>>>24]^h[k>>>16&255]^d[p>>>8&255]^j[f&255]^a[l++],s=
|
||
b[k>>>24]^h[p>>>16&255]^d[f>>>8&255]^j[g&255]^a[l++],p=b[p>>>24]^h[f>>>16&255]^d[g>>>8&255]^j[k&255]^a[l++],f=q,g=r,k=s;q=(m[f>>>24]<<24|m[g>>>16&255]<<16|m[k>>>8&255]<<8|m[p&255])^a[l++];r=(m[g>>>24]<<24|m[k>>>16&255]<<16|m[p>>>8&255]<<8|m[f&255])^a[l++];s=(m[k>>>24]<<24|m[p>>>16&255]<<16|m[f>>>8&255]<<8|m[g&255])^a[l++];p=(m[p>>>24]<<24|m[f>>>16&255]<<16|m[g>>>8&255]<<8|m[k&255])^a[l++];c[e]=q;c[e+1]=r;c[e+2]=s;c[e+3]=p},keySize:8});q.AES=x._createHelper(r)})();
|
||
/*
|
||
CryptoJS v3.1.2 tripledes-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){function j(b,c){var a=(this._lBlock>>>b^this._rBlock)&c;this._rBlock^=a;this._lBlock^=a<<b}function l(b,c){var a=(this._rBlock>>>b^this._lBlock)&c;this._lBlock^=a;this._rBlock^=a<<b}var h=CryptoJS,e=h.lib,n=e.WordArray,e=e.BlockCipher,g=h.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],p=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
|
||
55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],r=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],s=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
|
||
2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
|
||
1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
|
||
75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
|
||
276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
|
||
14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
|
||
17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
|
||
98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
|
||
1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
|
||
10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
|
||
83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
|
||
2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
|
||
16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
|
||
496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
|
||
2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
|
||
2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],t=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],m=g.DES=e.extend({_doReset:function(){for(var b=this._key.words,c=[],a=0;56>a;a++){var f=q[a]-1;c[a]=b[f>>>5]>>>31-f%32&1}b=this._subKeys=[];for(f=0;16>f;f++){for(var d=b[f]=[],e=r[f],a=0;24>a;a++)d[a/6|0]|=c[(p[a]-1+e)%28]<<31-a%6,d[4+(a/6|0)]|=c[28+(p[a+24]-1+e)%28]<<31-a%6;d[0]=d[0]<<1|d[0]>>>31;for(a=1;7>a;a++)d[a]>>>=
|
||
4*(a-1)+3;d[7]=d[7]<<5|d[7]>>>27}c=this._invSubKeys=[];for(a=0;16>a;a++)c[a]=b[15-a]},encryptBlock:function(b,c){this._doCryptBlock(b,c,this._subKeys)},decryptBlock:function(b,c){this._doCryptBlock(b,c,this._invSubKeys)},_doCryptBlock:function(b,c,a){this._lBlock=b[c];this._rBlock=b[c+1];j.call(this,4,252645135);j.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);j.call(this,1,1431655765);for(var f=0;16>f;f++){for(var d=a[f],e=this._lBlock,h=this._rBlock,g=0,k=0;8>k;k++)g|=s[k][((h^
|
||
d[k])&t[k])>>>0];this._lBlock=h;this._rBlock=e^g}a=this._lBlock;this._lBlock=this._rBlock;this._rBlock=a;j.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);j.call(this,16,65535);j.call(this,4,252645135);b[c]=this._lBlock;b[c+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});h.DES=e._createHelper(m);g=g.TripleDES=e.extend({_doReset:function(){var b=this._key.words;this._des1=m.createEncryptor(n.create(b.slice(0,2)));this._des2=m.createEncryptor(n.create(b.slice(2,4)));this._des3=
|
||
m.createEncryptor(n.create(b.slice(4,6)))},encryptBlock:function(b,c){this._des1.encryptBlock(b,c);this._des2.decryptBlock(b,c);this._des3.encryptBlock(b,c)},decryptBlock:function(b,c){this._des3.decryptBlock(b,c);this._des2.encryptBlock(b,c);this._des1.decryptBlock(b,c)},keySize:6,ivSize:2,blockSize:2});h.TripleDES=e._createHelper(g)})();
|
||
/*
|
||
CryptoJS v3.1.2 sha1-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var k=CryptoJS,b=k.lib,m=b.WordArray,l=b.Hasher,d=[],b=k.algo.SHA1=l.extend({_doReset:function(){this._hash=new m.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(n,p){for(var a=this._hash.words,e=a[0],f=a[1],h=a[2],j=a[3],b=a[4],c=0;80>c;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^
|
||
j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})();
|
||
/*
|
||
CryptoJS v3.1.2 ripemd160-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
/*
|
||
|
||
(c) 2012 by Cedric Mesnil. All rights reserved.
|
||
|
||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||
|
||
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
*/
|
||
(function(){var q=CryptoJS,d=q.lib,n=d.WordArray,p=d.Hasher,d=q.algo,x=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),y=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),z=n.create([11,14,15,12,
|
||
5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),B=n.create([0,1518500249,1859775393,2400959708,2840853838]),C=n.create([1352829926,1548603684,1836072691,
|
||
2053994217,0]),d=d.RIPEMD160=p.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,v){for(var b=0;16>b;b++){var c=v+b,f=e[c];e[c]=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360}var c=this._hash.words,f=B.words,d=C.words,n=x.words,q=y.words,p=z.words,w=A.words,t,g,h,j,r,u,k,l,m,s;u=t=c[0];k=g=c[1];l=h=c[2];m=j=c[3];s=r=c[4];for(var a,b=0;80>b;b+=1)a=t+e[v+n[b]]|0,a=16>b?a+((g^h^j)+f[0]):32>b?a+((g&h|~g&j)+f[1]):48>b?
|
||
a+(((g|~h)^j)+f[2]):64>b?a+((g&j|h&~j)+f[3]):a+((g^(h|~j))+f[4]),a|=0,a=a<<p[b]|a>>>32-p[b],a=a+r|0,t=r,r=j,j=h<<10|h>>>22,h=g,g=a,a=u+e[v+q[b]]|0,a=16>b?a+((k^(l|~m))+d[0]):32>b?a+((k&m|l&~m)+d[1]):48>b?a+(((k|~l)^m)+d[2]):64>b?a+((k&l|~k&m)+d[3]):a+((k^l^m)+d[4]),a|=0,a=a<<w[b]|a>>>32-w[b],a=a+s|0,u=s,s=m,m=l<<10|l>>>22,l=k,k=a;a=c[1]+h+m|0;c[1]=c[2]+j+s|0;c[2]=c[3]+r+u|0;c[3]=c[4]+t+k|0;c[4]=c[0]+g+l|0;c[0]=a},_doFinalize:function(){var e=this._data,d=e.words,b=8*this._nDataBytes,c=8*e.sigBytes;
|
||
d[c>>>5]|=128<<24-c%32;d[(c+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;e.sigBytes=4*(d.length+1);this._process();e=this._hash;d=e.words;for(b=0;5>b;b++)c=d[b],d[b]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return e},clone:function(){var d=p.clone.call(this);d._hash=this._hash.clone();return d}});q.RIPEMD160=p._createHelper(d);q.HmacRIPEMD160=p._createHmacHelper(d)})(Math);
|
||
/*
|
||
CryptoJS v3.1.2 pbkdf2-min.js
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function(){var b=CryptoJS,a=b.lib,d=a.Base,m=a.WordArray,a=b.algo,q=a.HMAC,l=a.PBKDF2=d.extend({cfg:d.extend({keySize:4,hasher:a.SHA1,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,f=q.create(c.hasher,a),g=m.create(),d=m.create([1]),l=g.words,r=d.words,n=c.keySize,c=c.iterations;l.length<n;){var h=f.update(b).finalize(d);f.reset();for(var j=h.words,s=j.length,k=h,p=1;p<c;p++){k=f.finalize(k);f.reset();for(var t=k.words,e=0;e<s;e++)j[e]^=t[e]}g.concat(h);
|
||
r[0]++}g.sigBytes=4*n;return g}});b.PBKDF2=function(a,b,c){return l.create(c).compute(a,b)}})();
|
||
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64pad="=";function hex2b64(d){var b;var e;var a="";for(b=0;b+3<=d.length;b+=3){e=parseInt(d.substring(b,b+3),16);a+=b64map.charAt(e>>6)+b64map.charAt(e&63)}if(b+1==d.length){e=parseInt(d.substring(b,b+1),16);a+=b64map.charAt(e<<2)}else{if(b+2==d.length){e=parseInt(d.substring(b,b+2),16);a+=b64map.charAt(e>>2)+b64map.charAt((e&3)<<4)}}if(b64pad){while((a.length&3)>0){a+=b64pad}}return a}function b64tohex(f){var d="";var e;var b=0;var c;var a;for(e=0;e<f.length;++e){if(f.charAt(e)==b64pad){break}a=b64map.indexOf(f.charAt(e));if(a<0){continue}if(b==0){d+=int2char(a>>2);c=a&3;b=1}else{if(b==1){d+=int2char((c<<2)|(a>>4));c=a&15;b=2}else{if(b==2){d+=int2char(c);d+=int2char(a>>2);c=a&3;b=3}else{d+=int2char((c<<2)|(a>>4));d+=int2char(a&15);b=0}}}}if(b==1){d+=int2char(c<<2)}return d}function b64toBA(e){var d=b64tohex(e);var c;var b=new Array();for(c=0;2*c<d.length;++c){b[c]=parseInt(d.substring(2*c,2*c+2),16)}return b};
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
var dbits;var canary=244837814094590;var j_lm=((canary&16777215)==15715070);function BigInteger(e,d,f){if(e!=null){if("number"==typeof e){this.fromNumber(e,d,f)}else{if(d==null&&"string"!=typeof e){this.fromString(e,256)}else{this.fromString(e,d)}}}}function nbi(){return new BigInteger(null)}function am1(f,a,b,e,h,g){while(--g>=0){var d=a*this[f++]+b[e]+h;h=Math.floor(d/67108864);b[e++]=d&67108863}return h}function am2(f,q,r,e,o,a){var k=q&32767,p=q>>15;while(--a>=0){var d=this[f]&32767;var g=this[f++]>>15;var b=p*d+g*k;d=k*d+((b&32767)<<15)+r[e]+(o&1073741823);o=(d>>>30)+(b>>>15)+p*g+(o>>>30);r[e++]=d&1073741823}return o}function am3(f,q,r,e,o,a){var k=q&16383,p=q>>14;while(--a>=0){var d=this[f]&16383;var g=this[f++]>>14;var b=p*d+g*k;d=k*d+((b&16383)<<14)+r[e]+o;o=(d>>28)+(b>>14)+p*g;r[e++]=d&268435455}return o}if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else{if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<<dbits)-1);BigInteger.prototype.DV=(1<<dbits);var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz";var BI_RC=new Array();var rr,vv;rr="0".charCodeAt(0);for(vv=0;vv<=9;++vv){BI_RC[rr++]=vv}rr="a".charCodeAt(0);for(vv=10;vv<36;++vv){BI_RC[rr++]=vv}rr="A".charCodeAt(0);for(vv=10;vv<36;++vv){BI_RC[rr++]=vv}function int2char(a){return BI_RM.charAt(a)}function intAt(b,a){var d=BI_RC[b.charCodeAt(a)];return(d==null)?-1:d}function bnpCopyTo(b){for(var a=this.t-1;a>=0;--a){b[a]=this[a]}b.t=this.t;b.s=this.s}function bnpFromInt(a){this.t=1;this.s=(a<0)?-1:0;if(a>0){this[0]=a}else{if(a<-1){this[0]=a+this.DV}else{this.t=0}}}function nbv(a){var b=nbi();b.fromInt(a);return b}function bnpFromString(h,c){var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==256){e=8}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{this.fromRadix(h,c);return}}}}}}this.t=0;this.s=0;var g=h.length,d=false,f=0;while(--g>=0){var a=(e==8)?h[g]&255:intAt(h,g);if(a<0){if(h.charAt(g)=="-"){d=true}continue}d=false;if(f==0){this[this.t++]=a}else{if(f+e>this.DB){this[this.t-1]|=(a&((1<<(this.DB-f))-1))<<f;this[this.t++]=(a>>(this.DB-f))}else{this[this.t-1]|=a<<f}}f+=e;if(f>=this.DB){f-=this.DB}}if(e==8&&(h[0]&128)!=0){this.s=-1;if(f>0){this[this.t-1]|=((1<<(this.DB-f))-1)<<f}}this.clamp();if(d){BigInteger.ZERO.subTo(this,this)}}function bnpClamp(){var a=this.s&this.DM;while(this.t>0&&this[this.t-1]==a){--this.t}}function bnToString(c){if(this.s<0){return"-"+this.negate().toString(c)}var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{return this.toRadix(c)}}}}}var g=(1<<e)-1,l,a=false,h="",f=this.t;var j=this.DB-(f*this.DB)%e;if(f-->0){if(j<this.DB&&(l=this[f]>>j)>0){a=true;h=int2char(l)}while(f>=0){if(j<e){l=(this[f]&((1<<j)-1))<<(e-j);l|=this[--f]>>(j+=this.DB-e)}else{l=(this[f]>>(j-=e))&g;if(j<=0){j+=this.DB;--f}}if(l>0){a=true}if(a){h+=int2char(l)}}}return a?h:"0"}function bnNegate(){var a=nbi();BigInteger.ZERO.subTo(this,a);return a}function bnAbs(){return(this.s<0)?this.negate():this}function bnCompareTo(b){var d=this.s-b.s;if(d!=0){return d}var c=this.t;d=c-b.t;if(d!=0){return(this.s<0)?-d:d}while(--c>=0){if((d=this[c]-b[c])!=0){return d}}return 0}function nbits(a){var c=1,b;if((b=a>>>16)!=0){a=b;c+=16}if((b=a>>8)!=0){a=b;c+=8}if((b=a>>4)!=0){a=b;c+=4}if((b=a>>2)!=0){a=b;c+=2}if((b=a>>1)!=0){a=b;c+=1}return c}function bnBitLength(){if(this.t<=0){return 0}return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))}function bnpDLShiftTo(c,b){var a;for(a=this.t-1;a>=0;--a){b[a+c]=this[a]}for(a=c-1;a>=0;--a){b[a]=0}b.t=this.t+c;b.s=this.s}function bnpDRShiftTo(c,b){for(var a=c;a<this.t;++a){b[a-c]=this[a]}b.t=Math.max(this.t-c,0);b.s=this.s}function bnpLShiftTo(j,e){var b=j%this.DB;var a=this.DB-b;var g=(1<<a)-1;var f=Math.floor(j/this.DB),h=(this.s<<b)&this.DM,d;for(d=this.t-1;d>=0;--d){e[d+f+1]=(this[d]>>a)|h;h=(this[d]&g)<<b}for(d=f-1;d>=0;--d){e[d]=0}e[f]=h;e.t=this.t+f+1;e.s=this.s;e.clamp()}function bnpRShiftTo(g,d){d.s=this.s;var e=Math.floor(g/this.DB);if(e>=this.t){d.t=0;return}var b=g%this.DB;var a=this.DB-b;var f=(1<<b)-1;d[0]=this[e]>>b;for(var c=e+1;c<this.t;++c){d[c-e-1]|=(this[c]&f)<<a;d[c-e]=this[c]>>b}if(b>0){d[this.t-e-1]|=(this.s&f)<<a}d.t=this.t-e;d.clamp()}function bnpSubTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e<b){g+=this[e]-d[e];f[e++]=g&this.DM;g>>=this.DB}if(d.t<this.t){g-=d.s;while(e<this.t){g+=this[e];f[e++]=g&this.DM;g>>=this.DB}g+=this.s}else{g+=this.s;while(e<d.t){g-=d[e];f[e++]=g&this.DM;g>>=this.DB}g-=d.s}f.s=(g<0)?-1:0;if(g<-1){f[e++]=this.DV+g}else{if(g>0){f[e++]=g}}f.t=e;f.clamp()}function bnpMultiplyTo(c,e){var b=this.abs(),f=c.abs();var d=b.t;e.t=d+f.t;while(--d>=0){e[d]=0}for(d=0;d<f.t;++d){e[d+b.t]=b.am(0,f[d],e,d,0,b.t)}e.s=0;e.clamp();if(this.s!=c.s){BigInteger.ZERO.subTo(e,e)}}function bnpSquareTo(d){var a=this.abs();var b=d.t=2*a.t;while(--b>=0){d[b]=0}for(b=0;b<a.t-1;++b){var e=a.am(b,a[b],d,2*b,0,1);if((d[b+a.t]+=a.am(b+1,2*a[b],d,2*b+1,e,a.t-b-1))>=a.DV){d[b+a.t]-=a.DV;d[b+a.t+1]=1}}if(d.t>0){d[d.t-1]+=a.am(b,a[b],d,2*b,0,1)}d.s=0;d.clamp()}function bnpDivRemTo(n,h,g){var w=n.abs();if(w.t<=0){return}var k=this.abs();if(k.t<w.t){if(h!=null){h.fromInt(0)}if(g!=null){this.copyTo(g)}return}if(g==null){g=nbi()}var d=nbi(),a=this.s,l=n.s;var v=this.DB-nbits(w[w.t-1]);if(v>0){w.lShiftTo(v,d);k.lShiftTo(v,g)}else{w.copyTo(d);k.copyTo(g)}var p=d.t;var b=d[p-1];if(b==0){return}var o=b*(1<<this.F1)+((p>1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<<this.F1)/o,x=1<<this.F2;var u=g.t,s=u-p,f=(h==null)?nbi():h;d.dlShiftTo(s,f);if(g.compareTo(f)>=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t<p){d[d.t++]=0}while(--s>=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))<c){d.dlShiftTo(s,f);g.subTo(f,g);while(g[u]<--c){g.subTo(f,g)}}}if(h!=null){g.drShiftTo(p,h);if(a!=l){BigInteger.ZERO.subTo(h,h)}}g.t=p;g.clamp();if(v>0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c<this.m.t;++c){var b=a[c]&32767;var d=(b*this.mpl+(((b*this.mph+(a[c]>>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<<c))>0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0){if(this.t==1){return this[0]-this.DV}else{if(this.t==0){return -1}}}else{if(this.t==1){return this[0]}else{if(this.t==0){return 0}}}return((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0]}function bnByteValue(){return(this.t==0)?this.s:(this[0]<<24)>>24}function bnShortValue(){return(this.t==0)?this.s:(this[0]<<16)>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){if(this.s<0){return -1}else{if(this.t<=0||(this.t==1&&this[0]<=0)){return 0}else{return 1}}}function bnpToRadix(c){if(c==null){c=10}if(this.signum()==0||c<2||c>36){return"0"}var f=this.chunkSize(c);var e=Math.pow(c,f);var i=nbv(e),j=nbi(),h=nbi(),g="";this.divRemTo(i,j,h);while(j.signum()>0){g=(e+h.intValue()).toString(c).substr(1)+g;j.divRemTo(i,j,h)}return h.intValue().toString(c)+g}function bnpFromRadix(m,h){this.fromInt(0);if(h==null){h=10}var f=this.chunkSize(h);var g=Math.pow(h,f),e=false,a=0,l=0;for(var c=0;c<m.length;++c){var k=intAt(m,c);if(k<0){if(m.charAt(c)=="-"&&this.signum()==0){e=true}continue}l=h*l+k;if(++a>=f){this.dMultiply(g);this.dAddOffset(l,0);a=0;l=0}}if(a>0){this.dMultiply(Math.pow(h,a));this.dAddOffset(l,0)}if(e){BigInteger.ZERO.subTo(this,this)}}function bnpFromNumber(f,e,h){if("number"==typeof e){if(f<2){this.fromInt(1)}else{this.fromNumber(f,h);if(!this.testBit(f-1)){this.bitwiseTo(BigInteger.ONE.shiftLeft(f-1),op_or,this)}if(this.isEven()){this.dAddOffset(1,0)}while(!this.isProbablePrime(e)){this.dAddOffset(2,0);if(this.bitLength()>f){this.subTo(BigInteger.ONE.shiftLeft(f-1),this)}}}}else{var d=new Array(),g=f&7;d.length=(f>>3)+1;e.nextBytes(d);if(g>0){d[0]&=((1<<g)-1)}else{d[0]=0}this.fromString(d,256)}}function bnToByteArray(){var b=this.t,c=new Array();c[0]=this.s;var e=this.DB-(b*this.DB)%8,f,a=0;if(b-->0){if(e<this.DB&&(f=this[b]>>e)!=(this.s&this.DM)>>e){c[a++]=f|(this.s<<(this.DB-e))}while(b>=0){if(e<8){f=(this[b]&((1<<e)-1))<<(8-e);f|=this[--b]>>(e+=this.DB-8)}else{f=(this[b]>>(e-=8))&255;if(e<=0){e+=this.DB;--b}}if((f&128)!=0){f|=-256}if(a==0&&(this.s&128)!=(f&128)){++a}if(a>0||f!=this.s){c[a++]=f}}}return c}function bnEquals(b){return(this.compareTo(b)==0)}function bnMin(b){return(this.compareTo(b)<0)?this:b}function bnMax(b){return(this.compareTo(b)>0)?this:b}function bnpBitwiseTo(c,h,e){var d,g,b=Math.min(c.t,this.t);for(d=0;d<b;++d){e[d]=h(this[d],c[d])}if(c.t<this.t){g=c.s&this.DM;for(d=b;d<this.t;++d){e[d]=h(this[d],g)}e.t=this.t}else{g=this.s&this.DM;for(d=b;d<c.t;++d){e[d]=h(g,c[d])}e.t=c.t}e.s=h(this.s,c.s);e.clamp()}function op_and(a,b){return a&b}function bnAnd(b){var c=nbi();this.bitwiseTo(b,op_and,c);return c}function op_or(a,b){return a|b}function bnOr(b){var c=nbi();this.bitwiseTo(b,op_or,c);return c}function op_xor(a,b){return a^b}function bnXor(b){var c=nbi();this.bitwiseTo(b,op_xor,c);return c}function op_andnot(a,b){return a&~b}function bnAndNot(b){var c=nbi();this.bitwiseTo(b,op_andnot,c);return c}function bnNot(){var b=nbi();for(var a=0;a<this.t;++a){b[a]=this.DM&~this[a]}b.t=this.t;b.s=~this.s;return b}function bnShiftLeft(b){var a=nbi();if(b<0){this.rShiftTo(-b,a)}else{this.lShiftTo(b,a)}return a}function bnShiftRight(b){var a=nbi();if(b<0){this.lShiftTo(-b,a)}else{this.rShiftTo(b,a)}return a}function lbit(a){if(a==0){return -1}var b=0;if((a&65535)==0){a>>=16;b+=16}if((a&255)==0){a>>=8;b+=8}if((a&15)==0){a>>=4;b+=4}if((a&3)==0){a>>=2;b+=2}if((a&1)==0){++b}return b}function bnGetLowestSetBit(){for(var a=0;a<this.t;++a){if(this[a]!=0){return a*this.DB+lbit(this[a])}}if(this.s<0){return this.t*this.DB}return -1}function cbit(a){var b=0;while(a!=0){a&=a-1;++b}return b}function bnBitCount(){var c=0,a=this.s&this.DM;for(var b=0;b<this.t;++b){c+=cbit(this[b]^a)}return c}function bnTestBit(b){var a=Math.floor(b/this.DB);if(a>=this.t){return(this.s!=0)}return((this[a]&(1<<(b%this.DB)))!=0)}function bnpChangeBit(c,b){var a=BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a,b,a);return a}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}function bnpAddTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e<b){g+=this[e]+d[e];f[e++]=g&this.DM;g>>=this.DB}if(d.t<this.t){g+=d.s;while(e<this.t){g+=this[e];f[e++]=g&this.DM;g>>=this.DB}g+=this.s}else{g+=this.s;while(e<d.t){g+=d[e];f[e++]=g&this.DM;g>>=this.DB}g+=d.s}f.s=(g<0)?-1:0;if(g>0){f[e++]=g}else{if(g<-1){f[e++]=this.DV+g}}f.t=e;f.clamp()}function bnAdd(b){var c=nbi();this.addTo(b,c);return c}function bnSubtract(b){var c=nbi();this.subTo(b,c);return c}function bnMultiply(b){var c=nbi();this.multiplyTo(b,c);return c}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(b){var c=nbi();this.divRemTo(b,c,null);return c}function bnRemainder(b){var c=nbi();this.divRemTo(b,null,c);return c}function bnDivideAndRemainder(b){var d=nbi(),c=nbi();this.divRemTo(b,d,c);return new Array(d,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(b,a){if(b==0){return}while(this.t<=a){this[this.t++]=0}this[a]+=b;while(this[a]>=this.DV){this[a]-=this.DV;if(++a>=this.t){this[this.t++]=0}++this[a]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,c,b){a.multiplyTo(c,b)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp())}function bnpMultiplyLowerTo(b,f,e){var d=Math.min(this.t+b.t,f);e.s=0;e.t=d;while(d>0){e[--d]=0}var c;for(c=e.t-this.t;d<c;++d){e[d+this.t]=this.am(0,b[d],e,d,0,this.t)}for(c=Math.min(b.t,f);d<c;++d){this.am(0,b[d],e,d,0,f-d)}e.clamp()}function bnpMultiplyUpperTo(b,e,d){--e;var c=d.t=this.t+b.t-e;d.s=0;while(--c>=0){d[c]=0}for(c=Math.max(e-this.t,0);c<b.t;++c){d[this.t+c-e]=this.am(e-c,b[c],d,0,0,this.t+c-e)}d.clamp();d.drShiftTo(1,d)}function Barrett(a){this.r2=nbi();this.q3=nbi();BigInteger.ONE.dlShiftTo(2*a.t,this.r2);this.mu=this.r2.divide(a);this.m=a}function barrettConvert(a){if(a.s<0||a.t>2*this.m.t){return a.mod(this.m)}else{if(a.compareTo(this.m)<0){return a}else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}}function barrettRevert(a){return a}function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1){a.t=this.m.t+1;a.clamp()}this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(a.compareTo(this.r2)<0){a.dAddOffset(1,this.m.t+1)}a.subTo(this.r2,a);while(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Barrett.prototype.convert=barrettConvert;Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;function bnModPow(q,f){var o=q.bitLength(),h,b=nbv(1),v;if(o<=0){return b}else{if(o<18){h=1}else{if(o<48){h=3}else{if(o<144){h=4}else{if(o<768){h=5}else{h=6}}}}}if(o<8){v=new Classic(f)}else{if(f.isEven()){v=new Barrett(f)}else{v=new Montgomery(f)}}var p=new Array(),d=3,s=h-1,a=(1<<h)-1;p[1]=v.convert(this);if(h>1){var A=nbi();v.sqrTo(p[1],A);while(d<=a){p[d]=nbi();v.mulTo(A,p[d-2],p[d]);d+=2}}var l=q.t-1,x,u=true,c=nbi(),y;o=nbits(q[l])-1;while(l>=0){if(o>=s){x=(q[l]>>(o-s))&a}else{x=(q[l]&((1<<(o+1))-1))<<(s-o);if(l>0){x|=q[l-1]>>(this.DB+o-s)}}d=h;while((x&1)==0){x>>=1;--d}if((o-=d)<0){o+=this.DB;--l}if(u){p[x].copyTo(b);u=false}else{while(d>1){v.sqrTo(b,c);v.sqrTo(c,b);d-=2}if(d>0){v.sqrTo(b,c)}else{y=b;b=c;c=y}v.mulTo(c,p[x],b)}while(l>=0&&(q[l]&(1<<o))==0){v.sqrTo(b,c);y=b;b=c;c=y;if(--o<0){o=this.DB-1;--l}}}return v.revert(b)}function bnGCD(c){var b=(this.s<0)?this.negate():this.clone();var h=(c.s<0)?c.negate():c.clone();if(b.compareTo(h)<0){var e=b;b=h;h=e}var d=b.getLowestSetBit(),f=h.getLowestSetBit();if(f<0){return b}if(d<f){f=d}if(f>0){b.rShiftTo(f,b);h.rShiftTo(f,h)}while(b.signum()>0){if((d=b.getLowestSetBit())>0){b.rShiftTo(d,b)}if((d=h.getLowestSetBit())>0){h.rShiftTo(d,h)}if(b.compareTo(h)>=0){b.subTo(h,b);b.rShiftTo(1,b)}else{h.subTo(b,h);h.rShiftTo(1,h)}}if(f>0){h.lShiftTo(f,h)}return h}function bnpModInt(e){if(e<=0){return 0}var c=this.DV%e,b=(this.s<0)?e-1:0;if(this.t>0){if(c==0){b=this[0]%e}else{for(var a=this.t-1;a>=0;--a){b=(c*b+this[a])%e}}}return b}function bnModInverse(f){var j=f.isEven();if((this.isEven()&&j)||f.signum()==0){return BigInteger.ZERO}var i=f.clone(),h=this.clone();var g=nbv(1),e=nbv(0),l=nbv(0),k=nbv(1);while(i.signum()!=0){while(i.isEven()){i.rShiftTo(1,i);if(j){if(!g.isEven()||!e.isEven()){g.addTo(this,g);e.subTo(f,e)}g.rShiftTo(1,g)}else{if(!e.isEven()){e.subTo(f,e)}}e.rShiftTo(1,e)}while(h.isEven()){h.rShiftTo(1,h);if(j){if(!l.isEven()||!k.isEven()){l.addTo(this,l);k.subTo(f,k)}l.rShiftTo(1,l)}else{if(!k.isEven()){k.subTo(f,k)}}k.rShiftTo(1,k)}if(i.compareTo(h)>=0){i.subTo(h,i);if(j){g.subTo(l,g)}e.subTo(k,e)}else{h.subTo(i,h);if(j){l.subTo(g,l)}k.subTo(e,k)}}if(h.compareTo(BigInteger.ONE)!=0){return BigInteger.ZERO}if(k.compareTo(f)>=0){return k.subtract(f)}if(k.signum()<0){k.addTo(f,k)}else{return k}if(k.signum()<0){return k.add(f)}else{return k}}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];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function bnIsProbablePrime(e){var d,b=this.abs();if(b.t==1&&b[0]<=lowprimes[lowprimes.length-1]){for(d=0;d<lowprimes.length;++d){if(b[0]==lowprimes[d]){return true}}return false}if(b.isEven()){return false}d=1;while(d<lowprimes.length){var a=lowprimes[d],c=d+1;while(c<lowprimes.length&&a<lplim){a*=lowprimes[c++]}a=b.modInt(a);while(d<c){if(a%lowprimes[d++]==0){return false}}}return b.millerRabin(e)}function bnpMillerRabin(f){var g=this.subtract(BigInteger.ONE);var c=g.getLowestSetBit();if(c<=0){return false}var h=g.shiftRight(c);f=(f+1)>>1;if(f>lowprimes.length){f=lowprimes.length}var b=nbi();for(var e=0;e<f;++e){b.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);var l=b.modPow(h,this);if(l.compareTo(BigInteger.ONE)!=0&&l.compareTo(g)!=0){var d=1;while(d++<c&&l.compareTo(g)!=0){l=l.modPowInt(2,this);if(l.compareTo(BigInteger.ONE)==0){return false}}if(l.compareTo(g)!=0){return false}}}return true}BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.fromNumber=bnpFromNumber;BigInteger.prototype.bitwiseTo=bnpBitwiseTo;BigInteger.prototype.changeBit=bnpChangeBit;BigInteger.prototype.addTo=bnpAddTo;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.multiplyLowerTo=bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo=bnpMultiplyUpperTo;BigInteger.prototype.modInt=bnpModInt;BigInteger.prototype.millerRabin=bnpMillerRabin;BigInteger.prototype.clone=bnClone;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.byteValue=bnByteValue;BigInteger.prototype.shortValue=bnShortValue;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.toByteArray=bnToByteArray;BigInteger.prototype.equals=bnEquals;BigInteger.prototype.min=bnMin;BigInteger.prototype.max=bnMax;BigInteger.prototype.and=bnAnd;BigInteger.prototype.or=bnOr;BigInteger.prototype.xor=bnXor;BigInteger.prototype.andNot=bnAndNot;BigInteger.prototype.not=bnNot;BigInteger.prototype.shiftLeft=bnShiftLeft;BigInteger.prototype.shiftRight=bnShiftRight;BigInteger.prototype.getLowestSetBit=bnGetLowestSetBit;BigInteger.prototype.bitCount=bnBitCount;BigInteger.prototype.testBit=bnTestBit;BigInteger.prototype.setBit=bnSetBit;BigInteger.prototype.clearBit=bnClearBit;BigInteger.prototype.flipBit=bnFlipBit;BigInteger.prototype.add=bnAdd;BigInteger.prototype.subtract=bnSubtract;BigInteger.prototype.multiply=bnMultiply;BigInteger.prototype.divide=bnDivide;BigInteger.prototype.remainder=bnRemainder;BigInteger.prototype.divideAndRemainder=bnDivideAndRemainder;BigInteger.prototype.modPow=bnModPow;BigInteger.prototype.modInverse=bnModInverse;BigInteger.prototype.pow=bnPow;BigInteger.prototype.gcd=bnGCD;BigInteger.prototype.isProbablePrime=bnIsProbablePrime;BigInteger.prototype.square=bnSquare;
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
function Arcfour(){this.i=0;this.j=0;this.S=new Array()}function ARC4init(d){var c,a,b;for(c=0;c<256;++c){this.S[c]=c}a=0;for(c=0;c<256;++c){a=(a+this.S[c]+d[c%d.length])&255;b=this.S[c];this.S[c]=this.S[a];this.S[a]=b}this.i=0;this.j=0}function ARC4next(){var a;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;a=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=a;return this.S[(a+this.S[this.i])&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour()}var rng_psize=256;
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(a){rng_pool[rng_pptr++]^=a&255;rng_pool[rng_pptr++]^=(a>>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t<z.length;++t){rng_pool[rng_pptr++]=z.charCodeAt(t)&255}}while(rng_pptr<rng_psize){t=Math.floor(65536*Math.random());rng_pool[rng_pptr++]=t>>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr){rng_pool[rng_pptr]=0}rng_pptr=0}return rng_state.next()}function rng_get_bytes(b){var a;for(a=0;a<b.length;++a){b[a]=rng_get_byte()}}function SecureRandom(){}SecureRandom.prototype.nextBytes=rng_get_bytes;
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
function parseBigInt(b,a){return new BigInteger(b,a)}function linebrk(c,d){var a="";var b=0;while(b+d<c.length){a+=c.substring(b,b+d)+"\n";b+=d}return a+c.substring(b,c.length)}function byte2Hex(a){if(a<16){return"0"+a.toString(16)}else{return a.toString(16)}}function pkcs1pad2(e,h){if(h<e.length+11){alert("Message too long for RSA");return null}var g=new Array();var d=e.length-1;while(d>=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function oaep_mgf1_arr(c,a,e){var b="",d=0;while(b.length<a){b+=e(String.fromCharCode.apply(String,c.concat([(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255])));d+=1}return b}var SHA1_SIZE=20;function oaep_pad(l,a,c){if(l.length+2*SHA1_SIZE+2>a){throw"Message too long for RSA"}var h="",d;for(d=0;d<a-l.length-2*SHA1_SIZE-2;d+=1){h+="\x00"}var e=rstr_sha1("")+h+"\x01"+l;var f=new Array(SHA1_SIZE);new SecureRandom().nextBytes(f);var g=oaep_mgf1_arr(f,e.length,c||rstr_sha1);var k=[];for(d=0;d<e.length;d+=1){k[d]=e.charCodeAt(d)^g.charCodeAt(d)}var j=oaep_mgf1_arr(k,f.length,rstr_sha1);var b=[0];for(d=0;d<f.length;d+=1){b[d+1]=f[d]^j.charCodeAt(d)}return new BigInteger(b.concat(k))}function RSAKey(){this.n=null;this.e=0;this.d=null;this.p=null;this.q=null;this.dmp1=null;this.dmq1=null;this.coeff=null}function RSASetPublic(b,a){this.isPublic=true;if(typeof b!=="string"){this.n=b;this.e=a}else{if(b!=null&&a!=null&&b.length>0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}function RSAEncryptOAEP(e,d){var a=oaep_pad(e,(this.n.bitLength()+7)>>3,d);if(a==null){return null}var f=this.doPublic(a);if(f==null){return null}var b=f.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;RSAKey.prototype.encryptOAEP=RSAEncryptOAEP;RSAKey.prototype.type="RSA";
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
function pkcs1unpad2(g,j){var a=g.toByteArray();var f=0;while(f<a.length&&a[f]==0){++f}if(a.length-f!=j-1||a[f]!=2){return null}++f;while(a[f]!=0){if(++f>=a.length){return null}}var e="";while(++f<a.length){var h=a[f]&255;if(h<128){e+=String.fromCharCode(h)}else{if((h>191)&&(h<224)){e+=String.fromCharCode(((h&31)<<6)|(a[f+1]&63));++f}else{e+=String.fromCharCode(((h&15)<<12)|((a[f+1]&63)<<6)|(a[f+2]&63));f+=2}}}return e}function oaep_mgf1_str(c,a,e){var b="",d=0;while(b.length<a){b+=e(c+String.fromCharCode.apply(String,[(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255]));d+=1}return b}var SHA1_SIZE=20;function oaep_unpad(l,b,e){l=l.toByteArray();var f;for(f=0;f<l.length;f+=1){l[f]&=255}while(l.length<b){l.unshift(0)}l=String.fromCharCode.apply(String,l);if(l.length<2*SHA1_SIZE+2){throw"Cipher too short"}var c=l.substr(1,SHA1_SIZE);var o=l.substr(SHA1_SIZE+1);var m=oaep_mgf1_str(o,SHA1_SIZE,e||rstr_sha1);var h=[],f;for(f=0;f<c.length;f+=1){h[f]=c.charCodeAt(f)^m.charCodeAt(f)}var j=oaep_mgf1_str(String.fromCharCode.apply(String,h),l.length-SHA1_SIZE,rstr_sha1);var g=[];for(f=0;f<o.length;f+=1){g[f]=o.charCodeAt(f)^j.charCodeAt(f)}g=String.fromCharCode.apply(String,g);if(g.substr(0,SHA1_SIZE)!==rstr_sha1("")){throw"Hash mismatch"}g=g.substr(SHA1_SIZE);var a=g.indexOf("\x01");var k=(a!=-1)?g.substr(0,a).lastIndexOf("\x00"):-1;if(k+1!=a){throw"Malformed data"}return g.substr(a+1)}function RSASetPrivate(c,a,b){this.isPrivate=true;if(typeof c!=="string"){this.n=c;this.e=a;this.d=b}else{if(c!=null&&a!=null&&c.length>0&&a.length>0){this.n=parseBigInt(c,16);this.e=parseInt(a,16);this.d=parseBigInt(b,16)}else{alert("Invalid RSA private key")}}}function RSASetPrivateEx(g,d,e,c,b,a,h,f){this.isPrivate=true;if(g==null){throw"RSASetPrivateEx N == null"}if(d==null){throw"RSASetPrivateEx E == null"}if(g.length==0){throw"RSASetPrivateEx N.length == 0"}if(d.length==0){throw"RSASetPrivateEx E.length == 0"}if(g!=null&&d!=null&&g.length>0&&d.length>0){this.n=parseBigInt(g,16);this.e=parseInt(d,16);this.d=parseBigInt(e,16);this.p=parseBigInt(c,16);this.q=parseBigInt(b,16);this.dmp1=parseBigInt(a,16);this.dmq1=parseBigInt(h,16);this.coeff=parseBigInt(f,16)}else{alert("Invalid RSA private key in RSASetPrivateEx")}}function RSAGenerate(b,i){var a=new SecureRandom();var f=b>>1;this.e=parseInt(i,16);var c=new BigInteger(i,16);for(;;){for(;;){this.p=new BigInteger(b-f,1,a);if(this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10)){break}}for(;;){this.q=new BigInteger(f,1,a);if(this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10)){break}}if(this.p.compareTo(this.q)<=0){var h=this.p;this.p=this.q;this.q=h}var g=this.p.subtract(BigInteger.ONE);var d=this.q.subtract(BigInteger.ONE);var e=g.multiply(d);if(e.gcd(c).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=c.modInverse(e);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(d);this.coeff=this.q.modInverse(this.p);break}}}function RSADoPrivate(a){if(this.p==null||this.q==null){return a.modPow(this.d,this.n)}var c=a.mod(this.p).modPow(this.dmp1,this.p);var b=a.mod(this.q).modPow(this.dmq1,this.q);while(c.compareTo(b)<0){c=c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)}function RSADecrypt(b){var d=parseBigInt(b,16);var a=this.doPrivate(d);if(a==null){return null}return pkcs1unpad2(a,(this.n.bitLength()+7)>>3)}function RSADecryptOAEP(d,b){var e=parseBigInt(d,16);var a=this.doPrivate(e);if(a==null){return null}return oaep_unpad(a,(this.n.bitLength()+7)>>3,b)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;RSAKey.prototype.decryptOAEP=RSADecryptOAEP;
|
||
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
*/
|
||
function ECFieldElementFp(b,a){this.x=a;this.q=b}function feFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.x.equals(a.x))}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(a){return new ECFieldElementFp(this.q,this.x.add(a.toBigInteger()).mod(this.q))}function feFpSubtract(a){return new ECFieldElementFp(this.q,this.x.subtract(a.toBigInteger()).mod(this.q))}function feFpMultiply(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))}ECFieldElementFp.prototype.equals=feFpEquals;ECFieldElementFp.prototype.toBigInteger=feFpToBigInteger;ECFieldElementFp.prototype.negate=feFpNegate;ECFieldElementFp.prototype.add=feFpAdd;ECFieldElementFp.prototype.subtract=feFpSubtract;ECFieldElementFp.prototype.multiply=feFpMultiply;ECFieldElementFp.prototype.square=feFpSquare;ECFieldElementFp.prototype.divide=feFpDivide;function ECPointFp(c,a,d,b){this.curve=c;this.x=a;this.y=d;if(b==null){this.z=BigInteger.ONE}else{this.z=b}this.zinv=null}function pointFpGetX(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpGetY(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpEquals(a){if(a==this){return true}if(this.isInfinity()){return a.isInfinity()}if(a.isInfinity()){return this.isInfinity()}var c,b;c=a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if(!c.equals(BigInteger.ZERO)){return false}b=a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO)}function pointFpIsInfinity(){if((this.x==null)&&(this.y==null)){return true}return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(l){if(this.isInfinity()){return l}if(l.isInfinity()){return this}var p=l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o=l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(o)){if(BigInteger.ZERO.equals(p)){return this.twice()}return this.curve.getInfinity()}var j=new BigInteger("3");var e=this.x.toBigInteger();var n=this.y.toBigInteger();var c=l.x.toBigInteger();var k=l.y.toBigInteger();var m=o.square();var i=m.multiply(o);var d=e.multiply(m);var g=p.square().multiply(this.z);var a=g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h=d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f=i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(h),f)}function pointFpTwice(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var g=new BigInteger("3");var c=this.x.toBigInteger();var h=this.y.toBigInteger();var e=h.multiply(this.z);var j=e.multiply(h).mod(this.curve.q);var i=this.curve.a.toBigInteger();var k=c.square().multiply(g);if(!BigInteger.ZERO.equals(i)){k=k.add(this.z.square().multiply(i))}k=k.mod(this.curve.q);var b=k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f=k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d=e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(f),d)}function pointFpMultiply(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add(a?this:l)}}return d}function pointFpMultiplyTwo(c,a,b){var d;if(c.bitLength()>b.bitLength()){d=c.bitLength()-1}else{d=b.bitLength()-1}var f=this.curve.getInfinity();var e=this.add(a);while(d>=0){f=f.twice();if(c.testBit(d)){if(b.testBit(d)){f=f.add(e)}else{f=f.add(this)}}else{if(b.testBit(d)){f=f.add(a)}}--d}return f}ECPointFp.prototype.getX=pointFpGetX;ECPointFp.prototype.getY=pointFpGetY;ECPointFp.prototype.equals=pointFpEquals;ECPointFp.prototype.isInfinity=pointFpIsInfinity;ECPointFp.prototype.negate=pointFpNegate;ECPointFp.prototype.add=pointFpAdd;ECPointFp.prototype.twice=pointFpTwice;ECPointFp.prototype.multiply=pointFpMultiply;ECPointFp.prototype.multiplyTwo=pointFpMultiplyTwo;function ECCurveFp(e,d,c){this.q=e;this.a=this.fromBigInteger(d);this.b=this.fromBigInteger(c);this.infinity=new ECPointFp(this,null,null)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b))}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveFpDecodePointHex(d){switch(parseInt(d.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var a=(d.length-2)/2;var c=d.substr(2,a);var b=d.substr(a+2,a);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(b,16)));default:return null}}ECCurveFp.prototype.getQ=curveFpGetQ;ECCurveFp.prototype.getA=curveFpGetA;ECCurveFp.prototype.getB=curveFpGetB;ECCurveFp.prototype.equals=curveFpEquals;ECCurveFp.prototype.getInfinity=curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger=curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex=curveFpDecodePointHex;
|
||
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
|
||
*/
|
||
ECFieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ECPointFp.prototype.getEncoded=function(c){var d=function(h,f){var g=h.toByteArrayUnsigned();if(f<g.length){g=g.slice(g.length-f)}else{while(f>g.length){g.unshift(0)}}return g};var a=this.getX().toBigInteger();var e=this.getY().toBigInteger();var b=d(a,32);if(c){if(e.isEven()){b.unshift(2)}else{b.unshift(3)}}else{b.unshift(4);b=b.concat(d(e,32))}return b};ECPointFp.decodeFrom=function(g,c){var f=c[0];var e=c.length-1;var d=c.slice(1,1+e/2);var b=c.slice(1+e/2,1+e);d.unshift(0);b.unshift(0);var a=new BigInteger(d);var h=new BigInteger(b);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.decodeFromHex=function(g,c){var f=c.substr(0,2);var e=c.length-2;var d=c.substr(2,e/2);var b=c.substr(2+e/2,e/2);var a=new BigInteger(d,16);var h=new BigInteger(b,16);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.prototype.add2D=function(c){if(this.isInfinity()){return c}if(c.isInfinity()){return this}if(this.x.equals(c.x)){if(this.y.equals(c.y)){return this.twice()}return this.curve.getInfinity()}var g=c.x.subtract(this.x);var e=c.y.subtract(this.y);var a=e.divide(g);var d=a.square().subtract(this.x).subtract(c.x);var f=a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve,d,f)};ECPointFp.prototype.twice2D=function(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var b=this.curve.fromBigInteger(BigInteger.valueOf(2));var e=this.curve.fromBigInteger(BigInteger.valueOf(3));var a=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c=a.square().subtract(this.x.multiply(b));var d=a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve,c,d)};ECPointFp.prototype.multiply2D=function(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add2D(a?this:l)}}return d};ECPointFp.prototype.isOnCurve=function(){var d=this.getX().toBigInteger();var i=this.getY().toBigInteger();var f=this.curve.getA().toBigInteger();var c=this.curve.getB().toBigInteger();var h=this.curve.getQ();var e=i.multiply(i).mod(h);var g=d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g)};ECPointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"};ECPointFp.prototype.validate=function(){var c=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}var a=this.getX().toBigInteger();var b=this.getY().toBigInteger();if(a.compareTo(BigInteger.ONE)<0||a.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("x coordinate out of bounds")}if(b.compareTo(BigInteger.ONE)<0||b.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("y coordinate out of bounds")}if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}if(this.multiply(c).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}return true};
|
||
/*! asn1-1.0.6.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(a){var b=a.toString(16);if((b.length%2)==1){b="0"+b}return b};this.bigIntToMinTwosComplementsHex=function(j){var f=j.toString(16);if(f.substr(0,1)!="-"){if(f.length%2==1){f="0"+f}else{if(!f.match(/^[0-7]/)){f="00"+f}}}else{var a=f.substr(1);var e=a.length;if(e%2==1){e+=1}else{if(!f.match(/^[0-7]/)){e+=2}}var g="";for(var d=0;d<e;d++){g+="f"}var c=new BigInteger(g,16);var b=c.xor(j).add(BigInteger.ONE);f=b.toString(16).replace(/^-/,"")}return f};this.getPEMStringFromHex=function(a,b){var c=KJUR.asn1;var f=CryptoJS.enc.Hex.parse(a);var d=CryptoJS.enc.Base64.stringify(f);var e=d.replace(/(.{64})/g,"$1\r\n");e=e.replace(/\r\n$/,"");return"-----BEGIN "+b+"-----\r\n"+e+"\r\n-----END "+b+"-----\r\n"};this.newObject=function(b){var g=KJUR.asn1;var k=Object.keys(b);if(k.length!=1){throw"key of param shall be only one."}var j=k[0];if(":bool:int:bitstr:octstr:null:oid:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":"+j+":")==-1){throw"undefined key: "+j}if(j=="bool"){return new g.DERBoolean(b[j])}if(j=="int"){return new g.DERInteger(b[j])}if(j=="bitstr"){return new g.DERBitString(b[j])}if(j=="octstr"){return new g.DEROctetString(b[j])}if(j=="null"){return new g.DERNull(b[j])}if(j=="oid"){return new g.DERObjectIdentifier(b[j])}if(j=="utf8str"){return new g.DERUTF8String(b[j])}if(j=="numstr"){return new g.DERNumericString(b[j])}if(j=="prnstr"){return new g.DERPrintableString(b[j])}if(j=="telstr"){return new g.DERTeletexString(b[j])}if(j=="ia5str"){return new g.DERIA5String(b[j])}if(j=="utctime"){return new g.DERUTCTime(b[j])}if(j=="gentime"){return new g.DERGeneralizedTime(b[j])}if(j=="seq"){var m=b[j];var h=[];for(var e=0;e<m.length;e++){var l=g.ASN1Util.newObject(m[e]);h.push(l)}return new g.DERSequence({array:h})}if(j=="set"){var m=b[j];var h=[];for(var e=0;e<m.length;e++){var l=g.ASN1Util.newObject(m[e]);h.push(l)}return new g.DERSet({array:h})}if(j=="tag"){var c=b[j];if(Object.prototype.toString.call(c)==="[object Array]"&&c.length==3){var d=g.ASN1Util.newObject(c[2]);return new g.DERTaggedObject({tag:c[0],explicit:c[1],obj:d})}else{var f={};if(c.explicit!==undefined){f.explicit=c.explicit}if(c.tag!==undefined){f.tag=c.tag}if(c.obj===undefined){throw"obj shall be specified for 'tag'."}f.obj=g.ASN1Util.newObject(c.obj);return new g.DERTaggedObject(f)}}};this.jsonToASN1HEX=function(b){var a=this.newObject(b);return a.getEncodedHex()}};KJUR.asn1.ASN1Object=function(){var c=true;var b=null;var d="00";var e="00";var a="";this.getLengthHexFromValue=function(){if(typeof this.hV=="undefined"||this.hV==null){throw"this.hV is null or undefined."}if(this.hV.length%2==1){throw"value hex must be even length: n="+a.length+",v="+this.hV}var i=this.hV.length/2;var h=i.toString(16);if(h.length%2==1){h="0"+h}if(i<128){return h}else{var g=h.length/2;if(g>15){throw"ASN.1 length too long to represent by 8x: n = "+i.toString(16)}var f=128+g;return f.toString(16)+h}};this.getEncodedHex=function(){if(this.hTLV==null||this.isModified){this.hV=this.getFreshValueHex();this.hL=this.getLengthHexFromValue();this.hTLV=this.hT+this.hL+this.hV;this.isModified=false}return this.hTLV};this.getValueHex=function(){this.getEncodedHex();return this.hV};this.getFreshValueHex=function(){return""}};KJUR.asn1.DERAbstractString=function(c){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b=null;var a=null;this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(this.s)};this.setStringHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"){this.setString(c)}else{if(typeof c.str!="undefined"){this.setString(c.str)}else{if(typeof c.hex!="undefined"){this.setStringHex(c.hex)}}}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime=function(c){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b=null;var a=null;this.localDateToUTC=function(f){utc=f.getTime()+(f.getTimezoneOffset()*60000);var e=new Date(utc);return e};this.formatDate=function(m,o,e){var g=this.zeroPadding;var n=this.localDateToUTC(m);var p=String(n.getFullYear());if(o=="utc"){p=p.substr(2,2)}var l=g(String(n.getMonth()+1),2);var q=g(String(n.getDate()),2);var h=g(String(n.getHours()),2);var i=g(String(n.getMinutes()),2);var j=g(String(n.getSeconds()),2);var r=p+l+q+h+i+j;if(e===true){var f=n.getMilliseconds();if(f!=0){var k=g(String(f),3);k=k.replace(/[0]+$/,"");r=r+"."+k}}return r+"Z"};this.zeroPadding=function(e,d){if(e.length>=d){return e}return new Array(d-e.length+1).join("0")+e};this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(d)};this.setByDateValue=function(h,j,e,d,f,g){var i=new Date(Date.UTC(h,j-1,e,d,f,g,0));this.setByDate(i)};this.getFreshValueHex=function(){return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured=function(b){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a=null;this.setByASN1ObjectArray=function(c){this.hTLV=null;this.isModified=true;this.asn1Array=c};this.appendASN1Object=function(c){this.hTLV=null;this.isModified=true;this.asn1Array.push(c)};this.asn1Array=new Array();if(typeof b!="undefined"){if(typeof b.array!="undefined"){this.asn1Array=b.array}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT="01";this.hTLV="0101ff"};YAHOO.lang.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger=function(a){KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT="02";this.setByBigInteger=function(b){this.hTLV=null;this.isModified=true;this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)};this.setByInteger=function(c){var b=new BigInteger(String(c),10);this.setByBigInteger(b)};this.setValueHex=function(b){this.hV=b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.bigint!="undefined"){this.setByBigInteger(a.bigint)}else{if(typeof a["int"]!="undefined"){this.setByInteger(a["int"])}else{if(typeof a=="number"){this.setByInteger(a)}else{if(typeof a.hex!="undefined"){this.setValueHex(a.hex)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString=function(a){KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT="03";this.setHexValueIncludingUnusedBits=function(b){this.hTLV=null;this.isModified=true;this.hV=b};this.setUnusedBitsAndHexValue=function(b,d){if(b<0||7<b){throw"unused bits shall be from 0 to 7: u = "+b}var c="0"+b;this.hTLV=null;this.isModified=true;this.hV=c+d};this.setByBinaryString=function(e){e=e.replace(/0+$/,"");var f=8-e.length%8;if(f==8){f=0}for(var g=0;g<=f;g++){e+="0"}var j="";for(var g=0;g<e.length-1;g+=8){var d=e.substr(g,8);var c=parseInt(d,2).toString(16);if(c.length==1){c="0"+c}j+=c}this.hTLV=null;this.isModified=true;this.hV="0"+f+j};this.setByBooleanArray=function(d){var c="";for(var b=0;b<d.length;b++){if(d[b]==true){c+="1"}else{c+="0"}}this.setByBinaryString(c)};this.newFalseArray=function(d){var b=new Array(d);for(var c=0;c<d;c++){b[c]=false}return b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a=="string"&&a.toLowerCase().match(/^[0-9a-f]+$/)){this.setHexValueIncludingUnusedBits(a)}else{if(typeof a.hex!="undefined"){this.setHexValueIncludingUnusedBits(a.hex)}else{if(typeof a.bin!="undefined"){this.setByBinaryString(a.bin)}else{if(typeof a.array!="undefined"){this.setByBooleanArray(a.array)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERBitString,KJUR.asn1.ASN1Object);KJUR.asn1.DEROctetString=function(a){KJUR.asn1.DEROctetString.superclass.constructor.call(this,a);this.hT="04"};YAHOO.lang.extend(KJUR.asn1.DEROctetString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERNull=function(){KJUR.asn1.DERNull.superclass.constructor.call(this);this.hT="05";this.hTLV="0500"};YAHOO.lang.extend(KJUR.asn1.DERNull,KJUR.asn1.ASN1Object);KJUR.asn1.DERObjectIdentifier=function(c){var b=function(d){var e=d.toString(16);if(e.length==1){e="0"+e}return e};var a=function(k){var j="";var e=new BigInteger(k,10);var d=e.toString(2);var f=7-d.length%7;if(f==7){f=0}var m="";for(var g=0;g<f;g++){m+="0"}d=m+d;for(var g=0;g<d.length-1;g+=7){var l=d.substr(g,7);if(g!=d.length-7){l="1"+l}j+=b(parseInt(l,2))}return j};KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);this.hT="06";this.setValueHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.setValueOidString=function(f){if(!f.match(/^[0-9.]+$/)){throw"malformed oid string: "+f}var g="";var d=f.split(".");var j=parseInt(d[0])*40+parseInt(d[1]);g+=b(j);d.splice(0,2);for(var e=0;e<d.length;e++){g+=a(d[e])}this.hTLV=null;this.isModified=true;this.s=null;this.hV=g};this.setValueName=function(e){if(typeof KJUR.asn1.x509.OID.name2oidList[e]!="undefined"){var d=KJUR.asn1.x509.OID.name2oidList[e];this.setValueOidString(d)}else{throw"DERObjectIdentifier oidName undefined: "+e}};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"&&c.match(/^[0-2].[0-9.]+$/)){this.setValueOidString(c)}else{if(KJUR.asn1.x509.OID.name2oidList[c]!==undefined){this.setValueOidString(KJUR.asn1.x509.OID.name2oidList[c])}else{if(typeof c.oid!="undefined"){this.setValueOidString(c.oid)}else{if(typeof c.hex!="undefined"){this.setValueHex(c.hex)}else{if(typeof c.name!="undefined"){this.setValueName(c.name)}}}}}}};YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier,KJUR.asn1.ASN1Object);KJUR.asn1.DERUTF8String=function(a){KJUR.asn1.DERUTF8String.superclass.constructor.call(this,a);this.hT="0c"};YAHOO.lang.extend(KJUR.asn1.DERUTF8String,KJUR.asn1.DERAbstractString);KJUR.asn1.DERNumericString=function(a){KJUR.asn1.DERNumericString.superclass.constructor.call(this,a);this.hT="12"};YAHOO.lang.extend(KJUR.asn1.DERNumericString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERPrintableString=function(a){KJUR.asn1.DERPrintableString.superclass.constructor.call(this,a);this.hT="13"};YAHOO.lang.extend(KJUR.asn1.DERPrintableString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERTeletexString=function(a){KJUR.asn1.DERTeletexString.superclass.constructor.call(this,a);this.hT="14"};YAHOO.lang.extend(KJUR.asn1.DERTeletexString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERIA5String=function(a){KJUR.asn1.DERIA5String.superclass.constructor.call(this,a);this.hT="16"};YAHOO.lang.extend(KJUR.asn1.DERIA5String,KJUR.asn1.DERAbstractString);KJUR.asn1.DERUTCTime=function(a){KJUR.asn1.DERUTCTime.superclass.constructor.call(this,a);this.hT="17";this.setByDate=function(b){this.hTLV=null;this.isModified=true;this.date=b;this.s=this.formatDate(this.date,"utc");this.hV=stohex(this.s)};this.getFreshValueHex=function(){if(typeof this.date=="undefined"&&typeof this.s=="undefined"){this.date=new Date();this.s=this.formatDate(this.date,"utc");this.hV=stohex(this.s)}return this.hV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.setString(a.str)}else{if(typeof a=="string"&&a.match(/^[0-9]{12}Z$/)){this.setString(a)}else{if(typeof a.hex!="undefined"){this.setStringHex(a.hex)}else{if(typeof a.date!="undefined"){this.setByDate(a.date)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERUTCTime,KJUR.asn1.DERAbstractTime);KJUR.asn1.DERGeneralizedTime=function(a){KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this,a);this.hT="18";this.withMillis=false;this.setByDate=function(b){this.hTLV=null;this.isModified=true;this.date=b;this.s=this.formatDate(this.date,"gen",this.withMillis);this.hV=stohex(this.s)};this.getFreshValueHex=function(){if(typeof this.date=="undefined"&&typeof this.s=="undefined"){this.date=new Date();this.s=this.formatDate(this.date,"gen",this.withMillis);this.hV=stohex(this.s)}return this.hV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.setString(a.str)}else{if(typeof a=="string"&&a.match(/^[0-9]{14}Z$/)){this.setString(a)}else{if(typeof a.hex!="undefined"){this.setStringHex(a.hex)}else{if(typeof a.date!="undefined"){this.setByDate(a.date)}else{if(a.millis===true){this.withMillis=true}}}}}}};YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime,KJUR.asn1.DERAbstractTime);KJUR.asn1.DERSequence=function(a){KJUR.asn1.DERSequence.superclass.constructor.call(this,a);this.hT="30";this.getFreshValueHex=function(){var c="";for(var b=0;b<this.asn1Array.length;b++){var d=this.asn1Array[b];c+=d.getEncodedHex()}this.hV=c;return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERSequence,KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERSet=function(a){KJUR.asn1.DERSet.superclass.constructor.call(this,a);this.hT="31";this.sortFlag=true;this.getFreshValueHex=function(){var b=new Array();for(var c=0;c<this.asn1Array.length;c++){var d=this.asn1Array[c];b.push(d.getEncodedHex())}if(this.sortFlag==true){b.sort()}this.hV=b.join("");return this.hV};if(typeof a!="undefined"){if(typeof a.sortflag!="undefined"&&a.sortflag==false){this.sortFlag=false}}};YAHOO.lang.extend(KJUR.asn1.DERSet,KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERTaggedObject=function(a){KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);this.hT="a0";this.hV="";this.isExplicit=true;this.asn1Object=null;this.setASN1Object=function(b,c,d){this.hT=c;this.isExplicit=b;this.asn1Object=d;if(this.isExplicit){this.hV=this.asn1Object.getEncodedHex();this.hTLV=null;this.isModified=true}else{this.hV=null;this.hTLV=d.getEncodedHex();this.hTLV=this.hTLV.replace(/^../,c);this.isModified=false}};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.tag!="undefined"){this.hT=a.tag}if(typeof a.explicit!="undefined"){this.isExplicit=a.explicit}if(typeof a.obj!="undefined"){this.asn1Object=a.obj;this.setASN1Object(this.isExplicit,this.hT,this.asn1Object)}}};YAHOO.lang.extend(KJUR.asn1.DERTaggedObject,KJUR.asn1.ASN1Object);
|
||
/*! asn1hex-1.1.5.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
var ASN1HEX=new function(){this.getByteLengthOfL_AtObj=function(b,c){if(b.substring(c+2,c+3)!="8"){return 1}var a=parseInt(b.substring(c+3,c+4));if(a==0){return -1}if(0<a&&a<10){return a+1}return -2};this.getHexOfL_AtObj=function(b,c){var a=this.getByteLengthOfL_AtObj(b,c);if(a<1){return""}return b.substring(c+2,c+2+a*2)};this.getIntOfL_AtObj=function(c,d){var b=this.getHexOfL_AtObj(c,d);if(b==""){return -1}var a;if(parseInt(b.substring(0,1))<8){a=new BigInteger(b,16)}else{a=new BigInteger(b.substring(2),16)}return a.intValue()};this.getStartPosOfV_AtObj=function(b,c){var a=this.getByteLengthOfL_AtObj(b,c);if(a<0){return a}return c+(a+1)*2};this.getHexOfV_AtObj=function(c,d){var b=this.getStartPosOfV_AtObj(c,d);var a=this.getIntOfL_AtObj(c,d);return c.substring(b,b+a*2)};this.getHexOfTLV_AtObj=function(c,e){var b=c.substr(e,2);var d=this.getHexOfL_AtObj(c,e);var a=this.getHexOfV_AtObj(c,e);return b+d+a};this.getPosOfNextSibling_AtObj=function(c,d){var b=this.getStartPosOfV_AtObj(c,d);var a=this.getIntOfL_AtObj(c,d);return b+a*2};this.getPosArrayOfChildren_AtObj=function(f,j){var c=new Array();var i=this.getStartPosOfV_AtObj(f,j);c.push(i);var b=this.getIntOfL_AtObj(f,j);var g=i;var d=0;while(1){var e=this.getPosOfNextSibling_AtObj(f,g);if(e==null||(e-i>=(b*2))){break}if(d>=200){break}c.push(e);g=e;d++}return c};this.getNthChildIndex_AtObj=function(d,b,e){var c=this.getPosArrayOfChildren_AtObj(d,b);return c[e]};this.getDecendantIndexByNthList=function(e,d,c){if(c.length==0){return d}var f=c.shift();var b=this.getPosArrayOfChildren_AtObj(e,d);return this.getDecendantIndexByNthList(e,b[f],c)};this.getDecendantHexTLVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfTLV_AtObj(d,a)};this.getDecendantHexVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfV_AtObj(d,a)}};ASN1HEX.getVbyList=function(d,c,b,e){var a=this.getDecendantIndexByNthList(d,c,b);if(a===undefined){throw"can't find nthList object"}if(e!==undefined){if(d.substr(a,2)!=e){throw"checking tag doesn't match: "+d.substr(a,2)+"!="+e}}return this.getHexOfV_AtObj(d,a)};ASN1HEX.hextooidstr=function(e){var h=function(b,a){if(b.length>=a){return b}return new Array(a-b.length+1).join("0")+b};var l=[];var o=e.substr(0,2);var f=parseInt(o,16);l[0]=new String(Math.floor(f/40));l[1]=new String(f%40);var m=e.substr(2);var k=[];for(var g=0;g<m.length/2;g++){k.push(parseInt(m.substr(g*2,2),16))}var j=[];var d="";for(var g=0;g<k.length;g++){if(k[g]&128){d=d+h((k[g]&127).toString(2),7)}else{d=d+h((k[g]&127).toString(2),7);j.push(new String(parseInt(d,2)));d=""}}var n=l.join(".");if(j.length>0){n=n+"."+j.join(".")}return n};
|
||
/*! asn1x509-1.0.9.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.x509=="undefined"||!KJUR.asn1.x509){KJUR.asn1.x509={}}KJUR.asn1.x509.Certificate=function(g){KJUR.asn1.x509.Certificate.superclass.constructor.call(this);var b=null;var d=null;var f=null;var c=null;var a=null;var e=null;this.setRsaPrvKeyByPEMandPass=function(i,k){var h=PKCS5PKEY.getDecryptedKeyHex(i,k);var j=new RSAKey();j.readPrivateKeyFromASN1HexString(h);this.prvKey=j};this.sign=function(){this.asn1SignatureAlg=this.asn1TBSCert.asn1SignatureAlg;sig=new KJUR.crypto.Signature({alg:"SHA1withRSA"});sig.init(this.prvKey);sig.updateHex(this.asn1TBSCert.getEncodedHex());this.hexSig=sig.sign();this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var h=new KJUR.asn1.DERSequence({array:[this.asn1TBSCert,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=h.getEncodedHex();this.isModified=false};this.setSignatureHex=function(h){this.asn1SignatureAlg=this.asn1TBSCert.asn1SignatureAlg;this.hexSig=h;this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var i=new KJUR.asn1.DERSequence({array:[this.asn1TBSCert,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=i.getEncodedHex();this.isModified=false};this.getEncodedHex=function(){if(this.isModified==false&&this.hTLV!=null){return this.hTLV}throw"not signed yet"};this.getPEMString=function(){var j=this.getEncodedHex();var h=CryptoJS.enc.Hex.parse(j);var i=CryptoJS.enc.Base64.stringify(h);var k=i.replace(/(.{64})/g,"$1\r\n");return"-----BEGIN CERTIFICATE-----\r\n"+k+"\r\n-----END CERTIFICATE-----\r\n"};if(typeof g!="undefined"){if(typeof g.tbscertobj!="undefined"){this.asn1TBSCert=g.tbscertobj}if(typeof g.prvkeyobj!="undefined"){this.prvKey=g.prvkeyobj}else{if(typeof g.rsaprvkey!="undefined"){this.prvKey=g.rsaprvkey}else{if((typeof g.rsaprvpem!="undefined")&&(typeof g.rsaprvpas!="undefined")){this.setRsaPrvKeyByPEMandPass(g.rsaprvpem,g.rsaprvpas)}}}}};YAHOO.lang.extend(KJUR.asn1.x509.Certificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.TBSCertificate=function(a){KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);this._initialize=function(){this.asn1Array=new Array();this.asn1Version=new KJUR.asn1.DERTaggedObject({obj:new KJUR.asn1.DERInteger({"int":2})});this.asn1SerialNumber=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1NotBefore=null;this.asn1NotAfter=null;this.asn1Subject=null;this.asn1SubjPKey=null;this.extensionsArray=new Array()};this.setSerialNumberByParam=function(b){this.asn1SerialNumber=new KJUR.asn1.DERInteger(b)};this.setSignatureAlgByParam=function(b){this.asn1SignatureAlg=new KJUR.asn1.x509.AlgorithmIdentifier(b)};this.setIssuerByParam=function(b){this.asn1Issuer=new KJUR.asn1.x509.X500Name(b)};this.setNotBeforeByParam=function(b){this.asn1NotBefore=new KJUR.asn1.x509.Time(b)};this.setNotAfterByParam=function(b){this.asn1NotAfter=new KJUR.asn1.x509.Time(b)};this.setSubjectByParam=function(b){this.asn1Subject=new KJUR.asn1.x509.X500Name(b)};this.setSubjectPublicKeyByParam=function(b){this.asn1SubjPKey=new KJUR.asn1.x509.SubjectPublicKeyInfo(b)};this.setSubjectPublicKeyByGetKey=function(c){var b=KEYUTIL.getKey(c);this.asn1SubjPKey=new KJUR.asn1.x509.SubjectPublicKeyInfo(b)};this.appendExtension=function(b){this.extensionsArray.push(b)};this.appendExtensionByName=function(d,b){if(d.toLowerCase()=="basicconstraints"){var c=new KJUR.asn1.x509.BasicConstraints(b);this.appendExtension(c)}else{if(d.toLowerCase()=="keyusage"){var c=new KJUR.asn1.x509.KeyUsage(b);this.appendExtension(c)}else{if(d.toLowerCase()=="crldistributionpoints"){var c=new KJUR.asn1.x509.CRLDistributionPoints(b);this.appendExtension(c)}else{if(d.toLowerCase()=="extkeyusage"){var c=new KJUR.asn1.x509.ExtKeyUsage(b);this.appendExtension(c)}else{if(d.toLowerCase()=="authoritykeyidentifier"){var c=new KJUR.asn1.x509.AuthorityKeyIdentifier(b);this.appendExtension(c)}else{throw"unsupported extension name: "+d}}}}}};this.getEncodedHex=function(){if(this.asn1NotBefore==null||this.asn1NotAfter==null){throw"notBefore and/or notAfter not set"}var c=new KJUR.asn1.DERSequence({array:[this.asn1NotBefore,this.asn1NotAfter]});this.asn1Array=new Array();this.asn1Array.push(this.asn1Version);this.asn1Array.push(this.asn1SerialNumber);this.asn1Array.push(this.asn1SignatureAlg);this.asn1Array.push(this.asn1Issuer);this.asn1Array.push(c);this.asn1Array.push(this.asn1Subject);this.asn1Array.push(this.asn1SubjPKey);if(this.extensionsArray.length>0){var d=new KJUR.asn1.DERSequence({array:this.extensionsArray});var b=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a3",obj:d});this.asn1Array.push(b)}var e=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=e.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Extension=function(b){KJUR.asn1.x509.Extension.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var f=new KJUR.asn1.DERObjectIdentifier({oid:this.oid});var e=new KJUR.asn1.DEROctetString({hex:this.getExtnValueHex()});var d=new Array();d.push(f);if(this.critical){d.push(new KJUR.asn1.DERBoolean())}d.push(e);var c=new KJUR.asn1.DERSequence({array:d});return c.getEncodedHex()};this.critical=false;if(typeof b!="undefined"){if(typeof b.critical!="undefined"){this.critical=b.critical}}};YAHOO.lang.extend(KJUR.asn1.x509.Extension,KJUR.asn1.ASN1Object);KJUR.asn1.x509.KeyUsage=function(a){KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.15";if(typeof a!="undefined"){if(typeof a.bin!="undefined"){this.asn1ExtnValue=new KJUR.asn1.DERBitString(a)}}};YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.BasicConstraints=function(c){KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this,c);var a=false;var b=-1;this.getExtnValueHex=function(){var e=new Array();if(this.cA){e.push(new KJUR.asn1.DERBoolean())}if(this.pathLen>-1){e.push(new KJUR.asn1.DERInteger({"int":this.pathLen}))}var d=new KJUR.asn1.DERSequence({array:e});this.asn1ExtnValue=d;return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.19";this.cA=false;this.pathLen=-1;if(typeof c!="undefined"){if(typeof c.cA!="undefined"){this.cA=c.cA}if(typeof c.pathLen!="undefined"){this.pathLen=c.pathLen}}};YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRLDistributionPoints=function(a){KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.setByDPArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence({array:b})};this.setByOneURI=function(e){var b=new KJUR.asn1.x509.GeneralNames([{uri:e}]);var d=new KJUR.asn1.x509.DistributionPointName(b);var c=new KJUR.asn1.x509.DistributionPoint({dpobj:d});this.setByDPArray([c])};this.oid="2.5.29.31";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setByDPArray(a.array)}else{if(typeof a.uri!="undefined"){this.setByOneURI(a.uri)}}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.ExtKeyUsage=function(a){KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,a);this.setPurposeArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence();for(var c=0;c<b.length;c++){var d=new KJUR.asn1.DERObjectIdentifier(b[c]);this.asn1ExtnValue.appendASN1Object(d)}};this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.37";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setPurposeArray(a.array)}}};YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.AuthorityKeyIdentifier=function(a){KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this,a);this.asn1KID=null;this.asn1CertIssuer=null;this.asn1CertSN=null;this.getExtnValueHex=function(){var c=new Array();if(this.asn1KID){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"80",obj:this.asn1KID}))}if(this.asn1CertIssuer){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"a1",obj:this.asn1CertIssuer}))}if(this.asn1CertSN){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"82",obj:this.asn1CertSN}))}var b=new KJUR.asn1.DERSequence({array:c});this.asn1ExtnValue=b;return this.asn1ExtnValue.getEncodedHex()};this.setKIDByParam=function(b){this.asn1KID=new KJUR.asn1.DEROctetString(b)};this.setCertIssuerByParam=function(b){this.asn1CertIssuer=new KJUR.asn1.x509.X500Name(b)};this.setCertSNByParam=function(b){this.asn1CertSN=new KJUR.asn1.DERInteger(b)};this.oid="2.5.29.35";if(typeof a!="undefined"){if(typeof a.kid!="undefined"){this.setKIDByParam(a.kid)}if(typeof a.issuer!="undefined"){this.setCertIssuerByParam(a.issuer)}if(typeof a.sn!="undefined"){this.setCertSNByParam(a.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRL=function(f){KJUR.asn1.x509.CRL.superclass.constructor.call(this);var a=null;var c=null;var e=null;var b=null;var d=null;this.setRsaPrvKeyByPEMandPass=function(h,j){var g=PKCS5PKEY.getDecryptedKeyHex(h,j);var i=new RSAKey();i.readPrivateKeyFromASN1HexString(g);this.rsaPrvKey=i};this.sign=function(){this.asn1SignatureAlg=this.asn1TBSCertList.asn1SignatureAlg;sig=new KJUR.crypto.Signature({alg:"SHA1withRSA",prov:"cryptojs/jsrsa"});sig.initSign(this.rsaPrvKey);sig.updateHex(this.asn1TBSCertList.getEncodedHex());this.hexSig=sig.sign();this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var g=new KJUR.asn1.DERSequence({array:[this.asn1TBSCertList,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=g.getEncodedHex();this.isModified=false};this.getEncodedHex=function(){if(this.isModified==false&&this.hTLV!=null){return this.hTLV}throw"not signed yet"};this.getPEMString=function(){var i=this.getEncodedHex();var g=CryptoJS.enc.Hex.parse(i);var h=CryptoJS.enc.Base64.stringify(g);var j=h.replace(/(.{64})/g,"$1\r\n");return"-----BEGIN X509 CRL-----\r\n"+j+"\r\n-----END X509 CRL-----\r\n"};if(typeof f!="undefined"){if(typeof f.tbsobj!="undefined"){this.asn1TBSCertList=f.tbsobj}if(typeof f.rsaprvkey!="undefined"){this.rsaPrvKey=f.rsaprvkey}if((typeof f.rsaprvpem!="undefined")&&(typeof f.rsaprvpas!="undefined")){this.setRsaPrvKeyByPEMandPass(f.rsaprvpem,f.rsaprvpas)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRL,KJUR.asn1.ASN1Object);KJUR.asn1.x509.TBSCertList=function(b){KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);var a=null;this.setSignatureAlgByParam=function(c){this.asn1SignatureAlg=new KJUR.asn1.x509.AlgorithmIdentifier(c)};this.setIssuerByParam=function(c){this.asn1Issuer=new KJUR.asn1.x509.X500Name(c)};this.setThisUpdateByParam=function(c){this.asn1ThisUpdate=new KJUR.asn1.x509.Time(c)};this.setNextUpdateByParam=function(c){this.asn1NextUpdate=new KJUR.asn1.x509.Time(c)};this.addRevokedCert=function(c,d){var f={};if(c!=undefined&&c!=null){f.sn=c}if(d!=undefined&&d!=null){f.time=d}var e=new KJUR.asn1.x509.CRLEntry(f);this.aRevokedCert.push(e)};this.getEncodedHex=function(){this.asn1Array=new Array();if(this.asn1Version!=null){this.asn1Array.push(this.asn1Version)}this.asn1Array.push(this.asn1SignatureAlg);this.asn1Array.push(this.asn1Issuer);this.asn1Array.push(this.asn1ThisUpdate);if(this.asn1NextUpdate!=null){this.asn1Array.push(this.asn1NextUpdate)}if(this.aRevokedCert.length>0){var c=new KJUR.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(c)}var d=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=d.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize=function(){this.asn1Version=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1ThisUpdate=null;this.asn1NextUpdate=null;this.aRevokedCert=new Array()};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList,KJUR.asn1.ASN1Object);KJUR.asn1.x509.CRLEntry=function(c){KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);var b=null;var a=null;this.setCertSerial=function(d){this.sn=new KJUR.asn1.DERInteger(d)};this.setRevocationDate=function(d){this.time=new KJUR.asn1.x509.Time(d)};this.getEncodedHex=function(){var d=new KJUR.asn1.DERSequence({array:[this.sn,this.time]});this.TLV=d.getEncodedHex();return this.TLV};if(typeof c!="undefined"){if(typeof c.time!="undefined"){this.setRevocationDate(c.time)}if(typeof c.sn!="undefined"){this.setCertSerial(c.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry,KJUR.asn1.ASN1Object);KJUR.asn1.x509.X500Name=function(b){KJUR.asn1.x509.X500Name.superclass.constructor.call(this);this.asn1Array=new Array();this.setByString=function(c){var d=c.split("/");d.shift();for(var e=0;e<d.length;e++){this.asn1Array.push(new KJUR.asn1.x509.RDN({str:d[e]}))}};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var c=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=c.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.str!="undefined"){this.setByString(b.str)}if(typeof b.certissuer!="undefined"){var a=new X509();a.hex=X509.pemToHex(b.certissuer);this.hTLV=a.getIssuerHex()}if(typeof b.certsubject!="undefined"){var a=new X509();a.hex=X509.pemToHex(b.certsubject);this.hTLV=a.getSubjectHex()}}};YAHOO.lang.extend(KJUR.asn1.x509.X500Name,KJUR.asn1.ASN1Object);KJUR.asn1.x509.RDN=function(a){KJUR.asn1.x509.RDN.superclass.constructor.call(this);this.asn1Array=new Array();this.addByString=function(b){this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({str:b}))};this.getEncodedHex=function(){var b=new KJUR.asn1.DERSet({array:this.asn1Array});this.TLV=b.getEncodedHex();return this.TLV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.addByString(a.str)}}};YAHOO.lang.extend(KJUR.asn1.x509.RDN,KJUR.asn1.ASN1Object);KJUR.asn1.x509.AttributeTypeAndValue=function(b){KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);var d=null;var c=null;var a="utf8";this.setByString=function(e){if(e.match(/^([^=]+)=(.+)$/)){this.setByAttrTypeAndValueStr(RegExp.$1,RegExp.$2)}else{throw"malformed attrTypeAndValueStr: "+e}};this.setByAttrTypeAndValueStr=function(g,f){this.typeObj=KJUR.asn1.x509.OID.atype2obj(g);var e=a;if(g=="C"){e="prn"}this.valueObj=this.getValueObj(e,f)};this.getValueObj=function(f,e){if(f=="utf8"){return new KJUR.asn1.DERUTF8String({str:e})}if(f=="prn"){return new KJUR.asn1.DERPrintableString({str:e})}if(f=="tel"){return new KJUR.asn1.DERTeletexString({str:e})}if(f=="ia5"){return new KJUR.asn1.DERIA5String({str:e})}throw"unsupported directory string type: type="+f+" value="+e};this.getEncodedHex=function(){var e=new KJUR.asn1.DERSequence({array:[this.typeObj,this.valueObj]});this.TLV=e.getEncodedHex();return this.TLV};if(typeof b!="undefined"){if(typeof b.str!="undefined"){this.setByString(b.str)}}};YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue,KJUR.asn1.ASN1Object);KJUR.asn1.x509.SubjectPublicKeyInfo=function(d){KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);var b=null;var c=null;var a=null;this.setRSAKey=function(e){if(!RSAKey.prototype.isPrototypeOf(e)){throw"argument is not RSAKey instance"}this.rsaKey=e;var g=new KJUR.asn1.DERInteger({bigint:e.n});var f=new KJUR.asn1.DERInteger({"int":e.e});var i=new KJUR.asn1.DERSequence({array:[g,f]});var h=i.getEncodedHex();this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+h})};this.setRSAPEM=function(g){if(g.match(/-----BEGIN PUBLIC KEY-----/)){var n=g;n=n.replace(/^-----[^-]+-----/,"");n=n.replace(/-----[^-]+-----\s*$/,"");var m=n.replace(/\s+/g,"");var f=CryptoJS.enc.Base64.parse(m);var i=CryptoJS.enc.Hex.stringify(f);var k=_rsapem_getHexValueArrayOfChildrenFromHex(i);var h=k[1];var l=h.substr(2);var e=_rsapem_getHexValueArrayOfChildrenFromHex(l);var j=new RSAKey();j.setPublic(e[0],e[1]);this.setRSAKey(j)}else{throw"key not supported"}};this.getASN1Object=function(){if(this.asn1AlgId==null||this.asn1SubjPKey==null){throw"algId and/or subjPubKey not set"}var e=new KJUR.asn1.DERSequence({array:[this.asn1AlgId,this.asn1SubjPKey]});return e};this.getEncodedHex=function(){var e=this.getASN1Object();this.hTLV=e.getEncodedHex();return this.hTLV};this._setRSAKey=function(e){var g=KJUR.asn1.ASN1Util.newObject({seq:[{"int":{bigint:e.n}},{"int":{"int":e.e}}]});var f=g.getEncodedHex();this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+f})};this._setEC=function(e){var f=new KJUR.asn1.DERObjectIdentifier({name:e.curveName});this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"ecPublicKey",asn1params:f});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+e.pubKeyHex})};this._setDSA=function(e){var f=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":{bigint:e.p}},{"int":{bigint:e.q}},{"int":{bigint:e.g}}]});this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"dsa",asn1params:f});var g=new KJUR.asn1.DERInteger({bigint:e.y});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+g.getEncodedHex()})};if(typeof d!="undefined"){if(typeof RSAKey!="undefined"&&d instanceof RSAKey){this._setRSAKey(d)}else{if(typeof KJUR.crypto.ECDSA!="undefined"&&d instanceof KJUR.crypto.ECDSA){this._setEC(d)}else{if(typeof KJUR.crypto.DSA!="undefined"&&d instanceof KJUR.crypto.DSA){this._setDSA(d)}else{if(typeof d.rsakey!="undefined"){this.setRSAKey(d.rsakey)}else{if(typeof d.rsapem!="undefined"){this.setRSAPEM(d.rsapem)}}}}}}};YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Time=function(c){KJUR.asn1.x509.Time.superclass.constructor.call(this);var b=null;var a=null;this.setTimeParams=function(d){this.timeParams=d};this.getEncodedHex=function(){var d=null;if(this.timeParams!=null){if(this.type=="utc"){d=new KJUR.asn1.DERUTCTime(this.timeParams)}else{d=new KJUR.asn1.DERGeneralizedTime(this.timeParams)}}else{if(this.type=="utc"){d=new KJUR.asn1.DERUTCTime()}else{d=new KJUR.asn1.DERGeneralizedTime()}}this.TLV=d.getEncodedHex();return this.TLV};this.type="utc";if(typeof c!="undefined"){if(typeof c.type!="undefined"){this.type=c.type}else{if(typeof c.str!="undefined"){if(c.str.match(/^[0-9]{12}Z$/)){this.type="utc"}if(c.str.match(/^[0-9]{14}Z$/)){this.type="gen"}}}this.timeParams=c}};YAHOO.lang.extend(KJUR.asn1.x509.Time,KJUR.asn1.ASN1Object);KJUR.asn1.x509.AlgorithmIdentifier=function(e){KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);var a=null;var d=null;var b=null;var c=false;this.getEncodedHex=function(){if(this.nameAlg==null&&this.asn1Alg==null){throw"algorithm not specified"}if(this.nameAlg!=null&&this.asn1Alg==null){this.asn1Alg=KJUR.asn1.x509.OID.name2obj(this.nameAlg)}var f=[this.asn1Alg];if(!this.paramEmpty){f.push(this.asn1Params)}var g=new KJUR.asn1.DERSequence({array:f});this.hTLV=g.getEncodedHex();return this.hTLV};if(typeof e!="undefined"){if(typeof e.name!="undefined"){this.nameAlg=e.name}if(typeof e.asn1params!="undefined"){this.asn1Params=e.asn1params}if(typeof e.paramempty!="undefined"){this.paramEmpty=e.paramempty}}if(this.asn1Params==null){this.asn1Params=new KJUR.asn1.DERNull()}};YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier,KJUR.asn1.ASN1Object);KJUR.asn1.x509.GeneralName=function(d){KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);var c=null;var b=null;var a={rfc822:"81",dns:"82",uri:"86"};this.setByParam=function(g){var f=null;var e=null;if(typeof g.rfc822!="undefined"){this.type="rfc822";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(typeof g.dns!="undefined"){this.type="dns";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(typeof g.uri!="undefined"){this.type="uri";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(this.type==null){throw"unsupported type in params="+g}this.asn1Obj=new KJUR.asn1.DERTaggedObject({explicit:false,tag:a[this.type],obj:e})};this.getEncodedHex=function(){return this.asn1Obj.getEncodedHex()};if(typeof d!="undefined"){this.setByParam(d)}};YAHOO.lang.extend(KJUR.asn1.x509.GeneralName,KJUR.asn1.ASN1Object);KJUR.asn1.x509.GeneralNames=function(b){KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);var a=null;this.setByParamArray=function(e){for(var c=0;c<e.length;c++){var d=new KJUR.asn1.x509.GeneralName(e[c]);this.asn1Array.push(d)}};this.getEncodedHex=function(){var c=new KJUR.asn1.DERSequence({array:this.asn1Array});return c.getEncodedHex()};this.asn1Array=new Array();if(typeof b!="undefined"){this.setByParamArray(b)}};YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames,KJUR.asn1.ASN1Object);KJUR.asn1.x509.DistributionPointName=function(b){KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);var e=null;var c=null;var a=null;var d=null;this.getEncodedHex=function(){if(this.type!="full"){throw"currently type shall be 'full': "+this.type}this.asn1Obj=new KJUR.asn1.DERTaggedObject({explicit:false,tag:this.tag,obj:this.asn1V});this.hTLV=this.asn1Obj.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(KJUR.asn1.x509.GeneralNames.prototype.isPrototypeOf(b)){this.type="full";this.tag="a0";this.asn1V=b}else{throw"This class supports GeneralNames only as argument"}}};YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName,KJUR.asn1.ASN1Object);KJUR.asn1.x509.DistributionPoint=function(b){KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var c=new KJUR.asn1.DERSequence();if(this.asn1DP!=null){var d=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a0",obj:this.asn1DP});c.appendASN1Object(d)}this.hTLV=c.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.dpobj!="undefined"){this.asn1DP=b.dpobj}}};YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint,KJUR.asn1.ASN1Object);KJUR.asn1.x509.OID=new function(a){this.atype2oidList={C:"2.5.4.6",O:"2.5.4.10",OU:"2.5.4.11",ST:"2.5.4.8",L:"2.5.4.7",CN:"2.5.4.3",DN:"2.5.4.49",DC:"0.9.2342.19200300.100.1.25",};this.name2oidList={sha1:"1.3.14.3.2.26",sha256:"2.16.840.1.101.3.4.2.1",sha384:"2.16.840.1.101.3.4.2.2",sha512:"2.16.840.1.101.3.4.2.3",sha224:"2.16.840.1.101.3.4.2.4",md5:"1.2.840.113549.2.5",md2:"1.3.14.7.2.2.1",ripemd160:"1.3.36.3.2.1",MD2withRSA:"1.2.840.113549.1.1.2",MD4withRSA:"1.2.840.113549.1.1.3",MD5withRSA:"1.2.840.113549.1.1.4",SHA1withRSA:"1.2.840.113549.1.1.5",SHA224withRSA:"1.2.840.113549.1.1.14",SHA256withRSA:"1.2.840.113549.1.1.11",SHA384withRSA:"1.2.840.113549.1.1.12",SHA512withRSA:"1.2.840.113549.1.1.13",SHA1withECDSA:"1.2.840.10045.4.1",SHA224withECDSA:"1.2.840.10045.4.3.1",SHA256withECDSA:"1.2.840.10045.4.3.2",SHA384withECDSA:"1.2.840.10045.4.3.3",SHA512withECDSA:"1.2.840.10045.4.3.4",dsa:"1.2.840.10040.4.1",SHA1withDSA:"1.2.840.10040.4.3",SHA224withDSA:"2.16.840.1.101.3.4.3.1",SHA256withDSA:"2.16.840.1.101.3.4.3.2",rsaEncryption:"1.2.840.113549.1.1.1",subjectKeyIdentifier:"2.5.29.14",countryName:"2.5.4.6",organization:"2.5.4.10",organizationalUnit:"2.5.4.11",stateOrProvinceName:"2.5.4.8",locality:"2.5.4.7",commonName:"2.5.4.3",keyUsage:"2.5.29.15",basicConstraints:"2.5.29.19",cRLDistributionPoints:"2.5.29.31",certificatePolicies:"2.5.29.32",authorityKeyIdentifier:"2.5.29.35",extKeyUsage:"2.5.29.37",anyExtendedKeyUsage:"2.5.29.37.0",serverAuth:"1.3.6.1.5.5.7.3.1",clientAuth:"1.3.6.1.5.5.7.3.2",codeSigning:"1.3.6.1.5.5.7.3.3",emailProtection:"1.3.6.1.5.5.7.3.4",timeStamping:"1.3.6.1.5.5.7.3.8",ocspSigning:"1.3.6.1.5.5.7.3.9",ecPublicKey:"1.2.840.10045.2.1",secp256r1:"1.2.840.10045.3.1.7",secp256k1:"1.3.132.0.10",secp384r1:"1.3.132.0.34",pkcs5PBES2:"1.2.840.113549.1.5.13",pkcs5PBKDF2:"1.2.840.113549.1.5.12","des-EDE3-CBC":"1.2.840.113549.3.7",data:"1.2.840.113549.1.7.1","signed-data":"1.2.840.113549.1.7.2","enveloped-data":"1.2.840.113549.1.7.3","digested-data":"1.2.840.113549.1.7.5","encrypted-data":"1.2.840.113549.1.7.6","authenticated-data":"1.2.840.113549.1.9.16.1.2",tstinfo:"1.2.840.113549.1.9.16.1.4",};this.objCache={};this.name2obj=function(b){if(typeof this.objCache[b]!="undefined"){return this.objCache[b]}if(typeof this.name2oidList[b]=="undefined"){throw"Name of ObjectIdentifier not defined: "+b}var c=this.name2oidList[b];var d=new KJUR.asn1.DERObjectIdentifier({oid:c});this.objCache[b]=d;return d};this.atype2obj=function(b){if(typeof this.objCache[b]!="undefined"){return this.objCache[b]}if(typeof this.atype2oidList[b]=="undefined"){throw"AttributeType name undefined: "+b}var c=this.atype2oidList[b];var d=new KJUR.asn1.DERObjectIdentifier({oid:c});this.objCache[b]=d;return d}};KJUR.asn1.x509.OID.oid2name=function(b){var c=KJUR.asn1.x509.OID.name2oidList;for(var a in c){if(c[a]==b){return a}}return""};KJUR.asn1.x509.X509Util=new function(){this.getPKCS8PubKeyPEMfromRSAKey=function(i){var h=null;var f=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(i.n);var j=KJUR.asn1.ASN1Util.integerToByteHex(i.e);var a=new KJUR.asn1.DERInteger({hex:f});var g=new KJUR.asn1.DERInteger({hex:j});var l=new KJUR.asn1.DERSequence({array:[a,g]});var c=l.getEncodedHex();var d=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});var b=new KJUR.asn1.DERBitString({hex:"00"+c});var k=new KJUR.asn1.DERSequence({array:[d,b]});var e=k.getEncodedHex();var h=KJUR.asn1.ASN1Util.getPEMStringFromHex(e,"PUBLIC KEY");return h}};KJUR.asn1.x509.X509Util.newCertPEM=function(f){var c=KJUR.asn1.x509;var e=new c.TBSCertificate();if(f.serial!==undefined){e.setSerialNumberByParam(f.serial)}else{throw"serial number undefined."}if(typeof f.sigalg.name=="string"){e.setSignatureAlgByParam(f.sigalg)}else{throw"unproper signature algorithm name"}if(f.issuer!==undefined){e.setIssuerByParam(f.issuer)}else{throw"issuer name undefined."}if(f.notbefore!==undefined){e.setNotBeforeByParam(f.notbefore)}else{throw"notbefore undefined."}if(f.notafter!==undefined){e.setNotAfterByParam(f.notafter)}else{throw"notafter undefined."}if(f.subject!==undefined){e.setSubjectByParam(f.subject)}else{throw"subject name undefined."}if(f.sbjpubkey!==undefined){e.setSubjectPublicKeyByGetKey(f.sbjpubkey)}else{throw"subject public key undefined."}if(f.ext!==undefined&&f.ext.length!==undefined){for(var b=0;b<f.ext.length;b++){for(key in f.ext[b]){e.appendExtensionByName(key,f.ext[b][key])}}}if(f.cakey===undefined&&f.sighex===undefined){throw"param cakey and sighex undefined."}var d=null;var a=null;if(f.cakey){d=KEYUTIL.getKey.apply(null,f.cakey);a=new c.Certificate({tbscertobj:e,prvkeyobj:d});a.sign()}if(f.sighex){a=new c.Certificate({tbscertobj:e});a.setSignatureHex(f.sighex)}return a.getPEMString()};
|
||
/*! asn1cms-1.0.2.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.cms=="undefined"||!KJUR.asn1.cms){KJUR.asn1.cms={}}KJUR.asn1.cms.Attribute=function(b){KJUR.asn1.cms.Attribute.superclass.constructor.call(this);var a=[];this.getEncodedHex=function(){var f,e,c;f=new KJUR.asn1.DERObjectIdentifier({oid:this.attrTypeOid});e=new KJUR.asn1.DERSet({array:this.valueList});try{e.getEncodedHex()}catch(d){throw"fail valueSet.getEncodedHex in Attribute(1)/"+d}c=new KJUR.asn1.DERSequence({array:[f,e]});try{this.hTLV=c.getEncodedHex()}catch(d){throw"failed seq.getEncodedHex in Attribute(2)/"+d}return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.Attribute,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentType=function(b){KJUR.asn1.cms.ContentType.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.3";var a=null;if(typeof b!="undefined"){var a=new KJUR.asn1.DERObjectIdentifier(b);this.valueList=[a]}};YAHOO.lang.extend(KJUR.asn1.cms.ContentType,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.MessageDigest=function(e){KJUR.asn1.cms.MessageDigest.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.4";if(typeof e!="undefined"){if(e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo&&typeof e.hashAlg=="string"){var b=e.eciObj.eContentValueHex;var a=e.hashAlg;var c=KJUR.crypto.Util.hashHex(b,a);var d=new KJUR.asn1.DEROctetString({hex:c});d.getEncodedHex();this.valueList=[d]}else{var d=new KJUR.asn1.DEROctetString(e);d.getEncodedHex();this.valueList=[d]}}};YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningTime=function(c){KJUR.asn1.cms.SigningTime.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.5";if(typeof c!="undefined"){var a=new KJUR.asn1.x509.Time(c);try{a.getEncodedHex()}catch(b){throw"SigningTime.getEncodedHex() failed/"+b}this.valueList=[a]}};YAHOO.lang.extend(KJUR.asn1.cms.SigningTime,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningCertificate=function(d){KJUR.asn1.cms.SigningCertificate.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.12";var a=KJUR.asn1;var c=KJUR.asn1.cms;var b=KJUR.crypto;this.setCerts=function(l){var j=[];for(var h=0;h<l.length;h++){var f=KEYUTIL.getHexFromPEM(l[h]);var e=b.Util.hashHex(f,"sha1");var m=new a.DEROctetString({hex:e});m.getEncodedHex();var k=new c.IssuerAndSerialNumber({cert:l[h]});k.getEncodedHex();var n=new a.DERSequence({array:[m,k]});n.getEncodedHex();j.push(n)}var g=new a.DERSequence({array:j});g.getEncodedHex();this.valueList=[g]};if(typeof d!="undefined"){if(typeof d.array=="object"){this.setCerts(d.array)}}};YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningCertificateV2=function(e){KJUR.asn1.cms.SigningCertificateV2.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.47";var b=KJUR.asn1;var f=KJUR.asn1.x509;var d=KJUR.asn1.cms;var c=KJUR.crypto;this.setCerts=function(p,h){var n=[];for(var l=0;l<p.length;l++){var j=KEYUTIL.getHexFromPEM(p[l]);var r=[];if(h!="sha256"){r.push(new f.AlgorithmIdentifier({name:h}))}var g=c.Util.hashHex(j,h);var q=new b.DEROctetString({hex:g});q.getEncodedHex();r.push(q);var m=new d.IssuerAndSerialNumber({cert:p[l]});m.getEncodedHex();r.push(m);var o=new b.DERSequence({array:r});o.getEncodedHex();n.push(o)}var k=new b.DERSequence({array:n});k.getEncodedHex();this.valueList=[k]};if(typeof e!="undefined"){if(typeof e.array=="object"){var a="sha256";if(typeof e.hashAlg=="string"){a=e.hashAlg}this.setCerts(e.array,a)}}};YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.IssuerAndSerialNumber=function(c){KJUR.asn1.cms.IssuerAndSerialNumber.superclass.constructor.call(this);var e=null;var b=null;var a=KJUR.asn1;var d=a.x509;this.setByCertPEM=function(i){var g=KEYUTIL.getHexFromPEM(i);var f=new X509();f.hex=g;var j=f.getIssuerHex();this.dIssuer=new d.X500Name();this.dIssuer.hTLV=j;var h=f.getSerialNumberHex();this.dSerial=new a.DERInteger({hex:h})};this.getEncodedHex=function(){var f=new KJUR.asn1.DERSequence({array:[this.dIssuer,this.dSerial]});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c=="string"&&c.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(c)}if(c.issuer&&c.serial){if(c.issuer instanceof KJUR.asn1.x509.X500Name){this.dIssuer=c.issuer}else{this.dIssuer=new KJUR.asn1.x509.X500Name(c.issuer)}if(c.serial instanceof KJUR.asn1.DERInteger){this.dSerial=c.serial}else{this.dSerial=new KJUR.asn1.DERInteger(c.serial)}}if(typeof c.cert=="string"){this.setByCertPEM(c.cert)}}};YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber,KJUR.asn1.ASN1Object);KJUR.asn1.cms.AttributeList=function(a){KJUR.asn1.cms.AttributeList.superclass.constructor.call(this);this.list=new Array();this.sortFlag=true;this.add=function(b){if(b instanceof KJUR.asn1.cms.Attribute){this.list.push(b)}};this.length=function(){return this.list.length};this.clear=function(){this.list=new Array();this.hTLV=null;this.hV=null};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var b=new KJUR.asn1.DERSet({array:this.list,sortflag:this.sortFlag});this.hTLV=b.getEncodedHex();return this.hTLV};if(typeof a!="undefined"){if(typeof a.sortflag!="undefined"&&a.sortflag==false){this.sortFlag=false}}};YAHOO.lang.extend(KJUR.asn1.cms.AttributeList,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignerInfo=function(c){KJUR.asn1.cms.SignerInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dSignerIdentifier=null;this.dDigestAlgorithm=null;this.dSignedAttrs=new b.AttributeList();this.dSigAlg=null;this.dSig=null;this.dUnsignedAttrs=new b.AttributeList();this.setSignerIdentifier=function(f){if(typeof f=="string"&&f.indexOf("CERTIFICATE")!=-1&&f.indexOf("BEGIN")!=-1&&f.indexOf("END")!=-1){var e=f;this.dSignerIdentifier=new b.IssuerAndSerialNumber({cert:f})}};this.setForContentAndHash=function(e){if(typeof e!="undefined"){if(e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo){this.dSignedAttrs.add(new b.ContentType({oid:"1.2.840.113549.1.7.1"}));this.dSignedAttrs.add(new b.MessageDigest({eciObj:e.eciObj,hashAlg:e.hashAlg}))}if(typeof e.sdObj!="undefined"&&e.sdObj instanceof KJUR.asn1.cms.SignedData){if(e.sdObj.digestAlgNameList.join(":").indexOf(e.hashAlg)==-1){e.sdObj.digestAlgNameList.push(e.hashAlg)}}if(typeof e.hashAlg=="string"){this.dDigestAlgorithm=new d.AlgorithmIdentifier({name:e.hashAlg})}}};this.sign=function(j,f){this.dSigAlg=new d.AlgorithmIdentifier({name:f});var g=this.dSignedAttrs.getEncodedHex();var e=KEYUTIL.getKey(j);var i=new KJUR.crypto.Signature({alg:f});i.init(e);i.updateHex(g);var h=i.sign();this.dSig=new a.DEROctetString({hex:h})};this.addUnsigned=function(e){this.hTLV=null;this.dUnsignedAttrs.hTLV=null;this.dUnsignedAttrs.add(e)};this.getEncodedHex=function(){if(this.dSignedAttrs instanceof KJUR.asn1.cms.AttributeList&&this.dSignedAttrs.length()==0){throw"SignedAttrs length = 0 (empty)"}var e=new a.DERTaggedObject({obj:this.dSignedAttrs,tag:"a0",explicit:false});var h=null;if(this.dUnsignedAttrs.length()>0){h=new a.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:false})}var g=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,e,this.dSigAlg,this.dSig,];if(h!=null){g.push(h)}var f=new a.DERSequence({array:g});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.EncapsulatedContentInfo=function(c){KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dEContentType=new a.DERObjectIdentifier({name:"data"});this.dEContent=null;this.isDetached=false;this.eContentValueHex=null;this.setContentType=function(e){if(e.match(/^[0-2][.][0-9.]+$/)){this.dEContentType=new a.DERObjectIdentifier({oid:e})}else{this.dEContentType=new a.DERObjectIdentifier({name:e})}};this.setContentValue=function(e){if(typeof e!="undefined"){if(typeof e.hex=="string"){this.eContentValueHex=e.hex}else{if(typeof e.str=="string"){this.eContentValueHex=utf8tohex(e.str)}}}};this.setContentValueHex=function(e){this.eContentValueHex=e};this.setContentValueStr=function(e){this.eContentValueHex=utf8tohex(e)};this.getEncodedHex=function(){if(typeof this.eContentValueHex!="string"){throw"eContentValue not yet set"}var g=new a.DEROctetString({hex:this.eContentValueHex});this.dEContent=new a.DERTaggedObject({obj:g,tag:"a0",explicit:true});var e=[this.dEContentType];if(!this.isDetached){e.push(this.dEContent)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentInfo=function(c){KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dContentType=null;this.dContent=null;this.setContentType=function(e){if(typeof e=="string"){this.dContentType=d.OID.name2obj(e)}};this.getEncodedHex=function(){var f=new a.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:true});var e=new a.DERSequence({array:[this.dContentType,f]});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(c.type){this.setContentType(c.type)}if(c.obj&&c.obj instanceof a.ASN1Object){this.dContent=c.obj}}};YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignedData=function(c){KJUR.asn1.cms.SignedData.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dDigestAlgs=null;this.digestAlgNameList=[];this.dEncapContentInfo=new b.EncapsulatedContentInfo();this.dCerts=null;this.certificateList=[];this.crlList=[];this.signerInfoList=[new b.SignerInfo()];this.addCertificatesByPEM=function(e){var f=KEYUTIL.getHexFromPEM(e);var g=new a.ASN1Object();g.hTLV=f;this.certificateList.push(g)};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}if(this.dDigestAlgs==null){var k=[];for(var j=0;j<this.digestAlgNameList.length;j++){var h=this.digestAlgNameList[j];var m=new d.AlgorithmIdentifier({name:h});k.push(m)}this.dDigestAlgs=new a.DERSet({array:k})}var e=[this.dCMSVersion,this.dDigestAlgs,this.dEncapContentInfo];if(this.dCerts==null){if(this.certificateList.length>0){var l=new a.DERSet({array:this.certificateList});this.dCerts=new a.DERTaggedObject({obj:l,tag:"a0",explicit:false})}}if(this.dCerts!=null){e.push(this.dCerts)}var g=new a.DERSet({array:this.signerInfoList});e.push(g);var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};this.getContentInfo=function(){this.getEncodedHex();var e=new b.ContentInfo({type:"signed-data",obj:this});return e};this.getContentInfoEncodedHex=function(){var e=this.getContentInfo();var f=e.getEncodedHex();return f};this.getPEM=function(){var e=this.getContentInfoEncodedHex();var f=a.ASN1Util.getPEMStringFromHex(e,"CMS");return f}};YAHOO.lang.extend(KJUR.asn1.cms.SignedData,KJUR.asn1.ASN1Object);KJUR.asn1.cms.CMSUtil=new function(){};KJUR.asn1.cms.CMSUtil.newSignedData=function(a){var h=KJUR.asn1.cms;var g=KJUR.asn1.cades;var f=new h.SignedData();f.dEncapContentInfo.setContentValue(a.content);if(typeof a.certs=="object"){for(var b=0;b<a.certs.length;b++){f.addCertificatesByPEM(a.certs[b])}}f.signerInfoList=[];for(var b=0;b<a.signerInfos.length;b++){var d=a.signerInfos[b];var c=new h.SignerInfo();c.setSignerIdentifier(d.signerCert);c.setForContentAndHash({sdObj:f,eciObj:f.dEncapContentInfo,hashAlg:d.hashAlg});for(attrName in d.sAttr){var j=d.sAttr[attrName];if(attrName=="SigningTime"){var e=new h.SigningTime(j);c.dSignedAttrs.add(e)}if(attrName=="SigningCertificate"){var e=new h.SigningCertificate(j);c.dSignedAttrs.add(e)}if(attrName=="SigningCertificateV2"){var e=new h.SigningCertificateV2(j);c.dSignedAttrs.add(e)}if(attrName=="SignaturePolicyIdentifier"){var e=new g.SignaturePolicyIdentifier(j);c.dSignedAttrs.add(e)}}c.sign(d.signerPrvKey,d.sigAlg);f.signerInfoList.push(c)}return f};
|
||
/*! asn1tsp-1.0.1.js (c) 2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.tsp=="undefined"||!KJUR.asn1.tsp){KJUR.asn1.tsp={}}KJUR.asn1.tsp.Accuracy=function(b){KJUR.asn1.tsp.Accuracy.superclass.constructor.call(this);var a=KJUR.asn1;this.seconds=null;this.millis=null;this.micros=null;this.getEncodedHex=function(){var e=null;var g=null;var i=null;var c=[];if(this.seconds!=null){e=new a.DERInteger({"int":this.seconds});c.push(e)}if(this.millis!=null){var h=new a.DERInteger({"int":this.millis});g=new a.DERTaggedObject({obj:h,tag:"80",explicit:false});c.push(g)}if(this.micros!=null){var f=new a.DERInteger({"int":this.micros});i=new a.DERTaggedObject({obj:f,tag:"81",explicit:false});c.push(i)}var d=new a.DERSequence({array:c});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.seconds=="number"){this.seconds=b.seconds}if(typeof b.millis=="number"){this.millis=b.millis}if(typeof b.micros=="number"){this.micros=b.micros}}};YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.MessageImprint=function(b){KJUR.asn1.tsp.MessageImprint.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.x509;this.dHashAlg=null;this.dHashValue=null;this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var d=new a.DERSequence({array:[this.dHashAlg,this.dHashValue]});return d.getEncodedHex()};if(typeof b!="undefined"){if(typeof b.hashAlg=="string"){this.dHashAlg=new c.AlgorithmIdentifier({name:b.hashAlg})}if(typeof b.hashValue=="string"){this.dHashValue=new a.DEROctetString({hex:b.hashValue})}}};YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TimeStampReq=function(c){KJUR.asn1.tsp.TimeStampReq.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dVersion=new a.DERInteger({"int":1});this.dMessageImprint=null;this.dPolicy=null;this.dNonce=null;this.certReq=true;this.setMessageImprint=function(d){if(d instanceof KJUR.asn1.tsp.MessageImprint){this.dMessageImprint=d;return}if(typeof d=="object"){this.dMessageImprint=new b.MessageImprint(d)}};this.getEncodedHex=function(){if(this.dMessageImprint==null){throw"messageImprint shall be specified"}var d=[this.dVersion,this.dMessageImprint];if(this.dPolicy!=null){d.push(this.dPolicy)}if(this.dNonce!=null){d.push(this.dNonce)}if(this.certReq){d.push(new a.DERBoolean())}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.mi=="object"){this.setMessageImprint(c.mi)}if(typeof c.policy=="object"){this.dPolicy=new a.DERObjectIdentifier(c.policy)}if(typeof c.nonce=="object"){this.dNonce=new a.DERInteger(c.nonce)}if(typeof c.certreq=="boolean"){this.certReq=c.certreq}}};YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TSTInfo=function(c){KJUR.asn1.tsp.TSTInfo.superclass.constructor.call(this);var a=KJUR.asn1;var d=KJUR.asn1.x509;var b=KJUR.asn1.tsp;this.dVersion=new a.DERInteger({"int":1});this.dPolicy=null;this.dMessageImprint=null;this.dSerialNumber=null;this.dGenTime=null;this.dAccuracy=null;this.dOrdering=null;this.dNonce=null;this.dTsa=null;this.getEncodedHex=function(){var e=[this.dVersion];if(this.dPolicy==null){throw"policy shall be specified."}e.push(this.dPolicy);if(this.dMessageImprint==null){throw"messageImprint shall be specified."}e.push(this.dMessageImprint);if(this.dSerialNumber==null){throw"serialNumber shall be specified."}e.push(this.dSerialNumber);if(this.dGenTime==null){throw"genTime shall be specified."}e.push(this.dGenTime);if(this.dAccuracy!=null){e.push(this.dAccuracy)}if(this.dOrdering!=null){e.push(this.dOrdering)}if(this.dNonce!=null){e.push(this.dNonce)}if(this.dTsa!=null){e.push(this.dTsa)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.policy=="string"){if(!c.policy.match(/^[0-9.]+$/)){throw"policy shall be oid like 0.1.4.134"}this.dPolicy=new a.DERObjectIdentifier({oid:c.policy})}if(typeof c.messageImprint!="undefined"){this.dMessageImprint=new b.MessageImprint(c.messageImprint)}if(typeof c.serialNumber!="undefined"){this.dSerialNumber=new a.DERInteger(c.serialNumber)}if(typeof c.genTime!="undefined"){this.dGenTime=new a.DERGeneralizedTime(c.genTime)}if(typeof c.accuracy!="undefind"){this.dAccuracy=new b.Accuracy(c.accuracy)}if(typeof c.ordering!="undefined"&&c.ordering==true){this.dOrdering=new a.DERBoolean()}if(typeof c.nonce!="undefined"){this.dNonce=new a.DERInteger(c.nonce)}if(typeof c.tsa!="undefined"){this.dTsa=new d.X500Name(c.tsa)}}};YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TimeStampResp=function(c){KJUR.asn1.tsp.TimeStampResp.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dStatus=null;this.dTST=null;this.getEncodedHex=function(){if(this.dStatus==null){throw"status shall be specified"}var d=[this.dStatus];if(this.dTST!=null){d.push(this.dTST)}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.status=="object"){this.dStatus=new b.PKIStatusInfo(c.status)}if(typeof c.tst!="undefined"&&c.tst instanceof KJUR.asn1.ASN1Object){this.dTST=c.tst.getContentInfo()}}};YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatusInfo=function(c){KJUR.asn1.tsp.PKIStatusInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dStatus=null;this.dStatusString=null;this.dFailureInfo=null;this.getEncodedHex=function(){if(this.dStatus==null){throw"status shall be specified"}var d=[this.dStatus];if(this.dStatusString!=null){d.push(this.dStatusString)}if(this.dFailureInfo!=null){d.push(this.dFailureInfo)}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.status=="object"){this.dStatus=new b.PKIStatus(c.status)}if(typeof c.statstr=="object"){this.dStatusString=new b.PKIFreeText({array:c.statstr})}if(typeof c.failinfo=="object"){this.dFailureInfo=new b.PKIFailureInfo(c.failinfo)}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatus=function(e){KJUR.asn1.tsp.PKIStatus.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;var d=null;this.getEncodedHex=function(){this.hTLV=this.dStatus.getEncodedHex();return this.hTLV};if(typeof e!="undefined"){if(typeof e.name!="undefined"){var c=b.PKIStatus.valueList;if(typeof c[e.name]=="undefined"){throw"name undefined: "+e.name}this.dStatus=new a.DERInteger({"int":c[e.name]})}else{this.dStatus=new a.DERInteger(e)}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatus.valueList={granted:0,grantedWithMods:1,rejection:2,waiting:3,revocationWarning:4,revocationNotification:5};KJUR.asn1.tsp.PKIFreeText=function(b){KJUR.asn1.tsp.PKIFreeText.superclass.constructor.call(this);var a=KJUR.asn1;this.textList=[];this.getEncodedHex=function(){var c=[];for(var e=0;e<this.textList.length;e++){c.push(new a.DERUTF8String({str:this.textList[e]}))}var d=new a.DERSequence({array:c});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.array=="object"){this.textList=b.array}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIFailureInfo=function(d){KJUR.asn1.tsp.PKIFailureInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.value=null;this.getEncodedHex=function(){if(this.value==null){throw"value shall be specified"}var e=new Number(this.value).toString(2);var f=new a.DERBitString();f.setByBinaryString(e);this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof d!="undefined"){if(typeof d.name=="string"){var c=b.PKIFailureInfo.valueList;if(typeof c[d.name]=="undefined"){throw"name undefined: "+d.name}this.value=c[d.name]}else{if(typeof d["int"]=="number"){this.value=d["int"]}}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIFailureInfo.valueList={badAlg:0,badRequest:2,badDataFormat:5,timeNotAvailable:14,unacceptedPolicy:15,unacceptedExtension:16,addInfoNotAvailable:17,systemFailure:25};KJUR.asn1.tsp.AbstractTSAAdapter=function(a){this.getTSTHex=function(c,b){throw"not implemented yet"}};KJUR.asn1.tsp.SimpleTSAAdapter=function(a){KJUR.asn1.tsp.SimpleTSAAdapter.superclass.constructor.call(this);this.params=null;this.serial=0;this.getTSTHex=function(c,b){var e=KJUR.crypto.Util.hashHex(c,b);this.params.tstInfo.messageImprint={hashAlg:b,hashValue:e};this.params.tstInfo.serialNumber={"int":this.serial++};var d=Math.floor(Math.random()*1000000000);this.params.tstInfo.nonce={"int":d};var f=KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);return f.getContentInfoEncodedHex()};if(typeof a!="undefined"){this.params=a}};YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter,KJUR.asn1.tsp.AbstractTSAAdapter);KJUR.asn1.tsp.FixedTSAAdapter=function(a){KJUR.asn1.tsp.FixedTSAAdapter.superclass.constructor.call(this);this.params=null;this.getTSTHex=function(c,b){var d=KJUR.crypto.Util.hashHex(c,b);this.params.tstInfo.messageImprint={hashAlg:b,hashValue:d};var e=KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);return e.getContentInfoEncodedHex()};if(typeof a!="undefined"){this.params=a}};YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter,KJUR.asn1.tsp.AbstractTSAAdapter);KJUR.asn1.tsp.TSPUtil=new function(){};KJUR.asn1.tsp.TSPUtil.newTimeStampToken=function(b){var j=KJUR.asn1.cms;var a=KJUR.asn1.tsp;var g=new j.SignedData();var e=new a.TSTInfo(b.tstInfo);var f=e.getEncodedHex();g.dEncapContentInfo.setContentValue({hex:f});g.dEncapContentInfo.setContentType("tstinfo");if(typeof b.certs=="object"){for(var c=0;c<b.certs.length;c++){g.addCertificatesByPEM(b.certs[c])}}var d=g.signerInfoList[0];d.setSignerIdentifier(b.signerCert);d.setForContentAndHash({sdObj:g,eciObj:g.dEncapContentInfo,hashAlg:b.hashAlg});var h=new j.SigningCertificate({array:[b.signerCert]});d.dSignedAttrs.add(h);d.sign(b.signerPrvKey,b.sigAlg);return g};KJUR.asn1.tsp.TSPUtil.parseTimeStampReq=function(d){var f={};f.certreq=false;var h=ASN1HEX.getPosArrayOfChildren_AtObj(d,0);if(h.length<2){throw"TimeStampReq must have at least 2 items"}var c=ASN1HEX.getHexOfTLV_AtObj(d,h[1]);f.mi=KJUR.asn1.tsp.TSPUtil.parseMessageImprint(c);for(var e=2;e<h.length;e++){var b=h[e];var a=d.substr(b,2);if(a=="06"){var g=ASN1HEX.getHexOfV_AtObj(d,b);f.policy=ASN1HEX.hextooidstr(g)}if(a=="02"){f.nonce=ASN1HEX.getHexOfV_AtObj(d,b)}if(a=="01"){f.certreq=true}}return f};KJUR.asn1.tsp.TSPUtil.parseMessageImprint=function(c){var h={};if(c.substr(0,2)!="30"){throw"head of messageImprint hex shall be '30'"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);var i=ASN1HEX.getDecendantIndexByNthList(c,0,[0,0]);var d=ASN1HEX.getHexOfV_AtObj(c,i);var e=ASN1HEX.hextooidstr(d);var g=KJUR.asn1.x509.OID.oid2name(e);if(g==""){throw"hashAlg name undefined: "+e}var b=g;var f=ASN1HEX.getDecendantIndexByNthList(c,0,[1]);h.hashAlg=b;h.hashValue=ASN1HEX.getHexOfV_AtObj(c,f);return h};
|
||
/*! asn1cades-1.0.0.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.cades=="undefined"||!KJUR.asn1.cades){KJUR.asn1.cades={}}KJUR.asn1.cades.SignaturePolicyIdentifier=function(e){KJUR.asn1.cades.SignaturePolicyIdentifier.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.15";var b=KJUR.asn1;var d=KJUR.asn1.cades;if(typeof e!="undefined"){if(typeof e.oid=="string"&&typeof e.hash=="object"){var f=new b.DERObjectIdentifier({oid:e.oid});var a=new d.OtherHashAlgAndValue(e.hash);var c=new b.DERSequence({array:[f,a]});this.valueList=[c]}}};YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.OtherHashAlgAndValue=function(b){KJUR.asn1.cades.OtherHashAlgAndValue.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.x509;this.dAlg=null;this.dHash=null;this.getEncodedHex=function(){var d=new a.DERSequence({array:[this.dAlg,this.dHash]});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.alg=="string"&&typeof b.hash=="string"){this.dAlg=new c.AlgorithmIdentifier({name:b.alg});this.dHash=new a.DEROctetString({hex:b.hash})}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue,KJUR.asn1.ASN1Object);KJUR.asn1.cades.SignatureTimeStamp=function(c){KJUR.asn1.cades.SignatureTimeStamp.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.14";this.tstHex=null;var a=KJUR.asn1;if(typeof c!="undefined"){if(typeof c.res!="undefined"){if(typeof c.res=="string"&&c.res.match(/^[0-9A-Fa-f]+$/)){}else{if(c.res instanceof KJUR.asn1.ASN1Object){}else{throw"res param shall be ASN1Object or hex string"}}}if(typeof c.tst!="undefined"){if(typeof c.tst=="string"&&c.tst.match(/^[0-9A-Fa-f]+$/)){var b=new a.ASN1Object();this.tstHex=c.tst;b.hTLV=this.tstHex;b.getEncodedHex();this.valueList=[b]}else{if(c.tst instanceof KJUR.asn1.ASN1Object){}else{throw"tst param shall be ASN1Object or hex string"}}}}};YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.CompleteCertificateRefs=function(c){KJUR.asn1.cades.CompleteCertificateRefs.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.21";var a=KJUR.asn1;var b=KJUR.asn1.cades;this.setByArray=function(d){this.valueList=[];for(var e=0;e<d.length;e++){var f=new b.OtherCertID(d[e]);this.valueList.push(f)}};if(typeof c!="undefined"){if(typeof c=="object"&&typeof c.length=="number"){this.setByArray(c)}}};YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.OtherCertID=function(d){KJUR.asn1.cades.OtherCertID.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.cms;var b=KJUR.asn1.cades;this.hasIssuerSerial=true;this.dOtherCertHash=null;this.dIssuerSerial=null;this.setByCertPEM=function(e){this.dOtherCertHash=new b.OtherHash(e);if(this.hasIssuerSerial){this.dIssuerSerial=new c.IssuerAndSerialNumber(e)}};this.getEncodedHex=function(){if(this.hTLV!=null){return this.hTLV}if(this.dOtherCertHash==null){throw"otherCertHash not set"}var e=[this.dOtherCertHash];if(this.dIssuerSerial!=null){e.push(this.dIssuerSerial)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof d!="undefined"){if(typeof d=="string"&&d.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(d)}if(typeof d=="object"){if(d.hasis===false){this.hasIssuerSerial=false}if(typeof d.cert=="string"){this.setByCertPEM(d.cert)}}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID,KJUR.asn1.ASN1Object);KJUR.asn1.cades.OtherHash=function(c){KJUR.asn1.cades.OtherHash.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cades;this.alg="sha256";this.dOtherHash=null;this.setByCertPEM=function(d){if(d.indexOf("-----BEGIN ")==-1){throw"certPEM not to seem PEM format"}var e=X509.pemToHex(d);var f=KJUR.crypto.Util.hashHex(e,this.alg);this.dOtherHash=new b.OtherHashAlgAndValue({alg:this.alg,hash:f})};this.getEncodedHex=function(){if(this.dOtherHash==null){throw"OtherHash not set"}return this.dOtherHash.getEncodedHex()};if(typeof c!="undefined"){if(typeof c=="string"){if(c.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(c)}else{if(c.match(/^[0-9A-Fa-f]+$/)){this.dOtherHash=new a.DEROctetString({hex:c})}else{throw"unsupported string value for params"}}}else{if(typeof c=="object"){if(typeof c.cert=="string"){if(typeof c.alg=="string"){this.alg=c.alg}this.setByCertPEM(c.cert)}else{this.dOtherHash=new b.OtherHashAlgAndValue(c)}}}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherHash,KJUR.asn1.ASN1Object);KJUR.asn1.cades.CAdESUtil=new function(){};KJUR.asn1.cades.CAdESUtil.addSigTS=function(c,b,a){};KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned=function(d){var q=KJUR.asn1;var p=KJUR.asn1.cms;var c=KJUR.asn1.cades.CAdESUtil;var a={};if(ASN1HEX.getDecendantHexTLVByNthList(d,0,[0])!="06092a864886f70d010702"){throw"hex is not CMS SignedData"}var s=ASN1HEX.getDecendantIndexByNthList(d,0,[1,0]);var b=ASN1HEX.getPosArrayOfChildren_AtObj(d,s);if(b.length<4){throw"num of SignedData elem shall be 4 at least"}var f=b.shift();a.version=ASN1HEX.getHexOfTLV_AtObj(d,f);var l=b.shift();a.algs=ASN1HEX.getHexOfTLV_AtObj(d,l);var m=b.shift();a.encapcontent=ASN1HEX.getHexOfTLV_AtObj(d,m);a.certs=null;a.revs=null;a.si=[];var n=b.shift();if(d.substr(n,2)=="a0"){a.certs=ASN1HEX.getHexOfTLV_AtObj(d,n);n=b.shift()}if(d.substr(n,2)=="a1"){a.revs=ASN1HEX.getHexOfTLV_AtObj(d,n);n=b.shift()}var k=n;if(d.substr(k,2)!="31"){throw"Can't find signerInfos"}var j=ASN1HEX.getPosArrayOfChildren_AtObj(d,k);for(var h=0;h<j.length;h++){var o=j[h];var e=c.parseSignerInfoForAddingUnsigned(d,o,h);a.si[h]=e}var g=null;a.obj=new p.SignedData();g=new q.ASN1Object();g.hTLV=a.version;a.obj.dCMSVersion=g;g=new q.ASN1Object();g.hTLV=a.algs;a.obj.dDigestAlgs=g;g=new q.ASN1Object();g.hTLV=a.encapcontent;a.obj.dEncapContentInfo=g;g=new q.ASN1Object();g.hTLV=a.certs;a.obj.dCerts=g;a.obj.signerInfoList=[];for(var h=0;h<a.si.length;h++){a.obj.signerInfoList.push(a.si[h].obj)}return a};KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned=function(d,k,a){var m=KJUR.asn1;var l=KJUR.asn1.cms;var b={};var e=ASN1HEX.getPosArrayOfChildren_AtObj(d,k);if(e.length!=6){throw"not supported items for SignerInfo (!=6)"}var f=e.shift();b.version=ASN1HEX.getHexOfTLV_AtObj(d,f);var n=e.shift();b.si=ASN1HEX.getHexOfTLV_AtObj(d,n);var h=e.shift();b.digalg=ASN1HEX.getHexOfTLV_AtObj(d,h);var c=e.shift();b.sattrs=ASN1HEX.getHexOfTLV_AtObj(d,c);var i=e.shift();b.sigalg=ASN1HEX.getHexOfTLV_AtObj(d,i);var j=e.shift();b.sig=ASN1HEX.getHexOfTLV_AtObj(d,j);b.sigval=ASN1HEX.getHexOfV_AtObj(d,j);var g=null;b.obj=new l.SignerInfo();g=new m.ASN1Object();g.hTLV=b.version;b.obj.dCMSVersion=g;g=new m.ASN1Object();g.hTLV=b.si;b.obj.dSignerIdentifier=g;g=new m.ASN1Object();g.hTLV=b.digalg;b.obj.dDigestAlgorithm=g;g=new m.ASN1Object();g.hTLV=b.sattrs;b.obj.dSignedAttrs=g;g=new m.ASN1Object();g.hTLV=b.sigalg;b.obj.dSigAlg=g;g=new m.ASN1Object();g.hTLV=b.sig;b.obj.dSig=g;b.obj.dUnsignedAttrs=new l.AttributeList();return b};
|
||
/*! base64x-1.1.3 (c) 2012-2014 Kenji Urushima | kjur.github.com/jsjws/license
|
||
*/
|
||
function Base64x(){}function stoBA(d){var b=new Array();for(var c=0;c<d.length;c++){b[c]=d.charCodeAt(c)}return b}function BAtos(b){var d="";for(var c=0;c<b.length;c++){d=d+String.fromCharCode(b[c])}return d}function BAtohex(b){var e="";for(var d=0;d<b.length;d++){var c=b[d].toString(16);if(c.length==1){c="0"+c}e=e+c}return e}function stohex(a){return BAtohex(stoBA(a))}function stob64(a){return hex2b64(stohex(a))}function stob64u(a){return b64tob64u(hex2b64(stohex(a)))}function b64utos(a){return BAtos(b64toBA(b64utob64(a)))}function b64tob64u(a){a=a.replace(/\=/g,"");a=a.replace(/\+/g,"-");a=a.replace(/\//g,"_");return a}function b64utob64(a){if(a.length%4==2){a=a+"=="}else{if(a.length%4==3){a=a+"="}}a=a.replace(/-/g,"+");a=a.replace(/_/g,"/");return a}function hextob64u(a){return b64tob64u(hex2b64(a))}function b64utohex(a){return b64tohex(b64utob64(a))}var utf8tob64u,b64utoutf8;if(typeof Buffer==="function"){utf8tob64u=function(a){return b64tob64u(new Buffer(a,"utf8").toString("base64"))};b64utoutf8=function(a){return new Buffer(b64utob64(a),"base64").toString("utf8")}}else{utf8tob64u=function(a){return hextob64u(uricmptohex(encodeURIComponentAll(a)))};b64utoutf8=function(a){return decodeURIComponent(hextouricmp(b64utohex(a)))}}function utf8tob64(a){return hex2b64(uricmptohex(encodeURIComponentAll(a)))}function b64toutf8(a){return decodeURIComponent(hextouricmp(b64tohex(a)))}function utf8tohex(a){return uricmptohex(encodeURIComponentAll(a))}function hextoutf8(a){return decodeURIComponent(hextouricmp(a))}function hextorstr(c){var b="";for(var a=0;a<c.length-1;a+=2){b+=String.fromCharCode(parseInt(c.substr(a,2),16))}return b}function rstrtohex(c){var a="";for(var b=0;b<c.length;b++){a+=("0"+c.charCodeAt(b).toString(16)).slice(-2)}return a}function hextob64(a){return hex2b64(a)}function hextob64nl(b){var a=hextob64(b);var c=a.replace(/(.{64})/g,"$1\r\n");c=c.replace(/\r\n$/,"");return c}function b64nltohex(b){var a=b.replace(/[^0-9A-Za-z\/+=]*/g,"");var c=b64tohex(a);return c}function uricmptohex(a){return a.replace(/%/g,"")}function hextouricmp(a){return a.replace(/(..)/g,"%$1")}function encodeURIComponentAll(a){var d=encodeURIComponent(a);var b="";for(var c=0;c<d.length;c++){if(d[c]=="%"){b=b+d.substr(c,3);c=c+2}else{b=b+"%"+stohex(d[c])}}return b}function newline_toUnix(a){a=a.replace(/\r\n/mg,"\n");return a}function newline_toDos(a){a=a.replace(/\r\n/mg,"\n");a=a.replace(/\n/mg,"\r\n");return a};
|
||
/*! crypto-1.1.5.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.Util=new function(){this.DIGESTINFOHEAD={sha1:"3021300906052b0e03021a05000414",sha224:"302d300d06096086480165030402040500041c",sha256:"3031300d060960864801650304020105000420",sha384:"3041300d060960864801650304020205000430",sha512:"3051300d060960864801650304020305000440",md2:"3020300c06082a864886f70d020205000410",md5:"3020300c06082a864886f70d020505000410",ripemd160:"3021300906052b2403020105000414",};this.DEFAULTPROVIDER={md5:"cryptojs",sha1:"cryptojs",sha224:"cryptojs",sha256:"cryptojs",sha384:"cryptojs",sha512:"cryptojs",ripemd160:"cryptojs",hmacmd5:"cryptojs",hmacsha1:"cryptojs",hmacsha224:"cryptojs",hmacsha256:"cryptojs",hmacsha384:"cryptojs",hmacsha512:"cryptojs",hmacripemd160:"cryptojs",MD5withRSA:"cryptojs/jsrsa",SHA1withRSA:"cryptojs/jsrsa",SHA224withRSA:"cryptojs/jsrsa",SHA256withRSA:"cryptojs/jsrsa",SHA384withRSA:"cryptojs/jsrsa",SHA512withRSA:"cryptojs/jsrsa",RIPEMD160withRSA:"cryptojs/jsrsa",MD5withECDSA:"cryptojs/jsrsa",SHA1withECDSA:"cryptojs/jsrsa",SHA224withECDSA:"cryptojs/jsrsa",SHA256withECDSA:"cryptojs/jsrsa",SHA384withECDSA:"cryptojs/jsrsa",SHA512withECDSA:"cryptojs/jsrsa",RIPEMD160withECDSA:"cryptojs/jsrsa",SHA1withDSA:"cryptojs/jsrsa",SHA224withDSA:"cryptojs/jsrsa",SHA256withDSA:"cryptojs/jsrsa",MD5withRSAandMGF1:"cryptojs/jsrsa",SHA1withRSAandMGF1:"cryptojs/jsrsa",SHA224withRSAandMGF1:"cryptojs/jsrsa",SHA256withRSAandMGF1:"cryptojs/jsrsa",SHA384withRSAandMGF1:"cryptojs/jsrsa",SHA512withRSAandMGF1:"cryptojs/jsrsa",RIPEMD160withRSAandMGF1:"cryptojs/jsrsa",};this.CRYPTOJSMESSAGEDIGESTNAME={md5:"CryptoJS.algo.MD5",sha1:"CryptoJS.algo.SHA1",sha224:"CryptoJS.algo.SHA224",sha256:"CryptoJS.algo.SHA256",sha384:"CryptoJS.algo.SHA384",sha512:"CryptoJS.algo.SHA512",ripemd160:"CryptoJS.algo.RIPEMD160"};this.getDigestInfoHex=function(a,b){if(typeof this.DIGESTINFOHEAD[b]=="undefined"){throw"alg not supported in Util.DIGESTINFOHEAD: "+b}return this.DIGESTINFOHEAD[b]+a};this.getPaddedDigestInfoHex=function(h,a,j){var c=this.getDigestInfoHex(h,a);var d=j/4;if(c.length+22>d){throw"key is too short for SigAlg: keylen="+j+","+a}var b="0001";var k="00"+c;var g="";var l=d-b.length-k.length;for(var f=0;f<l;f+=2){g+="ff"}var e=b+g+k;return e};this.hashString=function(a,c){var b=new KJUR.crypto.MessageDigest({alg:c});return b.digestString(a)};this.hashHex=function(b,c){var a=new KJUR.crypto.MessageDigest({alg:c});return a.digestHex(b)};this.sha1=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha1",prov:"cryptojs"});return b.digestString(a)};this.sha256=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha256",prov:"cryptojs"});return b.digestString(a)};this.sha256Hex=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha256",prov:"cryptojs"});return b.digestHex(a)};this.sha512=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha512",prov:"cryptojs"});return b.digestString(a)};this.sha512Hex=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha512",prov:"cryptojs"});return b.digestHex(a)};this.md5=function(a){var b=new KJUR.crypto.MessageDigest({alg:"md5",prov:"cryptojs"});return b.digestString(a)};this.ripemd160=function(a){var b=new KJUR.crypto.MessageDigest({alg:"ripemd160",prov:"cryptojs"});return b.digestString(a)};this.getCryptoJSMDByName=function(a){}};KJUR.crypto.MessageDigest=function(params){var md=null;var algName=null;var provName=null;this.setAlgAndProvider=function(alg,prov){if(alg!=null&&prov===undefined){prov=KJUR.crypto.Util.DEFAULTPROVIDER[alg]}if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(alg)!=-1&&prov=="cryptojs"){try{this.md=eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[alg]).create()}catch(ex){throw"setAlgAndProvider hash alg set fail alg="+alg+"/"+ex}this.updateString=function(str){this.md.update(str)};this.updateHex=function(hex){var wHex=CryptoJS.enc.Hex.parse(hex);this.md.update(wHex)};this.digest=function(){var hash=this.md.finalize();return hash.toString(CryptoJS.enc.Hex)};this.digestString=function(str){this.updateString(str);return this.digest()};this.digestHex=function(hex){this.updateHex(hex);return this.digest()}}if(":sha256:".indexOf(alg)!=-1&&prov=="sjcl"){try{this.md=new sjcl.hash.sha256()}catch(ex){throw"setAlgAndProvider hash alg set fail alg="+alg+"/"+ex}this.updateString=function(str){this.md.update(str)};this.updateHex=function(hex){var baHex=sjcl.codec.hex.toBits(hex);this.md.update(baHex)};this.digest=function(){var hash=this.md.finalize();return sjcl.codec.hex.fromBits(hash)};this.digestString=function(str){this.updateString(str);return this.digest()};this.digestHex=function(hex){this.updateHex(hex);return this.digest()}}};this.updateString=function(str){throw"updateString(str) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.updateHex=function(hex){throw"updateHex(hex) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digest=function(){throw"digest() not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digestString=function(str){throw"digestString(str) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digestHex=function(hex){throw"digestHex(hex) not supported for this alg/prov: "+this.algName+"/"+this.provName};if(params!==undefined){if(params.alg!==undefined){this.algName=params.alg;if(params.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName,this.provName)}}};KJUR.crypto.Mac=function(params){var mac=null;var pass=null;var algName=null;var provName=null;var algProv=null;this.setAlgAndProvider=function(alg,prov){if(alg==null){alg="hmacsha1"}alg=alg.toLowerCase();if(alg.substr(0,4)!="hmac"){throw"setAlgAndProvider unsupported HMAC alg: "+alg}if(prov===undefined){prov=KJUR.crypto.Util.DEFAULTPROVIDER[alg]}this.algProv=alg+"/"+prov;var hashAlg=alg.substr(4);if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(hashAlg)!=-1&&prov=="cryptojs"){try{var mdObj=eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[hashAlg]);this.mac=CryptoJS.algo.HMAC.create(mdObj,this.pass)}catch(ex){throw"setAlgAndProvider hash alg set fail hashAlg="+hashAlg+"/"+ex}this.updateString=function(str){this.mac.update(str)};this.updateHex=function(hex){var wHex=CryptoJS.enc.Hex.parse(hex);this.mac.update(wHex)};this.doFinal=function(){var hash=this.mac.finalize();return hash.toString(CryptoJS.enc.Hex)};this.doFinalString=function(str){this.updateString(str);return this.doFinal()};this.doFinalHex=function(hex){this.updateHex(hex);return this.doFinal()}}};this.updateString=function(str){throw"updateString(str) not supported for this alg/prov: "+this.algProv};this.updateHex=function(hex){throw"updateHex(hex) not supported for this alg/prov: "+this.algProv};this.doFinal=function(){throw"digest() not supported for this alg/prov: "+this.algProv};this.doFinalString=function(str){throw"digestString(str) not supported for this alg/prov: "+this.algProv};this.doFinalHex=function(hex){throw"digestHex(hex) not supported for this alg/prov: "+this.algProv};if(params!==undefined){if(params.pass!==undefined){this.pass=params.pass}if(params.alg!==undefined){this.algName=params.alg;if(params.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName,this.provName)}}};KJUR.crypto.Signature=function(o){var q=null;var n=null;var r=null;var c=null;var l=null;var d=null;var k=null;var h=null;var p=null;var e=null;var b=-1;var g=null;var j=null;var a=null;var i=null;var f=null;this._setAlgNames=function(){if(this.algName.match(/^(.+)with(.+)$/)){this.mdAlgName=RegExp.$1.toLowerCase();this.pubkeyAlgName=RegExp.$2.toLowerCase()}};this._zeroPaddingOfSignature=function(x,w){var v="";var t=w/4-x.length;for(var u=0;u<t;u++){v=v+"0"}return v+x};this.setAlgAndProvider=function(u,t){this._setAlgNames();if(t!="cryptojs/jsrsa"){throw"provider not supported: "+t}if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName)!=-1){try{this.md=new KJUR.crypto.MessageDigest({alg:this.mdAlgName})}catch(s){throw"setAlgAndProvider hash alg set fail alg="+this.mdAlgName+"/"+s}this.init=function(w,x){var y=null;try{if(x===undefined){y=KEYUTIL.getKey(w)}else{y=KEYUTIL.getKey(w,x)}}catch(v){throw"init failed:"+v}if(y.isPrivate===true){this.prvKey=y;this.state="SIGN"}else{if(y.isPublic===true){this.pubKey=y;this.state="VERIFY"}else{throw"init failed.:"+y}}};this.initSign=function(v){if(typeof v.ecprvhex=="string"&&typeof v.eccurvename=="string"){this.ecprvhex=v.ecprvhex;this.eccurvename=v.eccurvename}else{this.prvKey=v}this.state="SIGN"};this.initVerifyByPublicKey=function(v){if(typeof v.ecpubhex=="string"&&typeof v.eccurvename=="string"){this.ecpubhex=v.ecpubhex;this.eccurvename=v.eccurvename}else{if(v instanceof KJUR.crypto.ECDSA){this.pubKey=v}else{if(v instanceof RSAKey){this.pubKey=v}}}this.state="VERIFY"};this.initVerifyByCertificatePEM=function(v){var w=new X509();w.readCertPEM(v);this.pubKey=w.subjectPublicKeyRSA;this.state="VERIFY"};this.updateString=function(v){this.md.updateString(v)};this.updateHex=function(v){this.md.updateHex(v)};this.sign=function(){this.sHashHex=this.md.digest();if(typeof this.ecprvhex!="undefined"&&typeof this.eccurvename!="undefined"){var v=new KJUR.crypto.ECDSA({curve:this.eccurvename});this.hSign=v.signHex(this.sHashHex,this.ecprvhex)}else{if(this.pubkeyAlgName=="rsaandmgf1"){this.hSign=this.prvKey.signWithMessageHashPSS(this.sHashHex,this.mdAlgName,this.pssSaltLen)}else{if(this.pubkeyAlgName=="rsa"){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex,this.mdAlgName)}else{if(this.prvKey instanceof KJUR.crypto.ECDSA){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex)}else{if(this.prvKey instanceof KJUR.crypto.DSA){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex)}else{throw"Signature: unsupported public key alg: "+this.pubkeyAlgName}}}}}return this.hSign};this.signString=function(v){this.updateString(v);this.sign()};this.signHex=function(v){this.updateHex(v);this.sign()};this.verify=function(v){this.sHashHex=this.md.digest();if(typeof this.ecpubhex!="undefined"&&typeof this.eccurvename!="undefined"){var w=new KJUR.crypto.ECDSA({curve:this.eccurvename});return w.verifyHex(this.sHashHex,v,this.ecpubhex)}else{if(this.pubkeyAlgName=="rsaandmgf1"){return this.pubKey.verifyWithMessageHashPSS(this.sHashHex,v,this.mdAlgName,this.pssSaltLen)}else{if(this.pubkeyAlgName=="rsa"){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{if(this.pubKey instanceof KJUR.crypto.ECDSA){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{if(this.pubKey instanceof KJUR.crypto.DSA){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{throw"Signature: unsupported public key alg: "+this.pubkeyAlgName}}}}}}}};this.init=function(s,t){throw"init(key, pass) not supported for this alg:prov="+this.algProvName};this.initVerifyByPublicKey=function(s){throw"initVerifyByPublicKey(rsaPubKeyy) not supported for this alg:prov="+this.algProvName};this.initVerifyByCertificatePEM=function(s){throw"initVerifyByCertificatePEM(certPEM) not supported for this alg:prov="+this.algProvName};this.initSign=function(s){throw"initSign(prvKey) not supported for this alg:prov="+this.algProvName};this.updateString=function(s){throw"updateString(str) not supported for this alg:prov="+this.algProvName};this.updateHex=function(s){throw"updateHex(hex) not supported for this alg:prov="+this.algProvName};this.sign=function(){throw"sign() not supported for this alg:prov="+this.algProvName};this.signString=function(s){throw"digestString(str) not supported for this alg:prov="+this.algProvName};this.signHex=function(s){throw"digestHex(hex) not supported for this alg:prov="+this.algProvName};this.verify=function(s){throw"verify(hSigVal) not supported for this alg:prov="+this.algProvName};this.initParams=o;if(o!==undefined){if(o.alg!==undefined){this.algName=o.alg;if(o.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}else{this.provName=o.prov}this.algProvName=this.algName+":"+this.provName;this.setAlgAndProvider(this.algName,this.provName);this._setAlgNames()}if(o.psssaltlen!==undefined){this.pssSaltLen=o.psssaltlen}if(o.prvkeypem!==undefined){if(o.prvkeypas!==undefined){throw"both prvkeypem and prvkeypas parameters not supported"}else{try{var q=new RSAKey();q.readPrivateKeyFromPEMString(o.prvkeypem);this.initSign(q)}catch(m){throw"fatal error to load pem private key: "+m}}}}};KJUR.crypto.OID=new function(){this.oidhex2name={"2a864886f70d010101":"rsaEncryption","2a8648ce3d0201":"ecPublicKey","2a8648ce380401":"dsa","2a8648ce3d030107":"secp256r1","2b8104001f":"secp192k1","2b81040021":"secp224r1","2b8104000a":"secp256k1","2b81040023":"secp521r1","2b81040022":"secp384r1","2a8648ce380403":"SHA1withDSA","608648016503040301":"SHA224withDSA","608648016503040302":"SHA256withDSA",}};
|
||
/*! ecdsa-modified-1.0.4.js (c) Stephan Thomas, Kenji Urushima | github.com/bitcoinjs/bitcoinjs-lib/blob/master/LICENSE
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECDSA=function(h){var e="secp256r1";var g=null;var b=null;var f=null;var a=new SecureRandom();var d=null;this.type="EC";function c(s,o,r,n){var j=Math.max(o.bitLength(),n.bitLength());var t=s.add2D(r);var q=s.curve.getInfinity();for(var p=j-1;p>=0;--p){q=q.twice2D();q.z=BigInteger.ONE;if(o.testBit(p)){if(n.testBit(p)){q=q.add2D(t)}else{q=q.add2D(s)}}else{if(n.testBit(p)){q=q.add2D(r)}}}return q}this.getBigRandom=function(i){return new BigInteger(i.bitLength(),a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)};this.setNamedCurve=function(i){this.ecparams=KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex=null;this.pubKeyHex=null;this.curveName=i};this.setPrivateKeyHex=function(i){this.isPrivate=true;this.prvKeyHex=i};this.setPublicKeyHex=function(i){this.isPublic=true;this.pubKeyHex=i};this.generateKeyPairHex=function(){var k=this.ecparams.n;var n=this.getBigRandom(k);var l=this.ecparams.G.multiply(n);var q=l.getX().toBigInteger();var o=l.getY().toBigInteger();var i=this.ecparams.keylen/4;var m=("0000000000"+n.toString(16)).slice(-i);var r=("0000000000"+q.toString(16)).slice(-i);var p=("0000000000"+o.toString(16)).slice(-i);var j="04"+r+p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return{ecprvhex:m,ecpubhex:j}};this.signWithMessageHash=function(i){return this.signHex(i,this.prvKeyHex)};this.signHex=function(o,j){var t=new BigInteger(j,16);var l=this.ecparams.n;var q=new BigInteger(o,16);do{var m=this.getBigRandom(l);var u=this.ecparams.G;var p=u.multiply(m);var i=p.getX().toBigInteger().mod(l)}while(i.compareTo(BigInteger.ZERO)<=0);var v=m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i,v)};this.sign=function(m,u){var q=u;var j=this.ecparams.n;var p=BigInteger.fromByteArrayUnsigned(m);do{var l=this.getBigRandom(j);var t=this.ecparams.G;var o=t.multiply(l);var i=o.getX().toBigInteger().mod(j)}while(i.compareTo(BigInteger.ZERO)<=0);var v=l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i,v)};this.verifyWithMessageHash=function(j,i){return this.verifyHex(j,i,this.pubKeyHex)};this.verifyHex=function(m,i,p){var l,j;var o=KJUR.crypto.ECDSA.parseSigHex(i);l=o.r;j=o.s;var k;k=ECPointFp.decodeFromHex(this.ecparams.curve,p);var n=new BigInteger(m,16);return this.verifyRaw(n,l,j,k)};this.verify=function(o,p,j){var l,i;if(Bitcoin.Util.isArray(p)){var n=this.parseSig(p);l=n.r;i=n.s}else{if("object"===typeof p&&p.r&&p.s){l=p.r;i=p.s}else{throw"Invalid value for signature"}}var k;if(j instanceof ECPointFp){k=j}else{if(Bitcoin.Util.isArray(j)){k=ECPointFp.decodeFrom(this.ecparams.curve,j)}else{throw"Invalid format for pubkey value, must be byte array or ECPointFp"}}var m=BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m,l,i,k)};this.verifyRaw=function(o,i,w,m){var l=this.ecparams.n;var u=this.ecparams.G;if(i.compareTo(BigInteger.ONE)<0||i.compareTo(l)>=0){return false}if(w.compareTo(BigInteger.ONE)<0||w.compareTo(l)>=0){return false}var p=w.modInverse(l);var k=o.multiply(p).mod(l);var j=i.multiply(p).mod(l);var q=u.multiply(k).add(m.multiply(j));var t=q.getX().toBigInteger().mod(l);return t.equals(i)};this.serializeSig=function(k,j){var l=k.toByteArraySigned();var i=j.toByteArraySigned();var m=[];m.push(2);m.push(l.length);m=m.concat(l);m.push(2);m.push(i.length);m=m.concat(i);m.unshift(m.length);m.unshift(48);return m};this.parseSig=function(n){var m;if(n[0]!=48){throw new Error("Signature not a valid DERSequence")}m=2;if(n[m]!=2){throw new Error("First element in signature must be a DERInteger")}var l=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];if(n[m]!=2){throw new Error("Second element in signature must be a DERInteger")}var i=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];var k=BigInteger.fromByteArrayUnsigned(l);var j=BigInteger.fromByteArrayUnsigned(i);return{r:k,s:j}};this.parseSigCompact=function(m){if(m.length!==65){throw"Signature has the wrong length"}var j=m[0]-27;if(j<0||j>7){throw"Invalid signature type"}var o=this.ecparams.n;var l=BigInteger.fromByteArrayUnsigned(m.slice(1,33)).mod(o);var k=BigInteger.fromByteArrayUnsigned(m.slice(33,65)).mod(o);return{r:l,s:k,i:j}};if(h!==undefined){if(h.curve!==undefined){this.curveName=h.curve}}if(this.curveName===undefined){this.curveName=e}this.setNamedCurve(this.curveName);if(h!==undefined){if(h.prv!==undefined){this.setPrivateKeyHex(h.prv)}if(h.pub!==undefined){this.setPublicKeyHex(h.pub)}}};KJUR.crypto.ECDSA.parseSigHex=function(a){var b=KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d=new BigInteger(b.r,16);var c=new BigInteger(b.s,16);return{r:d,s:c}};KJUR.crypto.ECDSA.parseSigHexInHexRS=function(c){if(c.substr(0,2)!="30"){throw"signature is not a ASN.1 sequence"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);if(b.length!=2){throw"number of signature ASN.1 sequence elements seem wrong"}var g=b[0];var f=b[1];if(c.substr(g,2)!="02"){throw"1st item of sequene of signature is not ASN.1 integer"}if(c.substr(f,2)!="02"){throw"2nd item of sequene of signature is not ASN.1 integer"}var e=ASN1HEX.getHexOfV_AtObj(c,g);var d=ASN1HEX.getHexOfV_AtObj(c,f);return{r:e,s:d}};KJUR.crypto.ECDSA.asn1SigToConcatSig=function(c){var d=KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b=d.r;var a=d.s;if(b.substr(0,2)=="00"&&(((b.length/2)*8)%(16*8))==8){b=b.substr(2)}if(a.substr(0,2)=="00"&&(((a.length/2)*8)%(16*8))==8){a=a.substr(2)}if((((b.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig r length error"}if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig s length error"}return b+a};KJUR.crypto.ECDSA.concatSigToASN1Sig=function(a){if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA concatinated r-s sig length error"}var c=a.substr(0,a.length/2);var b=a.substr(a.length/2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c,b)};KJUR.crypto.ECDSA.hexRSSigToASN1Sig=function(b,a){var d=new BigInteger(b,16);var c=new BigInteger(a,16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d,c)};KJUR.crypto.ECDSA.biRSSigToASN1Sig=function(e,c){var b=new KJUR.asn1.DERInteger({bigint:e});var a=new KJUR.asn1.DERInteger({bigint:c});var d=new KJUR.asn1.DERSequence({array:[b,a]});return d.getEncodedHex()};
|
||
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECParameterDB=new function(){var b={};var c={};function a(d){return new BigInteger(d,16)}this.getByName=function(e){var d=e;if(typeof c[d]!="undefined"){d=c[e]}if(typeof b[d]!="undefined"){return b[d]}throw"unregistered EC curve name: "+d};this.regist=function(A,l,o,g,m,e,j,f,k,u,d,x){b[A]={};var s=a(o);var z=a(g);var y=a(m);var t=a(e);var w=a(j);var r=new ECCurveFp(s,z,y);var q=r.decodePointHex("04"+f+k);b[A]["name"]=A;b[A]["keylen"]=l;b[A]["curve"]=r;b[A]["G"]=q;b[A]["n"]=t;b[A]["h"]=w;b[A]["oid"]=d;b[A]["info"]=x;for(var v=0;v<u.length;v++){c[u[v]]=A}}};KJUR.crypto.ECParameterDB.regist("secp128r1",128,"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF","FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC","E87579C11079F43DD824993C2CEE5ED3","FFFFFFFE0000000075A30D1B9038A115","1","161FF7528B899B2D0C28607CA52C5B86","CF5AC8395BAFEB13C02DA292DDED7A83",[],"","secp128r1 : SECG curve over a 128 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160k1",160,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73","0","7","0100000000000000000001B8FA16DFAB9ACA16B6B3","1","3B4C382CE37AA192A4019E763036F4F5DD4D7EBB","938CF935318FDCED6BC28286531733C3F03C4FEE",[],"","secp160k1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160r1",160,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC","1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45","0100000000000000000001F4C8F927AED3CA752257","1","4A96B5688EF573284664698968C38BB913CBFC82","23A628553168947D59DCC912042351377AC5FB32",[],"","secp160r1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp192k1",192,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37","0","3","FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D","1","DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D","9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",[]);KJUR.crypto.ECParameterDB.regist("secp192r1",192,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC","64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1","FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831","1","188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012","07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",[]);KJUR.crypto.ECParameterDB.regist("secp224r1",224,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE","B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4","FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D","1","B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21","BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",[]);KJUR.crypto.ECParameterDB.regist("secp256k1",256,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F","0","7","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141","1","79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798","483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",[]);KJUR.crypto.ECParameterDB.regist("secp256r1",256,"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF","FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC","5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B","FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551","1","6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296","4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",["NIST P-256","P-256","prime256v1"]);KJUR.crypto.ECParameterDB.regist("secp384r1",384,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC","B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973","1","AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7","3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",["NIST P-384","P-384"]);KJUR.crypto.ECParameterDB.regist("secp521r1",521,"1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF","1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC","051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00","1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409","1","C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66","011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",["NIST P-521","P-521"]);
|
||
/*! dsa-modified-1.0.1.js (c) Recurity Labs GmbH, Kenji Urushimma | github.com/openpgpjs/openpgpjs/blob/master/LICENSE
|
||
*/
|
||
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.DSA=function(){this.p=null;this.q=null;this.g=null;this.y=null;this.x=null;this.type="DSA";this.setPrivate=function(z,w,v,A,u){this.isPrivate=true;this.p=z;this.q=w;this.g=v;this.y=A;this.x=u};this.setPublic=function(w,v,u,z){this.isPublic=true;this.p=w;this.q=v;this.g=u;this.y=z;this.x=null};this.signWithMessageHash=function(z){var v=this.p;var u=this.q;var C=this.g;var D=this.y;var E=this.x;var A=z.substr(0,u.bitLength()/4);var B=new BigInteger(z,16);var w=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var G=(C.modPow(w,v)).mod(u);var F=(w.modInverse(u).multiply(B.add(E.multiply(G)))).mod(u);var H=KJUR.asn1.ASN1Util.jsonToASN1HEX({seq:[{"int":{bigint:G}},{"int":{bigint:F}}]});return H};this.verifyWithMessageHash=function(C,B){var z=this.p;var u=this.q;var G=this.g;var H=this.y;var E=this.parseASN1Signature(B);var K=E[0];var J=E[1];var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v<w;v++){u+=String.fromCharCode(b())}return u}function b(){var u=new Uint32Array(1);window.crypto.getRandomValues(u);return u[0]&255}function f(y){if(y==null){return""}var v=[];var w=y.length;var z=0;var u;while(z<w){u=y[z++].charCodeAt().toString(16);while(u.length<2){u="0"+u}v.push(""+u)}return v.join("")}this.getRandomBigIntegerInRange=n;this.getRandomBigInteger=e;this.getRandomBytes=c};
|
||
/*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
var PKCS5PKEY=function(){var c=function(n,p,o){return i(CryptoJS.AES,n,p,o)};var d=function(n,p,o){return i(CryptoJS.TripleDES,n,p,o)};var i=function(q,v,s,o){var p=CryptoJS.enc.Hex.parse(v);var u=CryptoJS.enc.Hex.parse(s);var n=CryptoJS.enc.Hex.parse(o);var r={};r.key=u;r.iv=n;r.ciphertext=p;var t=q.decrypt(r,u,{iv:n});return CryptoJS.enc.Hex.stringify(t)};var j=function(n,p,o){return e(CryptoJS.AES,n,p,o)};var m=function(n,p,o){return e(CryptoJS.TripleDES,n,p,o)};var e=function(s,x,v,p){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(v);var o=CryptoJS.enc.Hex.parse(p);var n={};var u=s.encrypt(r,w,{iv:o});var q=CryptoJS.enc.Hex.parse(u.toString());var t=CryptoJS.enc.Base64.stringify(q);return t};var g={"AES-256-CBC":{proc:c,eproc:j,keylen:32,ivlen:16},"AES-192-CBC":{proc:c,eproc:j,keylen:24,ivlen:16},"AES-128-CBC":{proc:c,eproc:j,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:d,eproc:m,keylen:24,ivlen:8}};var b=function(n){return g[n]["proc"]};var k=function(n){var p=CryptoJS.lib.WordArray.random(n);var o=CryptoJS.enc.Hex.stringify(p);return o};var l=function(q){var r={};if(q.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){r.cipher=RegExp.$1;r.ivsalt=RegExp.$2}if(q.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){r.type=RegExp.$1}var p=-1;var t=0;if(q.indexOf("\r\n\r\n")!=-1){p=q.indexOf("\r\n\r\n");t=2}if(q.indexOf("\n\n")!=-1){p=q.indexOf("\n\n");t=1}var o=q.indexOf("-----END");if(p!=-1&&o!=-1){var n=q.substring(p+t*2,o-t);n=n.replace(/\s+/g,"");r.data=n}return r};var h=function(o,w,n){var t=n.substring(0,16);var r=CryptoJS.enc.Hex.parse(t);var p=CryptoJS.enc.Utf8.parse(w);var s=g[o]["keylen"]+g[o]["ivlen"];var v="";var u=null;for(;;){var q=CryptoJS.algo.MD5.create();if(u!=null){q.update(u)}q.update(p);q.update(r);u=q.finalize();v=v+CryptoJS.enc.Hex.stringify(u);if(v.length>=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}();
|
||
/*! keyutil-1.0.7.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(s,x,u,q){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(u);var p=CryptoJS.enc.Hex.parse(q);var t={};t.key=w;t.iv=p;t.ciphertext=r;var v=s.decrypt(t,w,{iv:p});return CryptoJS.enc.Hex.stringify(v)};var l=function(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(t,y,v,q){var s=CryptoJS.enc.Hex.parse(y);var x=CryptoJS.enc.Hex.parse(v);var p=CryptoJS.enc.Hex.parse(q);var w=t.encrypt(s,x,{iv:p});var r=CryptoJS.enc.Hex.parse(w.toString());var u=CryptoJS.enc.Base64.stringify(r);return u};var i={"AES-256-CBC":{proc:d,eproc:l,keylen:32,ivlen:16},"AES-192-CBC":{proc:d,eproc:l,keylen:24,ivlen:16},"AES-128-CBC":{proc:d,eproc:l,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:o,keylen:24,ivlen:8},"DES-CBC":{proc:a,eproc:f,keylen:8,ivlen:8}};var c=function(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(q,y,p){var v=p.substring(0,16);var t=CryptoJS.enc.Hex.parse(v);var r=CryptoJS.enc.Utf8.parse(y);var u=i[q]["keylen"]+i[q]["ivlen"];var x="";var w=null;for(;;){var s=CryptoJS.algo.MD5.create();if(w!=null){s.update(w)}s.update(r);s.update(t);w=s.finalize();x=x+CryptoJS.enc.Hex.stringify(w);if(x.length>=u*2){break}}var z={};z.keyhex=x.substr(0,i[q]["keylen"]*2);z.ivhex=x.substr(i[q]["keylen"]*2,i[q]["ivlen"]*2);return z};var b=function(p,v,r,w){var s=CryptoJS.enc.Base64.parse(p);var q=CryptoJS.enc.Hex.stringify(s);var u=i[v]["proc"];var t=u(q,r,w);return t};var h=function(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(y,x){var q=n(y);var t=q.type;var r=q.cipher;var p=q.ivsalt;var s=q.data;var w=j(r,x,p);var v=w.keyhex;var u=b(s,r,v,p);return u},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(x,s,A,t,r){var p="";if(typeof t=="undefined"||t==null){t="AES-256-CBC"}if(typeof i[t]=="undefined"){throw"KEYUTIL unsupported algorithm: "+t}if(typeof r=="undefined"||r==null){var v=i[t]["ivlen"];var u=m(v);r=u.toUpperCase()}var z=j(t,A,r);var y=z.keyhex;var w=h(s,t,y,r);var q=w.replace(/(.{64})/g,"$1\r\n");var p="-----BEGIN "+x+" PRIVATE KEY-----\r\n";p+="Proc-Type: 4,ENCRYPTED\r\n";p+="DEK-Info: "+t+","+r+"\r\n";p+="\r\n";p+=q;p+="\r\n-----END "+x+" PRIVATE KEY-----\r\n";return p},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(u,p){var t=CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q=u.pbkdf2Iter;var s=CryptoJS.PBKDF2(p,t,{keySize:192/32,iterations:q});var r=CryptoJS.enc.Hex.stringify(s);return r},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(x,y){var r=this.getHexFromPEM(x,"ENCRYPTED PRIVATE KEY");var p=this.parseHexOfEncryptedPKCS8(r);var u=KEYUTIL.getPBKDF2KeyHexFromParam(p,y);var v={};v.ciphertext=CryptoJS.enc.Hex.parse(p.ciphertext);var t=CryptoJS.enc.Hex.parse(u);var s=CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w=CryptoJS.TripleDES.decrypt(v,t,{iv:s});var q=CryptoJS.enc.Hex.stringify(w);return q},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(s.substr(r[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,r[1]);if(p.length!=2){throw"malformed PKCS8 private key(code:004)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"malformed RSA key(code:002)"}if(r.substr(q[0],2)!="02"){throw"malformed RSA key(code:003)"}p.n=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(c,o,i){if(typeof RSAKey!="undefined"&&c instanceof RSAKey){return c}if(typeof KJUR.crypto.ECDSA!="undefined"&&c instanceof KJUR.crypto.ECDSA){return c}if(typeof KJUR.crypto.DSA!="undefined"&&c instanceof KJUR.crypto.DSA){return c}if(c.xy!==undefined&&c.curve!==undefined){return new KJUR.crypto.ECDSA({prv:c.xy,curve:c.curve})}if(c.n!==undefined&&c.e!==undefined&&c.d!==undefined&&c.p!==undefined&&c.q!==undefined&&c.dp!==undefined&&c.dq!==undefined&&c.co!==undefined){var n=new RSAKey();n.setPrivateEx(c.n,c.e,c.d,c.p,c.q,c.dp,c.dq,c.co);return n}if(c.p!==undefined&&c.q!==undefined&&c.g!==undefined&&c.y!==undefined&&c.x!==undefined){var n=new KJUR.crypto.DSA();n.setPrivate(c.p,c.q,c.g,c.y,c.x);return n}if(c.d!==undefined&&c.curve!==undefined){return new KJUR.crypto.ECDSA({pub:c.d,curve:c.curve})}if(c.n!==undefined&&c.e){var n=new RSAKey();n.setPublic(c.n,c.e);return n}if(c.p!==undefined&&c.q!==undefined&&c.g!==undefined&&c.y!==undefined&&c.x===undefined){var n=new KJUR.crypto.DSA();n.setPublic(c.p,c.q,c.g,c.y);return n}if(c.indexOf("-END CERTIFICATE-",0)!=-1||c.indexOf("-END X509 CERTIFICATE-",0)!=-1||c.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(c)}if(i==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(c)}if(c.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(c)}if(i==="pkcs5prv"){var n=new RSAKey();n.readPrivateKeyFromASN1HexString(c);return n}if(i==="pkcs5prv"){var n=new RSAKey();n.readPrivateKeyFromASN1HexString(c);return n}if(c.indexOf("-END RSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")==-1){var n=new RSAKey();n.readPrivateKeyFromPEMString(c);return n}if(c.indexOf("-END DSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")==-1){var m=this.getHexFromPEM(c,"DSA PRIVATE KEY");var b=ASN1HEX.getVbyList(m,0,[1],"02");var a=ASN1HEX.getVbyList(m,0,[2],"02");var e=ASN1HEX.getVbyList(m,0,[3],"02");var k=ASN1HEX.getVbyList(m,0,[4],"02");var l=ASN1HEX.getVbyList(m,0,[5],"02");var n=new KJUR.crypto.DSA();n.setPrivate(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(e,16),new BigInteger(k,16),new BigInteger(l,16));return n}if(c.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(c)}if(c.indexOf("-END RSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(c,o)}if(c.indexOf("-END EC PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){var m=KEYUTIL.getDecryptedKeyHex(c,o);var n=ASN1HEX.getVbyList(m,0,[1],"04");var j=ASN1HEX.getVbyList(m,0,[2,0],"06");var d=ASN1HEX.getVbyList(m,0,[3,0],"03").substr(2);var h="";if(KJUR.crypto.OID.oidhex2name[j]!==undefined){h=KJUR.crypto.OID.oidhex2name[j]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+j}var f=new KJUR.crypto.ECDSA({name:h});f.setPublicKeyHex(d);f.setPrivateKeyHex(n);f.isPublic=false;return f}if(c.indexOf("-END DSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){var m=KEYUTIL.getDecryptedKeyHex(c,o);var b=ASN1HEX.getVbyList(m,0,[1],"02");var a=ASN1HEX.getVbyList(m,0,[2],"02");var e=ASN1HEX.getVbyList(m,0,[3],"02");var k=ASN1HEX.getVbyList(m,0,[4],"02");var l=ASN1HEX.getVbyList(m,0,[5],"02");var n=new KJUR.crypto.DSA();n.setPrivate(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(e,16),new BigInteger(k,16),new BigInteger(l,16));return n}if(c.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(c,o)}throw"not supported argument"};KEYUTIL.generateKeypair=function(a,c){if(a=="RSA"){var b=c;var h=new RSAKey();h.generate(b,"10001");h.isPrivate=true;h.isPublic=true;var f=new RSAKey();var e=h.n.toString(16);var i=h.e.toString(16);f.setPublic(e,i);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{if(a=="EC"){var d=c;var g=new KJUR.crypto.ECDSA({curve:d});var j=g.generateKeyPairHex();var h=new KJUR.crypto.ECDSA({curve:d});h.setPrivateKeyHex(j.ecprvhex);h.isPrivate=true;h.isPublic=false;var f=new KJUR.crypto.ECDSA({curve:d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{throw"unknown algorithm: "+a}}};KEYUTIL.getPEM=function(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.n}},{"int":s.e},{"int":{bigint:s.d}},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.dmp1}},{"int":{bigint:s.dmq1}},{"int":{bigint:s.coeff}}]});return w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(b,"CERTIFICATE REQUEST");var c=KEYUTIL.getKeyFromCSRHex(a);return c};KEYUTIL.getKeyFromCSRHex=function(a){var c=KEYUTIL.parseCSRHex(a);var b=KEYUTIL.getKey(c.p8pubkeyhex,null,"pkcs8pub");return b};KEYUTIL.parseCSRHex=function(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,a[2]);return b};
|
||
/*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString;
|
||
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(f){return KJUR.crypto.Util.hashString(f,a)};var c=b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c,a,e)}function _zeroPaddingOfSignature(e,d){var c="";var a=d/4-e.length;for(var b=0;b<a;b++){c=c+"0"}return c+e}function _rsasign_signString(d,a){var b=function(e){return KJUR.crypto.Util.hashString(e,a)};var c=b(d);return this.signWithMessageHash(c,a)}function _rsasign_signWithMessageHash(e,c){var f=KJUR.crypto.Util.getPaddedDigestInfoHex(e,c,this.n.bitLength());var b=parseBigInt(f,16);var d=this.doPrivate(b);var a=d.toString(16);return _zeroPaddingOfSignature(a,this.n.bitLength())}function _rsasign_signStringWithSHA1(a){return _rsasign_signString.call(this,a,"sha1")}function _rsasign_signStringWithSHA256(a){return _rsasign_signString.call(this,a,"sha256")}function pss_mgf1_str(c,a,e){var b="",d=0;while(b.length<a){b+=hextorstr(e(rstrtohex(c+String.fromCharCode.apply(String,[(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(l,a,k){var b=hextorstr(l);var g=b.length;var m=this.n.bitLength()-1;var c=Math.ceil(m/8);var d;var o=function(i){return KJUR.crypto.Util.hashHex(i,a)};if(k===-1||k===undefined){k=g}else{if(k===-2){k=c-g-2}else{if(k<-2){throw"invalid salt length"}}}if(c<(g+k+2)){throw"data too long"}var f="";if(k>0){f=new Array(k);new SecureRandom().nextBytes(f);f=String.fromCharCode.apply(String,f)}var n=hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+b+f)));var j=[];for(d=0;d<c-k-g-2;d+=1){j[d]=0}var e=String.fromCharCode.apply(String,j)+"\x01"+f;var h=pss_mgf1_str(n,e.length,o);var q=[];for(d=0;d<e.length;d+=1){q[d]=e.charCodeAt(d)^h.charCodeAt(d)}var p=(65280>>(8*c-m))&255;q[0]&=~p;for(d=0;d<g;d++){q.push(n.charCodeAt(d))}q.push(188);return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16),this.n.bitLength())}function _rsasign_getDecryptSignatureBI(a,d,c){var b=new RSAKey();b.setPublic(d,c);var e=b.doPublic(a);return e}function _rsasign_getHexDigestInfoFromSig(a,c,b){var e=_rsasign_getDecryptSignatureBI(a,c,b);var d=e.toString(16).replace(/^1f+00/,"");return d}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f){for(var e in KJUR.crypto.Util.DIGESTINFOHEAD){var d=KJUR.crypto.Util.DIGESTINFOHEAD[e];var b=d.length;if(f.substring(0,b)==d){var c=[e,f.substring(b)];return c}}return[]}function _rsasign_verifySignatureWithArgs(f,b,g,j){var e=_rsasign_getHexDigestInfoFromSig(b,g,j);var h=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(h.length==0){return false}var d=h[0];var i=h[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(i==c)}function _rsasign_verifyHexSignatureForMessage(c,b){var d=parseBigInt(c,16);var a=_rsasign_verifySignatureWithArgs(b,d,this.n.toString(16),this.e.toString(16));return a}function _rsasign_verifyString(f,j){j=j.replace(_RE_HEXDECONLY,"");j=j.replace(/[ \n]+/g,"");var b=parseBigInt(j,16);if(b.bitLength()>this.n.bitLength()){return 0}var i=this.doPublic(b);var e=i.toString(16).replace(/^1f+00/,"");var g=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(g.length==0){return false}var d=g[0];var h=g[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(e,a){a=a.replace(_RE_HEXDECONLY,"");a=a.replace(/[ \n]+/g,"");var b=parseBigInt(a,16);if(b.bitLength()>this.n.bitLength()){return 0}var h=this.doPublic(b);var g=h.toString(16).replace(/^1f+00/,"");var c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if(c.length==0){return false}var d=c[0];var f=c[1];return(f==e)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(g){return KJUR.crypto.Util.hashHex(g,a)};var d=e(rstrtohex(c));if(f===undefined){f=-1}return this.verifyWithMessageHashPSS(d,b,a,f)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(i){return KJUR.crypto.Util.hashHex(i,l)};var j=hextorstr(f);var h=j.length;var g=this.n.bitLength()-1;var m=Math.ceil(g/8);var q;if(c===-1||c===undefined){c=h}else{if(c===-2){c=m-h-2}else{if(c<-2){throw"invalid salt length"}}}if(m<(h+c+2)){throw"data too long"}var a=this.doPublic(k).toByteArray();for(q=0;q<a.length;q+=1){a[q]&=255}while(a.length<m){a.unshift(0)}if(a[m-1]!==188){throw"encoded message does not end in 0xbc"}a=String.fromCharCode.apply(String,a);var d=a.substr(0,m-h-1);var e=a.substr(d.length,h);var p=(65280>>(8*m-g))&255;if((d.charCodeAt(0)&p)!==0){throw"bits beyond keysize not zero"}var n=pss_mgf1_str(e,d.length,r);var o=[];for(q=0;q<d.length;q+=1){o[q]=d.charCodeAt(q)^n.charCodeAt(q)}o[0]&=~p;var b=m-h-c-2;for(q=0;q<b;q+=1){if(o[q]!==0){throw"leftmost octets not zero"}}if(o[b]!==1){throw"0x01 marker not found"}return e===hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+j+String.fromCharCode.apply(String,o.slice(-c)))))}RSAKey.prototype.signWithMessageHash=_rsasign_signWithMessageHash;RSAKey.prototype.signString=_rsasign_signString;RSAKey.prototype.signStringWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signStringWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.sign=_rsasign_signString;RSAKey.prototype.signWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.signWithMessageHashPSS=_rsasign_signWithMessageHashPSS;RSAKey.prototype.signStringPSS=_rsasign_signStringPSS;RSAKey.prototype.signPSS=_rsasign_signStringPSS;RSAKey.SALT_LEN_HLEN=-1;RSAKey.SALT_LEN_MAX=-2;RSAKey.prototype.verifyWithMessageHash=_rsasign_verifyWithMessageHash;RSAKey.prototype.verifyString=_rsasign_verifyString;RSAKey.prototype.verifyHexSignatureForMessage=_rsasign_verifyHexSignatureForMessage;RSAKey.prototype.verify=_rsasign_verifyString;RSAKey.prototype.verifyHexSignatureForByteArrayMessage=_rsasign_verifyHexSignatureForMessage;RSAKey.prototype.verifyWithMessageHashPSS=_rsasign_verifyWithMessageHashPSS;RSAKey.prototype.verifyStringPSS=_rsasign_verifyStringPSS;RSAKey.prototype.verifyPSS=_rsasign_verifyStringPSS;RSAKey.SALT_LEN_RECOVER=-2;
|
||
/*! x509-1.1.3.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
*/
|
||
function X509(){this.subjectPublicKeyRSA=null;this.subjectPublicKeyRSA_hN=null;this.subjectPublicKeyRSA_hE=null;this.hex=null;this.getSerialNumberHex=function(){return ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,1])};this.getIssuerHex=function(){return ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,3])};this.getIssuerString=function(){return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,3]))};this.getSubjectHex=function(){return ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,5])};this.getSubjectString=function(){return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,5]))};this.getNotBefore=function(){var a=ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,4,0]);a=a.replace(/(..)/g,"%$1");a=decodeURIComponent(a);return a};this.getNotAfter=function(){var a=ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,4,1]);a=a.replace(/(..)/g,"%$1");a=decodeURIComponent(a);return a};this.readCertPEM=function(c){var e=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(e);var d=new RSAKey();d.setPublic(b[0],b[1]);this.subjectPublicKeyRSA=d;this.subjectPublicKeyRSA_hN=b[0];this.subjectPublicKeyRSA_hE=b[1];this.hex=e};this.readCertPEMWithoutRSAInit=function(c){var d=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(d);this.subjectPublicKeyRSA.setPublic(b[0],b[1]);this.subjectPublicKeyRSA_hN=b[0];this.subjectPublicKeyRSA_hE=b[1];this.hex=d}}X509.pemToBase64=function(a){var b=a;b=b.replace("-----BEGIN CERTIFICATE-----","");b=b.replace("-----END CERTIFICATE-----","");b=b.replace(/[ \n]+/g,"");return b};X509.pemToHex=function(a){var c=X509.pemToBase64(a);var b=b64tohex(c);return b};X509.getSubjectPublicKeyPosFromCertHex=function(f){var e=X509.getSubjectPublicKeyInfoPosFromCertHex(f);if(e==-1){return -1}var b=ASN1HEX.getPosArrayOfChildren_AtObj(f,e);if(b.length!=2){return -1}var d=b[1];if(f.substring(d,d+2)!="03"){return -1}var c=ASN1HEX.getStartPosOfV_AtObj(f,d);if(f.substring(c,c+2)!="00"){return -1}return c+2};X509.getSubjectPublicKeyInfoPosFromCertHex=function(d){var c=ASN1HEX.getStartPosOfV_AtObj(d,0);var b=ASN1HEX.getPosArrayOfChildren_AtObj(d,c);if(b.length<1){return -1}if(d.substring(b[0],b[0]+10)=="a003020102"){if(b.length<6){return -1}return b[6]}else{if(b.length<5){return -1}return b[5]}};X509.getPublicKeyHexArrayFromCertHex=function(f){var e=X509.getSubjectPublicKeyPosFromCertHex(f);var b=ASN1HEX.getPosArrayOfChildren_AtObj(f,e);if(b.length!=2){return[]}var d=ASN1HEX.getHexOfV_AtObj(f,b[0]);var c=ASN1HEX.getHexOfV_AtObj(f,b[1]);if(d!=null&&c!=null){return[d,c]}else{return[]}};X509.getHexTbsCertificateFromCert=function(b){var a=ASN1HEX.getStartPosOfV_AtObj(b,0);return a};X509.getPublicKeyHexArrayFromCertPEM=function(c){var d=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(d);return b};X509.hex2dn=function(e){var f="";var c=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);for(var d=0;d<c.length;d++){var b=ASN1HEX.getHexOfTLV_AtObj(e,c[d]);f=f+"/"+X509.hex2rdn(b)}return f};X509.hex2rdn=function(a){var f=ASN1HEX.getDecendantHexTLVByNthList(a,0,[0,0]);var e=ASN1HEX.getDecendantHexVByNthList(a,0,[0,1]);var c="";try{c=X509.DN_ATTRHEX[f]}catch(b){c=f}e=e.replace(/(..)/g,"%$1");var d=decodeURIComponent(e);return c+"="+d};X509.DN_ATTRHEX={"0603550406":"C","060355040a":"O","060355040b":"OU","0603550403":"CN","0603550405":"SN","0603550408":"ST","0603550407":"L",};X509.getPublicKeyFromCertPEM=function(f){var c=X509.getPublicKeyInfoPropOfCertPEM(f);if(c.algoid=="2a864886f70d010101"){var i=KEYUTIL.parsePublicRawRSAKeyHex(c.keyhex);var j=new RSAKey();j.setPublic(i.n,i.e);return j}else{if(c.algoid=="2a8648ce3d0201"){var e=KJUR.crypto.OID.oidhex2name[c.algparam];var j=new KJUR.crypto.ECDSA({curve:e,info:c.keyhex});j.setPublicKeyHex(c.keyhex);return j}else{if(c.algoid=="2a8648ce380401"){var b=ASN1HEX.getVbyList(c.algparam,0,[0],"02");var a=ASN1HEX.getVbyList(c.algparam,0,[1],"02");var d=ASN1HEX.getVbyList(c.algparam,0,[2],"02");var h=ASN1HEX.getHexOfV_AtObj(c.keyhex,0);h=h.substr(2);var j=new KJUR.crypto.DSA();j.setPublic(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(d,16),new BigInteger(h,16));return j}else{throw"unsupported key"}}}};X509.getPublicKeyInfoPropOfCertPEM=function(e){var c={};c.algparam=null;var g=X509.pemToHex(e);var d=ASN1HEX.getPosArrayOfChildren_AtObj(g,0);if(d.length!=3){throw"malformed X.509 certificate PEM (code:001)"}if(g.substr(d[0],2)!="30"){throw"malformed X.509 certificate PEM (code:002)"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(g,d[0]);if(b.length<7){throw"malformed X.509 certificate PEM (code:003)"}var h=ASN1HEX.getPosArrayOfChildren_AtObj(g,b[6]);if(h.length!=2){throw"malformed X.509 certificate PEM (code:004)"}var f=ASN1HEX.getPosArrayOfChildren_AtObj(g,h[0]);if(f.length!=2){throw"malformed X.509 certificate PEM (code:005)"}c.algoid=ASN1HEX.getHexOfV_AtObj(g,f[0]);if(g.substr(f[1],2)=="06"){c.algparam=ASN1HEX.getHexOfV_AtObj(g,f[1])}else{if(g.substr(f[1],2)=="30"){c.algparam=ASN1HEX.getHexOfTLV_AtObj(g,f[1])}}if(g.substr(h[1],2)!="03"){throw"malformed X.509 certificate PEM (code:006)"}var a=ASN1HEX.getHexOfV_AtObj(g,h[1]);c.keyhex=a.substr(2);return c};
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*
|
||
CryptoJS v3.1.2
|
||
code.google.com/p/crypto-js
|
||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||
code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
var CryptoJS=CryptoJS||function(v,p){var d={},u=d.lib={},r=function(){},f=u.Base={extend:function(a){r.prototype=this;var b=new r;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||
s=u.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=p?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,c=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var n=0;n<a;n++)b[j+n>>>2]|=(c[n>>>2]>>>24-8*(n%4)&255)<<24-8*((j+n)%4);else if(65535<c.length)for(n=0;n<a;n+=4)b[j+n>>>2]=c[n>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
|
||
32-8*(b%4);a.length=v.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*v.random()|0);return new s.init(b,a)}}),x=d.enc={},y=x.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++){var n=b[j>>>2]>>>24-8*(j%4)&255;c.push((n>>>4).toString(16));c.push((n&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j+=2)c[j>>>3]|=parseInt(a.substr(j,
|
||
2),16)<<24-4*(j%8);return new s.init(c,b/2)}},e=x.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++)c.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j++)c[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new s.init(c,b)}},q=x.Utf8={stringify:function(a){try{return decodeURIComponent(escape(e.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return e.parse(unescape(encodeURIComponent(a)))}},
|
||
t=u.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,j=b.sigBytes,n=this.blockSize,e=j/(4*n),e=a?v.ceil(e):v.max((e|0)-this._minBufferSize,0);a=e*n;j=v.min(4*a,j);if(a){for(var f=0;f<a;f+=n)this._doProcessBlock(c,f);f=c.splice(0,a);b.sigBytes-=j}return new s.init(f,j)},clone:function(){var a=f.clone.call(this);
|
||
a._data=this._data.clone();return a},_minBufferSize:0});u.Hasher=t.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new w.HMAC.init(a,
|
||
c)).finalize(b)}}});var w=d.algo={};return d}(Math);
|
||
(function(v){var p=CryptoJS,d=p.lib,u=d.Base,r=d.WordArray,p=p.x64={};p.Word=u.extend({init:function(f,s){this.high=f;this.low=s}});p.WordArray=u.extend({init:function(f,s){f=this.words=f||[];this.sigBytes=s!=v?s:8*f.length},toX32:function(){for(var f=this.words,s=f.length,d=[],p=0;p<s;p++){var e=f[p];d.push(e.high);d.push(e.low)}return r.create(d,this.sigBytes)},clone:function(){for(var f=u.clone.call(this),d=f.words=this.words.slice(0),p=d.length,r=0;r<p;r++)d[r]=d[r].clone();return f}})})();
|
||
(function(v){for(var p=CryptoJS,d=p.lib,u=d.WordArray,r=d.Hasher,f=p.x64.Word,d=p.algo,s=[],x=[],y=[],e=1,q=0,t=0;24>t;t++){s[e+5*q]=(t+1)*(t+2)/2%64;var w=(2*e+3*q)%5,e=q%5,q=w}for(e=0;5>e;e++)for(q=0;5>q;q++)x[e+5*q]=q+5*((2*e+3*q)%5);e=1;for(q=0;24>q;q++){for(var a=w=t=0;7>a;a++){if(e&1){var b=(1<<a)-1;32>b?w^=1<<b:t^=1<<b-32}e=e&128?e<<1^113:e<<1}y[q]=f.create(t,w)}for(var c=[],e=0;25>e;e++)c[e]=f.create();d=d.SHA3=r.extend({cfg:r.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
|
||
[],b=0;25>b;b++)a[b]=new f.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var e=this._state,f=this.blockSize/2,h=0;h<f;h++){var l=a[b+2*h],m=a[b+2*h+1],l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,m=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,g=e[h];g.high^=m;g.low^=l}for(f=0;24>f;f++){for(h=0;5>h;h++){for(var d=l=0,k=0;5>k;k++)g=e[h+5*k],l^=g.high,d^=g.low;g=c[h];g.high=l;g.low=d}for(h=0;5>h;h++){g=c[(h+4)%5];l=c[(h+1)%5];m=l.high;k=l.low;l=g.high^
|
||
(m<<1|k>>>31);d=g.low^(k<<1|m>>>31);for(k=0;5>k;k++)g=e[h+5*k],g.high^=l,g.low^=d}for(m=1;25>m;m++)g=e[m],h=g.high,g=g.low,k=s[m],32>k?(l=h<<k|g>>>32-k,d=g<<k|h>>>32-k):(l=g<<k-32|h>>>64-k,d=h<<k-32|g>>>64-k),g=c[x[m]],g.high=l,g.low=d;g=c[0];h=e[0];g.high=h.high;g.low=h.low;for(h=0;5>h;h++)for(k=0;5>k;k++)m=h+5*k,g=e[m],l=c[m],m=c[(h+1)%5+5*k],d=c[(h+2)%5+5*k],g.high=l.high^~m.high&d.high,g.low=l.low^~m.low&d.low;g=e[0];h=y[f];g.high^=h.high;g.low^=h.low}},_doFinalize:function(){var a=this._data,
|
||
b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(v.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],h=0;h<c;h++){var d=a[h],f=d.high,d=d.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;e.push(d);e.push(f)}return new u.init(e,b)},clone:function(){for(var a=r.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
|
||
p.SHA3=r._createHelper(d);p.HmacSHA3=r._createHmacHelper(d)})(Math);
|
||
</script>
|
||
<script type="text/javascript">
|
||
// Base58 encoding/decoding
|
||
// Originally written by Mike Hearn for BitcoinJ
|
||
// Copyright (c) 2011 Google Inc
|
||
// Ported to JavaScript by Stefan Thomas
|
||
// Merged Buffer refactorings from base58-native by Stephen Pair
|
||
// Copyright (c) 2013 BitPay Inc
|
||
|
||
var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||
var ALPHABET_MAP = {}
|
||
for(var i = 0; i < ALPHABET.length; i++) {
|
||
ALPHABET_MAP[ALPHABET.charAt(i)] = i
|
||
}
|
||
var BASE = 58
|
||
|
||
function bs58_encode(buffer) {
|
||
if (buffer.length === 0) return ''
|
||
|
||
var i, j, digits = [0]
|
||
for (i = 0; i < buffer.length; i++) {
|
||
for (j = 0; j < digits.length; j++) digits[j] <<= 8
|
||
digits[digits.length - 1] += buffer[i]
|
||
|
||
var carry = 0
|
||
for (j = digits.length - 1; j >= 0; j--){
|
||
digits[j] += carry
|
||
carry = (digits[j] / BASE) | 0
|
||
digits[j] %= BASE
|
||
}
|
||
|
||
while (carry) {
|
||
digits.unshift(carry)
|
||
carry = (digits[0] / BASE) | 0
|
||
digits[0] %= BASE
|
||
}
|
||
}
|
||
|
||
// deal with leading zeros
|
||
for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) digits.unshift(0)
|
||
|
||
return digits.map(function(digit) { return ALPHABET[digit] }).join('')
|
||
}
|
||
|
||
function bs58_decode(string) {
|
||
if (string.length === 0) return 0
|
||
|
||
var input = string.split('').map(function(c){
|
||
//assert.notEqual(ALPHABET_MAP[c], undefined, 'Non-base58 character')
|
||
return ALPHABET_MAP[c]
|
||
})
|
||
|
||
var i, j, bytes = [0]
|
||
for (i = 0; i < input.length; i++) {
|
||
for (j = 0; j < bytes.length; j++) bytes[j] *= BASE
|
||
bytes[bytes.length - 1] += input[i]
|
||
|
||
var carry = 0
|
||
for (j = bytes.length - 1; j >= 0; j--){
|
||
bytes[j] += carry
|
||
carry = bytes[j] >> 8
|
||
bytes[j] &= 0xff
|
||
}
|
||
|
||
while (carry) {
|
||
bytes.unshift(carry)
|
||
carry = bytes[0] >> 8
|
||
bytes[0] &= 0xff
|
||
}
|
||
}
|
||
|
||
// deal with leading zeros
|
||
for (i = 0; i < input.length - 1 && input[i] == 0; i++) bytes.unshift(0)
|
||
|
||
return bytes
|
||
}
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.5.4 Crypto.js
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
if (typeof Crypto == "undefined" || !Crypto.util) {
|
||
(function () {
|
||
|
||
var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
|
||
// Global Crypto object
|
||
var Crypto = window.Crypto = {};
|
||
|
||
// Crypto utilities
|
||
var util = Crypto.util = {
|
||
|
||
// Bit-wise rotate left
|
||
rotl: function (n, b) {
|
||
return (n << b) | (n >>> (32 - b));
|
||
},
|
||
|
||
// Bit-wise rotate right
|
||
rotr: function (n, b) {
|
||
return (n << (32 - b)) | (n >>> b);
|
||
},
|
||
|
||
// Swap big-endian to little-endian and vice versa
|
||
endian: function (n) {
|
||
|
||
// If number given, swap endian
|
||
if (n.constructor == Number) {
|
||
return util.rotl(n, 8) & 0x00FF00FF |
|
||
util.rotl(n, 24) & 0xFF00FF00;
|
||
}
|
||
|
||
// Else, assume array and swap all items
|
||
for (var i = 0; i < n.length; i++)
|
||
n[i] = util.endian(n[i]);
|
||
return n;
|
||
|
||
},
|
||
|
||
// Generate an array of any length of random bytes
|
||
randomBytes: function (n) {
|
||
for (var bytes = []; n > 0; n--)
|
||
bytes.push(Math.floor(Math.random() * 256));
|
||
return bytes;
|
||
},
|
||
|
||
// Convert a byte array to big-endian 32-bit words
|
||
bytesToWords: function (bytes) {
|
||
for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
|
||
words[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);
|
||
return words;
|
||
},
|
||
|
||
// Convert big-endian 32-bit words to a byte array
|
||
wordsToBytes: function (words) {
|
||
for (var bytes = [], b = 0; b < words.length * 32; b += 8)
|
||
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
|
||
return bytes;
|
||
},
|
||
|
||
// Convert a byte array to a hex string
|
||
bytesToHex: function (bytes) {
|
||
for (var hex = [], i = 0; i < bytes.length; i++) {
|
||
hex.push((bytes[i] >>> 4).toString(16));
|
||
hex.push((bytes[i] & 0xF).toString(16));
|
||
}
|
||
return hex.join("");
|
||
},
|
||
|
||
// Convert a hex string to a byte array
|
||
hexToBytes: function (hex) {
|
||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||
bytes.push(parseInt(hex.substr(c, 2), 16));
|
||
return bytes;
|
||
},
|
||
|
||
// Convert a byte array to a base-64 string
|
||
bytesToBase64: function (bytes) {
|
||
for (var base64 = [], i = 0; i < bytes.length; i += 3) {
|
||
var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
|
||
for (var j = 0; j < 4; j++) {
|
||
if (i * 8 + j * 6 <= bytes.length * 8)
|
||
base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
|
||
else base64.push("=");
|
||
}
|
||
}
|
||
|
||
return base64.join("");
|
||
},
|
||
|
||
// Convert a base-64 string to a byte array
|
||
base64ToBytes: function (base64) {
|
||
// Remove non-base-64 characters
|
||
base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
|
||
|
||
for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
|
||
if (imod4 == 0) continue;
|
||
bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
|
||
(base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
|
||
}
|
||
|
||
return bytes;
|
||
}
|
||
|
||
};
|
||
|
||
// Crypto character encodings
|
||
var charenc = Crypto.charenc = {};
|
||
|
||
// UTF-8 encoding
|
||
var UTF8 = charenc.UTF8 = {
|
||
|
||
// Convert a string to a byte array
|
||
stringToBytes: function (str) {
|
||
return Binary.stringToBytes(unescape(encodeURIComponent(str)));
|
||
},
|
||
|
||
// Convert a byte array to a string
|
||
bytesToString: function (bytes) {
|
||
return decodeURIComponent(escape(Binary.bytesToString(bytes)));
|
||
}
|
||
|
||
};
|
||
|
||
// Binary encoding
|
||
var Binary = charenc.Binary = {
|
||
|
||
// Convert a string to a byte array
|
||
stringToBytes: function (str) {
|
||
for (var bytes = [], i = 0; i < str.length; i++)
|
||
bytes.push(str.charCodeAt(i) & 0xFF);
|
||
return bytes;
|
||
},
|
||
|
||
// Convert a byte array to a string
|
||
bytesToString: function (bytes) {
|
||
for (var str = [], i = 0; i < bytes.length; i++)
|
||
str.push(String.fromCharCode(bytes[i]));
|
||
return str.join("");
|
||
}
|
||
|
||
};
|
||
|
||
})();
|
||
}
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.5.4 SHA256.js
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function () {
|
||
|
||
// Shortcuts
|
||
var C = Crypto,
|
||
util = C.util,
|
||
charenc = C.charenc,
|
||
UTF8 = charenc.UTF8,
|
||
Binary = charenc.Binary;
|
||
|
||
// Constants
|
||
var K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
|
||
0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
|
||
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
|
||
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
|
||
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
|
||
0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
|
||
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
|
||
0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
|
||
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
|
||
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
|
||
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
|
||
0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
|
||
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
|
||
0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
|
||
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
|
||
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2];
|
||
|
||
// Public API
|
||
var SHA256 = C.SHA256 = function (message, options) {
|
||
var digestbytes = util.wordsToBytes(SHA256._sha256(message));
|
||
return options && options.asBytes ? digestbytes :
|
||
options && options.asString ? Binary.bytesToString(digestbytes) :
|
||
util.bytesToHex(digestbytes);
|
||
};
|
||
|
||
// The core
|
||
SHA256._sha256 = function (message) {
|
||
|
||
// Convert to byte array
|
||
if (message.constructor == String) message = UTF8.stringToBytes(message);
|
||
/* else, assume byte array already */
|
||
|
||
var m = util.bytesToWords(message),
|
||
l = message.length * 8,
|
||
H = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
|
||
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19],
|
||
w = [],
|
||
a, b, c, d, e, f, g, h, i, j,
|
||
t1, t2;
|
||
|
||
// Padding
|
||
m[l >> 5] |= 0x80 << (24 - l % 32);
|
||
m[((l + 64 >> 9) << 4) + 15] = l;
|
||
|
||
for (var i = 0; i < m.length; i += 16) {
|
||
|
||
a = H[0];
|
||
b = H[1];
|
||
c = H[2];
|
||
d = H[3];
|
||
e = H[4];
|
||
f = H[5];
|
||
g = H[6];
|
||
h = H[7];
|
||
|
||
for (var j = 0; j < 64; j++) {
|
||
|
||
if (j < 16) w[j] = m[j + i];
|
||
else {
|
||
|
||
var gamma0x = w[j - 15],
|
||
gamma1x = w[j - 2],
|
||
gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
|
||
((gamma0x << 14) | (gamma0x >>> 18)) ^
|
||
(gamma0x >>> 3),
|
||
gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
|
||
((gamma1x << 13) | (gamma1x >>> 19)) ^
|
||
(gamma1x >>> 10);
|
||
|
||
w[j] = gamma0 + (w[j - 7] >>> 0) +
|
||
gamma1 + (w[j - 16] >>> 0);
|
||
|
||
}
|
||
|
||
var ch = e & f ^ ~e & g,
|
||
maj = a & b ^ a & c ^ b & c,
|
||
sigma0 = ((a << 30) | (a >>> 2)) ^
|
||
((a << 19) | (a >>> 13)) ^
|
||
((a << 10) | (a >>> 22)),
|
||
sigma1 = ((e << 26) | (e >>> 6)) ^
|
||
((e << 21) | (e >>> 11)) ^
|
||
((e << 7) | (e >>> 25));
|
||
|
||
|
||
t1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);
|
||
t2 = sigma0 + maj;
|
||
|
||
h = g;
|
||
g = f;
|
||
f = e;
|
||
e = (d + t1) >>> 0;
|
||
d = c;
|
||
c = b;
|
||
b = a;
|
||
a = (t1 + t2) >>> 0;
|
||
|
||
}
|
||
|
||
H[0] += a;
|
||
H[1] += b;
|
||
H[2] += c;
|
||
H[3] += d;
|
||
H[4] += e;
|
||
H[5] += f;
|
||
H[6] += g;
|
||
H[7] += h;
|
||
|
||
}
|
||
|
||
return H;
|
||
|
||
};
|
||
|
||
// Package private blocksize
|
||
SHA256._blocksize = 16;
|
||
|
||
SHA256._digestsize = 32;
|
||
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.5.4 PBKDF2.js
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function () {
|
||
|
||
// Shortcuts
|
||
var C = Crypto,
|
||
util = C.util,
|
||
charenc = C.charenc,
|
||
UTF8 = charenc.UTF8,
|
||
Binary = charenc.Binary;
|
||
|
||
C.PBKDF2 = function (password, salt, keylen, options) {
|
||
|
||
// Convert to byte arrays
|
||
if (password.constructor == String) password = UTF8.stringToBytes(password);
|
||
if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
|
||
/* else, assume byte arrays already */
|
||
|
||
// Defaults
|
||
var hasher = options && options.hasher || C.SHA1,
|
||
iterations = options && options.iterations || 1;
|
||
|
||
// Pseudo-random function
|
||
function PRF(password, salt) {
|
||
return C.HMAC(hasher, salt, password, { asBytes: true });
|
||
}
|
||
|
||
// Generate key
|
||
var derivedKeyBytes = [],
|
||
blockindex = 1;
|
||
while (derivedKeyBytes.length < keylen) {
|
||
var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
|
||
for (var u = block, i = 1; i < iterations; i++) {
|
||
u = PRF(password, u);
|
||
for (var j = 0; j < block.length; j++) block[j] ^= u[j];
|
||
}
|
||
derivedKeyBytes = derivedKeyBytes.concat(block);
|
||
blockindex++;
|
||
}
|
||
|
||
// Truncate excess bytes
|
||
derivedKeyBytes.length = keylen;
|
||
|
||
return options && options.asBytes ? derivedKeyBytes :
|
||
options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
|
||
util.bytesToHex(derivedKeyBytes);
|
||
|
||
};
|
||
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.5.4 HMAC.js
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function () {
|
||
|
||
// Shortcuts
|
||
var C = Crypto,
|
||
util = C.util,
|
||
charenc = C.charenc,
|
||
UTF8 = charenc.UTF8,
|
||
Binary = charenc.Binary;
|
||
|
||
C.HMAC = function (hasher, message, key, options) {
|
||
|
||
// Convert to byte arrays
|
||
if (message.constructor == String) message = UTF8.stringToBytes(message);
|
||
if (key.constructor == String) key = UTF8.stringToBytes(key);
|
||
/* else, assume byte arrays already */
|
||
|
||
// Allow arbitrary length keys
|
||
if (key.length > hasher._blocksize * 4)
|
||
key = hasher(key, { asBytes: true });
|
||
|
||
// XOR keys with pad constants
|
||
var okey = key.slice(0),
|
||
ikey = key.slice(0);
|
||
for (var i = 0; i < hasher._blocksize * 4; i++) {
|
||
okey[i] ^= 0x5C;
|
||
ikey[i] ^= 0x36;
|
||
}
|
||
|
||
var hmacbytes = hasher(okey.concat(hasher(ikey.concat(message), { asBytes: true })), { asBytes: true });
|
||
|
||
return options && options.asBytes ? hmacbytes :
|
||
options && options.asString ? Binary.bytesToString(hmacbytes) :
|
||
util.bytesToHex(hmacbytes);
|
||
|
||
};
|
||
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.5.4 AES.js
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*/
|
||
(function () {
|
||
|
||
// Shortcuts
|
||
var C = Crypto,
|
||
util = C.util,
|
||
charenc = C.charenc,
|
||
UTF8 = charenc.UTF8;
|
||
|
||
// Precomputed SBOX
|
||
var SBOX = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
|
||
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
|
||
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
|
||
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
|
||
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
|
||
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
|
||
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
|
||
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
|
||
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
|
||
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
|
||
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
|
||
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
|
||
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
|
||
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
|
||
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
|
||
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
|
||
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
|
||
|
||
// Compute inverse SBOX lookup table
|
||
for (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i;
|
||
|
||
// Compute multiplication in GF(2^8) lookup tables
|
||
var MULT2 = [],
|
||
MULT3 = [],
|
||
MULT9 = [],
|
||
MULTB = [],
|
||
MULTD = [],
|
||
MULTE = [];
|
||
|
||
function xtime(a, b) {
|
||
for (var result = 0, i = 0; i < 8; i++) {
|
||
if (b & 1) result ^= a;
|
||
var hiBitSet = a & 0x80;
|
||
a = (a << 1) & 0xFF;
|
||
if (hiBitSet) a ^= 0x1b;
|
||
b >>>= 1;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
for (var i = 0; i < 256; i++) {
|
||
MULT2[i] = xtime(i, 2);
|
||
MULT3[i] = xtime(i, 3);
|
||
MULT9[i] = xtime(i, 9);
|
||
MULTB[i] = xtime(i, 0xB);
|
||
MULTD[i] = xtime(i, 0xD);
|
||
MULTE[i] = xtime(i, 0xE);
|
||
}
|
||
|
||
// Precomputed RCon lookup
|
||
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
|
||
|
||
// Inner state
|
||
var state = [[], [], [], []],
|
||
keylength,
|
||
nrounds,
|
||
keyschedule;
|
||
|
||
var AES = C.AES = {
|
||
|
||
/**
|
||
* Public API
|
||
*/
|
||
|
||
encrypt: function (message, password, options) {
|
||
|
||
options = options || {};
|
||
|
||
// Determine mode
|
||
var mode = options.mode || new C.mode.OFB;
|
||
|
||
// Allow mode to override options
|
||
if (mode.fixOptions) mode.fixOptions(options);
|
||
|
||
var
|
||
|
||
// Convert to bytes if message is a string
|
||
m = (
|
||
message.constructor == String ?
|
||
UTF8.stringToBytes(message) :
|
||
message
|
||
),
|
||
|
||
// Generate random IV
|
||
iv = options.iv || util.randomBytes(AES._blocksize * 4),
|
||
|
||
// Generate key
|
||
k = (
|
||
password.constructor == String ?
|
||
// Derive key from pass-phrase
|
||
C.PBKDF2(password, iv, 32, { asBytes: true }) :
|
||
// else, assume byte array representing cryptographic key
|
||
password
|
||
);
|
||
|
||
// Encrypt
|
||
AES._init(k);
|
||
mode.encrypt(AES, m, iv);
|
||
|
||
// Return ciphertext
|
||
m = options.iv ? m : iv.concat(m);
|
||
return (options && options.asBytes) ? m : util.bytesToBase64(m);
|
||
|
||
},
|
||
|
||
decrypt: function (ciphertext, password, options) {
|
||
|
||
options = options || {};
|
||
|
||
// Determine mode
|
||
var mode = options.mode || new C.mode.OFB;
|
||
|
||
// Allow mode to override options
|
||
if (mode.fixOptions) mode.fixOptions(options);
|
||
|
||
var
|
||
|
||
// Convert to bytes if ciphertext is a string
|
||
c = (
|
||
ciphertext.constructor == String ?
|
||
util.base64ToBytes(ciphertext) :
|
||
ciphertext
|
||
),
|
||
|
||
// Separate IV and message
|
||
iv = options.iv || c.splice(0, AES._blocksize * 4),
|
||
|
||
// Generate key
|
||
k = (
|
||
password.constructor == String ?
|
||
// Derive key from pass-phrase
|
||
C.PBKDF2(password, iv, 32, { asBytes: true }) :
|
||
// else, assume byte array representing cryptographic key
|
||
password
|
||
);
|
||
|
||
// Decrypt
|
||
AES._init(k);
|
||
mode.decrypt(AES, c, iv);
|
||
|
||
// Return plaintext
|
||
return (options && options.asBytes) ? c : UTF8.bytesToString(c);
|
||
|
||
},
|
||
|
||
|
||
/**
|
||
* Package private methods and properties
|
||
*/
|
||
|
||
_blocksize: 4,
|
||
|
||
_encryptblock: function (m, offset) {
|
||
|
||
// Set input
|
||
for (var row = 0; row < AES._blocksize; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = m[offset + col * 4 + row];
|
||
}
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[col][row];
|
||
}
|
||
|
||
for (var round = 1; round < nrounds; round++) {
|
||
|
||
// Sub bytes
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = SBOX[state[row][col]];
|
||
}
|
||
|
||
// Shift rows
|
||
state[1].push(state[1].shift());
|
||
state[2].push(state[2].shift());
|
||
state[2].push(state[2].shift());
|
||
state[3].unshift(state[3].pop());
|
||
|
||
// Mix columns
|
||
for (var col = 0; col < 4; col++) {
|
||
|
||
var s0 = state[0][col],
|
||
s1 = state[1][col],
|
||
s2 = state[2][col],
|
||
s3 = state[3][col];
|
||
|
||
state[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3;
|
||
state[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3;
|
||
state[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3];
|
||
state[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3];
|
||
|
||
}
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[round * 4 + col][row];
|
||
}
|
||
|
||
}
|
||
|
||
// Sub bytes
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = SBOX[state[row][col]];
|
||
}
|
||
|
||
// Shift rows
|
||
state[1].push(state[1].shift());
|
||
state[2].push(state[2].shift());
|
||
state[2].push(state[2].shift());
|
||
state[3].unshift(state[3].pop());
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[nrounds * 4 + col][row];
|
||
}
|
||
|
||
// Set output
|
||
for (var row = 0; row < AES._blocksize; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
m[offset + col * 4 + row] = state[row][col];
|
||
}
|
||
|
||
},
|
||
|
||
_decryptblock: function (c, offset) {
|
||
|
||
// Set input
|
||
for (var row = 0; row < AES._blocksize; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = c[offset + col * 4 + row];
|
||
}
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[nrounds * 4 + col][row];
|
||
}
|
||
|
||
for (var round = 1; round < nrounds; round++) {
|
||
|
||
// Inv shift rows
|
||
state[1].unshift(state[1].pop());
|
||
state[2].push(state[2].shift());
|
||
state[2].push(state[2].shift());
|
||
state[3].push(state[3].shift());
|
||
|
||
// Inv sub bytes
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = INVSBOX[state[row][col]];
|
||
}
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row];
|
||
}
|
||
|
||
// Inv mix columns
|
||
for (var col = 0; col < 4; col++) {
|
||
|
||
var s0 = state[0][col],
|
||
s1 = state[1][col],
|
||
s2 = state[2][col],
|
||
s3 = state[3][col];
|
||
|
||
state[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3];
|
||
state[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3];
|
||
state[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3];
|
||
state[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3];
|
||
|
||
}
|
||
|
||
}
|
||
|
||
// Inv shift rows
|
||
state[1].unshift(state[1].pop());
|
||
state[2].push(state[2].shift());
|
||
state[2].push(state[2].shift());
|
||
state[3].push(state[3].shift());
|
||
|
||
// Inv sub bytes
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] = INVSBOX[state[row][col]];
|
||
}
|
||
|
||
// Add round key
|
||
for (var row = 0; row < 4; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
state[row][col] ^= keyschedule[col][row];
|
||
}
|
||
|
||
// Set output
|
||
for (var row = 0; row < AES._blocksize; row++) {
|
||
for (var col = 0; col < 4; col++)
|
||
c[offset + col * 4 + row] = state[row][col];
|
||
}
|
||
|
||
},
|
||
|
||
|
||
/**
|
||
* Private methods
|
||
*/
|
||
|
||
_init: function (k) {
|
||
keylength = k.length / 4;
|
||
nrounds = keylength + 6;
|
||
AES._keyexpansion(k);
|
||
},
|
||
|
||
// Generate a key schedule
|
||
_keyexpansion: function (k) {
|
||
|
||
keyschedule = [];
|
||
|
||
for (var row = 0; row < keylength; row++) {
|
||
keyschedule[row] = [
|
||
k[row * 4],
|
||
k[row * 4 + 1],
|
||
k[row * 4 + 2],
|
||
k[row * 4 + 3]
|
||
];
|
||
}
|
||
|
||
for (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) {
|
||
|
||
var temp = [
|
||
keyschedule[row - 1][0],
|
||
keyschedule[row - 1][1],
|
||
keyschedule[row - 1][2],
|
||
keyschedule[row - 1][3]
|
||
];
|
||
|
||
if (row % keylength == 0) {
|
||
|
||
// Rot word
|
||
temp.push(temp.shift());
|
||
|
||
// Sub word
|
||
temp[0] = SBOX[temp[0]];
|
||
temp[1] = SBOX[temp[1]];
|
||
temp[2] = SBOX[temp[2]];
|
||
temp[3] = SBOX[temp[3]];
|
||
|
||
temp[0] ^= RCON[row / keylength];
|
||
|
||
} else if (keylength > 6 && row % keylength == 4) {
|
||
|
||
// Sub word
|
||
temp[0] = SBOX[temp[0]];
|
||
temp[1] = SBOX[temp[1]];
|
||
temp[2] = SBOX[temp[2]];
|
||
temp[3] = SBOX[temp[3]];
|
||
|
||
}
|
||
|
||
keyschedule[row] = [
|
||
keyschedule[row - keylength][0] ^ temp[0],
|
||
keyschedule[row - keylength][1] ^ temp[1],
|
||
keyschedule[row - keylength][2] ^ temp[2],
|
||
keyschedule[row - keylength][3] ^ temp[3]
|
||
];
|
||
|
||
}
|
||
|
||
}
|
||
|
||
};
|
||
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS 2.5.4 BlockModes.js
|
||
* contribution from Simon Greatrix
|
||
*/
|
||
|
||
(function (C) {
|
||
|
||
// Create pad namespace
|
||
var C_pad = C.pad = {};
|
||
|
||
// Calculate the number of padding bytes required.
|
||
function _requiredPadding(cipher, message) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
var reqd = blockSizeInBytes - message.length % blockSizeInBytes;
|
||
return reqd;
|
||
}
|
||
|
||
// Remove padding when the final byte gives the number of padding bytes.
|
||
var _unpadLength = function (cipher, message, alg, padding) {
|
||
var pad = message.pop();
|
||
if (pad == 0) {
|
||
throw new Error("Invalid zero-length padding specified for " + alg
|
||
+ ". Wrong cipher specification or key used?");
|
||
}
|
||
var maxPad = cipher._blocksize * 4;
|
||
if (pad > maxPad) {
|
||
throw new Error("Invalid padding length of " + pad
|
||
+ " specified for " + alg
|
||
+ ". Wrong cipher specification or key used?");
|
||
}
|
||
for (var i = 1; i < pad; i++) {
|
||
var b = message.pop();
|
||
if (padding != undefined && padding != b) {
|
||
throw new Error("Invalid padding byte of 0x" + b.toString(16)
|
||
+ " specified for " + alg
|
||
+ ". Wrong cipher specification or key used?");
|
||
}
|
||
}
|
||
};
|
||
|
||
// No-operation padding, used for stream ciphers
|
||
C_pad.NoPadding = {
|
||
pad: function (cipher, message) { },
|
||
unpad: function (cipher, message) { }
|
||
};
|
||
|
||
// Zero Padding.
|
||
//
|
||
// If the message is not an exact number of blocks, the final block is
|
||
// completed with 0x00 bytes. There is no unpadding.
|
||
C_pad.ZeroPadding = {
|
||
pad: function (cipher, message) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
var reqd = message.length % blockSizeInBytes;
|
||
if (reqd != 0) {
|
||
for (reqd = blockSizeInBytes - reqd; reqd > 0; reqd--) {
|
||
message.push(0x00);
|
||
}
|
||
}
|
||
},
|
||
|
||
unpad: function (cipher, message) {
|
||
while (message[message.length - 1] == 0) {
|
||
message.pop();
|
||
}
|
||
}
|
||
};
|
||
|
||
// ISO/IEC 7816-4 padding.
|
||
//
|
||
// Pads the plain text with an 0x80 byte followed by as many 0x00
|
||
// bytes are required to complete the block.
|
||
C_pad.iso7816 = {
|
||
pad: function (cipher, message) {
|
||
var reqd = _requiredPadding(cipher, message);
|
||
message.push(0x80);
|
||
for (; reqd > 1; reqd--) {
|
||
message.push(0x00);
|
||
}
|
||
},
|
||
|
||
unpad: function (cipher, message) {
|
||
var padLength;
|
||
for (padLength = cipher._blocksize * 4; padLength > 0; padLength--) {
|
||
var b = message.pop();
|
||
if (b == 0x80) return;
|
||
if (b != 0x00) {
|
||
throw new Error("ISO-7816 padding byte must be 0, not 0x" + b.toString(16) + ". Wrong cipher specification or key used?");
|
||
}
|
||
}
|
||
throw new Error("ISO-7816 padded beyond cipher block size. Wrong cipher specification or key used?");
|
||
}
|
||
};
|
||
|
||
// ANSI X.923 padding
|
||
//
|
||
// The final block is padded with zeros except for the last byte of the
|
||
// last block which contains the number of padding bytes.
|
||
C_pad.ansix923 = {
|
||
pad: function (cipher, message) {
|
||
var reqd = _requiredPadding(cipher, message);
|
||
for (var i = 1; i < reqd; i++) {
|
||
message.push(0x00);
|
||
}
|
||
message.push(reqd);
|
||
},
|
||
|
||
unpad: function (cipher, message) {
|
||
_unpadLength(cipher, message, "ANSI X.923", 0);
|
||
}
|
||
};
|
||
|
||
// ISO 10126
|
||
//
|
||
// The final block is padded with random bytes except for the last
|
||
// byte of the last block which contains the number of padding bytes.
|
||
C_pad.iso10126 = {
|
||
pad: function (cipher, message) {
|
||
var reqd = _requiredPadding(cipher, message);
|
||
for (var i = 1; i < reqd; i++) {
|
||
message.push(Math.floor(Math.random() * 256));
|
||
}
|
||
message.push(reqd);
|
||
},
|
||
|
||
unpad: function (cipher, message) {
|
||
_unpadLength(cipher, message, "ISO 10126", undefined);
|
||
}
|
||
};
|
||
|
||
// PKCS7 padding
|
||
//
|
||
// PKCS7 is described in RFC 5652. Padding is in whole bytes. The
|
||
// value of each added byte is the number of bytes that are added,
|
||
// i.e. N bytes, each of value N are added.
|
||
C_pad.pkcs7 = {
|
||
pad: function (cipher, message) {
|
||
var reqd = _requiredPadding(cipher, message);
|
||
for (var i = 0; i < reqd; i++) {
|
||
message.push(reqd);
|
||
}
|
||
},
|
||
|
||
unpad: function (cipher, message) {
|
||
_unpadLength(cipher, message, "PKCS 7", message[message.length - 1]);
|
||
}
|
||
};
|
||
|
||
// Create mode namespace
|
||
var C_mode = C.mode = {};
|
||
|
||
/**
|
||
* Mode base "class".
|
||
*/
|
||
var Mode = C_mode.Mode = function (padding) {
|
||
if (padding) {
|
||
this._padding = padding;
|
||
}
|
||
};
|
||
|
||
Mode.prototype = {
|
||
encrypt: function (cipher, m, iv) {
|
||
this._padding.pad(cipher, m);
|
||
this._doEncrypt(cipher, m, iv);
|
||
},
|
||
|
||
decrypt: function (cipher, m, iv) {
|
||
this._doDecrypt(cipher, m, iv);
|
||
this._padding.unpad(cipher, m);
|
||
},
|
||
|
||
// Default padding
|
||
_padding: C_pad.iso7816
|
||
};
|
||
|
||
|
||
/**
|
||
* Electronic Code Book mode.
|
||
*
|
||
* ECB applies the cipher directly against each block of the input.
|
||
*
|
||
* ECB does not require an initialization vector.
|
||
*/
|
||
var ECB = C_mode.ECB = function () {
|
||
// Call parent constructor
|
||
Mode.apply(this, arguments);
|
||
};
|
||
|
||
// Inherit from Mode
|
||
var ECB_prototype = ECB.prototype = new Mode;
|
||
|
||
// Concrete steps for Mode template
|
||
ECB_prototype._doEncrypt = function (cipher, m, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
// Encrypt each block
|
||
for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
|
||
cipher._encryptblock(m, offset);
|
||
}
|
||
};
|
||
ECB_prototype._doDecrypt = function (cipher, c, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
// Decrypt each block
|
||
for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
|
||
cipher._decryptblock(c, offset);
|
||
}
|
||
};
|
||
|
||
// ECB never uses an IV
|
||
ECB_prototype.fixOptions = function (options) {
|
||
options.iv = [];
|
||
};
|
||
|
||
|
||
/**
|
||
* Cipher block chaining
|
||
*
|
||
* The first block is XORed with the IV. Subsequent blocks are XOR with the
|
||
* previous cipher output.
|
||
*/
|
||
var CBC = C_mode.CBC = function () {
|
||
// Call parent constructor
|
||
Mode.apply(this, arguments);
|
||
};
|
||
|
||
// Inherit from Mode
|
||
var CBC_prototype = CBC.prototype = new Mode;
|
||
|
||
// Concrete steps for Mode template
|
||
CBC_prototype._doEncrypt = function (cipher, m, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
|
||
// Encrypt each block
|
||
for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
|
||
if (offset == 0) {
|
||
// XOR first block using IV
|
||
for (var i = 0; i < blockSizeInBytes; i++)
|
||
m[i] ^= iv[i];
|
||
} else {
|
||
// XOR this block using previous crypted block
|
||
for (var i = 0; i < blockSizeInBytes; i++)
|
||
m[offset + i] ^= m[offset + i - blockSizeInBytes];
|
||
}
|
||
// Encrypt block
|
||
cipher._encryptblock(m, offset);
|
||
}
|
||
};
|
||
CBC_prototype._doDecrypt = function (cipher, c, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
|
||
// At the start, the previously crypted block is the IV
|
||
var prevCryptedBlock = iv;
|
||
|
||
// Decrypt each block
|
||
for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
|
||
// Save this crypted block
|
||
var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);
|
||
// Decrypt block
|
||
cipher._decryptblock(c, offset);
|
||
// XOR decrypted block using previous crypted block
|
||
for (var i = 0; i < blockSizeInBytes; i++) {
|
||
c[offset + i] ^= prevCryptedBlock[i];
|
||
}
|
||
prevCryptedBlock = thisCryptedBlock;
|
||
}
|
||
};
|
||
|
||
|
||
/**
|
||
* Cipher feed back
|
||
*
|
||
* The cipher output is XORed with the plain text to produce the cipher output,
|
||
* which is then fed back into the cipher to produce a bit pattern to XOR the
|
||
* next block with.
|
||
*
|
||
* This is a stream cipher mode and does not require padding.
|
||
*/
|
||
var CFB = C_mode.CFB = function () {
|
||
// Call parent constructor
|
||
Mode.apply(this, arguments);
|
||
};
|
||
|
||
// Inherit from Mode
|
||
var CFB_prototype = CFB.prototype = new Mode;
|
||
|
||
// Override padding
|
||
CFB_prototype._padding = C_pad.NoPadding;
|
||
|
||
// Concrete steps for Mode template
|
||
CFB_prototype._doEncrypt = function (cipher, m, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4,
|
||
keystream = iv.slice(0);
|
||
|
||
// Encrypt each byte
|
||
for (var i = 0; i < m.length; i++) {
|
||
|
||
var j = i % blockSizeInBytes;
|
||
if (j == 0) cipher._encryptblock(keystream, 0);
|
||
|
||
m[i] ^= keystream[j];
|
||
keystream[j] = m[i];
|
||
}
|
||
};
|
||
CFB_prototype._doDecrypt = function (cipher, c, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4,
|
||
keystream = iv.slice(0);
|
||
|
||
// Encrypt each byte
|
||
for (var i = 0; i < c.length; i++) {
|
||
|
||
var j = i % blockSizeInBytes;
|
||
if (j == 0) cipher._encryptblock(keystream, 0);
|
||
|
||
var b = c[i];
|
||
c[i] ^= keystream[j];
|
||
keystream[j] = b;
|
||
}
|
||
};
|
||
|
||
|
||
/**
|
||
* Output feed back
|
||
*
|
||
* The cipher repeatedly encrypts its own output. The output is XORed with the
|
||
* plain text to produce the cipher text.
|
||
*
|
||
* This is a stream cipher mode and does not require padding.
|
||
*/
|
||
var OFB = C_mode.OFB = function () {
|
||
// Call parent constructor
|
||
Mode.apply(this, arguments);
|
||
};
|
||
|
||
// Inherit from Mode
|
||
var OFB_prototype = OFB.prototype = new Mode;
|
||
|
||
// Override padding
|
||
OFB_prototype._padding = C_pad.NoPadding;
|
||
|
||
// Concrete steps for Mode template
|
||
OFB_prototype._doEncrypt = function (cipher, m, iv) {
|
||
|
||
var blockSizeInBytes = cipher._blocksize * 4,
|
||
keystream = iv.slice(0);
|
||
|
||
// Encrypt each byte
|
||
for (var i = 0; i < m.length; i++) {
|
||
|
||
// Generate keystream
|
||
if (i % blockSizeInBytes == 0)
|
||
cipher._encryptblock(keystream, 0);
|
||
|
||
// Encrypt byte
|
||
m[i] ^= keystream[i % blockSizeInBytes];
|
||
|
||
}
|
||
};
|
||
OFB_prototype._doDecrypt = OFB_prototype._doEncrypt;
|
||
|
||
/**
|
||
* Counter
|
||
* @author Gergely Risko
|
||
*
|
||
* After every block the last 4 bytes of the IV is increased by one
|
||
* with carry and that IV is used for the next block.
|
||
*
|
||
* This is a stream cipher mode and does not require padding.
|
||
*/
|
||
var CTR = C_mode.CTR = function () {
|
||
// Call parent constructor
|
||
Mode.apply(this, arguments);
|
||
};
|
||
|
||
// Inherit from Mode
|
||
var CTR_prototype = CTR.prototype = new Mode;
|
||
|
||
// Override padding
|
||
CTR_prototype._padding = C_pad.NoPadding;
|
||
|
||
CTR_prototype._doEncrypt = function (cipher, m, iv) {
|
||
var blockSizeInBytes = cipher._blocksize * 4;
|
||
var counter = iv.slice(0);
|
||
|
||
for (var i = 0; i < m.length; ) {
|
||
// do not lose iv
|
||
var keystream = counter.slice(0);
|
||
|
||
// Generate keystream for next block
|
||
cipher._encryptblock(keystream, 0);
|
||
|
||
// XOR keystream with block
|
||
for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) {
|
||
m[i] ^= keystream[j];
|
||
}
|
||
|
||
// Increase counter
|
||
if (++(counter[blockSizeInBytes - 1]) == 256) {
|
||
counter[blockSizeInBytes - 1] = 0;
|
||
if (++(counter[blockSizeInBytes - 2]) == 256) {
|
||
counter[blockSizeInBytes - 2] = 0;
|
||
if (++(counter[blockSizeInBytes - 3]) == 256) {
|
||
counter[blockSizeInBytes - 3] = 0;
|
||
++(counter[blockSizeInBytes - 4]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
CTR_prototype._doDecrypt = CTR_prototype._doEncrypt;
|
||
|
||
})(Crypto);
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Crypto-JS v2.0.0 RIPEMD-160
|
||
* http://code.google.com/p/crypto-js/
|
||
* Copyright (c) 2009, Jeff Mott. All rights reserved.
|
||
* http://code.google.com/p/crypto-js/wiki/License
|
||
*
|
||
* A JavaScript implementation of the RIPEMD-160 Algorithm
|
||
* Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
|
||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
||
* Distributed under the BSD License
|
||
* See http://pajhome.org.uk/crypt/md5 for details.
|
||
* Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
|
||
* Ported to Crypto-JS by Stefan Thomas.
|
||
*/
|
||
|
||
(function () {
|
||
// Shortcuts
|
||
var C = Crypto,
|
||
util = C.util,
|
||
charenc = C.charenc,
|
||
UTF8 = charenc.UTF8,
|
||
Binary = charenc.Binary;
|
||
|
||
// Convert a byte array to little-endian 32-bit words
|
||
util.bytesToLWords = function (bytes) {
|
||
|
||
var output = Array(bytes.length >> 2);
|
||
for (var i = 0; i < output.length; i++)
|
||
output[i] = 0;
|
||
for (var i = 0; i < bytes.length * 8; i += 8)
|
||
output[i >> 5] |= (bytes[i / 8] & 0xFF) << (i % 32);
|
||
return output;
|
||
};
|
||
|
||
// Convert little-endian 32-bit words to a byte array
|
||
util.lWordsToBytes = function (words) {
|
||
var output = [];
|
||
for (var i = 0; i < words.length * 32; i += 8)
|
||
output.push((words[i >> 5] >>> (i % 32)) & 0xff);
|
||
return output;
|
||
};
|
||
|
||
// Public API
|
||
var RIPEMD160 = C.RIPEMD160 = function (message, options) {
|
||
var digestbytes = util.lWordsToBytes(RIPEMD160._rmd160(message));
|
||
return options && options.asBytes ? digestbytes :
|
||
options && options.asString ? Binary.bytesToString(digestbytes) :
|
||
util.bytesToHex(digestbytes);
|
||
};
|
||
|
||
// The core
|
||
RIPEMD160._rmd160 = function (message) {
|
||
// Convert to byte array
|
||
if (message.constructor == String) message = UTF8.stringToBytes(message);
|
||
|
||
var x = util.bytesToLWords(message),
|
||
len = message.length * 8;
|
||
|
||
/* append padding */
|
||
x[len >> 5] |= 0x80 << (len % 32);
|
||
x[(((len + 64) >>> 9) << 4) + 14] = len;
|
||
|
||
var h0 = 0x67452301;
|
||
var h1 = 0xefcdab89;
|
||
var h2 = 0x98badcfe;
|
||
var h3 = 0x10325476;
|
||
var h4 = 0xc3d2e1f0;
|
||
|
||
for (var i = 0; i < x.length; i += 16) {
|
||
var T;
|
||
var A1 = h0, B1 = h1, C1 = h2, D1 = h3, E1 = h4;
|
||
var A2 = h0, B2 = h1, C2 = h2, D2 = h3, E2 = h4;
|
||
for (var j = 0; j <= 79; ++j) {
|
||
T = safe_add(A1, rmd160_f(j, B1, C1, D1));
|
||
T = safe_add(T, x[i + rmd160_r1[j]]);
|
||
T = safe_add(T, rmd160_K1(j));
|
||
T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
|
||
A1 = E1; E1 = D1; D1 = bit_rol(C1, 10); C1 = B1; B1 = T;
|
||
T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
|
||
T = safe_add(T, x[i + rmd160_r2[j]]);
|
||
T = safe_add(T, rmd160_K2(j));
|
||
T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
|
||
A2 = E2; E2 = D2; D2 = bit_rol(C2, 10); C2 = B2; B2 = T;
|
||
}
|
||
T = safe_add(h1, safe_add(C1, D2));
|
||
h1 = safe_add(h2, safe_add(D1, E2));
|
||
h2 = safe_add(h3, safe_add(E1, A2));
|
||
h3 = safe_add(h4, safe_add(A1, B2));
|
||
h4 = safe_add(h0, safe_add(B1, C2));
|
||
h0 = T;
|
||
}
|
||
return [h0, h1, h2, h3, h4];
|
||
}
|
||
|
||
function rmd160_f(j, x, y, z) {
|
||
return (0 <= j && j <= 15) ? (x ^ y ^ z) :
|
||
(16 <= j && j <= 31) ? (x & y) | (~x & z) :
|
||
(32 <= j && j <= 47) ? (x | ~y) ^ z :
|
||
(48 <= j && j <= 63) ? (x & z) | (y & ~z) :
|
||
(64 <= j && j <= 79) ? x ^ (y | ~z) :
|
||
"rmd160_f: j out of range";
|
||
}
|
||
function rmd160_K1(j) {
|
||
return (0 <= j && j <= 15) ? 0x00000000 :
|
||
(16 <= j && j <= 31) ? 0x5a827999 :
|
||
(32 <= j && j <= 47) ? 0x6ed9eba1 :
|
||
(48 <= j && j <= 63) ? 0x8f1bbcdc :
|
||
(64 <= j && j <= 79) ? 0xa953fd4e :
|
||
"rmd160_K1: j out of range";
|
||
}
|
||
function rmd160_K2(j) {
|
||
return (0 <= j && j <= 15) ? 0x50a28be6 :
|
||
(16 <= j && j <= 31) ? 0x5c4dd124 :
|
||
(32 <= j && j <= 47) ? 0x6d703ef3 :
|
||
(48 <= j && j <= 63) ? 0x7a6d76e9 :
|
||
(64 <= j && j <= 79) ? 0x00000000 :
|
||
"rmd160_K2: j out of range";
|
||
}
|
||
var rmd160_r1 = [
|
||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
|
||
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
|
||
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
|
||
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
|
||
];
|
||
var rmd160_r2 = [
|
||
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
|
||
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
|
||
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
|
||
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
|
||
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
|
||
];
|
||
var rmd160_s1 = [
|
||
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
|
||
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
|
||
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
|
||
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
|
||
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
|
||
];
|
||
var rmd160_s2 = [
|
||
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
|
||
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
|
||
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
|
||
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
|
||
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
|
||
];
|
||
|
||
/*
|
||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
||
* to work around bugs in some JS interpreters.
|
||
*/
|
||
function safe_add(x, y) {
|
||
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||
return (msw << 16) | (lsw & 0xFFFF);
|
||
}
|
||
|
||
/*
|
||
* Bitwise rotate a 32-bit number to the left.
|
||
*/
|
||
function bit_rol(num, cnt) {
|
||
return (num << cnt) | (num >>> (32 - cnt));
|
||
}
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*!
|
||
* Random number generator with ArcFour PRNG
|
||
*
|
||
* NOTE: For best results, put code like
|
||
* <body onclick='SecureRandom.seedTime();' onkeypress='SecureRandom.seedTime();'>
|
||
* in your main HTML document.
|
||
*
|
||
* Copyright Tom Wu, bitaddress.org BSD License.
|
||
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
|
||
*/
|
||
(function () {
|
||
|
||
// Constructor function of Global SecureRandom object
|
||
var sr = window.SecureRandom = function () { };
|
||
|
||
// Properties
|
||
sr.state;
|
||
sr.pool;
|
||
sr.pptr;
|
||
sr.poolCopyOnInit;
|
||
|
||
// Pool size must be a multiple of 4 and greater than 32.
|
||
// An array of bytes the size of the pool will be passed to init()
|
||
sr.poolSize = 256;
|
||
|
||
// --- object methods ---
|
||
|
||
// public method
|
||
// ba: byte array
|
||
sr.prototype.nextBytes = function (ba) {
|
||
var i;
|
||
if (window.crypto && window.crypto.getRandomValues && window.Uint8Array) {
|
||
try {
|
||
var rvBytes = new Uint8Array(ba.length);
|
||
window.crypto.getRandomValues(rvBytes);
|
||
for (i = 0; i < ba.length; ++i)
|
||
ba[i] = sr.getByte() ^ rvBytes[i];
|
||
return;
|
||
} catch (e) {
|
||
alert(e);
|
||
}
|
||
}
|
||
for (i = 0; i < ba.length; ++i) ba[i] = sr.getByte();
|
||
};
|
||
|
||
|
||
// --- static methods ---
|
||
|
||
// Mix in the current time (w/milliseconds) into the pool
|
||
// NOTE: this method should be called from body click/keypress event handlers to increase entropy
|
||
sr.seedTime = function () {
|
||
sr.seedInt(new Date().getTime());
|
||
}
|
||
|
||
sr.getByte = function () {
|
||
if (sr.state == null) {
|
||
sr.seedTime();
|
||
sr.state = sr.ArcFour(); // Plug in your RNG constructor here
|
||
sr.state.init(sr.pool);
|
||
sr.poolCopyOnInit = [];
|
||
for (sr.pptr = 0; sr.pptr < sr.pool.length; ++sr.pptr)
|
||
sr.poolCopyOnInit[sr.pptr] = sr.pool[sr.pptr];
|
||
sr.pptr = 0;
|
||
}
|
||
// TODO: allow reseeding after first request
|
||
return sr.state.next();
|
||
}
|
||
|
||
// Mix in a 32-bit integer into the pool
|
||
sr.seedInt = function (x) {
|
||
sr.seedInt8(x);
|
||
sr.seedInt8((x >> 8));
|
||
sr.seedInt8((x >> 16));
|
||
sr.seedInt8((x >> 24));
|
||
}
|
||
|
||
// Mix in a 16-bit integer into the pool
|
||
sr.seedInt16 = function (x) {
|
||
sr.seedInt8(x);
|
||
sr.seedInt8((x >> 8));
|
||
}
|
||
|
||
// Mix in a 8-bit integer into the pool
|
||
sr.seedInt8 = function (x) {
|
||
sr.pool[sr.pptr++] ^= x & 255;
|
||
if (sr.pptr >= sr.poolSize) sr.pptr -= sr.poolSize;
|
||
}
|
||
|
||
// Arcfour is a PRNG
|
||
sr.ArcFour = function () {
|
||
function Arcfour() {
|
||
this.i = 0;
|
||
this.j = 0;
|
||
this.S = new Array();
|
||
}
|
||
|
||
// Initialize arcfour context from key, an array of ints, each from [0..255]
|
||
function ARC4init(key) {
|
||
var i, j, t;
|
||
for (i = 0; i < 256; ++i)
|
||
this.S[i] = i;
|
||
j = 0;
|
||
for (i = 0; i < 256; ++i) {
|
||
j = (j + this.S[i] + key[i % key.length]) & 255;
|
||
t = this.S[i];
|
||
this.S[i] = this.S[j];
|
||
this.S[j] = t;
|
||
}
|
||
this.i = 0;
|
||
this.j = 0;
|
||
}
|
||
|
||
function ARC4next() {
|
||
var t;
|
||
this.i = (this.i + 1) & 255;
|
||
this.j = (this.j + this.S[this.i]) & 255;
|
||
t = this.S[this.i];
|
||
this.S[this.i] = this.S[this.j];
|
||
this.S[this.j] = t;
|
||
return this.S[(t + this.S[this.i]) & 255];
|
||
}
|
||
|
||
Arcfour.prototype.init = ARC4init;
|
||
Arcfour.prototype.next = ARC4next;
|
||
|
||
return new Arcfour();
|
||
};
|
||
|
||
|
||
// Initialize the pool with junk if needed.
|
||
if (sr.pool == null) {
|
||
sr.pool = new Array();
|
||
sr.pptr = 0;
|
||
var t;
|
||
if (window.crypto && window.crypto.getRandomValues && window.Uint8Array) {
|
||
try {
|
||
// Use webcrypto if available
|
||
var ua = new Uint8Array(sr.poolSize);
|
||
window.crypto.getRandomValues(ua);
|
||
for (t = 0; t < sr.poolSize; ++t)
|
||
sr.pool[sr.pptr++] = ua[t];
|
||
} catch (e) { alert(e); }
|
||
}
|
||
while (sr.pptr < sr.poolSize) { // extract some randomness from Math.random()
|
||
t = Math.floor(65536 * Math.random());
|
||
sr.pool[sr.pptr++] = t >>> 8;
|
||
sr.pool[sr.pptr++] = t & 255;
|
||
}
|
||
sr.pptr = Math.floor(sr.poolSize * Math.random());
|
||
sr.seedTime();
|
||
// entropy
|
||
var entropyStr = "";
|
||
// screen size and color depth: ~4.8 to ~5.4 bits
|
||
entropyStr += (window.screen.height * window.screen.width * window.screen.colorDepth);
|
||
entropyStr += (window.screen.availHeight * window.screen.availWidth * window.screen.pixelDepth);
|
||
// time zone offset: ~4 bits
|
||
var dateObj = new Date();
|
||
var timeZoneOffset = dateObj.getTimezoneOffset();
|
||
entropyStr += timeZoneOffset;
|
||
// user agent: ~8.3 to ~11.6 bits
|
||
entropyStr += navigator.userAgent;
|
||
// browser plugin details: ~16.2 to ~21.8 bits
|
||
var pluginsStr = "";
|
||
for (var i = 0; i < navigator.plugins.length; i++) {
|
||
pluginsStr += navigator.plugins[i].name + " " + navigator.plugins[i].filename + " " + navigator.plugins[i].description + " " + navigator.plugins[i].version + ", ";
|
||
}
|
||
var mimeTypesStr = "";
|
||
for (var i = 0; i < navigator.mimeTypes.length; i++) {
|
||
mimeTypesStr += navigator.mimeTypes[i].description + " " + navigator.mimeTypes[i].type + " " + navigator.mimeTypes[i].suffixes + ", ";
|
||
}
|
||
entropyStr += pluginsStr + mimeTypesStr;
|
||
// cookies and storage: 1 bit
|
||
entropyStr += navigator.cookieEnabled + typeof (sessionStorage) + typeof (localStorage);
|
||
// language: ~7 bit
|
||
entropyStr += navigator.language;
|
||
// history: ~2 bit
|
||
entropyStr += window.history.length;
|
||
// location
|
||
entropyStr += window.location;
|
||
|
||
var entropyBytes = Crypto.SHA256(entropyStr, { asBytes: true });
|
||
for (var i = 0 ; i < entropyBytes.length ; i++) {
|
||
sr.seedInt8(entropyBytes[i]);
|
||
}
|
||
}
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js
|
||
/*!
|
||
* Basic Javascript Elliptic Curve implementation
|
||
* Ported loosely from BouncyCastle's Java EC code
|
||
* Only Fp curves implemented for now
|
||
*
|
||
* Copyright Tom Wu, bitaddress.org BSD License.
|
||
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
|
||
*/
|
||
(function () {
|
||
|
||
// Constructor function of Global EllipticCurve object
|
||
var ec = window.EllipticCurve = function () { };
|
||
|
||
|
||
// ----------------
|
||
// ECFieldElementFp constructor
|
||
// q instanceof BigInteger
|
||
// x instanceof BigInteger
|
||
ec.FieldElementFp = function (q, x) {
|
||
this.x = x;
|
||
// TODO if(x.compareTo(q) >= 0) error
|
||
this.q = q;
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.equals = function (other) {
|
||
if (other == this) return true;
|
||
return (this.q.equals(other.q) && this.x.equals(other.x));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.toBigInteger = function () {
|
||
return this.x;
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.negate = function () {
|
||
return new ec.FieldElementFp(this.q, this.x.negate().mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.add = function (b) {
|
||
return new ec.FieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.subtract = function (b) {
|
||
return new ec.FieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.multiply = function (b) {
|
||
return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.square = function () {
|
||
return new ec.FieldElementFp(this.q, this.x.square().mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.divide = function (b) {
|
||
return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
|
||
};
|
||
|
||
ec.FieldElementFp.prototype.getByteLength = function () {
|
||
return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
|
||
};
|
||
|
||
// D.1.4 91
|
||
/**
|
||
* return a sqrt root - the routine verifies that the calculation
|
||
* returns the right value - if none exists it returns null.
|
||
*
|
||
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
|
||
* Ported to JavaScript by bitaddress.org
|
||
*/
|
||
ec.FieldElementFp.prototype.sqrt = function () {
|
||
if (!this.q.testBit(0)) throw new Error("even value of q");
|
||
|
||
// p mod 4 == 3
|
||
if (this.q.testBit(1)) {
|
||
// z = g^(u+1) + p, p = 4u + 3
|
||
var z = new ec.FieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q));
|
||
return z.square().equals(this) ? z : null;
|
||
}
|
||
|
||
// p mod 4 == 1
|
||
var qMinusOne = this.q.subtract(BigInteger.ONE);
|
||
var legendreExponent = qMinusOne.shiftRight(1);
|
||
if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) return null;
|
||
var u = qMinusOne.shiftRight(2);
|
||
var k = u.shiftLeft(1).add(BigInteger.ONE);
|
||
var Q = this.x;
|
||
var fourQ = Q.shiftLeft(2).mod(this.q);
|
||
var U, V;
|
||
|
||
do {
|
||
var rand = new SecureRandom();
|
||
var P;
|
||
do {
|
||
P = new BigInteger(this.q.bitLength(), rand);
|
||
}
|
||
while (P.compareTo(this.q) >= 0 || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));
|
||
|
||
var result = ec.FieldElementFp.fastLucasSequence(this.q, P, Q, k);
|
||
|
||
U = result[0];
|
||
V = result[1];
|
||
if (V.multiply(V).mod(this.q).equals(fourQ)) {
|
||
// Integer division by 2, mod q
|
||
if (V.testBit(0)) {
|
||
V = V.add(this.q);
|
||
}
|
||
V = V.shiftRight(1);
|
||
return new ec.FieldElementFp(this.q, V);
|
||
}
|
||
}
|
||
while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));
|
||
|
||
return null;
|
||
};
|
||
|
||
/*
|
||
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
|
||
* Ported to JavaScript by bitaddress.org
|
||
*/
|
||
ec.FieldElementFp.fastLucasSequence = function (p, P, Q, k) {
|
||
// TODO Research and apply "common-multiplicand multiplication here"
|
||
|
||
var n = k.bitLength();
|
||
var s = k.getLowestSetBit();
|
||
var Uh = BigInteger.ONE;
|
||
var Vl = BigInteger.TWO;
|
||
var Vh = P;
|
||
var Ql = BigInteger.ONE;
|
||
var Qh = BigInteger.ONE;
|
||
|
||
for (var j = n - 1; j >= s + 1; --j) {
|
||
Ql = Ql.multiply(Qh).mod(p);
|
||
if (k.testBit(j)) {
|
||
Qh = Ql.multiply(Q).mod(p);
|
||
Uh = Uh.multiply(Vh).mod(p);
|
||
Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
|
||
Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p);
|
||
}
|
||
else {
|
||
Qh = Ql;
|
||
Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
|
||
Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
|
||
Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
|
||
}
|
||
}
|
||
|
||
Ql = Ql.multiply(Qh).mod(p);
|
||
Qh = Ql.multiply(Q).mod(p);
|
||
Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
|
||
Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
|
||
Ql = Ql.multiply(Qh).mod(p);
|
||
|
||
for (var j = 1; j <= s; ++j) {
|
||
Uh = Uh.multiply(Vl).mod(p);
|
||
Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
|
||
Ql = Ql.multiply(Ql).mod(p);
|
||
}
|
||
|
||
return [Uh, Vl];
|
||
};
|
||
|
||
// ----------------
|
||
// ECPointFp constructor
|
||
ec.PointFp = function (curve, x, y, z, compressed) {
|
||
this.curve = curve;
|
||
this.x = x;
|
||
this.y = y;
|
||
// Projective coordinates: either zinv == null or z * zinv == 1
|
||
// z and zinv are just BigIntegers, not fieldElements
|
||
if (z == null) {
|
||
this.z = BigInteger.ONE;
|
||
}
|
||
else {
|
||
this.z = z;
|
||
}
|
||
this.zinv = null;
|
||
// compression flag
|
||
this.compressed = !!compressed;
|
||
};
|
||
|
||
ec.PointFp.prototype.getX = function () {
|
||
if (this.zinv == null) {
|
||
this.zinv = this.z.modInverse(this.curve.q);
|
||
}
|
||
var r = this.x.toBigInteger().multiply(this.zinv);
|
||
this.curve.reduce(r);
|
||
return this.curve.fromBigInteger(r);
|
||
};
|
||
|
||
ec.PointFp.prototype.getY = function () {
|
||
if (this.zinv == null) {
|
||
this.zinv = this.z.modInverse(this.curve.q);
|
||
}
|
||
var r = this.y.toBigInteger().multiply(this.zinv);
|
||
this.curve.reduce(r);
|
||
return this.curve.fromBigInteger(r);
|
||
};
|
||
|
||
ec.PointFp.prototype.equals = function (other) {
|
||
if (other == this) return true;
|
||
if (this.isInfinity()) return other.isInfinity();
|
||
if (other.isInfinity()) return this.isInfinity();
|
||
var u, v;
|
||
// u = Y2 * Z1 - Y1 * Z2
|
||
u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
|
||
if (!u.equals(BigInteger.ZERO)) return false;
|
||
// v = X2 * Z1 - X1 * Z2
|
||
v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
|
||
return v.equals(BigInteger.ZERO);
|
||
};
|
||
|
||
ec.PointFp.prototype.isInfinity = function () {
|
||
if ((this.x == null) && (this.y == null)) return true;
|
||
return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
|
||
};
|
||
|
||
ec.PointFp.prototype.negate = function () {
|
||
return new ec.PointFp(this.curve, this.x, this.y.negate(), this.z);
|
||
};
|
||
|
||
ec.PointFp.prototype.add = function (b) {
|
||
if (this.isInfinity()) return b;
|
||
if (b.isInfinity()) return this;
|
||
|
||
// u = Y2 * Z1 - Y1 * Z2
|
||
var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
|
||
// v = X2 * Z1 - X1 * Z2
|
||
var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);
|
||
|
||
|
||
if (BigInteger.ZERO.equals(v)) {
|
||
if (BigInteger.ZERO.equals(u)) {
|
||
return this.twice(); // this == b, so double
|
||
}
|
||
return this.curve.getInfinity(); // this = -b, so infinity
|
||
}
|
||
|
||
var THREE = new BigInteger("3");
|
||
var x1 = this.x.toBigInteger();
|
||
var y1 = this.y.toBigInteger();
|
||
var x2 = b.x.toBigInteger();
|
||
var y2 = b.y.toBigInteger();
|
||
|
||
var v2 = v.square();
|
||
var v3 = v2.multiply(v);
|
||
var x1v2 = x1.multiply(v2);
|
||
var zu2 = u.square().multiply(this.z);
|
||
|
||
// x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
|
||
var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
|
||
// y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
|
||
var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
|
||
// z3 = v^3 * z1 * z2
|
||
var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);
|
||
|
||
return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
|
||
};
|
||
|
||
ec.PointFp.prototype.twice = function () {
|
||
if (this.isInfinity()) return this;
|
||
if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
|
||
|
||
// TODO: optimized handling of constants
|
||
var THREE = new BigInteger("3");
|
||
var x1 = this.x.toBigInteger();
|
||
var y1 = this.y.toBigInteger();
|
||
|
||
var y1z1 = y1.multiply(this.z);
|
||
var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
|
||
var a = this.curve.a.toBigInteger();
|
||
|
||
// w = 3 * x1^2 + a * z1^2
|
||
var w = x1.square().multiply(THREE);
|
||
if (!BigInteger.ZERO.equals(a)) {
|
||
w = w.add(this.z.square().multiply(a));
|
||
}
|
||
w = w.mod(this.curve.q);
|
||
//this.curve.reduce(w);
|
||
// x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
|
||
var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
|
||
// y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
|
||
var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
|
||
// z3 = 8 * (y1 * z1)^3
|
||
var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);
|
||
|
||
return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
|
||
};
|
||
|
||
// Simple NAF (Non-Adjacent Form) multiplication algorithm
|
||
// TODO: modularize the multiplication algorithm
|
||
ec.PointFp.prototype.multiply = function (k) {
|
||
if (this.isInfinity()) return this;
|
||
if (k.signum() == 0) return this.curve.getInfinity();
|
||
|
||
var e = k;
|
||
var h = e.multiply(new BigInteger("3"));
|
||
|
||
var neg = this.negate();
|
||
var R = this;
|
||
|
||
var i;
|
||
for (i = h.bitLength() - 2; i > 0; --i) {
|
||
R = R.twice();
|
||
|
||
var hBit = h.testBit(i);
|
||
var eBit = e.testBit(i);
|
||
|
||
if (hBit != eBit) {
|
||
R = R.add(hBit ? this : neg);
|
||
}
|
||
}
|
||
|
||
return R;
|
||
};
|
||
|
||
// Compute this*j + x*k (simultaneous multiplication)
|
||
ec.PointFp.prototype.multiplyTwo = function (j, x, k) {
|
||
var i;
|
||
if (j.bitLength() > k.bitLength())
|
||
i = j.bitLength() - 1;
|
||
else
|
||
i = k.bitLength() - 1;
|
||
|
||
var R = this.curve.getInfinity();
|
||
var both = this.add(x);
|
||
while (i >= 0) {
|
||
R = R.twice();
|
||
if (j.testBit(i)) {
|
||
if (k.testBit(i)) {
|
||
R = R.add(both);
|
||
}
|
||
else {
|
||
R = R.add(this);
|
||
}
|
||
}
|
||
else {
|
||
if (k.testBit(i)) {
|
||
R = R.add(x);
|
||
}
|
||
}
|
||
--i;
|
||
}
|
||
|
||
return R;
|
||
};
|
||
|
||
// patched by bitaddress.org and Casascius for use with Bitcoin.ECKey
|
||
// patched by coretechs to support compressed public keys
|
||
ec.PointFp.prototype.getEncoded = function (compressed) {
|
||
var x = this.getX().toBigInteger();
|
||
var y = this.getY().toBigInteger();
|
||
var len = 32; // integerToBytes will zero pad if integer is less than 32 bytes. 32 bytes length is required by the Bitcoin protocol.
|
||
var enc = ec.integerToBytes(x, len);
|
||
|
||
// when compressed prepend byte depending if y point is even or odd
|
||
if (compressed) {
|
||
if (y.isEven()) {
|
||
enc.unshift(0x02);
|
||
}
|
||
else {
|
||
enc.unshift(0x03);
|
||
}
|
||
}
|
||
else {
|
||
enc.unshift(0x04);
|
||
enc = enc.concat(ec.integerToBytes(y, len)); // uncompressed public key appends the bytes of the y point
|
||
}
|
||
return enc;
|
||
};
|
||
|
||
ec.PointFp.decodeFrom = function (curve, enc) {
|
||
var type = enc[0];
|
||
var dataLen = enc.length - 1;
|
||
|
||
// Extract x and y as byte arrays
|
||
var xBa = enc.slice(1, 1 + dataLen / 2);
|
||
var yBa = enc.slice(1 + dataLen / 2, 1 + dataLen);
|
||
|
||
// Prepend zero byte to prevent interpretation as negative integer
|
||
xBa.unshift(0);
|
||
yBa.unshift(0);
|
||
|
||
// Convert to BigIntegers
|
||
var x = new BigInteger(xBa);
|
||
var y = new BigInteger(yBa);
|
||
|
||
// Return point
|
||
return new ec.PointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
|
||
};
|
||
|
||
ec.PointFp.prototype.add2D = function (b) {
|
||
if (this.isInfinity()) return b;
|
||
if (b.isInfinity()) return this;
|
||
|
||
if (this.x.equals(b.x)) {
|
||
if (this.y.equals(b.y)) {
|
||
// this = b, i.e. this must be doubled
|
||
return this.twice();
|
||
}
|
||
// this = -b, i.e. the result is the point at infinity
|
||
return this.curve.getInfinity();
|
||
}
|
||
|
||
var x_x = b.x.subtract(this.x);
|
||
var y_y = b.y.subtract(this.y);
|
||
var gamma = y_y.divide(x_x);
|
||
|
||
var x3 = gamma.square().subtract(this.x).subtract(b.x);
|
||
var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
|
||
|
||
return new ec.PointFp(this.curve, x3, y3);
|
||
};
|
||
|
||
ec.PointFp.prototype.twice2D = function () {
|
||
if (this.isInfinity()) return this;
|
||
if (this.y.toBigInteger().signum() == 0) {
|
||
// if y1 == 0, then (x1, y1) == (x1, -y1)
|
||
// and hence this = -this and thus 2(x1, y1) == infinity
|
||
return this.curve.getInfinity();
|
||
}
|
||
|
||
var TWO = this.curve.fromBigInteger(BigInteger.valueOf(2));
|
||
var THREE = this.curve.fromBigInteger(BigInteger.valueOf(3));
|
||
var gamma = this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO));
|
||
|
||
var x3 = gamma.square().subtract(this.x.multiply(TWO));
|
||
var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
|
||
|
||
return new ec.PointFp(this.curve, x3, y3);
|
||
};
|
||
|
||
ec.PointFp.prototype.multiply2D = function (k) {
|
||
if (this.isInfinity()) return this;
|
||
if (k.signum() == 0) return this.curve.getInfinity();
|
||
|
||
var e = k;
|
||
var h = e.multiply(new BigInteger("3"));
|
||
|
||
var neg = this.negate();
|
||
var R = this;
|
||
|
||
var i;
|
||
for (i = h.bitLength() - 2; i > 0; --i) {
|
||
R = R.twice();
|
||
|
||
var hBit = h.testBit(i);
|
||
var eBit = e.testBit(i);
|
||
|
||
if (hBit != eBit) {
|
||
R = R.add2D(hBit ? this : neg);
|
||
}
|
||
}
|
||
|
||
return R;
|
||
};
|
||
|
||
ec.PointFp.prototype.isOnCurve = function () {
|
||
var x = this.getX().toBigInteger();
|
||
var y = this.getY().toBigInteger();
|
||
var a = this.curve.getA().toBigInteger();
|
||
var b = this.curve.getB().toBigInteger();
|
||
var n = this.curve.getQ();
|
||
var lhs = y.multiply(y).mod(n);
|
||
var rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n);
|
||
return lhs.equals(rhs);
|
||
};
|
||
|
||
ec.PointFp.prototype.toString = function () {
|
||
return '(' + this.getX().toBigInteger().toString() + ',' + this.getY().toBigInteger().toString() + ')';
|
||
};
|
||
|
||
/**
|
||
* Validate an elliptic curve point.
|
||
*
|
||
* See SEC 1, section 3.2.2.1: Elliptic Curve Public Key Validation Primitive
|
||
*/
|
||
ec.PointFp.prototype.validate = function () {
|
||
var n = this.curve.getQ();
|
||
|
||
// Check Q != O
|
||
if (this.isInfinity()) {
|
||
throw new Error("Point is at infinity.");
|
||
}
|
||
|
||
// Check coordinate bounds
|
||
var x = this.getX().toBigInteger();
|
||
var y = this.getY().toBigInteger();
|
||
if (x.compareTo(BigInteger.ONE) < 0 || x.compareTo(n.subtract(BigInteger.ONE)) > 0) {
|
||
throw new Error('x coordinate out of bounds');
|
||
}
|
||
if (y.compareTo(BigInteger.ONE) < 0 || y.compareTo(n.subtract(BigInteger.ONE)) > 0) {
|
||
throw new Error('y coordinate out of bounds');
|
||
}
|
||
|
||
// Check y^2 = x^3 + ax + b (mod n)
|
||
if (!this.isOnCurve()) {
|
||
throw new Error("Point is not on the curve.");
|
||
}
|
||
|
||
// Check nQ = 0 (Q is a scalar multiple of G)
|
||
if (this.multiply(n).isInfinity()) {
|
||
// TODO: This check doesn't work - fix.
|
||
throw new Error("Point is not a scalar multiple of G.");
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
|
||
|
||
|
||
// ----------------
|
||
// ECCurveFp constructor
|
||
ec.CurveFp = function (q, a, b) {
|
||
this.q = q;
|
||
this.a = this.fromBigInteger(a);
|
||
this.b = this.fromBigInteger(b);
|
||
this.infinity = new ec.PointFp(this, null, null);
|
||
this.reducer = new Barrett(this.q);
|
||
}
|
||
|
||
ec.CurveFp.prototype.getQ = function () {
|
||
return this.q;
|
||
};
|
||
|
||
ec.CurveFp.prototype.getA = function () {
|
||
return this.a;
|
||
};
|
||
|
||
ec.CurveFp.prototype.getB = function () {
|
||
return this.b;
|
||
};
|
||
|
||
ec.CurveFp.prototype.equals = function (other) {
|
||
if (other == this) return true;
|
||
return (this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));
|
||
};
|
||
|
||
ec.CurveFp.prototype.getInfinity = function () {
|
||
return this.infinity;
|
||
};
|
||
|
||
ec.CurveFp.prototype.fromBigInteger = function (x) {
|
||
return new ec.FieldElementFp(this.q, x);
|
||
};
|
||
|
||
ec.CurveFp.prototype.reduce = function (x) {
|
||
this.reducer.reduce(x);
|
||
};
|
||
|
||
// for now, work with hex strings because they're easier in JS
|
||
// compressed support added by bitaddress.org
|
||
ec.CurveFp.prototype.decodePointHex = function (s) {
|
||
var firstByte = parseInt(s.substr(0, 2), 16);
|
||
switch (firstByte) { // first byte
|
||
case 0:
|
||
return this.infinity;
|
||
case 2: // compressed
|
||
case 3: // compressed
|
||
var yTilde = firstByte & 1;
|
||
var xHex = s.substr(2, s.length - 2);
|
||
var X1 = new BigInteger(xHex, 16);
|
||
return this.decompressPoint(yTilde, X1);
|
||
case 4: // uncompressed
|
||
case 6: // hybrid
|
||
case 7: // hybrid
|
||
var len = (s.length - 2) / 2;
|
||
var xHex = s.substr(2, len);
|
||
var yHex = s.substr(len + 2, len);
|
||
|
||
return new ec.PointFp(this,
|
||
this.fromBigInteger(new BigInteger(xHex, 16)),
|
||
this.fromBigInteger(new BigInteger(yHex, 16)));
|
||
|
||
default: // unsupported
|
||
return null;
|
||
}
|
||
};
|
||
|
||
ec.CurveFp.prototype.encodePointHex = function (p) {
|
||
if (p.isInfinity()) return "00";
|
||
var xHex = p.getX().toBigInteger().toString(16);
|
||
var yHex = p.getY().toBigInteger().toString(16);
|
||
var oLen = this.getQ().toString(16).length;
|
||
if ((oLen % 2) != 0) oLen++;
|
||
while (xHex.length < oLen) {
|
||
xHex = "0" + xHex;
|
||
}
|
||
while (yHex.length < oLen) {
|
||
yHex = "0" + yHex;
|
||
}
|
||
return "04" + xHex + yHex;
|
||
};
|
||
|
||
/*
|
||
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
|
||
* Ported to JavaScript by bitaddress.org
|
||
*
|
||
* Number yTilde
|
||
* BigInteger X1
|
||
*/
|
||
ec.CurveFp.prototype.decompressPoint = function (yTilde, X1) {
|
||
var x = this.fromBigInteger(X1);
|
||
var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
|
||
var beta = alpha.sqrt();
|
||
// if we can't find a sqrt we haven't got a point on the curve - run!
|
||
if (beta == null) throw new Error("Invalid point compression");
|
||
var betaValue = beta.toBigInteger();
|
||
var bit0 = betaValue.testBit(0) ? 1 : 0;
|
||
if (bit0 != yTilde) {
|
||
// Use the other root
|
||
beta = this.fromBigInteger(this.getQ().subtract(betaValue));
|
||
}
|
||
return new ec.PointFp(this, x, beta, null, true);
|
||
};
|
||
|
||
|
||
ec.fromHex = function (s) { return new BigInteger(s, 16); };
|
||
|
||
ec.integerToBytes = function (i, len) {
|
||
var bytes = i.toByteArrayUnsigned();
|
||
if (len < bytes.length) {
|
||
bytes = bytes.slice(bytes.length - len);
|
||
} else while (len > bytes.length) {
|
||
bytes.unshift(0);
|
||
}
|
||
return bytes;
|
||
};
|
||
|
||
|
||
// Named EC curves
|
||
// ----------------
|
||
// X9ECParameters constructor
|
||
ec.X9Parameters = function (curve, g, n, h) {
|
||
this.curve = curve;
|
||
this.g = g;
|
||
this.n = n;
|
||
this.h = h;
|
||
}
|
||
ec.X9Parameters.prototype.getCurve = function () { return this.curve; };
|
||
ec.X9Parameters.prototype.getG = function () { return this.g; };
|
||
ec.X9Parameters.prototype.getN = function () { return this.n; };
|
||
ec.X9Parameters.prototype.getH = function () { return this.h; };
|
||
|
||
// secp256k1 is the Curve used by Bitcoin
|
||
ec.secNamedCurves = {
|
||
// used by Bitcoin
|
||
"secp256k1": function () {
|
||
// p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
|
||
var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
|
||
var a = BigInteger.ZERO;
|
||
var b = ec.fromHex("7");
|
||
var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
|
||
var h = BigInteger.ONE;
|
||
var curve = new ec.CurveFp(p, a, b);
|
||
var G = curve.decodePointHex("04"
|
||
+ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
|
||
+ "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
|
||
return new ec.X9Parameters(curve, G, n, h);
|
||
}
|
||
};
|
||
|
||
// secp256k1 called by Bitcoin's ECKEY
|
||
ec.getSECCurveByName = function (name) {
|
||
if (ec.secNamedCurves[name] == undefined) return null;
|
||
return ec.secNamedCurves[name]();
|
||
}
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
// secrets.js - by Alexander Stetsyuk - released under MIT License
|
||
(function(exports, global){
|
||
var defaults = {
|
||
bits: 8, // default number of bits
|
||
radix: 16, // work with HEX by default
|
||
minBits: 3,
|
||
maxBits: 20, // this permits 1,048,575 shares, though going this high is NOT recommended in JS!
|
||
|
||
bytesPerChar: 2,
|
||
maxBytesPerChar: 6, // Math.pow(256,7) > Math.pow(2,53)
|
||
|
||
// Primitive polynomials (in decimal form) for Galois Fields GF(2^n), for 2 <= n <= 30
|
||
// The index of each term in the array corresponds to the n for that polynomial
|
||
// i.e. to get the polynomial for n=16, use primitivePolynomials[16]
|
||
primitivePolynomials: [null,null,1,3,3,5,3,3,29,17,9,5,83,27,43,3,45,9,39,39,9,5,3,33,27,9,71,39,9,5,83],
|
||
|
||
// warning for insecure PRNG
|
||
warning: 'WARNING:\nA secure random number generator was not found.\nUsing Math.random(), which is NOT cryptographically strong!'
|
||
};
|
||
|
||
// Protected settings object
|
||
var config = {};
|
||
|
||
/** @expose **/
|
||
exports.getConfig = function(){
|
||
return {
|
||
'bits': config.bits,
|
||
'unsafePRNG': config.unsafePRNG
|
||
};
|
||
};
|
||
|
||
function init(bits){
|
||
if(bits && (typeof bits !== 'number' || bits%1 !== 0 || bits<defaults.minBits || bits>defaults.maxBits)){
|
||
throw new Error('Number of bits must be an integer between ' + defaults.minBits + ' and ' + defaults.maxBits + ', inclusive.')
|
||
}
|
||
|
||
config.radix = defaults.radix;
|
||
config.bits = bits || defaults.bits;
|
||
config.size = Math.pow(2, config.bits);
|
||
config.max = config.size - 1;
|
||
|
||
// Construct the exp and log tables for multiplication.
|
||
var logs = [], exps = [], x = 1, primitive = defaults.primitivePolynomials[config.bits];
|
||
for(var i=0; i<config.size; i++){
|
||
exps[i] = x;
|
||
logs[x] = i;
|
||
x <<= 1;
|
||
if(x >= config.size){
|
||
x ^= primitive;
|
||
x &= config.max;
|
||
}
|
||
}
|
||
|
||
config.logs = logs;
|
||
config.exps = exps;
|
||
};
|
||
|
||
/** @expose **/
|
||
exports.init = init;
|
||
|
||
function isInited(){
|
||
if(!config.bits || !config.size || !config.max || !config.logs || !config.exps || config.logs.length !== config.size || config.exps.length !== config.size){
|
||
return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
// Returns a pseudo-random number generator of the form function(bits){}
|
||
// which should output a random string of 1's and 0's of length `bits`
|
||
function getRNG(){
|
||
var randomBits, crypto;
|
||
|
||
function construct(bits, arr, radix, size){
|
||
var str = '',
|
||
i = 0,
|
||
len = arr.length-1;
|
||
while( i<len || (str.length < bits) ){
|
||
str += padLeft(parseInt(arr[i], radix).toString(2), size);
|
||
i++;
|
||
}
|
||
str = str.substr(-bits);
|
||
if( (str.match(/0/g)||[]).length === str.length){ // all zeros?
|
||
return null;
|
||
}else{
|
||
return str;
|
||
}
|
||
}
|
||
|
||
// node.js crypto.randomBytes()
|
||
if(typeof require === 'function' && (crypto=require('crypto')) && (randomBits=crypto['randomBytes'])){
|
||
return function(bits){
|
||
var bytes = Math.ceil(bits/8),
|
||
str = null;
|
||
|
||
while( str === null ){
|
||
str = construct(bits, randomBits(bytes).toString('hex'), 16, 4);
|
||
}
|
||
return str;
|
||
}
|
||
}
|
||
|
||
// browsers with window.crypto.getRandomValues()
|
||
if(global['crypto'] && typeof global['crypto']['getRandomValues'] === 'function' && typeof global['Uint32Array'] === 'function'){
|
||
crypto = global['crypto'];
|
||
return function(bits){
|
||
var elems = Math.ceil(bits/32),
|
||
str = null,
|
||
arr = new global['Uint32Array'](elems);
|
||
|
||
while( str === null ){
|
||
crypto['getRandomValues'](arr);
|
||
str = construct(bits, arr, 10, 32);
|
||
}
|
||
|
||
return str;
|
||
}
|
||
}
|
||
|
||
// A totally insecure RNG!!! (except in Safari)
|
||
// Will produce a warning every time it is called.
|
||
config.unsafePRNG = true;
|
||
warn();
|
||
|
||
var bitsPerNum = 32;
|
||
var max = Math.pow(2,bitsPerNum)-1;
|
||
return function(bits){
|
||
var elems = Math.ceil(bits/bitsPerNum);
|
||
var arr = [], str=null;
|
||
while(str===null){
|
||
for(var i=0; i<elems; i++){
|
||
arr[i] = Math.floor(Math.random() * max + 1);
|
||
}
|
||
str = construct(bits, arr, 10, bitsPerNum);
|
||
}
|
||
return str;
|
||
};
|
||
};
|
||
|
||
// Warn about using insecure rng.
|
||
// Called when Math.random() is being used.
|
||
function warn(){
|
||
global['console']['warn'](defaults.warning);
|
||
if(typeof global['alert'] === 'function' && config.alert){
|
||
global['alert'](defaults.warning);
|
||
}
|
||
}
|
||
|
||
// Set the PRNG to use. If no RNG function is supplied, pick a default using getRNG()
|
||
/** @expose **/
|
||
exports.setRNG = function(rng, alert){
|
||
if(!isInited()){
|
||
this.init();
|
||
}
|
||
config.unsafePRNG=false;
|
||
rng = rng || getRNG();
|
||
|
||
// test the RNG (5 times)
|
||
if(typeof rng !== 'function' || typeof rng(config.bits) !== 'string' || !parseInt(rng(config.bits),2) || rng(config.bits).length > config.bits || rng(config.bits).length < config.bits){
|
||
throw new Error("Random number generator is invalid. Supply an RNG of the form function(bits){} that returns a string containing 'bits' number of random 1's and 0's.")
|
||
}else{
|
||
config.rng = rng;
|
||
}
|
||
config.alert = !!alert;
|
||
|
||
return !!config.unsafePRNG;
|
||
};
|
||
|
||
function isSetRNG(){
|
||
return typeof config.rng === 'function';
|
||
};
|
||
|
||
// Generates a random bits-length number string using the PRNG
|
||
/** @expose **/
|
||
exports.random = function(bits){
|
||
if(!isSetRNG()){
|
||
this.setRNG();
|
||
}
|
||
|
||
if(typeof bits !== 'number' || bits%1 !== 0 || bits < 2){
|
||
throw new Error('Number of bits must be an integer greater than 1.')
|
||
}
|
||
|
||
if(config.unsafePRNG){
|
||
warn();
|
||
}
|
||
return bin2hex(config.rng(bits));
|
||
}
|
||
|
||
// Divides a `secret` number String str expressed in radix `inputRadix` (optional, default 16)
|
||
// into `numShares` shares, each expressed in radix `outputRadix` (optional, default to `inputRadix`),
|
||
// requiring `threshold` number of shares to reconstruct the secret.
|
||
// Optionally, zero-pads the secret to a length that is a multiple of padLength before sharing.
|
||
/** @expose **/
|
||
exports.share = function(secret, numShares, threshold, padLength, withoutPrefix){
|
||
if(!isInited()){
|
||
this.init();
|
||
}
|
||
if(!isSetRNG()){
|
||
this.setRNG();
|
||
}
|
||
|
||
padLength = padLength || 0;
|
||
|
||
if(typeof secret !== 'string'){
|
||
throw new Error('Secret must be a string.');
|
||
}
|
||
if(typeof numShares !== 'number' || numShares%1 !== 0 || numShares < 2){
|
||
throw new Error('Number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive.')
|
||
}
|
||
if(numShares > config.max){
|
||
var neededBits = Math.ceil(Math.log(numShares +1)/Math.LN2);
|
||
throw new Error('Number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive. To create ' + numShares + ' shares, use at least ' + neededBits + ' bits.')
|
||
}
|
||
if(typeof threshold !== 'number' || threshold%1 !== 0 || threshold < 2){
|
||
throw new Error('Threshold number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive.');
|
||
}
|
||
if(threshold > config.max){
|
||
var neededBits = Math.ceil(Math.log(threshold +1)/Math.LN2);
|
||
throw new Error('Threshold number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive. To use a threshold of ' + threshold + ', use at least ' + neededBits + ' bits.');
|
||
}
|
||
if(typeof padLength !== 'number' || padLength%1 !== 0 ){
|
||
throw new Error('Zero-pad length must be an integer greater than 1.');
|
||
}
|
||
|
||
if(config.unsafePRNG){
|
||
warn();
|
||
}
|
||
|
||
secret = '1' + hex2bin(secret); // append a 1 so that we can preserve the correct number of leading zeros in our secret
|
||
secret = split(secret, padLength);
|
||
var x = new Array(numShares), y = new Array(numShares);
|
||
for(var i=0, len = secret.length; i<len; i++){
|
||
var subShares = this._getShares(secret[i], numShares, threshold);
|
||
for(var j=0; j<numShares; j++){
|
||
x[j] = x[j] || subShares[j].x.toString(config.radix);
|
||
y[j] = padLeft(subShares[j].y.toString(2)) + (y[j] ? y[j] : '');
|
||
}
|
||
}
|
||
var padding = config.max.toString(config.radix).length;
|
||
if(withoutPrefix){
|
||
for(var i=0; i<numShares; i++){
|
||
x[i] = bin2hex(y[i]);
|
||
}
|
||
}else{
|
||
for(var i=0; i<numShares; i++){
|
||
x[i] = config.bits.toString(36).toUpperCase() + padLeft(x[i],padding) + bin2hex(y[i]);
|
||
}
|
||
}
|
||
|
||
return x;
|
||
};
|
||
|
||
// This is the basic polynomial generation and evaluation function
|
||
// for a `config.bits`-length secret (NOT an arbitrary length)
|
||
// Note: no error-checking at this stage! If `secrets` is NOT
|
||
// a NUMBER less than 2^bits-1, the output will be incorrect!
|
||
/** @expose **/
|
||
exports._getShares = function(secret, numShares, threshold){
|
||
var shares = [];
|
||
var coeffs = [secret];
|
||
|
||
for(var i=1; i<threshold; i++){
|
||
coeffs[i] = parseInt(config.rng(config.bits),2);
|
||
}
|
||
for(var i=1, len = numShares+1; i<len; i++){
|
||
shares[i-1] = {
|
||
x: i,
|
||
y: horner(i, coeffs)
|
||
}
|
||
}
|
||
return shares;
|
||
};
|
||
|
||
// Polynomial evaluation at `x` using Horner's Method
|
||
// TODO: this can possibly be sped up using other methods
|
||
// NOTE: fx=fx * x + coeff[i] -> exp(log(fx) + log(x)) + coeff[i],
|
||
// so if fx===0, just set fx to coeff[i] because
|
||
// using the exp/log form will result in incorrect value
|
||
function horner(x, coeffs){
|
||
var logx = config.logs[x];
|
||
var fx = 0;
|
||
for(var i=coeffs.length-1; i>=0; i--){
|
||
if(fx === 0){
|
||
fx = coeffs[i];
|
||
continue;
|
||
}
|
||
fx = config.exps[ (logx + config.logs[fx]) % config.max ] ^ coeffs[i];
|
||
}
|
||
return fx;
|
||
};
|
||
|
||
function inArray(arr,val){
|
||
for(var i = 0,len=arr.length; i < len; i++) {
|
||
if(arr[i] === val){
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
|
||
function processShare(share){
|
||
|
||
var bits = parseInt(share[0], 36);
|
||
if(bits && (typeof bits !== 'number' || bits%1 !== 0 || bits<defaults.minBits || bits>defaults.maxBits)){
|
||
throw new Error('Number of bits must be an integer between ' + defaults.minBits + ' and ' + defaults.maxBits + ', inclusive.')
|
||
}
|
||
|
||
var max = Math.pow(2, bits) - 1;
|
||
var idLength = max.toString(config.radix).length;
|
||
|
||
var id = parseInt(share.substr(1, idLength), config.radix);
|
||
if(typeof id !== 'number' || id%1 !== 0 || id<1 || id>max){
|
||
throw new Error('Share id must be an integer between 1 and ' + config.max + ', inclusive.');
|
||
}
|
||
share = share.substr(idLength + 1);
|
||
if(!share.length){
|
||
throw new Error('Invalid share: zero-length share.')
|
||
}
|
||
return {
|
||
'bits': bits,
|
||
'id': id,
|
||
'value': share
|
||
};
|
||
};
|
||
|
||
/** @expose **/
|
||
exports._processShare = processShare;
|
||
|
||
// Protected method that evaluates the Lagrange interpolation
|
||
// polynomial at x=`at` for individual config.bits-length
|
||
// segments of each share in the `shares` Array.
|
||
// Each share is expressed in base `inputRadix`. The output
|
||
// is expressed in base `outputRadix'
|
||
function combine(at, shares){
|
||
var setBits, share, x = [], y = [], result = '', idx;
|
||
|
||
for(var i=0, len = shares.length; i<len; i++){
|
||
share = processShare(shares[i]);
|
||
if(typeof setBits === 'undefined'){
|
||
setBits = share['bits'];
|
||
}else if(share['bits'] !== setBits){
|
||
throw new Error('Mismatched shares: Different bit settings.')
|
||
}
|
||
|
||
if(config.bits !== setBits){
|
||
init(setBits);
|
||
}
|
||
|
||
if(inArray(x, share['id'])){ // repeated x value?
|
||
continue;
|
||
}
|
||
|
||
idx = x.push(share['id']) - 1;
|
||
share = split(hex2bin(share['value']));
|
||
for(var j=0, len2 = share.length; j<len2; j++){
|
||
y[j] = y[j] || [];
|
||
y[j][idx] = share[j];
|
||
}
|
||
}
|
||
|
||
for(var i=0, len=y.length; i<len; i++){
|
||
result = padLeft(lagrange(at, x, y[i]).toString(2)) + result;
|
||
}
|
||
|
||
if(at===0){// reconstructing the secret
|
||
var idx = result.indexOf('1'); //find the first 1
|
||
return bin2hex(result.slice(idx+1));
|
||
}else{// generating a new share
|
||
return bin2hex(result);
|
||
}
|
||
};
|
||
|
||
// Combine `shares` Array into the original secret
|
||
/** @expose **/
|
||
exports.combine = function(shares){
|
||
return combine(0, shares);
|
||
};
|
||
|
||
// Generate a new share with id `id` (a number between 1 and 2^bits-1)
|
||
// `id` can be a Number or a String in the default radix (16)
|
||
/** @expose **/
|
||
exports.newShare = function(id, shares){
|
||
if(typeof id === 'string'){
|
||
id = parseInt(id, config.radix);
|
||
}
|
||
|
||
var share = processShare(shares[0]);
|
||
var max = Math.pow(2, share['bits']) - 1;
|
||
|
||
if(typeof id !== 'number' || id%1 !== 0 || id<1 || id>max){
|
||
throw new Error('Share id must be an integer between 1 and ' + config.max + ', inclusive.');
|
||
}
|
||
|
||
var padding = max.toString(config.radix).length;
|
||
return config.bits.toString(36).toUpperCase() + padLeft(id.toString(config.radix), padding) + combine(id, shares);
|
||
};
|
||
|
||
// Evaluate the Lagrange interpolation polynomial at x = `at`
|
||
// using x and y Arrays that are of the same length, with
|
||
// corresponding elements constituting points on the polynomial.
|
||
function lagrange(at, x, y){
|
||
var sum = 0,
|
||
product,
|
||
i, j;
|
||
|
||
for(var i=0, len = x.length; i<len; i++){
|
||
if(!y[i]){
|
||
continue;
|
||
}
|
||
|
||
product = config.logs[y[i]];
|
||
for(var j=0; j<len; j++){
|
||
if(i === j){ continue; }
|
||
if(at === x[j]){ // happens when computing a share that is in the list of shares used to compute it
|
||
product = -1; // fix for a zero product term, after which the sum should be sum^0 = sum, not sum^1
|
||
break;
|
||
}
|
||
product = ( product + config.logs[at ^ x[j]] - config.logs[x[i] ^ x[j]] + config.max/* to make sure it's not negative */ ) % config.max;
|
||
}
|
||
|
||
sum = product === -1 ? sum : sum ^ config.exps[product]; // though exps[-1]= undefined and undefined ^ anything = anything in chrome, this behavior may not hold everywhere, so do the check
|
||
}
|
||
return sum;
|
||
};
|
||
|
||
/** @expose **/
|
||
exports._lagrange = lagrange;
|
||
|
||
// Splits a number string `bits`-length segments, after first
|
||
// optionally zero-padding it to a length that is a multiple of `padLength.
|
||
// Returns array of integers (each less than 2^bits-1), with each element
|
||
// representing a `bits`-length segment of the input string from right to left,
|
||
// i.e. parts[0] represents the right-most `bits`-length segment of the input string.
|
||
function split(str, padLength){
|
||
if(padLength){
|
||
str = padLeft(str, padLength)
|
||
}
|
||
var parts = [];
|
||
for(var i=str.length; i>config.bits; i-=config.bits){
|
||
parts.push(parseInt(str.slice(i-config.bits, i), 2));
|
||
}
|
||
parts.push(parseInt(str.slice(0, i), 2));
|
||
return parts;
|
||
};
|
||
|
||
// Pads a string `str` with zeros on the left so that its length is a multiple of `bits`
|
||
function padLeft(str, bits){
|
||
bits = bits || config.bits
|
||
var missing = str.length % bits;
|
||
return (missing ? new Array(bits - missing + 1).join('0') : '') + str;
|
||
};
|
||
|
||
function hex2bin(str){
|
||
var bin = '', num;
|
||
for(var i=str.length - 1; i>=0; i--){
|
||
num = parseInt(str[i], 16)
|
||
if(isNaN(num)){
|
||
throw new Error('Invalid hex character.')
|
||
}
|
||
bin = padLeft(num.toString(2), 4) + bin;
|
||
}
|
||
return bin;
|
||
}
|
||
|
||
function bin2hex(str){
|
||
var hex = '', num;
|
||
str = padLeft(str, 4);
|
||
for(var i=str.length; i>=4; i-=4){
|
||
num = parseInt(str.slice(i-4, i), 2);
|
||
if(isNaN(num)){
|
||
throw new Error('Invalid binary character.')
|
||
}
|
||
hex = num.toString(16) + hex;
|
||
}
|
||
return hex;
|
||
}
|
||
|
||
// Converts a given UTF16 character string to the HEX representation.
|
||
// Each character of the input string is represented by
|
||
// `bytesPerChar` bytes in the output string.
|
||
/** @expose **/
|
||
exports.str2hex = function(str, bytesPerChar){
|
||
if(typeof str !== 'string'){
|
||
throw new Error('Input must be a character string.');
|
||
}
|
||
bytesPerChar = bytesPerChar || defaults.bytesPerChar;
|
||
|
||
if(typeof bytesPerChar !== 'number' || bytesPerChar%1 !== 0 || bytesPerChar<1 || bytesPerChar > defaults.maxBytesPerChar){
|
||
throw new Error('Bytes per character must be an integer between 1 and ' + defaults.maxBytesPerChar + ', inclusive.')
|
||
}
|
||
|
||
var hexChars = 2*bytesPerChar;
|
||
var max = Math.pow(16, hexChars) - 1;
|
||
var out = '', num;
|
||
for(var i=0, len=str.length; i<len; i++){
|
||
num = str[i].charCodeAt();
|
||
if(isNaN(num)){
|
||
throw new Error('Invalid character: ' + str[i]);
|
||
}else if(num > max){
|
||
var neededBytes = Math.ceil(Math.log(num+1)/Math.log(256));
|
||
throw new Error('Invalid character code (' + num +'). Maximum allowable is 256^bytes-1 (' + max + '). To convert this character, use at least ' + neededBytes + ' bytes.')
|
||
}else{
|
||
out = padLeft(num.toString(16), hexChars) + out;
|
||
}
|
||
}
|
||
return out;
|
||
};
|
||
|
||
// Converts a given HEX number string to a UTF16 character string.
|
||
/** @expose **/
|
||
exports.hex2str = function(str, bytesPerChar){
|
||
if(typeof str !== 'string'){
|
||
throw new Error('Input must be a hexadecimal string.');
|
||
}
|
||
bytesPerChar = bytesPerChar || defaults.bytesPerChar;
|
||
|
||
if(typeof bytesPerChar !== 'number' || bytesPerChar%1 !== 0 || bytesPerChar<1 || bytesPerChar > defaults.maxBytesPerChar){
|
||
throw new Error('Bytes per character must be an integer between 1 and ' + defaults.maxBytesPerChar + ', inclusive.')
|
||
}
|
||
|
||
var hexChars = 2*bytesPerChar;
|
||
var out = '';
|
||
str = padLeft(str, hexChars);
|
||
for(var i=0, len = str.length; i<len; i+=hexChars){
|
||
out = String.fromCharCode(parseInt(str.slice(i, i+hexChars),16)) + out;
|
||
}
|
||
return out;
|
||
};
|
||
|
||
// by default, initialize without an RNG
|
||
exports.init();
|
||
})(typeof module !== 'undefined' && module['exports'] ? module['exports'] : (window['secrets'] = {}), typeof GLOBAL !== 'undefined' ? GLOBAL : window );
|
||
</script>
|
||
<script type="text/javascript">
|
||
// Upstream 'BigInteger' here:
|
||
// Original Author: http://www-cs-students.stanford.edu/~tjw/jsbn/
|
||
// Follows 'jsbn' on Github: https://github.com/jasondavies/jsbn
|
||
// Review and Testing: https://github.com/cryptocoinjs/bigi/
|
||
/*!
|
||
* Basic JavaScript BN library - subset useful for RSA encryption. v1.4
|
||
*
|
||
* Copyright (c) 2005 Tom Wu
|
||
* All Rights Reserved.
|
||
* BSD License
|
||
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
|
||
*
|
||
* Copyright Stephan Thomas
|
||
* Copyright pointbiz
|
||
*/
|
||
|
||
(function () {
|
||
|
||
// (public) Constructor function of Global BigInteger object
|
||
var BigInteger = window.BigInteger = function BigInteger(a, b, c) {
|
||
if (!(this instanceof BigInteger))
|
||
return new BigInteger(a, b, c);
|
||
|
||
if (a != null)
|
||
if ("number" == typeof a) this.fromNumber(a, b, c);
|
||
else if (b == null && "string" != typeof a) this.fromString(a, 256);
|
||
else this.fromString(a, b);
|
||
};
|
||
|
||
// Bits per digit
|
||
var dbits;
|
||
|
||
// JavaScript engine analysis
|
||
var canary = 0xdeadbeefcafe;
|
||
var j_lm = ((canary & 0xffffff) == 0xefcafe);
|
||
|
||
// return new, unset BigInteger
|
||
function nbi() { return new BigInteger(null); }
|
||
|
||
// am: Compute w_j += (x*this_i), propagate carries,
|
||
// c is initial carry, returns final carry.
|
||
// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
|
||
// We need to select the fastest one that works in this environment.
|
||
|
||
// am1: use a single mult and divide to get the high bits,
|
||
// max digit bits should be 26 because
|
||
// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
|
||
function am1(i, x, w, j, c, n) {
|
||
while (--n >= 0) {
|
||
var v = x * this[i++] + w[j] + c;
|
||
c = Math.floor(v / 0x4000000);
|
||
w[j++] = v & 0x3ffffff;
|
||
}
|
||
return c;
|
||
}
|
||
// am2 avoids a big mult-and-extract completely.
|
||
// Max digit bits should be <= 30 because we do bitwise ops
|
||
// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
|
||
function am2(i, x, w, j, c, n) {
|
||
var xl = x & 0x7fff, xh = x >> 15;
|
||
while (--n >= 0) {
|
||
var l = this[i] & 0x7fff;
|
||
var h = this[i++] >> 15;
|
||
var m = xh * l + h * xl;
|
||
l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
|
||
c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
|
||
w[j++] = l & 0x3fffffff;
|
||
}
|
||
return c;
|
||
}
|
||
// Alternately, set max digit bits to 28 since some
|
||
// browsers slow down when dealing with 32-bit numbers.
|
||
function am3(i, x, w, j, c, n) {
|
||
var xl = x & 0x3fff, xh = x >> 14;
|
||
while (--n >= 0) {
|
||
var l = this[i] & 0x3fff;
|
||
var h = this[i++] >> 14;
|
||
var m = xh * l + h * xl;
|
||
l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
|
||
c = (l >> 28) + (m >> 14) + xh * h;
|
||
w[j++] = l & 0xfffffff;
|
||
}
|
||
return c;
|
||
}
|
||
if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
|
||
BigInteger.prototype.am = am2;
|
||
dbits = 30;
|
||
}
|
||
else if (j_lm && (navigator.appName != "Netscape")) {
|
||
BigInteger.prototype.am = am1;
|
||
dbits = 26;
|
||
}
|
||
else { // Mozilla/Netscape seems to prefer am3
|
||
BigInteger.prototype.am = am3;
|
||
dbits = 28;
|
||
}
|
||
|
||
BigInteger.prototype.DB = dbits;
|
||
BigInteger.prototype.DM = ((1 << dbits) - 1);
|
||
BigInteger.prototype.DV = (1 << dbits);
|
||
|
||
var BI_FP = 52;
|
||
BigInteger.prototype.FV = Math.pow(2, BI_FP);
|
||
BigInteger.prototype.F1 = BI_FP - dbits;
|
||
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
|
||
|
||
// Digit conversions
|
||
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||
var BI_RC = new Array();
|
||
var rr, vv;
|
||
rr = "0".charCodeAt(0);
|
||
for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
|
||
rr = "a".charCodeAt(0);
|
||
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
|
||
rr = "A".charCodeAt(0);
|
||
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
|
||
|
||
function int2char(n) { return BI_RM.charAt(n); }
|
||
function intAt(s, i) {
|
||
var c = BI_RC[s.charCodeAt(i)];
|
||
return (c == null) ? -1 : c;
|
||
}
|
||
|
||
|
||
|
||
// return bigint initialized to value
|
||
function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
|
||
|
||
|
||
// returns bit length of the integer x
|
||
function nbits(x) {
|
||
var r = 1, t;
|
||
if ((t = x >>> 16) != 0) { x = t; r += 16; }
|
||
if ((t = x >> 8) != 0) { x = t; r += 8; }
|
||
if ((t = x >> 4) != 0) { x = t; r += 4; }
|
||
if ((t = x >> 2) != 0) { x = t; r += 2; }
|
||
if ((t = x >> 1) != 0) { x = t; r += 1; }
|
||
return r;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// (protected) copy this to r
|
||
BigInteger.prototype.copyTo = function (r) {
|
||
for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];
|
||
r.t = this.t;
|
||
r.s = this.s;
|
||
};
|
||
|
||
|
||
// (protected) set from integer value x, -DV <= x < DV
|
||
BigInteger.prototype.fromInt = function (x) {
|
||
this.t = 1;
|
||
this.s = (x < 0) ? -1 : 0;
|
||
if (x > 0) this[0] = x;
|
||
else if (x < -1) this[0] = x + this.DV;
|
||
else this.t = 0;
|
||
};
|
||
|
||
// (protected) set from string and radix
|
||
BigInteger.prototype.fromString = function (s, b) {
|
||
var k;
|
||
if (b == 16) k = 4;
|
||
else if (b == 8) k = 3;
|
||
else if (b == 256) k = 8; // byte array
|
||
else if (b == 2) k = 1;
|
||
else if (b == 32) k = 5;
|
||
else if (b == 4) k = 2;
|
||
else { this.fromRadix(s, b); return; }
|
||
this.t = 0;
|
||
this.s = 0;
|
||
var i = s.length, mi = false, sh = 0;
|
||
while (--i >= 0) {
|
||
var x = (k == 8) ? s[i] & 0xff : intAt(s, i);
|
||
if (x < 0) {
|
||
if (s.charAt(i) == "-") mi = true;
|
||
continue;
|
||
}
|
||
mi = false;
|
||
if (sh == 0)
|
||
this[this.t++] = x;
|
||
else if (sh + k > this.DB) {
|
||
this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
|
||
this[this.t++] = (x >> (this.DB - sh));
|
||
}
|
||
else
|
||
this[this.t - 1] |= x << sh;
|
||
sh += k;
|
||
if (sh >= this.DB) sh -= this.DB;
|
||
}
|
||
if (k == 8 && (s[0] & 0x80) != 0) {
|
||
this.s = -1;
|
||
if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
|
||
}
|
||
this.clamp();
|
||
if (mi) BigInteger.ZERO.subTo(this, this);
|
||
};
|
||
|
||
|
||
// (protected) clamp off excess high words
|
||
BigInteger.prototype.clamp = function () {
|
||
var c = this.s & this.DM;
|
||
while (this.t > 0 && this[this.t - 1] == c) --this.t;
|
||
};
|
||
|
||
// (protected) r = this << n*DB
|
||
BigInteger.prototype.dlShiftTo = function (n, r) {
|
||
var i;
|
||
for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];
|
||
for (i = n - 1; i >= 0; --i) r[i] = 0;
|
||
r.t = this.t + n;
|
||
r.s = this.s;
|
||
};
|
||
|
||
// (protected) r = this >> n*DB
|
||
BigInteger.prototype.drShiftTo = function (n, r) {
|
||
for (var i = n; i < this.t; ++i) r[i - n] = this[i];
|
||
r.t = Math.max(this.t - n, 0);
|
||
r.s = this.s;
|
||
};
|
||
|
||
|
||
// (protected) r = this << n
|
||
BigInteger.prototype.lShiftTo = function (n, r) {
|
||
var bs = n % this.DB;
|
||
var cbs = this.DB - bs;
|
||
var bm = (1 << cbs) - 1;
|
||
var ds = Math.floor(n / this.DB), c = (this.s << bs) & this.DM, i;
|
||
for (i = this.t - 1; i >= 0; --i) {
|
||
r[i + ds + 1] = (this[i] >> cbs) | c;
|
||
c = (this[i] & bm) << bs;
|
||
}
|
||
for (i = ds - 1; i >= 0; --i) r[i] = 0;
|
||
r[ds] = c;
|
||
r.t = this.t + ds + 1;
|
||
r.s = this.s;
|
||
r.clamp();
|
||
};
|
||
|
||
|
||
// (protected) r = this >> n
|
||
BigInteger.prototype.rShiftTo = function (n, r) {
|
||
r.s = this.s;
|
||
var ds = Math.floor(n / this.DB);
|
||
if (ds >= this.t) { r.t = 0; return; }
|
||
var bs = n % this.DB;
|
||
var cbs = this.DB - bs;
|
||
var bm = (1 << bs) - 1;
|
||
r[0] = this[ds] >> bs;
|
||
for (var i = ds + 1; i < this.t; ++i) {
|
||
r[i - ds - 1] |= (this[i] & bm) << cbs;
|
||
r[i - ds] = this[i] >> bs;
|
||
}
|
||
if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;
|
||
r.t = this.t - ds;
|
||
r.clamp();
|
||
};
|
||
|
||
|
||
// (protected) r = this - a
|
||
BigInteger.prototype.subTo = function (a, r) {
|
||
var i = 0, c = 0, m = Math.min(a.t, this.t);
|
||
while (i < m) {
|
||
c += this[i] - a[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
if (a.t < this.t) {
|
||
c -= a.s;
|
||
while (i < this.t) {
|
||
c += this[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
c += this.s;
|
||
}
|
||
else {
|
||
c += this.s;
|
||
while (i < a.t) {
|
||
c -= a[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
c -= a.s;
|
||
}
|
||
r.s = (c < 0) ? -1 : 0;
|
||
if (c < -1) r[i++] = this.DV + c;
|
||
else if (c > 0) r[i++] = c;
|
||
r.t = i;
|
||
r.clamp();
|
||
};
|
||
|
||
|
||
// (protected) r = this * a, r != this,a (HAC 14.12)
|
||
// "this" should be the larger one if appropriate.
|
||
BigInteger.prototype.multiplyTo = function (a, r) {
|
||
var x = this.abs(), y = a.abs();
|
||
var i = x.t;
|
||
r.t = i + y.t;
|
||
while (--i >= 0) r[i] = 0;
|
||
for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
|
||
r.s = 0;
|
||
r.clamp();
|
||
if (this.s != a.s) BigInteger.ZERO.subTo(r, r);
|
||
};
|
||
|
||
|
||
// (protected) r = this^2, r != this (HAC 14.16)
|
||
BigInteger.prototype.squareTo = function (r) {
|
||
var x = this.abs();
|
||
var i = r.t = 2 * x.t;
|
||
while (--i >= 0) r[i] = 0;
|
||
for (i = 0; i < x.t - 1; ++i) {
|
||
var c = x.am(i, x[i], r, 2 * i, 0, 1);
|
||
if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
|
||
r[i + x.t] -= x.DV;
|
||
r[i + x.t + 1] = 1;
|
||
}
|
||
}
|
||
if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
|
||
r.s = 0;
|
||
r.clamp();
|
||
};
|
||
|
||
|
||
|
||
// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
|
||
// r != q, this != m. q or r may be null.
|
||
BigInteger.prototype.divRemTo = function (m, q, r) {
|
||
var pm = m.abs();
|
||
if (pm.t <= 0) return;
|
||
var pt = this.abs();
|
||
if (pt.t < pm.t) {
|
||
if (q != null) q.fromInt(0);
|
||
if (r != null) this.copyTo(r);
|
||
return;
|
||
}
|
||
if (r == null) r = nbi();
|
||
var y = nbi(), ts = this.s, ms = m.s;
|
||
var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
|
||
if (nsh > 0) { pm.lShiftTo(nsh, y); pt.lShiftTo(nsh, r); }
|
||
else { pm.copyTo(y); pt.copyTo(r); }
|
||
var ys = y.t;
|
||
var y0 = y[ys - 1];
|
||
if (y0 == 0) return;
|
||
var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
|
||
var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2;
|
||
var i = r.t, j = i - ys, t = (q == null) ? nbi() : q;
|
||
y.dlShiftTo(j, t);
|
||
if (r.compareTo(t) >= 0) {
|
||
r[r.t++] = 1;
|
||
r.subTo(t, r);
|
||
}
|
||
BigInteger.ONE.dlShiftTo(ys, t);
|
||
t.subTo(y, y); // "negative" y so we can replace sub with am later
|
||
while (y.t < ys) y[y.t++] = 0;
|
||
while (--j >= 0) {
|
||
// Estimate quotient digit
|
||
var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
|
||
if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
|
||
y.dlShiftTo(j, t);
|
||
r.subTo(t, r);
|
||
while (r[i] < --qd) r.subTo(t, r);
|
||
}
|
||
}
|
||
if (q != null) {
|
||
r.drShiftTo(ys, q);
|
||
if (ts != ms) BigInteger.ZERO.subTo(q, q);
|
||
}
|
||
r.t = ys;
|
||
r.clamp();
|
||
if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder
|
||
if (ts < 0) BigInteger.ZERO.subTo(r, r);
|
||
};
|
||
|
||
|
||
// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
|
||
// justification:
|
||
// xy == 1 (mod m)
|
||
// xy = 1+km
|
||
// xy(2-xy) = (1+km)(1-km)
|
||
// x[y(2-xy)] = 1-k^2m^2
|
||
// x[y(2-xy)] == 1 (mod m^2)
|
||
// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
|
||
// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
|
||
// JS multiply "overflows" differently from C/C++, so care is needed here.
|
||
BigInteger.prototype.invDigit = function () {
|
||
if (this.t < 1) return 0;
|
||
var x = this[0];
|
||
if ((x & 1) == 0) return 0;
|
||
var y = x & 3; // y == 1/x mod 2^2
|
||
y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
|
||
y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
|
||
y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
|
||
// last step - calculate inverse mod DV directly;
|
||
// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
|
||
y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
|
||
// we really want the negative inverse, and -DV < y < DV
|
||
return (y > 0) ? this.DV - y : -y;
|
||
};
|
||
|
||
|
||
// (protected) true iff this is even
|
||
BigInteger.prototype.isEven = function () { return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; };
|
||
|
||
|
||
// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
|
||
BigInteger.prototype.exp = function (e, z) {
|
||
if (e > 0xffffffff || e < 1) return BigInteger.ONE;
|
||
var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1;
|
||
g.copyTo(r);
|
||
while (--i >= 0) {
|
||
z.sqrTo(r, r2);
|
||
if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);
|
||
else { var t = r; r = r2; r2 = t; }
|
||
}
|
||
return z.revert(r);
|
||
};
|
||
|
||
|
||
// (public) return string representation in given radix
|
||
BigInteger.prototype.toString = function (b) {
|
||
if (this.s < 0) return "-" + this.negate().toString(b);
|
||
var k;
|
||
if (b == 16) k = 4;
|
||
else if (b == 8) k = 3;
|
||
else if (b == 2) k = 1;
|
||
else if (b == 32) k = 5;
|
||
else if (b == 4) k = 2;
|
||
else return this.toRadix(b);
|
||
var km = (1 << k) - 1, d, m = false, r = "", i = this.t;
|
||
var p = this.DB - (i * this.DB) % k;
|
||
if (i-- > 0) {
|
||
if (p < this.DB && (d = this[i] >> p) > 0) { m = true; r = int2char(d); }
|
||
while (i >= 0) {
|
||
if (p < k) {
|
||
d = (this[i] & ((1 << p) - 1)) << (k - p);
|
||
d |= this[--i] >> (p += this.DB - k);
|
||
}
|
||
else {
|
||
d = (this[i] >> (p -= k)) & km;
|
||
if (p <= 0) { p += this.DB; --i; }
|
||
}
|
||
if (d > 0) m = true;
|
||
if (m) r += int2char(d);
|
||
}
|
||
}
|
||
return m ? r : "0";
|
||
};
|
||
|
||
|
||
// (public) -this
|
||
BigInteger.prototype.negate = function () { var r = nbi(); BigInteger.ZERO.subTo(this, r); return r; };
|
||
|
||
// (public) |this|
|
||
BigInteger.prototype.abs = function () { return (this.s < 0) ? this.negate() : this; };
|
||
|
||
// (public) return + if this > a, - if this < a, 0 if equal
|
||
BigInteger.prototype.compareTo = function (a) {
|
||
var r = this.s - a.s;
|
||
if (r != 0) return r;
|
||
var i = this.t;
|
||
r = i - a.t;
|
||
if (r != 0) return (this.s < 0) ? -r : r;
|
||
while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;
|
||
return 0;
|
||
}
|
||
|
||
// (public) return the number of bits in "this"
|
||
BigInteger.prototype.bitLength = function () {
|
||
if (this.t <= 0) return 0;
|
||
return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
|
||
};
|
||
|
||
// (public) this mod a
|
||
BigInteger.prototype.mod = function (a) {
|
||
var r = nbi();
|
||
this.abs().divRemTo(a, null, r);
|
||
if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);
|
||
return r;
|
||
}
|
||
|
||
// (public) this^e % m, 0 <= e < 2^32
|
||
BigInteger.prototype.modPowInt = function (e, m) {
|
||
var z;
|
||
if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
|
||
return this.exp(e, z);
|
||
};
|
||
|
||
// "constants"
|
||
BigInteger.ZERO = nbv(0);
|
||
BigInteger.ONE = nbv(1);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Copyright (c) 2005-2009 Tom Wu
|
||
// All Rights Reserved.
|
||
// See "LICENSE" for details.
|
||
// Extended JavaScript BN functions, required for RSA private ops.
|
||
// Version 1.1: new BigInteger("0", 10) returns "proper" zero
|
||
// Version 1.2: square() API, isProbablePrime fix
|
||
|
||
|
||
// return index of lowest 1-bit in x, x < 2^31
|
||
function lbit(x) {
|
||
if (x == 0) return -1;
|
||
var r = 0;
|
||
if ((x & 0xffff) == 0) { x >>= 16; r += 16; }
|
||
if ((x & 0xff) == 0) { x >>= 8; r += 8; }
|
||
if ((x & 0xf) == 0) { x >>= 4; r += 4; }
|
||
if ((x & 3) == 0) { x >>= 2; r += 2; }
|
||
if ((x & 1) == 0) ++r;
|
||
return r;
|
||
}
|
||
|
||
// return number of 1 bits in x
|
||
function cbit(x) {
|
||
var r = 0;
|
||
while (x != 0) { x &= x - 1; ++r; }
|
||
return r;
|
||
}
|
||
|
||
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];
|
||
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
|
||
|
||
|
||
|
||
// (protected) return x s.t. r^x < DV
|
||
BigInteger.prototype.chunkSize = function (r) { return Math.floor(Math.LN2 * this.DB / Math.log(r)); };
|
||
|
||
// (protected) convert to radix string
|
||
BigInteger.prototype.toRadix = function (b) {
|
||
if (b == null) b = 10;
|
||
if (this.signum() == 0 || b < 2 || b > 36) return "0";
|
||
var cs = this.chunkSize(b);
|
||
var a = Math.pow(b, cs);
|
||
var d = nbv(a), y = nbi(), z = nbi(), r = "";
|
||
this.divRemTo(d, y, z);
|
||
while (y.signum() > 0) {
|
||
r = (a + z.intValue()).toString(b).substr(1) + r;
|
||
y.divRemTo(d, y, z);
|
||
}
|
||
return z.intValue().toString(b) + r;
|
||
};
|
||
|
||
// (protected) convert from radix string
|
||
BigInteger.prototype.fromRadix = function (s, b) {
|
||
this.fromInt(0);
|
||
if (b == null) b = 10;
|
||
var cs = this.chunkSize(b);
|
||
var d = Math.pow(b, cs), mi = false, j = 0, w = 0;
|
||
for (var i = 0; i < s.length; ++i) {
|
||
var x = intAt(s, i);
|
||
if (x < 0) {
|
||
if (s.charAt(i) == "-" && this.signum() == 0) mi = true;
|
||
continue;
|
||
}
|
||
w = b * w + x;
|
||
if (++j >= cs) {
|
||
this.dMultiply(d);
|
||
this.dAddOffset(w, 0);
|
||
j = 0;
|
||
w = 0;
|
||
}
|
||
}
|
||
if (j > 0) {
|
||
this.dMultiply(Math.pow(b, j));
|
||
this.dAddOffset(w, 0);
|
||
}
|
||
if (mi) BigInteger.ZERO.subTo(this, this);
|
||
};
|
||
|
||
// (protected) alternate constructor
|
||
BigInteger.prototype.fromNumber = function (a, b, c) {
|
||
if ("number" == typeof b) {
|
||
// new BigInteger(int,int,RNG)
|
||
if (a < 2) this.fromInt(1);
|
||
else {
|
||
this.fromNumber(a, c);
|
||
if (!this.testBit(a - 1)) // force MSB set
|
||
this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
|
||
if (this.isEven()) this.dAddOffset(1, 0); // force odd
|
||
while (!this.isProbablePrime(b)) {
|
||
this.dAddOffset(2, 0);
|
||
if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
// new BigInteger(int,RNG)
|
||
var x = new Array(), t = a & 7;
|
||
x.length = (a >> 3) + 1;
|
||
b.nextBytes(x);
|
||
if (t > 0) x[0] &= ((1 << t) - 1); else x[0] = 0;
|
||
this.fromString(x, 256);
|
||
}
|
||
};
|
||
|
||
// (protected) r = this op a (bitwise)
|
||
BigInteger.prototype.bitwiseTo = function (a, op, r) {
|
||
var i, f, m = Math.min(a.t, this.t);
|
||
for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);
|
||
if (a.t < this.t) {
|
||
f = a.s & this.DM;
|
||
for (i = m; i < this.t; ++i) r[i] = op(this[i], f);
|
||
r.t = this.t;
|
||
}
|
||
else {
|
||
f = this.s & this.DM;
|
||
for (i = m; i < a.t; ++i) r[i] = op(f, a[i]);
|
||
r.t = a.t;
|
||
}
|
||
r.s = op(this.s, a.s);
|
||
r.clamp();
|
||
};
|
||
|
||
// (protected) this op (1<<n)
|
||
BigInteger.prototype.changeBit = function (n, op) {
|
||
var r = BigInteger.ONE.shiftLeft(n);
|
||
this.bitwiseTo(r, op, r);
|
||
return r;
|
||
};
|
||
|
||
// (protected) r = this + a
|
||
BigInteger.prototype.addTo = function (a, r) {
|
||
var i = 0, c = 0, m = Math.min(a.t, this.t);
|
||
while (i < m) {
|
||
c += this[i] + a[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
if (a.t < this.t) {
|
||
c += a.s;
|
||
while (i < this.t) {
|
||
c += this[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
c += this.s;
|
||
}
|
||
else {
|
||
c += this.s;
|
||
while (i < a.t) {
|
||
c += a[i];
|
||
r[i++] = c & this.DM;
|
||
c >>= this.DB;
|
||
}
|
||
c += a.s;
|
||
}
|
||
r.s = (c < 0) ? -1 : 0;
|
||
if (c > 0) r[i++] = c;
|
||
else if (c < -1) r[i++] = this.DV + c;
|
||
r.t = i;
|
||
r.clamp();
|
||
};
|
||
|
||
// (protected) this *= n, this >= 0, 1 < n < DV
|
||
BigInteger.prototype.dMultiply = function (n) {
|
||
this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
|
||
++this.t;
|
||
this.clamp();
|
||
};
|
||
|
||
// (protected) this += n << w words, this >= 0
|
||
BigInteger.prototype.dAddOffset = function (n, w) {
|
||
if (n == 0) return;
|
||
while (this.t <= w) this[this.t++] = 0;
|
||
this[w] += n;
|
||
while (this[w] >= this.DV) {
|
||
this[w] -= this.DV;
|
||
if (++w >= this.t) this[this.t++] = 0;
|
||
++this[w];
|
||
}
|
||
};
|
||
|
||
// (protected) r = lower n words of "this * a", a.t <= n
|
||
// "this" should be the larger one if appropriate.
|
||
BigInteger.prototype.multiplyLowerTo = function (a, n, r) {
|
||
var i = Math.min(this.t + a.t, n);
|
||
r.s = 0; // assumes a,this >= 0
|
||
r.t = i;
|
||
while (i > 0) r[--i] = 0;
|
||
var j;
|
||
for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
|
||
for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);
|
||
r.clamp();
|
||
};
|
||
|
||
|
||
// (protected) r = "this * a" without lower n words, n > 0
|
||
// "this" should be the larger one if appropriate.
|
||
BigInteger.prototype.multiplyUpperTo = function (a, n, r) {
|
||
--n;
|
||
var i = r.t = this.t + a.t - n;
|
||
r.s = 0; // assumes a,this >= 0
|
||
while (--i >= 0) r[i] = 0;
|
||
for (i = Math.max(n - this.t, 0); i < a.t; ++i)
|
||
r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
|
||
r.clamp();
|
||
r.drShiftTo(1, r);
|
||
};
|
||
|
||
// (protected) this % n, n < 2^26
|
||
BigInteger.prototype.modInt = function (n) {
|
||
if (n <= 0) return 0;
|
||
var d = this.DV % n, r = (this.s < 0) ? n - 1 : 0;
|
||
if (this.t > 0)
|
||
if (d == 0) r = this[0] % n;
|
||
else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;
|
||
return r;
|
||
};
|
||
|
||
|
||
// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
|
||
BigInteger.prototype.millerRabin = function (t) {
|
||
var n1 = this.subtract(BigInteger.ONE);
|
||
var k = n1.getLowestSetBit();
|
||
if (k <= 0) return false;
|
||
var r = n1.shiftRight(k);
|
||
t = (t + 1) >> 1;
|
||
if (t > lowprimes.length) t = lowprimes.length;
|
||
var a = nbi();
|
||
for (var i = 0; i < t; ++i) {
|
||
//Pick bases at random, instead of starting at 2
|
||
a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
|
||
var y = a.modPow(r, this);
|
||
if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
|
||
var j = 1;
|
||
while (j++ < k && y.compareTo(n1) != 0) {
|
||
y = y.modPowInt(2, this);
|
||
if (y.compareTo(BigInteger.ONE) == 0) return false;
|
||
}
|
||
if (y.compareTo(n1) != 0) return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
|
||
|
||
|
||
// (public)
|
||
BigInteger.prototype.clone = function () { var r = nbi(); this.copyTo(r); return r; };
|
||
|
||
// (public) return value as integer
|
||
BigInteger.prototype.intValue = function () {
|
||
if (this.s < 0) {
|
||
if (this.t == 1) return this[0] - this.DV;
|
||
else if (this.t == 0) return -1;
|
||
}
|
||
else if (this.t == 1) return this[0];
|
||
else if (this.t == 0) return 0;
|
||
// assumes 16 < DB < 32
|
||
return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
|
||
};
|
||
|
||
|
||
// (public) return value as byte
|
||
BigInteger.prototype.byteValue = function () { return (this.t == 0) ? this.s : (this[0] << 24) >> 24; };
|
||
|
||
// (public) return value as short (assumes DB>=16)
|
||
BigInteger.prototype.shortValue = function () { return (this.t == 0) ? this.s : (this[0] << 16) >> 16; };
|
||
|
||
// (public) 0 if this == 0, 1 if this > 0
|
||
BigInteger.prototype.signum = function () {
|
||
if (this.s < 0) return -1;
|
||
else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
|
||
else return 1;
|
||
};
|
||
|
||
|
||
// (public) convert to bigendian byte array
|
||
BigInteger.prototype.toByteArray = function () {
|
||
var i = this.t, r = new Array();
|
||
r[0] = this.s;
|
||
var p = this.DB - (i * this.DB) % 8, d, k = 0;
|
||
if (i-- > 0) {
|
||
if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)
|
||
r[k++] = d | (this.s << (this.DB - p));
|
||
while (i >= 0) {
|
||
if (p < 8) {
|
||
d = (this[i] & ((1 << p) - 1)) << (8 - p);
|
||
d |= this[--i] >> (p += this.DB - 8);
|
||
}
|
||
else {
|
||
d = (this[i] >> (p -= 8)) & 0xff;
|
||
if (p <= 0) { p += this.DB; --i; }
|
||
}
|
||
if ((d & 0x80) != 0) d |= -256;
|
||
if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k;
|
||
if (k > 0 || d != this.s) r[k++] = d;
|
||
}
|
||
}
|
||
return r;
|
||
};
|
||
|
||
BigInteger.prototype.equals = function (a) { return (this.compareTo(a) == 0); };
|
||
BigInteger.prototype.min = function (a) { return (this.compareTo(a) < 0) ? this : a; };
|
||
BigInteger.prototype.max = function (a) { return (this.compareTo(a) > 0) ? this : a; };
|
||
|
||
// (public) this & a
|
||
function op_and(x, y) { return x & y; }
|
||
BigInteger.prototype.and = function (a) { var r = nbi(); this.bitwiseTo(a, op_and, r); return r; };
|
||
|
||
// (public) this | a
|
||
function op_or(x, y) { return x | y; }
|
||
BigInteger.prototype.or = function (a) { var r = nbi(); this.bitwiseTo(a, op_or, r); return r; };
|
||
|
||
// (public) this ^ a
|
||
function op_xor(x, y) { return x ^ y; }
|
||
BigInteger.prototype.xor = function (a) { var r = nbi(); this.bitwiseTo(a, op_xor, r); return r; };
|
||
|
||
// (public) this & ~a
|
||
function op_andnot(x, y) { return x & ~y; }
|
||
BigInteger.prototype.andNot = function (a) { var r = nbi(); this.bitwiseTo(a, op_andnot, r); return r; };
|
||
|
||
// (public) ~this
|
||
BigInteger.prototype.not = function () {
|
||
var r = nbi();
|
||
for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];
|
||
r.t = this.t;
|
||
r.s = ~this.s;
|
||
return r;
|
||
};
|
||
|
||
// (public) this << n
|
||
BigInteger.prototype.shiftLeft = function (n) {
|
||
var r = nbi();
|
||
if (n < 0) this.rShiftTo(-n, r); else this.lShiftTo(n, r);
|
||
return r;
|
||
};
|
||
|
||
// (public) this >> n
|
||
BigInteger.prototype.shiftRight = function (n) {
|
||
var r = nbi();
|
||
if (n < 0) this.lShiftTo(-n, r); else this.rShiftTo(n, r);
|
||
return r;
|
||
};
|
||
|
||
// (public) returns index of lowest 1-bit (or -1 if none)
|
||
BigInteger.prototype.getLowestSetBit = function () {
|
||
for (var i = 0; i < this.t; ++i)
|
||
if (this[i] != 0) return i * this.DB + lbit(this[i]);
|
||
if (this.s < 0) return this.t * this.DB;
|
||
return -1;
|
||
};
|
||
|
||
// (public) return number of set bits
|
||
BigInteger.prototype.bitCount = function () {
|
||
var r = 0, x = this.s & this.DM;
|
||
for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);
|
||
return r;
|
||
};
|
||
|
||
// (public) true iff nth bit is set
|
||
BigInteger.prototype.testBit = function (n) {
|
||
var j = Math.floor(n / this.DB);
|
||
if (j >= this.t) return (this.s != 0);
|
||
return ((this[j] & (1 << (n % this.DB))) != 0);
|
||
};
|
||
|
||
// (public) this | (1<<n)
|
||
BigInteger.prototype.setBit = function (n) { return this.changeBit(n, op_or); };
|
||
// (public) this & ~(1<<n)
|
||
BigInteger.prototype.clearBit = function (n) { return this.changeBit(n, op_andnot); };
|
||
// (public) this ^ (1<<n)
|
||
BigInteger.prototype.flipBit = function (n) { return this.changeBit(n, op_xor); };
|
||
// (public) this + a
|
||
BigInteger.prototype.add = function (a) { var r = nbi(); this.addTo(a, r); return r; };
|
||
// (public) this - a
|
||
BigInteger.prototype.subtract = function (a) { var r = nbi(); this.subTo(a, r); return r; };
|
||
// (public) this * a
|
||
BigInteger.prototype.multiply = function (a) { var r = nbi(); this.multiplyTo(a, r); return r; };
|
||
// (public) this / a
|
||
BigInteger.prototype.divide = function (a) { var r = nbi(); this.divRemTo(a, r, null); return r; };
|
||
// (public) this % a
|
||
BigInteger.prototype.remainder = function (a) { var r = nbi(); this.divRemTo(a, null, r); return r; };
|
||
// (public) [this/a,this%a]
|
||
BigInteger.prototype.divideAndRemainder = function (a) {
|
||
var q = nbi(), r = nbi();
|
||
this.divRemTo(a, q, r);
|
||
return new Array(q, r);
|
||
};
|
||
|
||
// (public) this^e % m (HAC 14.85)
|
||
BigInteger.prototype.modPow = function (e, m) {
|
||
var i = e.bitLength(), k, r = nbv(1), z;
|
||
if (i <= 0) return r;
|
||
else if (i < 18) k = 1;
|
||
else if (i < 48) k = 3;
|
||
else if (i < 144) k = 4;
|
||
else if (i < 768) k = 5;
|
||
else k = 6;
|
||
if (i < 8)
|
||
z = new Classic(m);
|
||
else if (m.isEven())
|
||
z = new Barrett(m);
|
||
else
|
||
z = new Montgomery(m);
|
||
|
||
// precomputation
|
||
var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1;
|
||
g[1] = z.convert(this);
|
||
if (k > 1) {
|
||
var g2 = nbi();
|
||
z.sqrTo(g[1], g2);
|
||
while (n <= km) {
|
||
g[n] = nbi();
|
||
z.mulTo(g2, g[n - 2], g[n]);
|
||
n += 2;
|
||
}
|
||
}
|
||
|
||
var j = e.t - 1, w, is1 = true, r2 = nbi(), t;
|
||
i = nbits(e[j]) - 1;
|
||
while (j >= 0) {
|
||
if (i >= k1) w = (e[j] >> (i - k1)) & km;
|
||
else {
|
||
w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
|
||
if (j > 0) w |= e[j - 1] >> (this.DB + i - k1);
|
||
}
|
||
|
||
n = k;
|
||
while ((w & 1) == 0) { w >>= 1; --n; }
|
||
if ((i -= n) < 0) { i += this.DB; --j; }
|
||
if (is1) { // ret == 1, don't bother squaring or multiplying it
|
||
g[w].copyTo(r);
|
||
is1 = false;
|
||
}
|
||
else {
|
||
while (n > 1) { z.sqrTo(r, r2); z.sqrTo(r2, r); n -= 2; }
|
||
if (n > 0) z.sqrTo(r, r2); else { t = r; r = r2; r2 = t; }
|
||
z.mulTo(r2, g[w], r);
|
||
}
|
||
|
||
while (j >= 0 && (e[j] & (1 << i)) == 0) {
|
||
z.sqrTo(r, r2); t = r; r = r2; r2 = t;
|
||
if (--i < 0) { i = this.DB - 1; --j; }
|
||
}
|
||
}
|
||
return z.revert(r);
|
||
};
|
||
|
||
// (public) 1/this % m (HAC 14.61)
|
||
BigInteger.prototype.modInverse = function (m) {
|
||
var ac = m.isEven();
|
||
if (this.signum() === 0) throw new Error('division by zero');
|
||
if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
|
||
var u = m.clone(), v = this.clone();
|
||
var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
|
||
while (u.signum() != 0) {
|
||
while (u.isEven()) {
|
||
u.rShiftTo(1, u);
|
||
if (ac) {
|
||
if (!a.isEven() || !b.isEven()) { a.addTo(this, a); b.subTo(m, b); }
|
||
a.rShiftTo(1, a);
|
||
}
|
||
else if (!b.isEven()) b.subTo(m, b);
|
||
b.rShiftTo(1, b);
|
||
}
|
||
while (v.isEven()) {
|
||
v.rShiftTo(1, v);
|
||
if (ac) {
|
||
if (!c.isEven() || !d.isEven()) { c.addTo(this, c); d.subTo(m, d); }
|
||
c.rShiftTo(1, c);
|
||
}
|
||
else if (!d.isEven()) d.subTo(m, d);
|
||
d.rShiftTo(1, d);
|
||
}
|
||
if (u.compareTo(v) >= 0) {
|
||
u.subTo(v, u);
|
||
if (ac) a.subTo(c, a);
|
||
b.subTo(d, b);
|
||
}
|
||
else {
|
||
v.subTo(u, v);
|
||
if (ac) c.subTo(a, c);
|
||
d.subTo(b, d);
|
||
}
|
||
}
|
||
if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
|
||
while (d.compareTo(m) >= 0) d.subTo(m, d);
|
||
while (d.signum() < 0) d.addTo(m, d);
|
||
return d;
|
||
};
|
||
|
||
|
||
// (public) this^e
|
||
BigInteger.prototype.pow = function (e) { return this.exp(e, new NullExp()); };
|
||
|
||
// (public) gcd(this,a) (HAC 14.54)
|
||
BigInteger.prototype.gcd = function (a) {
|
||
var x = (this.s < 0) ? this.negate() : this.clone();
|
||
var y = (a.s < 0) ? a.negate() : a.clone();
|
||
if (x.compareTo(y) < 0) { var t = x; x = y; y = t; }
|
||
var i = x.getLowestSetBit(), g = y.getLowestSetBit();
|
||
if (g < 0) return x;
|
||
if (i < g) g = i;
|
||
if (g > 0) {
|
||
x.rShiftTo(g, x);
|
||
y.rShiftTo(g, y);
|
||
}
|
||
while (x.signum() > 0) {
|
||
if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);
|
||
if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);
|
||
if (x.compareTo(y) >= 0) {
|
||
x.subTo(y, x);
|
||
x.rShiftTo(1, x);
|
||
}
|
||
else {
|
||
y.subTo(x, y);
|
||
y.rShiftTo(1, y);
|
||
}
|
||
}
|
||
if (g > 0) y.lShiftTo(g, y);
|
||
return y;
|
||
};
|
||
|
||
// (public) test primality with certainty >= 1-.5^t
|
||
BigInteger.prototype.isProbablePrime = function (t) {
|
||
var i, x = this.abs();
|
||
if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
|
||
for (i = 0; i < lowprimes.length; ++i)
|
||
if (x[0] == lowprimes[i]) return true;
|
||
return false;
|
||
}
|
||
if (x.isEven()) return false;
|
||
i = 1;
|
||
while (i < lowprimes.length) {
|
||
var m = lowprimes[i], j = i + 1;
|
||
while (j < lowprimes.length && m < lplim) m *= lowprimes[j++];
|
||
m = x.modInt(m);
|
||
while (i < j) if (m % lowprimes[i++] == 0) return false;
|
||
}
|
||
return x.millerRabin(t);
|
||
};
|
||
|
||
|
||
// JSBN-specific extension
|
||
|
||
// (public) this^2
|
||
BigInteger.prototype.square = function () { var r = nbi(); this.squareTo(r); return r; };
|
||
|
||
|
||
// NOTE: BigInteger interfaces not implemented in jsbn:
|
||
// BigInteger(int signum, byte[] magnitude)
|
||
// double doubleValue()
|
||
// float floatValue()
|
||
// int hashCode()
|
||
// long longValue()
|
||
// static BigInteger valueOf(long val)
|
||
|
||
|
||
|
||
// Copyright Stephan Thomas (start) --- //
|
||
// https://raw.github.com/bitcoinjs/bitcoinjs-lib/07f9d55ccb6abd962efb6befdd37671f85ea4ff9/src/util.js
|
||
// BigInteger monkey patching
|
||
BigInteger.valueOf = nbv;
|
||
|
||
/**
|
||
* Returns a byte array representation of the big integer.
|
||
*
|
||
* This returns the absolute of the contained value in big endian
|
||
* form. A value of zero results in an empty array.
|
||
*/
|
||
BigInteger.prototype.toByteArrayUnsigned = function () {
|
||
var ba = this.abs().toByteArray();
|
||
if (ba.length) {
|
||
if (ba[0] == 0) {
|
||
ba = ba.slice(1);
|
||
}
|
||
return ba.map(function (v) {
|
||
return (v < 0) ? v + 256 : v;
|
||
});
|
||
} else {
|
||
// Empty array, nothing to do
|
||
return ba;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Turns a byte array into a big integer.
|
||
*
|
||
* This function will interpret a byte array as a big integer in big
|
||
* endian notation and ignore leading zeros.
|
||
*/
|
||
BigInteger.fromByteArrayUnsigned = function (ba) {
|
||
if (!ba.length) {
|
||
return ba.valueOf(0);
|
||
} else if (ba[0] & 0x80) {
|
||
// Prepend a zero so the BigInteger class doesn't mistake this
|
||
// for a negative integer.
|
||
return new BigInteger([0].concat(ba));
|
||
} else {
|
||
return new BigInteger(ba);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Converts big integer to signed byte representation.
|
||
*
|
||
* The format for this value uses a the most significant bit as a sign
|
||
* bit. If the most significant bit is already occupied by the
|
||
* absolute value, an extra byte is prepended and the sign bit is set
|
||
* there.
|
||
*
|
||
* Examples:
|
||
*
|
||
* 0 => 0x00
|
||
* 1 => 0x01
|
||
* -1 => 0x81
|
||
* 127 => 0x7f
|
||
* -127 => 0xff
|
||
* 128 => 0x0080
|
||
* -128 => 0x8080
|
||
* 255 => 0x00ff
|
||
* -255 => 0x80ff
|
||
* 16300 => 0x3fac
|
||
* -16300 => 0xbfac
|
||
* 62300 => 0x00f35c
|
||
* -62300 => 0x80f35c
|
||
*/
|
||
BigInteger.prototype.toByteArraySigned = function () {
|
||
var val = this.abs().toByteArrayUnsigned();
|
||
var neg = this.compareTo(BigInteger.ZERO) < 0;
|
||
|
||
if (neg) {
|
||
if (val[0] & 0x80) {
|
||
val.unshift(0x80);
|
||
} else {
|
||
val[0] |= 0x80;
|
||
}
|
||
} else {
|
||
if (val[0] & 0x80) {
|
||
val.unshift(0x00);
|
||
}
|
||
}
|
||
|
||
return val;
|
||
};
|
||
|
||
/**
|
||
* Parse a signed big integer byte representation.
|
||
*
|
||
* For details on the format please see BigInteger.toByteArraySigned.
|
||
*/
|
||
BigInteger.fromByteArraySigned = function (ba) {
|
||
// Check for negative value
|
||
if (ba[0] & 0x80) {
|
||
// Remove sign bit
|
||
ba[0] &= 0x7f;
|
||
|
||
return BigInteger.fromByteArrayUnsigned(ba).negate();
|
||
} else {
|
||
return BigInteger.fromByteArrayUnsigned(ba);
|
||
}
|
||
};
|
||
// Copyright Stephan Thomas (end) --- //
|
||
|
||
|
||
|
||
|
||
// ****** REDUCTION ******* //
|
||
|
||
// Modular reduction using "classic" algorithm
|
||
var Classic = window.Classic = function Classic(m) { this.m = m; }
|
||
Classic.prototype.convert = function (x) {
|
||
if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
|
||
else return x;
|
||
};
|
||
Classic.prototype.revert = function (x) { return x; };
|
||
Classic.prototype.reduce = function (x) { x.divRemTo(this.m, null, x); };
|
||
Classic.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
|
||
Classic.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
|
||
|
||
|
||
|
||
|
||
|
||
// Montgomery reduction
|
||
var Montgomery = window.Montgomery = function Montgomery(m) {
|
||
this.m = m;
|
||
this.mp = m.invDigit();
|
||
this.mpl = this.mp & 0x7fff;
|
||
this.mph = this.mp >> 15;
|
||
this.um = (1 << (m.DB - 15)) - 1;
|
||
this.mt2 = 2 * m.t;
|
||
}
|
||
// xR mod m
|
||
Montgomery.prototype.convert = function (x) {
|
||
var r = nbi();
|
||
x.abs().dlShiftTo(this.m.t, r);
|
||
r.divRemTo(this.m, null, r);
|
||
if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);
|
||
return r;
|
||
}
|
||
// x/R mod m
|
||
Montgomery.prototype.revert = function (x) {
|
||
var r = nbi();
|
||
x.copyTo(r);
|
||
this.reduce(r);
|
||
return r;
|
||
};
|
||
// x = x/R mod m (HAC 14.32)
|
||
Montgomery.prototype.reduce = function (x) {
|
||
while (x.t <= this.mt2) // pad x so am has enough room later
|
||
x[x.t++] = 0;
|
||
for (var i = 0; i < this.m.t; ++i) {
|
||
// faster way of calculating u0 = x[i]*mp mod DV
|
||
var j = x[i] & 0x7fff;
|
||
var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;
|
||
// use am to combine the multiply-shift-add into one call
|
||
j = i + this.m.t;
|
||
x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
|
||
// propagate carry
|
||
while (x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
|
||
}
|
||
x.clamp();
|
||
x.drShiftTo(this.m.t, x);
|
||
if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
|
||
};
|
||
// r = "xy/R mod m"; x,y != r
|
||
Montgomery.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
|
||
// r = "x^2/R mod m"; x != r
|
||
Montgomery.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
|
||
|
||
|
||
|
||
|
||
|
||
// A "null" reducer
|
||
var NullExp = window.NullExp = function NullExp() { }
|
||
NullExp.prototype.convert = function (x) { return x; };
|
||
NullExp.prototype.revert = function (x) { return x; };
|
||
NullExp.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); };
|
||
NullExp.prototype.sqrTo = function (x, r) { x.squareTo(r); };
|
||
|
||
|
||
|
||
|
||
|
||
// Barrett modular reduction
|
||
var Barrett = window.Barrett = function Barrett(m) {
|
||
// setup Barrett
|
||
this.r2 = nbi();
|
||
this.q3 = nbi();
|
||
BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
|
||
this.mu = this.r2.divide(m);
|
||
this.m = m;
|
||
}
|
||
Barrett.prototype.convert = function (x) {
|
||
if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);
|
||
else if (x.compareTo(this.m) < 0) return x;
|
||
else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
|
||
};
|
||
Barrett.prototype.revert = function (x) { return x; };
|
||
// x = x mod m (HAC 14.42)
|
||
Barrett.prototype.reduce = function (x) {
|
||
x.drShiftTo(this.m.t - 1, this.r2);
|
||
if (x.t > this.m.t + 1) { x.t = this.m.t + 1; x.clamp(); }
|
||
this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
|
||
this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
|
||
while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);
|
||
x.subTo(this.r2, x);
|
||
while (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
|
||
};
|
||
// r = x*y mod m; x,y != r
|
||
Barrett.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
|
||
// r = x^2 mod m; x != r
|
||
Barrett.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
|
||
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
//---------------------------------------------------------------------
|
||
// QRCode for JavaScript
|
||
//
|
||
// Copyright (c) 2009 Kazuhiko Arase
|
||
//
|
||
// URL: http://www.d-project.com/
|
||
//
|
||
// Licensed under the MIT license:
|
||
// http://www.opensource.org/licenses/mit-license.php
|
||
//
|
||
// The word "QR Code" is registered trademark of
|
||
// DENSO WAVE INCORPORATED
|
||
// http://www.denso-wave.com/qrcode/faqpatent-e.html
|
||
//
|
||
//---------------------------------------------------------------------
|
||
|
||
(function () {
|
||
//---------------------------------------------------------------------
|
||
// QRCode
|
||
//---------------------------------------------------------------------
|
||
|
||
var QRCode = window.QRCode = function (typeNumber, errorCorrectLevel) {
|
||
this.typeNumber = typeNumber;
|
||
this.errorCorrectLevel = errorCorrectLevel;
|
||
this.modules = null;
|
||
this.moduleCount = 0;
|
||
this.dataCache = null;
|
||
this.dataList = new Array();
|
||
}
|
||
|
||
QRCode.prototype = {
|
||
|
||
addData: function (data) {
|
||
var newData = new QRCode.QR8bitByte(data);
|
||
this.dataList.push(newData);
|
||
this.dataCache = null;
|
||
},
|
||
|
||
isDark: function (row, col) {
|
||
if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
|
||
throw new Error(row + "," + col);
|
||
}
|
||
return this.modules[row][col];
|
||
},
|
||
|
||
getModuleCount: function () {
|
||
return this.moduleCount;
|
||
},
|
||
|
||
make: function () {
|
||
this.makeImpl(false, this.getBestMaskPattern());
|
||
},
|
||
|
||
makeImpl: function (test, maskPattern) {
|
||
|
||
this.moduleCount = this.typeNumber * 4 + 17;
|
||
this.modules = new Array(this.moduleCount);
|
||
|
||
for (var row = 0; row < this.moduleCount; row++) {
|
||
|
||
this.modules[row] = new Array(this.moduleCount);
|
||
|
||
for (var col = 0; col < this.moduleCount; col++) {
|
||
this.modules[row][col] = null; //(col + row) % 3;
|
||
}
|
||
}
|
||
|
||
this.setupPositionProbePattern(0, 0);
|
||
this.setupPositionProbePattern(this.moduleCount - 7, 0);
|
||
this.setupPositionProbePattern(0, this.moduleCount - 7);
|
||
this.setupPositionAdjustPattern();
|
||
this.setupTimingPattern();
|
||
this.setupTypeInfo(test, maskPattern);
|
||
|
||
if (this.typeNumber >= 7) {
|
||
this.setupTypeNumber(test);
|
||
}
|
||
|
||
if (this.dataCache == null) {
|
||
this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
|
||
}
|
||
|
||
this.mapData(this.dataCache, maskPattern);
|
||
},
|
||
|
||
setupPositionProbePattern: function (row, col) {
|
||
|
||
for (var r = -1; r <= 7; r++) {
|
||
|
||
if (row + r <= -1 || this.moduleCount <= row + r) continue;
|
||
|
||
for (var c = -1; c <= 7; c++) {
|
||
|
||
if (col + c <= -1 || this.moduleCount <= col + c) continue;
|
||
|
||
if ((0 <= r && r <= 6 && (c == 0 || c == 6))
|
||
|| (0 <= c && c <= 6 && (r == 0 || r == 6))
|
||
|| (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
|
||
this.modules[row + r][col + c] = true;
|
||
} else {
|
||
this.modules[row + r][col + c] = false;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
getBestMaskPattern: function () {
|
||
|
||
var minLostPoint = 0;
|
||
var pattern = 0;
|
||
|
||
for (var i = 0; i < 8; i++) {
|
||
|
||
this.makeImpl(true, i);
|
||
|
||
var lostPoint = QRCode.Util.getLostPoint(this);
|
||
|
||
if (i == 0 || minLostPoint > lostPoint) {
|
||
minLostPoint = lostPoint;
|
||
pattern = i;
|
||
}
|
||
}
|
||
|
||
return pattern;
|
||
},
|
||
|
||
createMovieClip: function (target_mc, instance_name, depth) {
|
||
|
||
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
|
||
var cs = 1;
|
||
|
||
this.make();
|
||
|
||
for (var row = 0; row < this.modules.length; row++) {
|
||
|
||
var y = row * cs;
|
||
|
||
for (var col = 0; col < this.modules[row].length; col++) {
|
||
|
||
var x = col * cs;
|
||
var dark = this.modules[row][col];
|
||
|
||
if (dark) {
|
||
qr_mc.beginFill(0, 100);
|
||
qr_mc.moveTo(x, y);
|
||
qr_mc.lineTo(x + cs, y);
|
||
qr_mc.lineTo(x + cs, y + cs);
|
||
qr_mc.lineTo(x, y + cs);
|
||
qr_mc.endFill();
|
||
}
|
||
}
|
||
}
|
||
|
||
return qr_mc;
|
||
},
|
||
|
||
setupTimingPattern: function () {
|
||
|
||
for (var r = 8; r < this.moduleCount - 8; r++) {
|
||
if (this.modules[r][6] != null) {
|
||
continue;
|
||
}
|
||
this.modules[r][6] = (r % 2 == 0);
|
||
}
|
||
|
||
for (var c = 8; c < this.moduleCount - 8; c++) {
|
||
if (this.modules[6][c] != null) {
|
||
continue;
|
||
}
|
||
this.modules[6][c] = (c % 2 == 0);
|
||
}
|
||
},
|
||
|
||
setupPositionAdjustPattern: function () {
|
||
|
||
var pos = QRCode.Util.getPatternPosition(this.typeNumber);
|
||
|
||
for (var i = 0; i < pos.length; i++) {
|
||
|
||
for (var j = 0; j < pos.length; j++) {
|
||
|
||
var row = pos[i];
|
||
var col = pos[j];
|
||
|
||
if (this.modules[row][col] != null) {
|
||
continue;
|
||
}
|
||
|
||
for (var r = -2; r <= 2; r++) {
|
||
|
||
for (var c = -2; c <= 2; c++) {
|
||
|
||
if (r == -2 || r == 2 || c == -2 || c == 2
|
||
|| (r == 0 && c == 0)) {
|
||
this.modules[row + r][col + c] = true;
|
||
} else {
|
||
this.modules[row + r][col + c] = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
setupTypeNumber: function (test) {
|
||
|
||
var bits = QRCode.Util.getBCHTypeNumber(this.typeNumber);
|
||
|
||
for (var i = 0; i < 18; i++) {
|
||
var mod = (!test && ((bits >> i) & 1) == 1);
|
||
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
|
||
}
|
||
|
||
for (var i = 0; i < 18; i++) {
|
||
var mod = (!test && ((bits >> i) & 1) == 1);
|
||
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
|
||
}
|
||
},
|
||
|
||
setupTypeInfo: function (test, maskPattern) {
|
||
|
||
var data = (this.errorCorrectLevel << 3) | maskPattern;
|
||
var bits = QRCode.Util.getBCHTypeInfo(data);
|
||
|
||
// vertical
|
||
for (var i = 0; i < 15; i++) {
|
||
|
||
var mod = (!test && ((bits >> i) & 1) == 1);
|
||
|
||
if (i < 6) {
|
||
this.modules[i][8] = mod;
|
||
} else if (i < 8) {
|
||
this.modules[i + 1][8] = mod;
|
||
} else {
|
||
this.modules[this.moduleCount - 15 + i][8] = mod;
|
||
}
|
||
}
|
||
|
||
// horizontal
|
||
for (var i = 0; i < 15; i++) {
|
||
|
||
var mod = (!test && ((bits >> i) & 1) == 1);
|
||
|
||
if (i < 8) {
|
||
this.modules[8][this.moduleCount - i - 1] = mod;
|
||
} else if (i < 9) {
|
||
this.modules[8][15 - i - 1 + 1] = mod;
|
||
} else {
|
||
this.modules[8][15 - i - 1] = mod;
|
||
}
|
||
}
|
||
|
||
// fixed module
|
||
this.modules[this.moduleCount - 8][8] = (!test);
|
||
|
||
},
|
||
|
||
mapData: function (data, maskPattern) {
|
||
|
||
var inc = -1;
|
||
var row = this.moduleCount - 1;
|
||
var bitIndex = 7;
|
||
var byteIndex = 0;
|
||
|
||
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
|
||
|
||
if (col == 6) col--;
|
||
|
||
while (true) {
|
||
|
||
for (var c = 0; c < 2; c++) {
|
||
|
||
if (this.modules[row][col - c] == null) {
|
||
|
||
var dark = false;
|
||
|
||
if (byteIndex < data.length) {
|
||
dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
|
||
}
|
||
|
||
var mask = QRCode.Util.getMask(maskPattern, row, col - c);
|
||
|
||
if (mask) {
|
||
dark = !dark;
|
||
}
|
||
|
||
this.modules[row][col - c] = dark;
|
||
bitIndex--;
|
||
|
||
if (bitIndex == -1) {
|
||
byteIndex++;
|
||
bitIndex = 7;
|
||
}
|
||
}
|
||
}
|
||
|
||
row += inc;
|
||
|
||
if (row < 0 || this.moduleCount <= row) {
|
||
row -= inc;
|
||
inc = -inc;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
};
|
||
|
||
QRCode.PAD0 = 0xEC;
|
||
QRCode.PAD1 = 0x11;
|
||
|
||
QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) {
|
||
|
||
var rsBlocks = QRCode.RSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
|
||
|
||
var buffer = new QRCode.BitBuffer();
|
||
|
||
for (var i = 0; i < dataList.length; i++) {
|
||
var data = dataList[i];
|
||
buffer.put(data.mode, 4);
|
||
buffer.put(data.getLength(), QRCode.Util.getLengthInBits(data.mode, typeNumber));
|
||
data.write(buffer);
|
||
}
|
||
|
||
// calc num max data.
|
||
var totalDataCount = 0;
|
||
for (var i = 0; i < rsBlocks.length; i++) {
|
||
totalDataCount += rsBlocks[i].dataCount;
|
||
}
|
||
|
||
if (buffer.getLengthInBits() > totalDataCount * 8) {
|
||
throw new Error("code length overflow. ("
|
||
+ buffer.getLengthInBits()
|
||
+ ">"
|
||
+ totalDataCount * 8
|
||
+ ")");
|
||
}
|
||
|
||
// end code
|
||
if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
|
||
buffer.put(0, 4);
|
||
}
|
||
|
||
// padding
|
||
while (buffer.getLengthInBits() % 8 != 0) {
|
||
buffer.putBit(false);
|
||
}
|
||
|
||
// padding
|
||
while (true) {
|
||
|
||
if (buffer.getLengthInBits() >= totalDataCount * 8) {
|
||
break;
|
||
}
|
||
buffer.put(QRCode.PAD0, 8);
|
||
|
||
if (buffer.getLengthInBits() >= totalDataCount * 8) {
|
||
break;
|
||
}
|
||
buffer.put(QRCode.PAD1, 8);
|
||
}
|
||
|
||
return QRCode.createBytes(buffer, rsBlocks);
|
||
};
|
||
|
||
QRCode.createBytes = function (buffer, rsBlocks) {
|
||
|
||
var offset = 0;
|
||
|
||
var maxDcCount = 0;
|
||
var maxEcCount = 0;
|
||
|
||
var dcdata = new Array(rsBlocks.length);
|
||
var ecdata = new Array(rsBlocks.length);
|
||
|
||
for (var r = 0; r < rsBlocks.length; r++) {
|
||
|
||
var dcCount = rsBlocks[r].dataCount;
|
||
var ecCount = rsBlocks[r].totalCount - dcCount;
|
||
|
||
maxDcCount = Math.max(maxDcCount, dcCount);
|
||
maxEcCount = Math.max(maxEcCount, ecCount);
|
||
|
||
dcdata[r] = new Array(dcCount);
|
||
|
||
for (var i = 0; i < dcdata[r].length; i++) {
|
||
dcdata[r][i] = 0xff & buffer.buffer[i + offset];
|
||
}
|
||
offset += dcCount;
|
||
|
||
var rsPoly = QRCode.Util.getErrorCorrectPolynomial(ecCount);
|
||
var rawPoly = new QRCode.Polynomial(dcdata[r], rsPoly.getLength() - 1);
|
||
|
||
var modPoly = rawPoly.mod(rsPoly);
|
||
ecdata[r] = new Array(rsPoly.getLength() - 1);
|
||
for (var i = 0; i < ecdata[r].length; i++) {
|
||
var modIndex = i + modPoly.getLength() - ecdata[r].length;
|
||
ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
|
||
}
|
||
|
||
}
|
||
|
||
var totalCodeCount = 0;
|
||
for (var i = 0; i < rsBlocks.length; i++) {
|
||
totalCodeCount += rsBlocks[i].totalCount;
|
||
}
|
||
|
||
var data = new Array(totalCodeCount);
|
||
var index = 0;
|
||
|
||
for (var i = 0; i < maxDcCount; i++) {
|
||
for (var r = 0; r < rsBlocks.length; r++) {
|
||
if (i < dcdata[r].length) {
|
||
data[index++] = dcdata[r][i];
|
||
}
|
||
}
|
||
}
|
||
|
||
for (var i = 0; i < maxEcCount; i++) {
|
||
for (var r = 0; r < rsBlocks.length; r++) {
|
||
if (i < ecdata[r].length) {
|
||
data[index++] = ecdata[r][i];
|
||
}
|
||
}
|
||
}
|
||
|
||
return data;
|
||
|
||
};
|
||
|
||
//---------------------------------------------------------------------
|
||
// QR8bitByte
|
||
//---------------------------------------------------------------------
|
||
QRCode.QR8bitByte = function (data) {
|
||
this.mode = QRCode.Mode.MODE_8BIT_BYTE;
|
||
this.data = data;
|
||
}
|
||
|
||
QRCode.QR8bitByte.prototype = {
|
||
getLength: function (buffer) {
|
||
return this.data.length;
|
||
},
|
||
|
||
write: function (buffer) {
|
||
for (var i = 0; i < this.data.length; i++) {
|
||
// not JIS ...
|
||
buffer.put(this.data.charCodeAt(i), 8);
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRMode
|
||
//---------------------------------------------------------------------
|
||
QRCode.Mode = {
|
||
MODE_NUMBER: 1 << 0,
|
||
MODE_ALPHA_NUM: 1 << 1,
|
||
MODE_8BIT_BYTE: 1 << 2,
|
||
MODE_KANJI: 1 << 3
|
||
};
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRErrorCorrectLevel
|
||
//---------------------------------------------------------------------
|
||
QRCode.ErrorCorrectLevel = {
|
||
L: 1,
|
||
M: 0,
|
||
Q: 3,
|
||
H: 2
|
||
};
|
||
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRMaskPattern
|
||
//---------------------------------------------------------------------
|
||
QRCode.MaskPattern = {
|
||
PATTERN000: 0,
|
||
PATTERN001: 1,
|
||
PATTERN010: 2,
|
||
PATTERN011: 3,
|
||
PATTERN100: 4,
|
||
PATTERN101: 5,
|
||
PATTERN110: 6,
|
||
PATTERN111: 7
|
||
};
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRUtil
|
||
//---------------------------------------------------------------------
|
||
|
||
QRCode.Util = {
|
||
|
||
PATTERN_POSITION_TABLE: [
|
||
[],
|
||
[6, 18],
|
||
[6, 22],
|
||
[6, 26],
|
||
[6, 30],
|
||
[6, 34],
|
||
[6, 22, 38],
|
||
[6, 24, 42],
|
||
[6, 26, 46],
|
||
[6, 28, 50],
|
||
[6, 30, 54],
|
||
[6, 32, 58],
|
||
[6, 34, 62],
|
||
[6, 26, 46, 66],
|
||
[6, 26, 48, 70],
|
||
[6, 26, 50, 74],
|
||
[6, 30, 54, 78],
|
||
[6, 30, 56, 82],
|
||
[6, 30, 58, 86],
|
||
[6, 34, 62, 90],
|
||
[6, 28, 50, 72, 94],
|
||
[6, 26, 50, 74, 98],
|
||
[6, 30, 54, 78, 102],
|
||
[6, 28, 54, 80, 106],
|
||
[6, 32, 58, 84, 110],
|
||
[6, 30, 58, 86, 114],
|
||
[6, 34, 62, 90, 118],
|
||
[6, 26, 50, 74, 98, 122],
|
||
[6, 30, 54, 78, 102, 126],
|
||
[6, 26, 52, 78, 104, 130],
|
||
[6, 30, 56, 82, 108, 134],
|
||
[6, 34, 60, 86, 112, 138],
|
||
[6, 30, 58, 86, 114, 142],
|
||
[6, 34, 62, 90, 118, 146],
|
||
[6, 30, 54, 78, 102, 126, 150],
|
||
[6, 24, 50, 76, 102, 128, 154],
|
||
[6, 28, 54, 80, 106, 132, 158],
|
||
[6, 32, 58, 84, 110, 136, 162],
|
||
[6, 26, 54, 82, 110, 138, 166],
|
||
[6, 30, 58, 86, 114, 142, 170]
|
||
],
|
||
|
||
G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
|
||
G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
|
||
G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
|
||
|
||
getBCHTypeInfo: function (data) {
|
||
var d = data << 10;
|
||
while (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G15) >= 0) {
|
||
d ^= (QRCode.Util.G15 << (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G15)));
|
||
}
|
||
return ((data << 10) | d) ^ QRCode.Util.G15_MASK;
|
||
},
|
||
|
||
getBCHTypeNumber: function (data) {
|
||
var d = data << 12;
|
||
while (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G18) >= 0) {
|
||
d ^= (QRCode.Util.G18 << (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G18)));
|
||
}
|
||
return (data << 12) | d;
|
||
},
|
||
|
||
getBCHDigit: function (data) {
|
||
|
||
var digit = 0;
|
||
|
||
while (data != 0) {
|
||
digit++;
|
||
data >>>= 1;
|
||
}
|
||
|
||
return digit;
|
||
},
|
||
|
||
getPatternPosition: function (typeNumber) {
|
||
return QRCode.Util.PATTERN_POSITION_TABLE[typeNumber - 1];
|
||
},
|
||
|
||
getMask: function (maskPattern, i, j) {
|
||
|
||
switch (maskPattern) {
|
||
|
||
case QRCode.MaskPattern.PATTERN000: return (i + j) % 2 == 0;
|
||
case QRCode.MaskPattern.PATTERN001: return i % 2 == 0;
|
||
case QRCode.MaskPattern.PATTERN010: return j % 3 == 0;
|
||
case QRCode.MaskPattern.PATTERN011: return (i + j) % 3 == 0;
|
||
case QRCode.MaskPattern.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
|
||
case QRCode.MaskPattern.PATTERN101: return (i * j) % 2 + (i * j) % 3 == 0;
|
||
case QRCode.MaskPattern.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
|
||
case QRCode.MaskPattern.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
|
||
|
||
default:
|
||
throw new Error("bad maskPattern:" + maskPattern);
|
||
}
|
||
},
|
||
|
||
getErrorCorrectPolynomial: function (errorCorrectLength) {
|
||
|
||
var a = new QRCode.Polynomial([1], 0);
|
||
|
||
for (var i = 0; i < errorCorrectLength; i++) {
|
||
a = a.multiply(new QRCode.Polynomial([1, QRCode.Math.gexp(i)], 0));
|
||
}
|
||
|
||
return a;
|
||
},
|
||
|
||
getLengthInBits: function (mode, type) {
|
||
|
||
if (1 <= type && type < 10) {
|
||
|
||
// 1 - 9
|
||
|
||
switch (mode) {
|
||
case QRCode.Mode.MODE_NUMBER: return 10;
|
||
case QRCode.Mode.MODE_ALPHA_NUM: return 9;
|
||
case QRCode.Mode.MODE_8BIT_BYTE: return 8;
|
||
case QRCode.Mode.MODE_KANJI: return 8;
|
||
default:
|
||
throw new Error("mode:" + mode);
|
||
}
|
||
|
||
} else if (type < 27) {
|
||
|
||
// 10 - 26
|
||
|
||
switch (mode) {
|
||
case QRCode.Mode.MODE_NUMBER: return 12;
|
||
case QRCode.Mode.MODE_ALPHA_NUM: return 11;
|
||
case QRCode.Mode.MODE_8BIT_BYTE: return 16;
|
||
case QRCode.Mode.MODE_KANJI: return 10;
|
||
default:
|
||
throw new Error("mode:" + mode);
|
||
}
|
||
|
||
} else if (type < 41) {
|
||
|
||
// 27 - 40
|
||
|
||
switch (mode) {
|
||
case QRCode.Mode.MODE_NUMBER: return 14;
|
||
case QRCode.Mode.MODE_ALPHA_NUM: return 13;
|
||
case QRCode.Mode.MODE_8BIT_BYTE: return 16;
|
||
case QRCode.Mode.MODE_KANJI: return 12;
|
||
default:
|
||
throw new Error("mode:" + mode);
|
||
}
|
||
|
||
} else {
|
||
throw new Error("type:" + type);
|
||
}
|
||
},
|
||
|
||
getLostPoint: function (qrCode) {
|
||
|
||
var moduleCount = qrCode.getModuleCount();
|
||
|
||
var lostPoint = 0;
|
||
|
||
// LEVEL1
|
||
|
||
for (var row = 0; row < moduleCount; row++) {
|
||
|
||
for (var col = 0; col < moduleCount; col++) {
|
||
|
||
var sameCount = 0;
|
||
var dark = qrCode.isDark(row, col);
|
||
|
||
for (var r = -1; r <= 1; r++) {
|
||
|
||
if (row + r < 0 || moduleCount <= row + r) {
|
||
continue;
|
||
}
|
||
|
||
for (var c = -1; c <= 1; c++) {
|
||
|
||
if (col + c < 0 || moduleCount <= col + c) {
|
||
continue;
|
||
}
|
||
|
||
if (r == 0 && c == 0) {
|
||
continue;
|
||
}
|
||
|
||
if (dark == qrCode.isDark(row + r, col + c)) {
|
||
sameCount++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (sameCount > 5) {
|
||
lostPoint += (3 + sameCount - 5);
|
||
}
|
||
}
|
||
}
|
||
|
||
// LEVEL2
|
||
|
||
for (var row = 0; row < moduleCount - 1; row++) {
|
||
for (var col = 0; col < moduleCount - 1; col++) {
|
||
var count = 0;
|
||
if (qrCode.isDark(row, col)) count++;
|
||
if (qrCode.isDark(row + 1, col)) count++;
|
||
if (qrCode.isDark(row, col + 1)) count++;
|
||
if (qrCode.isDark(row + 1, col + 1)) count++;
|
||
if (count == 0 || count == 4) {
|
||
lostPoint += 3;
|
||
}
|
||
}
|
||
}
|
||
|
||
// LEVEL3
|
||
|
||
for (var row = 0; row < moduleCount; row++) {
|
||
for (var col = 0; col < moduleCount - 6; col++) {
|
||
if (qrCode.isDark(row, col)
|
||
&& !qrCode.isDark(row, col + 1)
|
||
&& qrCode.isDark(row, col + 2)
|
||
&& qrCode.isDark(row, col + 3)
|
||
&& qrCode.isDark(row, col + 4)
|
||
&& !qrCode.isDark(row, col + 5)
|
||
&& qrCode.isDark(row, col + 6)) {
|
||
lostPoint += 40;
|
||
}
|
||
}
|
||
}
|
||
|
||
for (var col = 0; col < moduleCount; col++) {
|
||
for (var row = 0; row < moduleCount - 6; row++) {
|
||
if (qrCode.isDark(row, col)
|
||
&& !qrCode.isDark(row + 1, col)
|
||
&& qrCode.isDark(row + 2, col)
|
||
&& qrCode.isDark(row + 3, col)
|
||
&& qrCode.isDark(row + 4, col)
|
||
&& !qrCode.isDark(row + 5, col)
|
||
&& qrCode.isDark(row + 6, col)) {
|
||
lostPoint += 40;
|
||
}
|
||
}
|
||
}
|
||
|
||
// LEVEL4
|
||
|
||
var darkCount = 0;
|
||
|
||
for (var col = 0; col < moduleCount; col++) {
|
||
for (var row = 0; row < moduleCount; row++) {
|
||
if (qrCode.isDark(row, col)) {
|
||
darkCount++;
|
||
}
|
||
}
|
||
}
|
||
|
||
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
|
||
lostPoint += ratio * 10;
|
||
|
||
return lostPoint;
|
||
}
|
||
|
||
};
|
||
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRMath
|
||
//---------------------------------------------------------------------
|
||
|
||
QRCode.Math = {
|
||
|
||
glog: function (n) {
|
||
|
||
if (n < 1) {
|
||
throw new Error("glog(" + n + ")");
|
||
}
|
||
|
||
return QRCode.Math.LOG_TABLE[n];
|
||
},
|
||
|
||
gexp: function (n) {
|
||
|
||
while (n < 0) {
|
||
n += 255;
|
||
}
|
||
|
||
while (n >= 256) {
|
||
n -= 255;
|
||
}
|
||
|
||
return QRCode.Math.EXP_TABLE[n];
|
||
},
|
||
|
||
EXP_TABLE: new Array(256),
|
||
|
||
LOG_TABLE: new Array(256)
|
||
|
||
};
|
||
|
||
for (var i = 0; i < 8; i++) {
|
||
QRCode.Math.EXP_TABLE[i] = 1 << i;
|
||
}
|
||
for (var i = 8; i < 256; i++) {
|
||
QRCode.Math.EXP_TABLE[i] = QRCode.Math.EXP_TABLE[i - 4]
|
||
^ QRCode.Math.EXP_TABLE[i - 5]
|
||
^ QRCode.Math.EXP_TABLE[i - 6]
|
||
^ QRCode.Math.EXP_TABLE[i - 8];
|
||
}
|
||
for (var i = 0; i < 255; i++) {
|
||
QRCode.Math.LOG_TABLE[QRCode.Math.EXP_TABLE[i]] = i;
|
||
}
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRPolynomial
|
||
//---------------------------------------------------------------------
|
||
|
||
QRCode.Polynomial = function (num, shift) {
|
||
|
||
if (num.length == undefined) {
|
||
throw new Error(num.length + "/" + shift);
|
||
}
|
||
|
||
var offset = 0;
|
||
|
||
while (offset < num.length && num[offset] == 0) {
|
||
offset++;
|
||
}
|
||
|
||
this.num = new Array(num.length - offset + shift);
|
||
for (var i = 0; i < num.length - offset; i++) {
|
||
this.num[i] = num[i + offset];
|
||
}
|
||
}
|
||
|
||
QRCode.Polynomial.prototype = {
|
||
|
||
get: function (index) {
|
||
return this.num[index];
|
||
},
|
||
|
||
getLength: function () {
|
||
return this.num.length;
|
||
},
|
||
|
||
multiply: function (e) {
|
||
|
||
var num = new Array(this.getLength() + e.getLength() - 1);
|
||
|
||
for (var i = 0; i < this.getLength(); i++) {
|
||
for (var j = 0; j < e.getLength(); j++) {
|
||
num[i + j] ^= QRCode.Math.gexp(QRCode.Math.glog(this.get(i)) + QRCode.Math.glog(e.get(j)));
|
||
}
|
||
}
|
||
|
||
return new QRCode.Polynomial(num, 0);
|
||
},
|
||
|
||
mod: function (e) {
|
||
|
||
if (this.getLength() - e.getLength() < 0) {
|
||
return this;
|
||
}
|
||
|
||
var ratio = QRCode.Math.glog(this.get(0)) - QRCode.Math.glog(e.get(0));
|
||
|
||
var num = new Array(this.getLength());
|
||
|
||
for (var i = 0; i < this.getLength(); i++) {
|
||
num[i] = this.get(i);
|
||
}
|
||
|
||
for (var i = 0; i < e.getLength(); i++) {
|
||
num[i] ^= QRCode.Math.gexp(QRCode.Math.glog(e.get(i)) + ratio);
|
||
}
|
||
|
||
// recursive call
|
||
return new QRCode.Polynomial(num, 0).mod(e);
|
||
}
|
||
};
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRRSBlock
|
||
//---------------------------------------------------------------------
|
||
|
||
QRCode.RSBlock = function (totalCount, dataCount) {
|
||
this.totalCount = totalCount;
|
||
this.dataCount = dataCount;
|
||
}
|
||
|
||
QRCode.RSBlock.RS_BLOCK_TABLE = [
|
||
|
||
// L
|
||
// M
|
||
// Q
|
||
// H
|
||
|
||
// 1
|
||
[1, 26, 19],
|
||
[1, 26, 16],
|
||
[1, 26, 13],
|
||
[1, 26, 9],
|
||
|
||
// 2
|
||
[1, 44, 34],
|
||
[1, 44, 28],
|
||
[1, 44, 22],
|
||
[1, 44, 16],
|
||
|
||
// 3
|
||
[1, 70, 55],
|
||
[1, 70, 44],
|
||
[2, 35, 17],
|
||
[2, 35, 13],
|
||
|
||
// 4
|
||
[1, 100, 80],
|
||
[2, 50, 32],
|
||
[2, 50, 24],
|
||
[4, 25, 9],
|
||
|
||
// 5
|
||
[1, 134, 108],
|
||
[2, 67, 43],
|
||
[2, 33, 15, 2, 34, 16],
|
||
[2, 33, 11, 2, 34, 12],
|
||
|
||
// 6
|
||
[2, 86, 68],
|
||
[4, 43, 27],
|
||
[4, 43, 19],
|
||
[4, 43, 15],
|
||
|
||
// 7
|
||
[2, 98, 78],
|
||
[4, 49, 31],
|
||
[2, 32, 14, 4, 33, 15],
|
||
[4, 39, 13, 1, 40, 14],
|
||
|
||
// 8
|
||
[2, 121, 97],
|
||
[2, 60, 38, 2, 61, 39],
|
||
[4, 40, 18, 2, 41, 19],
|
||
[4, 40, 14, 2, 41, 15],
|
||
|
||
// 9
|
||
[2, 146, 116],
|
||
[3, 58, 36, 2, 59, 37],
|
||
[4, 36, 16, 4, 37, 17],
|
||
[4, 36, 12, 4, 37, 13],
|
||
|
||
// 10
|
||
[2, 86, 68, 2, 87, 69],
|
||
[4, 69, 43, 1, 70, 44],
|
||
[6, 43, 19, 2, 44, 20],
|
||
[6, 43, 15, 2, 44, 16]
|
||
|
||
];
|
||
|
||
QRCode.RSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
|
||
|
||
var rsBlock = QRCode.RSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
|
||
|
||
if (rsBlock == undefined) {
|
||
throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
|
||
}
|
||
|
||
var length = rsBlock.length / 3;
|
||
|
||
var list = new Array();
|
||
|
||
for (var i = 0; i < length; i++) {
|
||
|
||
var count = rsBlock[i * 3 + 0];
|
||
var totalCount = rsBlock[i * 3 + 1];
|
||
var dataCount = rsBlock[i * 3 + 2];
|
||
|
||
for (var j = 0; j < count; j++) {
|
||
list.push(new QRCode.RSBlock(totalCount, dataCount));
|
||
}
|
||
}
|
||
|
||
return list;
|
||
};
|
||
|
||
QRCode.RSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
|
||
|
||
switch (errorCorrectLevel) {
|
||
case QRCode.ErrorCorrectLevel.L:
|
||
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
|
||
case QRCode.ErrorCorrectLevel.M:
|
||
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
|
||
case QRCode.ErrorCorrectLevel.Q:
|
||
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
|
||
case QRCode.ErrorCorrectLevel.H:
|
||
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
|
||
default:
|
||
return undefined;
|
||
}
|
||
};
|
||
|
||
//---------------------------------------------------------------------
|
||
// QRBitBuffer
|
||
//---------------------------------------------------------------------
|
||
|
||
QRCode.BitBuffer = function () {
|
||
this.buffer = new Array();
|
||
this.length = 0;
|
||
}
|
||
|
||
QRCode.BitBuffer.prototype = {
|
||
|
||
get: function (index) {
|
||
var bufIndex = Math.floor(index / 8);
|
||
return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;
|
||
},
|
||
|
||
put: function (num, length) {
|
||
for (var i = 0; i < length; i++) {
|
||
this.putBit(((num >>> (length - i - 1)) & 1) == 1);
|
||
}
|
||
},
|
||
|
||
getLengthInBits: function () {
|
||
return this.length;
|
||
},
|
||
|
||
putBit: function (bit) {
|
||
|
||
var bufIndex = Math.floor(this.length / 8);
|
||
if (this.buffer.length <= bufIndex) {
|
||
this.buffer.push(0);
|
||
}
|
||
|
||
if (bit) {
|
||
this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
|
||
}
|
||
|
||
this.length++;
|
||
}
|
||
};
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*
|
||
Copyright (c) 2011 Stefan Thomas
|
||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
*/
|
||
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/1a7fc9d063f864058809d06ef4542af40be3558f/src/bitcoin.js
|
||
(function (exports) {
|
||
var Bitcoin = exports;
|
||
})(
|
||
'object' === typeof module ? module.exports : (window.Bitcoin = {})
|
||
);
|
||
</script>
|
||
<script type="text/javascript">
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js
|
||
(function (Bitcoin) {
|
||
Bitcoin.Base58 = {
|
||
alphabet: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",
|
||
validRegex: /^[1-9A-HJ-NP-Za-km-z]+$/,
|
||
base: BigInteger.valueOf(58),
|
||
|
||
/**
|
||
* Convert a byte array to a base58-encoded string.
|
||
*
|
||
* Written by Mike Hearn for BitcoinJ.
|
||
* Copyright (c) 2011 Google Inc.
|
||
*
|
||
* Ported to JavaScript by Stefan Thomas.
|
||
*/
|
||
encode: function (input) {
|
||
var bi = BigInteger.fromByteArrayUnsigned(input);
|
||
var chars = [];
|
||
|
||
while (bi.compareTo(B58.base) >= 0) {
|
||
var mod = bi.mod(B58.base);
|
||
chars.unshift(B58.alphabet[mod.intValue()]);
|
||
bi = bi.subtract(mod).divide(B58.base);
|
||
}
|
||
chars.unshift(B58.alphabet[bi.intValue()]);
|
||
|
||
// Convert leading zeros too.
|
||
for (var i = 0; i < input.length; i++) {
|
||
if (input[i] == 0x00) {
|
||
chars.unshift(B58.alphabet[0]);
|
||
} else break;
|
||
}
|
||
|
||
return chars.join('');
|
||
},
|
||
|
||
/**
|
||
* Convert a base58-encoded string to a byte array.
|
||
*
|
||
* Written by Mike Hearn for BitcoinJ.
|
||
* Copyright (c) 2011 Google Inc.
|
||
*
|
||
* Ported to JavaScript by Stefan Thomas.
|
||
*/
|
||
decode: function (input) {
|
||
var bi = BigInteger.valueOf(0);
|
||
var leadingZerosNum = 0;
|
||
for (var i = input.length - 1; i >= 0; i--) {
|
||
var alphaIndex = B58.alphabet.indexOf(input[i]);
|
||
if (alphaIndex < 0) {
|
||
throw "Invalid character";
|
||
}
|
||
bi = bi.add(BigInteger.valueOf(alphaIndex)
|
||
.multiply(B58.base.pow(input.length - 1 - i)));
|
||
|
||
// This counts leading zero bytes
|
||
if (input[i] == "1") leadingZerosNum++;
|
||
else leadingZerosNum = 0;
|
||
}
|
||
var bytes = bi.toByteArrayUnsigned();
|
||
|
||
// Add leading zeros
|
||
while (leadingZerosNum-- > 0) bytes.unshift(0);
|
||
|
||
return bytes;
|
||
}
|
||
};
|
||
|
||
var B58 = Bitcoin.Base58;
|
||
})(
|
||
'undefined' != typeof Bitcoin ? Bitcoin : module.exports
|
||
);
|
||
</script>
|
||
<script type="text/javascript">
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js
|
||
Bitcoin.Address = function (bytes) {
|
||
this.hash = bytes;
|
||
this.version = Bitcoin.Address.networkVersion;
|
||
};
|
||
|
||
Bitcoin.Address.networkVersion = 0x3F; // mainnet
|
||
|
||
/**
|
||
* Serialize this object as a standard Bitcoin address.
|
||
*
|
||
* Returns the address as a base58-encoded string in the standardized format.
|
||
*/
|
||
Bitcoin.Address.prototype.toString = function () {
|
||
// Get a copy of the hash
|
||
var hash = (this.hash).toString().toLowerCase();
|
||
return create_address(hash);
|
||
};
|
||
|
||
Bitcoin.Address.prototype.getHashBase64 = function () {
|
||
return Crypto.util.bytesToBase64(this.hash);
|
||
};
|
||
|
||
/**
|
||
* Parse a Bitcoin address contained in a string.
|
||
*/
|
||
Bitcoin.Address.decodeString = function (string) {
|
||
var bytes = Bitcoin.Base58.decode(string);
|
||
var hash = bytes.slice(0, 21);
|
||
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
|
||
|
||
if (checksum[0] != bytes[21] ||
|
||
checksum[1] != bytes[22] ||
|
||
checksum[2] != bytes[23] ||
|
||
checksum[3] != bytes[24]) {
|
||
throw "Checksum validation failed!";
|
||
}
|
||
|
||
var version = hash.shift();
|
||
|
||
if (version != 0) {
|
||
throw "Version " + version + " not supported!";
|
||
}
|
||
|
||
return hash;
|
||
};
|
||
</script>
|
||
<script type="text/javascript">
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js
|
||
Bitcoin.ECDSA = (function () {
|
||
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var rng = new SecureRandom();
|
||
|
||
var P_OVER_FOUR = null;
|
||
|
||
function implShamirsTrick(P, k, Q, l) {
|
||
var m = Math.max(k.bitLength(), l.bitLength());
|
||
var Z = P.add2D(Q);
|
||
var R = P.curve.getInfinity();
|
||
|
||
for (var i = m - 1; i >= 0; --i) {
|
||
R = R.twice2D();
|
||
|
||
R.z = BigInteger.ONE;
|
||
|
||
if (k.testBit(i)) {
|
||
if (l.testBit(i)) {
|
||
R = R.add2D(Z);
|
||
} else {
|
||
R = R.add2D(P);
|
||
}
|
||
} else {
|
||
if (l.testBit(i)) {
|
||
R = R.add2D(Q);
|
||
}
|
||
}
|
||
}
|
||
|
||
return R;
|
||
};
|
||
|
||
var ECDSA = {
|
||
getBigRandom: function (limit) {
|
||
return new BigInteger(limit.bitLength(), rng)
|
||
.mod(limit.subtract(BigInteger.ONE))
|
||
.add(BigInteger.ONE);
|
||
},
|
||
sign: function (hash, priv) {
|
||
var d = priv;
|
||
var n = ecparams.getN();
|
||
var e = BigInteger.fromByteArrayUnsigned(hash);
|
||
|
||
do {
|
||
var k = ECDSA.getBigRandom(n);
|
||
var G = ecparams.getG();
|
||
var Q = G.multiply(k);
|
||
var r = Q.getX().toBigInteger().mod(n);
|
||
} while (r.compareTo(BigInteger.ZERO) <= 0);
|
||
|
||
var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);
|
||
|
||
return ECDSA.serializeSig(r, s);
|
||
},
|
||
|
||
verify: function (hash, sig, pubkey) {
|
||
var r, s;
|
||
if (Bitcoin.Util.isArray(sig)) {
|
||
var obj = ECDSA.parseSig(sig);
|
||
r = obj.r;
|
||
s = obj.s;
|
||
} else if ("object" === typeof sig && sig.r && sig.s) {
|
||
r = sig.r;
|
||
s = sig.s;
|
||
} else {
|
||
throw "Invalid value for signature";
|
||
}
|
||
|
||
var Q;
|
||
if (pubkey instanceof ec.PointFp) {
|
||
Q = pubkey;
|
||
} else if (Bitcoin.Util.isArray(pubkey)) {
|
||
Q = EllipticCurve.PointFp.decodeFrom(ecparams.getCurve(), pubkey);
|
||
} else {
|
||
throw "Invalid format for pubkey value, must be byte array or ec.PointFp";
|
||
}
|
||
var e = BigInteger.fromByteArrayUnsigned(hash);
|
||
|
||
return ECDSA.verifyRaw(e, r, s, Q);
|
||
},
|
||
|
||
verifyRaw: function (e, r, s, Q) {
|
||
var n = ecparams.getN();
|
||
var G = ecparams.getG();
|
||
|
||
if (r.compareTo(BigInteger.ONE) < 0 ||
|
||
r.compareTo(n) >= 0)
|
||
return false;
|
||
|
||
if (s.compareTo(BigInteger.ONE) < 0 ||
|
||
s.compareTo(n) >= 0)
|
||
return false;
|
||
|
||
var c = s.modInverse(n);
|
||
|
||
var u1 = e.multiply(c).mod(n);
|
||
var u2 = r.multiply(c).mod(n);
|
||
|
||
// TODO(!!!): For some reason Shamir's trick isn't working with
|
||
// signed message verification!? Probably an implementation
|
||
// error!
|
||
//var point = implShamirsTrick(G, u1, Q, u2);
|
||
var point = G.multiply(u1).add(Q.multiply(u2));
|
||
|
||
var v = point.getX().toBigInteger().mod(n);
|
||
|
||
return v.equals(r);
|
||
},
|
||
|
||
/**
|
||
* Serialize a signature into DER format.
|
||
*
|
||
* Takes two BigIntegers representing r and s and returns a byte array.
|
||
*/
|
||
serializeSig: function (r, s) {
|
||
var rBa = r.toByteArraySigned();
|
||
var sBa = s.toByteArraySigned();
|
||
|
||
var sequence = [];
|
||
sequence.push(0x02); // INTEGER
|
||
sequence.push(rBa.length);
|
||
sequence = sequence.concat(rBa);
|
||
|
||
sequence.push(0x02); // INTEGER
|
||
sequence.push(sBa.length);
|
||
sequence = sequence.concat(sBa);
|
||
|
||
sequence.unshift(sequence.length);
|
||
sequence.unshift(0x30); // SEQUENCE
|
||
|
||
return sequence;
|
||
},
|
||
|
||
/**
|
||
* Parses a byte array containing a DER-encoded signature.
|
||
*
|
||
* This function will return an object of the form:
|
||
*
|
||
* {
|
||
* r: BigInteger,
|
||
* s: BigInteger
|
||
* }
|
||
*/
|
||
parseSig: function (sig) {
|
||
var cursor;
|
||
if (sig[0] != 0x30)
|
||
throw new Error("Signature not a valid DERSequence");
|
||
|
||
cursor = 2;
|
||
if (sig[cursor] != 0x02)
|
||
throw new Error("First element in signature must be a DERInteger"); ;
|
||
var rBa = sig.slice(cursor + 2, cursor + 2 + sig[cursor + 1]);
|
||
|
||
cursor += 2 + sig[cursor + 1];
|
||
if (sig[cursor] != 0x02)
|
||
throw new Error("Second element in signature must be a DERInteger");
|
||
var sBa = sig.slice(cursor + 2, cursor + 2 + sig[cursor + 1]);
|
||
|
||
cursor += 2 + sig[cursor + 1];
|
||
|
||
//if (cursor != sig.length)
|
||
// throw new Error("Extra bytes in signature");
|
||
|
||
var r = BigInteger.fromByteArrayUnsigned(rBa);
|
||
var s = BigInteger.fromByteArrayUnsigned(sBa);
|
||
|
||
return { r: r, s: s };
|
||
},
|
||
|
||
parseSigCompact: function (sig) {
|
||
if (sig.length !== 65) {
|
||
throw "Signature has the wrong length";
|
||
}
|
||
|
||
// Signature is prefixed with a type byte storing three bits of
|
||
// information.
|
||
var i = sig[0] - 27;
|
||
if (i < 0 || i > 7) {
|
||
throw "Invalid signature type";
|
||
}
|
||
|
||
var n = ecparams.getN();
|
||
var r = BigInteger.fromByteArrayUnsigned(sig.slice(1, 33)).mod(n);
|
||
var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 65)).mod(n);
|
||
|
||
return { r: r, s: s, i: i };
|
||
},
|
||
|
||
/**
|
||
* Recover a public key from a signature.
|
||
*
|
||
* See SEC 1: Elliptic Curve Cryptography, section 4.1.6, "Public
|
||
* Key Recovery Operation".
|
||
*
|
||
* http://www.secg.org/download/aid-780/sec1-v2.pdf
|
||
*/
|
||
recoverPubKey: function (r, s, hash, i) {
|
||
// The recovery parameter i has two bits.
|
||
i = i & 3;
|
||
|
||
// The less significant bit specifies whether the y coordinate
|
||
// of the compressed point is even or not.
|
||
var isYEven = i & 1;
|
||
|
||
// The more significant bit specifies whether we should use the
|
||
// first or second candidate key.
|
||
var isSecondKey = i >> 1;
|
||
|
||
var n = ecparams.getN();
|
||
var G = ecparams.getG();
|
||
var curve = ecparams.getCurve();
|
||
var p = curve.getQ();
|
||
var a = curve.getA().toBigInteger();
|
||
var b = curve.getB().toBigInteger();
|
||
|
||
// We precalculate (p + 1) / 4 where p is if the field order
|
||
if (!P_OVER_FOUR) {
|
||
P_OVER_FOUR = p.add(BigInteger.ONE).divide(BigInteger.valueOf(4));
|
||
}
|
||
|
||
// 1.1 Compute x
|
||
var x = isSecondKey ? r.add(n) : r;
|
||
|
||
// 1.3 Convert x to point
|
||
var alpha = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p);
|
||
var beta = alpha.modPow(P_OVER_FOUR, p);
|
||
|
||
var xorOdd = beta.isEven() ? (i % 2) : ((i + 1) % 2);
|
||
// If beta is even, but y isn't or vice versa, then convert it,
|
||
// otherwise we're done and y == beta.
|
||
var y = (beta.isEven() ? !isYEven : isYEven) ? beta : p.subtract(beta);
|
||
|
||
// 1.4 Check that nR is at infinity
|
||
var R = new EllipticCurve.PointFp(curve,
|
||
curve.fromBigInteger(x),
|
||
curve.fromBigInteger(y));
|
||
R.validate();
|
||
|
||
// 1.5 Compute e from M
|
||
var e = BigInteger.fromByteArrayUnsigned(hash);
|
||
var eNeg = BigInteger.ZERO.subtract(e).mod(n);
|
||
|
||
// 1.6 Compute Q = r^-1 (sR - eG)
|
||
var rInv = r.modInverse(n);
|
||
var Q = implShamirsTrick(R, s, G, eNeg).multiply(rInv);
|
||
|
||
Q.validate();
|
||
if (!ECDSA.verifyRaw(e, r, s, Q)) {
|
||
throw "Pubkey recovery unsuccessful";
|
||
}
|
||
|
||
var pubKey = new Bitcoin.ECKey();
|
||
pubKey.pub = Q;
|
||
return pubKey;
|
||
},
|
||
|
||
/**
|
||
* Calculate pubkey extraction parameter.
|
||
*
|
||
* When extracting a pubkey from a signature, we have to
|
||
* distinguish four different cases. Rather than putting this
|
||
* burden on the verifier, Bitcoin includes a 2-bit value with the
|
||
* signature.
|
||
*
|
||
* This function simply tries all four cases and returns the value
|
||
* that resulted in a successful pubkey recovery.
|
||
*/
|
||
calcPubkeyRecoveryParam: function (address, r, s, hash) {
|
||
for (var i = 0; i < 4; i++) {
|
||
try {
|
||
var pubkey = Bitcoin.ECDSA.recoverPubKey(r, s, hash, i);
|
||
if (pubkey.getBitcoinAddress().toString() == address) {
|
||
return i;
|
||
}
|
||
} catch (e) { }
|
||
}
|
||
throw "Unable to find valid recovery factor";
|
||
}
|
||
};
|
||
|
||
return ECDSA;
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
Bitcoin.KeyPool = (function () {
|
||
var KeyPool = function () {
|
||
this.keyArray = [];
|
||
|
||
this.push = function (item) {
|
||
if (item == null || item.priv == null) return;
|
||
var doAdd = true;
|
||
// prevent duplicates from being added to the array
|
||
for (var index in this.keyArray) {
|
||
var currentItem = this.keyArray[index];
|
||
if (currentItem != null && currentItem.priv != null && item.getBitcoinAddress() == currentItem.getBitcoinAddress()) {
|
||
doAdd = false;
|
||
break;
|
||
}
|
||
}
|
||
if (doAdd) this.keyArray.push(item);
|
||
};
|
||
|
||
this.reset = function () {
|
||
this.keyArray = [];
|
||
};
|
||
|
||
this.getArray = function () {
|
||
// copy array
|
||
return this.keyArray.slice(0);
|
||
};
|
||
|
||
this.setArray = function (ka) {
|
||
this.keyArray = ka;
|
||
};
|
||
|
||
this.length = function () {
|
||
return this.keyArray.length;
|
||
};
|
||
|
||
this.toString = function () {
|
||
var keyPoolString = "# = " + this.length() + "\n";
|
||
var pool = this.getArray();
|
||
for (var index in pool) {
|
||
var item = pool[index];
|
||
if (Bitcoin.Util.hasMethods(item, 'getBitcoinAddress', 'toString')) {
|
||
if (item != null) {
|
||
keyPoolString += "\"" + item.getBitcoinAddress() + "\"" + ", \"" + item.toString("wif") + "\"\n";
|
||
}
|
||
}
|
||
}
|
||
|
||
return keyPoolString;
|
||
};
|
||
|
||
return this;
|
||
};
|
||
|
||
return new KeyPool();
|
||
})();
|
||
|
||
Bitcoin.Bip38Key = (function () {
|
||
var Bip38 = function (address, encryptedKey) {
|
||
this.address = address;
|
||
this.priv = encryptedKey;
|
||
};
|
||
|
||
Bip38.prototype.getBitcoinAddress = function () {
|
||
return this.address;
|
||
};
|
||
|
||
Bip38.prototype.toString = function () {
|
||
return this.priv;
|
||
};
|
||
|
||
return Bip38;
|
||
})();
|
||
|
||
//https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js
|
||
Bitcoin.ECKey = (function () {
|
||
var ECDSA = Bitcoin.ECDSA;
|
||
var KeyPool = Bitcoin.KeyPool;
|
||
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
|
||
|
||
var ECKey = function (input) {
|
||
if (!input) {
|
||
// Generate new key
|
||
var n = ecparams.getN();
|
||
this.priv = ECDSA.getBigRandom(n);
|
||
} else if (input instanceof BigInteger) {
|
||
// Input is a private key value
|
||
this.priv = input;
|
||
} else if (Bitcoin.Util.isArray(input)) {
|
||
// Prepend zero byte to prevent interpretation as negative integer
|
||
this.priv = BigInteger.fromByteArrayUnsigned(input);
|
||
} else if ("string" == typeof input) {
|
||
var bytes = null;
|
||
try{
|
||
if (ECKey.isWalletImportFormat(input)) {
|
||
bytes = ECKey.decodeWalletImportFormat(input);
|
||
} else if (ECKey.isCompressedWalletImportFormat(input)) {
|
||
bytes = ECKey.decodeCompressedWalletImportFormat(input);
|
||
this.compressed = true;
|
||
} else if (ECKey.isMiniFormat(input)) {
|
||
bytes = Crypto.SHA256(input, { asBytes: true });
|
||
} else if (ECKey.isHexFormat(input)) {
|
||
bytes = Crypto.util.hexToBytes(input);
|
||
} else if (ECKey.isBase64Format(input)) {
|
||
bytes = Crypto.util.base64ToBytes(input);
|
||
}
|
||
} catch (exc1) {
|
||
this.setError(exc1);
|
||
}
|
||
|
||
if (ECKey.isBase6Format(input)) {
|
||
this.priv = new BigInteger(input, 6);
|
||
} else if (bytes == null || bytes.length != 32) {
|
||
this.priv = null;
|
||
} else {
|
||
// Prepend zero byte to prevent interpretation as negative integer
|
||
this.priv = BigInteger.fromByteArrayUnsigned(bytes);
|
||
}
|
||
}
|
||
|
||
this.compressed = (this.compressed == undefined) ? !!ECKey.compressByDefault : this.compressed;
|
||
try {
|
||
// check not zero
|
||
if (this.priv != null && BigInteger.ZERO.compareTo(this.priv) == 0) this.setError("Error: BigInteger equal to zero.");
|
||
// valid range [0x1, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140])
|
||
var hexKeyRangeLimit = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140";
|
||
var rangeLimitBytes = Crypto.util.hexToBytes(hexKeyRangeLimit);
|
||
var limitBigInt = BigInteger.fromByteArrayUnsigned(rangeLimitBytes);
|
||
if (this.priv != null && limitBigInt.compareTo(this.priv) < 0) this.setError("Error: BigInteger outside of curve range.")
|
||
|
||
if (this.priv != null) {
|
||
KeyPool.push(this);
|
||
}
|
||
} catch (exc2) {
|
||
this.setError(exc2);
|
||
}
|
||
};
|
||
|
||
ECKey.privateKeyPrefix = 0xBF; // mainnet 0x80 testnet 0xEF
|
||
|
||
/**
|
||
* Whether public keys should be returned compressed by default.
|
||
*/
|
||
ECKey.compressByDefault = false;
|
||
|
||
/**
|
||
* Set whether the public key should be returned compressed or not.
|
||
*/
|
||
ECKey.prototype.setError = function (err) {
|
||
this.error = err;
|
||
this.priv = null;
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Set whether the public key should be returned compressed or not.
|
||
*/
|
||
ECKey.prototype.setCompressed = function (v) {
|
||
this.compressed = !!v;
|
||
if (this.pubPoint) this.pubPoint.compressed = this.compressed;
|
||
return this;
|
||
};
|
||
|
||
/*
|
||
* Return public key as a byte array in DER encoding
|
||
*/
|
||
ECKey.prototype.getPub = function () {
|
||
if (this.compressed) {
|
||
if (this.pubComp) return this.pubComp;
|
||
return this.pubComp = this.getPubPoint().getEncoded(1);
|
||
} else {
|
||
if (this.pubUncomp) return this.pubUncomp;
|
||
return this.pubUncomp = this.getPubPoint().getEncoded(0);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Return public point as ECPoint object.
|
||
*/
|
||
ECKey.prototype.getPubPoint = function () {
|
||
if (!this.pubPoint) {
|
||
this.pubPoint = ecparams.getG().multiply(this.priv);
|
||
this.pubPoint.compressed = this.compressed;
|
||
}
|
||
return this.pubPoint;
|
||
};
|
||
|
||
ECKey.prototype.getPubKeyHex = function () {
|
||
if (this.compressed) {
|
||
if (this.pubKeyHexComp) return this.pubKeyHexComp;
|
||
return this.pubKeyHexComp = Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase();
|
||
} else {
|
||
if (this.pubKeyHexUncomp) return this.pubKeyHexUncomp;
|
||
return this.pubKeyHexUncomp = Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Get the pubKeyHash for this key.
|
||
*
|
||
* This is calculated as RIPE160(SHA256([encoded pubkey])) and returned as
|
||
* a byte array.
|
||
*/
|
||
ECKey.prototype.getPubKeyHash = function () {
|
||
if (this.compressed) {
|
||
if (this.pubKeyHashComp) return this.pubKeyHashComp;
|
||
return this.pubKeyHashComp = Bitcoin.Util.sha256ripe160(this.getPub());
|
||
} else {
|
||
if (this.pubKeyHashUncomp) return this.pubKeyHashUncomp;
|
||
return this.pubKeyHashUncomp = Bitcoin.Util.sha256ripe160(this.getPub());
|
||
}
|
||
};
|
||
|
||
ECKey.prototype.getBitcoinAddress = function () {
|
||
var hash = this.getPubKeyHex();
|
||
var addr = new Bitcoin.Address(hash);
|
||
return addr.toString();
|
||
};
|
||
|
||
/*
|
||
* Takes a public point as a hex string or byte array
|
||
*/
|
||
ECKey.prototype.setPub = function (pub) {
|
||
// byte array
|
||
if (Bitcoin.Util.isArray(pub)) {
|
||
pub = Crypto.util.bytesToHex(pub).toString().toUpperCase();
|
||
}
|
||
var ecPoint = ecparams.getCurve().decodePointHex(pub);
|
||
this.setCompressed(ecPoint.compressed);
|
||
this.pubPoint = ecPoint;
|
||
return this;
|
||
};
|
||
|
||
// Sipa Private Key Wallet Import Format
|
||
ECKey.prototype.getBitcoinWalletImportFormat = function () {
|
||
var bytes = this.getBitcoinHexFormat().toLowerCase();
|
||
return prvKey_to_WIF(bytes, this.compressed);
|
||
};
|
||
|
||
// Private Key Hex Format
|
||
ECKey.prototype.getBitcoinHexFormat = function () {
|
||
return Crypto.util.bytesToHex(this.getBitcoinPrivateKeyByteArray()).toString().toUpperCase();
|
||
};
|
||
|
||
// Private Key Base64 Format
|
||
ECKey.prototype.getBitcoinBase64Format = function () {
|
||
return Crypto.util.bytesToBase64(this.getBitcoinPrivateKeyByteArray());
|
||
};
|
||
|
||
ECKey.prototype.getBitcoinPrivateKeyByteArray = function () {
|
||
if (this.priv == null) return null;
|
||
// Get a copy of private key as a byte array
|
||
var bytes = this.priv.toByteArrayUnsigned();
|
||
// zero pad if private key is less than 32 bytes
|
||
while (bytes.length < 32) bytes.unshift(0x00);
|
||
return bytes;
|
||
};
|
||
|
||
ECKey.prototype.toString = function (format) {
|
||
format = format || "";
|
||
if (format.toString().toLowerCase() == "base64" || format.toString().toLowerCase() == "b64") {
|
||
return this.getBitcoinBase64Format();
|
||
}
|
||
// Wallet Import Format
|
||
else if (format.toString().toLowerCase() == "wif") {
|
||
return this.getBitcoinWalletImportFormat();
|
||
}
|
||
else {
|
||
return this.getBitcoinHexFormat();
|
||
}
|
||
};
|
||
|
||
ECKey.prototype.sign = function (hash) {
|
||
return ECDSA.sign(hash, this.priv);
|
||
};
|
||
|
||
ECKey.prototype.verify = function (hash, sig) {
|
||
return ECDSA.verify(hash, sig, this.getPub());
|
||
};
|
||
|
||
/**
|
||
* Parse a wallet import format private key contained in a string.
|
||
*/
|
||
ECKey.decodeWalletImportFormat = function (privStr) {
|
||
var bytes = Bitcoin.Base58.decode(privStr);
|
||
var hash = bytes.slice(0, 33);
|
||
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
|
||
if (checksum[0] != bytes[33] ||
|
||
checksum[1] != bytes[34] ||
|
||
checksum[2] != bytes[35] ||
|
||
checksum[3] != bytes[36]) {
|
||
throw "Checksum validation failed!";
|
||
}
|
||
var version = hash.shift();
|
||
if (version != ECKey.privateKeyPrefix) {
|
||
throw "Version " + version + " not supported!";
|
||
}
|
||
return hash;
|
||
};
|
||
|
||
/**
|
||
* Parse a compressed wallet import format private key contained in a string.
|
||
*/
|
||
ECKey.decodeCompressedWalletImportFormat = function (privStr) {
|
||
var bytes = Bitcoin.Base58.decode(privStr);
|
||
var hash = bytes.slice(0, 34);
|
||
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
|
||
if (checksum[0] != bytes[34] ||
|
||
checksum[1] != bytes[35] ||
|
||
checksum[2] != bytes[36] ||
|
||
checksum[3] != bytes[37]) {
|
||
throw "Checksum validation failed!";
|
||
}
|
||
var version = hash.shift();
|
||
if (version != ECKey.privateKeyPrefix) {
|
||
throw "Version " + version + " not supported!";
|
||
}
|
||
hash.pop();
|
||
return hash;
|
||
};
|
||
|
||
// 64 characters [0-9A-F]
|
||
ECKey.isHexFormat = function (key) {
|
||
key = key.toString();
|
||
return /^[A-Fa-f0-9]{64}$/.test(key);
|
||
};
|
||
|
||
// 51 characters base58, always starts with a '5'
|
||
ECKey.isWalletImportFormat = function (key) {
|
||
key = key.toString();
|
||
return (ECKey.privateKeyPrefix == 0xBF) ?
|
||
(/^7[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key)) :
|
||
(/^6[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key));
|
||
};
|
||
|
||
// 52 characters base58
|
||
ECKey.isCompressedWalletImportFormat = function (key) {
|
||
key = key.toString();
|
||
return (ECKey.privateKeyPrefix == 0xBF) ?
|
||
(/^V[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key)) :
|
||
(/^T[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key));
|
||
};
|
||
|
||
// 44 characters
|
||
ECKey.isBase64Format = function (key) {
|
||
key = key.toString();
|
||
return (/^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=+\/]{44}$/.test(key));
|
||
};
|
||
|
||
// 99 characters, 1=1, if using dice convert 6 to 0
|
||
ECKey.isBase6Format = function (key) {
|
||
key = key.toString();
|
||
return (/^[012345]{99}$/.test(key));
|
||
};
|
||
|
||
// 22, 26 or 30 characters, always starts with an 'S'
|
||
ECKey.isMiniFormat = function (key) {
|
||
key = key.toString();
|
||
var validChars22 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}$/.test(key);
|
||
var validChars26 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}$/.test(key);
|
||
var validChars30 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}$/.test(key);
|
||
var testBytes = Crypto.SHA256(key + "?", { asBytes: true });
|
||
|
||
return ((testBytes[0] === 0x00 || testBytes[0] === 0x01) && (validChars22 || validChars26 || validChars30));
|
||
};
|
||
|
||
return ECKey;
|
||
})();
|
||
</script>
|
||
<script type="text/javascript">
|
||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js
|
||
// Bitcoin utility functions
|
||
Bitcoin.Util = {
|
||
/**
|
||
* Cross-browser compatibility version of Array.isArray.
|
||
*/
|
||
isArray: Array.isArray || function (o) {
|
||
return Object.prototype.toString.call(o) === '[object Array]';
|
||
},
|
||
/**
|
||
* Create an array of a certain length filled with a specific value.
|
||
*/
|
||
makeFilledArray: function (len, val) {
|
||
var array = [];
|
||
var i = 0;
|
||
while (i < len) {
|
||
array[i++] = val;
|
||
}
|
||
return array;
|
||
},
|
||
/**
|
||
* Turn an integer into a "var_int".
|
||
*
|
||
* "var_int" is a variable length integer used by Bitcoin's binary format.
|
||
*
|
||
* Returns a byte array.
|
||
*/
|
||
numToVarInt: function (i) {
|
||
if (i < 0xfd) {
|
||
// unsigned char
|
||
return [i];
|
||
} else if (i <= 1 << 16) {
|
||
// unsigned short (LE)
|
||
return [0xfd, i >>> 8, i & 255];
|
||
} else if (i <= 1 << 32) {
|
||
// unsigned int (LE)
|
||
return [0xfe].concat(Crypto.util.wordsToBytes([i]));
|
||
} else {
|
||
// unsigned long long (LE)
|
||
return [0xff].concat(Crypto.util.wordsToBytes([i >>> 32, i]));
|
||
}
|
||
},
|
||
/**
|
||
* Parse a Bitcoin value byte array, returning a BigInteger.
|
||
*/
|
||
valueToBigInt: function (valueBuffer) {
|
||
if (valueBuffer instanceof BigInteger) return valueBuffer;
|
||
|
||
// Prepend zero byte to prevent interpretation as negative integer
|
||
return BigInteger.fromByteArrayUnsigned(valueBuffer);
|
||
},
|
||
/**
|
||
* Format a Bitcoin value as a string.
|
||
*
|
||
* Takes a BigInteger or byte-array and returns that amount of Bitcoins in a
|
||
* nice standard formatting.
|
||
*
|
||
* Examples:
|
||
* 12.3555
|
||
* 0.1234
|
||
* 900.99998888
|
||
* 34.00
|
||
*/
|
||
formatValue: function (valueBuffer) {
|
||
var value = this.valueToBigInt(valueBuffer).toString();
|
||
var integerPart = value.length > 8 ? value.substr(0, value.length - 8) : '0';
|
||
var decimalPart = value.length > 8 ? value.substr(value.length - 8) : value;
|
||
while (decimalPart.length < 8) decimalPart = "0" + decimalPart;
|
||
decimalPart = decimalPart.replace(/0*$/, '');
|
||
while (decimalPart.length < 2) decimalPart += "0";
|
||
return integerPart + "." + decimalPart;
|
||
},
|
||
/**
|
||
* Parse a floating point string as a Bitcoin value.
|
||
*
|
||
* Keep in mind that parsing user input is messy. You should always display
|
||
* the parsed value back to the user to make sure we understood his input
|
||
* correctly.
|
||
*/
|
||
parseValue: function (valueString) {
|
||
// TODO: Detect other number formats (e.g. comma as decimal separator)
|
||
var valueComp = valueString.split('.');
|
||
var integralPart = valueComp[0];
|
||
var fractionalPart = valueComp[1] || "0";
|
||
while (fractionalPart.length < 8) fractionalPart += "0";
|
||
fractionalPart = fractionalPart.replace(/^0+/g, '');
|
||
var value = BigInteger.valueOf(parseInt(integralPart));
|
||
value = value.multiply(BigInteger.valueOf(100000000));
|
||
value = value.add(BigInteger.valueOf(parseInt(fractionalPart)));
|
||
return value;
|
||
},
|
||
/**
|
||
* Calculate RIPEMD160(SHA256(data)).
|
||
*
|
||
* Takes an arbitrary byte array as inputs and returns the hash as a byte
|
||
* array.
|
||
*/
|
||
sha256ripe160: function (data) {
|
||
return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
|
||
},
|
||
// double sha256
|
||
dsha256: function (data) {
|
||
return Crypto.SHA256(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
|
||
},
|
||
// duck typing method
|
||
hasMethods: function(obj /*, method list as strings */){
|
||
var i = 1, methodName;
|
||
while((methodName = arguments[i++])){
|
||
if(typeof obj[methodName] != 'function') {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
};
|
||
</script>
|
||
<script type="text/javascript">
|
||
/*
|
||
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
|
||
*
|
||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
* of this software and associated documentation files (the "Software"), to deal
|
||
* in the Software without restriction, including without limitation the rights
|
||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
* copies of the Software, and to permit persons to whom the Software is
|
||
* furnished to do so, subject to the following conditions:
|
||
*
|
||
* The above copyright notice and this permission notice shall be included in
|
||
* all copies or substantial portions of the Software.
|
||
*
|
||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
* THE SOFTWARE.
|
||
*/
|
||
// https://github.com/cheongwy/node-scrypt-js
|
||
(function () {
|
||
|
||
var MAX_VALUE = 2147483647;
|
||
var workerUrl = null;
|
||
|
||
//function scrypt(byte[] passwd, byte[] salt, int N, int r, int p, int dkLen)
|
||
/*
|
||
* N = Cpu cost
|
||
* r = Memory cost
|
||
* p = parallelization cost
|
||
*
|
||
*/
|
||
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
|
||
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
|
||
|
||
if (N > MAX_VALUE / 128 / r) throw Error("Parameter N is too large");
|
||
if (r > MAX_VALUE / 128 / p) throw Error("Parameter r is too large");
|
||
|
||
var PBKDF2_opts = { iterations: 1, hasher: Crypto.SHA256, asBytes: true };
|
||
|
||
var B = Crypto.PBKDF2(passwd, salt, p * 128 * r, PBKDF2_opts);
|
||
|
||
try {
|
||
var i = 0;
|
||
var worksDone = 0;
|
||
var makeWorker = function () {
|
||
if (!workerUrl) {
|
||
var code = '(' + scryptCore.toString() + ')()';
|
||
var blob;
|
||
try {
|
||
blob = new Blob([code], { type: "text/javascript" });
|
||
} catch (e) {
|
||
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
|
||
blob = new BlobBuilder();
|
||
blob.append(code);
|
||
blob = blob.getBlob("text/javascript");
|
||
}
|
||
workerUrl = URL.createObjectURL(blob);
|
||
}
|
||
var worker = new Worker(workerUrl);
|
||
worker.onmessage = function (event) {
|
||
var Bi = event.data[0], Bslice = event.data[1];
|
||
worksDone++;
|
||
|
||
if (i < p) {
|
||
worker.postMessage([N, r, p, B, i++]);
|
||
}
|
||
|
||
var length = Bslice.length, destPos = Bi * 128 * r, srcPos = 0;
|
||
while (length--) {
|
||
B[destPos++] = Bslice[srcPos++];
|
||
}
|
||
|
||
if (worksDone == p) {
|
||
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
|
||
}
|
||
};
|
||
return worker;
|
||
};
|
||
var workers = [makeWorker(), makeWorker()];
|
||
workers[0].postMessage([N, r, p, B, i++]);
|
||
if (p > 1) {
|
||
workers[1].postMessage([N, r, p, B, i++]);
|
||
}
|
||
} catch (e) {
|
||
window.setTimeout(function () {
|
||
scryptCore();
|
||
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
|
||
}, 0);
|
||
}
|
||
|
||
// using this function to enclose everything needed to create a worker (but also invokable directly for synchronous use)
|
||
function scryptCore() {
|
||
var XY = [], V = [];
|
||
|
||
if (typeof B === 'undefined') {
|
||
onmessage = function (event) {
|
||
var data = event.data;
|
||
var N = data[0], r = data[1], p = data[2], B = data[3], i = data[4];
|
||
|
||
var Bslice = [];
|
||
arraycopy32(B, i * 128 * r, Bslice, 0, 128 * r);
|
||
smix(Bslice, 0, r, N, V, XY);
|
||
|
||
postMessage([i, Bslice]);
|
||
};
|
||
} else {
|
||
for (var i = 0; i < p; i++) {
|
||
smix(B, i * 128 * r, r, N, V, XY);
|
||
}
|
||
}
|
||
|
||
function smix(B, Bi, r, N, V, XY) {
|
||
var Xi = 0;
|
||
var Yi = 128 * r;
|
||
var i;
|
||
|
||
arraycopy32(B, Bi, XY, Xi, Yi);
|
||
|
||
for (i = 0; i < N; i++) {
|
||
arraycopy32(XY, Xi, V, i * Yi, Yi);
|
||
blockmix_salsa8(XY, Xi, Yi, r);
|
||
}
|
||
|
||
for (i = 0; i < N; i++) {
|
||
var j = integerify(XY, Xi, r) & (N - 1);
|
||
blockxor(V, j * Yi, XY, Xi, Yi);
|
||
blockmix_salsa8(XY, Xi, Yi, r);
|
||
}
|
||
|
||
arraycopy32(XY, Xi, B, Bi, Yi);
|
||
}
|
||
|
||
function blockmix_salsa8(BY, Bi, Yi, r) {
|
||
var X = [];
|
||
var i;
|
||
|
||
arraycopy32(BY, Bi + (2 * r - 1) * 64, X, 0, 64);
|
||
|
||
for (i = 0; i < 2 * r; i++) {
|
||
blockxor(BY, i * 64, X, 0, 64);
|
||
salsa20_8(X);
|
||
arraycopy32(X, 0, BY, Yi + (i * 64), 64);
|
||
}
|
||
|
||
for (i = 0; i < r; i++) {
|
||
arraycopy32(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64);
|
||
}
|
||
|
||
for (i = 0; i < r; i++) {
|
||
arraycopy32(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
|
||
}
|
||
}
|
||
|
||
function R(a, b) {
|
||
return (a << b) | (a >>> (32 - b));
|
||
}
|
||
|
||
function salsa20_8(B) {
|
||
var B32 = new Array(32);
|
||
var x = new Array(32);
|
||
var i;
|
||
|
||
for (i = 0; i < 16; i++) {
|
||
B32[i] = (B[i * 4 + 0] & 0xff) << 0;
|
||
B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
|
||
B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
|
||
B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
|
||
}
|
||
|
||
arraycopy(B32, 0, x, 0, 16);
|
||
|
||
for (i = 8; i > 0; i -= 2) {
|
||
x[4] ^= R(x[0] + x[12], 7); x[8] ^= R(x[4] + x[0], 9);
|
||
x[12] ^= R(x[8] + x[4], 13); x[0] ^= R(x[12] + x[8], 18);
|
||
x[9] ^= R(x[5] + x[1], 7); x[13] ^= R(x[9] + x[5], 9);
|
||
x[1] ^= R(x[13] + x[9], 13); x[5] ^= R(x[1] + x[13], 18);
|
||
x[14] ^= R(x[10] + x[6], 7); x[2] ^= R(x[14] + x[10], 9);
|
||
x[6] ^= R(x[2] + x[14], 13); x[10] ^= R(x[6] + x[2], 18);
|
||
x[3] ^= R(x[15] + x[11], 7); x[7] ^= R(x[3] + x[15], 9);
|
||
x[11] ^= R(x[7] + x[3], 13); x[15] ^= R(x[11] + x[7], 18);
|
||
x[1] ^= R(x[0] + x[3], 7); x[2] ^= R(x[1] + x[0], 9);
|
||
x[3] ^= R(x[2] + x[1], 13); x[0] ^= R(x[3] + x[2], 18);
|
||
x[6] ^= R(x[5] + x[4], 7); x[7] ^= R(x[6] + x[5], 9);
|
||
x[4] ^= R(x[7] + x[6], 13); x[5] ^= R(x[4] + x[7], 18);
|
||
x[11] ^= R(x[10] + x[9], 7); x[8] ^= R(x[11] + x[10], 9);
|
||
x[9] ^= R(x[8] + x[11], 13); x[10] ^= R(x[9] + x[8], 18);
|
||
x[12] ^= R(x[15] + x[14], 7); x[13] ^= R(x[12] + x[15], 9);
|
||
x[14] ^= R(x[13] + x[12], 13); x[15] ^= R(x[14] + x[13], 18);
|
||
}
|
||
|
||
for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i];
|
||
|
||
for (i = 0; i < 16; i++) {
|
||
var bi = i * 4;
|
||
B[bi + 0] = (B32[i] >> 0 & 0xff);
|
||
B[bi + 1] = (B32[i] >> 8 & 0xff);
|
||
B[bi + 2] = (B32[i] >> 16 & 0xff);
|
||
B[bi + 3] = (B32[i] >> 24 & 0xff);
|
||
}
|
||
}
|
||
|
||
function blockxor(S, Si, D, Di, len) {
|
||
var i = len >> 6;
|
||
while (i--) {
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||
}
|
||
}
|
||
|
||
function integerify(B, bi, r) {
|
||
var n;
|
||
|
||
bi += (2 * r - 1) * 64;
|
||
|
||
n = (B[bi + 0] & 0xff) << 0;
|
||
n |= (B[bi + 1] & 0xff) << 8;
|
||
n |= (B[bi + 2] & 0xff) << 16;
|
||
n |= (B[bi + 3] & 0xff) << 24;
|
||
|
||
return n;
|
||
}
|
||
|
||
function arraycopy(src, srcPos, dest, destPos, length) {
|
||
while (length--) {
|
||
dest[destPos++] = src[srcPos++];
|
||
}
|
||
}
|
||
|
||
function arraycopy32(src, srcPos, dest, destPos, length) {
|
||
var i = length >> 5;
|
||
while (i--) {
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||
}
|
||
}
|
||
} // scryptCore
|
||
}; // window.Crypto_scrypt
|
||
})();
|
||
</script>
|
||
<style type="text/css">
|
||
.more { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAAB1UlEQVQ4jYWTS04bQRCGv3q0x8gMYJCwknCGLDgLVwiH4grhLFaUXdhkQ0A8pBg/FOLpnmbhMYzxRKlNS1Vdf/31V5XknGnb+eXJCBjzbzu9OLu+azu845Opysej4wHmshF4uJ2TUrb3CV0gIBAKRboC5C2vdkDE9fdty6/xDegvXz+NgDbFUejZ+PjDgExmtpxS9vYwMe5u5iyX8RRoa5Ic+C4qx9KUN1MGu4E618yqJ5axAp44KA7ZL3eYzp/HKdVIw7WK8d6BuDvcod9TQlBEIOXEdPlElSoUJabIIs4Z7h9yNDwgqOMayLXw7epHVIBggrsgspZPUBQyiCgugRQji7TAVDF1XB2TlQoOYCqovkmpopS9fcoiM3ue0rOCYf8IU8NklWxiiOQ3EPXtWagIqo6KYWYEc4IGvMViA6RrnCJKVS9B8ypRHG1YKNa0Ur+C+MPt/I2BKWVZUO4FgvQ47PcptEDF+T2Z8TiZUMWIyGtpd+Bze5VTSqP57O/4YG+AN/RXbSiPkwmL5z/be/L+mM4vT2JKeUW7EXD1erMz/Lo4u77f0K9DDhdA1XG11jh9vWBb99Z9gAg5QZ2hzpmUa0RSW4f/gqSY0s3Vz+tufEjvHS8Tg6BXC7qVbQAAAABJRU5ErkJggg==)
|
||
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; cursor: pointer; }
|
||
.less { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAABuklEQVQ4ja2US25TQRBFT336OSEY5ESyBfEakNiLt0AW5S2QvQQxAiZIYBwSz/yByH7dxcB2bPMME+hJS/W5fetWVUtE8K/HfzdcXfdfqsr4onuGuRz4Jrdzcg6Gg9HfQYAxAqmlSMMlQJO5/oliE4AtQLcR++btZQ+wPVsvVXbTfXFGEMyWU9rVM0yMu/Gc5bJ+DdztxWcH3otKVzbPmyq5LnwfzSgEBMxlhqJEBFWVKKUgG66rur53oH7aOeWkUlJSRCBHZracssorlLXttHpCpzonaYukjmsiivDu08daAZIJ7oLIVg9BUQgQUVwSua5Z5AWmiqnj6pisVXAAU0F1J6WK0q6e024Fs4cplbXonFxgapisk00MkdiBqDd7oSKoOiqGmZHMSZrwPRYHIMfaKaKsyhI01oni6IaFYptSyiOIT27nOwaq5FyQrUAIC/nBhK+UErRSos55z4878CrneJyTnHOvquymf3mOb+hvy/jw+QuLh5/NORkORvsGrq77dc6xpr0RcH07y3oF8G04GN0f6HdEDhdA1XG1vXb6dsAa+3Z8AREiQwkoEeQoiBzocHDkf/wnvwC5IpRVsUDNUgAAAABJRU5ErkJggg==)
|
||
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; }
|
||
a { position: relative; z-index: 20; }
|
||
.right { text-align: right; }
|
||
.walletarea { display: none; border: 2px solid #f4b517; }
|
||
hr { margin: 20px 0; border-top: 2px dashed #008000; }
|
||
.keyarea { height: 110px; text-align: left; position: relative; padding: 5px; }
|
||
.keyarea .public { float: left; }
|
||
.keyarea .pubaddress { display: inline-block; height: 40px; padding: 0 0 0 10px; float: left; }
|
||
.keyarea .privwif { margin: 0; float: right; text-align: right; padding: 0 20px 0 0; position: relative; }
|
||
.keyarea .label { font-weight: bold; }
|
||
.keyarea .output { display: block; font-family: monospace; font-size: 1.25em; }
|
||
.keyarea .qrcode_public { display: inline-block; float: left; }
|
||
.keyarea .qrcode_private { display: inline-block; position: relative; top: 28px; float: right; }
|
||
.pubkeyhex { word-wrap: break-word; }
|
||
.keyarea .public .pubaddress .output, .keyarea .private .privwif .output { text-align: center; }
|
||
#SinglePubAddressBG { background-color: white; width: 305px; }
|
||
#SinglePrivWifBG { background-color: white; width: 470px; left: 90px; }
|
||
.keyarea .public .qrcode_public canvas, .keyarea .private .qrcode_private canvas { background-color: white; padding: 0px; }
|
||
.imageSingle { width: 806px; height: 237px; top: -2px; left: 0px; display: block; float: left; overflow: hidden; position: absolute; z-index: -1; }
|
||
.removeImage { visibility: hidden; }
|
||
body { font-family: Arial; }
|
||
body, html { height: 99%; }
|
||
.faqs ol { padding: 0 0 0 25px; }
|
||
.faqs li { padding: 3px 0; }
|
||
.question { padding: 10px 15px; text-align: left; cursor: pointer; }
|
||
.question:hover, .expandable:hover { color: #77777A; }
|
||
.answer { padding: 0 15px 10px 25px; text-align: left; display: none; font-size: 80%; }
|
||
.faq { border: 0; border-top: 2px solid #f4b517; }
|
||
.button { margin-left: 5px; margin-right: 5px; }
|
||
input[type=checkbox] { position: relative; z-index: 20; }
|
||
|
||
#wallets { clear: both; }
|
||
#btcaddress, #btcprivwif, #detailaddress, #detailaddresscomp, #detailprivwif, #detailprivwifcomp { font-family: monospace; font-size: 1.25em; }
|
||
#seedpoolarea { display: none; }
|
||
#seedpooldisplay { font-family: monospace; font-size: 1em; width: 640px; padding: 15px 5px; word-wrap: break-word; }
|
||
.seedpoint { width: 6px; height: 6px; display: block; border-radius: 3px; background-color: #f4b517; position: absolute; z-index: 10; }
|
||
#generate { font-family: monospace; font-size: 1.25em; height: 305px; text-align: left; position: relative; padding: 5px; border: 2px solid #f4b517; clear: both; }
|
||
#generate span { padding: 5px 5px 0 5px; }
|
||
#generatekeyinput { position: relative; z-index: 20; }
|
||
#keyarea { height: 250px; }
|
||
#keyarea .pubaddress { float: none; display: block; padding: 0; height: auto; }
|
||
#keyarea .label { text-decoration: none; }
|
||
#keyarea .privwif { float: none; text-align: right; position: relative; padding: 0; }
|
||
#keyarea .qrcode_public { float: none; display: block; padding: 13px 11px 11px 11px; }
|
||
#keyarea .qrcode_private { float: none; display: block; top: 0; text-align: right; padding: 13px 11px 11px 11px; }
|
||
#keyarea .private { width: 30%; display: table-cell; }
|
||
#keyarea .public { width: 30%; display: table-cell; }
|
||
#singlearea { font-size: 90%; }
|
||
#singlesecret { position: relative; top: -130px; float: right; right: 200px; color: 000000; font-weight: bolder; font-size: 200%; }
|
||
#singleshare { position: relative; top: -110px; float: left; left: 160px; color: #000000; font-weight: bolder; font-size: 200%; }
|
||
#singlesafety { text-align: left; padding: 5px; border-top: 2px solid #f4b517; top: -25px; position: relative; }
|
||
#main { position: relative; text-align: center; margin: 0px auto; width: 808px; }
|
||
#logo { width: 583px; height: 164px; }
|
||
|
||
#paperarea { min-height: 120px; display: none; }
|
||
#paperarea .keyarea { border: 2px solid #f4b517; border-top: 0; }
|
||
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: Ubuntu, Arial; padding: 0; margin: 0; }
|
||
#paperarea .artwallet .papersvg { width: 486px; height: 261px; border: 0; margin: 0; padding: 0; left: 0; }
|
||
#paperarea .artwallet .qrcode_public { top: 52px; left: 17px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
|
||
padding: 5px 5px 2px 5px; }
|
||
#paperarea .artwallet .qrcode_private { top: 104px; left: 360px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
|
||
padding: 5px 5px 2px 5px; }
|
||
#paperarea .artwallet .btcaddress
|
||
{
|
||
position: absolute; top: 240px; left: 139px; z-index: 100; font-size: 10px; background-color: transparent;
|
||
font-weight:bold; color: #000000; margin: 0;
|
||
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
|
||
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
|
||
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
|
||
-o-transform-origin:top left; -o-transform:rotate(-90deg);
|
||
transform-origin:top left; transform:rotate(-90deg);
|
||
}
|
||
#paperarea .artwallet .btcprivwif
|
||
{
|
||
position: absolute; top: 257px; left: 346px; z-index: 100; font-size: 7px; background-color: transparent;
|
||
font-weight:bold; color: #000000; margin: 0;
|
||
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
|
||
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
|
||
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
|
||
-o-transform-origin:top left; -o-transform:rotate(-90deg);
|
||
transform-origin:top left; transform:rotate(-90deg);
|
||
}
|
||
#paperarea .artwallet .btcencryptedkey
|
||
{
|
||
position: absolute; top: 174px; left: 332px; z-index: 100; font-size: 8px; background-color: transparent;
|
||
font-weight:bold; color: #000000; margin: 0;
|
||
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
|
||
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
|
||
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
|
||
-o-transform-origin:top left; -o-transform:rotate(-90deg);
|
||
transform-origin:top left; transform:rotate(-90deg);
|
||
}
|
||
#bulkarea .body { padding: 5px 0 0 0; }
|
||
#bulkarea .format { font-style: italic; font-size: 90%; }
|
||
#bulktextarea { font-size: 90%; width: 98%; margin: 4px 0 0 0; }
|
||
#brainarea .keyarea { visibility: hidden; min-height: 110px; }
|
||
#brainview { margin-left: 5px; }
|
||
#detailkeyarea { padding: 10px; }
|
||
#detailarea { margin: 0; text-align: left; }
|
||
#detailarea .notes { text-align: left; font-size: 80%; padding: 0 0 20px 0; }
|
||
#detailarea .pubqr .item .label { text-decoration: none; }
|
||
#detailarea .pubqr .item { float: left; margin: 10px 0; position: relative; }
|
||
#detailarea .pubqr .item.right { float: right; position: relative; top: 0; }
|
||
#detailarea .privqr .item .label { text-decoration: none; }
|
||
#detailarea .privqr .item { float: left; margin: 0; position: relative; }
|
||
#detailarea .privqr .item.right { float: right; position: relative; }
|
||
#detailarea .item { margin: 10px 0; position: relative; font-size: 90%; padding: 1px 0; }
|
||
#detailarea .item.clear { clear: both; padding-top: 10px; }
|
||
#detailarea .label { display: block; font-weight: bold; }
|
||
#detailarea .output { display: block; font-family: monospace; font-size: 1.25em; }
|
||
#detailarea #detailqrcodepublic { position: relative; float: left; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
|
||
#detailarea #detailqrcodepubliccomp { position: relative; float: right; margin: 0 0 0 10px; padding: 13px 11px 11px 11px; }
|
||
#detailarea #detailqrcodeprivate { position: relative; float: left; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
|
||
#detailarea #detailqrcodeprivatecomp { position: relative; float: right; margin: 0 0 0 10px; padding: 13px 11px 11px 11px; }
|
||
#detailarea #detailqrcodeprivatebip38 { position: relative; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
|
||
#detailpubkey { width: 590px; }
|
||
#detailbip38commands { display: none; padding-top: 5px; }
|
||
#detailbip38toggle { padding-top: 5px; }
|
||
#vanityarea { text-align: left; }
|
||
#vanityarea .label { text-decoration: underline; }
|
||
#vanityarea .output { font-family: monospace; font-size: 1.25em; display: block; }
|
||
#vanityarea .notes { text-align: left; font-size: 80%; padding: 0 0 20px 0; }
|
||
#vanitystep1area { display: none; text-align: left; position: relative; padding: 15px; border-bottom: 2px solid #f4b517; }
|
||
#vanitystep1label { padding-left: 5px; }
|
||
#vanitystep2area { border-top: 2px solid #f4b517; display: block; padding: 15px; }
|
||
#vanitystep2inputs { padding: 0 15px 10px 15px; }
|
||
#vanitycalc { margin-top: 5px; }
|
||
|
||
#splitarea { text-align: left; }
|
||
#splitarea span { padding: 0; }
|
||
#splitcommands { padding: 10px 15px; text-align: left; }
|
||
#combinecommands { padding: 10px 15px; }
|
||
#splitstep1area { display: none; text-align: left; position: relative; padding: 0; border-bottom: 2px solid #f4b517; }
|
||
.splitsharerow { border-bottom: 2px solid #f4b517; padding: 15px; }
|
||
.splitsharerow:last-child { border-bottom: 0; }
|
||
#combinelabelprivatekey { text-decoration: underline; }
|
||
#splitarea .output { display: block; font-family: monospace; font-size: 1.25em; }
|
||
#splitarea span.output { display: inline; }
|
||
#splitstep2area { padding: 10px 15px; }
|
||
|
||
.englishjson { text-align: center; padding: 40px 0 20px 0; }
|
||
.unittests { text-align: center; }
|
||
.unittests div { width: 894px; font-family: monospace; text-align: left; margin: auto; padding: 5px; border: 1px solid black; }
|
||
#testnet { display: none; background-color: Orange; color: #000000; border-radius: 5px; font-weight: bold; padding: 10px 0; margin: 0 auto 20px auto; }
|
||
#busyblock { position: fixed; display: none; background: url("data:image/gif;base64,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") #ccc no-repeat center; opacity: 0.4; width: 100%; height: 100%; top: 0; left: 0; z-index: 5000; }
|
||
#busyblock.busy { display: block; }
|
||
.hide { display: none; }
|
||
.show { display: block; }
|
||
|
||
@media screen
|
||
{
|
||
#tagline { margin: 0 0 15px 0; font-style: italic; }
|
||
.menu
|
||
{
|
||
text-align: left; margin: 0; padding: 0; display: block;
|
||
background-color: #f4b517; /* # 009900 # 53c100 */
|
||
border-top-left-radius: 5px; border-top-right-radius: 5px;
|
||
}
|
||
.menu .tab
|
||
{
|
||
position: relative; display: inline-block; border: 0px solid red;
|
||
margin: 0; list-style: none; z-index: 110; cursor: pointer;
|
||
top: 1px; padding: 10px 20px; width: 360px; /* 120px */ text-align: center;
|
||
}
|
||
.menu .tab.selected
|
||
{
|
||
cursor: default;
|
||
background-color: #FFF; margin: 6px 16px; padding: 4px; border-radius: 5px;
|
||
}
|
||
.menu .tab:hover
|
||
{
|
||
background-color: #FFF; margin: 6px 16px; padding: 4px; border-radius: 5px;
|
||
}
|
||
.menu .tab.selected:hover { color: #000; }
|
||
|
||
.pagebreak { height: 50px; }
|
||
.commands { border-bottom: 2px solid #f4b517; padding: 10px 2px; margin-bottom: 0; }
|
||
.commands .row { padding: 0 0; text-align: left; }
|
||
.commands .row.extra { padding-top: 6px; }
|
||
.commands span { padding: 0 10px; }
|
||
.commands span.print { float: right; position: relative; z-index: 20; }
|
||
.commands span.right { float: right; }
|
||
.expandable { padding: 10px 15px; text-align: left; cursor: pointer; }
|
||
|
||
#menu { visibility: visible; font-size: 90%; }
|
||
#culturemenu { text-align: center; padding: 0 10px 5px 10px; margin-bottom: 3px; font-size: 90%; }
|
||
#culturemenu span { padding: 3px; }
|
||
#culturemenu .selected { text-decoration: none; color: #000000; }
|
||
.culturemenurow { padding: 2px 0; }
|
||
|
||
#braincommands .row .label { width: 200px; display: inline-block; }
|
||
#braincommands .notes { font-size: 80%; display: block; padding: 5px 10px; }
|
||
#brainpassphrase { width: 280px; position: relative; z-index: 20; }
|
||
#brainpassphraseconfirm { width: 280px; position: relative; z-index: 20; }
|
||
#brainpassphraseshow { position: relative; z-index: 20; }
|
||
#brainview { position: relative; z-index: 20; }
|
||
#brainwarning { }
|
||
#detailcommands { padding: 10px 0; }
|
||
#detailcommands span { padding: 0 10px; }
|
||
#detailprivkey { width: 460px; position: relative; z-index: 20; }
|
||
#detailprivkeypassphrase { width: 250px; position: relative; z-index: 20; }
|
||
#detailcommands .button { position: relative; z-index: 20; }
|
||
#detailbip38encryptspan { display: none; }
|
||
.paper .commands { border: 2px solid #f4b517; }
|
||
#bulkstartindex, #paperlimit, #paperlimitperpage { width: 35px; }
|
||
#bulklimit { width: 45px; }
|
||
|
||
.footer { font-size: 90%; clear: both; width: 770px; padding: 10px 0 10px 0; margin: 50px auto auto auto; }
|
||
.footer div span.item { padding: 10px; }
|
||
.footer .authorbtc { float: left; width: 470px; }
|
||
.footer .authorbtc span.item { text-align: left; display: block; padding: 0 20px; }
|
||
.footer .authorbtc div { position: relative; z-index: 100; }
|
||
.footer .authorpgp { position: relative; }
|
||
.footer .authorpgp span.item { text-align: right; display: block; padding: 0 20px; }
|
||
.footer .copyright { font-size: 80%; clear: both; padding: 5px 0; }
|
||
.footer .copyright span { padding: 10px 2px; }
|
||
.footer .tooltip { display: none; text-align: left; border: 2px solid green; background-color: #FFFFF6; margin: 5px; padding: 10px; top: 0px; position: relative; }
|
||
.footer .statusgood { color: green; font-weight: bold; }
|
||
.footer .statuswarn { color: orange; font-weight: bold; }
|
||
.footer .statusbad { color: red; font-weight: bold; }
|
||
.footer .statusicon { background-color: none; font-size: 120%; padding: 1px 2px; }
|
||
.footer .statusicon:hover { background-color: green; cursor: pointer; }
|
||
}
|
||
@media print
|
||
{
|
||
#main { width: auto; }
|
||
#singlearea { border: 0; }
|
||
#singlesafety { border: 0; }
|
||
#paperarea .keyarea:first-child { border-top: 2px solid #f4b517; }
|
||
#paperarea .keyarea.art:first-child { border: 0; }
|
||
.pagebreak { height: 1px; }
|
||
.paper #logo { display: none; }
|
||
.menu, .footer, .commands, #tagline, #faqs, #culturemenu { display: none; }
|
||
#detailprivwif { width: 285px; word-wrap: break-word; }
|
||
#detailprivwifcomp { width: 310px; word-wrap: break-word; text-align: right; }
|
||
#detailarea .privqr .item.right { width: 310px; }
|
||
#detailarea .privqr .item { width: 285px; }
|
||
#detailarea .notes { display: none; }
|
||
#seedpoolarea { display: none; }
|
||
.faq { display: none; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body onclick="SecureRandom.seedTime();" onmousemove="ninja.seeder.seed(event);">
|
||
<div id="busyblock"></div>
|
||
<div id="main">
|
||
<img alt="smartcash.cc" title="smartcash.cc" id="logo" src="data:image/png;base64,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+TrxxBPVG2+8off1XJo0adLASCQSNnwMwB8WHT6TPKVUd3B9bUsmk3scmVRbW+sMGDDAdnd32+xF40pdTU2NMsbo6upq89hjj9mc8jLEcZzRQcNHuEuBBbqCBTo3rFmzJp19TENDg06lUmr48OFm4cKFB3QeKioqnH1d1+HzJhqNHtRGhFmzZqnNmzfraDTK3rammzx58nCt9TCl1CCl1IBwYcPgGkwBXcaYrZ2dnZv28j050WjUrlixoiSuv1mzZulCpuBZaym1TpgDrR9IwJeALyTgHxEBP1dlZaUOH2JaaxzHKbhyePrpp6tkMqnDrXO01rY/Vh4WolTU19frVCqltNbk22saNoANHjzYdnV12ba2NnkyHYFqamq053lKKcWkSZN2m1K1r2OMMcpay6BBg2wqlbItLS2HTfmpra3VmUxGheEwFouZp556yhZwPe5q5AJwHMe2trYeFs8k13W11loppYjH4+bJJ5/c73mZOXOm3rZtmzLGMGbMGBPMWT+iVVVVaWutCkNhoaNdKisrnWAeP4Btb2+XOk8pVs0PQsCXRfaEEAfd3h5K06dPV8OHD+eNN95QkcjutyvP8xg/frzdtm0bixcvtkEFQ4beiyNW7jDfadOmqR07dqhoNBouNIcxhgkTJth169bR2NhoZZskAf7q6eGf29raqKqqUuPHj+fNN99U2YtEZTIZRo0aZV955RWbfczhKLeRua2tDYDZs2erDRs2qLKysl3XVbiwWTqdZsyYMXbTpk27Fp09HM9NIpHYrby4rqsmTpzI2rVrdysvPT09DBs2zC5evNiGW8oFx8tFx563P6yurlajRo1i/fr1KhrdfQmITCbD+PHj7fr161m5cqUttTUbROmQgC+EKFnLli3b536xra2tR/T5OdS37xJ9X0SQsWKi+LKDlB+5rqS8yLkUhx59sEuvFF8h+vICE0IIIYQQQkjA72OOA0OGK38N0oO226cQhxkPf42BEQqnTMn5EEIIIYQQQgJ+39u6HR57OUNqsIKxyl+ITpaGEKJw4Vq1GWC4gkkOzy3zSKyWC0oIIYQQQggJ+P1ge5fl+v/s5qIrd/JCmwFXw0DlhxQhRP684EqeounosVz/312ce+EO2ldJwBdCCCGEEOJIclAX2evx4PePpHniuQwXnFfGl64oY3JMw5vG3+FayxckxF5Z/N77sZqd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" />
|
||
<div id="tagline">Open Source JavaScript Client-Side SmartCash Wallet Generator</div>
|
||
<div id="seedpoolarea"><textarea rows="16" cols="62" id="seedpool"></textarea></div>
|
||
<div id="testnet"></div>
|
||
<ul class="menu" id="menu">
|
||
<li class="tab" id="singlewallet" onclick="ninja.tab.select(this);">One Address Paper Wallet
|
||
<li class="tab" id="paperwallet" onclick="ninja.tab.select(this);">Multi Address Paper Wallet
|
||
</ul>
|
||
|
||
<div id="generate">
|
||
<span id="generatelabelbitcoinaddress">Generating SmartCash Address...</span><br />
|
||
<span id="generatelabelmovemouse">MOVE your mouse around to add some extra randomness... </span><span id="mousemovelimit"></span><br />
|
||
<span id="generatelabelkeypress">OR type some random characters into this textbox</span> <input type="text" id="generatekeyinput" onkeydown="ninja.seeder.seedKeyPress(event);" /><br />
|
||
<div id="seedpooldisplay"></div>
|
||
</div>
|
||
|
||
<div id="wallets">
|
||
<div id="singlearea" class="walletarea">
|
||
<div class="commands">
|
||
<div id="singlecommands" class="row">
|
||
<span><input type="button" id="newaddress" value="Generate New Address" onclick="ninja.wallets.singlewallet.generateNewAddressAndKey();" /></span>
|
||
<span><label id="singlelabelhideart" for="singleart">Hide Art?</label> <input type="checkbox" id="singleart" onchange="toggleSingelArt(this);" /></span>
|
||
<span class="print"><input type="button" name="print" value="Print" id="singleprint" onclick="window.print();" /></span>
|
||
</div>
|
||
</div>
|
||
<div class="body">
|
||
<div id="keyarea" class="keyarea">
|
||
<div class="keyareaImage">
|
||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA/gAAAE2CAYAAADVpjl6AAAACXBIWXMAABnWAAAZ1gEY0crtAAA6umlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDItMjFUMjI6MjQ6NTMrMTA6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wMi0yMVQyMjozMzo1NCsxMDowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDItMjFUMjI6MzM6NTQrMTA6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+CiAgICAgICAgICAgIDxyZGY6QmFnPgogICAgICAgICAgICAgICA8cmRmOmxpPnhtcC5kaWQ6NWYyODEwZTktOTc1Zi01NjQ1LWEwYjItOWU2NDYwMjFmY2I5PC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOkJhZz4KICAgICAgICAgPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6ZWVhMWJhYWQtYTYyYi0zODRiLWEyYjgtOTYwZWMyNWQ4ZmRjPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NGIwMTYxYTctMTcwMy0xMWU4LThiMGMtZDZlNDAzN2M4M2EyPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6N2FjNzZmMmUtZDM3MS02NTQ0LTlkMmEtMzY3MmViOGE1MDZjPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjdhYzc2ZjJlLWQzNzEtNjU0NC05ZDJhLTM2NzJlYjhhNTA2Yzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wMi0yMVQyMjoyNDo1MysxMDowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDplZWExYmFhZC1hNjJiLTM4NGItYTJiOC05NjBlYzI1ZDhmZGM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDItMjFUMjI6MzM6NTQrMTA6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNjgwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNjgwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMDE2PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMxMDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+cstZeAAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAGMc0lEQVR42uy9d5wcd33//5y67fZ2b6+fTjrpZEmW3LtxN7hgAzaY3kI1LcCXkELyTb5J+CX5hgRCAiEklCR8AQdTbTA2YMANd8tF1ZasXu50vW6b+vtjdnZn6+1V6aR5PR77mL292dndmc/MfJ7vKnzlK1+xbdticHCQ/v5+AHTdIBptIBQKc+jQQU5kBYMhIpEwyWSKw4cP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" alt="Single Wallet" class="imageSingle" id="SingleArt">
|
||
</div>
|
||
<div class="public">
|
||
<div class="pubaddress">
|
||
<span class="label" id="singlelabelbitcoinaddress">SmartCash Address</span>
|
||
</div>
|
||
<div id="qrcode_public" class="qrcode_public"></div>
|
||
<div class="pubaddress" id="SinglePubAddressBG">
|
||
<span class="output" id="btcaddress"></span>
|
||
</div>
|
||
<div id="singleshare">SHARE</div>
|
||
</div>
|
||
<div class="private">
|
||
<div class="privwif">
|
||
<span class="label" id="singlelabelprivatekey">Private Key</span>
|
||
</div>
|
||
<div id="qrcode_private" class="qrcode_private"></div>
|
||
<div class="privwif" id="SinglePrivWifBG">
|
||
<span class="output" id="btcprivwif"></span>
|
||
</div>
|
||
<div id="singlesecret">SECRET</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="singlesafety">
|
||
<p id="singletip1"><b>A SmartCash wallet</b> is as simple as a single pairing of a SmartCash address with its corresponding SmartCash private key. Such a wallet has been generated for you in your web browser and is displayed above.</p>
|
||
<p id="singletip2"><b>To safeguard this wallet</b> you must print or otherwise record the SmartCash address and private key. It is important to make a backup copy of the private key and store it in a safe location. This site does not have knowledge of your private key. If you are familiar with PGP you can download this all-in-one HTML page and check that you have an authentic version from the author of this site by matching the SHA256 hash of this HTML with the SHA256 hash available in the signed version history document linked on the footer of this site. If you leave/refresh the site or press the "Generate New Address" button then a new private key will be generated and the previously displayed private key will not be retrievable. Your SmartCash private key should be kept a secret. Whomever you share the private key with has access to spend all the SmartCash associated with that address. If you print your wallet then store it in a zip lock bag to keep it safe from water. Treat a paper wallet like cash.</p>
|
||
<p id="singletip3"><b>Add funds</b> to this wallet by instructing others to send SmartCash to your SmartCash address.</p>
|
||
<p id="singletip4"><b>Check your balance</b> by going to explorer.smartcash.cc and entering your SmartCash address.</p>
|
||
<p id="singletip5"><b>Spend your SmartCash</b> by going to wallet.smartcash.cc and import the full balance of your private key into your account at their website. You can also spend your funds by downloading one of the popular SmartCash p2p clients and importing your private key to the p2p client wallet. Keep in mind when you import your single key to a SmartCash p2p client and spend funds your key will be bundled with other private keys in the p2p client wallet. When you perform a transaction your change will be sent to another SmartCash address within the p2p client wallet. You must then backup the p2p client wallet and keep it safe as your remaining SmartCash will be stored there. Satoshi advised that one should never delete a wallet.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="paperarea">
|
||
<div class="commands">
|
||
<div id="papercommands" class="row">
|
||
<span><label id="paperlabelhideart" for="paperart">Hide Art?</label> <input type="checkbox" id="paperart" onchange="ninja.wallets.paperwallet.toggleArt(this);" /></span>
|
||
<span><label id="paperlabeladdressestogenerate" for="paperlimit">Addresses to generate:</label> <input type="text" id="paperlimit" /></span>
|
||
<span><input type="button" id="papergenerate" value="Generate" onclick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked, document.getElementById('paperpassphrase').value);" /></span>
|
||
<span class="print"><input type="button" name="print" value="Print" id="paperprint" onclick="window.print();" /></span>
|
||
</div>
|
||
<div id="paperadvancedcommands" class="row extra">
|
||
<span style="display:none;"><label id="paperlabelencrypt" for="paperencrypt">BIP38 Encrypt?</label> <input type="hidden" id="paperencrypt" onchange="ninja.wallets.paperwallet.toggleEncrypt(this);" /></span>
|
||
<span style="display:none;"><label id="paperlabelBIPpassphrase" for="paperpassphrase">Passphrase:</label> <input type="hidden" id="paperpassphrase" /></span>
|
||
<span><label id="paperlabeladdressesperpage" for="paperlimitperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span>
|
||
</div>
|
||
</div>
|
||
<div id="paperkeyarea"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="footer" class="footer">
|
||
<div class="tooltips">
|
||
<div class="tooltip" id="statuscryptogood">
|
||
<span class="statusgood" id="statuslabelcryptogood">✔ Good!</span>
|
||
<span id="statuslabelcryptogood1">Your browser can generate cryptographically random keys using window.crypto.getRandomValues</span>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokcryptogood" onclick="document.getElementById('statuscryptogood').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statuscryptobad">
|
||
<span class="statusbad" id="statuslabelcryptobad">× Oh no!</span>
|
||
<span id="statuslabelcryptobad1">Your browser does NOT support window.crypto.getRandomValues. You should use a more modern browser with this generator to increase the security of the keys generated.</span>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokcryptobad" onclick="document.getElementById('statuscryptobad').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statusunittestsgood">
|
||
<span class="statusgood" id="statuslabelunittestsgood">✔ Good!</span>
|
||
<span id="statuslabelunittestsgood1">All synchronous unit tests passed.</span>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokunittestsgood" onclick="document.getElementById('statusunittestsgood').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statusunittestsbad">
|
||
<span class="statusbad" id="statuslabelunittestsbad">× Oh no!</span>
|
||
<span id="statuslabelunittestsbad1">Some synchronous unit tests DID NOT pass. You should find another browser to use with this generator.</span>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokunittestsbad" onclick="document.getElementById('statusunittestsbad').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statusprotocolgood">
|
||
<span class="statusgood" id="statuslabelprotocolgood">✔ Good!</span>
|
||
<span id="statuslabelprotocolgood1">You are running this generator from your local computer. <br />Tip: Double check you are offline by trying </span>
|
||
<a href="http://www.google.com" target="_blank">www.google.com</a>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokprotocolgood" onclick="document.getElementById('statusprotocolgood').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statusprotocolbad">
|
||
<span class="statuswarn" id="statuslabelprotocolbad">⚠ Think twice!</span>
|
||
<span id="statuslabelprotocolbad1">You appear to be running this generator online from a live website. For valuable wallets it is recommended to</span>
|
||
<a id="statuslabelprotocolbad2" href="https://github.com/SmartCash/PaperWalletGenerator/archive/master.zip">download</a>
|
||
<span id="statuslabelprotocolbad3">the zip file from GitHub and run this generator offline as a local html file.</span>
|
||
<br /><br /><input type="button" value="OK" class="button" id="statusokprotocolbad" onclick="document.getElementById('statusprotocolbad').style.display = 'none';" />
|
||
</div>
|
||
<div class="tooltip" id="statuskeypoolgood">
|
||
<span id="statuslabelkeypool1">This is a log of all the SmartCash Addresses and Private Keys you generated during your current session. Reloading the page will create a new session.</span>
|
||
<textarea rows="20" cols="102" id="keypooltextarea"></textarea>
|
||
|
||
<br /><br />
|
||
<input type="button" value="Refresh" class="button" id="statuskeypoolrefresh" onclick="ninja.status.showKeyPool();" />
|
||
<input type="button" value="OK" class="button" id="statusokkeypool" onclick="document.getElementById('statuskeypoolgood').style.display = 'none';" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="authorbtc">
|
||
<div>
|
||
<span class="item">
|
||
<span class="statusicon" id="statusprotocol" onclick="ninja.status.showProtocol();">...</span>
|
||
<span class="statusicon" id="statuscrypto" onclick="ninja.status.showCrypto();">...</span>
|
||
<span class="statusicon" id="statuskeypool" onclick="ninja.status.showKeyPool();">≣</span>
|
||
</span>
|
||
<span class="item" id="footerlabeltranslatedby"></span>
|
||
<span class="item"><a href="https://github.com/SmartCash/PaperWalletGenerator" target="_blank" id="footerlabelgithub">GitHub Repository</a>
|
||
(<a href="https://github.com/SmartCash/PaperWalletGenerator/archive/master.zip" target="_blank" id="footerlabelgithubzip">zip</a>)</span>
|
||
</div>
|
||
</div>
|
||
<div class="authorpgp">
|
||
</div>
|
||
<div class="copyright">
|
||
<span id="footerlabelcopyright1">Copyright smartcash.cc.</span>
|
||
<span id="footerlabelcopyright2">JavaScript copyrights are included in the source.</span>
|
||
<span id="footerlabelnowarranty">No warranty.</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script type="text/javascript">
|
||
var ninja = { wallets: {} };
|
||
|
||
ninja.privateKey = {
|
||
isPrivateKey: function (key) {
|
||
return (
|
||
Bitcoin.ECKey.isWalletImportFormat(key) ||
|
||
Bitcoin.ECKey.isCompressedWalletImportFormat(key) ||
|
||
Bitcoin.ECKey.isHexFormat(key) ||
|
||
Bitcoin.ECKey.isBase64Format(key) ||
|
||
Bitcoin.ECKey.isMiniFormat(key)
|
||
);
|
||
},
|
||
getECKeyFromAdding: function (privKey1, privKey2) {
|
||
var n = EllipticCurve.getSECCurveByName("secp256k1").getN();
|
||
var ecKey1 = new Bitcoin.ECKey(privKey1);
|
||
var ecKey2 = new Bitcoin.ECKey(privKey2);
|
||
// if both keys are the same return null
|
||
if (ecKey1.getBitcoinHexFormat() == ecKey2.getBitcoinHexFormat()) return null;
|
||
if (ecKey1 == null || ecKey2 == null) return null;
|
||
var combinedPrivateKey = new Bitcoin.ECKey(ecKey1.priv.add(ecKey2.priv).mod(n));
|
||
// compressed when both keys are compressed
|
||
if (ecKey1.compressed && ecKey2.compressed) combinedPrivateKey.setCompressed(true);
|
||
return combinedPrivateKey;
|
||
},
|
||
getECKeyFromMultiplying: function (privKey1, privKey2) {
|
||
var n = EllipticCurve.getSECCurveByName("secp256k1").getN();
|
||
var ecKey1 = new Bitcoin.ECKey(privKey1);
|
||
var ecKey2 = new Bitcoin.ECKey(privKey2);
|
||
// if both keys are the same return null
|
||
if (ecKey1.getBitcoinHexFormat() == ecKey2.getBitcoinHexFormat()) return null;
|
||
if (ecKey1 == null || ecKey2 == null) return null;
|
||
var combinedPrivateKey = new Bitcoin.ECKey(ecKey1.priv.multiply(ecKey2.priv).mod(n));
|
||
// compressed when both keys are compressed
|
||
if (ecKey1.compressed && ecKey2.compressed) combinedPrivateKey.setCompressed(true);
|
||
return combinedPrivateKey;
|
||
},
|
||
// 58 base58 characters starting with 6P
|
||
isBIP38Format: function (key) {
|
||
key = key.toString();
|
||
return (/^6P[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{56}$/.test(key));
|
||
},
|
||
BIP38EncryptedKeyToByteArrayAsync: function (base58Encrypted, passphrase, callback) {
|
||
var hex;
|
||
try {
|
||
hex = Bitcoin.Base58.decode(base58Encrypted);
|
||
} catch (e) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
|
||
// 43 bytes: 2 bytes prefix, 37 bytes payload, 4 bytes checksum
|
||
if (hex.length != 43) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
// first byte is always 0x01
|
||
else if (hex[0] != 0x01) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
|
||
var expChecksum = hex.slice(-4);
|
||
hex = hex.slice(0, -4);
|
||
var checksum = Bitcoin.Util.dsha256(hex);
|
||
if (checksum[0] != expChecksum[0] || checksum[1] != expChecksum[1] || checksum[2] != expChecksum[2] || checksum[3] != expChecksum[3]) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
|
||
var isCompPoint = false;
|
||
var isECMult = false;
|
||
var hasLotSeq = false;
|
||
// second byte for non-EC-multiplied key
|
||
if (hex[1] == 0x42) {
|
||
// key should use compression
|
||
if (hex[2] == 0xe0) {
|
||
isCompPoint = true;
|
||
}
|
||
// key should NOT use compression
|
||
else if (hex[2] != 0xc0) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
}
|
||
// second byte for EC-multiplied key
|
||
else if (hex[1] == 0x43) {
|
||
isECMult = true;
|
||
isCompPoint = (hex[2] & 0x20) != 0;
|
||
hasLotSeq = (hex[2] & 0x04) != 0;
|
||
if ((hex[2] & 0x24) != hex[2]) {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
}
|
||
else {
|
||
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
|
||
return;
|
||
}
|
||
|
||
var decrypted;
|
||
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
|
||
|
||
var verifyHashAndReturn = function () {
|
||
var tmpkey = new Bitcoin.ECKey(decrypted); // decrypted using closure
|
||
var base58AddrText = tmpkey.setCompressed(isCompPoint).getBitcoinAddress(); // isCompPoint using closure
|
||
checksum = Bitcoin.Util.dsha256(base58AddrText); // checksum using closure
|
||
|
||
if (checksum[0] != hex[3] || checksum[1] != hex[4] || checksum[2] != hex[5] || checksum[3] != hex[6]) {
|
||
callback(new Error(ninja.translator.get("bip38alertincorrectpassphrase"))); // callback using closure
|
||
return;
|
||
}
|
||
callback(tmpkey.getBitcoinPrivateKeyByteArray()); // callback using closure
|
||
};
|
||
|
||
if (!isECMult) {
|
||
var addresshash = hex.slice(3, 7);
|
||
Crypto_scrypt(passphrase, addresshash, 16384, 8, 8, 64, function (derivedBytes) {
|
||
var k = derivedBytes.slice(32, 32 + 32);
|
||
decrypted = Crypto.AES.decrypt(hex.slice(7, 7 + 32), k, AES_opts);
|
||
for (var x = 0; x < 32; x++) decrypted[x] ^= derivedBytes[x];
|
||
verifyHashAndReturn(); //TODO: pass in 'decrypted' as a param
|
||
});
|
||
}
|
||
else {
|
||
var ownerentropy = hex.slice(7, 7 + 8);
|
||
var ownersalt = !hasLotSeq ? ownerentropy : ownerentropy.slice(0, 4);
|
||
Crypto_scrypt(passphrase, ownersalt, 16384, 8, 8, 32, function (prefactorA) {
|
||
var passfactor;
|
||
if (!hasLotSeq) { // hasLotSeq using closure
|
||
passfactor = prefactorA;
|
||
} else {
|
||
var prefactorB = prefactorA.concat(ownerentropy); // ownerentropy using closure
|
||
passfactor = Bitcoin.Util.dsha256(prefactorB);
|
||
}
|
||
// remove this ECKey from the pool (because user does not see it)
|
||
var userKeyPool = Bitcoin.KeyPool.getArray();
|
||
var kp = new Bitcoin.ECKey(passfactor);
|
||
var passpoint = kp.setCompressed(true).getPub();
|
||
Bitcoin.KeyPool.setArray(userKeyPool);
|
||
var encryptedpart2 = hex.slice(23, 23 + 16);
|
||
|
||
var addresshashplusownerentropy = hex.slice(3, 3 + 12);
|
||
Crypto_scrypt(passpoint, addresshashplusownerentropy, 1024, 1, 1, 64, function (derived) {
|
||
var k = derived.slice(32);
|
||
|
||
var unencryptedpart2 = Crypto.AES.decrypt(encryptedpart2, k, AES_opts);
|
||
for (var i = 0; i < 16; i++) { unencryptedpart2[i] ^= derived[i + 16]; }
|
||
|
||
var encryptedpart1 = hex.slice(15, 15 + 8).concat(unencryptedpart2.slice(0, 0 + 8));
|
||
var unencryptedpart1 = Crypto.AES.decrypt(encryptedpart1, k, AES_opts);
|
||
for (var i = 0; i < 16; i++) { unencryptedpart1[i] ^= derived[i]; }
|
||
|
||
var seedb = unencryptedpart1.slice(0, 0 + 16).concat(unencryptedpart2.slice(8, 8 + 8));
|
||
|
||
var factorb = Bitcoin.Util.dsha256(seedb);
|
||
|
||
var ps = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var privateKey = BigInteger.fromByteArrayUnsigned(passfactor).multiply(BigInteger.fromByteArrayUnsigned(factorb)).remainder(ps.getN());
|
||
|
||
decrypted = privateKey.toByteArrayUnsigned();
|
||
verifyHashAndReturn();
|
||
});
|
||
});
|
||
}
|
||
},
|
||
BIP38PrivateKeyToEncryptedKeyAsync: function (base58Key, passphrase, compressed, callback) {
|
||
var privKey = new Bitcoin.ECKey(base58Key);
|
||
var privKeyBytes = privKey.getBitcoinPrivateKeyByteArray();
|
||
var address = privKey.setCompressed(compressed).getBitcoinAddress();
|
||
|
||
// compute sha256(sha256(address)) and take first 4 bytes
|
||
var salt = Bitcoin.Util.dsha256(address).slice(0, 4);
|
||
|
||
// derive key using scrypt
|
||
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
|
||
|
||
Crypto_scrypt(passphrase, salt, 16384, 8, 8, 64, function (derivedBytes) {
|
||
for (var i = 0; i < 32; ++i) {
|
||
privKeyBytes[i] ^= derivedBytes[i];
|
||
}
|
||
|
||
// 0x01 0x42 + flagbyte + salt + encryptedhalf1 + encryptedhalf2
|
||
var flagByte = compressed ? 0xe0 : 0xc0;
|
||
var encryptedKey = [0x01, 0x42, flagByte].concat(salt);
|
||
encryptedKey = encryptedKey.concat(Crypto.AES.encrypt(privKeyBytes, derivedBytes.slice(32), AES_opts));
|
||
encryptedKey = encryptedKey.concat(Bitcoin.Util.dsha256(encryptedKey).slice(0, 4));
|
||
callback(Bitcoin.Base58.encode(encryptedKey));
|
||
});
|
||
},
|
||
BIP38GenerateIntermediatePointAsync: function (passphrase, lotNum, sequenceNum, callback) {
|
||
var noNumbers = lotNum === null || sequenceNum === null;
|
||
var rng = new SecureRandom();
|
||
var ownerEntropy, ownerSalt;
|
||
|
||
if (noNumbers) {
|
||
ownerSalt = ownerEntropy = new Array(8);
|
||
rng.nextBytes(ownerEntropy);
|
||
}
|
||
else {
|
||
// 1) generate 4 random bytes
|
||
ownerSalt = new Array(4);
|
||
|
||
rng.nextBytes(ownerSalt);
|
||
|
||
// 2) Encode the lot and sequence numbers as a 4 byte quantity (big-endian):
|
||
// lotnumber * 4096 + sequencenumber. Call these four bytes lotsequence.
|
||
var lotSequence = BigInteger(4096 * lotNum + sequenceNum).toByteArrayUnsigned();
|
||
|
||
// 3) Concatenate ownersalt + lotsequence and call this ownerentropy.
|
||
var ownerEntropy = ownerSalt.concat(lotSequence);
|
||
}
|
||
|
||
|
||
// 4) Derive a key from the passphrase using scrypt
|
||
Crypto_scrypt(passphrase, ownerSalt, 16384, 8, 8, 32, function (prefactor) {
|
||
// Take SHA256(SHA256(prefactor + ownerentropy)) and call this passfactor
|
||
var passfactorBytes = noNumbers ? prefactor : Bitcoin.Util.dsha256(prefactor.concat(ownerEntropy));
|
||
var passfactor = BigInteger.fromByteArrayUnsigned(passfactorBytes);
|
||
|
||
// 5) Compute the elliptic curve point G * passfactor, and convert the result to compressed notation (33 bytes)
|
||
var ellipticCurve = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var passpoint = ellipticCurve.getG().multiply(passfactor).getEncoded(1);
|
||
|
||
// 6) Convey ownersalt and passpoint to the party generating the keys, along with a checksum to ensure integrity.
|
||
// magic bytes "2C E9 B3 E1 FF 39 E2 51" followed by ownerentropy, and then passpoint
|
||
var magicBytes = [0x2C, 0xE9, 0xB3, 0xE1, 0xFF, 0x39, 0xE2, 0x51];
|
||
if (noNumbers) magicBytes[7] = 0x53;
|
||
|
||
var intermediate = magicBytes.concat(ownerEntropy).concat(passpoint);
|
||
|
||
// base58check encode
|
||
intermediate = intermediate.concat(Bitcoin.Util.dsha256(intermediate).slice(0, 4));
|
||
callback(Bitcoin.Base58.encode(intermediate));
|
||
});
|
||
},
|
||
BIP38GenerateECAddressAsync: function (intermediate, compressed, callback) {
|
||
// decode IPS
|
||
var x = Bitcoin.Base58.decode(intermediate);
|
||
//if(x.slice(49, 4) !== Bitcoin.Util.dsha256(x.slice(0,49)).slice(0,4)) {
|
||
// callback({error: 'Invalid intermediate passphrase string'});
|
||
//}
|
||
var noNumbers = (x[7] === 0x53);
|
||
var ownerEntropy = x.slice(8, 8 + 8);
|
||
var passpoint = x.slice(16, 16 + 33);
|
||
|
||
// 1) Set flagbyte.
|
||
// set bit 0x20 for compressed key
|
||
// set bit 0x04 if ownerentropy contains a value for lotsequence
|
||
var flagByte = (compressed ? 0x20 : 0x00) | (noNumbers ? 0x00 : 0x04);
|
||
|
||
|
||
// 2) Generate 24 random bytes, call this seedb.
|
||
var seedB = new Array(24);
|
||
var rng = new SecureRandom();
|
||
rng.nextBytes(seedB);
|
||
|
||
// Take SHA256(SHA256(seedb)) to yield 32 bytes, call this factorb.
|
||
var factorB = Bitcoin.Util.dsha256(seedB);
|
||
|
||
// 3) ECMultiply passpoint by factorb. Use the resulting EC point as a public key and hash it into a Bitcoin
|
||
// address using either compressed or uncompressed public key methodology (specify which methodology is used
|
||
// inside flagbyte). This is the generated Bitcoin address, call it generatedaddress.
|
||
var ec = EllipticCurve.getSECCurveByName("secp256k1").getCurve();
|
||
var generatedPoint = ec.decodePointHex(ninja.publicKey.getHexFromByteArray(passpoint));
|
||
var generatedBytes = generatedPoint.multiply(BigInteger.fromByteArrayUnsigned(factorB)).getEncoded(compressed);
|
||
var generatedAddress = (new Bitcoin.Address(Bitcoin.Util.sha256ripe160(generatedBytes))).toString();
|
||
|
||
// 4) Take the first four bytes of SHA256(SHA256(generatedaddress)) and call it addresshash.
|
||
var addressHash = Bitcoin.Util.dsha256(generatedAddress).slice(0, 4);
|
||
|
||
// 5) Now we will encrypt seedb. Derive a second key from passpoint using scrypt
|
||
Crypto_scrypt(passpoint, addressHash.concat(ownerEntropy), 1024, 1, 1, 64, function (derivedBytes) {
|
||
// 6) Do AES256Encrypt(seedb[0...15]] xor derivedhalf1[0...15], derivedhalf2), call the 16-byte result encryptedpart1
|
||
for (var i = 0; i < 16; ++i) {
|
||
seedB[i] ^= derivedBytes[i];
|
||
}
|
||
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
|
||
var encryptedPart1 = Crypto.AES.encrypt(seedB.slice(0, 16), derivedBytes.slice(32), AES_opts);
|
||
|
||
// 7) Do AES256Encrypt((encryptedpart1[8...15] + seedb[16...23]) xor derivedhalf1[16...31], derivedhalf2), call the 16-byte result encryptedseedb.
|
||
var message2 = encryptedPart1.slice(8, 8 + 8).concat(seedB.slice(16, 16 + 8));
|
||
for (var i = 0; i < 16; ++i) {
|
||
message2[i] ^= derivedBytes[i + 16];
|
||
}
|
||
var encryptedSeedB = Crypto.AES.encrypt(message2, derivedBytes.slice(32), AES_opts);
|
||
|
||
// 0x01 0x43 + flagbyte + addresshash + ownerentropy + encryptedpart1[0...7] + encryptedpart2
|
||
var encryptedKey = [0x01, 0x43, flagByte].concat(addressHash).concat(ownerEntropy).concat(encryptedPart1.slice(0, 8)).concat(encryptedSeedB);
|
||
|
||
// base58check encode
|
||
encryptedKey = encryptedKey.concat(Bitcoin.Util.dsha256(encryptedKey).slice(0, 4));
|
||
callback(generatedAddress, Bitcoin.Base58.encode(encryptedKey));
|
||
});
|
||
}
|
||
};
|
||
|
||
ninja.publicKey = {
|
||
isPublicKeyHexFormat: function (key) {
|
||
key = key.toString();
|
||
return ninja.publicKey.isUncompressedPublicKeyHexFormat(key) || ninja.publicKey.isCompressedPublicKeyHexFormat(key);
|
||
},
|
||
// 130 characters [0-9A-F] starts with 04
|
||
isUncompressedPublicKeyHexFormat: function (key) {
|
||
key = key.toString();
|
||
return /^04[A-Fa-f0-9]{128}$/.test(key);
|
||
},
|
||
// 66 characters [0-9A-F] starts with 02 or 03
|
||
isCompressedPublicKeyHexFormat: function (key) {
|
||
key = key.toString();
|
||
return /^0[2-3][A-Fa-f0-9]{64}$/.test(key);
|
||
},
|
||
getBitcoinAddressFromByteArray: function (pubKeyByteArray) {
|
||
var pubKeyHash = Bitcoin.Util.sha256ripe160(pubKeyByteArray);
|
||
var addr = new Bitcoin.Address(pubKeyHash);
|
||
return addr.toString();
|
||
},
|
||
getHexFromByteArray: function (pubKeyByteArray) {
|
||
return Crypto.util.bytesToHex(pubKeyByteArray).toString().toUpperCase();
|
||
},
|
||
getByteArrayFromAdding: function (pubKeyHex1, pubKeyHex2) {
|
||
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var curve = ecparams.getCurve();
|
||
var ecPoint1 = curve.decodePointHex(pubKeyHex1);
|
||
var ecPoint2 = curve.decodePointHex(pubKeyHex2);
|
||
// if both points are the same return null
|
||
if (ecPoint1.equals(ecPoint2)) return null;
|
||
var compressed = (ecPoint1.compressed && ecPoint2.compressed);
|
||
var pubKey = ecPoint1.add(ecPoint2).getEncoded(compressed);
|
||
return pubKey;
|
||
},
|
||
getByteArrayFromMultiplying: function (pubKeyHex, ecKey) {
|
||
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var ecPoint = ecparams.getCurve().decodePointHex(pubKeyHex);
|
||
var compressed = (ecPoint.compressed && ecKey.compressed);
|
||
// if both points are the same return null
|
||
ecKey.setCompressed(false);
|
||
if (ecPoint.equals(ecKey.getPubPoint())) {
|
||
return null;
|
||
}
|
||
var bigInt = ecKey.priv;
|
||
var pubKey = ecPoint.multiply(bigInt).getEncoded(compressed);
|
||
return pubKey;
|
||
},
|
||
// used by unit test
|
||
getDecompressedPubKeyHex: function (pubKeyHexComp) {
|
||
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
|
||
var ecPoint = ecparams.getCurve().decodePointHex(pubKeyHexComp);
|
||
var pubByteArray = ecPoint.getEncoded(0);
|
||
var pubHexUncompressed = ninja.publicKey.getHexFromByteArray(pubByteArray);
|
||
return pubHexUncompressed;
|
||
}
|
||
};
|
||
</script>
|
||
<script type="text/javascript">
|
||
ninja.seeder = {
|
||
init: (function () {
|
||
document.getElementById("generatekeyinput").value = "";
|
||
})(),
|
||
|
||
// number of mouse movements to wait for
|
||
seedLimit: (function () {
|
||
var num = Crypto.util.randomBytes(12)[11];
|
||
return 200 + Math.floor(num);
|
||
})(),
|
||
|
||
seedCount: 0, // counter
|
||
lastInputTime: new Date().getTime(),
|
||
seedPoints: [],
|
||
isStillSeeding: true,
|
||
seederDependentWallets: ["singlewallet", "paperwallet"],
|
||
|
||
// seed function exists to wait for mouse movement to add more entropy before generating an address
|
||
seed: function (evt) {
|
||
if (!evt) var evt = window.event;
|
||
var timeStamp = new Date().getTime();
|
||
// seeding is over now we generate and display the address
|
||
if (ninja.seeder.seedCount == ninja.seeder.seedLimit) {
|
||
ninja.seeder.seedCount++;
|
||
ninja.seeder.seedingOver();
|
||
}
|
||
// seed mouse position X and Y when mouse movements are greater than 40ms apart.
|
||
else if ((ninja.seeder.seedCount < ninja.seeder.seedLimit) && evt && (timeStamp - ninja.seeder.lastInputTime) > 40) {
|
||
SecureRandom.seedTime();
|
||
SecureRandom.seedInt16((evt.clientX * evt.clientY));
|
||
ninja.seeder.showPoint(evt.clientX, evt.clientY);
|
||
ninja.seeder.seedCount++;
|
||
ninja.seeder.lastInputTime = new Date().getTime();
|
||
ninja.seeder.showPool();
|
||
}
|
||
},
|
||
|
||
// seed function exists to wait for mouse movement to add more entropy before generating an address
|
||
seedKeyPress: function (evt) {
|
||
if (!evt) var evt = window.event;
|
||
// seeding is over now we generate and display the address
|
||
if (ninja.seeder.seedCount == ninja.seeder.seedLimit) {
|
||
ninja.seeder.seedCount++;
|
||
ninja.seeder.seedingOver();
|
||
}
|
||
// seed key press character
|
||
else if ((ninja.seeder.seedCount < ninja.seeder.seedLimit) && evt.which) {
|
||
var timeStamp = new Date().getTime();
|
||
// seed a bunch (minimum seedLimit) of times
|
||
SecureRandom.seedTime();
|
||
SecureRandom.seedInt8(evt.which);
|
||
var keyPressTimeDiff = timeStamp - ninja.seeder.lastInputTime;
|
||
SecureRandom.seedInt8(keyPressTimeDiff);
|
||
ninja.seeder.seedCount++;
|
||
ninja.seeder.lastInputTime = new Date().getTime();
|
||
ninja.seeder.showPool();
|
||
}
|
||
},
|
||
|
||
showPool: function () {
|
||
var poolHex;
|
||
if (SecureRandom.poolCopyOnInit != null) {
|
||
poolHex = Crypto.util.bytesToHex(SecureRandom.poolCopyOnInit);
|
||
document.getElementById("seedpool").innerHTML = poolHex;
|
||
document.getElementById("seedpooldisplay").innerHTML = poolHex;
|
||
}
|
||
else {
|
||
poolHex = Crypto.util.bytesToHex(SecureRandom.pool);
|
||
document.getElementById("seedpool").innerHTML = poolHex;
|
||
document.getElementById("seedpooldisplay").innerHTML = poolHex;
|
||
}
|
||
var percentSeeded = Math.round((ninja.seeder.seedCount / ninja.seeder.seedLimit) * 100) + "%";
|
||
document.getElementById("mousemovelimit").innerHTML = percentSeeded;
|
||
for (var wIndex in ninja.seeder.seederDependentWallets) {
|
||
document.getElementById(ninja.seeder.seederDependentWallets[wIndex]).innerHTML = percentSeeded;
|
||
}
|
||
},
|
||
|
||
showPoint: function (x, y) {
|
||
var div = document.createElement("div");
|
||
div.setAttribute("class", "seedpoint");
|
||
div.style.top = y + "px";
|
||
div.style.left = x + "px";
|
||
document.body.appendChild(div);
|
||
ninja.seeder.seedPoints.push(div);
|
||
},
|
||
|
||
removePoints: function () {
|
||
for (var i = 0; i < ninja.seeder.seedPoints.length; i++) {
|
||
document.body.removeChild(ninja.seeder.seedPoints[i]);
|
||
}
|
||
ninja.seeder.seedPoints = [];
|
||
},
|
||
|
||
seedingOver: function () {
|
||
ninja.seeder.isStillSeeding = false;
|
||
// open selected tab
|
||
var walletType = ninja.tab.whichIsOpen();
|
||
if (walletType == null) {
|
||
ninja.tab.select("singlewallet");
|
||
} else {
|
||
ninja.tab.select(walletType)
|
||
}
|
||
document.getElementById("generate").style.display = "none";
|
||
document.getElementById("singlewallet").innerHTML = "One Address Paper Wallet";
|
||
document.getElementById("paperwallet").innerHTML = "Multi Address Paper Wallet";
|
||
ninja.seeder.removePoints();
|
||
}
|
||
};
|
||
|
||
</script>
|
||
<script type="text/javascript">
|
||
(function (ninja) {
|
||
var qrC = ninja.qrCode = {
|
||
// determine which type number is big enough for the input text length
|
||
getTypeNumber: function (text) {
|
||
var lengthCalculation = text.length * 8 + 12; // length as calculated by the QRCode
|
||
if (lengthCalculation < 72) { return 1; }
|
||
else if (lengthCalculation < 128) { return 2; }
|
||
else if (lengthCalculation < 208) { return 3; }
|
||
else if (lengthCalculation < 288) { return 4; }
|
||
else if (lengthCalculation < 368) { return 5; }
|
||
else if (lengthCalculation < 480) { return 6; }
|
||
else if (lengthCalculation < 528) { return 7; }
|
||
else if (lengthCalculation < 688) { return 8; }
|
||
else if (lengthCalculation < 800) { return 9; }
|
||
else if (lengthCalculation < 976) { return 10; }
|
||
return null;
|
||
},
|
||
|
||
createCanvas: function (text, sizeMultiplier) {
|
||
sizeMultiplier = (sizeMultiplier == undefined) ? 2 : sizeMultiplier; // default 2
|
||
// create the qrcode itself
|
||
var typeNumber = qrC.getTypeNumber(text);
|
||
var qrcode = new QRCode(typeNumber, QRCode.ErrorCorrectLevel.H);
|
||
qrcode.addData(text);
|
||
qrcode.make();
|
||
var width = qrcode.getModuleCount() * sizeMultiplier;
|
||
var height = qrcode.getModuleCount() * sizeMultiplier;
|
||
// create canvas element
|
||
var canvas = document.createElement('canvas');
|
||
var scale = 10.0;
|
||
canvas.width = width * scale;
|
||
canvas.height = height * scale;
|
||
canvas.style.width = width + 'px';
|
||
canvas.style.height = height + 'px';
|
||
var ctx = canvas.getContext('2d');
|
||
ctx.scale(scale, scale);
|
||
// compute tileW/tileH based on width/height
|
||
var tileW = width / qrcode.getModuleCount();
|
||
var tileH = height / qrcode.getModuleCount();
|
||
// draw in the canvas
|
||
for (var row = 0; row < qrcode.getModuleCount() ; row++) {
|
||
for (var col = 0; col < qrcode.getModuleCount() ; col++) {
|
||
ctx.fillStyle = qrcode.isDark(row, col) ? "#000000" : "#ffffff";
|
||
ctx.fillRect(col * tileW, row * tileH, tileW, tileH);
|
||
}
|
||
}
|
||
// return just built canvas
|
||
return canvas;
|
||
},
|
||
|
||
// show QRCodes with canvas
|
||
// parameter: keyValuePair
|
||
// example: { "id1": "string1", "id2": "string2"}
|
||
// "id1" is the id of a div element where you want a QRCode inserted.
|
||
// "string1" is the string you want encoded into the QRCode.
|
||
showQrCode: function (keyValuePair, sizeMultiplier) {
|
||
for (var key in keyValuePair) {
|
||
var value = keyValuePair[key];
|
||
try {
|
||
if (document.getElementById(key)) {
|
||
document.getElementById(key).innerHTML = "";
|
||
document.getElementById(key).appendChild(qrC.createCanvas(value, sizeMultiplier));
|
||
}
|
||
}
|
||
catch (e) { }
|
||
}
|
||
}
|
||
};
|
||
})(ninja);
|
||
</script>
|
||
<script type="text/javascript">
|
||
(function (ninja) {
|
||
var status = ninja.status = function() {
|
||
var cryptoCase = "";
|
||
if (window.crypto && window.crypto.getRandomValues) {
|
||
document.getElementById("statuscrypto").innerHTML = "✔"; //✔
|
||
cryptoCase = "good";
|
||
}
|
||
else {
|
||
document.getElementById("statuscrypto").innerHTML = "×"; //×
|
||
cryptoCase = "bad";
|
||
}
|
||
|
||
var protocolCase = "";
|
||
switch (window.location.protocol) {
|
||
case 'file:':
|
||
document.getElementById("statusprotocol").innerHTML = "✔"; //✔
|
||
protocolCase = "good";
|
||
break;
|
||
case 'http:':
|
||
case 'https:':
|
||
document.getElementById("statusprotocol").innerHTML = "⚠"; //⚠
|
||
protocolCase = "bad";
|
||
break;
|
||
default:
|
||
}
|
||
|
||
var showCrypto = function () {
|
||
document.getElementById('statuscrypto' + cryptoCase).style.display = 'block';
|
||
};
|
||
|
||
var showProtocol = function () {
|
||
document.getElementById('statusprotocol' + protocolCase).style.display = 'block';
|
||
};
|
||
|
||
var showKeyPool = function () {
|
||
document.getElementById('statuskeypoolgood').style.display = 'block';
|
||
document.getElementById("keypooltextarea").value = Bitcoin.KeyPool.toString();
|
||
};
|
||
|
||
return {
|
||
showCrypto: showCrypto, showProtocol: showProtocol, showKeyPool: showKeyPool
|
||
};
|
||
}();
|
||
})(ninja);
|
||
|
||
ninja.tab = {
|
||
select: function (walletTab) {
|
||
// detect type: normally an HtmlElement/object but when string then get the element
|
||
if (typeof walletTab === 'string') {
|
||
walletTab = document.getElementById(walletTab);
|
||
}
|
||
var walletType = walletTab.getAttribute("id");
|
||
|
||
if (walletTab.className.indexOf("selected") == -1) {
|
||
// unselect all tabs
|
||
for (var wType in ninja.wallets) {
|
||
document.getElementById(wType).className = "tab";
|
||
ninja.wallets[wType].close();
|
||
}
|
||
|
||
// don't open tab if entropy still being collected
|
||
// exceptions: brainwallet detailwallet
|
||
if (ninja.seeder.isStillSeeding == false || walletType == "brainwallet" || walletType == "detailwallet") {
|
||
walletTab.className += " selected";
|
||
document.getElementById("generate").style.display = "none";
|
||
ninja.wallets[walletTab.getAttribute("id")].open();
|
||
}
|
||
else if (ninja.seeder.isStillSeeding == true && !(walletType == "brainwallet" || walletType == "detailwallet")) {
|
||
document.getElementById("generate").style.display = "block";
|
||
}
|
||
}
|
||
},
|
||
|
||
whichIsOpen: function () {
|
||
var isOpen;
|
||
for (var wType in ninja.wallets) {
|
||
isOpen = ninja.wallets[wType].isOpen();
|
||
if (isOpen) {
|
||
return wType;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
};
|
||
|
||
ninja.getQueryString = function () {
|
||
var result = {}, queryString = location.search.substring(1), re = /([^&=]+)=([^&]*)/g, m;
|
||
while (m = re.exec(queryString)) {
|
||
result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// use when passing an Array of Functions
|
||
ninja.runSerialized = function (functions, onComplete) {
|
||
onComplete = onComplete || function () { };
|
||
|
||
if (functions.length === 0) onComplete();
|
||
else {
|
||
// run the first function, and make it call this
|
||
// function when finished with the rest of the list
|
||
var f = functions.shift();
|
||
f(function () { ninja.runSerialized(functions, onComplete); });
|
||
}
|
||
};
|
||
|
||
ninja.forSerialized = function (initial, max, whatToDo, onComplete) {
|
||
onComplete = onComplete || function () { };
|
||
|
||
if (initial === max) { onComplete(); }
|
||
else {
|
||
// same idea as runSerialized
|
||
whatToDo(initial, function () { ninja.forSerialized(++initial, max, whatToDo, onComplete); });
|
||
}
|
||
};
|
||
|
||
// use when passing an Object (dictionary) of Functions
|
||
ninja.foreachSerialized = function (collection, whatToDo, onComplete) {
|
||
var keys = [];
|
||
for (var name in collection) {
|
||
keys.push(name);
|
||
}
|
||
ninja.forSerialized(0, keys.length, function (i, callback) {
|
||
whatToDo(keys[i], callback);
|
||
}, onComplete);
|
||
};
|
||
</script>
|
||
<script type="text/javascript">
|
||
(function (wallets, qrCode) {
|
||
var single = wallets.singlewallet = {
|
||
isOpen: function () {
|
||
return (document.getElementById("singlewallet").className.indexOf("selected") != -1);
|
||
},
|
||
|
||
open: function () {
|
||
if (document.getElementById("btcaddress").innerHTML == "") {
|
||
single.generateNewAddressAndKey();
|
||
}
|
||
document.getElementById("singlearea").style.display = "block";
|
||
},
|
||
|
||
close: function () {
|
||
document.getElementById("singlearea").style.display = "none";
|
||
},
|
||
|
||
// generate bitcoin address and private key and update information in the HTML
|
||
generateNewAddressAndKey: function () {
|
||
try {
|
||
var key = new Bitcoin.ECKey(false);
|
||
key.setCompressed(true);
|
||
var bitcoinAddress = key.getBitcoinAddress();
|
||
var privateKeyWif = key.getBitcoinWalletImportFormat();
|
||
document.getElementById("btcaddress").innerHTML = bitcoinAddress;
|
||
document.getElementById("btcprivwif").innerHTML = privateKeyWif;
|
||
var keyValuePair = {
|
||
"qrcode_public": bitcoinAddress,
|
||
"qrcode_private": privateKeyWif
|
||
};
|
||
qrCode.showQrCode(keyValuePair, 4);
|
||
}
|
||
catch (e) {
|
||
// browser does not have sufficient JavaScript support to generate a bitcoin address
|
||
alert(e);
|
||
document.getElementById("btcaddress").innerHTML = "error";
|
||
document.getElementById("btcprivwif").innerHTML = "error";
|
||
document.getElementById("qrcode_public").innerHTML = "";
|
||
document.getElementById("qrcode_private").innerHTML = "";
|
||
}
|
||
}
|
||
};
|
||
})(ninja.wallets, ninja.qrCode);
|
||
</script>
|
||
<script type="text/javascript">
|
||
ninja.wallets.paperwallet = {
|
||
isOpen: function () {
|
||
return (document.getElementById("paperwallet").className.indexOf("selected") != -1);
|
||
},
|
||
|
||
open: function () {
|
||
document.getElementById("main").setAttribute("class", "paper"); // add 'paper' class to main div
|
||
var paperArea = document.getElementById("paperarea");
|
||
paperArea.style.display = "block";
|
||
var perPageLimitElement = document.getElementById("paperlimitperpage");
|
||
var limitElement = document.getElementById("paperlimit");
|
||
var pageBreakAt = (ninja.wallets.paperwallet.useArtisticWallet) ? ninja.wallets.paperwallet.pageBreakAtArtisticDefault : ninja.wallets.paperwallet.pageBreakAtDefault;
|
||
if (perPageLimitElement && perPageLimitElement.value < 1) {
|
||
perPageLimitElement.value = pageBreakAt;
|
||
}
|
||
if (limitElement && limitElement.value < 1) {
|
||
limitElement.value = pageBreakAt;
|
||
}
|
||
if (document.getElementById("paperkeyarea").innerHTML == "") {
|
||
document.getElementById("paperpassphrase").disabled = true;
|
||
document.getElementById("paperencrypt").checked = false;
|
||
ninja.wallets.paperwallet.encrypt = false;
|
||
ninja.wallets.paperwallet.build(pageBreakAt, pageBreakAt, !document.getElementById('paperart').checked, document.getElementById('paperpassphrase').value);
|
||
}
|
||
},
|
||
|
||
close: function () {
|
||
document.getElementById("paperarea").style.display = "none";
|
||
document.getElementById("main").setAttribute("class", ""); // remove 'paper' class from main div
|
||
},
|
||
|
||
remaining: null, // use to keep track of how many addresses are left to process when building the paper wallet
|
||
count: 0,
|
||
pageBreakAtDefault: 7,
|
||
pageBreakAtArtisticDefault: 3,
|
||
useArtisticWallet: true,
|
||
pageBreakAt: null,
|
||
|
||
build: function (numWallets, pageBreakAt, useArtisticWallet, passphrase) {
|
||
if (numWallets < 1) numWallets = 1;
|
||
if (pageBreakAt < 1) pageBreakAt = 1;
|
||
ninja.wallets.paperwallet.remaining = numWallets;
|
||
ninja.wallets.paperwallet.count = 0;
|
||
ninja.wallets.paperwallet.useArtisticWallet = useArtisticWallet;
|
||
ninja.wallets.paperwallet.pageBreakAt = pageBreakAt;
|
||
document.getElementById("paperkeyarea").innerHTML = "";
|
||
if (ninja.wallets.paperwallet.encrypt) {
|
||
if (passphrase == "") {
|
||
alert(ninja.translator.get("bip38alertpassphraserequired"));
|
||
return;
|
||
}
|
||
document.getElementById("busyblock").className = "busy";
|
||
ninja.privateKey.BIP38GenerateIntermediatePointAsync(passphrase, null, null, function (intermediate) {
|
||
ninja.wallets.paperwallet.intermediatePoint = intermediate;
|
||
document.getElementById("busyblock").className = "";
|
||
setTimeout(ninja.wallets.paperwallet.batch, 0);
|
||
});
|
||
}
|
||
else {
|
||
setTimeout(ninja.wallets.paperwallet.batch, 0);
|
||
}
|
||
},
|
||
|
||
batch: function () {
|
||
if (ninja.wallets.paperwallet.remaining > 0) {
|
||
var paperArea = document.getElementById("paperkeyarea");
|
||
ninja.wallets.paperwallet.count++;
|
||
var i = ninja.wallets.paperwallet.count;
|
||
var pageBreakAt = ninja.wallets.paperwallet.pageBreakAt;
|
||
var div = document.createElement("div");
|
||
div.setAttribute("id", "keyarea" + i);
|
||
if (ninja.wallets.paperwallet.useArtisticWallet) {
|
||
div.innerHTML = ninja.wallets.paperwallet.templateArtisticHtml(i);
|
||
div.setAttribute("class", "keyarea art");
|
||
}
|
||
else {
|
||
div.innerHTML = ninja.wallets.paperwallet.templateHtml(i);
|
||
div.setAttribute("class", "keyarea");
|
||
}
|
||
if (paperArea.innerHTML != "") {
|
||
// page break
|
||
if ((i - 1) % pageBreakAt == 0 && i >= pageBreakAt) {
|
||
var pBreak = document.createElement("div");
|
||
pBreak.setAttribute("class", "pagebreak");
|
||
document.getElementById("paperkeyarea").appendChild(pBreak);
|
||
div.style.pageBreakBefore = "always";
|
||
if (!ninja.wallets.paperwallet.useArtisticWallet) {
|
||
div.style.borderTop = "2px solid green";
|
||
}
|
||
}
|
||
}
|
||
document.getElementById("paperkeyarea").appendChild(div);
|
||
ninja.wallets.paperwallet.generateNewWallet(i);
|
||
ninja.wallets.paperwallet.remaining--;
|
||
setTimeout(ninja.wallets.paperwallet.batch, 0);
|
||
}
|
||
},
|
||
|
||
// generate bitcoin address, private key, QR Code and update information in the HTML
|
||
// idPostFix: 1, 2, 3, etc.
|
||
generateNewWallet: function (idPostFix) {
|
||
if (ninja.wallets.paperwallet.encrypt) {
|
||
var compressed = true;
|
||
ninja.privateKey.BIP38GenerateECAddressAsync(ninja.wallets.paperwallet.intermediatePoint, compressed, function (address, encryptedKey) {
|
||
Bitcoin.KeyPool.push(new Bitcoin.Bip38Key(address, encryptedKey));
|
||
if (ninja.wallets.paperwallet.useArtisticWallet) {
|
||
ninja.wallets.paperwallet.showArtisticWallet(idPostFix, address, encryptedKey);
|
||
}
|
||
else {
|
||
ninja.wallets.paperwallet.showWallet(idPostFix, address, encryptedKey);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
var key = new Bitcoin.ECKey(false);
|
||
key.setCompressed(true);
|
||
var bitcoinAddress = key.getBitcoinAddress();
|
||
var privateKeyWif = key.getBitcoinWalletImportFormat();
|
||
if (ninja.wallets.paperwallet.useArtisticWallet) {
|
||
ninja.wallets.paperwallet.showArtisticWallet(idPostFix, bitcoinAddress, privateKeyWif);
|
||
}
|
||
else {
|
||
ninja.wallets.paperwallet.showWallet(idPostFix, bitcoinAddress, privateKeyWif);
|
||
}
|
||
}
|
||
},
|
||
|
||
templateHtml: function (i) {
|
||
var privateKeyLabel = "Private Key:"
|
||
|
||
var walletHtml =
|
||
"<div class='public'>" +
|
||
"<div id='qrcode_public" + i + "' class='qrcode_public'></div>" +
|
||
"<div class='pubaddress'>" +
|
||
"<span class='label'>SmartCash Address:</span>" +
|
||
"<span class='output' id='btcaddress" + i + "'></span>" +
|
||
"</div>" +
|
||
"</div>" +
|
||
"<div class='private'>" +
|
||
"<div id='qrcode_private" + i + "' class='qrcode_private'></div>" +
|
||
"<div class='privwif'>" +
|
||
"<span class='label'>" + privateKeyLabel + "</span>" +
|
||
"<span class='output' id='btcprivwif" + i + "'></span>" +
|
||
"</div>" +
|
||
"</div>";
|
||
return walletHtml;
|
||
},
|
||
|
||
showWallet: function (idPostFix, bitcoinAddress, privateKey) {
|
||
document.getElementById("btcaddress" + idPostFix).innerHTML = bitcoinAddress;
|
||
document.getElementById("btcprivwif" + idPostFix).innerHTML = privateKey;
|
||
var keyValuePair = {};
|
||
keyValuePair["qrcode_public" + idPostFix] = bitcoinAddress;
|
||
keyValuePair["qrcode_private" + idPostFix] = privateKey;
|
||
ninja.qrCode.showQrCode(keyValuePair);
|
||
document.getElementById("keyarea" + idPostFix).style.display = "block";
|
||
},
|
||
|
||
templateArtisticHtml: function (i) {
|
||
var keyelement = 'btcprivwif';
|
||
var image = 'data:image/jpeg;base64,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';
|
||
if (ninja.wallets.paperwallet.encrypt) {
|
||
keyelement = 'btcencryptedkey'
|
||
}
|
||
|
||
var walletHtml =
|
||
"<div class='artwallet' id='artwallet" + i + "'>" +
|
||
//"<iframe src='bitcoin-wallet-01.svg' id='papersvg" + i + "' class='papersvg' ></iframe>" +
|
||
"<img id='papersvg" + i + "' class='papersvg' src='" + image + "' />" +
|
||
"<div id='qrcode_public" + i + "' class='qrcode_public'></div>" +
|
||
"<div id='qrcode_private" + i + "' class='qrcode_private'></div>" +
|
||
"<div class='btcaddress' id='btcaddress" + i + "'></div>" +
|
||
"<div class='" + keyelement + "' id='" + keyelement + i + "'></div>" +
|
||
"</div>";
|
||
return walletHtml;
|
||
},
|
||
|
||
showArtisticWallet: function (idPostFix, bitcoinAddress, privateKey) {
|
||
var keyValuePair = {};
|
||
keyValuePair["qrcode_public" + idPostFix] = bitcoinAddress;
|
||
keyValuePair["qrcode_private" + idPostFix] = privateKey;
|
||
ninja.qrCode.showQrCode(keyValuePair, 2.5);
|
||
document.getElementById("btcaddress" + idPostFix).innerHTML = bitcoinAddress;
|
||
|
||
if (ninja.wallets.paperwallet.encrypt) {
|
||
var half = privateKey.length / 2;
|
||
document.getElementById("btcencryptedkey" + idPostFix).innerHTML = privateKey.slice(0, half) + '<br />' + privateKey.slice(half);
|
||
}
|
||
else {
|
||
document.getElementById("btcprivwif" + idPostFix).innerHTML = privateKey;
|
||
}
|
||
|
||
// CODE to modify SVG DOM elements
|
||
//var paperSvg = document.getElementById("papersvg" + idPostFix);
|
||
//if (paperSvg) {
|
||
// svgDoc = paperSvg.contentDocument;
|
||
// if (svgDoc) {
|
||
// var bitcoinAddressElement = svgDoc.getElementById("bitcoinaddress");
|
||
// var privateKeyElement = svgDoc.getElementById("privatekey");
|
||
// if (bitcoinAddressElement && privateKeyElement) {
|
||
// bitcoinAddressElement.textContent = bitcoinAddress;
|
||
// privateKeyElement.textContent = privateKeyWif;
|
||
// }
|
||
// }
|
||
//}
|
||
},
|
||
|
||
toggleArt: function (element) {
|
||
ninja.wallets.paperwallet.resetLimits();
|
||
},
|
||
|
||
toggleEncrypt: function (element) {
|
||
// enable/disable passphrase textbox
|
||
document.getElementById("paperpassphrase").disabled = !element.checked;
|
||
ninja.wallets.paperwallet.encrypt = element.checked;
|
||
ninja.wallets.paperwallet.resetLimits();
|
||
},
|
||
|
||
resetLimits: function () {
|
||
var hideArt = document.getElementById("paperart");
|
||
var paperEncrypt = document.getElementById("paperencrypt");
|
||
var limit;
|
||
var limitperpage;
|
||
|
||
document.getElementById("paperkeyarea").style.fontSize = "100%";
|
||
if (!hideArt.checked) {
|
||
limit = ninja.wallets.paperwallet.pageBreakAtArtisticDefault;
|
||
limitperpage = ninja.wallets.paperwallet.pageBreakAtArtisticDefault;
|
||
}
|
||
else if (hideArt.checked && paperEncrypt.checked) {
|
||
limit = ninja.wallets.paperwallet.pageBreakAtDefault;
|
||
limitperpage = ninja.wallets.paperwallet.pageBreakAtDefault;
|
||
// reduce font size
|
||
document.getElementById("paperkeyarea").style.fontSize = "95%";
|
||
}
|
||
else if (hideArt.checked && !paperEncrypt.checked) {
|
||
limit = ninja.wallets.paperwallet.pageBreakAtDefault;
|
||
limitperpage = ninja.wallets.paperwallet.pageBreakAtDefault;
|
||
}
|
||
document.getElementById("paperlimitperpage").value = limitperpage;
|
||
document.getElementById("paperlimit").value = limit;
|
||
}
|
||
};
|
||
</script>
|
||
<script type="text/javascript">
|
||
(function (wallets, qrCode) {
|
||
var single = wallets.singlewallet = {
|
||
isOpen: function () {
|
||
return (document.getElementById("singlewallet").className.indexOf("selected") != -1);
|
||
},
|
||
|
||
open: function () {
|
||
if (document.getElementById("btcaddress").innerHTML == "") {
|
||
single.generateNewAddressAndKey();
|
||
}
|
||
document.getElementById("singlearea").style.display = "block";
|
||
},
|
||
|
||
close: function () {
|
||
document.getElementById("singlearea").style.display = "none";
|
||
},
|
||
|
||
// generate bitcoin address and private key and update information in the HTML
|
||
generateNewAddressAndKey: function () {
|
||
try {
|
||
var key = new Bitcoin.ECKey(false);
|
||
key.setCompressed(true);
|
||
var bitcoinAddress = key.getBitcoinAddress();
|
||
var privateKeyWif = key.getBitcoinWalletImportFormat();
|
||
document.getElementById("btcaddress").innerHTML = bitcoinAddress;
|
||
document.getElementById("btcprivwif").innerHTML = privateKeyWif;
|
||
var keyValuePair = {
|
||
"qrcode_public": bitcoinAddress,
|
||
"qrcode_private": privateKeyWif
|
||
};
|
||
qrCode.showQrCode(keyValuePair, 4);
|
||
}
|
||
catch (e) {
|
||
// browser does not have sufficient JavaScript support to generate a bitcoin address
|
||
alert(e);
|
||
document.getElementById("btcaddress").innerHTML = "error";
|
||
document.getElementById("btcprivwif").innerHTML = "error";
|
||
document.getElementById("qrcode_public").innerHTML = "";
|
||
document.getElementById("qrcode_private").innerHTML = "";
|
||
}
|
||
}
|
||
};
|
||
})(ninja.wallets, ninja.qrCode);
|
||
</script>
|
||
<script type="text/javascript">
|
||
if (ninja.getQueryString()["showseedpool"] == "true" || ninja.getQueryString()["showseedpool"] == "1") {
|
||
document.getElementById("seedpoolarea").style.display = "block";
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|