Skip to content

Commit e7e0125

Browse files
committed
Add Encrypted Server Name Indication for Client Hello in TLS 1.3
1 parent 4d6ea9e commit e7e0125

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

scapy/layers/tls/extensions.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
SigAndHashAlgsField, _tls_hash_sig)
2121
from scapy.layers.tls.session import _GenericTLSSessionInheritance
2222
from scapy.layers.tls.crypto.groups import _tls_named_groups
23+
from scapy.layers.tls.crypto.suites import _tls_cipher_suites
2324
from scapy.themes import AnsiColorTheme
2425
from scapy.compat import raw
2526
from scapy.config import conf
@@ -61,7 +62,8 @@
6162
0x33: "key_share",
6263
0x3374: "next_protocol_negotiation",
6364
# RFC-draft-agl-tls-nextprotoneg-03
64-
0xff01: "renegotiation_info" # RFC 5746
65+
0xff01: "renegotiation_info", # RFC 5746
66+
0xffce: "encrypted_server_name"
6567
}
6668

6769

@@ -182,6 +184,27 @@ class TLS_Ext_ServerName(TLS_Ext_PrettyPacketList): # RFC 4366
182184
length_from=lambda pkt: pkt.servernameslen)]
183185

184186

187+
class TLS_Ext_EncryptedServerName(TLS_Ext_PrettyPacketList):
188+
name = "TLS Extension - Encrypted Server Name"
189+
fields_desc = [ShortEnumField("type", 0xffce, _tls_ext),
190+
ShortField("len", None),
191+
EnumField("cipher", None, _tls_cipher_suites),
192+
ShortEnumField("key_exchange_group", None,
193+
_tls_named_groups),
194+
FieldLenField("key_exchange_len", None,
195+
length_of="key_exchange", fmt="H"),
196+
XStrLenField("key_exchange", "",
197+
length_from=lambda pkt: pkt.key_exchange_len),
198+
FieldLenField("record_digest_len",
199+
None, length_of="record_digest"),
200+
XStrLenField("record_digest", "",
201+
length_from=lambda pkt: pkt.record_digest_len),
202+
FieldLenField("encrypted_sni_len", None,
203+
length_of="encrypted_sni", fmt="H"),
204+
XStrLenField("encrypted_sni", "",
205+
length_from=lambda pkt: pkt.encrypted_sni_len)]
206+
207+
185208
class TLS_Ext_MaxFragLen(TLS_Ext_Unknown): # RFC 4366
186209
name = "TLS Extension - Max Fragment Length"
187210
fields_desc = [ShortEnumField("type", 1, _tls_ext),
@@ -669,7 +692,8 @@ class TLS_Ext_RecordSizeLimit(TLS_Ext_Unknown): # RFC 8449
669692
# 0x2f: TLS_Ext_CertificateAuthorities, #XXX
670693
# 0x30: TLS_Ext_OIDFilters, #XXX
671694
0x3374: TLS_Ext_NPN,
672-
0xff01: TLS_Ext_RenegotiationInfo
695+
0xff01: TLS_Ext_RenegotiationInfo,
696+
0xffce: TLS_Ext_EncryptedServerName
673697
}
674698

675699

test/tls13.uts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,54 @@ m = t.inner.msg[0]
619619
assert(isinstance(m, TLSApplicationData))
620620
assert(m.data == payload)
621621

