KeyFactorySpi.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.jcajce.provider.asymmetric.dsa;
2
3import java.io.IOException;
4import java.security.InvalidKeyException;
5import java.security.Key;
6import java.security.PrivateKey;
7import java.security.PublicKey;
8import java.security.interfaces.DSAPrivateKey;
9import java.security.interfaces.DSAPublicKey;
10import java.security.spec.DSAPrivateKeySpec;
11import java.security.spec.DSAPublicKeySpec;
12import java.security.spec.InvalidKeySpecException;
13import java.security.spec.KeySpec;
14
15import org.bouncycastle.asn1.ASN1ObjectIdentifier;
16import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
17import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
18import org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi;
19
20public class KeyFactorySpi
21    extends BaseKeyFactorySpi
22{
23    public KeyFactorySpi()
24    {
25    }
26
27    protected KeySpec engineGetKeySpec(
28        Key key,
29        Class spec)
30        throws InvalidKeySpecException
31    {
32        if (spec.isAssignableFrom(DSAPublicKeySpec.class) && key instanceof DSAPublicKey)
33        {
34            DSAPublicKey k = (DSAPublicKey)key;
35
36            return new DSAPublicKeySpec(k.getY(), k.getParams().getP(), k.getParams().getQ(), k.getParams().getG());
37        }
38        else if (spec.isAssignableFrom(DSAPrivateKeySpec.class) && key instanceof java.security.interfaces.DSAPrivateKey)
39        {
40            java.security.interfaces.DSAPrivateKey k = (java.security.interfaces.DSAPrivateKey)key;
41
42            return new DSAPrivateKeySpec(k.getX(), k.getParams().getP(), k.getParams().getQ(), k.getParams().getG());
43        }
44
45        return super.engineGetKeySpec(key, spec);
46    }
47
48    protected Key engineTranslateKey(
49        Key key)
50        throws InvalidKeyException
51    {
52        if (key instanceof DSAPublicKey)
53        {
54            return new BCDSAPublicKey((DSAPublicKey)key);
55        }
56        else if (key instanceof DSAPrivateKey)
57        {
58            return new BCDSAPrivateKey((DSAPrivateKey)key);
59        }
60
61        throw new InvalidKeyException("key type unknown");
62    }
63
64    public PrivateKey generatePrivate(PrivateKeyInfo keyInfo)
65        throws IOException
66    {
67        ASN1ObjectIdentifier algOid = keyInfo.getPrivateKeyAlgorithm().getAlgorithm();
68
69        if (DSAUtil.isDsaOid(algOid))
70        {
71            return new BCDSAPrivateKey(keyInfo);
72        }
73        else
74        {
75            throw new IOException("algorithm identifier " + algOid + " in key not recognised");
76        }
77    }
78
79    public PublicKey generatePublic(SubjectPublicKeyInfo keyInfo)
80        throws IOException
81    {
82        ASN1ObjectIdentifier algOid = keyInfo.getAlgorithm().getAlgorithm();
83
84        if (DSAUtil.isDsaOid(algOid))
85        {
86            return new BCDSAPublicKey(keyInfo);
87        }
88        else
89        {
90            throw new IOException("algorithm identifier " + algOid + " in key not recognised");
91        }
92    }
93
94    protected PrivateKey engineGeneratePrivate(
95        KeySpec keySpec)
96        throws InvalidKeySpecException
97    {
98        if (keySpec instanceof DSAPrivateKeySpec)
99        {
100            return new BCDSAPrivateKey((DSAPrivateKeySpec)keySpec);
101        }
102
103        return super.engineGeneratePrivate(keySpec);
104    }
105
106    protected PublicKey engineGeneratePublic(
107        KeySpec keySpec)
108        throws InvalidKeySpecException
109    {
110        if (keySpec instanceof DSAPublicKeySpec)
111        {
112            return new BCDSAPublicKey((DSAPublicKeySpec)keySpec);
113        }
114
115        return super.engineGeneratePublic(keySpec);
116    }
117}
118