|
|
@@ -60,6 +60,7 @@ type clientHelloMsg struct {
|
|
|
pskKeyExchangeModes []uint8
|
|
|
earlyData bool
|
|
|
delegatedCredential bool
|
|
|
+ extendedMSSupported bool // RFC7627
|
|
|
}
|
|
|
|
|
|
// Function used for signature_algorithms and signature_algorithrms_cert
|
|
|
@@ -139,7 +140,8 @@ func (m *clientHelloMsg) equal(i interface{}) bool {
|
|
|
eqKeyShares(m.keyShares, m1.keyShares) &&
|
|
|
eqUint16s(m.supportedVersions, m1.supportedVersions) &&
|
|
|
m.earlyData == m1.earlyData &&
|
|
|
- m.delegatedCredential == m1.delegatedCredential
|
|
|
+ m.delegatedCredential == m1.delegatedCredential &&
|
|
|
+ m.extendedMSSupported == m1.extendedMSSupported
|
|
|
}
|
|
|
|
|
|
func (m *clientHelloMsg) marshal() []byte {
|
|
|
@@ -158,7 +160,6 @@ func (m *clientHelloMsg) marshal() []byte {
|
|
|
numExtensions := 0
|
|
|
extensionsLength := 0
|
|
|
|
|
|
- // Indicates wether to send signature_algorithms_cert extension
|
|
|
if m.nextProtoNeg {
|
|
|
numExtensions++
|
|
|
}
|
|
|
@@ -225,6 +226,9 @@ func (m *clientHelloMsg) marshal() []byte {
|
|
|
if m.delegatedCredential {
|
|
|
numExtensions++
|
|
|
}
|
|
|
+ if m.extendedMSSupported {
|
|
|
+ numExtensions++
|
|
|
+ }
|
|
|
if numExtensions > 0 {
|
|
|
extensionsLength += 4 * numExtensions
|
|
|
length += 2 + extensionsLength
|
|
|
@@ -446,6 +450,10 @@ func (m *clientHelloMsg) marshal() []byte {
|
|
|
binary.BigEndian.PutUint16(z, extensionDelegatedCredential)
|
|
|
z = z[4:]
|
|
|
}
|
|
|
+ if m.extendedMSSupported {
|
|
|
+ binary.BigEndian.PutUint16(z, extensionEMS)
|
|
|
+ z = z[4:]
|
|
|
+ }
|
|
|
|
|
|
m.raw = x
|
|
|
|
|
|
@@ -842,6 +850,14 @@ func (m *clientHelloMsg) randomizedMarshal() []byte {
|
|
|
z = z[4:]
|
|
|
})
|
|
|
}
|
|
|
+ if m.extendedMSSupported && common.FlipCoin() { // May be omitted
|
|
|
+ numExtensions++
|
|
|
+ extensionMarshalers = append(extensionMarshalers,
|
|
|
+ func() {
|
|
|
+ binary.BigEndian.PutUint16(z, extensionEMS)
|
|
|
+ z = z[4:]
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
// Optional, additional extensions
|
|
|
|
|
|
@@ -1001,6 +1017,7 @@ func (m *clientHelloMsg) unmarshal(data []byte) alert {
|
|
|
m.pskKeyExchangeModes = nil
|
|
|
m.earlyData = false
|
|
|
m.delegatedCredential = false
|
|
|
+ m.extendedMSSupported = false
|
|
|
|
|
|
if len(data) == 0 {
|
|
|
// ClientHello is optionally followed by extension data
|
|
|
@@ -1268,6 +1285,12 @@ func (m *clientHelloMsg) unmarshal(data []byte) alert {
|
|
|
case extensionDelegatedCredential:
|
|
|
// https://tools.ietf.org/html/draft-ietf-tls-subcerts-02
|
|
|
m.delegatedCredential = true
|
|
|
+ case extensionEMS:
|
|
|
+ // RFC 7627
|
|
|
+ m.extendedMSSupported = true
|
|
|
+ if length != 0 {
|
|
|
+ return alertDecodeError
|
|
|
+ }
|
|
|
}
|
|
|
data = data[length:]
|
|
|
bindersOffset += length
|
|
|
@@ -1300,6 +1323,9 @@ type serverHelloMsg struct {
|
|
|
keyShare keyShare
|
|
|
psk bool
|
|
|
pskIdentity uint16
|
|
|
+
|
|
|
+ // RFC7627
|
|
|
+ extendedMSSupported bool
|
|
|
}
|
|
|
|
|
|
func (m *serverHelloMsg) equal(i interface{}) bool {
|
|
|
@@ -1333,7 +1359,8 @@ func (m *serverHelloMsg) equal(i interface{}) bool {
|
|
|
m.keyShare.group == m1.keyShare.group &&
|
|
|
bytes.Equal(m.keyShare.data, m1.keyShare.data) &&
|
|
|
m.psk == m1.psk &&
|
|
|
- m.pskIdentity == m1.pskIdentity
|
|
|
+ m.pskIdentity == m1.pskIdentity &&
|
|
|
+ m.extendedMSSupported == m1.extendedMSSupported
|
|
|
}
|
|
|
|
|
|
func (m *serverHelloMsg) marshal() []byte {
|
|
|
@@ -1364,6 +1391,9 @@ func (m *serverHelloMsg) marshal() []byte {
|
|
|
extensionsLength += 1 + len(m.secureRenegotiation)
|
|
|
numExtensions++
|
|
|
}
|
|
|
+ if m.extendedMSSupported {
|
|
|
+ numExtensions++
|
|
|
+ }
|
|
|
if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
|
|
|
if alpnLen >= 256 {
|
|
|
panic("invalid ALPN protocol")
|
|
|
@@ -1524,6 +1554,10 @@ func (m *serverHelloMsg) marshal() []byte {
|
|
|
z[5] = byte(m.pskIdentity)
|
|
|
z = z[6:]
|
|
|
}
|
|
|
+ if m.extendedMSSupported {
|
|
|
+ binary.BigEndian.PutUint16(z, extensionEMS)
|
|
|
+ z = z[4:]
|
|
|
+ }
|
|
|
|
|
|
m.raw = x
|
|
|
|
|
|
@@ -1560,6 +1594,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) alert {
|
|
|
m.keyShare.data = nil
|
|
|
m.psk = false
|
|
|
m.pskIdentity = 0
|
|
|
+ m.extendedMSSupported = false
|
|
|
|
|
|
if len(data) == 0 {
|
|
|
// ServerHello is optionally followed by extension data
|
|
|
@@ -1701,6 +1736,8 @@ func (m *serverHelloMsg) unmarshal(data []byte) alert {
|
|
|
}
|
|
|
m.psk = true
|
|
|
m.pskIdentity = uint16(data[0])<<8 | uint16(data[1])
|
|
|
+ case extensionEMS:
|
|
|
+ m.extendedMSSupported = true
|
|
|
}
|
|
|
data = data[length:]
|
|
|
}
|