summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasey Marshall <csm@gnu.org>2006-03-11 05:15:47 +0000
committerCasey Marshall <csm@gnu.org>2006-03-11 05:15:47 +0000
commit64ca6867ea43ae35457c78c6433d01338be3a30e (patch)
tree04bd563fa7ad0052c1f1ce07f027eb3d0d55b6f5
parent85cc85d08891c53fd53d2eb8c06d4b8955f8fc9b (diff)
downloadclasspath-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-nio48
-rw-r--r--javax/crypto/Cipher.java82
-rw-r--r--javax/crypto/CipherSpi.java49
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