1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.crypto.macs;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Hashtable;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.CipherParameters;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.Digest;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.ExtendedDigest;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.Mac;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.params.KeyParameter;
10e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstromimport org.bouncycastle.util.Integers;
11a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.util.Memoable;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * HMAC implementation based on RFC2104
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * H(K XOR opad, H(K XOR ipad, text))
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class HMac
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    implements Mac
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private final static byte IPAD = (byte)0x36;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private final static byte OPAD = (byte)0x5C;
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private Digest digest;
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private int digestSize;
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private int blockLength;
27a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private Memoable ipadState;
28a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private Memoable opadState;
29a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private byte[] inputPad;
31a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private byte[] outputBuf;
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private static Hashtable blockLengths;
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    static
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        blockLengths = new Hashtable();
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // BEGIN android-removed
40e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("GOST3411", Integers.valueOf(32));
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
42e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("MD2", Integers.valueOf(16));
43e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("MD4", Integers.valueOf(64));
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // END android-removed
45e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        blockLengths.put("MD5", Integers.valueOf(64));
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // BEGIN android-removed
48e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("RIPEMD128", Integers.valueOf(64));
49e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("RIPEMD160", Integers.valueOf(64));
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // END android-removed
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
52e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        blockLengths.put("SHA-1", Integers.valueOf(64));
5387490acd76f544251011cf49753d4d0a61f86a66Kenny Root        blockLengths.put("SHA-224", Integers.valueOf(64));
54e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        blockLengths.put("SHA-256", Integers.valueOf(64));
55e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        blockLengths.put("SHA-384", Integers.valueOf(128));
56e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        blockLengths.put("SHA-512", Integers.valueOf(128));
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // BEGIN android-removed
59e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("Tiger", Integers.valueOf(64));
60e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        // blockLengths.put("Whirlpool", Integers.valueOf(64));
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // END android-removed
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private static int getByteLength(
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Digest digest)
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (digest instanceof ExtendedDigest)
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return ((ExtendedDigest)digest).getByteLength();
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Integer  b = (Integer)blockLengths.get(digest.getAlgorithmName());
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (b == null)
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("unknown digest passed: " + digest.getAlgorithmName());
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return b.intValue();
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Base constructor for one of the standard digest algorithms that the
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * byteLength of the algorithm is know for.
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param digest the digest.
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public HMac(
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Digest digest)
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this(digest, getByteLength(digest));
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private HMac(
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Digest digest,
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int    byteLength)
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.digest = digest;
99a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.digestSize = digest.getDigestSize();
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.blockLength = byteLength;
101a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.inputPad = new byte[blockLength];
102a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.outputBuf = new byte[blockLength + digestSize];
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
104a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getAlgorithmName()
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digest.getAlgorithmName() + "/HMAC";
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Digest getUnderlyingDigest()
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digest;
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void init(
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        CipherParameters params)
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.reset();
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[] key = ((KeyParameter)params).getKey();
121a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        int keyLength = key.length;
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
123a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (keyLength > blockLength)
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
125a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            digest.update(key, 0, keyLength);
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            digest.doFinal(inputPad, 0);
127a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
128a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            keyLength = digestSize;
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
132a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            System.arraycopy(key, 0, inputPad, 0, keyLength);
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
135a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        for (int i = keyLength; i < inputPad.length; i++)
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
137a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            inputPad[i] = 0;
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
140a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        System.arraycopy(inputPad, 0, outputBuf, 0, blockLength);
141a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
142a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        xorPad(inputPad, blockLength, IPAD);
143a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        xorPad(outputBuf, blockLength, OPAD);
144a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
145a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (digest instanceof Memoable)
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
147a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            opadState = ((Memoable)digest).copy();
148a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
149a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            ((Digest)opadState).update(outputBuf, 0, blockLength);
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.update(inputPad, 0, inputPad.length);
153a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
154a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (digest instanceof Memoable)
155a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
156a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            ipadState = ((Memoable)digest).copy();
157a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getMacSize()
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digestSize;
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void update(
166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte in)
167b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
168b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.update(in);
169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void update(
172b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[] in,
173b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int inOff,
174b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int len)
175b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
176b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.update(in, inOff, len);
177b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
178b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
179b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int doFinal(
180b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[] out,
181b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int outOff)
182b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
183a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        digest.doFinal(outputBuf, blockLength);
184b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
185a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (opadState != null)
186a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
187a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            ((Memoable)digest).reset(opadState);
188a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            digest.update(outputBuf, blockLength, digest.getDigestSize());
189a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
190a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        else
191a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
192a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            digest.update(outputBuf, 0, outputBuf.length);
193a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
194b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
195a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        int len = digest.doFinal(out, outOff);
196b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
197a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        for (int i = blockLength; i < outputBuf.length; i++)
198a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
199a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            outputBuf[i] = 0;
200a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
201a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
202a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (ipadState != null)
203a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
204a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            ((Memoable)digest).reset(ipadState);
205a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
206a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        else
207a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
208a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            digest.update(inputPad, 0, inputPad.length);
209a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
210b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
211b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return len;
212b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
213b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
214b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
215b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Reset the mac generator.
216b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
217b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void reset()
218b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
219b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        /*
220b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         * reset the underlying digest.
221b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         */
222b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.reset();
223b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
224b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        /*
225b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         * reinitialize the digest.
226b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         */
227b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digest.update(inputPad, 0, inputPad.length);
228b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
229a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
230a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private static void xorPad(byte[] pad, int len, byte n)
231a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
232a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        for (int i = 0; i < len; ++i)
233a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
234a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            pad[i] ^= n;
235a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
236a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
237b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
238