diff options
author | Casey Marshall <csm@gnu.org> | 2006-03-11 05:15:47 +0000 |
---|---|---|
committer | Casey Marshall <csm@gnu.org> | 2006-03-11 05:15:47 +0000 |
commit | 64ca6867ea43ae35457c78c6433d01338be3a30e (patch) | |
tree | 04bd563fa7ad0052c1f1ce07f027eb3d0d55b6f5 | |
parent | 85cc85d08891c53fd53d2eb8c06d4b8955f8fc9b (diff) | |
download | classpath-64ca6867ea43ae35457c78c6433d01338be3a30e.tar.gz |
2006-03-10 Casey Marshall <csm@gnu.org>
Fixes PR 23768.
* javax/crypto/Cipher.java (doFinal, doFinal, doFinal): don't
reset `state.'
(doFinal, update): new methods.
(init, init, init, init): initialize `state' after trying the
implementation, which can throw an exception.
* javax/crypto/CipherSpi.java (engineDoFinal, engineUpdate): new
methods.
-rw-r--r-- | ChangeLog-jessie-nio | 48 | ||||
-rw-r--r-- | javax/crypto/Cipher.java | 82 | ||||
-rw-r--r-- | javax/crypto/CipherSpi.java | 49 |
3 files changed, 170 insertions, 9 deletions
diff --git a/ChangeLog-jessie-nio b/ChangeLog-jessie-nio index 82b5e065a..97552aefc 100644 --- a/ChangeLog-jessie-nio +++ b/ChangeLog-jessie-nio @@ -1,3 +1,51 @@ +2006-03-10 Casey Marshall <csm@gnu.org> + + Fixes PR 23768. + * javax/crypto/Cipher.java (doFinal, doFinal, doFinal): don't + reset `state.' + (doFinal, update): new methods. + (init, init, init, init): initialize `state' after trying the + implementation, which can throw an exception. + * javax/crypto/CipherSpi.java (engineDoFinal, engineUpdate): new + methods. + +2006-03-06 Casey Marshall <csm@gnu.org> + + * gnu/javax/net/ssl/provider/Alert.java: modified to use backing + byte buffer. + * gnu/javax/net/ssl/provider/Certificate.java: likewise. + * gnu/javax/net/ssl/provider/CertificateRequest.java: likewise. + * gnu/javax/net/ssl/provider/CertificateVerify.java: likewise. + * gnu/javax/net/ssl/provider/CipherSuite.java: modified to use + backing byte buffer; use enumerations instead of string constants; + use JCE instead of GNU Crypto API. + * gnu/javax/net/ssl/provider/ClientHello.java: modified to use + backing byte buffer. + * gnu/javax/net/ssl/provider/ClientKeyExchange.java: likewise. + * gnu/javax/net/ssl/provider/CompressionMethod.java: likewise. + * gnu/javax/net/ssl/provider/Constructed.java + (getLength): new method. + (write): removed. + (toString): new method. + * gnu/javax/net/ssl/provider/ContentType.java + (forInteger): new method. + * gnu/javax/net/ssl/provider/Finished.java: modified to use + backing byte buffer. + * gnu/javax/net/ssl/provider/Handshake.java: likewise. + * gnu/javax/net/ssl/provider/ProtocolVersion.java + (getInstance): new method. + (write): removed. + (getLength): new method. + (getRawValue): new method. + (toString): new method. + * gnu/javax/net/ssl/provider/Random.java: modified to use backing + byte buffer. + * gnu/javax/net/ssl/provider/ServerHello.java: likewise. + * gnu/javax/net/ssl/provider/ServerKeyExchange.java: likewise. + * gnu/javax/net/ssl/provider/Signature.java: likewise. + * gnu/javax/net/ssl/provider/Util.java + (hexDump, hexDump): new methods. + 2006-03-06 Casey Marshall <csm@gnu.org> * gnu/javax/net/ssl/provider/CipherAlgorithm.java diff --git a/javax/crypto/Cipher.java b/javax/crypto/Cipher.java index b9dee74d5..1f68ea605 100644 --- a/javax/crypto/Cipher.java +++ b/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. diff --git a/javax/crypto/CipherSpi.java b/javax/crypto/CipherSpi.java index a51a3aed6..194c1dabf 100644 --- a/javax/crypto/CipherSpi.java +++ b/javax/crypto/CipherSpi.java @@ -1,5 +1,5 @@ /* CipherSpi.java -- The cipher service provider interface. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,6 +38,8 @@ exception statement from your version. */ package javax.crypto; +import java.nio.ByteBuffer; + import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -179,6 +181,31 @@ public abstract class CipherSpi throws IllegalBlockSizeException, BadPaddingException, ShortBufferException; /** + * @since 1.5 + */ + protected int engineDoFinal (ByteBuffer input, ByteBuffer output) + throws BadPaddingException, IllegalBlockSizeException, + ShortBufferException + { + int total = 0; + byte[] inbuf = new byte[256]; + while (input.hasRemaining ()) + { + int in = Math.min (inbuf.length, input.remaining ()); + input.get (inbuf, 0, in); + byte[] outbuf = new byte[engineGetOutputSize (in)]; + int out = 0; + if (input.hasRemaining ()) // i.e., we have more 'update' calls + out = engineUpdate (inbuf, 0, in, outbuf, 0); + else + out = engineDoFinal (inbuf, 0, in, outbuf, 0); + output.put (outbuf, 0, out); + total += out; + } + return total; + } + + /** * Returns the block size of the underlying cipher. * * @return The block size. @@ -380,6 +407,26 @@ public abstract class CipherSpi throws ShortBufferException; /** + * @since 1.5 + */ + protected int engineUpdate (ByteBuffer input, ByteBuffer output) + throws ShortBufferException + { + int total = 0; + byte[] inbuf = new byte[256]; + while (input.hasRemaining ()) + { + int in = Math.min (inbuf.length, input.remaining ()); + input.get (inbuf, 0, in); + byte[] outbuf = new byte[engineGetOutputSize (in)]; + int out = engineUpdate (inbuf, 0, in, outbuf, 0); + output.put (outbuf, 0, out); + total += out; + } + return total; + } + + /** * <p>Wrap a key.</p> * * <p>For compatibility this method is not declared |