18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.jce.provider;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.SignatureException;
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.SignatureSpi;
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.PrivateKey;
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.InvalidKeyException;
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.crypto.DSA;
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.crypto.Digest;
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic abstract class DSABase
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    extends SignatureSpi
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    implements PKCSObjectIdentifiers, X509ObjectIdentifiers
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected Digest                  digest;
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected DSA                     signer;
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected DSAEncoder              encoder;
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected DSABase(
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        Digest                  digest,
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        DSA                     signer,
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        DSAEncoder              encoder)
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.digest = digest;
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.signer = signer;
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.encoder = encoder;
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected void engineInitSign(
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        PrivateKey privateKey)
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    throws InvalidKeyException
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        engineInitSign(privateKey, null);
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected void engineUpdate(
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte    b)
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throws SignatureException
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        digest.update(b);
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected void engineUpdate(
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]  b,
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int     off,
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int     len)
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throws SignatureException
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        digest.update(b, off, len);
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected byte[] engineSign()
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throws SignatureException
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]  hash = new byte[digest.getDigestSize()];
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        digest.doFinal(hash, 0);
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        try
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            BigInteger[]    sig = signer.generateSignature(hash);
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return encoder.encode(sig[0], sig[1]);
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        catch (Exception e)
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new SignatureException(e.toString());
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected boolean engineVerify(
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]  sigBytes)
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throws SignatureException
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[]  hash = new byte[digest.getDigestSize()];
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        digest.doFinal(hash, 0);
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger[]    sig;
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        try
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            sig = encoder.decode(sigBytes);
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        catch (Exception e)
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new SignatureException("error decoding signature bytes.");
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return signer.verifySignature(hash, sig[0], sig[1]);
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected void engineSetParameter(
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        AlgorithmParameterSpec params)
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throw new UnsupportedOperationException("engineSetParameter unsupported");
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @deprecated replaced with <a href = "#engineSetParameter(java.security.spec.AlgorithmParameterSpec)">
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected void engineSetParameter(
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String  param,
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        Object  value)
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throw new UnsupportedOperationException("engineSetParameter unsupported");
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @deprecated
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    protected Object engineGetParameter(
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String      param)
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        throw new UnsupportedOperationException("engineSetParameter unsupported");
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
122