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