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