@ -27,11 +27,11 @@ sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(n
sjcl . misc . pbkdf2 = function ( a , b , c , d , e ) { c = c || 1E3 ; if ( d < 0 || c < 0 ) throw sjcl . exception . invalid ( "invalid params to pbkdf2" ) ; if ( typeof a === "string" ) a = sjcl . codec . utf8String . toBits ( a ) ; e = e || sjcl . misc . hmac ; a = new e ( a ) ; var f , g , h , i , k = [ ] , j = sjcl . bitArray ; for ( i = 1 ; 32 * k . length < ( d || 1 ) ; i ++ ) { e = f = a . encrypt ( j . concat ( b , [ i ] ) ) ; for ( g = 1 ; g < c ; g ++ ) { f = a . encrypt ( f ) ; for ( h = 0 ; h < f . length ; h ++ ) e [ h ] ^= f [ h ] } k = k . concat ( e ) } if ( d ) k = j . clamp ( k , d ) ; return k } ;
sjcl . random = { randomWords : function ( a , b ) { var c = [ ] ; b = this . isReady ( b ) ; var d ; if ( b === 0 ) throw new sjcl . exception . notReady ( "generator isn't seeded" ) ; else b & 2 && this . U ( ! ( b & 1 ) ) ; for ( b = 0 ; b < a ; b += 4 ) { ( b + 1 ) % 0x10000 === 0 && this . L ( ) ; d = this . u ( ) ; c . push ( d [ 0 ] , d [ 1 ] , d [ 2 ] , d [ 3 ] ) } this . L ( ) ; return c . slice ( 0 , a ) } , setDefaultParanoia : function ( a ) { this . t = a } , addEntropy : function ( a , b , c ) { c = c || "user" ; var d , e , f = ( new Date ) . valueOf ( ) , g = this . q [ c ] , h = this . isReady ( ) ; d = this . F [ c ] ; if ( d === undefined ) d = this . F [ c ] = this . R ++ ; if ( g === undefined ) g = this . q [ c ] = 0 ; this . q [ c ] =
( this . q [ c ] + 1 ) % this . b . length ; switch ( typeof a ) { case "number" : break ; case "object" : if ( b === undefined ) for ( c = b = 0 ; c < a . length ; c ++ ) for ( e = a [ c ] ; e > 0 ; ) { b ++ ; e >>>= 1 } this . b [ g ] . update ( [ d , this . J ++ , 2 , b , f , a . length ] . concat ( a ) ) ; break ; case "string" : if ( b === undefined ) b = a . length ; this . b [ g ] . update ( [ d , this . J ++ , 3 , b , f , a . length ] ) ; this . b [ g ] . update ( a ) ; break ; default : throw new sjcl . exception . bug ( "random: addEntropy only supports number, array or string" ) ; } this . j [ g ] += b ; this . f += b ; if ( h === 0 ) { this . isReady ( ) !== 0 && this . K ( "seeded" , Math . max ( this . g ,
this . f ) ) ; this . K ( "progress" , this . getProgress ( ) ) } } , isReady : function ( a ) { a = this . B [ a !== undefined ? a : this . t ] ; return this . g && this . g >= a ? this . j [ 0 ] > 80 && ( new Date ) . valueOf ( ) > this . O ? 3 : 1 : this . f >= a ? 2 : 0 } , getProgress : function ( a ) { a = this . B [ a ? a : this . t ] ; return this . g >= a ? 1 [ "0" ] : this . f > a ? 1 [ "0" ] : this . f / a } , startCollectors : function ( ) { if ( ! this . m ) { if ( window . addEventListener ) { window . addEventListener ( "load" , this . o , false ) ; window . addEventListener ( "mousemove" , this . p , false ) } else if ( document . attachEvent ) { document . attachEvent ( "onload" ,
this . o ) ; document . attachEvent ( "onmousemove" , this . p ) } else throw new sjcl . exception . bug ( "can't attach event" ) ; this . m = true } } , stopCollectors : function ( ) { if ( this . m ) { if ( window . removeEventListener ) { window . removeEventListener ( "load" , this . o , false ) ; window . removeEventListener ( "mousemove" , this . p , false ) } else if ( window . detachEvent ) { window . detachEvent ( "onload" , this . o ) ; window . detachEvent ( "onmousemove" , this . p ) } this . m = false } } , addEventListener : function ( a , b ) { this . r [ a ] [ this . Q ++ ] = b } , removeEventListener : function ( a , b ) { var c ;
a = this . r [ a ] ; var d = [ ] ; for ( c in a ) a . hasOwnProperty ( c ) && a [ c ] === b && d . push ( c ) ; for ( b = 0 ; b < d . length ; b ++ ) { c = d [ b ] ; delete a [ c ] } } , b : [ new sjcl . hash . sha256 ] , j : [ 0 ] , z : 0 , q : { } , J : 0 , F : { } , R : 0 , g : 0 , f : 0 , O : 0 , a : [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , d : [ 0 , 0 , 0 , 0 ] , s : undefined , t : 6 , m : false , r : { progress : { } , seeded : { } } , Q : 0 , B : [ 0 , 48 , 64 , 96 , 128 , 192 , 0x100 , 384 , 512 , 768 , 1024 ] , u : function ( ) { for ( var a = 0 ; a < 4 ; a ++ ) { this . d [ a ] = this . d [ a ] + 1 | 0 ; if ( this . d [ a ] ) break } return this . s . encrypt ( this . d ) } , L : function ( ) { this . a = this . u ( ) . concat ( this . u ( ) ) ; this . s = new sjcl . cipher . aes ( this . a ) } ,
T : function ( a ) { this . a = sjcl . hash . sha256 . hash ( this . a . concat ( a ) ) ; this . s = new sjcl . cipher . aes ( this . a ) ; for ( a = 0 ; a < 4 ; a ++ ) { this . d [ a ] = this . d [ a ] + 1 | 0 ; if ( this . d [ a ] ) break } } , U : function ( a ) { var b = [ ] , c = 0 , d ; this . O = b [ 0 ] = ( new Date ) . valueOf ( ) + 3E4 ; for ( d = 0 ; d < 16 ; d ++ ) b . push ( Math . random ( ) * 0x100000000 | 0 ) ; for ( d = 0 ; d < this . b . length ; d ++ ) { b = b . concat ( this . b [ d ] . finalize ( ) ) ; c += this . j [ d ] ; this . j [ d ] = 0 ; if ( ! a && this . z & 1 << d ) break } if ( this . z >= 1 << this . b . length ) { this . b . push ( new sjcl . hash . sha256 ) ; this . j . push ( 0 ) } this . f -= c ; if ( c > this . g ) this . g = c ; this . z ++ ;
this . T ( b ) } , p : function ( a ) { sjcl . random . addEntropy ( [ a . x || a . clientX || a . offsetX , a . y || a . clientY || a . offsetY ] , 2 , "mouse" ) } , o : function ( ) { sjcl . random . addEntropy ( new Date , 2 , "loadtime" ) } , K : function ( a , b ) { var c ; a = sjcl . random . r [ a ] ; var d = [ ] ; for ( c in a ) a . hasOwnProperty ( c ) && d . push ( a [ c ] ) ; for ( c = 0 ; c < d . length ; c ++ ) d [ c ] ( b ) } } ; try { var s = new Uint32Array ( 32 ) ; crypto . getRandomValues ( s ) ; sjcl . random . addEntropy ( s , 1024 , "crypto['getRandomValues']" ) } catch ( t ) { }
this . f ) ) ; this . K ( "progress" , this . getProgress ( ) ) } } , isReady : function ( a ) { a = this . B [ a !== undefined ? a : this . t ] ; return this . g && this . g >= a ? this . j [ 0 ] > 80 && ( new Date ) . valueOf ( ) > this . O ? 3 : 1 : this . f >= a ? 2 : 0 } , getProgress : function ( a ) { a = this . B [ a ? a : this . t ] ; return this . g >= a ? 1 : this . f > a ? 1 : this . f / a } , startCollectors : function ( ) { if ( ! this . m ) { if ( window . addEventListener ) { window . addEventListener ( "load" , this . o , false ) ; window . addEventListener ( "mousemove" , this . p , false ) } else if ( document . attachEvent ) { document . attachEvent ( "onload" , this . o ) ;
document . attachEvent ( "onmousemove" , this . p ) } else throw new sjcl . exception . bug ( "can't attach event" ) ; this . m = true } } , stopCollectors : function ( ) { if ( this . m ) { if ( window . removeEventListener ) { window . removeEventListener ( "load" , this . o , false ) ; window . removeEventListener ( "mousemove" , this . p , false ) } else if ( window . detachEvent ) { window . detachEvent ( "onload" , this . o ) ; window . detachEvent ( "onmousemove" , this . p ) } this . m = false } } , addEventListener : function ( a , b ) { this . r [ a ] [ this . Q ++ ] = b } , removeEventListener : function ( a , b ) { var c ; a = this . r [ a ] ;
var d = [ ] ; for ( c in a ) a . hasOwnProperty ( c ) && a [ c ] === b && d . push ( c ) ; for ( b = 0 ; b < d . length ; b ++ ) { c = d [ b ] ; delete a [ c ] } } , b : [ new sjcl . hash . sha256 ] , j : [ 0 ] , z : 0 , q : { } , J : 0 , F : { } , R : 0 , g : 0 , f : 0 , O : 0 , a : [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , d : [ 0 , 0 , 0 , 0 ] , s : undefined , t : 6 , m : false , r : { progress : { } , seeded : { } } , Q : 0 , B : [ 0 , 48 , 64 , 96 , 128 , 192 , 0x100 , 384 , 512 , 768 , 1024 ] , u : function ( ) { for ( var a = 0 ; a < 4 ; a ++ ) { this . d [ a ] = this . d [ a ] + 1 | 0 ; if ( this . d [ a ] ) break } return this . s . encrypt ( this . d ) } , L : function ( ) { this . a = this . u ( ) . concat ( this . u ( ) ) ; this . s = new sjcl . cipher . aes ( this . a ) } , T : function ( a ) { this . a =
sjcl . hash . sha256 . hash ( this . a . concat ( a ) ) ; this . s = new sjcl . cipher . aes ( this . a ) ; for ( a = 0 ; a < 4 ; a ++ ) { this . d [ a ] = this . d [ a ] + 1 | 0 ; if ( this . d [ a ] ) break } } , U : function ( a ) { var b = [ ] , c = 0 , d ; this . O = b [ 0 ] = ( new Date ) . valueOf ( ) + 3E4 ; for ( d = 0 ; d < 16 ; d ++ ) b . push ( Math . random ( ) * 0x100000000 | 0 ) ; for ( d = 0 ; d < this . b . length ; d ++ ) { b = b . concat ( this . b [ d ] . finalize ( ) ) ; c += this . j [ d ] ; this . j [ d ] = 0 ; if ( ! a && this . z & 1 << d ) break } if ( this . z >= 1 << this . b . length ) { this . b . push ( new sjcl . hash . sha256 ) ; this . j . push ( 0 ) } this . f -= c ; if ( c > this . g ) this . g = c ; this . z ++ ; this . T ( b ) } , p : function ( a ) { sjcl . random . addEntropy ( [ a . x ||
a . clientX || a . offsetX , a . y || a . clientY || a . offsetY ] , 2 , "mouse" ) } , o : function ( ) { sjcl . random . addEntropy ( new Date , 2 , "loadtime" ) } , K : function ( a , b ) { var c ; a = sjcl . random . r [ a ] ; var d = [ ] ; for ( c in a ) a . hasOwnProperty ( c ) && d . push ( a [ c ] ) ; for ( c = 0 ; c < d . length ; c ++ ) d [ c ] ( b ) } } ; try { var s = new Uint32Array ( 32 ) ; crypto . getRandomValues ( s ) ; sjcl . random . addEntropy ( s , 1024 , "crypto['getRandomValues']" ) } catch ( t ) { }
sjcl . json = { defaults : { v : 1 , iter : 1E3 , ks : 128 , ts : 64 , mode : "ccm" , adata : "" , cipher : "aes" } , encrypt : function ( a , b , c , d ) { c = c || { } ; d = d || { } ; var e = sjcl . json , f = e . c ( { iv : sjcl . random . randomWords ( 4 , 0 ) } , e . defaults ) , g ; e . c ( f , c ) ; c = f . adata ; if ( typeof f . salt === "string" ) f . salt = sjcl . codec . base64 . toBits ( f . salt ) ; if ( typeof f . iv === "string" ) f . iv = sjcl . codec . base64 . toBits ( f . iv ) ; if ( ! sjcl . mode [ f . mode ] || ! sjcl . cipher [ f . cipher ] || typeof a === "string" && f . iter <= 100 || f . ts !== 64 && f . ts !== 96 && f . ts !== 128 || f . ks !== 128 && f . ks !== 192 && f . ks !== 0x100 || f . iv . length <
2 || f . iv . length > 4 ) throw new sjcl . exception . invalid ( "json encrypt: invalid parameters" ) ; if ( typeof a === "string" ) { g = sjcl . misc . cachedPbkdf2 ( a , f ) ; a = g . key . slice ( 0 , f . ks / 32 ) ; f . salt = g . salt } if ( typeof b === "string" ) b = sjcl . codec . utf8String . toBits ( b ) ; if ( typeof c === "string" ) c = sjcl . codec . utf8String . toBits ( c ) ; g = new sjcl . cipher [ f . cipher ] ( a ) ; e . c ( d , f ) ; d . key = a ; f . ct = sjcl . mode [ f . mode ] . encrypt ( g , b , f . iv , c , f . ts ) ; return e . encode ( f ) } , decrypt : function ( a , b , c , d ) { c = c || { } ; d = d || { } ; var e = sjcl . json ; b = e . c ( e . c ( e . c ( { } , e . defaults ) , e . decode ( b ) ) ,
c , true ) ; var f ; c = b . adata ; if ( typeof b . salt === "string" ) b . salt = sjcl . codec . base64 . toBits ( b . salt ) ; if ( typeof b . iv === "string" ) b . iv = sjcl . codec . base64 . toBits ( b . iv ) ; if ( ! sjcl . mode [ b . mode ] || ! sjcl . cipher [ b . cipher ] || typeof a === "string" && b . iter <= 100 || b . ts !== 64 && b . ts !== 96 && b . ts !== 128 || b . ks !== 128 && b . ks !== 192 && b . ks !== 0x100 || ! b . iv || b . iv . length < 2 || b . iv . length > 4 ) throw new sjcl . exception . invalid ( "json decrypt: invalid parameters" ) ; if ( typeof a === "string" ) { f = sjcl . misc . cachedPbkdf2 ( a , b ) ; a = f . key . slice ( 0 , b . ks / 32 ) ; b . salt = f . salt } if ( typeof c ===