diff src/com/trilead/ssh2/crypto/digest/HashForSSH2Types.java @ 0:0ce5cc452d02

initial version
author Carl Byington <carl@five-ten-sg.com>
date Thu, 22 May 2014 10:41:19 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/trilead/ssh2/crypto/digest/HashForSSH2Types.java	Thu May 22 10:41:19 2014 -0700
@@ -0,0 +1,81 @@
+
+package com.trilead.ssh2.crypto.digest;
+
+import java.math.BigInteger;
+import java.security.DigestException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * HashForSSH2Types.
+ *
+ * @author Christian Plattner, plattner@trilead.com
+ * @version $Id: HashForSSH2Types.java,v 1.1 2007/10/15 12:49:57 cplattne Exp $
+ */
+public class HashForSSH2Types {
+    MessageDigest md;
+
+    public HashForSSH2Types(String type) {
+        try {
+            md = MessageDigest.getInstance(type);
+        }
+        catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("Unsupported algorithm " + type);
+        }
+    }
+
+    public void updateByte(byte b) {
+        /* HACK - to test it with J2ME */
+        byte[] tmp = new byte[1];
+        tmp[0] = b;
+        md.update(tmp);
+    }
+
+    public void updateBytes(byte[] b) {
+        md.update(b);
+    }
+
+    public void updateUINT32(int v) {
+        md.update((byte)(v >> 24));
+        md.update((byte)(v >> 16));
+        md.update((byte)(v >> 8));
+        md.update((byte)(v));
+    }
+
+    public void updateByteString(byte[] b) {
+        updateUINT32(b.length);
+        updateBytes(b);
+    }
+
+    public void updateBigInt(BigInteger b) {
+        updateByteString(b.toByteArray());
+    }
+
+    public void reset() {
+        md.reset();
+    }
+
+    public int getDigestLength() {
+        return md.getDigestLength();
+    }
+
+    public byte[] getDigest() {
+        byte[] tmp = new byte[md.getDigestLength()];
+        getDigest(tmp);
+        return tmp;
+    }
+
+    public void getDigest(byte[] out) {
+        getDigest(out, 0);
+    }
+
+    public void getDigest(byte[] out, int off) {
+        try {
+            md.digest(out, off, out.length - off);
+        }
+        catch (DigestException e) {
+            // TODO is this right?!
+            throw new RuntimeException("Unable to digest", e);
+        }
+    }
+}