On Tue, Apr 03, 2007 at 09:20:36PM +0200, Sback wrote:
> Hi,
>  working on a class test for DSA.java, as needed for my Google Summer of
> Code ranking, I have found two more bugs [another one is already fixed,
> after nextgens gave me the repos access] in the current DSA implementation.
> It is unlikely that they compare during the normal usage, but since
> there are no raised exceptions, I believe they must be fixed.
> 
> The first bug is generated by this code [part of DSATest.java, not yet
> committed]:
> 
> public void testSign_border() {
>        
>         BigInteger k = BigInteger.ONE;
>         BigInteger q = Global.DSAgroupBigA.getQ().add(BigInteger.ONE);
>         BigInteger p = q;
>         BigInteger g = p.add(BigInteger.ONE);
>        
>         DSAGroup aDSAgroup = new DSAGroup(p,q,g);
>        
>         DSAPrivateKey aDSAPrivKey=new DSAPrivateKey(aDSAgroup,randomSource);
>         DSAPublicKey aDSAPubKey=new DSAPublicKey(aDSAgroup,aDSAPrivKey);
>     DSASignature aSignature=
>                
> DSA.sign(aDSAgroup,aDSAPrivKey,k,aDSAPrivKey.getX(),randomSource);
>        
>        
> assertTrue(DSA.verify(aDSAPubKey,aSignature,aDSAPrivKey.getX(),false));
>     }
> 
> As there are only few controls over parameters when creating a
> DSAPrivateKey and a DSAPublicKey,
> I've been able to generate a weird key pair that behaves not correctly
> over the DSA.sign method.
> I decided to use values that will create a R value [of the generated
> signature] of 1.
> R = (g^k mod p) mod q
> [ k = 1, q = aPrimeNumber+1, p = q, g = p+1 ]
> In this way the verify of the signature return FALSE, even if parameters
> are correct.
> It depends on the fact that DSA.verify, instead of raising an exception
> over bad parameters,
> catches it and return false. What is more, when using BigInteger.ZERO as
> hased message,
> it returns true correctly; but not with BigInteger.TEN... even more
> uncertain

Shouldn't this be caught in signing? It's not much use catching it on
verification: If it won't verify, it's not a valid signature.
> 
> The second bug is generated througth this method [in the same test class]:
> 
> public void testSign_border2() {
>        
>         BigInteger q = BigInteger.ONE;
>        
>         DSAGroup aDSAgroup = new DSAGroup(
>                 Global.DSAgroupBigA.getP(),q,Global.DSAgroupBigA.getG());
>        
>         DSAPrivateKey aDSAPrivKey=new DSAPrivateKey(aDSAgroup,randomSource);
> 
>        //not bug correlated part------------------------------------------
>         DSAPublicKey aDSAPubKey=new DSAPublicKey(aDSAgroup,aDSAPrivKey);
>     DSASignature aSignature=
>                
> DSA.sign(aDSAgroup,aDSAPrivKey,aDSAPrivKey.getX(),randomSource);
>        
>        
> assertTrue(DSA.verify(aDSAPubKey,aSignature,aDSAPrivKey.getX(),false));
>         //not bug correlated part------------------------------------------
>     }
> 
> 
> In this way the problem is on the creation of the DSAPrivateKey, because
> it remains
> stuck in one creator method of DSAPrivateKey.java:
> 
>     public DSAPrivateKey(DSAGroup g, Random r) {
>         BigInteger tempX;
>         do {
>             tempX = new NativeBigInteger(256, r);
>         } while (tempX.compareTo(g.getQ()) > -1);
>         this.x = tempX;
>     }
> 
> 
> if the Q value it is little enough [as 1 in my test, but I imagine it
> could be a problem also for other small values]
> it is almost impossible to generate a smaller X value. And it will
> remain in the loop.

Add an assertion. And maybe change the 256 to the number of bits
required (based on the group) in the new value.
> 
> 
> Both these two bugs are connected to the fact that there is no
> parameters-checking when creating
> DSA entities. In my opinion it should be enough to check them on the
> standards that freenet follows
> [that seems to be a mix between FIPS-186-2[0] and the
> not-yet-standarized FIPS-182-3[1]].
> Then, always IMHO, it could be even better to check on FIPS-186-2 and
> raise only warnings
> if they don't respect the not-yet-standardized FIPS-186-3 [because the
> most part of method works
> well with arguments valid for both the standards].

We don't exactly implement FIPS 2, because we use a 256-bit hash.
> 
> If you think it could be important to fix them and if you want I could
> prepare the parameters-checking for
> DSA entities and commit them.

By all means fix them.
> 
> Cheers,
>  Sback
> 
> [0] http://csrc.nist.gov/publications/fips/fips186-2/fips186-2-change1.pdf
> [1]
> http://csrc.nist.gov/publications/drafts/fips_186-3/Draft-FIPS-186-3%20_March2006.pdf
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20070407/9619e281/attachment.pgp>

Reply via email to