1 package org.bouncycastle.pkcs.jcajce;
2 
3 import java.io.OutputStream;
4 import java.security.Provider;
5 
6 import javax.crypto.Mac;
7 import javax.crypto.SecretKey;
8 import javax.crypto.spec.PBEParameterSpec;
9 
10 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
11 import org.bouncycastle.asn1.DERNull;
12 import org.bouncycastle.asn1.pkcs.PKCS12PBEParams;
13 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
14 import org.bouncycastle.jcajce.PKCS12Key;
15 import org.bouncycastle.jcajce.io.MacOutputStream;
16 import org.bouncycastle.jcajce.util.DefaultJcaJceHelper;
17 import org.bouncycastle.jcajce.util.JcaJceHelper;
18 import org.bouncycastle.jcajce.util.NamedJcaJceHelper;
19 import org.bouncycastle.jcajce.util.ProviderJcaJceHelper;
20 import org.bouncycastle.operator.GenericKey;
21 import org.bouncycastle.operator.MacCalculator;
22 import org.bouncycastle.operator.OperatorCreationException;
23 import org.bouncycastle.pkcs.PKCS12MacCalculatorBuilder;
24 import org.bouncycastle.pkcs.PKCS12MacCalculatorBuilderProvider;
25 
26 public class JcePKCS12MacCalculatorBuilderProvider
27     implements PKCS12MacCalculatorBuilderProvider
28 {
29     private JcaJceHelper helper = new DefaultJcaJceHelper();
30 
JcePKCS12MacCalculatorBuilderProvider()31     public JcePKCS12MacCalculatorBuilderProvider()
32     {
33     }
34 
setProvider(Provider provider)35     public JcePKCS12MacCalculatorBuilderProvider setProvider(Provider provider)
36     {
37         this.helper = new ProviderJcaJceHelper(provider);
38 
39         return this;
40     }
41 
setProvider(String providerName)42     public JcePKCS12MacCalculatorBuilderProvider setProvider(String providerName)
43     {
44         this.helper = new NamedJcaJceHelper(providerName);
45 
46         return this;
47     }
48 
get(final AlgorithmIdentifier algorithmIdentifier)49     public PKCS12MacCalculatorBuilder get(final AlgorithmIdentifier algorithmIdentifier)
50     {
51         return new PKCS12MacCalculatorBuilder()
52         {
53             public MacCalculator build(final char[] password)
54                 throws OperatorCreationException
55             {
56                 final PKCS12PBEParams pbeParams = PKCS12PBEParams.getInstance(algorithmIdentifier.getParameters());
57 
58                 try
59                 {
60                     final ASN1ObjectIdentifier algorithm = algorithmIdentifier.getAlgorithm();
61 
62                     final Mac mac = helper.createMac(algorithm.getId());
63 
64                     PBEParameterSpec defParams = new PBEParameterSpec(pbeParams.getIV(), pbeParams.getIterations().intValue());
65 
66                     final SecretKey key = new PKCS12Key(password);
67 
68                     mac.init(key, defParams);
69 
70                     return new MacCalculator()
71                     {
72                         public AlgorithmIdentifier getAlgorithmIdentifier()
73                         {
74                             return new AlgorithmIdentifier(algorithm, pbeParams);
75                         }
76 
77                         public OutputStream getOutputStream()
78                         {
79                             return new MacOutputStream(mac);
80                         }
81 
82                         public byte[] getMac()
83                         {
84                             return mac.doFinal();
85                         }
86 
87                         public GenericKey getKey()
88                         {
89                             return new GenericKey(getAlgorithmIdentifier(), key.getEncoded());
90                         }
91                     };
92                 }
93                 catch (Exception e)
94                 {
95                     throw new OperatorCreationException("unable to create MAC calculator: " + e.getMessage(), e);
96                 }
97             }
98 
99             public AlgorithmIdentifier getDigestAlgorithmIdentifier()
100             {
101                 return new AlgorithmIdentifier(algorithmIdentifier.getAlgorithm(), DERNull.INSTANCE);
102             }
103         };
104     }
105 }
106