@@ -0,0 +1,35 @@ | |||
/* | |||
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(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, | |||
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< | |||
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j, | |||
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}}, | |||
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this); | |||
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a, | |||
e)).finalize(b)}}});var n=d.algo={};return d}(Math); | |||
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w< | |||
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); | |||
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])}, | |||
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]), | |||
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f, | |||
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m, | |||
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/ | |||
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math); | |||
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d, | |||
l)}})(); | |||
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()}, | |||
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^= | |||
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this, | |||
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a, | |||
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684, | |||
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})}, | |||
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d, | |||
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}(); | |||
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8, | |||
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>> | |||
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t= | |||
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})(); |
@@ -0,0 +1,109 @@ | |||
/* | |||
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 | |||
*/ | |||
(function () { | |||
// Shortcuts | |||
var C = CryptoJS; | |||
var C_lib = C.lib; | |||
var WordArray = C_lib.WordArray; | |||
var C_enc = C.enc; | |||
/** | |||
* Base64 encoding strategy. | |||
*/ | |||
var Base64 = C_enc.Base64 = { | |||
/** | |||
* Converts a word array to a Base64 string. | |||
* | |||
* @param {WordArray} wordArray The word array. | |||
* | |||
* @return {string} The Base64 string. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var base64String = CryptoJS.enc.Base64.stringify(wordArray); | |||
*/ | |||
stringify: function (wordArray) { | |||
// Shortcuts | |||
var words = wordArray.words; | |||
var sigBytes = wordArray.sigBytes; | |||
var map = this._map; | |||
// Clamp excess bits | |||
wordArray.clamp(); | |||
// Convert | |||
var base64Chars = []; | |||
for (var i = 0; i < sigBytes; i += 3) { | |||
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | |||
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; | |||
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; | |||
var triplet = (byte1 << 16) | (byte2 << 8) | byte3; | |||
for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { | |||
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); | |||
} | |||
} | |||
// Add padding | |||
var paddingChar = map.charAt(64); | |||
if (paddingChar) { | |||
while (base64Chars.length % 4) { | |||
base64Chars.push(paddingChar); | |||
} | |||
} | |||
return base64Chars.join(''); | |||
}, | |||
/** | |||
* Converts a Base64 string to a word array. | |||
* | |||
* @param {string} base64Str The Base64 string. | |||
* | |||
* @return {WordArray} The word array. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var wordArray = CryptoJS.enc.Base64.parse(base64String); | |||
*/ | |||
parse: function (base64Str) { | |||
// Shortcuts | |||
var base64StrLength = base64Str.length; | |||
var map = this._map; | |||
// Ignore padding | |||
var paddingChar = map.charAt(64); | |||
if (paddingChar) { | |||
var paddingIndex = base64Str.indexOf(paddingChar); | |||
if (paddingIndex != -1) { | |||
base64StrLength = paddingIndex; | |||
} | |||
} | |||
// Convert | |||
var words = []; | |||
var nBytes = 0; | |||
for (var i = 0; i < base64StrLength; i++) { | |||
if (i % 4) { | |||
var bits1 = map.indexOf(base64Str.charAt(i - 1)) << ((i % 4) * 2); | |||
var bits2 = map.indexOf(base64Str.charAt(i)) >>> (6 - (i % 4) * 2); | |||
words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); | |||
nBytes++; | |||
} | |||
} | |||
return WordArray.create(words, nBytes); | |||
}, | |||
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' | |||
}; | |||
}()); |
@@ -0,0 +1,135 @@ | |||
/* | |||
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 | |||
*/ | |||
(function () { | |||
// Shortcuts | |||
var C = CryptoJS; | |||
var C_lib = C.lib; | |||
var WordArray = C_lib.WordArray; | |||
var C_enc = C.enc; | |||
/** | |||
* UTF-16 BE encoding strategy. | |||
*/ | |||
var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { | |||
/** | |||
* Converts a word array to a UTF-16 BE string. | |||
* | |||
* @param {WordArray} wordArray The word array. | |||
* | |||
* @return {string} The UTF-16 BE string. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); | |||
*/ | |||
stringify: function (wordArray) { | |||
// Shortcuts | |||
var words = wordArray.words; | |||
var sigBytes = wordArray.sigBytes; | |||
// Convert | |||
var utf16Chars = []; | |||
for (var i = 0; i < sigBytes; i += 2) { | |||
var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; | |||
utf16Chars.push(String.fromCharCode(codePoint)); | |||
} | |||
return utf16Chars.join(''); | |||
}, | |||
/** | |||
* Converts a UTF-16 BE string to a word array. | |||
* | |||
* @param {string} utf16Str The UTF-16 BE string. | |||
* | |||
* @return {WordArray} The word array. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var wordArray = CryptoJS.enc.Utf16.parse(utf16String); | |||
*/ | |||
parse: function (utf16Str) { | |||
// Shortcut | |||
var utf16StrLength = utf16Str.length; | |||
// Convert | |||
var words = []; | |||
for (var i = 0; i < utf16StrLength; i++) { | |||
words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); | |||
} | |||
return WordArray.create(words, utf16StrLength * 2); | |||
} | |||
}; | |||
/** | |||
* UTF-16 LE encoding strategy. | |||
*/ | |||
C_enc.Utf16LE = { | |||
/** | |||
* Converts a word array to a UTF-16 LE string. | |||
* | |||
* @param {WordArray} wordArray The word array. | |||
* | |||
* @return {string} The UTF-16 LE string. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); | |||
*/ | |||
stringify: function (wordArray) { | |||
// Shortcuts | |||
var words = wordArray.words; | |||
var sigBytes = wordArray.sigBytes; | |||
// Convert | |||
var utf16Chars = []; | |||
for (var i = 0; i < sigBytes; i += 2) { | |||
var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); | |||
utf16Chars.push(String.fromCharCode(codePoint)); | |||
} | |||
return utf16Chars.join(''); | |||
}, | |||
/** | |||
* Converts a UTF-16 LE string to a word array. | |||
* | |||
* @param {string} utf16Str The UTF-16 LE string. | |||
* | |||
* @return {WordArray} The word array. | |||
* | |||
* @static | |||
* | |||
* @example | |||
* | |||
* var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); | |||
*/ | |||
parse: function (utf16Str) { | |||
// Shortcut | |||
var utf16StrLength = utf16Str.length; | |||
// Convert | |||
var words = []; | |||
for (var i = 0; i < utf16StrLength; i++) { | |||
words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); | |||
} | |||
return WordArray.create(words, utf16StrLength * 2); | |||
} | |||
}; | |||
function swapEndian(word) { | |||
return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); | |||
} | |||
}()); |
@@ -0,0 +1,62 @@ | |||
/* | |||
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 | |||
*/ | |||
(function () { | |||
// Check if typed arrays are supported | |||
if (typeof ArrayBuffer != 'function') { | |||
return; | |||
} | |||
// Shortcuts | |||
var C = CryptoJS; | |||
var C_lib = C.lib; | |||
var WordArray = C_lib.WordArray; | |||
// Reference original init | |||
var superInit = WordArray.init; | |||
// Augment WordArray.init to handle typed arrays | |||
var subInit = WordArray.init = function (typedArray) { | |||
// Convert buffers to uint8 | |||
if (typedArray instanceof ArrayBuffer) { | |||
typedArray = new Uint8Array(typedArray); | |||
} | |||
// Convert other array views to uint8 | |||
if ( | |||
typedArray instanceof Int8Array || | |||
typedArray instanceof Uint8ClampedArray || | |||
typedArray instanceof Int16Array || | |||
typedArray instanceof Uint16Array || | |||
typedArray instanceof Int32Array || | |||
typedArray instanceof Uint32Array || | |||
typedArray instanceof Float32Array || | |||
typedArray instanceof Float64Array | |||
) { | |||
typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); | |||
} | |||
// Handle Uint8Array | |||
if (typedArray instanceof Uint8Array) { | |||
// Shortcut | |||
var typedArrayByteLength = typedArray.byteLength; | |||
// Extract bytes | |||
var words = []; | |||
for (var i = 0; i < typedArrayByteLength; i++) { | |||
words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); | |||
} | |||
// Initialize this word array | |||
superInit.call(this, words, typedArrayByteLength); | |||
} else { | |||
// Else call normal init | |||
superInit.apply(this, arguments); | |||
} | |||
}; | |||
subInit.prototype = WordArray; | |||
}()); |
@@ -0,0 +1,44 @@ | |||
/* | |||
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 | |||
*/ | |||
/** | |||
* Counter block mode. | |||
*/ | |||
CryptoJS.mode.CTR = (function () { | |||
var CTR = CryptoJS.lib.BlockCipherMode.extend(); | |||
var Encryptor = CTR.Encryptor = CTR.extend({ | |||
processBlock: function (words, offset) { | |||
// Shortcuts | |||
var cipher = this._cipher | |||
var blockSize = cipher.blockSize; | |||
var iv = this._iv; | |||
var counter = this._counter; | |||
// Generate keystream | |||
if (iv) { | |||
counter = this._counter = iv.slice(0); | |||
// Remove IV for subsequent blocks | |||
this._iv = undefined; | |||
} | |||
var keystream = counter.slice(0); | |||
cipher.encryptBlock(keystream, 0); | |||
// Increment counter | |||
counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 | |||
// Encrypt | |||
for (var i = 0; i < blockSize; i++) { | |||
words[offset + i] ^= keystream[i]; | |||
} | |||
} | |||
}); | |||
CTR.Decryptor = Encryptor; | |||
return CTR; | |||
}()); |
@@ -0,0 +1,16 @@ | |||
/* | |||
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 | |||
*/ | |||
/** | |||
* A noop padding strategy. | |||
*/ | |||
CryptoJS.pad.NoPadding = { | |||
pad: function () { | |||
}, | |||
unpad: function () { | |||
} | |||
}; |
@@ -0,0 +1,175 @@ | |||
/* | |||
Called when the item has been created, or when creation failed due to an error. | |||
We'll just log success/failure here. | |||
*/ | |||
function onCreated(n) { | |||
if (browser.runtime.lastError) { | |||
console.log('Error: ${browser.runtime.lastError}'); | |||
} else { | |||
console.log("Item created successfully"); | |||
} | |||
} | |||
/* | |||
Called when the item has been removed. | |||
We'll just log success here. | |||
*/ | |||
function onRemoved() { | |||
console.log("Item removed successfully"); | |||
} | |||
/* | |||
Called when there was an error. | |||
We'll just log the error here. | |||
*/ | |||
function onError(error) { | |||
console.log('Error: ${error}'); | |||
} | |||
/* | |||
Create all the context menu items. | |||
*/ | |||
browser.contextMenus.create({ | |||
id: "upload-content", | |||
title: "Upload", | |||
contexts: ["image", "video", "audio"] | |||
}, onCreated); | |||
browser.contextMenus.create({ | |||
id: "paste-selection", | |||
title: "Paste Selection", | |||
contexts: ["selection"] | |||
}, onCreated); | |||
browser.contextMenus.create({ | |||
id: "shorten-url", | |||
title: "Shorten Url", | |||
contexts: ["link"] | |||
}, onCreated); | |||
/* | |||
The click event listener, where we perform the appropriate action given the | |||
ID of the menu item that was clicked. | |||
*/ | |||
browser.contextMenus.onClicked.addListener(function(info, tab) { | |||
var uploadUrl = 'https://api.teknik.io/v1/Upload'; | |||
var pasteUrl = 'https://api.teknik.io/v1/Paste'; | |||
var shortenUrl = 'https://api.teknik.io/v1/Shorten'; | |||
switch (info.menuItemId) { | |||
case "upload-content": | |||
// Get the media type | |||
var mediaType = info.mediaType; | |||
// Get the url for the source | |||
var srcUrl = info.srcUrl; | |||
// Upload the content | |||
console.log("Media: " + mediaType + " | Source: " + srcUrl); | |||
break; | |||
case "paste-selection": | |||
// Get the selected text | |||
var selectedText = info.selectionText; | |||
// Paste the current selection | |||
$.ajax({ | |||
type: "POST", | |||
url: pasteUrl, | |||
data: { code: selectedText }, | |||
success: function (response) { | |||
if (response.result) { | |||
var finalUrl = response.result.url; | |||
copyTextToClipboard(finalUrl); | |||
notify("Paste Created", "Paste has been created and saved to your clipboard."); | |||
} | |||
else { | |||
notify("Paste Error", response.error.message); | |||
} | |||
} | |||
}); | |||
break; | |||
case "shorten-url": | |||
// Get the url | |||
var fullUrl = info.linkUrl; | |||
// Shorten the url | |||
$.ajax({ | |||
type: "POST", | |||
url: shortenUrl, | |||
data: { url: fullUrl }, | |||
success: function (response) { | |||
if (response.result) { | |||
var finalUrl = response.result.shortUrl; | |||
copyTextToClipboard(finalUrl); | |||
notify("Url Shortened", "The Url has been shortened and saved to your clipboard."); | |||
} | |||
else { | |||
notify("Shorten Error", response.error.message); | |||
} | |||
} | |||
}); | |||
break; | |||
} | |||
}); | |||
function notify(title, message) { | |||
browser.notifications.create({ | |||
"type": "basic", | |||
"iconUrl": browser.extension.getURL("images/favicon-48.png"), | |||
"title": title, | |||
"message": message | |||
}); | |||
} | |||
function copyTextToClipboard(text) { | |||
var textArea = document.createElement("textarea"); | |||
// | |||
// *** This styling is an extra step which is likely not required. *** | |||
// | |||
// Why is it here? To ensure: | |||
// 1. the element is able to have focus and selection. | |||
// 2. if element was to flash render it has minimal visual impact. | |||
// 3. less flakyness with selection and copying which **might** occur if | |||
// the textarea element is not visible. | |||
// | |||
// The likelihood is the element won't even render, not even a flash, | |||
// so some of these are just precautions. However in IE the element | |||
// is visible whilst the popup box asking the user for permission for | |||
// the web page to copy to the clipboard. | |||
// | |||
// Place in top-left corner of screen regardless of scroll position. | |||
textArea.style.position = 'fixed'; | |||
textArea.style.top = 0; | |||
textArea.style.left = 0; | |||
// Ensure it has a small width and height. Setting to 1px / 1em | |||
// doesn't work as this gives a negative w/h on some browsers. | |||
textArea.style.width = '2em'; | |||
textArea.style.height = '2em'; | |||
// We don't need padding, reducing the size if it does flash render. | |||
textArea.style.padding = 0; | |||
// Clean up any borders. | |||
textArea.style.border = 'none'; | |||
textArea.style.outline = 'none'; | |||
textArea.style.boxShadow = 'none'; | |||
// Avoid flash of white box if rendered for any reason. | |||
textArea.style.background = 'transparent'; | |||
textArea.value = text; | |||
document.body.appendChild(textArea); | |||
textArea.select(); | |||
try { | |||
var successful = document.execCommand('copy'); | |||
var msg = successful ? 'successful' : 'unsuccessful'; | |||
console.log('Copying text command was ' + msg); | |||
} catch (err) { | |||
console.log('Oops, unable to copy'); | |||
} | |||
document.body.removeChild(textArea); | |||
} |
@@ -0,0 +1,18 @@ | |||
function onError(error) { | |||
console.log('Error: ${error}'); | |||
} | |||
function onGot(item) { | |||
var username = ""; | |||
var authToken = ""; | |||
if (item.username) { | |||
username = item.username; | |||
} | |||
if (item.authToken) { | |||
authToken = item.authToken; | |||
} | |||
//document.body.style.border = "10px solid " + color; | |||
} | |||
var getting = browser.storage.local.get(); | |||
getting.then(onGot, onError); |
@@ -0,0 +1,27 @@ | |||
html, body { | |||
width: 100px; | |||
} | |||
.button { | |||
margin: 3% auto; | |||
padding: 4px; | |||
text-align: center; | |||
font-size: 1.5em; | |||
cursor: pointer; | |||
} | |||
.option:hover { | |||
background-color: #CFF2F2; | |||
} | |||
.option { | |||
background-color: #E5F2F2; | |||
} | |||
.clear { | |||
background-color: #FBFBC9; | |||
} | |||
.clear:hover { | |||
background-color: #EAEAC9; | |||
} |
@@ -0,0 +1,19 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta charset="utf-8"> | |||
<link rel="stylesheet" href="popup.css"/> | |||
</head> | |||
<body> | |||
<div class="button option">Encrypt</div> | |||
<div class="button option">Gen Del</div> | |||
<div class="button option">Shorten</div> | |||
<div class="button option">Paste</div> | |||
<div class="button clear">Reset</div> | |||
<script src="popup.js"></script> | |||
</body> | |||
</html> |
@@ -0,0 +1,18 @@ | |||
/* | |||
Listen for clicks in the popup. | |||
If it's on a button which contains class "clear": | |||
Reload the page. | |||
Close the popup. This is needed, as the content script malfunctions after page reloads. | |||
*/ | |||
document.addEventListener("click", (e) => { | |||
if (e.target.classList.contains("option")) { | |||
var chosenOption = e.target.textContent; | |||
alert(chosenOption); | |||
} | |||
else if (e.target.classList.contains("clear")) { | |||
browser.tabs.reload(); | |||
window.close(); | |||
} | |||
}); |
@@ -0,0 +1,52 @@ | |||
{ | |||
"manifest_version": 2, | |||
"name": "Teknik Uploader", | |||
"version": "1.0", | |||
"description": "Uploads files to Teknik and adds the link to your clipboard.", | |||
"applications": { | |||
"gecko": { | |||
"id": "admin@teknik.io" | |||
} | |||
}, | |||
"permissions": [ | |||
"contextMenus", | |||
"activeTab", | |||
"storage", | |||
"notifications", | |||
"clipboardRead", | |||
"clipboardWrite" | |||
], | |||
"browser_action": { | |||
"default_icon": { | |||
"16": "images/favicon-16.png", | |||
"48": "images/favicon-48.png" | |||
}, | |||
"default_title": "Teknik Upload", | |||
"default_popup": "dialog/popup.html" | |||
}, | |||
"icons": { | |||
"16": "images/favicon-16.png", | |||
"48": "images/favicon-48.png" | |||
}, | |||
"background": { | |||
"scripts": [ | |||
"content/JQuery/jquery-3.1.1.min.js", | |||
"content/Crypto-js/aes.js", | |||
"content/Crypto-js/enc-base64.js", | |||
"content/Crypto-js/mode-ctr.js", | |||
"content/Crypto-js/lib-typedarrays.js", | |||
"content/Crypto-js/pad-nopadding.js", | |||
"content/background.js" | |||
] | |||
}, | |||
"options_ui": { | |||
"page": "settings/options.html" | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta charset="utf-8"> | |||
</head> | |||
<body> | |||
<form> | |||
<label for="username">Username</label> | |||
<input type="text" id="username" /> | |||
<label for="authToken">Authentication Token</label> | |||
<input type="text" id="authToken" /> | |||
<button type="submit">Save</button> | |||
</form> | |||
<script src="options.js"></script> | |||
</body> | |||
</html> |
@@ -0,0 +1,25 @@ | |||
function saveOptions(e) { | |||
e.preventDefault(); | |||
browser.storage.local.set({ | |||
username: document.querySelector("#username").value, | |||
authToken: document.querySelector("#authToken").value | |||
}); | |||
} | |||
function restoreOptions() { | |||
function setCurrentChoice(result) { | |||
document.querySelector("#username").value = result.username; | |||
document.querySelector("#authToken").value = result.authToken; | |||
} | |||
function onError(error) { | |||
console.log('Error: ${error}'); | |||
} | |||
var getting = browser.storage.local.get(); | |||
getting.then(setCurrentChoice, onError); | |||
} | |||
document.addEventListener("DOMContentLoaded", restoreOptions); | |||
document.querySelector("form").addEventListener("submit", saveOptions); |