diff options
Diffstat (limited to 'libjava/classpath/gnu/java/security/hash/MD2.java')
| -rw-r--r-- | libjava/classpath/gnu/java/security/hash/MD2.java | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/libjava/classpath/gnu/java/security/hash/MD2.java b/libjava/classpath/gnu/java/security/hash/MD2.java deleted file mode 100644 index d78af93fabd..00000000000 --- a/libjava/classpath/gnu/java/security/hash/MD2.java +++ /dev/null @@ -1,256 +0,0 @@ -/* MD2.java -- - Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc. - -This file is a part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at -your option) any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 -USA - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package gnu.java.security.hash; - -import gnu.java.security.Registry; -import gnu.java.security.util.Util; - -/** - * An implementation of the MD2 message digest algorithm. - * <p> - * MD2 is not widely used. Unless it is needed for compatibility with - * existing systems, it is not recommended for use in new applications. - * <p> - * References: - * <ol> - * <li>The <a href="http://www.ietf.org/rfc/rfc1319.txt">MD2</a> - * Message-Digest Algorithm.<br> - * B. Kaliski.</li> - * <li>The <a href="http://www.rfc-editor.org/errata.html">RFC ERRATA PAGE</a> - * under section RFC 1319.</li> - * </ol> - */ -public class MD2 - extends BaseHash -{ - /** An MD2 message digest is always 128-bits long, or 16 bytes. */ - private static final int DIGEST_LENGTH = 16; - - /** The MD2 algorithm operates on 128-bit blocks, or 16 bytes. */ - private static final int BLOCK_LENGTH = 16; - - /** 256 byte "random" permutation of the digits of pi. */ - private static final byte[] PI = { - 41, 46, 67, -55, -94, -40, 124, 1, - 61, 54, 84, -95, -20, -16, 6, 19, - 98, -89, 5, -13, -64, -57, 115, -116, - -104, -109, 43, -39, -68, 76, -126, -54, - 30, -101, 87, 60, -3, -44, -32, 22, - 103, 66, 111, 24, -118, 23, -27, 18, - -66, 78, -60, -42, -38, -98, -34, 73, - -96, -5, -11, -114, -69, 47, -18, 122, - -87, 104, 121, -111, 21, -78, 7, 63, - -108, -62, 16, -119, 11, 34, 95, 33, - -128, 127, 93, -102, 90, -112, 50, 39, - 53, 62, -52, -25, -65, -9, -105, 3, - -1, 25, 48, -77, 72, -91, -75, -47, - -41, 94, -110, 42, -84, 86, -86, -58, - 79, -72, 56, -46, -106, -92, 125, -74, - 118, -4, 107, -30, -100, 116, 4, -15, - 69, -99, 112, 89, 100, 113, -121, 32, - -122, 91, -49, 101, -26, 45, -88, 2, - 27, 96, 37, -83, -82, -80, -71, -10, - 28, 70, 97, 105, 52, 64, 126, 15, - 85, 71, -93, 35, -35, 81, -81, 58, - -61, 92, -7, -50, -70, -59, -22, 38, - 44, 83, 13, 110, -123, 40, -124, 9, - -45, -33, -51, -12, 65, -127, 77, 82, - 106, -36, 55, -56, 108, -63, -85, -6, - 36, -31, 123, 8, 12, -67, -79, 74, - 120, -120, -107, -117, -29, 99, -24, 109, - -23, -53, -43, -2, 59, 0, 29, 57, - -14, -17, -73, 14, 102, 88, -48, -28, - -90, 119, 114, -8, -21, 117, 75, 10, - 49, 68, 80, -76, -113, -19, 31, 26, - -37, -103, -115, 51, - 97, 17, -125, 20 }; - - /** The output of this message digest when no data has been input. */ - private static final String DIGEST0 = "8350E5A3E24C153DF2275C9F80692773"; - - /** caches the result of the correctness test, once executed. */ - private static Boolean valid; - - /** The checksum computed so far. */ - private byte[] checksum; - - /** - * Work array needed by encrypt method. First <code>BLOCK_LENGTH</code> bytes - * are also used to store the running digest. - */ - private byte[] work; - - /** Creates a new MD2 digest ready for use. */ - public MD2() - { - super(Registry.MD2_HASH, DIGEST_LENGTH, BLOCK_LENGTH); - } - - /** - * Private constructor used for cloning. - * - * @param md2 the instance to clone. - */ - private MD2(MD2 md2) - { - this(); - - // superclass field - this.count = md2.count; - this.buffer = (byte[]) md2.buffer.clone(); - // private field - this.checksum = (byte[]) md2.checksum.clone(); - this.work = (byte[]) md2.work.clone(); - } - - public Object clone() - { - return new MD2(this); - } - - protected byte[] getResult() - { - byte[] result = new byte[DIGEST_LENGTH]; - // Encrypt checksum as last block. - encryptBlock(checksum, 0); - for (int i = 0; i < BLOCK_LENGTH; i++) - result[i] = work[i]; - - return result; - } - - protected void resetContext() - { - checksum = new byte[BLOCK_LENGTH]; - work = new byte[BLOCK_LENGTH * 3]; - } - - public boolean selfTest() - { - if (valid == null) - { - String d = Util.toString(new MD2().digest()); - valid = Boolean.valueOf(DIGEST0.equals(d)); - } - return valid.booleanValue(); - } - - /** - * Generates an array of padding bytes. The padding is defined as - * <code>i</code> bytes of value <code>i</code>, where <code>i</code> is the - * number of bytes to fill the last block of the message to - * <code>BLOCK_LENGTH</code> bytes (or <code>BLOCK_LENGTH</code> bytes when - * the last block was completely full). - * - * @return the bytes to pad the remaining bytes in the buffer before - * completing a hash operation. - */ - protected byte[] padBuffer() - { - int length = BLOCK_LENGTH - (int) (count % BLOCK_LENGTH); - if (length == 0) - length = BLOCK_LENGTH; - - byte[] pad = new byte[length]; - for (int i = 0; i < length; i++) - pad[i] = (byte) length; - - return pad; - } - - /** - * Adds <code>BLOCK_LENGTH</code> bytes to the running digest. - * - * @param in the byte array to take the <code>BLOCK_LENGTH</code> bytes from. - * @param off the offset to start from in the given byte array. - */ - protected void transform(byte[] in, int off) - { - updateCheckSumAndEncryptBlock(in, off); - } - - /** - * Adds a new block (<code>BLOCK_LENGTH</code> bytes) to the running digest - * from the given byte array starting from the given offset. - */ - private void encryptBlock(byte[] in, int off) - { - for (int i = 0; i < BLOCK_LENGTH; i++) - { - byte b = in[off + i]; - work[BLOCK_LENGTH + i] = b; - work[BLOCK_LENGTH * 2 + i] = (byte)(work[i] ^ b); - } - byte t = 0; - for (int i = 0; i < 18; i++) - { - for (int j = 0; j < 3 * BLOCK_LENGTH; j++) - { - t = (byte)(work[j] ^ PI[t & 0xFF]); - work[j] = t; - } - t = (byte)(t + i); - } - } - - /** - * Optimized method that combines a checksum update and encrypt of a block. - */ - private void updateCheckSumAndEncryptBlock(byte[] in, int off) - { - byte l = checksum[BLOCK_LENGTH - 1]; - for (int i = 0; i < BLOCK_LENGTH; i++) - { - byte b = in[off + i]; - work[BLOCK_LENGTH + i] = b; - work[BLOCK_LENGTH * 2 + i] = (byte)(work[i] ^ b); - l = (byte)(checksum[i] ^ PI[(b ^ l) & 0xFF]); - checksum[i] = l; - } - byte t = 0; - for (int i = 0; i < 18; i++) - { - for (int j = 0; j < 3 * BLOCK_LENGTH; j++) - { - t = (byte)(work[j] ^ PI[t & 0xFF]); - work[j] = t; - } - t = (byte)(t + i); - } - } -} |
