diff options
Diffstat (limited to 'libjava/classpath/javax/crypto/Cipher.java')
-rw-r--r-- | libjava/classpath/javax/crypto/Cipher.java | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/libjava/classpath/javax/crypto/Cipher.java b/libjava/classpath/javax/crypto/Cipher.java index b9dee74d51a..1f68ea60528 100644 --- a/libjava/classpath/javax/crypto/Cipher.java +++ b/libjava/classpath/javax/crypto/Cipher.java @@ -1,5 +1,5 @@ /* Cipher.java -- Interface to a cryptographic cipher. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -40,6 +40,9 @@ package javax.crypto; import gnu.java.security.Engine; +import java.nio.ByteBuffer; +import java.nio.ReadOnlyBufferException; + import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -496,7 +499,6 @@ public class Cipher { throw new IllegalStateException("neither encrypting nor decrypting"); } - state = INITIAL_STATE; return cipherSpi.engineDoFinal(input, inputOffset, inputLength); } @@ -532,7 +534,6 @@ public class Cipher { throw new IllegalStateException("neither encrypting nor decrypting"); } - state = INITIAL_STATE; return cipherSpi.engineDoFinal(new byte[0], 0, 0, output, outputOffset); } @@ -576,7 +577,6 @@ public class Cipher { throw new IllegalStateException("neither encrypting nor decrypting"); } - state = INITIAL_STATE; return cipherSpi.engineDoFinal(input, inputOffset, inputLength, output, outputOffset); } @@ -590,6 +590,43 @@ public class Cipher } /** + * Finishes a multi-part transformation with, or completely + * transforms, a byte buffer, and stores the result into the output + * buffer. + * + * @param input The input buffer. + * @param output The output buffer. + * @return The number of bytes stored into the output buffer. + * @throws IllegalArgumentException If the input and output buffers + * are the same object. + * @throws IllegalStateException If this cipher was not initialized + * for encryption or decryption. + * @throws ReadOnlyBufferException If the output buffer is not + * writable. + * @throws IllegalBlockSizeException If this cipher requires a total + * input that is a multiple of its block size to complete this + * transformation. + * @throws ShortBufferException If the output buffer is not large + * enough to hold the transformed bytes. + * @throws BadPaddingException If the cipher is a block cipher with + * a padding scheme, and the decrypted bytes do not end with a + * valid padding. + * @since 1.5 + */ + public final int doFinal (ByteBuffer input, ByteBuffer output) + throws ReadOnlyBufferException, ShortBufferException, + BadPaddingException, IllegalBlockSizeException + { + if (input == output) + throw new IllegalArgumentException + ("input and output buffers cannot be the same"); + if (state != ENCRYPT_MODE && state != DECRYPT_MODE) + throw new IllegalStateException + ("not initialized for encrypting or decrypting"); + return cipherSpi.engineDoFinal (input, output); + } + + /** * Returns the size an output buffer needs to be if this cipher is * updated with a number of bytes. * @@ -672,11 +709,11 @@ public class Cipher */ public final void init(int opmode, Key key) throws InvalidKeyException { - state = opmode; if (cipherSpi != null) { cipherSpi.engineInit(opmode, key, new SecureRandom()); } + state = opmode; } /** @@ -791,11 +828,11 @@ public class Cipher public final void init(int opmode, Key key, SecureRandom random) throws InvalidKeyException { - state = opmode; if (cipherSpi != null) { cipherSpi.engineInit(opmode, key, random); } + state = opmode; } /** @@ -890,11 +927,11 @@ public class Cipher SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { - state = opmode; if (cipherSpi != null) { cipherSpi.engineInit(opmode, key, params, random); } + state = opmode; } /** @@ -925,11 +962,11 @@ public class Cipher SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { - state = opmode; if (cipherSpi != null) { cipherSpi.engineInit(opmode, key, params, random); } + state = opmode; } /** @@ -1068,6 +1105,35 @@ public class Cipher } /** + * Continue a multi-part transformation on a byte buffer, storing + * the transformed bytes into another buffer. + * + * @param input The input buffer. + * @param output The output buffer. + * @return The number of bytes stored in <i>output</i>. + * @throws IllegalArgumentException If the two buffers are the same + * object. + * @throws IllegalStateException If this cipher was not initialized + * for encrypting or decrypting. + * @throws ReadOnlyBufferException If the output buffer is not + * writable. + * @throws ShortBufferException If the output buffer does not have + * enough available space for the transformed bytes. + * @since 1.5 + */ + public final int update (ByteBuffer input, ByteBuffer output) + throws ReadOnlyBufferException, ShortBufferException + { + if (input == output) + throw new IllegalArgumentException + ("input and output buffers must be different"); + if (state != ENCRYPT_MODE && state != DECRYPT_MODE) + throw new IllegalStateException + ("not initialized for encryption or decryption"); + return cipherSpi.engineUpdate (input, output); + } + + /** * Wrap a key. * * @param key The key to wrap. |