14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.symmetric.util;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidParameterSpecException;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.IvParameterSpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Arrays;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class IvAlgorithmParameters
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends BaseAlgorithmParameters
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private byte[] iv;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected byte[] engineGetEncoded()
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return engineGetEncoded("ASN.1");
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected byte[] engineGetEncoded(
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String format)
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (isASN1FormatString(format))
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new DEROctetString(engineGetEncoded("RAW")).getEncoded();
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (format.equals("RAW"))
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return Arrays.clone(iv);
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameterSpec localEngineGetParameterSpec(
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Class paramSpec)
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidParameterSpecException
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (paramSpec == IvParameterSpec.class)
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new IvParameterSpec(iv);
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidParameterSpecException("unknown parameter spec passed to IV parameters object.");
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameterSpec paramSpec)
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidParameterSpecException
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(paramSpec instanceof IvParameterSpec))
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidParameterSpecException("IvParameterSpec required to initialise a IV parameters algorithm parameters object");
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.iv = ((IvParameterSpec)paramSpec).getIV();
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[] params)
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // check that we don't have a DER encoded octet string
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if ((params.length % 8) != 0
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            && params[0] == 0x04 && params[1] == params.length - 2)
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            ASN1OctetString oct = (ASN1OctetString)ASN1Primitive.fromByteArray(params);
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            params = oct.getOctets();
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.iv = Arrays.clone(params);
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[] params,
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String format)
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (isASN1FormatString(format))
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                ASN1OctetString oct = (ASN1OctetString)ASN1Primitive.fromByteArray(params);
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                engineInit(oct.getOctets());
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (Exception e)
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Exception decoding: " + e);
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return;
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (format.equals("RAW"))
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            engineInit(params);
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return;
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new IOException("Unknown parameters format in IV parameters object");
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected String engineToString()
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return "IV Parameters";
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
119