14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.x509; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyFactorySpi; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PublicKey; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.PKCS8EncodedKeySpec; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.X509EncodedKeySpec; 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo; 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.provider.BouncyCastleProvider; 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyFactory 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends KeyFactorySpi 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected PrivateKey engineGeneratePrivate( 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom KeySpec keySpec) 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (keySpec instanceof PKCS8EncodedKeySpec) 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom PrivateKeyInfo info = PrivateKeyInfo.getInstance(((PKCS8EncodedKeySpec)keySpec).getEncoded()); 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom PrivateKey key = BouncyCastleProvider.getPrivateKey(info); 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (key != null) 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return key; 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException("no factory found for OID: " + info.getPrivateKeyAlgorithm().getAlgorithm()); 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (Exception e) 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException(e.toString()); 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException("Unknown KeySpec type: " + keySpec.getClass().getName()); 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected PublicKey engineGeneratePublic( 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom KeySpec keySpec) 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (keySpec instanceof X509EncodedKeySpec) 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SubjectPublicKeyInfo info = SubjectPublicKeyInfo.getInstance(((X509EncodedKeySpec)keySpec).getEncoded()); 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom PublicKey key = BouncyCastleProvider.getPublicKey(info); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (key != null) 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return key; 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException("no factory found for OID: " + info.getAlgorithm().getAlgorithm()); 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (Exception e) 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException(e.toString()); 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException("Unknown KeySpec type: " + keySpec.getClass().getName()); 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected KeySpec engineGetKeySpec(Key key, Class keySpec) 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeySpecException 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (keySpec.isAssignableFrom(PKCS8EncodedKeySpec.class) && key.getFormat().equals("PKCS#8")) 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new PKCS8EncodedKeySpec(key.getEncoded()); 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (keySpec.isAssignableFrom(X509EncodedKeySpec.class) && key.getFormat().equals("X.509")) 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new X509EncodedKeySpec(key.getEncoded()); 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeySpecException("not implemented yet " + key + " " + keySpec); 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom protected Key engineTranslateKey(Key key) 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidKeyException 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidKeyException("not implemented yet " + key); 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}