finished last of the compile errors
[org.ibex.crypto.git] / src / org / ibex / crypto / Digest.java
1 /* Copyright (c) 2000 The Legion Of The Bouncy Castle 
2  * (http://www.bouncycastle.org)
3  * 
4  * Permission is hereby granted, free of charge, to any person obtaining a 
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation 
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
8  * and/or sell copies of the Software, and to permit persons to whom the 
9  * Software is furnished to do so, subject to the following conditions:
10  * 
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  * 
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDER.S BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
20  * DEALINGS IN THE SOFTWARE.
21  */
22
23 package org.ibex.crypto;
24
25 /**
26  * base implementation of MD4 family style digest as outlined in
27  * "Handbook of Applied Cryptography", pages 344 - 347.
28  */
29 public abstract class Digest {
30     private byte[]  xBuf;
31     private int     xBufOff;
32     private long    byteCount;
33
34     protected Digest() { xBuf = new byte[4]; xBufOff = 0; }
35     public void update(byte in) {
36         xBuf[xBufOff++] = in;
37         if (xBufOff == xBuf.length) {
38             processWord(xBuf, 0);
39             xBufOff = 0;
40         }
41         byteCount++;
42     }
43
44     public void update(byte[] in, int inOff, int len) {
45         // fill the current word
46         while ((xBufOff != 0) && (len > 0)) {
47             update(in[inOff]);
48             inOff++;
49             len--;
50         }
51
52         // process whole words.
53         while (len > xBuf.length) {
54             processWord(in, inOff);
55             inOff += xBuf.length;
56             len -= xBuf.length;
57             byteCount += xBuf.length;
58         }
59
60         // load in the remainder.
61         while (len > 0) {
62             update(in[inOff]);
63             inOff++;
64             len--;
65         }
66     }
67
68     protected void finish() {
69         long    bitLength = (byteCount << 3);
70         // add the pad bytes.
71         update((byte)128);
72         while (xBufOff != 0) update((byte)0);
73         processLength(bitLength);
74         processBlock();
75     }
76
77     public void reset() {
78         byteCount = 0;
79         xBufOff = 0;
80         for ( int i = 0; i < xBuf.length; i++) xBuf[i] = 0;
81     }
82
83     protected abstract void processWord(byte[] in, int inOff);
84     protected abstract void processLength(long bitLength);
85     protected abstract void processBlock();
86     public abstract int getDigestSize();
87     public abstract void doFinal(byte[] out, int outOff);
88 }