BCPBEKey.java revision 2768c2948c0b1931bff087e43a8db8059c183b56
14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.symmetric.util;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport javax.crypto.interfaces.PBEKey;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport javax.crypto.spec.PBEKeySpec;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
6e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.CipherParameters;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.PBEParametersGenerator;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.params.KeyParameter;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.params.ParametersWithIV;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class BCPBEKey
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    implements PBEKey
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    String              algorithm;
16e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    ASN1ObjectIdentifier oid;
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int                 type;
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int                 digest;
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int                 keySize;
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int                 ivSize;
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    CipherParameters    param;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    PBEKeySpec          pbeKeySpec;
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    boolean             tryWrong = false;
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param param
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BCPBEKey(
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String algorithm,
30e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        ASN1ObjectIdentifier oid,
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int type,
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int digest,
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int keySize,
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int ivSize,
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        PBEKeySpec pbeKeySpec,
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        CipherParameters param)
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.algorithm = algorithm;
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.oid = oid;
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.type = type;
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.digest = digest;
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.keySize = keySize;
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.ivSize = ivSize;
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.pbeKeySpec = pbeKeySpec;
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.param = param;
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getAlgorithm()
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return algorithm;
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getFormat()
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return "RAW";
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] getEncoded()
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (param != null)
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            KeyParameter    kParam;
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            if (param instanceof ParametersWithIV)
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                kParam = (KeyParameter)((ParametersWithIV)param).getParameters();
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            else
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                kParam = (KeyParameter)param;
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return kParam.getKey();
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            if (type == PBE.PKCS12)
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                return PBEParametersGenerator.PKCS12PasswordToBytes(pbeKeySpec.getPassword());
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
812768c2948c0b1931bff087e43a8db8059c183b56William Luh            // BEGIN android-changed
822768c2948c0b1931bff087e43a8db8059c183b56William Luh            else if (type == PBE.PBKDF2)
832768c2948c0b1931bff087e43a8db8059c183b56William Luh            {
842768c2948c0b1931bff087e43a8db8059c183b56William Luh                return PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(pbeKeySpec.getPassword());
852768c2948c0b1931bff087e43a8db8059c183b56William Luh            }
862768c2948c0b1931bff087e43a8db8059c183b56William Luh            // END android-changed
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            else
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                return PBEParametersGenerator.PKCS5PasswordToBytes(pbeKeySpec.getPassword());
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getType()
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return type;
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getDigest()
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digest;
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getKeySize()
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return keySize;
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int getIvSize()
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return ivSize;
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public CipherParameters getParam()
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return param;
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getPassword()
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public char[] getPassword()
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getPassword();
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getSalt()
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] getSalt()
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getSalt();
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getIterationCount()
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getIterationCount()
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getIterationCount();
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
143e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    public ASN1ObjectIdentifier getOID()
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return oid;
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void setTryWrongPKCS12Zero(boolean tryWrong)
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.tryWrong = tryWrong;
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    boolean shouldTryWrongPKCS12()
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tryWrong;
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
158