HMac.java revision 87490acd76f544251011cf49753d4d0a61f86a66
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