116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.jcajce.provider.symmetric.util; 216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.lang.reflect.Constructor; 416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.InvalidKeyException; 516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.InvalidKeySpecException; 616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.KeySpec; 716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.SecretKey; 916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.SecretKeyFactorySpi; 1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.spec.SecretKeySpec; 1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class BaseSecretKeyFactory 1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro extends SecretKeyFactorySpi 1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro implements PBE 1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{ 1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected String algName; 1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected ASN1ObjectIdentifier algOid; 2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected BaseSecretKeyFactory( 2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algName, 2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1ObjectIdentifier algOid) 2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algName = algName; 2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algOid = algOid; 2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected SecretKey engineGenerateSecret( 3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro KeySpec keySpec) 3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws InvalidKeySpecException 3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (keySpec instanceof SecretKeySpec) 3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return new SecretKeySpec(((SecretKeySpec)keySpec).getEncoded(), algName); 3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeySpecException("Invalid KeySpec"); 3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected KeySpec engineGetKeySpec( 4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro SecretKey key, 4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro Class keySpec) 4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws InvalidKeySpecException 4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (keySpec == null) 4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeySpecException("keySpec parameter is null"); 4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (key == null) 5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeySpecException("key parameter is null"); 5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (SecretKeySpec.class.isAssignableFrom(keySpec)) 5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return new SecretKeySpec(key.getEncoded(), algName); 5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro try 6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro Class[] parameters = { byte[].class }; 6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro Constructor c = keySpec.getConstructor(parameters); 6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro Object[] p = new Object[1]; 6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro p[0] = key.getEncoded(); 6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return (KeySpec)c.newInstance(p); 7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro catch (Exception e) 7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeySpecException(e.toString()); 7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected SecretKey engineTranslateKey( 7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro SecretKey key) 7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws InvalidKeyException 8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (key == null) 8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeyException("key parameter is null"); 8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (!key.getAlgorithm().equalsIgnoreCase(algName)) 8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new InvalidKeyException("Key not of type " + algName + "."); 8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return new SecretKeySpec(key.getEncoded(), algName); 9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro} 94