(hello *clientHelloMsg)
| 258 | } |
| 259 | |
| 260 | func extractRawExtensions(hello *clientHelloMsg) ([]rawExtension, error) { |
| 261 | s := cryptobyte.String(hello.original) |
| 262 | if !s.Skip(4+2+32) || // header, version, random |
| 263 | !skipUint8LengthPrefixed(&s) || // session ID |
| 264 | !skipUint16LengthPrefixed(&s) || // cipher suites |
| 265 | !skipUint8LengthPrefixed(&s) { // compression methods |
| 266 | return nil, errors.New("tls: malformed outer client hello") |
| 267 | } |
| 268 | var rawExtensions []rawExtension |
| 269 | var extensions cryptobyte.String |
| 270 | if !s.ReadUint16LengthPrefixed(&extensions) { |
| 271 | return nil, errors.New("tls: malformed outer client hello") |
| 272 | } |
| 273 | |
| 274 | for !extensions.Empty() { |
| 275 | var extension uint16 |
| 276 | var extData cryptobyte.String |
| 277 | if !extensions.ReadUint16(&extension) || |
| 278 | !extensions.ReadUint16LengthPrefixed(&extData) { |
| 279 | return nil, errors.New("tls: invalid inner client hello") |
| 280 | } |
| 281 | rawExtensions = append(rawExtensions, rawExtension{extension, extData}) |
| 282 | } |
| 283 | return rawExtensions, nil |
| 284 | } |
| 285 | |
| 286 | func decodeInnerClientHello(outer *clientHelloMsg, encoded []byte) (*clientHelloMsg, error) { |
| 287 | // Reconstructing the inner client hello from its encoded form is somewhat |
no test coverage detected
searching dependent graphs…