22fb1267c95ae7918f9ba30648acb2f0fe25f6eb
[org.ibex.crypto.git] / src / org / ibex / crypto / HMAC.java
1 package org.ibex.crypto;
2
3 public class HMAC extends Digest {
4     private final Digest h;
5     private final byte[] digest;
6     private final byte[] k_ipad = new byte[64];
7     private final byte[] k_opad = new byte[64];
8     
9     public int getDigestSize() { return h.getDigestSize(); }
10     public HMAC(Digest h, byte[] key) {
11         this.h = h;
12         if(key.length > 64) {
13             h.reset();
14             h.update(key,0,key.length);
15             key = new byte[h.getDigestSize()];
16             h.doFinal(key,0);
17         }
18         digest = new byte[h.getDigestSize()];
19         for(int i=0;i<64;i++) {
20             byte b = i < key.length ? key[i] : 0;
21             k_ipad[i] = (byte)(b ^ 0x36);
22             k_opad[i] = (byte)(b ^ 0x5C);
23         }
24         reset();
25     }
26     public void reset() {
27         h.reset();
28         h.update(k_ipad,0,64);
29     }
30     public void update(byte[] b, int off, int len) { h.update(b,off,len); }
31     public void doFinal(byte[] out, int off){
32         h.doFinal(digest,0);
33         h.update(k_opad,0,64);
34         h.update(digest,0,digest.length);
35         h.doFinal(out,off);
36         reset();
37     }
38     protected void processWord(byte[] in, int inOff) {}
39     protected void processLength(long bitLength) {}
40     protected void processBlock() {}
41 }