/* * @(#)MessageDigest.java 1.7 95/08/15 * * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. Please refer to the file "copyright.html" * for further important copyright and licensing information. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. * * Updated to JDK 1.0.2 levels by Chuck McManis * * This file was obtained from: http://www.mcmanis.com/~cmcmanis/java/src/util/crypt/MessageDigest.java * More information can be found here: http://www.mcmanis.com/~cmcmanis/java/ */ package com.ssttr.crypto; import jimm.comm.Util; //import java.io.InputStream; /** * The MessageDigest class defines a general class for computing digest * functions. It is defined as an abstract class that is subclassed by * message digest algorithms. In this way the PKCS classes can be built * to take a MessageDigest object without needing to know what 'kind' * of message digest they are computing. * <p/> * This class defines the standard functions that all message digest * algorithms share, and ways to put all Java fundamental types into * the digest. It does not define methods for digestifying either * arbitrary objects or arrays of objects however. * * @author Chuck McManis * @version 5 Oct 1996, 1.8 */ public abstract class MessageDigest { /** * the actual digest bits. */ public byte digestBits[]; /** * status of the digest */ public boolean digestValid; /** * This function is used to initialize any internal digest * variables or parameters. */ public abstract void init(); /** * The basic unit of digestifying is the byte. This method is * defined by the particular algorithim's subclass for that * algorithim. Subsequent versions of this method defined here * decompose the basic type into bytes and call this function. * If special processing is needed for a particular type your * subclass should override the method for that type. */ public abstract void update(byte aValue); /** * Add a short value to the digest. */ public synchronized void update(short aValue) { byte b1, b2; b1 = (byte) ((aValue >>> 8) & 0xff); b2 = (byte) (aValue & 0xff); update(b1); update(b2); } /** * Add an integer value to the digest. */ public synchronized void update(int aValue) { byte b; for (int i = 3; i >= 0; i--) { b = (byte) ((aValue >>> (i * 8)) & 0xff); update(b); } } /** * Add a long to the digest. */ public synchronized void update(long aValue) { byte b; for (int i = 7; i >= 0; i--) { b = (byte) ((aValue >>> (i * 8)) & 0xff); update(b); } } /** * Add specific bytes to the digest. */ public synchronized void update(byte input[], int offset, int len) { for (int i = 0; i < len; i++) { update(input[i + offset]); } } /** * Add an array of bytes to the digest. */ public synchronized void update(byte input[]) { update(input, 0, input.length); } /** * Add the bytes in the String 'input' to the current digest. * Note that the string characters are treated as unicode chars * of 16 bits each. To digestify ISO-Latin1 strings (ASCII) use * the updateASCII() method. */ public void update(String input) { int i, len; short x; len = input.length(); for (i = 0; i < len; i++) { x = (short) input.charAt(i); update(x); } } /** * Treat the string as a sequence of ISO-Latin1 (8 bit) characters. */ public void updateASCII(String input) { int i, len; byte x; len = input.length(); for (i = 0; i < len; i++) { x = (byte) (input.charAt(i) & 0xff); update(x); } } /** * Perform the final computations and cleanup. */ public abstract void finish(); /** * Return a string representation of this object. * public String toString() { * ByteArrayOutputStream ou = new ByteArrayOutputStream(); * PrintStream p = new PrintStream(ou); * <p/> * p.print(this.getClass().getName()+" Message Digest "); * if (digestValid) { * p.print("<"); * for(int i = 0; i < digestBits.length; i++) * hexDigit(p, digestBits[i]); * p.print(">"); * } else { * p.print("<incomplete>"); * } * p.println(); * return (ou.toString()); * } */ public byte[] getDigestBits() { return (digestValid) ? digestBits : null; } public String getDigestHex() { if (!digestValid) return null; StringBuilder out = new StringBuilder(); int len = digestBits.length; for (int i = 0; i < len; i++) { String hex = Integer.toHexString(((int)digestBits[i]) & 0xFF); if (1 == hex.length()) out.append(0); out.append(hex); } return out.toString(); } public String getDigestBase64() { return Util.base64encode(digestBits); } /** * Return a string that represents the algorithim of this * message digest. */ public abstract String getAlg(); //static byte testdata[]; }