summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew John Hughes <gnu_andrew@member.fsf.org>2011-12-21 15:35:05 +0000
committerAndrew John Hughes <gnu_andrew@member.fsf.org>2011-12-21 15:35:05 +0000
commitcfb247f66654cb201c25771208fb61718165307e (patch)
treee21727f27905181f84b9303b97ff82ab39330277
parent5b6355cb81d5404d359b14b6d8cb49a359831094 (diff)
downloadclasspath-cfb247f66654cb201c25771208fb61718165307e.tar.gz
Fix block-wise chosen-plaintext against SSL/TLS (BEAST) (CVE-2011-3389)
2011-12-01 Andrew John Hughes <ahughes@redhat.com> * gnu/javax/net/ssl/provider/CipherSuite.java: Pass CBC mode to the static CipherSuite instances. (isCBCMode): New variable. (CipherSuite(CipherAlgorithm, KeyExchangeAlgorithm, SignatureAlgorithm, MacAlgorithm, int, int, int, String, boolean)): Allow isCBCMode to be specified. (CipherSuite(CipherAlgorithm, KeyExchangeAlgorithm, boolean, SignatureAlgorithm, MacAlgorithm, int, int, int, String, boolean)): Likewise. (cipher()): Generalise setting of 'alg' to work with any suite that does not use CBC, not just "RC4". (isCBCMode()): New method. Returns true if the CBC mode is used. * gnu/javax/net/ssl/provider/OutputSecurityParameters.java: (enableCBCProtection): Set to true by default of if jsse.enableCBCProtection is true. (needToSplitPayload()): Returns true if TLS < 1.1 is in use with a CBC mode cipher and CBC protection is enabled. * gnu/javax/net/ssl/provider/SSLEngineImpl.java: (wrap(ByteBuffer[], int, int, ByteBuffer)): Send application data as two packets (1 and n - 1) if CBC protection is enabled.
-rw-r--r--ChangeLog23
-rw-r--r--gnu/javax/net/ssl/provider/CipherSuite.java109
-rw-r--r--gnu/javax/net/ssl/provider/OutputSecurityParameters.java18
-rw-r--r--gnu/javax/net/ssl/provider/SSLEngineImpl.java25
4 files changed, 122 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 22cb28c22..bdab7ce03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2011-12-01 Andrew John Hughes <ahughes@redhat.com>
+
+ * gnu/javax/net/ssl/provider/CipherSuite.java:
+ Pass CBC mode to the static CipherSuite instances.
+ (isCBCMode): New variable.
+ (CipherSuite(CipherAlgorithm, KeyExchangeAlgorithm,
+ SignatureAlgorithm, MacAlgorithm, int, int, int, String, boolean)):
+ Allow isCBCMode to be specified.
+ (CipherSuite(CipherAlgorithm, KeyExchangeAlgorithm, boolean,
+ SignatureAlgorithm, MacAlgorithm, int, int, int, String, boolean)):
+ Likewise.
+ (cipher()): Generalise setting of 'alg' to work with any suite
+ that does not use CBC, not just "RC4".
+ (isCBCMode()): New method. Returns true if the CBC mode is used.
+ * gnu/javax/net/ssl/provider/OutputSecurityParameters.java:
+ (enableCBCProtection): Set to true by default of if jsse.enableCBCProtection
+ is true.
+ (needToSplitPayload()): Returns true if TLS < 1.1 is in use with
+ a CBC mode cipher and CBC protection is enabled.
+ * gnu/javax/net/ssl/provider/SSLEngineImpl.java:
+ (wrap(ByteBuffer[], int, int, ByteBuffer)): Send application data
+ as two packets (1 and n - 1) if CBC protection is enabled.
+
2011-10-24 Pekka Enberg <penberg@kernel.org>
* java/util/HashMap.java:
diff --git a/gnu/javax/net/ssl/provider/CipherSuite.java b/gnu/javax/net/ssl/provider/CipherSuite.java
index 1c5923129..e3a0bc4b1 100644
--- a/gnu/javax/net/ssl/provider/CipherSuite.java
+++ b/gnu/javax/net/ssl/provider/CipherSuite.java
@@ -73,127 +73,127 @@ public final class CipherSuite implements Constructed
KeyExchangeAlgorithm.NONE,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.NULL, 0, 0x00, 0x00,
- "TLS_NULL_WITH_NULL_NULL");
+ "TLS_NULL_WITH_NULL_NULL", false);
public static final CipherSuite TLS_RSA_WITH_NULL_MD5 =
new CipherSuite (CipherAlgorithm.NULL,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.MD5, 0, 0x00, 0x01,
- "TLS_RSA_WITH_NULL_MD5");
+ "TLS_RSA_WITH_NULL_MD5", false);
public static final CipherSuite TLS_RSA_WITH_NULL_SHA =
new CipherSuite (CipherAlgorithm.NULL,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 0, 0x00, 0x02,
- "TLS_RSA_WITH_NULL_SHA");
+ "TLS_RSA_WITH_NULL_SHA", false);
public static final CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 =
new CipherSuite (CipherAlgorithm.RC4,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.MD5, 5, 0x00, 0x03,
- "TLS_RSA_EXPORT_WITH_RC4_40_MD5");
+ "TLS_RSA_EXPORT_WITH_RC4_40_MD5", false);
public static final CipherSuite TLS_RSA_WITH_RC4_128_MD5 =
new CipherSuite (CipherAlgorithm.RC4,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.MD5, 16, 0x00, 0x04,
- "TLS_RSA_WITH_RC4_128_MD5");
+ "TLS_RSA_WITH_RC4_128_MD5", false);
public static final CipherSuite TLS_RSA_WITH_RC4_128_SHA =
new CipherSuite (CipherAlgorithm.RC4,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 16, 0x00, 0x05,
- "TLS_RSA_WITH_RC4_128_SHA");
+ "TLS_RSA_WITH_RC4_128_SHA", false);
public static final CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 5, 0x00, 0x08,
- "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA");
+ "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", true);
public static final CipherSuite TLS_RSA_WITH_DES_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 8, 0x00, 0x09,
- "TLS_RSA_WITH_DES_CBC_SHA");
+ "TLS_RSA_WITH_DES_CBC_SHA", true);
public static final CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA =
new CipherSuite (CipherAlgorithm.DESede,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 24, 0x00, 0x0A,
- "TLS_RSA_WITH_3DES_EDE_CBC_SHA");
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DH_DSS,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 5, 0x00, 0x0B,
- "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA");
+ "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", true);
public static final CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DH_DSS,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 8, 0x00, 0x0C,
- "TLS_DH_DSS_WITH_DES_CBC_SHA");
+ "TLS_DH_DSS_WITH_DES_CBC_SHA", true);
public static final CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA =
new CipherSuite (CipherAlgorithm.DESede,
KeyExchangeAlgorithm.DH_DSS,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 24, 0x00, 0x0D,
- "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA");
+ "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DH_RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 5, 0x00, 0x0E,
- "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA");
+ "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", true);
public static final CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DH_RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 8, 0x00, 0x0F,
- "TLS_DH_RSA_WITH_DES_CBC_SHA");
+ "TLS_DH_RSA_WITH_DES_CBC_SHA", true);
public static final CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA =
new CipherSuite (CipherAlgorithm.DESede,
KeyExchangeAlgorithm.DH_RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 24, 0x00, 0x10,
- "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA");
+ "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DHE_DSS, true,
SignatureAlgorithm.DSA,
MacAlgorithm.SHA, 5, 0x00, 0x11,
- "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
+ "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", true);
public static final CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DHE_DSS, true,
SignatureAlgorithm.DSA,
MacAlgorithm.SHA, 8, 0x00, 0x12,
- "TLS_DHE_DSS_WITH_DES_CBC_SHA");
+ "TLS_DHE_DSS_WITH_DES_CBC_SHA", true);
public static final CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA =
new CipherSuite (CipherAlgorithm.DESede,
KeyExchangeAlgorithm.DHE_DSS, true,
SignatureAlgorithm.DSA,
MacAlgorithm.SHA, 24, 0x00, 0x13,
- "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA");
+ "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DHE_RSA, true,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 5, 0x00, 0x14,
- "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA");
+ "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", true);
public static final CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA =
new CipherSuite (CipherAlgorithm.DES,
KeyExchangeAlgorithm.DHE_RSA, true,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 8, 0x00, 0x15,
- "TLS_DHE_RSA_WITH_DES_CBC_SHA");
+ "TLS_DHE_RSA_WITH_DES_CBC_SHA", true);
public static final CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA =
new CipherSuite (CipherAlgorithm.DESede,
KeyExchangeAlgorithm.DHE_RSA, true,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 24, 0x00, 0x16,
- "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA");
+ "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", true);
// AES CipherSuites.
public static final CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA =
@@ -201,61 +201,61 @@ public final class CipherSuite implements Constructed
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 16, 0x00, 0x2F,
- "TLS_RSA_WITH_AES_128_CBC_SHA");
+ "TLS_RSA_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DH_DSS,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x30,
- "TLS_DH_DSS_WITH_AES_128_CBC_SHA");
+ "TLS_DH_DSS_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DH_RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x31,
- "TLS_DH_RSA_WITH_AES_128_CBC_SHA");
+ "TLS_DH_RSA_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_DSS, true,
SignatureAlgorithm.DSA,
MacAlgorithm.SHA, 16, 0x00, 0x32,
- "TLS_DHE_DSS_WITH_AES_128_CBC_SHA");
+ "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_RSA, true,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 16, 0x00, 0x33,
- "TLS_DHE_RSA_WITH_AES_128_CBC_SHA");
+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x35,
- "TLS_RSA_WITH_AES_256_CBC_SHA");
+ "TLS_RSA_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DH_DSS,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x36,
- "TLS_DH_DSS_WITH_AES_256_CBC_SHA");
+ "TLS_DH_DSS_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DH_RSA,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x37,
- "TLS_DH_RSA_WITH_AES_256_CBC_SHA");
+ "TLS_DH_RSA_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_DSS, true,
SignatureAlgorithm.DSA,
MacAlgorithm.SHA, 32, 0x00, 0x38,
- "TLS_DHE_DSS_WITH_AES_256_CBC_SHA");
+ "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA =
new CipherSuite (CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_RSA, true,
SignatureAlgorithm.RSA,
MacAlgorithm.SHA, 32, 0x00, 0x39,
- "TLS_DHE_RSA_WITH_AES_256_CBC_SHA");
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", true);
// Secure remote password (SRP) ciphersuites
// Actual ID values are TBD, so these are omitted until they are specified.
@@ -320,75 +320,75 @@ public final class CipherSuite implements Constructed
KeyExchangeAlgorithm.PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x8A,
- "TLS_PSK_WITH_RC4_128_SHA");
+ "TLS_PSK_WITH_RC4_128_SHA", true);
public static final CipherSuite TLS_PSK_WITH_3DES_EDE_CBC_SHA =
new CipherSuite(CipherAlgorithm.DESede,
KeyExchangeAlgorithm.PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 24, 0x00, 0x8B,
- "TLS_PSK_WITH_3DES_EDE_CBC_SHA");
+ "TLS_PSK_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_PSK_WITH_AES_128_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x8C,
- "TLS_PSK_WITH_AES_128_CBC_SHA");
+ "TLS_PSK_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_PSK_WITH_AES_256_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x8D,
- "TLS_PSK_WITH_AES_256_CBC_SHA");
+ "TLS_PSK_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_DHE_PSK_WITH_RC4_128_SHA =
new CipherSuite(CipherAlgorithm.RC4,
KeyExchangeAlgorithm.DHE_PSK, true,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x8E,
- "TLS_DHE_PSK_WITH_RC4_128_SHA");
+ "TLS_DHE_PSK_WITH_RC4_128_SHA", false);
public static final CipherSuite TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA =
new CipherSuite(CipherAlgorithm.DESede,
KeyExchangeAlgorithm.DHE_PSK, true,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 24, 0x00, 0x8F,
- "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA");
+ "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_DHE_PSK_WITH_AES_128_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_PSK, true,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x90,
- "TLS_DHE_PSK_WITH_AES_128_CBC_SHA");
+ "TLS_DHE_PSK_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_DHE_PSK_WITH_AES_256_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.DHE_PSK, true,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x91,
- "TLS_DHE_PSK_WITH_AES_256_CBC_SHA");
+ "TLS_DHE_PSK_WITH_AES_256_CBC_SHA", true);
public static final CipherSuite TLS_RSA_PSK_WITH_RC4_128_SHA =
new CipherSuite(CipherAlgorithm.RC4,
KeyExchangeAlgorithm.RSA_PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x92,
- "TLS_RSA_PSK_WITH_RC4_128_SHA");
+ "TLS_RSA_PSK_WITH_RC4_128_SHA", false);
public static final CipherSuite TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA =
new CipherSuite(CipherAlgorithm.DESede,
KeyExchangeAlgorithm.RSA_PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 24, 0x00, 0x93,
- "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA");
+ "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA", true);
public static final CipherSuite TLS_RSA_PSK_WITH_AES_128_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.RSA_PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 16, 0x00, 0x94,
- "TLS_RSA_PSK_WITH_AES_128_CBC_SHA");
+ "TLS_RSA_PSK_WITH_AES_128_CBC_SHA", true);
public static final CipherSuite TLS_RSA_PSK_WITH_AES_256_CBC_SHA =
new CipherSuite(CipherAlgorithm.AES,
KeyExchangeAlgorithm.RSA_PSK,
SignatureAlgorithm.ANONYMOUS,
MacAlgorithm.SHA, 32, 0x00, 0x95,
- "TLS_RSA_PSK_WITH_AES_256_CBC_SHA");
+ "TLS_RSA_PSK_WITH_AES_256_CBC_SHA", true);
// Ciphersuites from the OpenPGP extension draft.
// These disappeared from a more recent draft.
@@ -490,6 +490,7 @@ public final class CipherSuite implements Constructed
private final boolean ephemeralDH;
private final boolean exportable;
private final boolean isStream;
+ private final boolean isCBCMode;
private final int keyLength;
private final byte[] id;
private final String name;
@@ -505,10 +506,11 @@ public final class CipherSuite implements Constructed
final int keyLength,
final int id1,
final int id2,
- final String name)
+ final String name,
+ final boolean isCBCMode)
{
this (cipherAlgorithm, keyExchangeAlgorithm, false, signatureAlgorithm,
- macAlgorithm, keyLength, id1, id2, name);
+ macAlgorithm, keyLength, id1, id2, name, isCBCMode);
}
private CipherSuite (final CipherAlgorithm cipherAlgorithm,
@@ -519,7 +521,8 @@ public final class CipherSuite implements Constructed
final int keyLength,
final int id1,
final int id2,
- final String name)
+ final String name,
+ final boolean isCBCMode)
{
this.cipherAlgorithm = cipherAlgorithm;
this.keyExchangeAlgorithm = keyExchangeAlgorithm;
@@ -529,6 +532,7 @@ public final class CipherSuite implements Constructed
this.exportable = keyLength <= 5;
this.isStream = (cipherAlgorithm == CipherAlgorithm.NULL
|| cipherAlgorithm == CipherAlgorithm.RC4);
+ this.isCBCMode = isCBCMode;
this.keyLength = keyLength;
this.id = new byte[] { (byte) id1, (byte) id2 };
this.name = name.intern();
@@ -549,6 +553,7 @@ public final class CipherSuite implements Constructed
ephemeralDH = false;
exportable = false;
isStream = false;
+ isCBCMode = false;
keyLength = 0;
this.id = id;
name = null;
@@ -598,10 +603,10 @@ public final class CipherSuite implements Constructed
return new NullCipher ();
String alg = null;
- if (cipherAlgorithm == CipherAlgorithm.RC4)
- alg = "RC4";
- else
+ if (isCBCMode)
alg = cipherAlgorithm + "/CBC/NoPadding";
+ else
+ alg = cipherAlgorithm.toString();
GetSecurityPropertyAction gspa =
new GetSecurityPropertyAction ("jessie.jce.provider");
final String provider = (String) AccessController.doPrivileged (gspa);
@@ -834,4 +839,10 @@ public final class CipherSuite implements Constructed
}
return name;
}
+
+ public boolean isCBCMode()
+ {
+ return isCBCMode;
+ }
+
}
diff --git a/gnu/javax/net/ssl/provider/OutputSecurityParameters.java b/gnu/javax/net/ssl/provider/OutputSecurityParameters.java
index c6ed7d587..617424397 100644
--- a/gnu/javax/net/ssl/provider/OutputSecurityParameters.java
+++ b/gnu/javax/net/ssl/provider/OutputSecurityParameters.java
@@ -62,6 +62,17 @@ public class OutputSecurityParameters
private final CipherSuite suite;
private long sequence;
+ static final boolean enableCBCProtection;
+
+ static
+ {
+ String enabled = Util.getProperty("jsse.enableCBCProtection");
+ if (enabled == null)
+ enableCBCProtection = true;
+ else
+ enableCBCProtection = Boolean.valueOf(enabled);
+ }
+
public OutputSecurityParameters (final Cipher cipher, final Mac mac,
final Deflater deflater, SessionImpl session,
CipherSuite suite)
@@ -291,4 +302,11 @@ public class OutputSecurityParameters
{
return suite;
}
+
+ boolean needToSplitPayload()
+ {
+ return (session.version.compareTo(ProtocolVersion.TLS_1_1) < 0 &&
+ suite.isCBCMode() && enableCBCProtection);
+ }
+
}
diff --git a/gnu/javax/net/ssl/provider/SSLEngineImpl.java b/gnu/javax/net/ssl/provider/SSLEngineImpl.java
index b63fb2f20..a62801f99 100644
--- a/gnu/javax/net/ssl/provider/SSLEngineImpl.java
+++ b/gnu/javax/net/ssl/provider/SSLEngineImpl.java
@@ -768,10 +768,27 @@ public final class SSLEngineImpl extends SSLEngine
}
else
{
- inout = outsec.encrypt(sources, offset, length,
- ContentType.APPLICATION_DATA, sink);
- consumed = inout[0];
- produced = inout[1];
+ if (outsec.needToSplitPayload())
+ {
+ inout = outsec.encrypt(sources, offset, 1,
+ ContentType.APPLICATION_DATA, sink);
+ consumed = inout[0];
+ produced = inout[1];
+ if (length > 1)
+ {
+ inout = outsec.encrypt(sources, offset+1, length-1,
+ ContentType.APPLICATION_DATA, sink);
+ consumed += inout[0];
+ produced += inout[1];
+ }
+ }
+ else
+ {
+ inout = outsec.encrypt(sources, offset, length,
+ ContentType.APPLICATION_DATA, sink);
+ consumed = inout[0];
+ produced = inout[1];
+ }
}
if (Debug.DEBUG)