BCPBEKey.java revision 2768c2948c0b1931bff087e43a8db8059c183b56
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)package org.bouncycastle.jcajce.provider.symmetric.util;
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.crypto.interfaces.PBEKey;
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.crypto.spec.PBEKeySpec;
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.bouncycastle.asn1.ASN1ObjectIdentifier;
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.bouncycastle.crypto.CipherParameters;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.bouncycastle.crypto.PBEParametersGenerator;
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.bouncycastle.crypto.params.KeyParameter;
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.bouncycastle.crypto.params.ParametersWithIV;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class BCPBEKey
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    implements PBEKey
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    String              algorithm;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASN1ObjectIdentifier oid;
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int                 type;
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int                 digest;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int                 keySize;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int                 ivSize;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CipherParameters    param;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PBEKeySpec          pbeKeySpec;
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    boolean             tryWrong = false;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param param
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public BCPBEKey(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        String algorithm,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASN1ObjectIdentifier oid,
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        int type,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int digest,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int keySize,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int ivSize,
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        PBEKeySpec pbeKeySpec,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CipherParameters param)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.algorithm = algorithm;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.oid = oid;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.type = type;
415e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)        this.digest = digest;
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        this.keySize = keySize;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.ivSize = ivSize;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.pbeKeySpec = pbeKeySpec;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.param = param;
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public String getAlgorithm()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return algorithm;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    public String getFormat()
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return "RAW";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public byte[] getEncoded()
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (param != null)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            KeyParameter    kParam;
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (param instanceof ParametersWithIV)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                kParam = (KeyParameter)((ParametersWithIV)param).getParameters();
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            }
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            else
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                kParam = (KeyParameter)param;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            return kParam.getKey();
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        }
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        else
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (type == PBE.PKCS12)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                return PBEParametersGenerator.PKCS12PasswordToBytes(pbeKeySpec.getPassword());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // BEGIN android-changed
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else if (type == PBE.PBKDF2)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(pbeKeySpec.getPassword());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            // END android-changed
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                return PBEParametersGenerator.PKCS5PasswordToBytes(pbeKeySpec.getPassword());
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int getType()
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return type;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int getDigest()
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return digest;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int getKeySize()
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return keySize;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public int getIvSize()
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return ivSize;
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public CipherParameters getParam()
115bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return param;
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* (non-Javadoc)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @see javax.crypto.interfaces.PBEKey#getPassword()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public char[] getPassword()
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return pbeKeySpec.getPassword();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /* (non-Javadoc)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @see javax.crypto.interfaces.PBEKey#getSalt()
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public byte[] getSalt()
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return pbeKeySpec.getSalt();
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /* (non-Javadoc)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @see javax.crypto.interfaces.PBEKey#getIterationCount()
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public int getIterationCount()
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return pbeKeySpec.getIterationCount();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public ASN1ObjectIdentifier getOID()
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return oid;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void setTryWrongPKCS12Zero(boolean tryWrong)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        this.tryWrong = tryWrong;
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    boolean shouldTryWrongPKCS12()
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return tryWrong;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)