Global's BigA has a 256-bit q, and 2048-bit p and g. It was generated
using DSAGroupGenerator, which is an adapted version of FIPS-186-2, which
I produced after extensive consultation with Scott. The seed is included
so it can be regenerated.

On Mon, Sep 25, 2006 at 12:53:31PM +0100, toad wrote:
> On Sun, Sep 24, 2006 at 01:03:18AM +0000, nextgens at freenetproject.org 
> wrote:
> > Author: nextgens
> > Date: 2006-09-24 01:02:49 +0000 (Sun, 24 Sep 2006)
> > New Revision: 10505
> > 
> > Modified:
> >    trunk/freenet/src/freenet/crypt/DSA.java
> >    trunk/freenet/src/freenet/crypt/DSAGroup.java
> > Log:
> > Fix some crypto code: 
> >     1) we were generating the "h" parameter of the group with only a few 
> > bytes
> 
> Eh? h is the number of bits of another parameter; it's supposed to be short!
> Hmmm, having said that, our Q length needs to be the same as our hash
> length, i.e. 256. Which code did we actually use for group generation?
> I'm reasonably sure I generated a group with 2048/256...
> 
> Having to change group would be rather destructive, please could you
> give a detailed justification?
> 
> >     2) we weren't verifying DSA signatures as we ought to
> > 
> > TODO: what about following FIPS-186-3 insteed of the first version ?
> 
> I don't think it was available at the time of implementation.
> > 
> > Of course it needs to be carefully reviewed... and hasn't been tested ;p
> > 
> > Modified: trunk/freenet/src/freenet/crypt/DSA.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/crypt/DSA.java        2006-09-23 22:47:03 UTC 
> > (rev 10504)
> > +++ trunk/freenet/src/freenet/crypt/DSA.java        2006-09-24 01:02:49 UTC 
> > (rev 10505)
> > @@ -14,23 +14,20 @@
> >       * Returns a DSA signature given a group, private key (x), a random 
> > nonce
> >       * (k), and the hash of the message (m).
> >       */
> > -    public static DSASignature sign(DSAGroup g,
> > -                               DSAPrivateKey x,
> > -                               BigInteger k, 
> > -                               BigInteger m) {
> > +   public static DSASignature sign(DSAGroup g,
> > +                   DSAPrivateKey x,
> > +                   BigInteger k, 
> > +                   BigInteger m) {
> >             BigInteger r=g.getG().modPow(k, g.getP()).mod(g.getQ());
> > -           
> > +
> >             BigInteger kInv=k.modInverse(g.getQ());
> >             return sign(g, x, r, kInv, m);
> > -    } 
> > -   
> > -    public static DSASignature sign(DSAGroup g, DSAPrivateKey x, 
> > BigInteger m,
> > -                               Random r) {
> > -   BigInteger k;
> > -   do {
> > -       k=new NativeBigInteger(256, r);
> > -   } while ((k.compareTo(g.getQ())>-1) || 
> > (k.compareTo(BigInteger.ZERO)==0));
> > -   return sign(g, x, k, m);
> > +   } 
> > +
> > +   public static DSASignature sign(DSAGroup g, DSAPrivateKey x, BigInteger 
> > m,
> > +                   Random r) {
> > +           BigInteger k = DSA.generateK(g, r);
> > +           return sign(g, x, k, m);
> >      }
> >  
> >      /**
> > @@ -41,10 +38,7 @@
> >             BigInteger[][] result=new BigInteger[count][2];
> >             
> >             for (int i=0; i<count; i++) {
> > -                   BigInteger k;
> > -                   do {
> > -                           k=new NativeBigInteger(160, r);
> > -                   } while ((k.compareTo(g.getQ())>-1) || 
> > (k.compareTo(BigInteger.ZERO)==0));
> > +                   BigInteger k = DSA.generateK(g, r);
> >                     
> >                     result[i][0] = g.getG().modPow(k, g.getP()); // r 
> >                     result[i][1] = k.modInverse(g.getQ()); // k^-1 
> > @@ -60,10 +54,20 @@
> >      public static DSASignature sign(DSAGroup g, DSAPrivateKey x,
> >                                 BigInteger r, BigInteger kInv, 
> >                                 BigInteger m) {
> > -   BigInteger s1=m.add(x.getX().multiply(r)).mod(g.getQ());
> > -   BigInteger s=kInv.multiply(s1).mod(g.getQ());
> > -   return new DSASignature(r,s);
> > +           BigInteger s1=m.add(x.getX().multiply(r)).mod(g.getQ());
> > +           BigInteger s=kInv.multiply(s1).mod(g.getQ());
> > +           // FIXME: the following case would involve recomputing the sig. 
> > with a different k 
> > +           if((r.compareTo(BigInteger.ZERO) == 0) || 
> > (s.compareTo(BigInteger.ZERO) == 0)) throw new 
> > NullPointerException("Something is wrong there!");
> > +           return new DSASignature(r,s);
> >      }
> > +    
> > +    private static BigInteger generateK(DSAGroup g, Random r){
> > +           BigInteger k;
> > +           do {
> > +                   k=new NativeBigInteger(DSAGroup.Q_BIT_LENGTH, r);
> > +           } while ((g.getQ().compareTo(k) < 1) || 
> > (k.compareTo(BigInteger.ZERO) == 0));
> > +           return k;
> > +    }
> >  
> >      /**
> >       * Verifies the message authenticity given a group, the public key
> > @@ -73,7 +77,12 @@
> >                              DSASignature sig,
> >                              BigInteger m) {
> >     try {
> > -       BigInteger w=sig.getS().modInverse(kp.getQ());
> > +           // 0<r<q has to be true
> > +           if((sig.getR().compareTo(BigInteger.ZERO) < 1) || 
> > (kp.getQ().compareTo(sig.getR()) < 1)) return false;
> > +           // 0<s<q has to be true as well
> > +           if((sig.getS().compareTo(BigInteger.ZERO) < 1) || 
> > (kp.getQ().compareTo(sig.getS()) < 1)) return false;
> > +           
> > +           BigInteger w=sig.getS().modInverse(kp.getQ());
> >         BigInteger u1=m.multiply(w).mod(kp.getQ());
> >         BigInteger u2=sig.getR().multiply(w).mod(kp.getQ());
> >         BigInteger v1=kp.getG().modPow(u1, kp.getP());
> > @@ -81,7 +90,6 @@
> >         BigInteger v=v1.multiply(v2).mod(kp.getP()).mod(kp.getQ());
> >         return v.equals(sig.getR());
> >  
> > -
> >         //FIXME: is there a better way to handle this exception raised on 
> > the 'w=' line above?
> >     } catch (ArithmeticException e) {  // catch error raised by invalid data
> >         return false;                  // and report that that data is bad.
> > 
> > Modified: trunk/freenet/src/freenet/crypt/DSAGroup.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/crypt/DSAGroup.java   2006-09-23 22:47:03 UTC 
> > (rev 10504)
> > +++ trunk/freenet/src/freenet/crypt/DSAGroup.java   2006-09-24 01:02:49 UTC 
> > (rev 10505)
> > @@ -21,6 +21,8 @@
> >   */
> >  public class DSAGroup extends CryptoKey {
> >     private static final long serialVersionUID = -1;
> > +   
> > +   public static final int Q_BIT_LENGTH = 160;
> >  
> >      private BigInteger p, q, g;
> >  
> > @@ -171,7 +173,7 @@
> >  
> >          public void run() {
> >              while (true) {
> > -                qs.addElement(makePrime(160, 80, r));
> > +                qs.addElement(makePrime(DSAGroup.Q_BIT_LENGTH, 80, r));
> >                  synchronized (this) {
> >                      notifyAll();
> >                  }
> > @@ -239,7 +241,7 @@
> >                      qg.notify();
> >                  }
> >              } else
> > -                q = makePrime(160, 80, r);
> > +                q = makePrime(DSAGroup.Q_BIT_LENGTH, 80, r);
> >  
> >              BigInteger X = new BigInteger(bits, r).setBit(bits - 1);
> >  
> > @@ -252,7 +254,7 @@
> >          BigInteger h;
> >          do {
> >              if ((cc++) % 5 == 0) System.err.print("+");
> > -            h = new NativeBigInteger(160, r);
> > +            h = new NativeBigInteger(bits, r);
> >              g = h.modPow(pmin1.divide(q), p);
> >          } while ((h.compareTo(p.subtract(BigInteger.ONE)) != -1)
> >                  || (h.compareTo(BigInteger.ONE) < 1)
> > @@ -267,8 +269,9 @@
> >          q = grp.getQ();
> >          g = grp.getG();
> >          BigInteger pmin1 = p.subtract(BigInteger.ONE);
> > +        // TODO: that's FIPS-186-1, we should consider implementing 3 
> > insteed!
> >          boolean rv = !((p.bitLength() > 1024) || (p.bitLength() < 512))
> > -                && ((p.bitLength() % 64) == 0) && (q.bitLength() == 160)
> > +                && ((p.bitLength() % 64) == 0) && (q.bitLength() == 
> > DSAGroup.Q_BIT_LENGTH)
> >                  && (q.compareTo(p) == -1) && isPrime(p, 80) && isPrime(q, 
> > 80)
> >                  && pmin1.mod(q).equals(BigInteger.ZERO)
> >                  && (g.compareTo(BigInteger.ONE) == 1)
> > 



> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
-------------- 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/20060925/1cec0749/attachment.pgp>

Reply via email to