view 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 source


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);
        }
    }
}