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            }
81a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            else if (type == PBE.PKCS5S2_UTF8)
822768c2948c0b1931bff087e43a8db8059c183b56William Luh            {
832768c2948c0b1931bff087e43a8db8059c183b56William Luh                return PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(pbeKeySpec.getPassword());
842768c2948c0b1931bff087e43a8db8059c183b56William Luh            }
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            else
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                return PBEParametersGenerator.PKCS5PasswordToBytes(pbeKeySpec.getPassword());
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getType()
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return type;
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getDigest()
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digest;
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int getKeySize()
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return keySize;
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int getIvSize()
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return ivSize;
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public CipherParameters getParam()
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return param;
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getPassword()
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public char[] getPassword()
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getPassword();
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getSalt()
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] getSalt()
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getSalt();
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /* (non-Javadoc)
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @see javax.crypto.interfaces.PBEKey#getIterationCount()
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getIterationCount()
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return pbeKeySpec.getIterationCount();
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
141e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    public ASN1ObjectIdentifier getOID()
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return oid;
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void setTryWrongPKCS12Zero(boolean tryWrong)
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.tryWrong = tryWrong;
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    boolean shouldTryWrongPKCS12()
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tryWrong;
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
156