Closed Bug 452008 Opened 17 years ago Closed 17 years ago

TM: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled.

Categories

(Core :: JavaScript Engine, defect, P1)

x86
All
defect

Tracking

()

RESOLVED FIXED
mozilla1.9.1b1

People

(Reporter: mrfabbri, Assigned: sayrer)

References

()

Details

(Keywords: regression, testcase)

Attachments

(2 files)

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/20080823021533 Minefield/3.1a2pre Build Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/20080823021533 Minefield/3.1a2pre When the JIT (javascript.options.jit.content) is on, the authentication process on Clipperz.com (SRP) fails, also the card decryption process fails if yet, with JIT off, logged in (ERROR: Error while decrypting data), also 5 test cases of the SRP test suite ( http://clipperzlib.svn.sourceforge.net/viewvc/clipperzlib/trunk/javascript.crypto.library/tests/js/tests/Clipperz/Crypto/SRP.html?revision=2 ) in Clipperz crypto library fail ( http://sourceforge.net/projects/clipperzlib ). From running the test suite with firebug on, (the outer for-loop, line1379-1397, in) Montgomery Multiplication in BigInt.js ( http://clipperzlib.svn.sourceforge.net/viewvc/clipperzlib/trunk/javascript.crypto.library/src/js/Clipperz/Crypto/BigInt.js?revision=2&view=markup ) misbehaves when JIT is on. Reproducible: Always Steps to Reproduce: 1. Enable JIT (javascript.options.jit.content) via about:config 2. Try login on https://www.clipperz.com/beta Actual Results: Login Failed Expected Results: Login Successful javascript.options.jit.content;true
OS: Linux → All
Version: unspecified → Trunk
Montgomery moltiplication in BigInt.js makes heavy use of a global variable sa lines 202-214 in BigInt.js //the following global variables are scratchpad memory to //reduce dynamic memory allocation in the inner loop t=new Array(0); ss=t; //used in mult_() s0=t; //used in multMod_(), squareMod_() s1=t; //used in powMod_(), multMod_(), squareMod_() s2=t; //used in powMod_(), multMod_() s3=t; //used in powMod_() s4=t; s5=t; //used in mod_() s6=t; //used in bigInt2str() s7=t; //used in powMod_() T=t; //used in GCD_() sa=t; //used in mont_() Upon setting a breakpoint inside the loop in mont_() in BigInt.js (e.g. on line 1380) mont_() works fine; once the breakpoint is disabled/removed and the loop lines1379-1397) gets executed for a few (n > 10, n can be possibly smaller, didn't try yet) times in a row the value stored in sa gets wrong. Number of calls, when running SRP test suit, for a few functions differs significantly with JIT ON/OFF (e.g. mont_() 1968/2313 ON/OFF) see http://spreadsheets.google.com/ccc?key=pHnHcZ1gltyRLpiyscveMXA&hl=en .
For completeness' sake the code for Montgomery Multiplication is: lines 1354-1413 //do x=x*y*Ri mod n for bigInts x,y,n, // where Ri = 2**(-kn*bpe) mod n, and kn is the // number of elements in the n array, not // counting leading zeros. //x must be large enough to hold the answer. //It's OK if x and y are the same variable. //must have: // x,y < n // n is odd // np = -(n^(-1)) mod radix function mont_(x,y,n,np) { var i,j,c,ui,t; var kn=n.length; var ky=y.length; if (sa.length!=kn) sa=new Array(kn); for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n //this function sometimes gives wrong answers when the next line is uncommented //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y copyInt_(sa,0); //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys for (i=0; i<kn; i++) { t=sa[0]+x[i]*y[0]; ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE c=(t+ui*n[0]) >> bpe; t=x[i]; //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe for (j=1;j<ky;j++) { c+=sa[j]+t*y[j]+ui*n[j]; sa[j-1]=c & mask; c>>=bpe; } for (;j<kn;j++) { c+=sa[j]+ui*n[j]; sa[j-1]=c & mask; c>>=bpe; } sa[j-1]=c & mask; } if (!greater(n,sa)) sub_(sa,n); copy_(x,sa); }
Component: General → Virtual Machine
OS: All → Linux
Product: Firefox → Tamarin
QA Contact: general → vm
Version: Trunk → unspecified
The bug still bites on today's builds (linux and windows): numbers (the same on all platforms) got different from yesterday's build. builds tested: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/20080825020949 Minefield/3.1a2pre Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1a2pre) Gecko/20080824031931 Minefield/3.1a2pre
OS: Linux → All
This test case (that is the same of the html version) doesn't fail when run through the js console, also when the JIT is enabled (-j).
Produced a more confined test case ( https://bugzilla.mozilla.org/attachment.cgi?id=335401 and - js only for js console - https://bugzilla.mozilla.org/attachment.cgi?id=335402 ) involving only Montgomery Multiplication. The test case fails only when executed inside the browser. On the console runs fine and gets also optimized, about 4x performance boost-up with JIT enabled.
Assignee: nobody → general
Status: UNCONFIRMED → NEW
Component: Virtual Machine → JavaScript Engine
Ever confirmed: true
Product: Tamarin → Core
QA Contact: vm → general
Summary: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled. → TM: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled.
Keywords: regression
The expected numbers in these tests look wrong to me. I checked this in a number of JS impls, and their results all match our JIT.
Assignee: general → sayrer
Priority: -- → P1
Target Milestone: --- → mozilla1.9.1b1
This is fixed now, and I added a test for it: http://hg.mozilla.org/tracemonkey/rev/472d905980df
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → FIXED
Keywords: testcase
/cvsroot/mozilla/js/tests/js1_5/Regress/regress-452008.js,v <-- regress-452008.js initial revision: 1.1 http://hg.mozilla.org/mozilla-central/rev/f0e9fd501e63
Flags: in-testsuite+
Flags: in-litmus-
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: