Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package mono

Fixes #780751/CVE-2015-2318/CVE-2015-2319/CVE-2015-2320

diff -Nru mono-3.2.8+dfsg/debian/changelog mono-3.2.8+dfsg/debian/changelog
--- mono-3.2.8+dfsg/debian/changelog    2014-12-19 11:49:16.000000000 +0000
+++ mono-3.2.8+dfsg/debian/changelog    2015-03-19 10:31:49.000000000 +0000
@@ -1,3 +1,20 @@
+mono (3.2.8+dfsg-10) unstable; urgency=high
+
+  * [037e3b5] Mono's implementation of the SSL/TLS stack failed to check
+    the order of the handshake messages. Which would allow various attacks on
+    the protocol to succeed. ("SKIP-TLS" attack).
+    (Closes: #780751, CVE-2015-2318)
+  * [38d3725] Remove the client-side SSLv2 fallback. There's almost no SSLv3
+    web site left so a v2 fallback is only extra code we do not need to carry
+    forward. (Closes: #780751, CVE-2015-2320)
+  * [00e66d6] Remove the EXPORT ciphers and related code path. That was still
+    useful in 2003/2004 but the technical and legal landscape changed a lot
+    since then. Removing the old, limited key size, cipher suites also allow
+    removed additional parts of the code that deals with them.
+    ("FREAK" attack) (Closes: #780751, CVE-2015-2319)
+
+ -- Jo Shields <jo.shie...@xamarin.com>  Thu, 19 Mar 2015 10:30:24 +0000
+
 mono (3.2.8+dfsg-9) unstable; urgency=medium

   [ Mirco Bauer ]
diff -Nru mono-3.2.8+dfsg/debian/patches/debian-changes
mono-3.2.8+dfsg/debian/patches/debian-changes
--- mono-3.2.8+dfsg/debian/patches/debian-changes       2014-12-23
10:34:34.000000000 +0000
+++ mono-3.2.8+dfsg/debian/patches/debian-changes       2015-03-19
10:36:59.000000000 +0000
@@ -5,18 +5,22 @@
  information below has been extracted from the changelog. Adjust it or drop
  it.
  .
- mono (3.2.8+dfsg-9) unstable; urgency=medium
+ mono (3.2.8+dfsg-10) unstable; urgency=high
  .
-   [ Mirco Bauer ]
-   * [c8efb3b] Enable IPv6 support by default (closes: #771389)
- .
-   [ Jo Shields ]
-   * [0d67f80] Fix missing contents in mono-runtime-dbg package
-     (Closes: #773509, #773511)
-Author: Mirco Bauer <mee...@meebey.net>
-Bug-Debian: http://bugs.debian.org/771389
-Bug-Debian: http://bugs.debian.org/773509
-Bug-Debian: http://bugs.debian.org/773511
+   * [037e3b5] Mono's implementation of the SSL/TLS stack failed to check
+     the order of the handshake messages. Which would allow various attacks on
+     the protocol to succeed. ("SKIP-TLS" attack).
+     (Closes: #780751, CVE-2015-2318)
+   * [38d3725] Remove the client-side SSLv2 fallback. There's almost no SSLv3
+     web site left so a v2 fallback is only extra code we do not need to carry
+     forward. (Closes: #780751, CVE-2015-2320)
+   * [00e66d6] Remove the EXPORT ciphers and related code path. That was still
+     useful in 2003/2004 but the technical and legal landscape changed a lot
+     since then. Removing the old, limited key size, cipher suites also allow
+     removed additional parts of the code that deals with them.
+     ("FREAK" attack) (Closes: #780751, CVE-2015-2319)
+Author: Jo Shields <jo.shie...@xamarin.com>
+Bug-Debian: http://bugs.debian.org/780751

 ---
 The information above should follow the Patch Tagging Guidelines, please
@@ -387,6 +391,541 @@
                        }
                        set {
                                if (Toolsets [value] == null)
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/CipherSuiteFactory.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/CipherSuiteFactory.cs
+@@ -60,14 +60,14 @@ namespace Mono.Security.Protocol.Tls
+                       scs.Add((0x00 << 0x08) | 0x09,
"TLS_RSA_WITH_DES_CBC_SHA", CipherAlgorithmType.Des, HashAlgorithmType.Sha1,
ExchangeAlgorithmType.RsaKeyX, false, true, 8, 8, 56, 8, 8);
+
+                       // Supported exportable ciphers
+-                      scs.Add((0x00 << 0x08) | 0x03,
"TLS_RSA_EXPORT_WITH_RC4_40_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 5, 16, 40,
0, 0);
+-                      scs.Add((0x00 << 0x08) | 0x06,
"TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 16, 40, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x08,
"TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 8, 40, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x60,
"TLS_RSA_EXPORT_WITH_RC4_56_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
+-                      scs.Add((0x00 << 0x08) | 0x61,
"TLS_RSA_EXPORT_WITH_RC2_CBC_56_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 7, 16, 56, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x03,
"TLS_RSA_EXPORT_WITH_RC4_40_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 5, 16, 40,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x06,
"TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 16, 40, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x08,
"TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 8, 40, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x60,
"TLS_RSA_EXPORT_WITH_RC4_56_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x61,
"TLS_RSA_EXPORT_WITH_RC2_CBC_56_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 7, 16, 56, 8,
8);
+                       // 56 bits but we use 64 bits because of parity (DES is
really 56 bits)
+-                      scs.Add((0x00 << 0x08) | 0x62,
"TLS_RSA_EXPORT_WITH_DES_CBC_56_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 8, 8, 64, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x64,
"TLS_RSA_EXPORT_WITH_RC4_56_SHA", CipherAlgorithmType.Rc4,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x62,
"TLS_RSA_EXPORT_WITH_DES_CBC_56_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 8, 8, 64, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x64,
"TLS_RSA_EXPORT_WITH_RC4_56_SHA", CipherAlgorithmType.Rc4,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
+
+                       // Default CipherSuite
+                       // scs.Add(0, "TLS_NULL_WITH_NULL_NULL",
CipherAlgorithmType.None, HashAlgorithmType.None, ExchangeAlgorithmType.None,
true, false, 0, 0, 0, 0, 0);
+@@ -138,14 +138,14 @@ namespace Mono.Security.Protocol.Tls
+                       scs.Add((0x00 << 0x08) | 0x09,
"SSL_RSA_WITH_DES_CBC_SHA", CipherAlgorithmType.Des, HashAlgorithmType.Sha1,
ExchangeAlgorithmType.RsaKeyX, false, true, 8, 8, 56, 8, 8);
+
+                       // Supported exportable ciphers
+-                      scs.Add((0x00 << 0x08) | 0x03,
"SSL_RSA_EXPORT_WITH_RC4_40_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 5, 16, 40,
0, 0);
+-                      scs.Add((0x00 << 0x08) | 0x06,
"SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 16, 40, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x08,
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 8, 40, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x60,
"SSL_RSA_EXPORT_WITH_RC4_56_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
+-                      scs.Add((0x00 << 0x08) | 0x61,
"SSL_RSA_EXPORT_WITH_RC2_CBC_56_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 7, 16, 56, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x03,
"SSL_RSA_EXPORT_WITH_RC4_40_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 5, 16, 40,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x06,
"SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 16, 40, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x08,
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 5, 8, 40, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x60,
"SSL_RSA_EXPORT_WITH_RC4_56_MD5", CipherAlgorithmType.Rc4,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x61,
"SSL_RSA_EXPORT_WITH_RC2_CBC_56_MD5", CipherAlgorithmType.Rc2,
HashAlgorithmType.Md5, ExchangeAlgorithmType.RsaKeyX, true, true, 7, 16, 56, 8,
8);
+                       // 56 bits but we use 64 bits because of parity (DES is
really 56 bits)
+-                      scs.Add((0x00 << 0x08) | 0x62,
"SSL_RSA_EXPORT_WITH_DES_CBC_56_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 8, 8, 64, 8,
8);
+-                      scs.Add((0x00 << 0x08) | 0x64,
"SSL_RSA_EXPORT_WITH_RC4_56_SHA", CipherAlgorithmType.Rc4,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
++                      // scs.Add((0x00 << 0x08) | 0x62,
"SSL_RSA_EXPORT_WITH_DES_CBC_56_SHA", CipherAlgorithmType.Des,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, true, 8, 8, 64, 8,
8);
++                      // scs.Add((0x00 << 0x08) | 0x64,
"SSL_RSA_EXPORT_WITH_RC4_56_SHA", CipherAlgorithmType.Rc4,
HashAlgorithmType.Sha1, ExchangeAlgorithmType.RsaKeyX, true, false, 7, 16, 56,
0, 0);
+
+                       // Default CipherSuite
+                       // scs.Add(0, "SSL_NULL_WITH_NULL_NULL",
CipherAlgorithmType.None, HashAlgorithmType.None, true, false, 0, 0, 0, 0, 0);
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ClientRecordProtocol.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ClientRecordProtocol.cs
+@@ -129,6 +129,7 @@ namespace Mono.Security.Protocol.Tls
+                       HandshakeType type, byte[] buffer)
+               {
+                       ClientContext context = (ClientContext)this.context;
++                      var last = context.LastHandshakeMsg;
+
+                       switch (type)
+                       {
+@@ -148,23 +149,37 @@ namespace Mono.Security.Protocol.Tls
+                                       return null;
+
+                               case HandshakeType.ServerHello:
++                                      if (last != HandshakeType.HelloRequest)
++                                              break;
+                                       return new TlsServerHello(this.context,
buffer);
+
++                                      // Optional
+                               case HandshakeType.Certificate:
++                                      if (last != HandshakeType.ServerHello)
++                                              break;
+                                       return new
TlsServerCertificate(this.context, buffer);
+
+-                              case HandshakeType.ServerKeyExchange:
+-                                      return new
TlsServerKeyExchange(this.context, buffer);
+-
++                                      // Optional
+                               case HandshakeType.CertificateRequest:
+-                                      return new
TlsServerCertificateRequest(this.context, buffer);
++                                      if (last ==
HandshakeType.ServerKeyExchange || last == HandshakeType.Certificate)
++                                              return new
TlsServerCertificateRequest(this.context, buffer);
++                                      break;
+
+                               case HandshakeType.ServerHelloDone:
+-                                      return new
TlsServerHelloDone(this.context, buffer);
++                                      if (last ==
HandshakeType.CertificateRequest || last == HandshakeType.Certificate || last
== HandshakeType.ServerHello)
++                                              return new
TlsServerHelloDone(this.context, buffer);
++                                      break;
+
+                               case HandshakeType.Finished:
+-                                      return new
TlsServerFinished(this.context, buffer);
+-
++                                      // depends if a full (ServerHelloDone)
or an abbreviated handshake (ServerHello) is being done
++                                      bool check =
context.AbbreviatedHandshake ? (last == HandshakeType.ServerHello) : (last ==
HandshakeType.ServerHelloDone);
++                                      // ChangeCipherSpecDone is not an
handshake message (it's a content type) but still needs to be happens before
finished
++                                      if (check &&
context.ChangeCipherSpecDone) {
++                                              context.ChangeCipherSpecDone =
false;
++                                              return new TlsServerFinished
(this.context, buffer);
++                                      }
++                                      break;
++
+                               default:
+                                       throw new TlsException(
+
AlertDescription.UnexpectedMessage,
+@@ -172,6 +187,7 @@ namespace Mono.Security.Protocol.Tls
+                                                       "Unknown server
handshake message received ({0})",
+                                                       type.ToString()));
+                       }
++                      throw new TlsException
(AlertDescription.HandshakeFailiure, String.Format ("Protocol error, unexpected
protocol transition from {0} to {1}", last, type));
+               }
+
+               #endregion
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/Context.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/Context.cs
+@@ -122,6 +122,8 @@ namespace Mono.Security.Protocol.Tls
+                       set { this.protocolNegotiated = value; }
+               }
+
++              public bool ChangeCipherSpecDone { get; set; }
++
+               public SecurityProtocolType SecurityProtocol
+               {
+                       get
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs
+@@ -88,6 +88,8 @@ namespace Mono.Security.Protocol.Tls
+                       } else {
+                               ctx.StartSwitchingSecurityParameters (false);
+                       }
++
++                      ctx.ChangeCipherSpecDone = true;
+               }
+
+               public virtual HandshakeMessage GetMessage(HandshakeType type)
+@@ -348,9 +350,6 @@ namespace Mono.Security.Protocol.Tls
+                               // Try to read the Record Content Type
+                               int type = internalResult.InitialBuffer[0];
+
+-                              // Set last handshake message received to None
+-                              this.context.LastHandshakeMsg =
HandshakeType.ClientHello;
+-
+                               ContentType     contentType     =
(ContentType)type;
+                               byte[] buffer = this.ReadRecordBuffer(type,
record);
+                               if (buffer == null)
+@@ -445,87 +444,11 @@ namespace Mono.Security.Protocol.Tls
+
+               private byte[] ReadRecordBuffer (int contentType, Stream
record)
+               {
+-                      switch (contentType)
+-                      {
+-                              case 0x80:
+-                                      return this.ReadClientHelloV2(record);
+-
+-                              default:
+-                                      if
(!Enum.IsDefined(typeof(ContentType), (ContentType)contentType))
+-                                      {
+-                                              throw new
TlsException(AlertDescription.DecodeError);
+-                                      }
+-                                      return
this.ReadStandardRecordBuffer(record);
+-                      }
+-              }
+-
+-              private byte[] ReadClientHelloV2 (Stream record)
+-              {
+-                      int msgLength = record.ReadByte ();
+-                      // process further only if the whole record is
available
+-                      if (record.CanSeek && (msgLength + 1 > record.Length))
+-                      {
+-                              return null;
+-                      }
+-
+-                      byte[] message = new byte[msgLength];
+-                      record.Read (message, 0, msgLength);
+-
+-                      int msgType             = message [0];
+-                      if (msgType != 1)
++                      if (!Enum.IsDefined(typeof(ContentType),
(ContentType)contentType))
+                       {
+                               throw new
TlsException(AlertDescription.DecodeError);
+                       }
+-                      int protocol = (message [1] << 8 | message [2]);
+-                      int cipherSpecLength = (message [3] << 8 | message
[4]);
+-                      int sessionIdLength = (message [5] << 8 | message [6]);
+-                      int challengeLength = (message [7] << 8 | message [8]);
+-                      int length = (challengeLength > 32) ? 32 :
challengeLength;
+-
+-                      // Read CipherSpecs
+-                      byte[] cipherSpecV2 = new byte[cipherSpecLength];
+-                      Buffer.BlockCopy (message, 9, cipherSpecV2, 0,
cipherSpecLength);
+-
+-                      // Read session ID
+-                      byte[] sessionId = new byte[sessionIdLength];
+-                      Buffer.BlockCopy (message, 9 + cipherSpecLength,
sessionId, 0, sessionIdLength);
+-
+-                      // Read challenge ID
+-                      byte[] challenge = new byte[challengeLength];
+-                      Buffer.BlockCopy (message, 9 + cipherSpecLength +
sessionIdLength, challenge, 0, challengeLength);
+-
+-                      if (challengeLength < 16 || cipherSpecLength == 0 ||
(cipherSpecLength % 3) != 0)
+-                      {
+-                              throw new
TlsException(AlertDescription.DecodeError);
+-                      }
+-
+-                      // Updated the Session ID
+-                      if (sessionId.Length > 0)
+-                      {
+-                              this.context.SessionId = sessionId;
+-                      }
+-
+-                      // Update the protocol version
+-                      this.Context.ChangeProtocol((short)protocol);
+-
+-                      // Select the Cipher suite
+-
this.ProcessCipherSpecV2Buffer(this.Context.SecurityProtocol, cipherSpecV2);
+-
+-                      // Updated the Client Random
+-                      this.context.ClientRandom = new byte [32]; // Always 32
+-                      // 1. if challenge is bigger than 32 bytes only use the
last 32 bytes
+-                      // 2. right justify (0) challenge in ClientRandom if
less than 32
+-                      Buffer.BlockCopy (challenge, challenge.Length - length,
this.context.ClientRandom, 32 - length, length);
+-
+-                      // Set
+-                      this.context.LastHandshakeMsg =
HandshakeType.ClientHello;
+-                      this.context.ProtocolNegotiated = true;
+
+-                      return message;
+-              }
+-
+-              private byte[] ReadStandardRecordBuffer (Stream record)
+-              {
+                       byte[] header = new byte[4];
+                       if (record.Read (header, 0, 4) != 4)
+                               throw new TlsException ("buffer underrun");
+@@ -887,96 +810,5 @@ namespace Mono.Security.Protocol.Tls
+               }
+
+               #endregion
+-
+-              #region CipherSpecV2 processing
+-
+-              private void ProcessCipherSpecV2Buffer (SecurityProtocolType
protocol, byte[] buffer)
+-              {
+-                      TlsStream codes = new TlsStream(buffer);
+-
+-                      string prefix = (protocol == SecurityProtocolType.Ssl3)
? "SSL_" : "TLS_";
+-
+-                      while (codes.Position < codes.Length)
+-                      {
+-                              byte check = codes.ReadByte();
+-
+-                              if (check == 0)
+-                              {
+-                                      // SSL/TLS cipher spec
+-                                      short code = codes.ReadInt16();
+-                                      int index =
this.Context.SupportedCiphers.IndexOf(code);
+-                                      if (index != -1)
+-                                      {
+-                                              this.Context.Negotiating.Cipher
= this.Context.SupportedCiphers[index];
+-                                              break;
+-                                      }
+-                              }
+-                              else
+-                              {
+-                                      byte[] tmp = new byte[2];
+-                                      codes.Read(tmp, 0, tmp.Length);
+-
+-                                      int tmpCode = ((check & 0xff) << 16) |
((tmp[0] & 0xff) << 8) | (tmp[1] & 0xff);
+-                                      CipherSuite cipher =
this.MapV2CipherCode(prefix, tmpCode);
+-
+-                                      if (cipher != null)
+-                                      {
+-                                              this.Context.Negotiating.Cipher
= cipher;
+-                                              break;
+-                                      }
+-                              }
+-                      }
+-
+-                      if (this.Context.Negotiating == null)
+-                      {
+-                              throw new
TlsException(AlertDescription.InsuficientSecurity, "Insuficient Security");
+-                      }
+-              }
+-
+-              private CipherSuite MapV2CipherCode(string prefix, int code)
+-              {
+-                      try
+-                      {
+-                              switch (code)
+-                              {
+-                                      case 65664:
+-                                              // TLS_RC4_128_WITH_MD5
+-                                              return
this.Context.SupportedCiphers[prefix + "RSA_WITH_RC4_128_MD5"];
+-
+-                                      case 131200:
+-                                              //
TLS_RC4_128_EXPORT40_WITH_MD5
+-                                              return
this.Context.SupportedCiphers[prefix + "RSA_EXPORT_WITH_RC4_40_MD5"];
+-
+-                                      case 196736:
+-                                              // TLS_RC2_CBC_128_CBC_WITH_MD5
+-                                              return
this.Context.SupportedCiphers[prefix + "RSA_EXPORT_WITH_RC2_CBC_40_MD5"];
+-
+-                                      case 262272:
+-                                              //
TLS_RC2_CBC_128_CBC_EXPORT40_WITH_MD5
+-                                              return
this.Context.SupportedCiphers[prefix + "RSA_EXPORT_WITH_RC2_CBC_40_MD5"];
+-
+-                                      case 327808:
+-                                              // TLS_IDEA_128_CBC_WITH_MD5
+-                                              return null;
+-
+-                                      case 393280:
+-                                              // TLS_DES_64_CBC_WITH_MD5
+-                                              return null;
+-
+-                                      case 458944:
+-                                              //
TLS_DES_192_EDE3_CBC_WITH_MD5
+-                                              return null;
+-
+-                                      default:
+-                                              return null;
+-                              }
+-                      }
+-                      catch
+-                      {
+-                              return null;
+-                      }
+-              }
+-
+-              #endregion
+       }
+ }
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ServerRecordProtocol.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ServerRecordProtocol.cs
+@@ -33,6 +33,8 @@ namespace Mono.Security.Protocol.Tls
+ {
+       internal class ServerRecordProtocol : RecordProtocol
+       {
++              TlsClientCertificate cert;
++
+               #region Constructors
+
+               public ServerRecordProtocol(
+@@ -93,30 +95,45 @@ namespace Mono.Security.Protocol.Tls
+               private HandshakeMessage createClientHandshakeMessage(
+                       HandshakeType type, byte[] buffer)
+               {
++                      var last = context.LastHandshakeMsg;
+                       switch (type)
+                       {
+                               case HandshakeType.ClientHello:
+                                       return new TlsClientHello(this.context,
buffer);
+
+                               case HandshakeType.Certificate:
+-                                      return new
TlsClientCertificate(this.context, buffer);
++                                      if (last != HandshakeType.ClientHello)
++                                              break;
++                                      cert = new
TlsClientCertificate(this.context, buffer);
++                                      return cert;
+
+                               case HandshakeType.ClientKeyExchange:
+-                                      return new
TlsClientKeyExchange(this.context, buffer);
++                                      if (last == HandshakeType.ClientHello
|| last == HandshakeType.Certificate)
++                                              return new
TlsClientKeyExchange(this.context, buffer);
++                                      break;
+
+                               case HandshakeType.CertificateVerify:
+-                                      return new
TlsClientCertificateVerify(this.context, buffer);
++                                      if (last ==
HandshakeType.ClientKeyExchange && cert != null)
++                                              return new
TlsClientCertificateVerify(this.context, buffer);
++                                      break;
+
+                               case HandshakeType.Finished:
+-                                      return new
TlsClientFinished(this.context, buffer);
+-
++                                      // Certificates are optional, but if
provided, they should send a CertificateVerify
++                                      bool check = (cert == null) ? (last ==
HandshakeType.ClientKeyExchange) : (last == HandshakeType.CertificateVerify);
++                                      // ChangeCipherSpecDone is not an
handshake message (it's a content type) but still needs to be happens before
finished
++                                      if (check &&
context.ChangeCipherSpecDone) {
++                                              context.ChangeCipherSpecDone =
false;
++                                              return new
TlsClientFinished(this.context, buffer);
++                                      }
++                                      break;
++
+                               default:
+-                                      throw new TlsException(
+-
AlertDescription.UnexpectedMessage,
+-
String.Format(CultureInfo.CurrentUICulture,
+-                                                      "Unknown server
handshake message received ({0})",
+-                                                      type.ToString()));
++                                      throw new
TlsException(AlertDescription.UnexpectedMessage,
String.Format(CultureInfo.CurrentUICulture,
++
"Unknown server handshake message received ({0})",
++
type.ToString()));
++                                      break;
+                       }
++                      throw new TlsException
(AlertDescription.HandshakeFailiure, String.Format ("Protocol error, unexpected
protocol transition from {0} to {1}", last, type));
+               }
+
+               private HandshakeMessage createServerHandshakeMessage(
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslCipherSuite.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslCipherSuite.cs
+@@ -190,59 +190,15 @@ namespace Mono.Security.Protocol.Tls
+                       this.Context.ClientWriteKey =
keyBlock.ReadBytes(this.KeyMaterialSize);
+                       this.Context.ServerWriteKey =
keyBlock.ReadBytes(this.KeyMaterialSize);
+
+-                      if (!this.IsExportable)
++                      if (this.IvSize != 0)
+                       {
+-                              if (this.IvSize != 0)
+-                              {
+-                                      this.Context.ClientWriteIV =
keyBlock.ReadBytes(this.IvSize);
+-                                      this.Context.ServerWriteIV =
keyBlock.ReadBytes(this.IvSize);
+-                              }
+-                              else
+-                              {
+-                                      this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
+-                                      this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+-                              }
++                              this.Context.ClientWriteIV =
keyBlock.ReadBytes(this.IvSize);
++                              this.Context.ServerWriteIV =
keyBlock.ReadBytes(this.IvSize);
+                       }
+                       else
+                       {
+-                              HashAlgorithm md5 = MD5.Create();
+-
+-                              int keySize = (md5.HashSize >> 3); //in bytes
not bits
+-                              byte[] temp = new byte [keySize];
+-
+-                              // Generate final write keys
+-                              md5.TransformBlock(this.Context.ClientWriteKey,
0, this.Context.ClientWriteKey.Length, temp, 0);
+-                              md5.TransformFinalBlock(this.Context.RandomCS,
0, this.Context.RandomCS.Length);
+-                              byte[] finalClientWriteKey = new
byte[this.ExpandedKeyMaterialSize];
+-                              Buffer.BlockCopy(md5.Hash, 0,
finalClientWriteKey, 0, this.ExpandedKeyMaterialSize);
+-
+-                              md5.Initialize();
+-                              md5.TransformBlock(this.Context.ServerWriteKey,
0, this.Context.ServerWriteKey.Length, temp, 0);
+-                              md5.TransformFinalBlock(this.Context.RandomSC,
0, this.Context.RandomSC.Length);
+-                              byte[] finalServerWriteKey = new
byte[this.ExpandedKeyMaterialSize];
+-                              Buffer.BlockCopy(md5.Hash, 0,
finalServerWriteKey, 0, this.ExpandedKeyMaterialSize);
+-
+-                              this.Context.ClientWriteKey =
finalClientWriteKey;
+-                              this.Context.ServerWriteKey =
finalServerWriteKey;
+-
+-                              // Generate IV keys
+-                              if (this.IvSize > 0)
+-                              {
+-                                      md5.Initialize();
+-                                      temp =
md5.ComputeHash(this.Context.RandomCS, 0, this.Context.RandomCS.Length);
+-                                      this.Context.ClientWriteIV = new
byte[this.IvSize];
+-                                      Buffer.BlockCopy(temp, 0,
this.Context.ClientWriteIV, 0, this.IvSize);
+-
+-                                      md5.Initialize();
+-                                      temp =
md5.ComputeHash(this.Context.RandomSC, 0, this.Context.RandomSC.Length);
+-                                      this.Context.ServerWriteIV = new
byte[this.IvSize];
+-                                      Buffer.BlockCopy(temp, 0,
this.Context.ServerWriteIV, 0, this.IvSize);
+-                              }
+-                              else
+-                              {
+-                                      this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
+-                                      this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+-                              }
++                              this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
++                              this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+                       }
+
+                       DebugHelper.WriteLine(">>>> KeyBlock",
keyBlock.ToArray());
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs
+@@ -233,16 +233,8 @@ namespace Mono.Security.Protocol.Tls
+                       // Send ServerCertificate message
+                       this.protocol.SendRecord(HandshakeType.Certificate);
+
+-                      // If the negotiated cipher is a KeyEx cipher send
ServerKeyExchange
+-                      if (this.context.Negotiating.Cipher.IsExportable)
+-                      {
+-
this.protocol.SendRecord(HandshakeType.ServerKeyExchange);
+-                      }
+-
+-                      // If the negotiated cipher is a KeyEx cipher or
+-                      // the client certificate is required send the
CertificateRequest message
+-                      if (this.context.Negotiating.Cipher.IsExportable ||
+-
((ServerContext)this.context).ClientCertificateRequired ||
++                      // If the client certificate is required send the
CertificateRequest message
++                      if
(((ServerContext)this.context).ClientCertificateRequired ||
+
((ServerContext)this.context).RequestClientCertificate)
+                       {
+
this.protocol.SendRecord(HandshakeType.CertificateRequest);
+---
mono-3.2.8+dfsg.orig/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/TlsCipherSuite.cs
++++
mono-3.2.8+dfsg/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/TlsCipherSuite.cs
+@@ -118,45 +118,15 @@ namespace Mono.Security.Protocol.Tls
+                       this.Context.ClientWriteKey =
keyBlock.ReadBytes(this.KeyMaterialSize);
+                       this.Context.ServerWriteKey =
keyBlock.ReadBytes(this.KeyMaterialSize);
+
+-                      if (!this.IsExportable)
++                      if (this.IvSize != 0)
+                       {
+-                              if (this.IvSize != 0)
+-                              {
+-                                      this.Context.ClientWriteIV =
keyBlock.ReadBytes(this.IvSize);
+-                                      this.Context.ServerWriteIV =
keyBlock.ReadBytes(this.IvSize);
+-                              }
+-                              else
+-                              {
+-                                      this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
+-                                      this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+-                              }
++                              this.Context.ClientWriteIV =
keyBlock.ReadBytes(this.IvSize);
++                              this.Context.ServerWriteIV =
keyBlock.ReadBytes(this.IvSize);
+                       }
+                       else
+                       {
+-                              // Generate final write keys
+-                              byte[] finalClientWriteKey      =
PRF(this.Context.ClientWriteKey, "client write key", this.Context.RandomCS,
this.ExpandedKeyMaterialSize);
+-                              byte[] finalServerWriteKey      =
PRF(this.Context.ServerWriteKey, "server write key", this.Context.RandomCS,
this.ExpandedKeyMaterialSize);
+-
+-                              this.Context.ClientWriteKey     =
finalClientWriteKey;
+-                              this.Context.ServerWriteKey     =
finalServerWriteKey;
+-
+-                              if (this.IvSize > 0)
+-                              {
+-                                      // Generate IV block
+-                                      byte[] ivBlock =
PRF(CipherSuite.EmptyArray, "IV block", this.Context.RandomCS, this.IvSize*2);
+-
+-                                      // Generate IV keys
+-                                      this.Context.ClientWriteIV = new
byte[this.IvSize];
+-                                      Buffer.BlockCopy(ivBlock, 0,
this.Context.ClientWriteIV, 0, this.Context.ClientWriteIV.Length);
+-
+-                                      this.Context.ServerWriteIV = new
byte[this.IvSize];
+-                                      Buffer.BlockCopy(ivBlock, this.IvSize,
this.Context.ServerWriteIV, 0, this.Context.ServerWriteIV.Length);
+-                              }
+-                              else
+-                              {
+-                                      this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
+-                                      this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+-                              }
++                              this.Context.ClientWriteIV =
CipherSuite.EmptyArray;
++                              this.Context.ServerWriteIV =
CipherSuite.EmptyArray;
+                       }
+
+                       DebugHelper.WriteLine(">>>> KeyBlock",
keyBlock.ToArray());
 --- /dev/null
 +++ mono-3.2.8+dfsg/mcs/class/Mono.WebBrowser/Mono.NullBrowser/Base.cs
 @@ -0,0 +1,174 @@


unblock mono/3.2.8+dfsg-10

-- System Information:
Debian Release: jessie/sid
  APT prefers trusty-updates
  APT policy: (500, 'trusty-updates'), (500, 'trusty-security'), (500,
'trusty'), (100, 'trusty-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.13.0-46-generic (SMP w/4 CPU cores)


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to