1/*
2 * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
3 * Please refer to the LICENSE.txt for licensing details.
4 */
5package ch.ethz.ssh2.crypto.digest;
6
7import java.math.BigInteger;
8
9/**
10 * HashForSSH2Types.
11 *
12 * @author Christian Plattner
13 * @version 2.50, 03/15/10
14 */
15public class HashForSSH2Types
16{
17	Digest md;
18
19	public HashForSSH2Types(Digest md)
20	{
21		this.md = md;
22	}
23
24	public HashForSSH2Types(String type)
25	{
26		if (type.equals("SHA1"))
27		{
28			md = new SHA1();
29		}
30		else if (type.equals("MD5"))
31		{
32			md = new MD5();
33		}
34		else
35			throw new IllegalArgumentException("Unknown algorithm " + type);
36	}
37
38	public void updateByte(byte b)
39	{
40		/* HACK - to test it with J2ME */
41		byte[] tmp = new byte[1];
42		tmp[0] = b;
43		md.update(tmp);
44	}
45
46	public void updateBytes(byte[] b)
47	{
48		md.update(b);
49	}
50
51	public void updateUINT32(int v)
52	{
53		md.update((byte) (v >> 24));
54		md.update((byte) (v >> 16));
55		md.update((byte) (v >> 8));
56		md.update((byte) (v));
57	}
58
59	public void updateByteString(byte[] b)
60	{
61		updateUINT32(b.length);
62		updateBytes(b);
63	}
64
65	public void updateBigInt(BigInteger b)
66	{
67		updateByteString(b.toByteArray());
68	}
69
70	public void reset()
71	{
72		md.reset();
73	}
74
75	public int getDigestLength()
76	{
77		return md.getDigestLength();
78	}
79
80	public byte[] getDigest()
81	{
82		byte[] tmp = new byte[md.getDigestLength()];
83		getDigest(tmp);
84		return tmp;
85	}
86
87	public void getDigest(byte[] out)
88	{
89		getDigest(out, 0);
90	}
91
92	public void getDigest(byte[] out, int off)
93	{
94		md.digest(out, off);
95	}
96}
97