1a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrompackage org.bouncycastle.jcajce.provider.symmetric;
2a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
3a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport java.io.IOException;
4a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
5a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport java.security.spec.InvalidParameterSpecException;
6a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
7a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport javax.crypto.spec.PBEParameterSpec;
8a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
9a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
10a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
11a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCS12PBEParams;
12a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
13a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameters;
14a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.jcajce.provider.util.AlgorithmProvider;
15a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
16a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrompublic class PBEPKCS12
17a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom{
18a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private PBEPKCS12()
19a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
20a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
21a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
22a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
23a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public static class AlgParams
24a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        extends BaseAlgorithmParameters
25a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
26a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        PKCS12PBEParams params;
27a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
28a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected byte[] engineGetEncoded()
29a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
30a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            try
31a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
32a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                return params.getEncoded(ASN1Encoding.DER);
33a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
34a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            catch (IOException e)
35a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
36a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                throw new RuntimeException("Oooops! " + e.toString());
37a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
38a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
39a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
40a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected byte[] engineGetEncoded(
41a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            String format)
42a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
43a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            if (this.isASN1FormatString(format))
44a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
45a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                return engineGetEncoded();
46a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
47a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
48a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            return null;
49a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
50a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
51a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected AlgorithmParameterSpec localEngineGetParameterSpec(
52a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            Class paramSpec)
53a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throws InvalidParameterSpecException
54a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
55a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            if (paramSpec == PBEParameterSpec.class)
56a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
57a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                return new PBEParameterSpec(params.getIV(),
58a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                    params.getIterations().intValue());
59a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
60a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
61a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throw new InvalidParameterSpecException("unknown parameter spec passed to PKCS12 PBE parameters object.");
62a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
63a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
64a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected void engineInit(
65a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            AlgorithmParameterSpec paramSpec)
66a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throws InvalidParameterSpecException
67a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
68a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            if (!(paramSpec instanceof PBEParameterSpec))
69a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
70a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                throw new InvalidParameterSpecException("PBEParameterSpec required to initialise a PKCS12 PBE parameters algorithm parameters object");
71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
73a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            PBEParameterSpec pbeSpec = (PBEParameterSpec)paramSpec;
74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
75a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            this.params = new PKCS12PBEParams(pbeSpec.getSalt(),
76a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                pbeSpec.getIterationCount());
77a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
78a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
79a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected void engineInit(
80a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            byte[] params)
81a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throws IOException
82a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
83a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            this.params = PKCS12PBEParams.getInstance(ASN1Primitive.fromByteArray(params));
84a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
85a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
86a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected void engineInit(
87a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            byte[] params,
88a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            String format)
89a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throws IOException
90a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
91a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            if (this.isASN1FormatString(format))
92a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            {
93a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                engineInit(params);
94a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                return;
95a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            }
96a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
97a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            throw new IOException("Unknown parameters format in PKCS12 PBE parameters object");
98a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
99a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
100a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        protected String engineToString()
101a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
102a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            return "PKCS12 PBE Parameters";
103a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
104a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
105a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
106a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public static class Mappings
107a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        extends AlgorithmProvider
108a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
109a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        private static final String PREFIX = PBEPKCS12.class.getName();
110a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
111a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        public Mappings()
112a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
113a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
114a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
115a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        public void configure(ConfigurableProvider provider)
116a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
117a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            provider.addAlgorithm("AlgorithmParameters.PKCS12PBE", PREFIX + "$AlgParams");
118a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
119a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
120a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom}
121