summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorausiv4 <ausiv4@eb105b4a-77de-11de-a249-6bf219df57d5>2009-08-07 03:38:03 +0000
committerausiv4 <ausiv4@eb105b4a-77de-11de-a249-6bf219df57d5>2009-08-07 03:38:03 +0000
commit29e50956daeadaa6786b7cf34ab96387e5295bb6 (patch)
treeb8f352d908cb580280fa7901997f90fffccee5b2
parent0ce2f0f249e0b0868056d3ce00a2db5ebe270605 (diff)
This update separates the register functionality from the login library. The login script is now .3 kb smaller, but there is a new 1.1 kb
register file. I think that registrations are rare enough relative to logins that this should be a worthwhile tradeoff. This also prepares a framework for importing an update file, which will allow existing installations to upgrade from less secure authentication protocols, so some of the overhead in srp.js that was added here will help reduce the size as we add the update functionality.
-rw-r--r--django/srpproject/srp/views.py2
-rw-r--r--django/srpproject/templates/register.html1
-rw-r--r--javascript/jsPacker/build-pack-register.sh2
-rw-r--r--javascript/jsPacker/srp.min.js2
-rw-r--r--javascript/jsPacker/srp_register.min.js1
-rw-r--r--javascript/srp.js120
-rw-r--r--javascript/srp_register.js52
7 files changed, 106 insertions, 74 deletions
diff --git a/django/srpproject/srp/views.py b/django/srpproject/srp/views.py
index ffc5679..38d5503 100644
--- a/django/srpproject/srp/views.py
+++ b/django/srpproject/srp/views.py
@@ -51,7 +51,6 @@ def register_salt(request):
def register_user(request):
from django.contrib import auth
models.SRPUser(salt=request.session["srp_salt"], username=request.session["srp_name"], verifier=request.POST["v"]).save()
- # auth.models.SRPUser.objects.create_user(request.session["srp_name"],'', str(request.POST["v"]))
del request.session["srp_salt"]
del request.session["srp_name"]
return HttpResponse("<ok/>", mimetype="text/xml");
@@ -107,7 +106,6 @@ def handshake(request):
def verify(request):
import hashlib
from django.contrib.auth import login, authenticate
- # H(A, M, K)
try:
user = authenticate(username=request.session["srp_I"], M=(request.POST["M"], request.session["srp_M"]))
if user:
diff --git a/django/srpproject/templates/register.html b/django/srpproject/templates/register.html
index 2119802..102daed 100644
--- a/django/srpproject/templates/register.html
+++ b/django/srpproject/templates/register.html
@@ -9,6 +9,7 @@
<script src="{{ static_files }}/srp.js"></script>
{% endcomment %}
<script src="{{ static_files }}/jsPacker/srp.min.js"></script>
+ <script src="{{ static_files }}/jsPacker/srp_register.min.js"></script>
<script type="text/javascript">
function register()
{
diff --git a/javascript/jsPacker/build-pack-register.sh b/javascript/jsPacker/build-pack-register.sh
new file mode 100644
index 0000000..6b8f124
--- /dev/null
+++ b/javascript/jsPacker/build-pack-register.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+perl jsPacker.pl -fsq -e62 -i ../srp_register.js -o srp_register.min.js
diff --git a/javascript/jsPacker/srp.min.js b/javascript/jsPacker/srp.min.js
index 8639312..ac22414 100644
--- a/javascript/jsPacker/srp.min.js
+++ b/javascript/jsPacker/srp.min.js
@@ -1 +1 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1F(s){C 2r=8;C 7d=0;E 1e(x,y){C 4k=(x&4j)+(y&4j);C 7l=(x>>16)+(y>>16)+(4k>>16);F(7l<<16)|(4k&4j)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 7h(x,y,z){F((x&y)^((~x)&z))}E 7f(x,y,z){F((x&y)^(x&z)^(y&z))}E 7g(x){F(S(x,2)^S(x,13)^S(x,22))}E 7i(x){F(S(x,6)^S(x,11)^S(x,25))}E 7j(x){F(S(x,7)^S(x,18)^R(x,3))}E 7k(x){F(S(x,17)^S(x,19)^R(x,10))}E 78(m,l){C K=V 1z(b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD,aC,aB,aA,az,ay,ax,aw,av,au,at,as,ar,aq,ap,ao,an,al,ak,aj,ai,ah,ag,af,ae,ad,ab,aa,a9,a8,a7,a6,a5,a4,a3,a2,a1,a0,9Z);C 1a=V 1z(9Y,9X,9W,9V,9U,9T,9S,9R);C W=V 1z(64);C a,b,c,d,e,f,g,h,i,j;C 3q,4i;m[l>>5]|=2N<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(C i=0;i<m.T;i+=16){a=1a[0];b=1a[1];c=1a[2];d=1a[3];e=1a[4];f=1a[5];g=1a[6];h=1a[7];P(C j=0;j<64;j++){D(j<16)W[j]=m[j+i];J W[j]=1e(1e(1e(7k(W[j-2]),W[j-7]),7j(W[j-15])),W[j-16]);3q=1e(1e(1e(1e(h,7i(e)),7h(e,f,g)),K[j]),W[j]);4i=1e(7g(a),7f(a,b,c));h=g;g=f;f=e;e=1e(d,3q);d=c;c=b;b=a;a=1e(3q,4i)}1a[0]=1e(a,1a[0]);1a[1]=1e(b,1a[1]);1a[2]=1e(c,1a[2]);1a[3]=1e(d,1a[3]);1a[4]=1e(e,1a[4]);1a[5]=1e(f,1a[5]);1a[6]=1e(g,1a[6]);1a[7]=1e(h,1a[7])}F 1a}E 77(1P){C 4h=1z();C 7e=(1<<2r)-1;P(C i=0;i<1P.T*2r;i+=2r){4h[i>>5]|=(1P.27(i/2r)&7e)<<(24-i%32)}F 4h}E 7b(2q){2q=2q.9Q(/\\r\\n/g,"\\n");C 1T="";P(C n=0;n<2q.T;n++){C c=2q.27(n);D(c<3p){1T+=2t.2s(c)}J D((c>5Q)&&(c<9P)){1T+=2t.2s((c>>6)|9O);1T+=2t.2s((c&63)|3p)}J{1T+=2t.2s((c>>12)|9N);1T+=2t.2s(((c>>6)&63)|3p);1T+=2t.2s((c&63)|3p)}}F 1T}E 7a(3o){C 4g=7d?"9M":"9L";C 1P="";P(C i=0;i<3o.T*4;i++){1P+=4g.2P((3o[i>>2]>>((3-i%4)*8+4))&7c)+4g.2P((3o[i>>2]>>((3-i%4)*8))&7c)}F 1P}s=7b(s);F 7a(78(77(s),s.T*2r))}E 3n(){o.i=0;o.j=0;o.S=V 1z()}E 76(2v){C i,j,t;P(i=0;i<1S;++i)o.S[i]=i;j=0;P(i=0;i<1S;++i){j=(j+o.S[i]+2v[i%2v.T])&1E;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 75(){C t;o.i=(o.i+1)&1E;o.j=(o.j+o.S[o.i])&1E;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1E]}3n.H.6Y=76;3n.H.6X=75;E 6Z(){F V 3n()}C 3m=1S;C 2T;C 1s;C 1f;E 74(x){1s[1f++]^=x&1E;1s[1f++]^=(x>>8)&1E;1s[1f++]^=(x>>16)&1E;1s[1f++]^=(x>>24)&1E;D(1f>=3m)1f-=3m}E 4f(){74(V 9K().9J())}D(1s==Z){1s=V 1z();1f=0;C t;D(3l.4b=="6R"&&3l.9I<"5"&&2C.72){C z=2C.72.70(32);P(t=0;t<z.T;++t)1s[1f++]=z.27(t)&1E}L(1f<3m){t=1d.1Z(9H*1d.70());1s[1f++]=t>>>8;1s[1f++]=t&1E}1f=0;4f();}E 6W(){D(2T==Z){4f();2T=6Z();2T.6Y(1s);P(1f=0;1f<1s.T;++1f)1s[1f]=0;1f=0;}F 2T.6X()}E 6V(4e){C i;P(i=0;i<4e.T;++i)4e[i]=6W()}E 3J(){}3J.H.65=6V;C 1M;C 6U=9G;C 4c=((6U&9F)==9E);E G(a,b,c){D(a!=Z)D("66"==3b a)o.3N(a,b,c);J D(b==Z&&"2q"!=3b a)o.3g(a,1S);J o.3g(a,b)}E Q(){F V G(Z)}E 6Q(i,x,w,j,c,n){L(--n>=0){C v=x*o[i++]+w[j]+c;c=1d.1Z(v/9D);w[j++]=v&9C}F c}E 6S(i,x,w,j,c,n){C 2p=x&2Q,2o=x>>15;L(--n>=0){C l=o[i]&2Q;C h=o[i++]>>15;C m=2o*l+h*2p;l=2p*l+((m&2Q)<<15)+w[j]+(c&6T);c=(l>>>30)+(m>>>15)+2o*h+(c>>>30);w[j++]=l&6T}F c}E 6P(i,x,w,j,c,n){C 2p=x&4d,2o=x>>14;L(--n>=0){C l=o[i]&4d;C h=o[i++]>>14;C m=2o*l+h*2p;l=2p*l+((m&4d)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2o*h;w[j++]=l&9B}F c}D(4c&&(3l.4b=="4H 9A 9z")){G.H.am=6S;1M=30}J D(4c&&(3l.4b!="6R")){G.H.am=6Q;1M=26}J{G.H.am=6P;1M=28}G.H.O=1M;G.H.1h=((1<<1M)-1);G.H.1l=(1<<1M);C 3k=52;G.H.6N=1d.2D(2,3k);G.H.49=3k-1M;G.H.45=2*1M-3k;C 6O="9y";C 2S=V 1z();C 2a,1r;2a="0".27(0);P(1r=0;1r<=9;++1r)2S[2a++]=1r;2a="a".27(0);P(1r=10;1r<36;++1r)2S[2a++]=1r;2a="A".27(0);P(1r=10;1r<36;++1r)2S[2a++]=1r;E 4a(n){F 6O.2P(n)}E 3Z(s,i){C c=2S[s.27(i)];F(c==Z)?-1:c}E 6v(r){P(C i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6u(x){o.t=1;o.s=(x<0)?-1:0;D(x>0)o[0]=x;J D(x<-1)o[0]=x+1l;J o.t=0}E 1J(i){C r=Q();r.2f(i);F r}E 6t(s,b){C k;D(b==16)k=4;J D(b==8)k=3;J D(b==1S)k=8;J D(b==2)k=1;J D(b==32)k=5;J D(b==4)k=2;J{o.5K(s,b);F}o.t=0;o.s=0;C i=s.T,20=1o,1q=0;L(--i>=0){C x=(k==8)?s[i]&2M:3Z(s,i);D(x<0){D(s.2P(i)=="-")20=1G;68}20=1o;D(1q==0)o[o.t++]=x;J D(1q+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1q))-1))<<1q;o[o.t++]=(x>>(o.O-1q))}J o[o.t-1]|=x<<1q;1q+=k;D(1q>=o.O)1q-=o.O}D(k==8&&(s[0]&2N)!=0){o.s=-1;D(1q>0)o[o.t-1]|=((1<<(o.O-1q))-1)<<1q}o.1m();D(20)G.1y.Y(o,o)}E 6s(){C c=o.s&o.1h;L(o.t>0&&o[o.t-1]==c)--o.t}E 6f(b){D(o.s<0)F"-"+o.2G().1w(b);C k;D(b==16)k=4;J D(b==8)k=3;J D(b==2)k=1;J D(b==32)k=5;J D(b==4)k=2;J F o.5M(b);C 2I=(1<<k)-1,d,m=1o,r="",i=o.t;C p=o.O-(i*o.O)%k;D(i-->0){D(p<o.O&&(d=o[i]>>p)>0){m=1G;r=4a(d)}L(i>=0){D(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2I;D(p<=0){p+=o.O;--i}}D(d>0)m=1G;D(m)r+=4a(d)}}F m?r:"0"}E 6e(){C r=Q();G.1y.Y(o,r);F r}E 6d(){F(o.s<0)?o.2G():o}E 6c(a){C r=o.s-a.s;D(r!=0)F r;C i=o.t;r=i-a.t;D(r!=0)F r;L(--i>=0)D((r=o[i]-a[i])!=0)F r;F 0}E 2J(x){C r=1,t;D((t=x>>>16)!=0){x=t;r+=16}D((t=x>>8)!=0){x=t;r+=8}D((t=x>>4)!=0){x=t;r+=4}D((t=x>>2)!=0){x=t;r+=2}D((t=x>>1)!=0){x=t;r+=1}F r}E 6b(){D(o.t<=0)F 0;F o.O*(o.t-1)+2J(o[o.t-1]^(o.s&o.1h))}E 6r(n,r){C i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6q(n,r){P(C i=n;i<o.t;++i)r[i-n]=o[i];r.t=1d.3K(o.t-n,0);r.s=o.s}E 6p(n,r){C 1D=n%o.O;C 2n=o.O-1D;C 2R=(1<<2n)-1;C 1p=1d.1Z(n/o.O),c=(o.s<<1D)&o.1h,i;P(i=o.t-1;i>=0;--i){r[i+1p+1]=(o[i]>>2n)|c;c=(o[i]&2R)<<1D}P(i=1p-1;i>=0;--i)r[i]=0;r[1p]=c;r.t=o.t+1p+1;r.s=o.s;r.1m()}E 6o(n,r){r.s=o.s;C 1p=1d.1Z(n/o.O);D(1p>=o.t){r.t=0;F}C 1D=n%o.O;C 2n=o.O-1D;C 2R=(1<<1D)-1;r[0]=o[1p]>>1D;P(C i=1p+1;i<o.t;++i){r[i-1p-1]|=(o[i]&2R)<<2n;r[i-1p]=o[i]>>1D}D(1D>0)r[o.t-1p-1]|=(o.s&2R)<<2n;r.t=o.t-1p;r.1m()}E 6n(a,r){C i=0,c=0,m=1d.1O(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1h;c>>=o.O}D(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1h;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;D(c<-1)r[i++]=o.1l+c;J D(c>0)r[i++]=c;r.t=i;r.1m()}E 6m(a,r){C x=o.1I(),y=a.1I();C i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1m();D(o.s!=a.s)G.1y.Y(r,r)}E 6l(r){C x=o.1I();C i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){C c=x.am(i,x[i],r,2*i,0,1);D((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1l){r[i+x.t]-=x.1l;r[i+x.t+1]=1}}D(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1m()}E 6k(m,q,r){C 21=m.1I();D(21.t<=0)F;C 3j=o.1I();D(3j.t<21.t){D(q!=Z)q.2f(0);D(r!=Z)o.1K(r);F}D(r==Z)r=Q();C y=Q(),44=o.s,6K=m.s;C 2m=o.O-2J(21[21.t-1]);D(2m>0){21.2g(2m,y);3j.2g(2m,r)}J{21.1K(y);3j.1K(r)}C 1C=y.t;C 3i=y[1C-1];D(3i==0)F;C 46=3i*(1<<o.49)+((1C>1)?y[1C-2]>>o.45:0);C 6M=o.6N/46,6L=(1<<o.49)/46,e=1<<o.45;C i=r.t,j=i-1C,t=(q==Z)?Q():q;y.2k(j,t);D(r.1c(t)>=0){r[r.t++]=1;r.Y(t,r)}G.1x.2k(1C,t);t.Y(y,y);L(y.t<1C)y[y.t++]=0;L(--j>=0){C 3h=(r[--i]==3i)?o.1h:1d.1Z(r[i]*6M+(r[i-1]+e)*6L);D((r[i]+=y.am(0,3h,r,j,0,1C))<3h){y.2k(j,t);r.Y(t,r);L(r[i]<--3h)r.Y(t,r)}}D(q!=Z){r.2L(1C,q);D(44!=6K)G.1y.Y(q,q)}r.t=1C;r.1m();D(2m>0)r.1i(2m,r);D(44<0)G.1y.Y(r,r)}E 6a(a){C r=Q();o.1I().1L(a,Z,r);D(o.s<0&&r.1c(G.1y)>0)a.Y(r,r);F r}E 1R(m){o.m=m}E 6J(x){D(x.s<0||x.1c(o.m)>=0)F x.3T(o.m);J F x}E 6I(x){F x}E 6H(x){x.1L(o.m,Z,x)}E 6G(x,y,r){x.2j(y,r);o.1A(r)}E 6F(x,r){x.2K(r);o.1A(r)}1R.H.2i=6J;1R.H.2h=6I;1R.H.1A=6H;1R.H.1W=6G;1R.H.1B=6F;E 6i(){D(o.t<1)F 0;C x=o[0];D((x&1)==0)F 0;C y=x&3;y=(y*(2-(x&3Y)*y))&3Y;y=(y*(2-(x&2M)*y))&2M;y=(y*(2-(((x&3f)*y)&3f)))&3f;y=(y*(2-x*y%o.1l))%o.1l;F(y>0)?o.1l-y:-y}E 1Q(m){o.m=m;o.42=m.6j();o.40=o.42&2Q;o.6D=o.42>>15;o.6C=(1<<(m.O-15))-1;o.6E=2*m.t}E 6A(x){C r=Q();x.1I().2k(o.m.t,r);r.1L(o.m,Z,r);D(x.s<0&&r.1c(G.1y)>0)o.m.Y(r,r);F r}E 6z(x){C r=Q();x.1K(r);o.1A(r);F r}E 6y(x){L(x.t<=o.6E)x[x.t++]=0;P(C i=0;i<o.m.t;++i){C j=x[i]&2Q;C 6B=(j*o.40+(((j*o.6D+(x[i]>>15)*o.40)&o.6C)<<15))&x.1h;j=i+o.m.t;x[j]+=o.m.am(0,6B,x,i,0,o.m.t);L(x[j]>=x.1l){x[j]-=x.1l;x[++j]++}}x.1m();x.2L(o.m.t,x);D(x.1c(o.m)>=0)x.Y(o.m,x)}E 6w(x,r){x.2K(r);o.1A(r)}E 6x(x,y,r){x.2j(y,r);o.1A(r)}1Q.H.2i=6A;1Q.H.2h=6z;1Q.H.1A=6y;1Q.H.1W=6x;1Q.H.1B=6w;E 6h(){F((o.t>0)?(o[0]&1):o.s)==0}E 6g(e,z){D(e>9x||e<1)F G.1x;C r=Q(),1b=Q(),g=z.2i(o),i=2J(e)-1;g.1K(r);L(--i>=0){z.1B(r,1b);D((e&(1<<i))>0)z.1W(1b,g,r);J{C t=r;r=1b;1b=t}}F z.2h(r)}E 69(e,m){C z;D(e<1S||m.1k())z=V 1R(m);J z=V 1Q(m);F o.3U(e,z)}G.H.1K=6v;G.H.2f=6u;G.H.3g=6t;G.H.1m=6s;G.H.2k=6r;G.H.2L=6q;G.H.2g=6p;G.H.1i=6o;G.H.Y=6n;G.H.2j=6m;G.H.2K=6l;G.H.1L=6k;G.H.6j=6i;G.H.1k=6h;G.H.3U=6g;G.H.1w=6f;G.H.2G=6e;G.H.1I=6d;G.H.1c=6c;G.H.3R=6b;G.H.3T=6a;G.H.5O=69;G.1y=1J(0);G.1x=1J(1);E 5u(){C r=Q();o.1K(r);F r}E 5t(){D(o.s<0){D(o.t==1)F o[0]-o.1l;J D(o.t==0)F-1}J D(o.t==1)F o[0];J D(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5s(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5r(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 5N(r){F 1d.1Z(1d.9w*o.O/1d.9v(r))}E 5q(){D(o.s<0)F-1;J D(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 5L(b){D(b==Z)b=10;D(o.1H()==0||b<2||b>36)F"0";C 2O=o.3O(b);C a=1d.2D(b,2O);C d=1J(a),y=Q(),z=Q(),r="";o.1L(d,y,z);L(y.1H()>0){r=(a+z.3L()).1w(b).9u(1)+r;y.1L(d,y,z)}F z.3L().1w(b)+r}E 5J(s,b){o.2f(0);D(b==Z)b=10;C 2O=o.3O(b);C d=1d.2D(b,2O),20=1o,j=0,w=0;P(C i=0;i<s.T;++i){C x=3Z(s,i);D(x<0){D(s.2P(i)=="-"&&o.1H()==0)20=1G;68}w=b*w+x;D(++j>=2O){o.3M(d);o.2d(w,0);j=0;w=0}}D(j>0){o.3M(1d.2D(b,j));o.2d(w,0)}D(20)G.1y.Y(o,o)}E 5I(a,b,c){D("66"==3b b){D(a<2)o.2f(1);J{o.3N(a,c);D(!o.5b(a-1))o.1V(G.1x.3c(a-1),3e,o);D(o.1k())o.2d(1,0);L(!o.4S(b)){o.2d(2,0);D(o.3R()>a)o.Y(G.1x.3c(a-1),o)}}}J{C x=V 1z(),t=a&7;x.T=(a>>3)+1;b.65(x);D(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.3g(x,1S)}}E 5p(){C i=o.t,r=V 1z();r[0]=o.s;C p=o.O-(i*o.O)%8,d,k=0;D(i-->0){D(p<o.O&&(d=o[i]>>p)!=(o.s&o.1h)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){D(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2M;D(p<=0){p+=o.O;--i}}D((d&2N)!=0)d|=-1S;D(k==0&&(o.s&2N)!=(d&2N))++k;D(k>0||d!=o.s)r[k++]=d}}F r}E 5o(a){F(o.1c(a)==0)}E 5n(a){F(o.1c(a)<0)?o:a}E 5m(a){F(o.1c(a)>0)?o:a}E 5H(a,1Y,r){C i,f,m=1d.1O(a.t,o.t);P(i=0;i<m;++i)r[i]=1Y(o[i],a[i]);D(a.t<o.t){f=a.s&o.1h;P(i=m;i<o.t;++i)r[i]=1Y(o[i],f);r.t=o.t}J{f=o.s&o.1h;P(i=m;i<a.t;++i)r[i]=1Y(f,a[i]);r.t=a.t}r.s=1Y(o.s,a.s);r.1m()}E 62(x,y){F x&y}E 5l(a){C r=Q();o.1V(a,62,r);F r}E 3e(x,y){F x|y}E 5k(a){C r=Q();o.1V(a,3e,r);F r}E 3W(x,y){F x^y}E 5j(a){C r=Q();o.1V(a,3W,r);F r}E 3X(x,y){F x&~y}E 5i(a){C r=Q();o.1V(a,3X,r);F r}E 5h(){C r=Q();P(C i=0;i<o.t;++i)r[i]=o.1h&~o[i];r.t=o.t;r.s=~o.s;F r}E 5g(n){C r=Q();D(n<0)o.1i(-n,r);J o.2g(n,r);F r}E 5e(n){C r=Q();D(n<0)o.2g(-n,r);J o.1i(n,r);F r}E 60(x){D(x==0)F-1;C r=0;D((x&3f)==0){x>>=16;r+=16}D((x&2M)==0){x>>=8;r+=8}D((x&3Y)==0){x>>=4;r+=4}D((x&3)==0){x>>=2;r+=2}D((x&1)==0)++r;F r}E 5d(){P(C i=0;i<o.t;++i)D(o[i]!=0)F i*o.O+60(o[i]);D(o.s<0)F o.t*o.O;F-1}E 5Z(x){C r=0;L(x!=0){x&=x-1;++r}F r}E 5c(){C r=0,x=o.s&o.1h;P(C i=0;i<o.t;++i)r+=5Z(o[i]^x);F r}E 5a(n){C j=1d.1Z(n/o.O);D(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5G(n,1Y){C r=G.1x.3c(n);o.1V(r,1Y,r);F r}E 58(n){F o.3d(n,3e)}E 57(n){F o.3d(n,3X)}E 56(n){F o.3d(n,3W)}E 5F(a,r){C i=0,c=0,m=1d.1O(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1h;c>>=o.O}D(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1h;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;D(c>0)r[i++]=c;J D(c<-1)r[i++]=o.1l+c;r.t=i;r.1m()}E 55(a){C r=Q();o.2F(a,r);F r}E 54(a){C r=Q();o.Y(a,r);F r}E 51(a){C r=Q();o.2j(a,r);F r}E 4Z(a){C r=Q();o.1L(a,r,Z);F r}E 4Y(a){C r=Q();o.1L(a,Z,r);F r}E 4X(a){C q=Q(),r=Q();o.1L(a,q,r);F V 1z(q,r)}E 5E(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1m()}E 5D(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1l){o[w]-=o.1l;D(++w>=o.t)o[o.t++]=0;++o[w]}}E 2l(){}E 3V(x){F x}E 5Y(x,y,r){x.2j(y,r)}E 5X(x,r){x.2K(r)}2l.H.2i=3V;2l.H.2h=3V;2l.H.1W=5Y;2l.H.1B=5X;E 4U(e){F o.3U(e,V 2l())}E 5B(a,n,r){C i=1d.1O(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;C j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1d.1O(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1m()}E 5z(a,n,r){--n;C i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1d.3K(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1m();r.2L(1,r)}E 1X(m){o.1b=Q();o.3S=Q();G.1x.2k(2*m.t,o.1b);o.5W=o.1b.50(m);o.m=m}E 5V(x){D(x.s<0||x.t>2*o.m.t)F x.3T(o.m);J D(x.1c(o.m)<0)F x;J{C r=Q();x.1K(r);o.1A(r);F r}}E 5U(x){F x}E 5T(x){x.2L(o.m.t-1,o.1b);D(x.t>o.m.t+1){x.t=o.m.t+1;x.1m()}o.5W.5A(o.1b,o.m.t+1,o.3S);o.m.5C(o.3S,o.m.t+1,o.1b);L(x.1c(o.1b)<0)x.2d(1,o.m.t+1);x.Y(o.1b,x);L(x.1c(o.m)>=0)x.Y(o.m,x)}E 5R(x,r){x.2K(r);o.1A(r)}E 5S(x,y,r){x.2j(y,r);o.1A(r)}1X.H.2i=5V;1X.H.2h=5U;1X.H.1A=5T;1X.H.1W=5S;1X.H.1B=5R;E 4W(e,m){C i=e.3R(),k,r=1J(1),z;D(i<=0)F r;J D(i<18)k=1;J D(i<48)k=3;J D(i<9t)k=4;J D(i<9s)k=5;J k=6;D(i<8)z=V 1R(m);J D(m.1k())z=V 1X(m);J z=V 1Q(m);C g=V 1z(),n=3,2H=k-1,2I=(1<<k)-1;g[1]=z.2i(o);D(k>1){C 3Q=Q();z.1B(g[1],3Q);L(n<=2I){g[n]=Q();z.1W(3Q,g[n-2],g[n]);n+=2}}C j=e.t-1,w,3P=1G,1b=Q(),t;i=2J(e[j])-1;L(j>=0){D(i>=2H)w=(e[j]>>(i-2H))&2I;J{w=(e[j]&((1<<(i+1))-1))<<(2H-i);D(j>0)w|=e[j-1]>>(o.O+i-2H)}n=k;L((w&1)==0){w>>=1;--n}D((i-=n)<0){i+=o.O;--j}D(3P){g[w].1K(r);3P=1o}J{L(n>1){z.1B(r,1b);z.1B(1b,r);n-=2}D(n>0)z.1B(r,1b);J{t=r;r=1b;1b=t}z.1W(1b,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1B(r,1b);t=r;r=1b;1b=t;D(--i<0){i=o.O-1;--j}}}F z.2h(r)}E 4T(a){C x=(o.s<0)?o.2G():o.2E();C y=(a.s<0)?a.2G():a.2E();D(x.1c(y)<0){C t=x;x=y;y=t}C i=x.2c(),g=y.2c();D(g<0)F x;D(i<g)g=i;D(g>0){x.1i(g,x);y.1i(g,y)}L(x.1H()>0){D((i=x.2c())>0)x.1i(i,x);D((i=y.2c())>0)y.1i(i,y);D(x.1c(y)>=0){x.Y(y,x);x.1i(1,x)}J{y.Y(x,y);y.1i(1,y)}}D(g>0)y.2g(g,y);F y}E 5x(n){D(n<=0)F 0;C d=o.1l%n,r=(o.s<0)?n-1:0;D(o.t>0)D(d==0)r=o[0]%n;J P(C i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 4V(m){C ac=m.1k();D((o.1k()&&ac)||m.1H()==0)F G.1y;C u=m.2E(),v=o.2E();C a=1J(1),b=1J(0),c=1J(0),d=1J(1);L(u.1H()!=0){L(u.1k()){u.1i(1,u);D(ac){D(!a.1k()||!b.1k()){a.2F(o,a);b.Y(m,b)}a.1i(1,a)}J D(!b.1k())b.Y(m,b);b.1i(1,b)}L(v.1k()){v.1i(1,v);D(ac){D(!c.1k()||!d.1k()){c.2F(o,c);d.Y(m,d)}c.1i(1,c)}J D(!d.1k())d.Y(m,d);d.1i(1,d)}D(u.1c(v)>=0){u.Y(v,u);D(ac)a.Y(c,a);b.Y(d,b)}J{v.Y(u,v);D(ac)c.Y(a,c);d.Y(b,d)}}D(v.1c(G.1x)!=0)F G.1y;D(d.1c(m)>=0)F d.39(m);D(d.1H()<0)d.2F(m,d);J F d;D(d.1H()<0)F d.3A(m);J F d}C 1j=[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,9r,9q,9p,9o,9n,5Q,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V,8U,8T,8S,8R,8Q,8P,8O,8N,8M,8L,8K,8J,8I,8H,8G,8F,8E,8D,8C,8B,8A,8z,8y,8x,8w,8v,8u,8t,8s,8r,8q,8p,8o,8n,8m,8l,8k,8j,8i];C 5P=(1<<26)/1j[1j.T-1];E 4R(t){C i,x=o.1I();D(x.t==1&&x[0]<=1j[1j.T-1]){P(i=0;i<1j.T;++i)D(x[0]==1j[i])F 1G;F 1o}D(x.1k())F 1o;i=1;L(i<1j.T){C m=1j[i],j=i+1;L(j<1j.T&&m<5P)m*=1j[j++];m=x.5y(m);L(i<j)D(m%1j[i++]==0)F 1o}F x.5w(t)}E 5v(t){C 2e=o.39(G.1x);C k=2e.2c();D(k<=0)F 1o;C r=2e.5f(k);t=(t+1)>>1;D(t>1j.T)t=1j.T;C a=Q();P(C i=0;i<t;++i){a.2f(1j[i]);C y=a.2b(r,o);D(y.1c(G.1x)!=0&&y.1c(2e)!=0){C j=1;L(j++<k&&y.1c(2e)!=0){y=y.5O(2,o);D(y.1c(G.1x)==0)F 1o}D(y.1c(2e)!=0)F 1o}}F 1G}G.H.3O=5N;G.H.5M=5L;G.H.5K=5J;G.H.3N=5I;G.H.1V=5H;G.H.3d=5G;G.H.2F=5F;G.H.3M=5E;G.H.2d=5D;G.H.5C=5B;G.H.5A=5z;G.H.5y=5x;G.H.5w=5v;G.H.2E=5u;G.H.3L=5t;G.H.8h=5s;G.H.8g=5r;G.H.1H=5q;G.H.8f=5p;G.H.8e=5o;G.H.1O=5n;G.H.3K=5m;G.H.8d=5l;G.H.8c=5k;G.H.8b=5j;G.H.8a=5i;G.H.2W=5h;G.H.3c=5g;G.H.5f=5e;G.H.2c=5d;G.H.88=5c;G.H.5b=5a;G.H.87=58;G.H.86=57;G.H.85=56;G.H.3A=55;G.H.39=54;G.H.3z=51;G.H.50=4Z;G.H.84=4Y;G.H.82=4X;G.H.2b=4W;G.H.81=4V;G.H.2D=4U;G.H.80=4T;G.H.4S=4R;E 4m(4O,4N,4L,4M){C 4Q="7Z";C N=V G(4Q,16);C g=V G("2");C k=V G("7Y",16);C 4P=V 3J();C a=V G(32,4P);C A=g.2b(a,N);C 3C=A.1w(16);C B=Z;C 3B=Z;C I=4O;C u=Z;C p=4N;C x=Z;C S=Z;C K=Z;C M=Z;C 3y=Z;C U=Z;C 2B=4M;C 4K=4L;C 1n=o;C 2V=1o;C 7X=1o;E 2A(1P){D(4K=="7W"){F 1P}};E 2z(4F,1v,4G){D(2C.4J)U=V 4J();J D(2C.4I){7V{U=V 4I("4H.7U")}7T(e){}}J{1n.1U("4D 2W 7S.");F}D(U){U.7R=4G;U.7Q("7P",4F,1G);U.3I("4E-2Z","7O/x-7N-7M-7L");U.3I("4E-T",1v.T);U.3I("7K","7J");U.7I(1v)}J{1n.1U("4D 7H.")}};E 2y(4C){F 4C.7G.7F};E 3x(4B){F(3b(2C[4B])!="7E")};o.3G=E(){C 3a=2B+2A("3G/3H/");C 1v="I="+I;2z(3a,1v,4A)};E 4A(){D(U.35==4&&U.34==33){D(U.1u.1g("3H").T>0){C s=2y(U.1u.1g("3H")[0]);x=V G(1F(s+1F(I+":"+p)),16);C v=g.2b(x,N);4z(v.1w(16))}J D(U.1u.1g("2x").T>0){1n.1U(2y(U.1u.1g("2x")[0]))}}};E 4z(v){C 1v="v="+v;C 38=2B+2A("3G/7D/");2z(38,1v,4y)};E 4y(){D(U.35==4&&U.34==33){D(U.1u.1g("7C").T>0){1n.3E()}}};o.3E=E(){C 3a=2B+2A("7B/");C 1v="I="+I+"&A="+3C;2z(3a,1v,4x)};E 4x(){D(U.35==4&&U.34==33){D(U.1u.1g("r").T>0){C 3F=U.1u.1g("r")[0];4w(3F.3r("s"),3F.3r("B"))}J D(U.1u.1g("2x").T>0){1n.3E()}}};E 4w(s,3D){B=V G(3D,16);3B=3D;u=V G(1F(3C+3B),16);x=V G(1F(s+1F(I+":"+p)),16);C 4v=k.3z(g.2b(x,N));C 4u=a.3A(u.3z(x));S=B.39(4v).2b(4u,N);C 4t=A.1w(16)+B.1w(16)+S.1w(16);M=1F(4t);3y=1F(A.1w(16)+M+S.1w(16));4s(M);};E 4s(M){C 1v="M="+M;C 38=2B+2A("7A/");2z(38,1v,4r)};E 4r(){D(U.35==4&&U.34==33){D(U.1u.1g("M").T>0){D(2y(U.1u.1g("M")[0])==3y){1n.4o();2V=1G}J 1n.1U("7z 2v 7y 2W 7x")}J D(U.1u.1g("2x").T>0){1n.1U(2y(U.1u.1g("2x")[0]))}}};E 7w(){D(1n.3x("4p")&&1n.3x("4q"))F;C 2w=1n.4l.7v("/");C 2Y=2w.7u(0,2w.T-1).7t("/");D(2w[2w.T-1]=="7s.1O.2X"){C 1t=1N.3w(\'2u\');1t.2Z=\'3v/3u\';1t.2U=2Y+"/7r.1O.2X";1N.1g(\'3t\')[0].3s(1t)}J{C 1t=1N.3w(\'2u\');1t.2Z=\'3v/3u\';1t.2U=2Y+"/4q.2X";1N.1g(\'3t\')[0].3s(1t);1t=1N.3w(\'2u\');1t.2Z=\'3v/3u\';1t.2U=2Y+"/4p.2X";1N.1g(\'3t\')[0].3s(1t)}}o.2v=E(){D(K==Z)D(2V){K=1F(S);F K}J 1n.1U("7q 7p 2W 7o 2V.");J F K};o.4o=E(){4n("7n 7m.")};o.1U=E(t){4n(t)}};4m.H.4l=1N.1g(\'2u\')[1N.1g(\'2u\').T-1].3r("2U");',62,685,'||||||||||||||||||||||||this||||||||||||||var|if|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||length|xhr|new|||subTo|null|||||||||||HASH|r2|compareTo|Math|safe_add|rng_pptr|getElementsByTagName|DM|rShiftTo|lowprimes|isEven|DV|clamp|that|false|ds|sh|vv|rng_pool|scriptElt|responseXML|params|toString|ONE|ZERO|Array|reduce|sqrTo|ys|bs|255|SHA256|true|signum|abs|nbv|copyTo|divRemTo|dbits|document|min|str|Montgomery|Classic|256|utftext|error_message|bitwiseTo|mulTo|Barrett|op|floor|mi|pm||||||charCodeAt|||rr|modPow|getLowestSetBit|dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|script|key|arr|error|innerxml|ajaxRequest|paths|url|window|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|charAt|0x7fff|bm|BI_RC|rng_state|src|authenticated|not|js|path|type||||200|status|readyState|||auth_url|subtract|handshake_url|typeof|shiftLeft|changeBit|op_or|0xffff|fromString|qd|y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|getAttribute|appendChild|head|javascript|text|createElement|isdefined|M2|multiply|add|Bstr|Astr|ephemeral|identify|response|register|salt|setRequestHeader|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|mod|exp|nNop|op_xor|op_andnot|0xf|intAt|mpl||mp||ts|F2|yt|||F1|int2char|appName|j_lm|0x3fff|ba|rng_seed_time|hex_tab|bin|T2|0xFFFF|lsw|srpPath|SRP|alert|success|SHA1|MD5|confirm_authentication|send_hash|Mstr|aux|kgx|calculations|receive_salts|register_user|register_send_verifier|register_receive_salt|variable|node|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|server|ser|base_url|password|username|rng|Nstr|bnIsProbablePrime|isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow|bnDivideAndRemainder|bnRemainder|bnDivide|divide|bnMultiply|||bnSubtract|bnAdd|bnFlipBit|bnClearBit|bnSetBit||bnTestBit|testBit|bnBitCount|bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot|bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix|toRadix|bnpChunkSize|modPowInt|lplim|127|barrettSqrTo|barrettMulTo|barrettReduce|barrettRevert|barrettConvert|mu|nSqrTo|nMulTo|cbit|lbit||op_and|||nextBytes|number||continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo|bnAbs|bnNegate|bnToString|bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1|FV|BI_RM|am3|am1|Netscape|am2|0x3fffffff|canary|rng_get_bytes|rng_get_byte|next|init|prng_newstate|random||crypto||rng_seed_int|ARC4next|ARC4init|str2binb|core_sha256||binb2hex|Utf8Encode|0xF|hexcase|mask|Maj|Sigma0256|Ch|Sigma1256|Gamma0256|Gamma1256|msw|successful|Authentication|been|has|User|hash|srp|join|slice|split|import_hashes|match|does|Server|authenticate|handshake|ok|user|undefined|nodeValue|firstChild|failed|send|close|Connection|urlencoded|form|www|application|POST|open|onreadystatechange|supported|catch|XMLHTTP|try|django|hash_import|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse|divideAndRemainder||remainder|flipBit|clearBit|setBit|bitCount||andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443|439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311|307|293|283|281|277|271|269|263|257|251|241|239|233|229|227|223|211||199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz|Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536|appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|replace|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F|0xA54FF53A|0x3C6EF372|0xBB67AE85|0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208|0x84C87814|0x78A5636F|0x748F82EE|0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3|0x34B0BCB5||0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3|0xC24B8B70||0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967|0x6CA6351|0xD5A79147|0xC6E00BF3|0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA|0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1|0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE|0x12835B01|0xD807AA98|0xAB1C5ED5|0x923F82A4|0x59F111F1|0x3956C25B|0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1C(s){C 2o=8;C 74=0;E 1e(x,y){C 44=(x&42)+(y&42);C 7d=(x>>16)+(y>>16)+(44>>16);F(7d<<16)|(44&42)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 78(x,y,z){F((x&y)^((~x)&z))}E 76(x,y,z){F((x&y)^(x&z)^(y&z))}E 77(x){F(S(x,2)^S(x,13)^S(x,22))}E 7a(x){F(S(x,6)^S(x,11)^S(x,25))}E 7b(x){F(S(x,7)^S(x,18)^R(x,3))}E 7c(x){F(S(x,17)^S(x,19)^R(x,10))}E 6Y(m,l){C K=T 1u(b3,b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD,aC,aB,aA,az,ay,ax,aw,av,au,at,as,ar,aq,ap,ao,an,al,ak,aj,ai,ah,ag,af,ae,ad,ab,aa,a9,a8,a7,a6,a5,a4,a3,a2,a1,a0);C Z=T 1u(9Z,9Y,9X,9W,9V,9U,9T,9S);C W=T 1u(64);C a,b,c,d,e,f,g,h,i,j;C 3g,40;m[l>>5]|=2G<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(C i=0;i<m.V;i+=16){a=Z[0];b=Z[1];c=Z[2];d=Z[3];e=Z[4];f=Z[5];g=Z[6];h=Z[7];P(C j=0;j<64;j++){D(j<16)W[j]=m[j+i];J W[j]=1e(1e(1e(7c(W[j-2]),W[j-7]),7b(W[j-15])),W[j-16]);3g=1e(1e(1e(1e(h,7a(e)),78(e,f,g)),K[j]),W[j]);40=1e(77(a),76(a,b,c));h=g;g=f;f=e;e=1e(d,3g);d=c;c=b;b=a;a=1e(3g,40)}Z[0]=1e(a,Z[0]);Z[1]=1e(b,Z[1]);Z[2]=1e(c,Z[2]);Z[3]=1e(d,Z[3]);Z[4]=1e(e,Z[4]);Z[5]=1e(f,Z[5]);Z[6]=1e(g,Z[6]);Z[7]=1e(h,Z[7])}F Z}E 6X(1L){C 3Z=1u();C 75=(1<<2o)-1;P(C i=0;i<1L.V*2o;i+=2o){3Z[i>>5]|=(1L.1Z(i/2o)&75)<<(24-i%32)}F 3Z}E 70(2n){2n=2n.9R(/\\r\\n/g,"\\n");C 1P="";P(C n=0;n<2n.V;n++){C c=2n.1Z(n);D(c<3f){1P+=2q.2p(c)}J D((c>5I)&&(c<9Q)){1P+=2q.2p((c>>6)|9P);1P+=2q.2p((c&63)|3f)}J{1P+=2q.2p((c>>12)|9O);1P+=2q.2p(((c>>6)&63)|3f);1P+=2q.2p((c&63)|3f)}}F 1P}E 6Z(3e){C 3Y=74?"9N":"9M";C 1L="";P(C i=0;i<3e.V*4;i++){1L+=3Y.2I((3e[i>>2]>>((3-i%4)*8+4))&72)+3Y.2I((3e[i>>2]>>((3-i%4)*8))&72)}F 1L}s=70(s);F 6Z(6Y(6X(s),s.V*2o))}E 3d(){o.i=0;o.j=0;o.S=T 1u()}E 6W(2r){C i,j,t;P(i=0;i<1O;++i)o.S[i]=i;j=0;P(i=0;i<1O;++i){j=(j+o.S[i]+2r[i%2r.V])&1B;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 6V(){C t;o.i=(o.i+1)&1B;o.j=(o.j+o.S[o.i])&1B;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1B]}3d.H.6Q=6W;3d.H.6P=6V;E 6R(){F T 3d()}C 3c=1O;C 2M;C 1r;C 1f;E 6U(x){1r[1f++]^=x&1B;1r[1f++]^=(x>>8)&1B;1r[1f++]^=(x>>16)&1B;1r[1f++]^=(x>>24)&1B;D(1f>=3c)1f-=3c}E 3X(){6U(T 9L().9K())}D(1r==Y){1r=T 1u();1f=0;C t;D(3b.3T=="6J"&&3b.9J<"5"&&2v.6T){C z=2v.6T.6S(32);P(t=0;t<z.V;++t)1r[1f++]=z.1Z(t)&1B}L(1f<3c){t=1d.1W(9I*1d.6S());1r[1f++]=t>>>8;1r[1f++]=t&1B}1f=0;3X();}E 6O(){D(2M==Y){3X();2M=6R();2M.6Q(1r);P(1f=0;1f<1r.V;++1f)1r[1f]=0;1f=0;}F 2M.6P()}E 6N(3W){C i;P(i=0;i<3W.V;++i)3W[i]=6O()}E 3v(){}3v.H.5U=6N;C 1J;C 6M=9H;C 3U=((6M&9G)==9F);E G(a,b,c){D(a!=Y)D("5V"==2W a)o.3z(a,b,c);J D(b==Y&&"2n"!=2W a)o.34(a,1O);J o.34(a,b)}E Q(){F T G(Y)}E 6I(i,x,w,j,c,n){L(--n>=0){C v=x*o[i++]+w[j]+c;c=1d.1W(v/9E);w[j++]=v&9D}F c}E 6K(i,x,w,j,c,n){C 2m=x&2J,2l=x>>15;L(--n>=0){C l=o[i]&2J;C h=o[i++]>>15;C m=2l*l+h*2m;l=2m*l+((m&2J)<<15)+w[j]+(c&6L);c=(l>>>30)+(m>>>15)+2l*h+(c>>>30);w[j++]=l&6L}F c}E 6H(i,x,w,j,c,n){C 2m=x&3V,2l=x>>14;L(--n>=0){C l=o[i]&3V;C h=o[i++]>>14;C m=2l*l+h*2m;l=2m*l+((m&3V)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2l*h;w[j++]=l&9C}F c}D(3U&&(3b.3T=="4z 9B 9A")){G.H.am=6K;1J=30}J D(3U&&(3b.3T!="6J")){G.H.am=6I;1J=26}J{G.H.am=6H;1J=28}G.H.O=1J;G.H.1g=((1<<1J)-1);G.H.1l=(1<<1J);C 3a=52;G.H.6F=1d.2w(2,3a);G.H.3R=3a-1J;G.H.3P=2*1J-3a;C 6G="9z";C 2L=T 1u();C 20,1q;20="0".1Z(0);P(1q=0;1q<=9;++1q)2L[20++]=1q;20="a".1Z(0);P(1q=10;1q<36;++1q)2L[20++]=1q;20="A".1Z(0);P(1q=10;1q<36;++1q)2L[20++]=1q;E 3S(n){F 6G.2I(n)}E 3L(s,i){C c=2L[s.1Z(i)];F(c==Y)?-1:c}E 6n(r){P(C i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6m(x){o.t=1;o.s=(x<0)?-1:0;D(x>0)o[0]=x;J D(x<-1)o[0]=x+1l;J o.t=0}E 1G(i){C r=Q();r.2c(i);F r}E 6l(s,b){C k;D(b==16)k=4;J D(b==8)k=3;J D(b==1O)k=8;J D(b==2)k=1;J D(b==32)k=5;J D(b==4)k=2;J{o.5C(s,b);F}o.t=0;o.s=0;C i=s.V,1X=1n,1p=0;L(--i>=0){C x=(k==8)?s[i]&2F:3L(s,i);D(x<0){D(s.2I(i)=="-")1X=1D;5W}1X=1n;D(1p==0)o[o.t++]=x;J D(1p+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1p))-1))<<1p;o[o.t++]=(x>>(o.O-1p))}J o[o.t-1]|=x<<1p;1p+=k;D(1p>=o.O)1p-=o.O}D(k==8&&(s[0]&2G)!=0){o.s=-1;D(1p>0)o[o.t-1]|=((1<<(o.O-1p))-1)<<1p}o.1m();D(1X)G.1t.U(o,o)}E 6k(){C c=o.s&o.1g;L(o.t>0&&o[o.t-1]==c)--o.t}E 66(b){D(o.s<0)F"-"+o.2z().1x(b);C k;D(b==16)k=4;J D(b==8)k=3;J D(b==2)k=1;J D(b==32)k=5;J D(b==4)k=2;J F o.5E(b);C 2B=(1<<k)-1,d,m=1n,r="",i=o.t;C p=o.O-(i*o.O)%k;D(i-->0){D(p<o.O&&(d=o[i]>>p)>0){m=1D;r=3S(d)}L(i>=0){D(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2B;D(p<=0){p+=o.O;--i}}D(d>0)m=1D;D(m)r+=3S(d)}}F m?r:"0"}E 65(){C r=Q();G.1t.U(o,r);F r}E 62(){F(o.s<0)?o.2z():o}E 60(a){C r=o.s-a.s;D(r!=0)F r;C i=o.t;r=i-a.t;D(r!=0)F r;L(--i>=0)D((r=o[i]-a[i])!=0)F r;F 0}E 2C(x){C r=1,t;D((t=x>>>16)!=0){x=t;r+=16}D((t=x>>8)!=0){x=t;r+=8}D((t=x>>4)!=0){x=t;r+=4}D((t=x>>2)!=0){x=t;r+=2}D((t=x>>1)!=0){x=t;r+=1}F r}E 5Z(){D(o.t<=0)F 0;F o.O*(o.t-1)+2C(o[o.t-1]^(o.s&o.1g))}E 6j(n,r){C i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6i(n,r){P(C i=n;i<o.t;++i)r[i-n]=o[i];r.t=1d.3w(o.t-n,0);r.s=o.s}E 6h(n,r){C 1A=n%o.O;C 2k=o.O-1A;C 2K=(1<<2k)-1;C 1o=1d.1W(n/o.O),c=(o.s<<1A)&o.1g,i;P(i=o.t-1;i>=0;--i){r[i+1o+1]=(o[i]>>2k)|c;c=(o[i]&2K)<<1A}P(i=1o-1;i>=0;--i)r[i]=0;r[1o]=c;r.t=o.t+1o+1;r.s=o.s;r.1m()}E 6g(n,r){r.s=o.s;C 1o=1d.1W(n/o.O);D(1o>=o.t){r.t=0;F}C 1A=n%o.O;C 2k=o.O-1A;C 2K=(1<<1A)-1;r[0]=o[1o]>>1A;P(C i=1o+1;i<o.t;++i){r[i-1o-1]|=(o[i]&2K)<<2k;r[i-1o]=o[i]>>1A}D(1A>0)r[o.t-1o-1]|=(o.s&2K)<<2k;r.t=o.t-1o;r.1m()}E 6f(a,r){C i=0,c=0,m=1d.1K(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1g;c>>=o.O}D(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1g;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1g;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;D(c<-1)r[i++]=o.1l+c;J D(c>0)r[i++]=c;r.t=i;r.1m()}E 6e(a,r){C x=o.1F(),y=a.1F();C i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1m();D(o.s!=a.s)G.1t.U(r,r)}E 6d(r){C x=o.1F();C i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){C c=x.am(i,x[i],r,2*i,0,1);D((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1l){r[i+x.t]-=x.1l;r[i+x.t+1]=1}}D(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1m()}E 6c(m,q,r){C 1Y=m.1F();D(1Y.t<=0)F;C 39=o.1F();D(39.t<1Y.t){D(q!=Y)q.2c(0);D(r!=Y)o.1H(r);F}D(r==Y)r=Q();C y=Q(),3O=o.s,6C=m.s;C 2j=o.O-2C(1Y[1Y.t-1]);D(2j>0){1Y.2d(2j,y);39.2d(2j,r)}J{1Y.1H(y);39.1H(r)}C 1z=y.t;C 38=y[1z-1];D(38==0)F;C 3Q=38*(1<<o.3R)+((1z>1)?y[1z-2]>>o.3P:0);C 6E=o.6F/3Q,6D=(1<<o.3R)/3Q,e=1<<o.3P;C i=r.t,j=i-1z,t=(q==Y)?Q():q;y.2h(j,t);D(r.1c(t)>=0){r[r.t++]=1;r.U(t,r)}G.1s.2h(1z,t);t.U(y,y);L(y.t<1z)y[y.t++]=0;L(--j>=0){C 35=(r[--i]==38)?o.1g:1d.1W(r[i]*6E+(r[i-1]+e)*6D);D((r[i]+=y.am(0,35,r,j,0,1z))<35){y.2h(j,t);r.U(t,r);L(r[i]<--35)r.U(t,r)}}D(q!=Y){r.2E(1z,q);D(3O!=6C)G.1t.U(q,q)}r.t=1z;r.1m();D(2j>0)r.1h(2j,r);D(3O<0)G.1t.U(r,r)}E 5Y(a){C r=Q();o.1F().1I(a,Y,r);D(o.s<0&&r.1c(G.1t)>0)a.U(r,r);F r}E 1N(m){o.m=m}E 6B(x){D(x.s<0||x.1c(o.m)>=0)F x.3F(o.m);J F x}E 6A(x){F x}E 6z(x){x.1I(o.m,Y,x)}E 6y(x,y,r){x.2g(y,r);o.1v(r)}E 6x(x,r){x.2D(r);o.1v(r)}1N.H.2f=6B;1N.H.2e=6A;1N.H.1v=6z;1N.H.1T=6y;1N.H.1y=6x;E 6a(){D(o.t<1)F 0;C x=o[0];D((x&1)==0)F 0;C y=x&3;y=(y*(2-(x&3K)*y))&3K;y=(y*(2-(x&2F)*y))&2F;y=(y*(2-(((x&33)*y)&33)))&33;y=(y*(2-x*y%o.1l))%o.1l;F(y>0)?o.1l-y:-y}E 1M(m){o.m=m;o.3N=m.6b();o.3M=o.3N&2J;o.6v=o.3N>>15;o.6u=(1<<(m.O-15))-1;o.6w=2*m.t}E 6s(x){C r=Q();x.1F().2h(o.m.t,r);r.1I(o.m,Y,r);D(x.s<0&&r.1c(G.1t)>0)o.m.U(r,r);F r}E 6r(x){C r=Q();x.1H(r);o.1v(r);F r}E 6q(x){L(x.t<=o.6w)x[x.t++]=0;P(C i=0;i<o.m.t;++i){C j=x[i]&2J;C 6t=(j*o.3M+(((j*o.6v+(x[i]>>15)*o.3M)&o.6u)<<15))&x.1g;j=i+o.m.t;x[j]+=o.m.am(0,6t,x,i,0,o.m.t);L(x[j]>=x.1l){x[j]-=x.1l;x[++j]++}}x.1m();x.2E(o.m.t,x);D(x.1c(o.m)>=0)x.U(o.m,x)}E 6o(x,r){x.2D(r);o.1v(r)}E 6p(x,y,r){x.2g(y,r);o.1v(r)}1M.H.2f=6s;1M.H.2e=6r;1M.H.1v=6q;1M.H.1T=6p;1M.H.1y=6o;E 69(){F((o.t>0)?(o[0]&1):o.s)==0}E 68(e,z){D(e>9y||e<1)F G.1s;C r=Q(),1a=Q(),g=z.2f(o),i=2C(e)-1;g.1H(r);L(--i>=0){z.1y(r,1a);D((e&(1<<i))>0)z.1T(1a,g,r);J{C t=r;r=1a;1a=t}}F z.2e(r)}E 5X(e,m){C z;D(e<1O||m.1k())z=T 1N(m);J z=T 1M(m);F o.3G(e,z)}G.H.1H=6n;G.H.2c=6m;G.H.34=6l;G.H.1m=6k;G.H.2h=6j;G.H.2E=6i;G.H.2d=6h;G.H.1h=6g;G.H.U=6f;G.H.2g=6e;G.H.2D=6d;G.H.1I=6c;G.H.6b=6a;G.H.1k=69;G.H.3G=68;G.H.1x=66;G.H.2z=65;G.H.1F=62;G.H.1c=60;G.H.3D=5Z;G.H.3F=5Y;G.H.5G=5X;G.1t=1G(0);G.1s=1G(1);E 5m(){C r=Q();o.1H(r);F r}E 5l(){D(o.s<0){D(o.t==1)F o[0]-o.1l;J D(o.t==0)F-1}J D(o.t==1)F o[0];J D(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5k(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5j(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 5F(r){F 1d.1W(1d.9x*o.O/1d.9w(r))}E 5i(){D(o.s<0)F-1;J D(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 5D(b){D(b==Y)b=10;D(o.1E()==0||b<2||b>36)F"0";C 2H=o.3A(b);C a=1d.2w(b,2H);C d=1G(a),y=Q(),z=Q(),r="";o.1I(d,y,z);L(y.1E()>0){r=(a+z.3x()).1x(b).9v(1)+r;y.1I(d,y,z)}F z.3x().1x(b)+r}E 5B(s,b){o.2c(0);D(b==Y)b=10;C 2H=o.3A(b);C d=1d.2w(b,2H),1X=1n,j=0,w=0;P(C i=0;i<s.V;++i){C x=3L(s,i);D(x<0){D(s.2I(i)=="-"&&o.1E()==0)1X=1D;5W}w=b*w+x;D(++j>=2H){o.3y(d);o.2a(w,0);j=0;w=0}}D(j>0){o.3y(1d.2w(b,j));o.2a(w,0)}D(1X)G.1t.U(o,o)}E 5A(a,b,c){D("5V"==2W b){D(a<2)o.2c(1);J{o.3z(a,c);D(!o.50(a-1))o.1S(G.1s.2X(a-1),2Z,o);D(o.1k())o.2a(1,0);L(!o.4K(b)){o.2a(2,0);D(o.3D()>a)o.U(G.1s.2X(a-1),o)}}}J{C x=T 1u(),t=a&7;x.V=(a>>3)+1;b.5U(x);D(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.34(x,1O)}}E 5h(){C i=o.t,r=T 1u();r[0]=o.s;C p=o.O-(i*o.O)%8,d,k=0;D(i-->0){D(p<o.O&&(d=o[i]>>p)!=(o.s&o.1g)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){D(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2F;D(p<=0){p+=o.O;--i}}D((d&2G)!=0)d|=-1O;D(k==0&&(o.s&2G)!=(d&2G))++k;D(k>0||d!=o.s)r[k++]=d}}F r}E 5g(a){F(o.1c(a)==0)}E 5f(a){F(o.1c(a)<0)?o:a}E 5e(a){F(o.1c(a)>0)?o:a}E 5z(a,1V,r){C i,f,m=1d.1K(a.t,o.t);P(i=0;i<m;++i)r[i]=1V(o[i],a[i]);D(a.t<o.t){f=a.s&o.1g;P(i=m;i<o.t;++i)r[i]=1V(o[i],f);r.t=o.t}J{f=o.s&o.1g;P(i=m;i<a.t;++i)r[i]=1V(f,a[i]);r.t=a.t}r.s=1V(o.s,a.s);r.1m()}E 5T(x,y){F x&y}E 5d(a){C r=Q();o.1S(a,5T,r);F r}E 2Z(x,y){F x|y}E 5c(a){C r=Q();o.1S(a,2Z,r);F r}E 3I(x,y){F x^y}E 5b(a){C r=Q();o.1S(a,3I,r);F r}E 3J(x,y){F x&~y}E 5a(a){C r=Q();o.1S(a,3J,r);F r}E 58(){C r=Q();P(C i=0;i<o.t;++i)r[i]=o.1g&~o[i];r.t=o.t;r.s=~o.s;F r}E 57(n){C r=Q();D(n<0)o.1h(-n,r);J o.2d(n,r);F r}E 55(n){C r=Q();D(n<0)o.2d(-n,r);J o.1h(n,r);F r}E 5S(x){D(x==0)F-1;C r=0;D((x&33)==0){x>>=16;r+=16}D((x&2F)==0){x>>=8;r+=8}D((x&3K)==0){x>>=4;r+=4}D((x&3)==0){x>>=2;r+=2}D((x&1)==0)++r;F r}E 54(){P(C i=0;i<o.t;++i)D(o[i]!=0)F i*o.O+5S(o[i]);D(o.s<0)F o.t*o.O;F-1}E 5R(x){C r=0;L(x!=0){x&=x-1;++r}F r}E 51(){C r=0,x=o.s&o.1g;P(C i=0;i<o.t;++i)r+=5R(o[i]^x);F r}E 4Z(n){C j=1d.1W(n/o.O);D(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5y(n,1V){C r=G.1s.2X(n);o.1S(r,1V,r);F r}E 4Y(n){F o.2Y(n,2Z)}E 4X(n){F o.2Y(n,3J)}E 4W(n){F o.2Y(n,3I)}E 5x(a,r){C i=0,c=0,m=1d.1K(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1g;c>>=o.O}D(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1g;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1g;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;D(c>0)r[i++]=c;J D(c<-1)r[i++]=o.1l+c;r.t=i;r.1m()}E 4V(a){C r=Q();o.2y(a,r);F r}E 4U(a){C r=Q();o.U(a,r);F r}E 4T(a){C r=Q();o.2g(a,r);F r}E 4R(a){C r=Q();o.1I(a,r,Y);F r}E 4Q(a){C r=Q();o.1I(a,Y,r);F r}E 4P(a){C q=Q(),r=Q();o.1I(a,q,r);F T 1u(q,r)}E 5w(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1m()}E 5v(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1l){o[w]-=o.1l;D(++w>=o.t)o[o.t++]=0;++o[w]}}E 2i(){}E 3H(x){F x}E 5Q(x,y,r){x.2g(y,r)}E 5P(x,r){x.2D(r)}2i.H.2f=3H;2i.H.2e=3H;2i.H.1T=5Q;2i.H.1y=5P;E 4M(e){F o.3G(e,T 2i())}E 5t(a,n,r){C i=1d.1K(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;C j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1d.1K(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1m()}E 5r(a,n,r){--n;C i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1d.3w(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1m();r.2E(1,r)}E 1U(m){o.1a=Q();o.3E=Q();G.1s.2h(2*m.t,o.1a);o.5O=o.1a.4S(m);o.m=m}E 5N(x){D(x.s<0||x.t>2*o.m.t)F x.3F(o.m);J D(x.1c(o.m)<0)F x;J{C r=Q();x.1H(r);o.1v(r);F r}}E 5M(x){F x}E 5L(x){x.2E(o.m.t-1,o.1a);D(x.t>o.m.t+1){x.t=o.m.t+1;x.1m()}o.5O.5s(o.1a,o.m.t+1,o.3E);o.m.5u(o.3E,o.m.t+1,o.1a);L(x.1c(o.1a)<0)x.2a(1,o.m.t+1);x.U(o.1a,x);L(x.1c(o.m)>=0)x.U(o.m,x)}E 5J(x,r){x.2D(r);o.1v(r)}E 5K(x,y,r){x.2g(y,r);o.1v(r)}1U.H.2f=5N;1U.H.2e=5M;1U.H.1v=5L;1U.H.1T=5K;1U.H.1y=5J;E 4O(e,m){C i=e.3D(),k,r=1G(1),z;D(i<=0)F r;J D(i<18)k=1;J D(i<48)k=3;J D(i<9u)k=4;J D(i<9t)k=5;J k=6;D(i<8)z=T 1N(m);J D(m.1k())z=T 1U(m);J z=T 1M(m);C g=T 1u(),n=3,2A=k-1,2B=(1<<k)-1;g[1]=z.2f(o);D(k>1){C 3C=Q();z.1y(g[1],3C);L(n<=2B){g[n]=Q();z.1T(3C,g[n-2],g[n]);n+=2}}C j=e.t-1,w,3B=1D,1a=Q(),t;i=2C(e[j])-1;L(j>=0){D(i>=2A)w=(e[j]>>(i-2A))&2B;J{w=(e[j]&((1<<(i+1))-1))<<(2A-i);D(j>0)w|=e[j-1]>>(o.O+i-2A)}n=k;L((w&1)==0){w>>=1;--n}D((i-=n)<0){i+=o.O;--j}D(3B){g[w].1H(r);3B=1n}J{L(n>1){z.1y(r,1a);z.1y(1a,r);n-=2}D(n>0)z.1y(r,1a);J{t=r;r=1a;1a=t}z.1T(1a,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1y(r,1a);t=r;r=1a;1a=t;D(--i<0){i=o.O-1;--j}}}F z.2e(r)}E 4L(a){C x=(o.s<0)?o.2z():o.2x();C y=(a.s<0)?a.2z():a.2x();D(x.1c(y)<0){C t=x;x=y;y=t}C i=x.27(),g=y.27();D(g<0)F x;D(i<g)g=i;D(g>0){x.1h(g,x);y.1h(g,y)}L(x.1E()>0){D((i=x.27())>0)x.1h(i,x);D((i=y.27())>0)y.1h(i,y);D(x.1c(y)>=0){x.U(y,x);x.1h(1,x)}J{y.U(x,y);y.1h(1,y)}}D(g>0)y.2d(g,y);F y}E 5p(n){D(n<=0)F 0;C d=o.1l%n,r=(o.s<0)?n-1:0;D(o.t>0)D(d==0)r=o[0]%n;J P(C i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 4N(m){C ac=m.1k();D((o.1k()&&ac)||m.1E()==0)F G.1t;C u=m.2x(),v=o.2x();C a=1G(1),b=1G(0),c=1G(0),d=1G(1);L(u.1E()!=0){L(u.1k()){u.1h(1,u);D(ac){D(!a.1k()||!b.1k()){a.2y(o,a);b.U(m,b)}a.1h(1,a)}J D(!b.1k())b.U(m,b);b.1h(1,b)}L(v.1k()){v.1h(1,v);D(ac){D(!c.1k()||!d.1k()){c.2y(o,c);d.U(m,d)}c.1h(1,c)}J D(!d.1k())d.U(m,d);d.1h(1,d)}D(u.1c(v)>=0){u.U(v,u);D(ac)a.U(c,a);b.U(d,b)}J{v.U(u,v);D(ac)c.U(a,c);d.U(b,d)}}D(v.1c(G.1s)!=0)F G.1t;D(d.1c(m)>=0)F d.2V(m);D(d.1E()<0)d.2y(m,d);J F d;D(d.1E()<0)F d.3p(m);J F d}C 1j=[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,9s,9r,9q,9p,9o,5I,9n,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V,8U,8T,8S,8R,8Q,8P,8O,8N,8M,8L,8K,8J,8I,8H,8G,8F,8E,8D,8C,8B,8A,8z,8y,8x,8w,8v,8u,8t,8s,8r,8q,8p,8o,8n,8m,8l,8k,8j];C 5H=(1<<26)/1j[1j.V-1];E 4J(t){C i,x=o.1F();D(x.t==1&&x[0]<=1j[1j.V-1]){P(i=0;i<1j.V;++i)D(x[0]==1j[i])F 1D;F 1n}D(x.1k())F 1n;i=1;L(i<1j.V){C m=1j[i],j=i+1;L(j<1j.V&&m<5H)m*=1j[j++];m=x.5q(m);L(i<j)D(m%1j[i++]==0)F 1n}F x.5o(t)}E 5n(t){C 2b=o.2V(G.1s);C k=2b.27();D(k<=0)F 1n;C r=2b.56(k);t=(t+1)>>1;D(t>1j.V)t=1j.V;C a=Q();P(C i=0;i<t;++i){a.2c(1j[i]);C y=a.2u(r,o);D(y.1c(G.1s)!=0&&y.1c(2b)!=0){C j=1;L(j++<k&&y.1c(2b)!=0){y=y.5G(2,o);D(y.1c(G.1s)==0)F 1n}D(y.1c(2b)!=0)F 1n}}F 1D}G.H.3A=5F;G.H.5E=5D;G.H.5C=5B;G.H.3z=5A;G.H.1S=5z;G.H.2Y=5y;G.H.2y=5x;G.H.3y=5w;G.H.2a=5v;G.H.5u=5t;G.H.5s=5r;G.H.5q=5p;G.H.5o=5n;G.H.2x=5m;G.H.3x=5l;G.H.8i=5k;G.H.8h=5j;G.H.1E=5i;G.H.8g=5h;G.H.8f=5g;G.H.1K=5f;G.H.3w=5e;G.H.8e=5d;G.H.8d=5c;G.H.8c=5b;G.H.8b=5a;G.H.2P=58;G.H.2X=57;G.H.56=55;G.H.27=54;G.H.8a=51;G.H.50=4Z;G.H.88=4Y;G.H.87=4X;G.H.86=4W;G.H.3p=4V;G.H.2V=4U;G.H.3o=4T;G.H.4S=4R;G.H.85=4Q;G.H.84=4P;G.H.2u=4O;G.H.82=4N;G.H.2w=4M;G.H.81=4L;G.H.4K=4J;E 49(4E,4D,4F,4G){C 4I="80";C N=T G(4I,16);C g=T G("2");C k=T G("7Z",16);C 4H=T 3v();C a=T G(32,4H);C A=g.2u(a,N);C 3r=A.1x(16);C B=Y;C 3q=Y;C u=Y;C x=Y;C S=Y;C K=Y;C M=Y;C 3m=Y;C 2U=4G;C 4C=4F;C 1i=o;C 2O=1n;C 7Y=1n;C I=4E;C p=4D;C 1b=Y;o.7X=E(){F I};o.7W=E(){F 1b};o.7V=E(){F 2U};o.7U=E(){F g};o.7T=E(){F N};o.7S=E(s){F T G(1C(s+1C(I+":"+p)),16)};E 2t(1L){D(4C=="7R"){F 1L}};o.2t=2t;o.3n=E(4x,1R,4y){D(2v.4B)1b=T 4B();J D(2v.4A){7Q{1b=T 4A("4z.7P")}7O(e){}}J{1i.21("4v 2P 7N.");F}D(1b){1b.7M=4y;1b.7L("7K",4x,1D);1b.3u("4w-4f","7J/x-7I-7H-7G");1b.3u("4w-V",1R.V);1b.3u("7F","7E");1b.7D(1R)}J{1i.21("4v 7C.")}};o.3l=E(4u){F 4u.7B.7A};E 3j(4t){F(2W(2v[4t])!="7z")};o.4q=E(){C 4s=2U+2t("7y/");C 1R="I="+I+"&A="+3r;1i.3n(4s,1R,4r)};E 4r(){D(1b.4i==4&&1b.4h==4g){D(1b.1Q.1w("r").V>0){C 3t=1b.1Q.1w("r")[0];4p(3t.3h("s"),3t.3h("B"))}J D(1b.1Q.1w("3k").V>0){1i.4q()}}};E 4p(s,3s){B=T G(3s,16);3q=3s;u=T G(1C(3r+3q),16);x=T G(1C(s+1C(I+":"+p)),16);C 4o=k.3o(g.2u(x,N));C 4n=a.3p(u.3o(x));S=B.2V(4o).2u(4n,N);C 4m=A.1x(16)+B.1x(16)+S.1x(16);M=1C(4m);3m=1C(A.1x(16)+M+S.1x(16));4l(M);};E 4l(M){C 1R="M="+M;C 4k=2U+2t("7x/");1i.3n(4k,1R,4j)};E 4j(){D(1b.4i==4&&1b.4h==4g){D(1b.1Q.1w("M").V>0){D(1i.3l(1b.1Q.1w("M")[0])==3m){1i.4b();2O=1D}J 1i.21("7w 2r 7v 2P 7u")}J D(1b.1Q.1w("3k").V>0){1i.21(1i.3l(1b.1Q.1w("3k")[0]))}}};E 2S(4e){C 2T=2N.7t(\'3i\');2T.4f=\'7s/7r\';2T.45=4e;2N.1w(\'7q\')[0].7p(2T)};E 7o(){D(1i.3j("4c")&&1i.3j("4d"))F;C 2s=1i.46.7n("/");C 2R=2s.7m(0,2s.V-1).7l("/");D(2s[2s.V-1]=="7k.1K.2Q")2S(2R+"/7j.1K.2Q");J{2S(2R+"/4d.2Q");2S(2R+"/4c.2Q")}}o.2r=E(){D(K==Y)D(2O){K=1C(S);F K}J 1i.21("7i 7h 2P 7g 2O.");J F K};o.4b=E(){4a("7f 7e.")};o.21=E(t){4a(t)}};49.H.46=2N.1w(\'3i\')[2N.1w(\'3i\').V-1].3h("45");',62,686,'||||||||||||||||||||||||this||||||||||||||var|if|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||new|subTo|length|||null|HASH|||||||||||r2|xhr|compareTo|Math|safe_add|rng_pptr|DM|rShiftTo|that|lowprimes|isEven|DV|clamp|false|ds|sh|vv|rng_pool|ONE|ZERO|Array|reduce|getElementsByTagName|toString|sqrTo|ys|bs|255|SHA256|true|signum|abs|nbv|copyTo|divRemTo|dbits|min|str|Montgomery|Classic|256|utftext|responseXML|params|bitwiseTo|mulTo|Barrett|op|floor|mi|pm|charCodeAt|rr|error_message||||||getLowestSetBit|||dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|key|arr|paths|modPow|window|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|charAt|0x7fff|bm|BI_RC|rng_state|document|authenticated|not|js|path|import_file|scriptElt|url|subtract|typeof|shiftLeft|changeBit|op_or||||0xffff|fromString|qd|||y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|getAttribute|script|isdefined|error|innerxml|M2|ajaxRequest|multiply|add|Bstr|Astr|ephemeral|response|setRequestHeader|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|mod|exp|nNop|op_xor|op_andnot|0xf|intAt|mpl|mp|ts|F2|yt|F1|int2char|appName|j_lm|0x3fff|ba|rng_seed_time|hex_tab|bin|T2||0xFFFF||lsw|src|srpPath|||SRP|alert|success|SHA1|MD5|fname|type|200|status|readyState|confirm_authentication|auth_url|send_hash|Mstr|aux|kgx|calculations|identify|receive_salts|handshake_url|variable|node|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|server|password|username|ser|base_url|rng|Nstr|bnIsProbablePrime|isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow|bnDivideAndRemainder|bnRemainder|bnDivide|divide|bnMultiply|bnSubtract|bnAdd|bnFlipBit|bnClearBit|bnSetBit|bnTestBit|testBit|bnBitCount|||bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot||bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix|toRadix|bnpChunkSize|modPowInt|lplim|127|barrettSqrTo|barrettMulTo|barrettReduce|barrettRevert|barrettConvert|mu|nSqrTo|nMulTo|cbit|lbit|op_and|nextBytes|number|continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo||bnAbs|||bnNegate|bnToString||bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1|FV|BI_RM|am3|am1|Netscape|am2|0x3fffffff|canary|rng_get_bytes|rng_get_byte|next|init|prng_newstate|random|crypto|rng_seed_int|ARC4next|ARC4init|str2binb|core_sha256|binb2hex|Utf8Encode||0xF||hexcase|mask|Maj|Sigma0256|Ch||Sigma1256|Gamma0256|Gamma1256|msw|successful|Authentication|been|has|User|hash|srp|join|slice|split|import_hashes|appendChild|head|javascript|text|createElement|match|does|Server|authenticate|handshake|undefined|nodeValue|firstChild|failed|send|close|Connection|urlencoded|form|www|application|POST|open|onreadystatechange|supported|catch|XMLHTTP|try|django|calcX|getN|getg|geturl|getxhr|getI|hash_import|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse||divideAndRemainder|remainder|flipBit|clearBit|setBit||bitCount|andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443|439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311|307|293|283|281|277|271|269|263|257|251|241|239|233|229|227|223||211|199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz|Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536|appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|replace|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F|0xA54FF53A|0x3C6EF372|0xBB67AE85|0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208|0x84C87814|0x78A5636F|0x748F82EE|0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3||0x34B0BCB5|0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3||0xC24B8B70|0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967|0x6CA6351|0xD5A79147|0xC6E00BF3|0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA|0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1|0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE|0x12835B01|0xD807AA98|0xAB1C5ED5|0x923F82A4|0x59F111F1|0x3956C25B|0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
diff --git a/javascript/jsPacker/srp_register.min.js b/javascript/jsPacker/srp_register.min.js
new file mode 100644
index 0000000..6c5a1d5
--- /dev/null
+++ b/javascript/jsPacker/srp_register.min.js
@@ -0,0 +1 @@
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 g(){3 1;b.a.e=9(){1=5;3 w=5.p()+5.o("e/f/");3 c="I="+5.K();5.n(w,c,5.u)};b.a.u=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("f").d>0){3 s=1.t(2.7.6("f")[0]);3 x=1.J(s);3 v=1.H().G(x,1.F());1.q(v.E(D))}C 8(2.7.6("r").d>0){1.B(1.t(2.7.6("r")[0]))}}};b.a.q=9(v){3 c="v="+v;3 m=1.p()+1.o("e/A/");1.n(m,c,1.l)};b.a.l=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("z").d>0){1.y()}}}};g();',47,47,'|that|xhr|var||this|getElementsByTagName|responseXML|if|function|prototype|SRP|params|length|register|salt|SRP_REGISTER|200|status|readyState|getxhr|register_user|auth_url|ajaxRequest|paths|geturl|register_send_verifier|error||innerxml|register_receive_salt||handshake_url||identify|ok|user|error_message|else|16|toString|getN|modPow|getg||calcX|getI'.split('|'),0,{}))
diff --git a/javascript/srp.js b/javascript/srp.js
index d0e9914..cd05a5e 100644
--- a/javascript/srp.js
+++ b/javascript/srp.js
@@ -11,21 +11,46 @@ function SRP(username, password, ser, base_url)
var Astr = A.toString(16);
var B = null;
var Bstr = null;
- var I = username;
var u = null;
- var p = password;
var x = null;
var S = null;
var K = null;
var M = null;
var M2 = null;
- var xhr = null;
var url = base_url;
var server = ser;
var that = this;
var authenticated = false;
var hash_import = false;
-
+ var I = username;
+ var p = password;
+ var xhr = null;
+
+ this.getI = function()
+ {
+ return I;
+ };
+ this.getxhr = function()
+ {
+ return xhr;
+ };
+ this.geturl = function()
+ {
+ return url;
+ };
+ this.getg = function()
+ {
+ return g;
+ };
+ this.getN = function()
+ {
+ return N;
+ };
+ this.calcX = function(s)
+ {
+ return new BigInteger(SHA256(s + SHA256(I + ":" + p)), 16);
+ };
+
function paths(str)
{
// For now, str will be the django path
@@ -35,9 +60,10 @@ function SRP(username, password, ser, base_url)
return str;
}
};
+ this.paths = paths;
// Perform ajax requests at the specified url, with the specified parameters
// Calling back the specified function.
- function ajaxRequest(full_url, params, callback)
+ this.ajaxRequest = function(full_url, params, callback)
{
if( window.XMLHttpRequest)
xhr = new XMLHttpRequest();
@@ -66,7 +92,7 @@ function SRP(username, password, ser, base_url)
};
// Get the text content of an XML node
- function innerxml (node)
+ this.innerxml = function(node)
{
return node.firstChild.nodeValue;
};
@@ -75,57 +101,13 @@ function SRP(username, password, ser, base_url)
function isdefined ( variable)
{
return (typeof(window[variable]) != "undefined");
- };
-
- // Initiate the registration process
- this.register = function()
- {
- var handshake_url = url + paths("register/salt/");
- var params = "I="+I;
- ajaxRequest(handshake_url, params, register_receive_salt);
- };
-
- // Receive the salt for registration
- function register_receive_salt()
- {
- if(xhr.readyState == 4 && xhr.status == 200) {
- if(xhr.responseXML.getElementsByTagName("salt").length > 0)
- {
- var s = innerxml(xhr.responseXML.getElementsByTagName("salt")[0]);
- x = new BigInteger(SHA256(s + SHA256(I + ":" + p)), 16);
- var v = g.modPow(x, N);
- register_send_verifier(v.toString(16));
- }
- else if(xhr.responseXML.getElementsByTagName("error").length > 0)
- {
- that.error_message(innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
- }
- }
- };
- // Send the verifier to the server
- function register_send_verifier(v)
- {
- var params = "v="+v;
- var auth_url = url + paths("register/user/");
- ajaxRequest(auth_url, params, register_user);
- };
- // The user has been registered successfully, now login
- function register_user()
- {
- if(xhr.readyState == 4 && xhr.status == 200) {
- if(xhr.responseXML.getElementsByTagName("ok").length > 0)
- {
- that.identify();
- }
- }
- };
-
+ };
// Start the login process by identifying the user
this.identify = function()
{
var handshake_url = url + paths("handshake/");
var params = "I="+I+"&A="+Astr;
- ajaxRequest(handshake_url, params, receive_salts);
+ that.ajaxRequest(handshake_url, params, receive_salts);
};
// Receive login salts from the server, start calculations
@@ -173,7 +155,7 @@ function SRP(username, password, ser, base_url)
{
var params = "M="+M;
var auth_url = url+paths("authenticate/");
- ajaxRequest(auth_url, params, confirm_authentication);
+ that.ajaxRequest(auth_url, params, confirm_authentication);
};
// Receive M2 from the server and verify it
function confirm_authentication()
@@ -181,7 +163,7 @@ function SRP(username, password, ser, base_url)
if(xhr.readyState == 4 && xhr.status == 200) {
if(xhr.responseXML.getElementsByTagName("M").length > 0)
{
- if(innerxml(xhr.responseXML.getElementsByTagName("M")[0]) == M2)
+ if(that.innerxml(xhr.responseXML.getElementsByTagName("M")[0]) == M2)
{
that.success();
authenticated = true;
@@ -191,10 +173,18 @@ function SRP(username, password, ser, base_url)
}
else if (xhr.responseXML.getElementsByTagName("error").length > 0)
{
- that.error_message(innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
+ that.error_message(that.innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
}
}
};
+ function import_file(fname)
+ {
+ var scriptElt = document.createElement('script');
+ scriptElt.type = 'text/javascript';
+ scriptElt.src = fname;
+ document.getElementsByTagName('head')[0].appendChild(scriptElt);
+
+ };
// If we need SHA1 or MD5, we need to load the javascript files
function import_hashes()
{
@@ -205,25 +195,13 @@ function SRP(username, password, ser, base_url)
var path = arr.slice(0, arr.length-1).join("/");
// If this file is called srp.min.js, we will load the packed hash file
if(arr[arr.length-1] == "srp.min.js")
- {
- var scriptElt = document.createElement('script');
- scriptElt.type = 'text/javascript';
- scriptElt.src = path+"/hash.min.js";
- document.getElementsByTagName('head')[0].appendChild(scriptElt);
- }
+ import_file(path+"/hash.min.js");
// Otherwise, this file is presumably srp.js, and we will load individual hash files
else
{
- var scriptElt = document.createElement('script');
- scriptElt.type = 'text/javascript';
- scriptElt.src = path +"/MD5.js";
- document.getElementsByTagName('head')[0].appendChild(scriptElt);
- scriptElt = document.createElement('script');
- scriptElt.type = 'text/javascript';
- scriptElt.src = path +"/SHA1.js";
- document.getElementsByTagName('head')[0].appendChild(scriptElt);
- }
-
+ import_file(path+"/MD5.js");
+ import_file(path+"/SHA1.js");
+ }
}
// If someone wants to use the session key for encrypting traffic, they can
// access the key with this function.
diff --git a/javascript/srp_register.js b/javascript/srp_register.js
new file mode 100644
index 0000000..31b8ab8
--- /dev/null
+++ b/javascript/srp_register.js
@@ -0,0 +1,52 @@
+function SRP_REGISTER()
+{
+ var that;
+
+ // Initiate the registration process
+ SRP.prototype.register = function()
+ {
+ that = this;
+ var handshake_url = this.geturl() + this.paths("register/salt/");
+ var params = "I="+this.getI();
+ this.ajaxRequest(handshake_url, params, this.register_receive_salt);
+ };
+
+ // Receive the salt for registration
+ SRP.prototype.register_receive_salt = function()
+ {
+ var xhr = that.getxhr();
+ if(xhr.readyState == 4 && xhr.status == 200) {
+ if(xhr.responseXML.getElementsByTagName("salt").length > 0)
+ {
+ var s = that.innerxml(xhr.responseXML.getElementsByTagName("salt")[0]);
+ var x = that.calcX(s);
+ var v = that.getg().modPow(x, that.getN());
+ that.register_send_verifier(v.toString(16));
+ }
+ else if(xhr.responseXML.getElementsByTagName("error").length > 0)
+ {
+ that.error_message(that.innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
+ }
+ }
+ };
+ // Send the verifier to the server
+ SRP.prototype.register_send_verifier = function(v)
+ {
+ var params = "v="+v;
+ var auth_url = that.geturl() + that.paths("register/user/");
+ that.ajaxRequest(auth_url, params, that.register_user);
+ };
+
+ // The user has been registered successfully, now login
+ SRP.prototype.register_user = function()
+ {
+ var xhr = that.getxhr();
+ if(xhr.readyState == 4 && xhr.status == 200) {
+ if(xhr.responseXML.getElementsByTagName("ok").length > 0)
+ {
+ that.identify();
+ }
+ }
+ };
+};
+SRP_REGISTER();