1 package org.ibex.crypto;
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];
9 public int getDigestSize() { return h.getDigestSize(); }
10 public HMAC(Digest h, byte[] key) {
14 h.update(key,0,key.length);
15 key = new byte[h.getDigestSize()];
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);
28 h.update(k_ipad,0,64);
30 public void update(byte[] b, int off, int len) { h.update(b,off,len); }
31 public void doFinal(byte[] out, int off){
33 h.update(k_opad,0,64);
34 h.update(digest,0,digest.length);
38 protected void processWord(byte[] in, int inOff) {}
39 protected void processLength(long bitLength) {}
40 protected void processBlock() {}