001: /*
002: * @(#)SHA3.java 1.6 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package sun.security.provider;
028:
029: import java.security.*;
030: import java.math.BigInteger;
031:
032: /**
033: * This class implements the Secure Hash Algorithm SHA-384 developed by
034: * the National Institute of Standards and Technology along with the
035: * National Security Agency.
036: *
037: * <p>It implements java.security.MessageDigestSpi, and can be used
038: * through Java Cryptography Architecture (JCA), as a pluggable
039: * MessageDigest implementation.
040: *
041: * @version 1.6 10/10/06
042: * @author Valerie Peng
043: */
044:
045: public class SHA3 extends SHA5 {
046:
047: private static final int LENGTH = 48;
048: private static final long[] INITIAL_HASHES = { 0xcbbb9d5dc1059ed8L,
049: 0x629a292a367cd507L, 0x9159015a3070dd17L,
050: 0x152fecd8f70e5939L, 0x67332667ffc00b31L,
051: 0x8eb44a8768581511L, 0xdb0c2e0d64f98fa7L,
052: 0x47b5481dbefa4fa4L };
053:
054: public SHA3() {
055: init();
056: }
057:
058: private SHA3(SHA3 that) {
059: super ((SHA5) that);
060: }
061:
062: void init() {
063: super .init();
064: setInitialHash(INITIAL_HASHES);
065: }
066:
067: /**
068: * Return the length of the digest in bytes
069: */
070: protected int engineGetDigestLength() {
071: return (LENGTH);
072: }
073:
074: /**
075: * Computes the final hash and returns the final value as a
076: * byte[48] array. The object is reset to be ready for further
077: * use, as specified in the JavaSecurity MessageDigest
078: * specification.
079: */
080: protected byte[] engineDigest() {
081: byte[] sha5hashvalue = super .engineDigest();
082: byte[] hashvalue = new byte[LENGTH];
083: System.arraycopy(sha5hashvalue, 0, hashvalue, 0, LENGTH);
084: return hashvalue;
085: }
086:
087: /**
088: * Resets the buffers and hash value to start a new hash.
089: */
090: protected void engineReset() {
091: init();
092: }
093:
094: /**
095: * Computes the final hash and returns the final value as a
096: * byte[48] array. The object is reset to be ready for further
097: * use, as specified in the JavaSecurity MessageDigest
098: * specification.
099: * @param hashvalue buffer to hold the digest
100: * @param offset offset for storing the digest
101: * @param len length of the buffer
102: * @return length of the digest in bytes
103: */
104: protected int engineDigest(byte[] hashvalue, int offset, int len)
105: throws DigestException {
106:
107: if (len < LENGTH)
108: throw new DigestException("partial digests not returned");
109: if (hashvalue.length - offset < LENGTH)
110: throw new DigestException(
111: "insufficient space in the output "
112: + "buffer to store the digest");
113: super .performDigest(hashvalue, offset, LENGTH);
114: return LENGTH;
115: }
116:
117: /*
118: * Clones this object.
119: */
120: public Object clone() {
121: SHA3 that = null;
122: that = new SHA3(this);
123: return that;
124: }
125:
126: }
|