()
| 95 | } |
| 96 | |
| 97 | func (m *clientHelloMsg) marshal() []byte { |
| 98 | if m.raw != nil { |
| 99 | return m.raw |
| 100 | } |
| 101 | |
| 102 | var b cryptobyte.Builder |
| 103 | b.AddUint8(typeClientHello) |
| 104 | b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { |
| 105 | b.AddUint16(m.vers) |
| 106 | addBytesWithLength(b, m.random, 32) |
| 107 | b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { |
| 108 | b.AddBytes(m.sessionId) |
| 109 | }) |
| 110 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 111 | for _, suite := range m.cipherSuites { |
| 112 | b.AddUint16(suite) |
| 113 | } |
| 114 | }) |
| 115 | b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { |
| 116 | b.AddBytes(m.compressionMethods) |
| 117 | }) |
| 118 | |
| 119 | // If extensions aren't present, omit them. |
| 120 | var extensionsPresent bool |
| 121 | bWithoutExtensions := *b |
| 122 | |
| 123 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 124 | if len(m.serverName) > 0 { |
| 125 | // RFC 6066, Section 3 |
| 126 | b.AddUint16(extensionServerName) |
| 127 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 128 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 129 | b.AddUint8(0) // name_type = host_name |
| 130 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 131 | b.AddBytes([]byte(m.serverName)) |
| 132 | }) |
| 133 | }) |
| 134 | }) |
| 135 | } |
| 136 | if m.ocspStapling { |
| 137 | // RFC 4366, Section 3.6 |
| 138 | b.AddUint16(extensionStatusRequest) |
| 139 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 140 | b.AddUint8(1) // status_type = ocsp |
| 141 | b.AddUint16(0) // empty responder_id_list |
| 142 | b.AddUint16(0) // empty request_extensions |
| 143 | }) |
| 144 | } |
| 145 | if len(m.supportedCurves) > 0 { |
| 146 | // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7 |
| 147 | b.AddUint16(extensionSupportedCurves) |
| 148 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 149 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 150 | for _, curve := range m.supportedCurves { |
| 151 | b.AddUint16(uint16(curve)) |
| 152 | } |
| 153 | }) |
| 154 | }) |
no test coverage detected