BaseMac.java revision a198e1ecc615e26a167d0f2dca9fa7e5fc62de10
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;
7
8import javax.crypto.MacSpi;
9import javax.crypto.spec.IvParameterSpec;
10import javax.crypto.spec.PBEParameterSpec;
11
12import org.bouncycastle.crypto.CipherParameters;
13import org.bouncycastle.crypto.Mac;
14import org.bouncycastle.crypto.params.KeyParameter;
15import org.bouncycastle.crypto.params.ParametersWithIV;
16
17public class BaseMac
18    extends MacSpi implements PBE
19{
20    private Mac macEngine;
21
22    private int                     pbeType = PKCS12;
23    private int                     pbeHash = SHA1;
24    private int                     keySize = 160;
25
26    protected BaseMac(
27        Mac macEngine)
28    {
29        this.macEngine = macEngine;
30    }
31
32    protected BaseMac(
33        Mac macEngine,
34        int pbeType,
35        int pbeHash,
36        int keySize)
37    {
38        this.macEngine = macEngine;
39        this.pbeType = pbeType;
40        this.pbeHash = pbeHash;
41        this.keySize = keySize;
42    }
43
44    protected void engineInit(
45        Key                     key,
46        AlgorithmParameterSpec  params)
47        throws InvalidKeyException, InvalidAlgorithmParameterException
48    {
49        CipherParameters        param;
50
51        if (key == null)
52        {
53            throw new InvalidKeyException("key is null");
54        }
55
56        if (key instanceof BCPBEKey)
57        {
58            BCPBEKey k = (BCPBEKey)key;
59
60            if (k.getParam() != null)
61            {
62                param = k.getParam();
63            }
64            else if (params instanceof PBEParameterSpec)
65            {
66                param = PBE.Util.makePBEMacParameters(k, params);
67            }
68            else
69            {
70                throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");
71            }
72        }
73        else if (params instanceof IvParameterSpec)
74        {
75            param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV());
76        }
77        else if (params == null)
78        {
79            param = new KeyParameter(key.getEncoded());
80        }
81        else
82        {
83            throw new InvalidAlgorithmParameterException("unknown parameter type.");
84        }
85
86        macEngine.init(param);
87    }
88
89    protected int engineGetMacLength()
90    {
91        return macEngine.getMacSize();
92    }
93
94    protected void engineReset()
95    {
96        macEngine.reset();
97    }
98
99    protected void engineUpdate(
100        byte    input)
101    {
102        macEngine.update(input);
103    }
104
105    protected void engineUpdate(
106        byte[]  input,
107        int     offset,
108        int     len)
109    {
110        macEngine.update(input, offset, len);
111    }
112
113    protected byte[] engineDoFinal()
114    {
115        byte[]  out = new byte[engineGetMacLength()];
116
117        macEngine.doFinal(out, 0);
118
119        return out;
120    }
121}
122