BaseMac.java revision 5db505e1f6a68c8d5dfdb0fed0b8607dea7bed96
1package org.bouncycastle.jcajce.provider.symmetric.util;
2
3import java.security.InvalidAlgorithmParameterException;
4import java.security.InvalidKeyException;
5import java.security.Key;
6import java.security.spec.AlgorithmParameterSpec;
7import java.util.Hashtable;
8import java.util.Iterator;
9import java.util.Map;
10
11import javax.crypto.MacSpi;
12import javax.crypto.spec.IvParameterSpec;
13import javax.crypto.spec.PBEParameterSpec;
14
15import org.bouncycastle.crypto.CipherParameters;
16import org.bouncycastle.crypto.Mac;
17import org.bouncycastle.crypto.params.KeyParameter;
18import org.bouncycastle.crypto.params.ParametersWithIV;
19// BEGIN android-removed
20// import org.bouncycastle.crypto.params.SkeinParameters;
21// import org.bouncycastle.jcajce.spec.SkeinParameterSpec;
22// END android-removed
23
24public class BaseMac
25    extends MacSpi implements PBE
26{
27    private Mac macEngine;
28
29    private int                     pbeType = PKCS12;
30    private int                     pbeHash = SHA1;
31    private int                     keySize = 160;
32
33    protected BaseMac(
34        Mac macEngine)
35    {
36        this.macEngine = macEngine;
37    }
38
39    protected BaseMac(
40        Mac macEngine,
41        int pbeType,
42        int pbeHash,
43        int keySize)
44    {
45        this.macEngine = macEngine;
46        this.pbeType = pbeType;
47        this.pbeHash = pbeHash;
48        this.keySize = keySize;
49    }
50
51    protected void engineInit(
52        Key                     key,
53        AlgorithmParameterSpec  params)
54        throws InvalidKeyException, InvalidAlgorithmParameterException
55    {
56        CipherParameters        param;
57
58        if (key == null)
59        {
60            throw new InvalidKeyException("key is null");
61        }
62
63        if (key instanceof BCPBEKey)
64        {
65            BCPBEKey k = (BCPBEKey)key;
66
67            if (k.getParam() != null)
68            {
69                param = k.getParam();
70            }
71            else if (params instanceof PBEParameterSpec)
72            {
73                param = PBE.Util.makePBEMacParameters(k, params);
74            }
75            else
76            {
77                throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");
78            }
79        }
80        else if (params instanceof IvParameterSpec)
81        {
82            param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV());
83        }
84        // BEGIN android-removed
85        // else if (params instanceof SkeinParameterSpec)
86        // {
87        //     param = new SkeinParameters.Builder(copyMap(((SkeinParameterSpec)params).getParameters())).setKey(key.getEncoded()).build();
88        // }
89        // END android-removed
90        else if (params == null)
91        {
92            param = new KeyParameter(key.getEncoded());
93        }
94        else
95        {
96            throw new InvalidAlgorithmParameterException("unknown parameter type.");
97        }
98
99        macEngine.init(param);
100    }
101
102    protected int engineGetMacLength()
103    {
104        return macEngine.getMacSize();
105    }
106
107    protected void engineReset()
108    {
109        macEngine.reset();
110    }
111
112    protected void engineUpdate(
113        byte    input)
114    {
115        macEngine.update(input);
116    }
117
118    protected void engineUpdate(
119        byte[]  input,
120        int     offset,
121        int     len)
122    {
123        macEngine.update(input, offset, len);
124    }
125
126    protected byte[] engineDoFinal()
127    {
128        byte[]  out = new byte[engineGetMacLength()];
129
130        macEngine.doFinal(out, 0);
131
132        return out;
133    }
134
135    private static Hashtable copyMap(Map paramsMap)
136    {
137        Hashtable newTable = new Hashtable();
138
139        Iterator keys = paramsMap.keySet().iterator();
140        while (keys.hasNext())
141        {
142            Object key = keys.next();
143            newTable.put(key, paramsMap.get(key));
144        }
145
146        return newTable;
147    }
148}
149