diff -r fd16c54261b3 -r 90ce3da70b43 jdk/src/share/classes/javax/crypto/MacSpi.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/crypto/MacSpi.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,153 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.crypto; + +import java.security.*; +import java.security.spec.*; + +import java.nio.ByteBuffer; + +/** + * This class defines the Service Provider Interface (SPI) + * for the Mac class. + * All the abstract methods in this class must be implemented by each + * cryptographic service provider who wishes to supply the implementation + * of a particular MAC algorithm. + * + *

Implementations are free to implement the Cloneable interface. + * + * @author Jan Luehe + * + * @since 1.4 + */ + +public abstract class MacSpi { + + /** + * Returns the length of the MAC in bytes. + * + * @return the MAC length in bytes. + */ + protected abstract int engineGetMacLength(); + + /** + * Initializes the MAC with the given (secret) key and algorithm + * parameters. + * + * @param key the (secret) key. + * @param params the algorithm parameters. + * + * @exception InvalidKeyException if the given key is inappropriate for + * initializing this MAC. + * @exception InvalidAlgorithmParameterException if the given algorithm + * parameters are inappropriate for this MAC. + */ + protected abstract void engineInit(Key key, + AlgorithmParameterSpec params) + throws InvalidKeyException, InvalidAlgorithmParameterException ; + + /** + * Processes the given byte. + * + * @param input the input byte to be processed. + */ + protected abstract void engineUpdate(byte input); + + /** + * Processes the first len bytes in input, + * starting at offset inclusive. + * + * @param input the input buffer. + * @param offset the offset in input where the input starts. + * @param len the number of bytes to process. + */ + protected abstract void engineUpdate(byte[] input, int offset, int len); + + /** + * Processes input.remaining() bytes in the ByteBuffer + * input, starting at input.position(). + * Upon return, the buffer's position will be equal to its limit; + * its limit will not have changed. + * + *

Subclasses should consider overriding this method if they can + * process ByteBuffers more efficiently than byte arrays. + * + * @param input the ByteBuffer + * @since 1.5 + */ + protected void engineUpdate(ByteBuffer input) { + if (input.hasRemaining() == false) { + return; + } + if (input.hasArray()) { + byte[] b = input.array(); + int ofs = input.arrayOffset(); + int pos = input.position(); + int lim = input.limit(); + engineUpdate(b, ofs + pos, lim - pos); + input.position(lim); + } else { + int len = input.remaining(); + byte[] b = new byte[CipherSpi.getTempArraySize(len)]; + while (len > 0) { + int chunk = Math.min(len, b.length); + input.get(b, 0, chunk); + engineUpdate(b, 0, chunk); + len -= chunk; + } + } + } + + /** + * Completes the MAC computation and resets the MAC for further use, + * maintaining the secret key that the MAC was initialized with. + * + * @return the MAC result. + */ + protected abstract byte[] engineDoFinal(); + + /** + * Resets the MAC for further use, maintaining the secret key that the + * MAC was initialized with. + */ + protected abstract void engineReset(); + + /** + * Returns a clone if the implementation is cloneable. + * + * @return a clone if the implementation is cloneable. + * + * @exception CloneNotSupportedException if this is called + * on an implementation that does not support Cloneable. + */ + public Object clone() throws CloneNotSupportedException { + if (this instanceof Cloneable) { + return super.clone(); + } else { + throw new CloneNotSupportedException(); + } + } +}