diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-05-18 15:36:07 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@gcc.gnu.org> | 2005-05-18 15:36:07 +0000 |
commit | 33a9ae4927a417391c01773efa091e748ed5c4d0 (patch) | |
tree | 0e197bb237a5e2554417cf27436269efa7545b38 /libjava/gnu/java/security/provider | |
parent | 9a6411ed3017504e23874b29150e06f9126788a5 (diff) | |
download | gcc-33a9ae4927a417391c01773efa091e748ed5c4d0.zip gcc-33a9ae4927a417391c01773efa091e748ed5c4d0.tar.gz gcc-33a9ae4927a417391c01773efa091e748ed5c4d0.tar.bz2 |
re PR libgcj/19729 (libgcj DSASignature.java null pointer exception)
2005-05-18 Thomas Fitzsimmons <fitzsim@redhat.com>
PR libgcj/19729
* gnu/java/security/provider/DSASignature.java: Import updates
from GNU Crypto.
From-SVN: r99904
Diffstat (limited to 'libjava/gnu/java/security/provider')
-rw-r--r-- | libjava/gnu/java/security/provider/DSASignature.java | 210 |
1 files changed, 99 insertions, 111 deletions
diff --git a/libjava/gnu/java/security/provider/DSASignature.java b/libjava/gnu/java/security/provider/DSASignature.java index 6ff43d5..211cdb8 100644 --- a/libjava/gnu/java/security/provider/DSASignature.java +++ b/libjava/gnu/java/security/provider/DSASignature.java @@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU @@ -51,7 +51,6 @@ import java.security.InvalidKeyException; import java.security.InvalidParameterException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; @@ -67,54 +66,49 @@ public class DSASignature extends SignatureSpi { private DSAPublicKey publicKey; private DSAPrivateKey privateKey; - private MessageDigest digest = null; + private final MessageDigest digest; + private final SecureRandom random; - public DSASignature() - {} + public DSASignature() throws NoSuchAlgorithmException + { + random = new SecureRandom(); + digest = MessageDigest.getInstance ("SHA1"); + } private void init() { - if( digest == null ) { - try { - digest = MessageDigest.getInstance( "SHA1", "GNU" ); - } catch ( NoSuchAlgorithmException nsae ) { - digest = null; - } catch ( NoSuchProviderException nspe ) { - digest = null; - } - } digest.reset(); } - public void engineInitVerify(PublicKey publicKey) + public void engineInitVerify (PublicKey publicKey) throws InvalidKeyException { - if( publicKey instanceof DSAPublicKey ) - this.publicKey = (DSAPublicKey)publicKey; + if (publicKey instanceof DSAPublicKey) + this.publicKey = (DSAPublicKey) publicKey; else throw new InvalidKeyException(); init(); } - public void engineInitSign(PrivateKey privateKey) + public void engineInitSign (PrivateKey privateKey) throws InvalidKeyException { - if( privateKey instanceof DSAPrivateKey ) - this.privateKey = (DSAPrivateKey)privateKey; + if (privateKey instanceof DSAPrivateKey) + this.privateKey = (DSAPrivateKey) privateKey; else - throw new InvalidKeyException(); + throw new InvalidKeyException ("not a DSA private key"); init(); } - public void engineInitSign(PrivateKey privateKey, - SecureRandom random) + public void engineInitSign (PrivateKey privateKey, + SecureRandom random) throws InvalidKeyException { - if( privateKey instanceof DSAPrivateKey ) - this.privateKey = (DSAPrivateKey)privateKey; + if (privateKey instanceof DSAPrivateKey) + this.privateKey = (DSAPrivateKey) privateKey; else - throw new InvalidKeyException(); + throw new InvalidKeyException ("not a DSA private key"); appRandom = random; init(); @@ -123,141 +117,135 @@ public class DSASignature extends SignatureSpi public void engineUpdate(byte b) throws SignatureException { - if( digest == null ) - throw new SignatureException(); - - digest.update( b ); + digest.update (b); } - public void engineUpdate(byte[] b, int off, int len) + public void engineUpdate (byte[] b, int off, int len) throws SignatureException { - if( digest == null ) - throw new SignatureException(); - - digest.update( b, off, len ); + digest.update (b, off, len); } - public byte[] engineSign() - throws SignatureException + public byte[] engineSign() throws SignatureException { - if( digest == null ) - throw new SignatureException(); - if( privateKey == null) - throw new SignatureException(); + if (privateKey == null) + throw new SignatureException ("not initialized for signing"); - try { + try + { + BigInteger g = privateKey.getParams().getG(); + BigInteger p = privateKey.getParams().getP(); + BigInteger q = privateKey.getParams().getQ(); - BigInteger g = privateKey.getParams().getG(); - BigInteger p = privateKey.getParams().getP(); - BigInteger q = privateKey.getParams().getQ(); + BigInteger x = privateKey.getX(); - BigInteger x = privateKey.getX(); + BigInteger k = new BigInteger (159, appRandom != null ? appRandom : random); - BigInteger k = new BigInteger( 159, (Random)appRandom ); + BigInteger r = g.modPow(k, p); + r = r.mod(q); - BigInteger r = g.modPow(k, p); - r = r.mod(q); + byte bytes[] = digest.digest(); + BigInteger sha = new BigInteger (1, bytes); - byte bytes[] = digest.digest(); - BigInteger sha = new BigInteger(1, bytes); + BigInteger s = sha.add (x.multiply (r)); + s = s.multiply (k.modInverse(q)).mod (q); - BigInteger s = sha.add( x.multiply( r ) ); - s = s.multiply( k.modInverse(q) ).mod( q ); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - ArrayList seq = new ArrayList(2); - seq.set(0, new DERValue(DER.INTEGER, r)); - seq.set(1, new DERValue(DER.INTEGER, s)); - DERWriter.write(bout, new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, seq)); - return bout.toByteArray(); - } catch (IOException ioe) { - throw new SignatureException(); - } catch ( ArithmeticException ae ) { - throw new SignatureException(); - } + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ArrayList seq = new ArrayList (2); + seq.add(0, new DERValue (DER.INTEGER, r)); + seq.add(1, new DERValue (DER.INTEGER, s)); + DERWriter.write (bout, new DERValue (DER.CONSTRUCTED | DER.SEQUENCE, seq)); + return bout.toByteArray(); + } + catch (IOException ioe) + { + SignatureException se = new SignatureException(); + se.initCause (ioe); + throw se; + } + catch (ArithmeticException ae) + { + SignatureException se = new SignatureException(); + se.initCause (ae); + throw se; + } } - public int engineSign(byte[] outbuf, int offset, int len) + public int engineSign (byte[] outbuf, int offset, int len) throws SignatureException { byte tmp[] = engineSign(); - if( tmp.length > len ) - throw new SignatureException(); - System.arraycopy( tmp, 0, outbuf, offset, tmp.length ); + if (tmp.length > len) + throw new SignatureException ("output buffer too short"); + System.arraycopy (tmp, 0, outbuf, offset, tmp.length); return tmp.length; } - public boolean engineVerify(byte[] sigBytes) + public boolean engineVerify (byte[] sigBytes) throws SignatureException { - //Decode sigBytes from ASN.1 DER encoding - try { - DERReader in = new DERReader(sigBytes); - DERValue val = in.read(); - if (!val.isConstructed()) - throw new SignatureException("badly formed signature"); - BigInteger r = (BigInteger) in.read().getValue(); - BigInteger s = (BigInteger) in.read().getValue(); + // Decode sigBytes from ASN.1 DER encoding + try + { + DERReader in = new DERReader (sigBytes); + DERValue val = in.read(); + if (!val.isConstructed()) + throw new SignatureException ("badly formed signature"); + BigInteger r = (BigInteger) in.read().getValue(); + BigInteger s = (BigInteger) in.read().getValue(); - BigInteger g = publicKey.getParams().getG(); - BigInteger p = publicKey.getParams().getP(); - BigInteger q = publicKey.getParams().getQ(); + BigInteger g = publicKey.getParams().getG(); + BigInteger p = publicKey.getParams().getP(); + BigInteger q = publicKey.getParams().getQ(); - BigInteger y = publicKey.getY(); + BigInteger y = publicKey.getY(); - BigInteger w = s.modInverse( q ); + BigInteger w = s.modInverse (q); - byte bytes[] = digest.digest(); - BigInteger sha = new BigInteger(1, bytes); + byte bytes[] = digest.digest(); + BigInteger sha = new BigInteger (1, bytes); - BigInteger u1 = w.multiply( sha ).mod( q ); + BigInteger u1 = w.multiply (sha).mod ( q ); - BigInteger u2 = r.multiply( w ).mod( q ); + BigInteger u2 = r.multiply (w).mod(q); - //This should test the compiler :) - BigInteger v = g.modPow( u1, p ).multiply( y.modPow( u2, p ) ).mod( p ).mod( q ); + BigInteger v = g.modPow (u1, p).multiply (y.modPow (u2, p)).mod (p).mod (q); - if( v.equals( r ) ) - return true; - else - return false; - } catch (IOException ioe) { - throw new SignatureException("badly formed signature"); - } + if (v.equals (r)) + return true; + else + return false; + } + catch (IOException ioe) + { + SignatureException se = new SignatureException ("badly formed signature"); + se.initCause (ioe); + throw se; + } } - public void engineSetParameter(String param, - Object value) + public void engineSetParameter (String param, + Object value) throws InvalidParameterException { throw new InvalidParameterException(); } - public void engineSetParameter(AlgorithmParameterSpec params) + public void engineSetParameter (AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException { throw new InvalidParameterException(); } - public Object engineGetParameter(String param) + public Object engineGetParameter (String param) throws InvalidParameterException { throw new InvalidParameterException(); } - public Object clone() - //throws CloneNotSupportedException - { - return new DSASignature( this ); - } - - private DSASignature( DSASignature copy ) + public Object clone() throws CloneNotSupportedException { - this(); - this.publicKey = copy.publicKey; - this.privateKey = copy.privateKey; - this.digest = copy.digest; + return super.clone(); } } |