FileDocCategorySizeDatePackage
XYZMessageDigestSpi.javaAPI DocExample2616Sun Oct 25 18:13:36 GMT 1998None

XYZMessageDigestSpi.java

/*
 *
 * Copyright (c) 1998 Scott Oaks. 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.
 *
 * This sample source code is provided for example only,
 * on an unsupported, as-is basis. 
 *
 * AUTHOR 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. AUTHOR SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 *
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  AUTHOR
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */


import java.security.*;

// This class follows the 1.2 implementation of a message digest.  However,
// it must be placed in a file actually called XYZMessageDigest.java, but
// the 1.1 implementation of that class already exists in that file.
public class XYZMessageDigest extends MessageDigestSpi implements Cloneable {
	private int hash;
	private int store;
	private int nBytes;

	public XYZMessageDigest() {
		engineReset();
	}

	public void engineUpdate(byte b) {
		switch(nBytes) {
			case 0:
				store =  (b << 24) & 0xff000000;
				break;
			case 1:
				store |= (b << 16) & 0x00ff0000;
				break;
			case 2:
				store |= (b <<  8) & 0x0000ff00;
				break;
			case 3:
				store |= (b <<  0) & 0x000000ff;
				break;
		}
		nBytes++;
		if (nBytes == 4) {
			hash = hash ^ store;
			nBytes = 0;
			store = 0;
		}
	}

	public void engineUpdate(byte b[], int offset, int length) {
		for (int i = 0; i < length; i++)
			engineUpdate(b[i + offset]);
	}

	public void engineReset() {
		hash = 0;
		store = 0;
		nBytes = 0;
	}

	public byte[] engineDigest() {
		while (nBytes != 0)
			engineUpdate((byte) 0);
		byte b[] = new byte[4];
		b[0] = (byte) (hash >>> 24);
		b[1] = (byte) (hash >>> 16);
		b[2] = (byte) (hash >>>  8);
		b[3] = (byte) (hash >>>  0);
		engineReset();
		return b;
	}
}