14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh; 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.DHParameterSpec; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.DHParameter; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class AlgorithmParametersSpi 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends java.security.AlgorithmParametersSpi 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DHParameterSpec currentSpec; 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected boolean isASN1FormatString(String format) 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return format == null || format.equals("ASN.1"); 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected AlgorithmParameterSpec engineGetParameterSpec( 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Class paramSpec) 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidParameterSpecException 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (paramSpec == null) 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new NullPointerException("argument to getParameterSpec must not be null"); 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return localEngineGetParameterSpec(paramSpec); 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Return the PKCS#3 ASN.1 structure DHParameter. 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <p> 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <pre> 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * DHParameter ::= SEQUENCE { 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * prime INTEGER, -- p 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * base INTEGER, -- g 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * privateValueLength INTEGER OPTIONAL} 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * </pre> 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected byte[] engineGetEncoded() 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DHParameter dhP = new DHParameter(currentSpec.getP(), currentSpec.getG(), currentSpec.getL()); 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return dhP.getEncoded(ASN1Encoding.DER); 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (IOException e) 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new RuntimeException("Error encoding DHParameters"); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected byte[] engineGetEncoded( 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom String format) 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (isASN1FormatString(format)) 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return engineGetEncoded(); 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected AlgorithmParameterSpec localEngineGetParameterSpec( 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Class paramSpec) 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidParameterSpecException 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (paramSpec == DHParameterSpec.class) 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return currentSpec; 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidParameterSpecException("unknown parameter spec passed to DH parameters object."); 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected void engineInit( 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom AlgorithmParameterSpec paramSpec) 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidParameterSpecException 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (!(paramSpec instanceof DHParameterSpec)) 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidParameterSpecException("DHParameterSpec required to initialise a Diffie-Hellman algorithm parameters object"); 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.currentSpec = (DHParameterSpec)paramSpec; 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected void engineInit( 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom byte[] params) 984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DHParameter dhP = DHParameter.getInstance(params); 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (dhP.getL() != null) 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom currentSpec = new DHParameterSpec(dhP.getP(), dhP.getG(), dhP.getL().intValue()); 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom currentSpec = new DHParameterSpec(dhP.getP(), dhP.getG()); 1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (ClassCastException e) 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IOException("Not a valid DH Parameter encoding."); 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (ArrayIndexOutOfBoundsException e) 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IOException("Not a valid DH Parameter encoding."); 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected void engineInit( 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom byte[] params, 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom String format) 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (isASN1FormatString(format)) 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom engineInit(params); 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IOException("Unknown parameter format " + format); 1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected String engineToString() 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return "Diffie-Hellman Parameters"; 1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 143