diff app/src/main/java/ch/ethz/ssh2/crypto/digest/HMAC.java @ 438:d29cce60f393

migrate from Eclipse to Android Studio
author Carl Byington <carl@five-ten-sg.com>
date Thu, 03 Dec 2015 11:23:55 -0800
parents src/ch/ethz/ssh2/crypto/digest/HMAC.java@071eccdff8ea
children 7953570e5210
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/src/main/java/ch/ethz/ssh2/crypto/digest/HMAC.java	Thu Dec 03 11:23:55 2015 -0800
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
+ * Please refer to the LICENSE.txt for licensing details.
+ */
+package ch.ethz.ssh2.crypto.digest;
+
+import java.security.DigestException;
+
+/**
+ * HMAC.
+ *
+ * @author Christian Plattner
+ * @version 2.50, 03/15/10
+ */
+public final class HMAC implements Digest {
+    Digest md;
+    byte[] k_xor_ipad;
+    byte[] k_xor_opad;
+
+    byte[] tmp;
+
+    int size;
+
+    public HMAC(Digest md, byte[] key, int size) throws DigestException {
+        this.md = md;
+        this.size = size;
+        tmp = new byte[md.getDigestLength()];
+        final int BLOCKSIZE = 64;
+        k_xor_ipad = new byte[BLOCKSIZE];
+        k_xor_opad = new byte[BLOCKSIZE];
+
+        if (key.length > BLOCKSIZE) {
+            md.reset();
+            md.update(key);
+            md.digest(tmp);
+            key = tmp;
+        }
+
+        System.arraycopy(key, 0, k_xor_ipad, 0, key.length);
+        System.arraycopy(key, 0, k_xor_opad, 0, key.length);
+
+        for (int i = 0; i < BLOCKSIZE; i++) {
+            k_xor_ipad[i] ^= 0x36;
+            k_xor_opad[i] ^= 0x5C;
+        }
+
+        md.update(k_xor_ipad);
+    }
+
+    public final int getDigestLength() {
+        return size;
+    }
+
+    public final void update(byte b) {
+        md.update(b);
+    }
+
+    public final void update(byte[] b) {
+        md.update(b);
+    }
+
+    public final void update(byte[] b, int off, int len) {
+        md.update(b, off, len);
+    }
+
+    public final void reset() {
+        md.reset();
+        md.update(k_xor_ipad);
+    }
+
+    public final void digest(byte[] out) throws DigestException {
+        digest(out, 0);
+    }
+
+    public final void digest(byte[] out, int off) throws DigestException {
+        md.digest(tmp);
+        md.update(k_xor_opad);
+        md.update(tmp);
+        md.digest(tmp);
+        System.arraycopy(tmp, 0, out, off, size);
+        md.update(k_xor_ipad);
+    }
+}