622+
= TLS_Ext_EncryptedServerName(), dissect
623+
~ crypto_advanced
624+
625+
clientHello3 = clean("""
626+
16030102c4010002c003034b1 40e7d15fc8db422cec056fbaf 0285d306df4eedad1bc6ea57d 5114e6bd52a20a5b9c7445955 e296b886469c974648cda0a68
627+
5d3c06d884e388f6475c32e03 2d0024130113031302c02bc02 fcca9cca8c02cc030c00ac009 c013c01400330039002f00350 00a0100025300170000ff0100
628+
0100000a000e000c001d00170 018001901000101000b000201 00002300000010000b0009086 87474702f312e310005000501 000000000033006b0069001d0
629+
02037adee0aacc37b08d47222 caf6a5097a800fcf8406ae118 38f6348294d2dde1200170041 048b127c905d6d487a40b8b19 c99c56aa1a8c208218c178dae
630+
02568547b2ce8f538a530b858 a7a2f608d66e148baa5693d03 c519b45017c63f48c5a4c1238 707bc002b0009080304030303 020301000d001800160403050
631+
3060308040805080604010501 060102030201002d00020101f fce016e1301001d0020912e86 b776ee552a6bb1e2c70d7b467 770b190432237cc743a93091d
632+
ce24623500208bc16fdcbbc7c 8756808c94f70464d68297975 f33be90e1a200633f5eb2d4c6 101249e073bff833782e57e88 2519a53ef8bde4c94a7878a2f
633+
8461aec57802440007c7b2dab 986d9bc79257ce00ca6a998b1 fadb0114161069d364ccebae8 dab6c88151f297daeaecfd2e1 a598a486e2efc9561298f8dd5
634+
f35d184f0e87768777d253e68 952b730a24b342fde10df4f8e 82afdc2f10c2481634d92015d 9d5e6a9566494735d9c079115 bdeb0cd019098d1cf847c53ef
635+
4aac41560cacdc7ce166399df 5b0c0af91d5be3f7d8224755a aa6046de52875f9ef9ac15372 7ce08019bc2648beb4b1418cb 4979ff7eaeedaec2b15695508
636+
4d5a480cb939fdc7f00e6cc6f c0f9675276a9d607686c4d779 d4bb7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d4eaf 386acc17dea11e37a09f63da3
637+
d059243b35f449e891255ac7b 4f631509d7060f001c0002400 1
638+
""")
639+
t = TLS(clientHello3)
640+
clientESNI = t.msg[0].ext[11]
641+
assert isinstance(clientESNI, TLS_Ext_EncryptedServerName) and clientESNI.cipher == 4865
642+
643+
644+
= TLS_Ext_EncryptedServerName(), basic instantiation
645+
~ crypto_advanced
646+
647+
esni = TLS_Ext_EncryptedServerName(key_exchange_group=29,encrypted_sni=clean("""
648+
ffce016e1301001d00209 12e86b776ee552a6bb1e2 c70d7b467770b19043223 7cc743a93091dce246235
649+
00208bc16fdcbbc7c8756 808c94f70464d68297975 f33be90e1a200633f5eb2 d4c6101249e073bff8337
650+
82e57e882519a53ef8bde 4c94a7878a2f8461aec57 802440007c7b2dab986d9 bc79257ce00ca6a998b1f
651+
adb0114161069d364cceb ae8dab6c88151f297daea ecfd2e1a598a486e2efc9 561298f8dd5f35d184f0e
652+
87768777d253e68952b73 0a24b342fde10df4f8e82 afdc2f10c2481634d9201 5d9d5e6a9566494735d9c
653+
079115bdeb0cd019098d1 cf847c53ef4aac41560ca cdc7ce166399df5b0c0af 91d5be3f7d8224755aaa6
654+
046de52875f9ef9ac1537 27ce08019bc2648beb4b1 418cb4979ff7eaeedaec2 b156955084d5a480cb939
655+
fdc7f00e6cc6fc0f96752 76a9d607686c4d779d4bb 7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d
656+
4eaf386acc17dea11e37a 09f63da3d059243b35f44 9e891255ac7b4f631509d 7060f
657+
"""))
658+
assert esni.key_exchange_group == 29 and esni.encrypted_sni==clean("""
659+
ffce016e1301001d00209 12e86b776ee552a6bb1e2 c70d7b467770b19043223 7cc743a93091dce246235
660+
00208bc16fdcbbc7c8756 808c94f70464d68297975 f33be90e1a200633f5eb2 d4c6101249e073bff8337
661+
82e57e882519a53ef8bde 4c94a7878a2f8461aec57 802440007c7b2dab986d9 bc79257ce00ca6a998b1f
662+
adb0114161069d364cceb ae8dab6c88151f297daea ecfd2e1a598a486e2efc9 561298f8dd5f35d184f0e
663+
87768777d253e68952b73 0a24b342fde10df4f8e82 afdc2f10c2481634d9201 5d9d5e6a9566494735d9c
664+
079115bdeb0cd019098d1 cf847c53ef4aac41560ca cdc7ce166399df5b0c0af 91d5be3f7d8224755aaa6
665+
046de52875f9ef9ac1537 27ce08019bc2648beb4b1 418cb4979ff7eaeedaec2 b156955084d5a480cb939
666+
fdc7f00e6cc6fc0f96752 76a9d607686c4d779d4bb 7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d
667+
4eaf386acc17dea11e37a 09f63da3d059243b35f44 9e891255ac7b4f631509d 7060f
668+
""")
669+
622670
= Decrypt a TLS 1.3 session - Decrypt and parse server Application Data
623671
~ crypto_advanced
624672
# Values from RFC8448, section 3

0 commit comments

Comments
 (0)