diff options
author | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2011-12-21 15:35:05 +0000 |
---|---|---|
committer | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2011-12-21 15:35:05 +0000 |
commit | cfb247f66654cb201c25771208fb61718165307e (patch) | |
tree | e21727f27905181f84b9303b97ff82ab39330277 /gnu | |
parent | 5b6355cb81d5404d359b14b6d8cb49a359831094 (diff) | |
download | classpath-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.
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/javax/net/ssl/provider/CipherSuite.java | 109 | ||||
-rw-r--r-- | gnu/javax/net/ssl/provider/OutputSecurityParameters.java | 18 | ||||
-rw-r--r-- | gnu/javax/net/ssl/provider/SSLEngineImpl.java | 25 |
3 files changed, 99 insertions, 53 deletions
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) |