14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PublicKey; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.interfaces.DHPrivateKey; 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.interfaces.DHPublicKey; 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHPrivateKeySpec; 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHPublicKeySpec; 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo; 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers; 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi; 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyFactorySpi 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends BaseKeyFactorySpi 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public KeyFactorySpi() 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected KeySpec engineGetKeySpec( 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Key key, 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Class spec) 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (spec.isAssignableFrom(DHPrivateKeySpec.class) && key instanceof DHPrivateKey) 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DHPrivateKey k = (DHPrivateKey)key; 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new DHPrivateKeySpec(k.getX(), k.getParams().getP(), k.getParams().getG()); 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (spec.isAssignableFrom(DHPublicKeySpec.class) && key instanceof DHPublicKey) 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DHPublicKey k = (DHPublicKey)key; 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new DHPublicKeySpec(k.getY(), k.getParams().getP(), k.getParams().getG()); 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.engineGetKeySpec(key, spec); 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected Key engineTranslateKey( 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Key key) 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeyException 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (key instanceof DHPublicKey) 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPublicKey((DHPublicKey)key); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (key instanceof DHPrivateKey) 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPrivateKey((DHPrivateKey)key); 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeyException("key type unknown"); 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected PrivateKey engineGeneratePrivate( 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom KeySpec keySpec) 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (keySpec instanceof DHPrivateKeySpec) 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPrivateKey((DHPrivateKeySpec)keySpec); 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.engineGeneratePrivate(keySpec); 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected PublicKey engineGeneratePublic( 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom KeySpec keySpec) 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (keySpec instanceof DHPublicKeySpec) 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPublicKey((DHPublicKeySpec)keySpec); 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.engineGeneratePublic(keySpec); 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public PrivateKey generatePrivate(PrivateKeyInfo keyInfo) 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier algOid = keyInfo.getPrivateKeyAlgorithm().getAlgorithm(); 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (algOid.equals(PKCSObjectIdentifiers.dhKeyAgreement)) 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPrivateKey(keyInfo); 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (algOid.equals(X9ObjectIdentifiers.dhpublicnumber)) 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPrivateKey(keyInfo); 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IOException("algorithm identifier " + algOid + " in key not recognised"); 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public PublicKey generatePublic(SubjectPublicKeyInfo keyInfo) 1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier algOid = keyInfo.getAlgorithm().getAlgorithm(); 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (algOid.equals(PKCSObjectIdentifiers.dhKeyAgreement)) 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPublicKey(keyInfo); 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (algOid.equals(X9ObjectIdentifiers.dhpublicnumber)) 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new BCDHPublicKey(keyInfo); 1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IOException("algorithm identifier " + algOid + " in key not recognised"); 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 129