|  | // SimpleSHSStream.java | 
|  |  | 
|  | /* Copyright (C) 2000  Free Software Foundation | 
|  |  | 
|  | This file is part of libgcj. | 
|  |  | 
|  | This software is copyrighted work licensed under the terms of the | 
|  | Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for | 
|  | details.  */ | 
|  |  | 
|  | package gnu.gcj.io; | 
|  | import java.io.Serializable; | 
|  | import java.io.*; | 
|  | import java.lang.reflect.*; | 
|  |  | 
|  | public class SimpleSHSStream extends java.io.DataOutputStream | 
|  | { | 
|  | int counter; | 
|  |  | 
|  | final int SHS_BLOCKSIZE = 64; | 
|  | final int SHS_DIGESTSIZE = 20; | 
|  |  | 
|  | byte buf[]; | 
|  | byte shs_info[]; | 
|  |  | 
|  | native static byte [] shsFinal (byte info[]); | 
|  | native static void shsUpdate (byte info[], byte buf[], int count); | 
|  | native static byte [] shsInit (); | 
|  |  | 
|  | private void update (byte b) | 
|  | { | 
|  | buf [counter++] = b; | 
|  | if (counter % SHS_BLOCKSIZE == 0) | 
|  | { | 
|  | counter = 0; | 
|  | shsUpdate (shs_info, buf, SHS_BLOCKSIZE); | 
|  | } | 
|  | } | 
|  |  | 
|  | public void write (int b) throws IOException | 
|  | { | 
|  | update ((byte)b); | 
|  | super.write (b); | 
|  | } | 
|  |  | 
|  | public void write (byte[] b, int off, int len) throws IOException | 
|  | { | 
|  | for (int i = 0; i < len; i++) | 
|  | write (b[i+off]); | 
|  | } | 
|  |  | 
|  | public byte[] digest() | 
|  | { | 
|  | shsUpdate (shs_info, buf, counter); | 
|  | return shsFinal (shs_info); | 
|  | } | 
|  |  | 
|  | public SimpleSHSStream (OutputStream out) | 
|  | { | 
|  | super (out); | 
|  | buf = new byte[SHS_BLOCKSIZE]; | 
|  | shs_info = shsInit (); | 
|  | counter = 0; | 
|  | } | 
|  | } | 
|  |  |