| 1008 | } |
| 1009 | |
| 1010 | func (m *encryptedExtensionsMsg) marshal() ([]byte, error) { |
| 1011 | var b cryptobyte.Builder |
| 1012 | b.AddUint8(typeEncryptedExtensions) |
| 1013 | b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1014 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1015 | if len(m.alpnProtocol) > 0 { |
| 1016 | b.AddUint16(extensionALPN) |
| 1017 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1018 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1019 | b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1020 | b.AddBytes([]byte(m.alpnProtocol)) |
| 1021 | }) |
| 1022 | }) |
| 1023 | }) |
| 1024 | } |
| 1025 | if m.quicTransportParameters != nil { // marshal zero-length parameters when present |
| 1026 | // draft-ietf-quic-tls-32, Section 8.2 |
| 1027 | b.AddUint16(extensionQUICTransportParameters) |
| 1028 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1029 | b.AddBytes(m.quicTransportParameters) |
| 1030 | }) |
| 1031 | } |
| 1032 | if m.earlyData { |
| 1033 | // RFC 8446, Section 4.2.10 |
| 1034 | b.AddUint16(extensionEarlyData) |
| 1035 | b.AddUint16(0) // empty extension_data |
| 1036 | } |
| 1037 | if len(m.echRetryConfigs) > 0 { |
| 1038 | b.AddUint16(extensionEncryptedClientHello) |
| 1039 | b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { |
| 1040 | b.AddBytes(m.echRetryConfigs) |
| 1041 | }) |
| 1042 | } |
| 1043 | }) |
| 1044 | }) |
| 1045 | |
| 1046 | return b.Bytes() |
| 1047 | } |
| 1048 | |
| 1049 | func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool { |
| 1050 | *m = encryptedExtensionsMsg{} |