diff --git a/.gitignore b/.gitignore index 3f4cc8a..2e8fbd6 100644 --- a/.gitignore +++ b/.gitignore @@ -169,3 +169,10 @@ dist/ *.egg-info/ *.egg venv + +/tlexport/pcaps_und_keylogs/quic_pcaps/hopefully_retries.pcapng +/tlexport/pcaps_und_keylogs/checktest.pcapng +/tlexport/pcaps_und_keylogs/cloudflare_quic.pcapng +/tlexport/pcaps_und_keylogs/http3_test.log +/tlexport/pcaps_und_keylogs/only_one.pcapng +/todo.md diff --git a/ANALYZING.md b/ANALYZING.md new file mode 100644 index 0000000..8b8d053 --- /dev/null +++ b/ANALYZING.md @@ -0,0 +1,17 @@ +## Analyzing TLExport's output + +### Wireshark +Analyzing TLExport's output with Wireshark is pretty much straight forward. Just open the PCAPNG of the decrypted traffic in Wireshark, and you should be good to go.
If you have used the --metadata option, it is possible that Wireshark does no automatically identifies the TLS-Handshake-Packets. + +![TLS-Handshake in ouput](./TLS_Handshake.png) +In this screenshot, the packets outlined in red, are the TLS-Handshake Packets. +### Zeek +You can read the output file with the following command: ```zeek -Cr out.pcapng local```
+Zeek currently does not support HTTP/2 or HTTP/3 out of the box (see [Zeek Docs](https://docs.zeek.org/en/v5.0.10/frameworks/tls-decryption.html#decrypting-a-trace-file)). Sessions using these protocols will have the notice ```bad_HTTP-request``` e.g. in the ```weird.log``` unless you have a plugin installed handling these protocols. +### Arkime +You can import the output file with the command: ```path/to/arkime/bin/capture -c /path/to/arkime/etc/config.ini -r output.pcapng --copy```
+![output in Arkime](TLS_Arkime.png) +An example session in Arkime with TLS-Handshake-Data + +#### Note: +Decrypted data from QUIC-Traffic is currently exported in UDP Datagrams, without the additional QUIC-Information or HTTP/3-Decompression. diff --git a/TLS_Arkime.png b/TLS_Arkime.png new file mode 100644 index 0000000..c95ae79 Binary files /dev/null and b/TLS_Arkime.png differ diff --git a/TLS_Handshake.png b/TLS_Handshake.png new file mode 100644 index 0000000..29b6cc2 Binary files /dev/null and b/TLS_Handshake.png differ diff --git a/setup.py b/setup.py index ff1521b..0645210 100644 --- a/setup.py +++ b/setup.py @@ -2,16 +2,20 @@ from setuptools import setup, find_packages from os.path import abspath, dirname, join -from tlexport.__init__ import __version__ -from tlexport.__init__ import __author__ +# here - where we are. +here = os.path.abspath(os.path.dirname(__file__)) + +# Path to the about.py file +about_py_path = join(here, "tlexport", "about.py") + +# Read version and author from about.py +with open(about_py_path) as f: + exec(f.read()) # Fetches the content from README.md # This will be used for the "long_description" field. README_MD = open(join(dirname(abspath(__file__)), "README.md")).read() -# here - where we are. -here = os.path.abspath(os.path.dirname(__file__)) - # read the package requirements for install_requires with open(os.path.join(here, 'requirements.txt'), 'r') as f: requirements = f.readlines() diff --git a/test/quic_tests/__init__.py b/test/quic_tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/quic_tests/test_quic_decode.py b/test/quic_tests/test_quic_decode.py new file mode 100644 index 0000000..af45150 --- /dev/null +++ b/test/quic_tests/test_quic_decode.py @@ -0,0 +1,20 @@ +from unittest import TestCase +from tlexport.quic.quic_decode import decode_variable_length_int, get_variable_length_int_length + + +class TestVariableLengthInt(TestCase): + def test_decode_variable_length_int(self): + self.assertEqual(0, decode_variable_length_int(b"\x00")) + self.assertEqual(63, decode_variable_length_int(b"\x3F")) + self.assertEqual(4611686018427387903, decode_variable_length_int(b"\xff\xff\xff\xff\xff\xff\xff\xff")) + self.assertEqual(151288809941952652, decode_variable_length_int(bytes.fromhex("c2197c5eff14e88c"))) + self.assertEqual(494878333, decode_variable_length_int(bytes.fromhex("9d7f3e7d"))) + self.assertEqual(15293, decode_variable_length_int(bytes.fromhex("7bbd"))) + self.assertEqual(37, decode_variable_length_int(bytes.fromhex("25"))) + self.assertEqual(37, decode_variable_length_int(bytes.fromhex("80000025"))) + + def test_get_variable_length_int_length(self): + self.assertEqual(1, get_variable_length_int_length(b"\x3F")) + self.assertEqual(2, get_variable_length_int_length(b"\x60")) + self.assertEqual(4, get_variable_length_int_length(b"\xA0")) + self.assertEqual(8, get_variable_length_int_length(b"\xff")) diff --git a/test/quic_tests/test_quic_decryptor.py b/test/quic_tests/test_quic_decryptor.py new file mode 100644 index 0000000..a488fbb --- /dev/null +++ b/test/quic_tests/test_quic_decryptor.py @@ -0,0 +1,115 @@ +from unittest import TestCase +from tlexport.quic.quic_decryptor import QuicDecryptor +from cryptography.hazmat.primitives.ciphers.aead import AESGCM, ChaCha20Poly1305 + + +class TestQuicDecryptor(TestCase): + def setUp(self): + self.initial_decryptor = QuicDecryptor( + [bytes.fromhex("cf3a5331653c364c88f0f379b6067e37"), bytes.fromhex("0ac1493ca1905853b0bba03e"), + bytes.fromhex("1f369613dd76d5467730efcbe3b1a22d"), bytes.fromhex("fa044b2f42a3fd3b46fb255c")], + AESGCM) + + self.handshake_decryptor_aes_gcm_128 = QuicDecryptor( + [bytes.fromhex("78639e484687af4124a1e645d636a34a"), bytes.fromhex("7076c4bd5fcb6e6cb1a7ac42"), + bytes.fromhex("37b2bc8a8d9d176a9ba730aed578badc"), bytes.fromhex("0856d73ad623683950a0407f")], + AESGCM + ) + + self.handshake_decryptor_aes_gcm_256 = QuicDecryptor( + [bytes.fromhex("6c64df56b16bc391b02ec889bd45dbf2bed95b62497a8e67440d45c86d66c37b"), bytes.fromhex("c887d819c4c70d55f3d3cccb"), + bytes.fromhex("0b39e53b5e55813cbbb10083d79db16b4aa659247d4e878df87256cd4f70efa8"), bytes.fromhex("493067a03444c8ccc180a966")], + AESGCM + ) + + self.handshake_decryptor_chacha20 = QuicDecryptor( + [bytes.fromhex("06ef6ffdcf3cc12419c036f7130636cb6a28fb1a385768a32bd5771924ad5d69"), + bytes.fromhex("73fd90daad1b4b88ebdfbc66"), + bytes.fromhex("02d99c4b142b9fd2473b19316c7492274bca67d6d6e75069bdde169c89a67d49"), + bytes.fromhex("729b4b99b677f7211ac61fb0")], + ChaCha20Poly1305 + ) + + self.chacha_decryptor = QuicDecryptor([bytes.fromhex("c6d98ff3441c3fe1b2182094f69caa2ed4b716b65488960a7a984979fb23e1c8"), bytes.fromhex("e0459b3474bdd0e44a41c144"), bytes.fromhex("c6d98ff3441c3fe1b2182094f69caa2ed4b716b65488960a7a984979fb23e1c8"), bytes.fromhex("e0459b3474bdd0e44a41c144")], ChaCha20Poly1305) + + self.application_decryptor_aes_128_gcm = QuicDecryptor( + [bytes.fromhex("cdca566efd02c0cd4c2d5c86e9287f02"), + bytes.fromhex("1bb922a352e6f308fad49cfd"), + bytes.fromhex("3ec0404a8f2c08e1b0817a20277bfcc3"), + bytes.fromhex("e2129b5df083342078368bc7")], AESGCM) + + self.application_decryptor_aes_256_gcm = QuicDecryptor([bytes.fromhex("ac7393a1f5e2ccf9fa20a126574a835ebbdc5d95d94058bc376999c1c1bfb9f8"), + bytes.fromhex("3c2ece416103632c18df9ab6"), + bytes.fromhex("ac7393a1f5e2ccf9fa20a126574a835ebbdc5d95d94058bc376999c1c1bfb9f8"), + bytes.fromhex("56649096a87d2da1a06b2224")], AESGCM) + def test_initial_decryption(self): + # Client Initial (From RFC 9001) + ciphertext = bytes.fromhex("d1b1c98dd7689fb8ec11d242b123dc9bd8bab936b47d92ec356c0bab7df5976d27cd449f63300099f3991c260ec4c60d17b31f8429157bb35a1282a643a8d2262cad67500cadb8e7378c8eb7539ec4d4905fed1bee1fc8aafba17c750e2c7ace01e6005f80fcb7df621230c83711b39343fa028cea7f7fb5ff89eac2308249a02252155e2347b63d58c5457afd84d05dfffdb20392844ae812154682e9cf012f9021a6f0be17ddd0c2084dce25ff9b06cde535d0f920a2db1bf362c23e596d11a4f5a6cf3948838a3aec4e15daf8500a6ef69ec4e3feb6b1d98e610ac8b7ec3faf6ad760b7bad1db4ba3485e8a94dc250ae3fdb41ed15fb6a8e5eba0fc3dd60bc8e30c5c4287e53805db059ae0648db2f64264ed5e39be2e20d82df566da8dd5998ccabdae053060ae6c7b4378e846d29f37ed7b4ea9ec5d82e7961b7f25a9323851f681d582363aa5f89937f5a67258bf63ad6f1a0b1d96dbd4faddfcefc5266ba6611722395c906556be52afe3f565636ad1b17d508b73d8743eeb524be22b3dcbc2c7468d54119c7468449a13d8e3b95811a198f3491de3e7fe942b330407abf82a4ed7c1b311663ac69890f4157015853d91e923037c227a33cdd5ec281ca3f79c44546b9d90ca00f064c99e3dd97911d39fe9c5d0b23a229a234cb36186c4819e8b9c5927726632291d6a418211cc2962e20fe47feb3edf330f2c603a9d48c0fcb5699dbfe5896425c5bac4aee82e57a85aaf4e2513e4f05796b07ba2ee47d80506f8d2c25e50fd14de71e6c418559302f939b0e1abd576f279c4b2e0feb85c1f28ff18f58891ffef132eef2fa09346aee33c28eb130ff28f5b766953334113211996d20011a198e3fc433f9f2541010ae17c1bf202580f6047472fb36857fe843b19f5984009ddc324044e847a4f4a0ab34f719595de37252d6235365e9b84392b061085349d73203a4a13e96f5432ec0fd4a1ee65accdd5e3904df54c1da510b0ff20dcc0c77fcb2c0e0eb605cb0504db87632cf3d8b4dae6e705769d1de354270123cb11450efc60ac47683d7b8d0f811365565fd98c4c8eb936bcab8d069fc33bd801b03adea2e1fbc5aa463d08ca19896d2bf59a071b851e6c239052172f296bfb5e72404790a2181014f3b94a4e97d117b438130368cc39dbb2d198065ae3986547926cd2162f40a29f0c3c8745c0f50fba3852e566d44575c29d39a03f0cda721984b6f440591f355e12d439ff150aab7613499dbd49adabc8676eef023b15b65bfc5ca06948109f23f350db82123535eb8a7433bdabcb909271a6ecbcb58b936a88cd4e8f2e6ff5800175f113253d8fa9ca8885c2f552e657dc603f252e1a8e308f76f0be79e2fb8f5d5fbbe2e30ecadd220723c8c0aea8078cdfcb3868263ff8f0940054da48781893a7e49ad5aff4af300cd804a6b6279ab3ff3afb64491c85194aab760d58a606654f9f4400e8b38591356fbf6425aca26dc85244259ff2b19c41b9f96f3ca9ec1dde434da7d2d392b905ddf3d1f9af93d1af5950bd493f5aa731b4056df31bd267b6b90a079831aaf579be0a39013137aac6d404f518cfd46840647e78bfe706ca4cf5e9c5453e9f7cfd2b8b4c8d169a44e55c88d4a9a7f9474241e221af44860018ab0856972e194cd934") + associated_data = bytes.fromhex("c300000001088394c8f03e5157080000449e00000002") + + plaintext: bytes = self.initial_decryptor.decrypt(ciphertext, b"\x02", associated_data, False) + plaintext = plaintext.rstrip(b"\x00") + self.assertEqual(plaintext, bytes.fromhex("060040f1010000ed0303ebf8fa56f12939b9584a3896472ec40bb863cfd3e86804fe3a47f06a2b69484c00000413011302010000c000000010000e00000b6578616d706c652e636f6dff01000100000a00080006001d0017001800100007000504616c706e000500050100000000003300260024001d00209370b2c9caa47fbabaf4559fedba753de171fa71f50f1ce15d43e994ec74d748002b0003020304000d0010000e0403050306030203080408050806002d00020101001c00024001003900320408ffffffffffffffff05048000ffff07048000ffff0801100104800075300901100f088394c8f03e51570806048000ffff")) + + # Server Initial (From RFC 9001) + ciphertext = bytes.fromhex("5a482cd0991cd25b0aac406a5816b6394100f37a1c69797554780bb38cc5a99f5ede4cf73c3ec2493a1839b3dbcba3f6ea46c5b7684df3548e7ddeb9c3bf9c73cc3f3bded74b562bfb19fb84022f8ef4cdd93795d77d06edbb7aaf2f58891850abbdca3d20398c276456cbc42158407dd074ee") + associated_data = bytes.fromhex("c1000000010008f067a5502a4262b50040750001") + + plaintext = self.initial_decryptor.decrypt(ciphertext, b"\x01", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex("02000000000600405a020000560303eefce7f7b37ba1d1632e96677825ddf73988cfc79825df566dc5430b9a045a1200130100002e00330024001d00209d3c940d89690b84d08a60993c144eca684d1081287c834d5311bcf32bb9da1a002b00020304")) + + def test_handshake_decryption(self): + # AES_GCM_128 + ciphertext = bytes.fromhex("92b62342219bd5f0989c8e34edaa995e26a7d2c09a4f0519701ad9b01d0c64e2fce6063a4d39a5374eb43573b4225ab618b8d0f0df12b1558b1769242b0934b40d25550cde3f43197587dbbf53fbc6755549cd3660d6940465bafe383920ad6c54d563dd7325af39ac818ec2d3307dfcd5d97fe2747b3b21263ca92efa55bf91c78c6e3471b74bf54b187e6701bfae21136de6192a62a3131490584219e52cd0aa6ab026fd0898175041da5fb9ea22ac0324823af86578c03a118839e8ef5a7e9134c460421bf8a7fd606b3c80980baeea55b77b6fb0800562577e0df4337cfbf4640f2f36498dcaf12c66656d347159fb43249470a4bf13277a4572e7fafac0b1bef68364b229bb3d83fb1273f972edb09af67f65058ca108d547fa195b6e444109cb3a92721d4f82b6503d96244b05bd7bc87ed65c96529fdf9738e9b5565c5429b819830b2ca481975486ae79e5e946a51d61329ade599fa77e5bcaab76e473b5e6386760d9d8a0d5ebe203efcc313a3152f5bbe28644a24ecd57a0a79f31ce330ac84ba4f07851ce6dac87ea257c6a1458c3a351601d4801368fbdcd124531ba2ba9bd2b4f3d3177ff94d966f45fc997df208bdbf370aae8e3a9c94c17ea148e1341a802ef6da05df92283ef5257e50d57a3d254a83c87b52693ecf8b6b5fbe082a891ac8111136bce2aab4dc2f23a4c4d367e36a5cc9f212844fad328247d7153ef7acf08d3cd538ee02dd8e6eb7eb90e0ceb1331f4c782adf0bc1a13c8afc807bcf8d6c190d46c35b180785d1fb7c645fb071c9cba1b8be2bfaa39864592b2d5a8f55392f138447866b3ff68cdaef9ffb8b551f74d18be4eedbe6f21c4dfa94237dff4004db5d08d9d7339ac2ddfce96c3e164215fc996b96fba3bd5636f6ab88fe3a724999fc38931f675d7f72deb87200d4ff251172c7b576ac99ad5b90d51a5aefed58c9fd0a376e7fab42f8725956f3559cee4444da826cad29edeb8f79370a709b060325b4e79643380998a17f4d58ff8521d93685b51bcb58b4179be88db8dd6eb1e32053b24f002229b5f7d2dc2749e6d2fab9d46433f3a66bdd539fb7707a2b694ce2c8b3253910b0012df66ade5674a84559eca3551232c30bcda48e906e94b7038dd179a776dd1e8bc8e0f07fcae912a7907c69b4d0ee78abde3bfd47cb5b0f49cf566712f26346ffbf410f34a8ed820ed7231b97c12804ef833724814320434ea9d33f7b8c536cb44c1a81efad7d24d8ecda1640766e3c6c693872c7f7236b59823ec1aaf2654e8ba544be18ca3066b6c2ada0293db03f1cff4269d2103e42334d2b3b0d6c0937546f2bcd4eae401e56d3c1dc1007afefc578c8f0fcdc512ea9f2e233023b54c33f62ed87e43b4820f") + associated_data = bytes.fromhex("a00000000111defbb4879c124a4b6be745d78143058068123ad3da1b240cb26a811418c2229675e1bc28800003d900") + + plaintext: bytes = self.handshake_decryptor_aes_gcm_128.decrypt(ciphertext, b"\x00", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex("060043c40800007e007c003900690012cce9b1516132de45fe88496eddb843506804021040e9a596e8cef986558a4f887b71f11f0f123ad3da1b240cb26a811418c2229675e1bc28060480040000070480040000040480100000080240640901030104800075300e01076ab20011080000000100000001001000050003026833001c000240010b0003a00000039c000397308203933082027ba00302010202146a95f37e73b552b1705f0ebfcdce7f1f99a05821300d06092a864886f70d01010b05003059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f7374301e170d3233313232313131303732325a170d3234313232303131303732325a3059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100e48e6d6c21c0fca9810817b31ee083f7cedc98f5b9cd1f038e4b4df756abcc261f66f131902a8c031615fd5411a917f656f893d649cd604daa73bd00fdd764fe3c6c1cc347e66ffb6c0714abf0f4b9cdf24d7d7d5b2596556f45e81672a565425cd64db8815f66c6529ae6f59eacc5cfeb969523332c94193fc6f4731b25fa4d355bbd2fac165b418c021992991f2e22c93eb7bcf25dfdbf4b47b17e7386f96716dae9681ce5e086f1d1c2f09deeaa87f518d47a2f540b44319b6e078ae4253c523267c1ee5cd123dec22a9055f50bccff6e401d4c59780b3ee2cb26131c5d5e9243f069fa60875aa3a907d2a3d6242e82e2d0d3928f191a4bad3fe33f5427530203010001a3533051301d0603551d0e0416041426e46d370ddf57c69be4f3b9a85d0aa32021a316301f0603551d2304183016801426e46d370ddf57c69be4f3b9a85d0aa32021a316300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100771e8ba50a264cc9ad131e9479b51eab889ac05aa00ab3662cc6200860a9c4ee3245f53a9137298bbefdc01529ee17725e0efeb614af8dbb478499b4feedb7a4c7380aba5b8d5705c8c1ab1da1a3bd99c50a41cd060dadeb654589bc06d98db2dfb787a985e8e18b8484c9730a2c87e62299c6b7981afc26a54a4997d651d669cfab9616ea50d2028dc486885574c5beb5ba7bf4cad8473ca5477bbc18046f2a")) + + # AES_GCM_256 + ciphertext = bytes.fromhex("5f6e36d345ccda9bb3723c0828e6657b50c9243daafa82787e8ac90434d55dd51a8d567ef3e1578facf225c32ba8fc04ddc59f0d2188fb4804f5e28a466c604e9ec2c021569f3cbceac6878738aceae12e8de8e21d4db276553f84eaf856b9d481906c68ddfa9c0ed195b9c72ad2dcc781787a5563ec9f9f5fbd0524a59f2630851c3e6e9f01e546ced7a02727b0ef72f6047b69e2e143c806181905b80ca5a5a6111deb3c277f272c20c94be007e1e794149192f5ada3f99a6e8a2e07b2f4d58e4235155ea8de77d2028bd75233dabcffbb4c1b165685e9f90d339a5639620b3a789485fbfe7a7b43f4feeb7960d09f1006de24b03f477b0b5f91358977f1febbf65600ed316c2341adae5549c32807b4157e621724057d93992f7bdba919f530279090c88002b90d93deb19b0879564950174a670aac0c49592750279f3c73c9f45c62b8d3dc10dc55f9ac9aa3b5c6846505fed7457279a6a7e53dbbd0d7fc51f4472cf8034e5ec0c710893905cb85eb577bcb99bb9de127328293ac1fe106ebd3714b4273b3ac9b22e6c43eb1d6413e141f73b40b6678ba3cd4639e94639f9a115ac39cf2b895893e8d61bee4642c69b84c5f5f8376817a8929b766b686d80820c40d7551bc960bf9f79a185372f18011f6fa4c7dd2f0d69a1d1adbb0ecd8275070d13f327c80a4faa55b537531fedcd2e51d530f7e4f65355905a7ff6b9bf215c184a254d2063263f1fb53ccd1c91eef6271e5aed6824bc22d844b26e4805d277f8d6b1a226e60dc04d4296ba080be349523c639befbb85f11125b621a6006856774f9164ba4c01211957f0d51b2008e38281a81e52f9bcbc40ec51711433ab7acf4edb0ac70b828b4bdb7d90124a0ff2183bd86945242f7e8a6c39dfc218bd286c4e0e9e38545514a16a3fc9819b51205028017b9501dfbd20105f0e98001267eea6d0165ea399a44d2e8f716abf06cc65aa4543f198e582aea704d55944fafd03c710c3f68994f3d3b223c66f596441b4ed98cfee6c87a00cca2faa27e3e7bbb42679670a273c1a0c2b74ee3a9f3b6cdecb3b3a2fbf590e40e0fe44e8f66f2b901eed024e62e9d9887e83ac7b92c023366c1e2b55a02916d987fdf880b0226d8b25086525d38ffa04db3e8064d3f22b1a89dbe1ea72dfdd211729a60371e266300905a594ca1f0070c8f8a0e27ab64080899d1bd16cca62bbfd15fcd3fd1561fb746df5050f0d4f57200ed7e8a3ea5e5e70d3ed744a21530ff0bfcd90caf24386c3bc8b6591e2ff0834efeda9b9fcfe2ddae022ca3fa9be775fa3aa2da46a8746c2e22bd0d05fa01e83e0813f1d41646850467db08e4b2ea96079b53a1fadcf708399a6ff68536ab1ec12e92856bc2788a") + associated_data = bytes.fromhex("e00000000111d938ff020b30ce7dfc3aed3ba582e019e712bddc7b61616794467cf4cd28819913b0c02e800003d500") + + plaintext: bytes = self.handshake_decryptor_aes_gcm_256.decrypt(ciphertext, b"\x00", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex("060043c00800007e007c0039006900123258bc5c70decd60aa5626797a18781db94102108e6630d562b2191fc725e284bcce233a0f12bddc7b61616794467cf4cd28819913b0c02e060480040000070480040000040480100000080240640901030104800075300e01076ab20011080000000100000001001000050003026833001c000240010b0003a00000039c000397308203933082027ba00302010202146a95f37e73b552b1705f0ebfcdce7f1f99a05821300d06092a864886f70d01010b05003059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f7374301e170d3233313232313131303732325a170d3234313232303131303732325a3059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100e48e6d6c21c0fca9810817b31ee083f7cedc98f5b9cd1f038e4b4df756abcc261f66f131902a8c031615fd5411a917f656f893d649cd604daa73bd00fdd764fe3c6c1cc347e66ffb6c0714abf0f4b9cdf24d7d7d5b2596556f45e81672a565425cd64db8815f66c6529ae6f59eacc5cfeb969523332c94193fc6f4731b25fa4d355bbd2fac165b418c021992991f2e22c93eb7bcf25dfdbf4b47b17e7386f96716dae9681ce5e086f1d1c2f09deeaa87f518d47a2f540b44319b6e078ae4253c523267c1ee5cd123dec22a9055f50bccff6e401d4c59780b3ee2cb26131c5d5e9243f069fa60875aa3a907d2a3d6242e82e2d0d3928f191a4bad3fe33f5427530203010001a3533051301d0603551d0e0416041426e46d370ddf57c69be4f3b9a85d0aa32021a316301f0603551d2304183016801426e46d370ddf57c69be4f3b9a85d0aa32021a316300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100771e8ba50a264cc9ad131e9479b51eab889ac05aa00ab3662cc6200860a9c4ee3245f53a9137298bbefdc01529ee17725e0efeb614af8dbb478499b4feedb7a4c7380aba5b8d5705c8c1ab1da1a3bd99c50a41cd060dadeb654589bc06d98db2dfb787a985e8e18b8484c9730a2c87e62299c6b7981afc26a54a4997d651d669cfab9616ea50d2028dc486885574c5beb5ba7bf4cad8473ca5477bbc")) + + # ChaCha20 + ciphertext = bytes.fromhex("4f30d5bea5bfb04354225fb9fb6f46e7d5efc9b204f5a256583afd58ff4f920d89fde64bcadc58f867607c0fe9085f0f5dccbf9a781daeeb2095e154f730019d6239399241db95933223c4934146eaeb3653945d9b21f6783b663c761094d4d3d3066bc80e25b48130ea131d13d166d8a2c1e74025d11d73f4706b377f1a6f4a8aeb62f2df6af4605a9d198648858ba03f9fd03d760bcde9767f31d9a239de72e1539fa209a4204667c7129b4908a86d34d28f44ba5ff57d827b30e9fe09bab157df87fcbf134f9f50f0cd41b146ad5cba94f38eedf6da9666d3bfb88873042da2de89980481986a9ccd9dfd922f28619531e1b9c0814a71fb9c8e0ea9bb9e90df9ea8bfad64d129a9acf0f40b9ff801639c9fda4f1bed4fb8e3e326923c2604808126abdd1d4991236f7d7e65d0969e37f876359e37f784f1604a451d0fe89991abfe27c15eda25134584c082af07102c3e63737f42ee49404c5adb382aa8ad232345de56ff0637fa5ae6dae47fc020515ea98f96448c17adb69da7e4002eee81085e44527a81effc4e84503111f46f44f097c0cb4f7e619761a7d76d7dbd58bff54160b6057ffca962cd9f8f67b9c98030fa79b48c7e9f98d5d586dd075c13db588cf8a80035fed5f7db72a85083962e714bb584bff3b6538f0a0e63ab94ce4110b8b7c10a018487350c304c5a28859d5cbe9d57a6d270a659c65cf83637b081650af418782eb591b12cc735f85e74b4553ff627dc6a5e52d162e03d65b809fdad4426e1b0c4b2ca877dd04a0e4d553a4adfb3cec5f29c63b708563e74bba7711a82ef0c8e51d9ead8ecbc91aef5910011c8f51c76cfdba213b02c4afc6fbb27d324e6ccb2b496c485fdc000dc75a556e380fab2ba7113083dc58bea458ab754b21b7d81d04a8c9e972938bd9002a8ade1bce68183c30f2c13bd31137f404a8e6e08f5886193c093db86730e7322362b84dd7b3865841fdb9fef36dd1499f4f586bf6995930453148957ed6caadcdd5c8a9b640158ddde5f438587ef936071104d075d95fd33ce9811dbfc7c34ebe1350e5fc4317b07c9e3a63f604d37a50ac39d2f97716848769a7668928a732a103437ae1698bdcfb356d60e601e885a81a19692cfd8bd797c651d3538912169fac45ac7e87dd44c52dae720103b824467c6f96338cbab42947af5d741c4bb64727cfdfe705a3c2a4f91cc0446a9bb795c887463d5bb4cce78592b54840eb7900da98b6d93f5e136fc44d05ec0e0631be8034a81f85b0e0c31a059b7a4998becaff514b726fedb0a04ac016d61bec420630bec264e2267c74eefbad7c3f8bb1d1d5642bac6a389abe7279d52a70be78f2a9004c29e4ba1102fbfdab25cf2cdbef8c897d96463d15578") + associated_data = bytes.fromhex("e000000001114d4baa6499963d98d83a6c7081fe81638912d3e8766e5ce3f9feacfe0535c4ff49973c02800003d900") + + plaintext: bytes = self.handshake_decryptor_chacha20.decrypt(ciphertext, b"\x00", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex("060043c40800007e007c003900690012cfdb664483ebe8ec888d7f48162918bd951f02101cbee388f5ae0135365a0e1cb33e58e20f12d3e8766e5ce3f9feacfe0535c4ff49973c02060480040000070480040000040480100000080240640901030104800075300e01076ab20011080000000100000001001000050003026833001c000240010b0003a00000039c000397308203933082027ba00302010202146a95f37e73b552b1705f0ebfcdce7f1f99a05821300d06092a864886f70d01010b05003059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f7374301e170d3233313232313131303732325a170d3234313232303131303732325a3059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100e48e6d6c21c0fca9810817b31ee083f7cedc98f5b9cd1f038e4b4df756abcc261f66f131902a8c031615fd5411a917f656f893d649cd604daa73bd00fdd764fe3c6c1cc347e66ffb6c0714abf0f4b9cdf24d7d7d5b2596556f45e81672a565425cd64db8815f66c6529ae6f59eacc5cfeb969523332c94193fc6f4731b25fa4d355bbd2fac165b418c021992991f2e22c93eb7bcf25dfdbf4b47b17e7386f96716dae9681ce5e086f1d1c2f09deeaa87f518d47a2f540b44319b6e078ae4253c523267c1ee5cd123dec22a9055f50bccff6e401d4c59780b3ee2cb26131c5d5e9243f069fa60875aa3a907d2a3d6242e82e2d0d3928f191a4bad3fe33f5427530203010001a3533051301d0603551d0e0416041426e46d370ddf57c69be4f3b9a85d0aa32021a316301f0603551d2304183016801426e46d370ddf57c69be4f3b9a85d0aa32021a316300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100771e8ba50a264cc9ad131e9479b51eab889ac05aa00ab3662cc6200860a9c4ee3245f53a9137298bbefdc01529ee17725e0efeb614af8dbb478499b4feedb7a4c7380aba5b8d5705c8c1ab1da1a3bd99c50a41cd060dadeb654589bc06d98db2dfb787a985e8e18b8484c9730a2c87e62299c6b7981afc26a54a4997d651d669cfab9616ea50d2028dc486885574c5beb5ba7bf4cad8473ca5477bbc18046f2a")) + + def test_application_decryption(self): + # AES_GCM_128 + ciphertext = bytes.fromhex( + "4891173d926bf46366891858af857a0d81b58a96f7d7d9c4816a71dcdc1c42365b1c953999fcef77a4ad6607c9833b004115389424c6c7ae6df2868ab1ea6e2953643b669efd702e07fc6214ae8a9bce53bfadb4da9d29b910fff4ab40c69bbf87cf1b405a063a03e2b42f58b28932f29ff8e3e2451ecec763b6540766b94df2f0349ac5cf356634a9835f214b05b592dd3cbb19f13d69794071aa3f9bf9f89b1b1222db0370c9a80a8f4347e0631427eeec02fb79a312a584e857076cca48501b08beebee8217521f9f642cceb16996d7b5788a064a5700423064d1e6afe815fc2e793bc2dc48b69b7f2c4a5e9ee6ae79c761724b1098daaccd6a74c8f287cb9114023b917486b5755d0ba49a16a72512") + associated_data = bytes.fromhex( + "00defbb4879c124a4b6be745d7814305806800") + + plaintext: bytes = self.application_decryptor_aes_128_gcm.decrypt(ciphertext, b"\x00", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex( + "18060012576a790d9836e634f2a5d4a5abc3c11e8ff144c88bf186946451fec4d63728e240ba18050012e5a9eb12a7f4a7c9df850b703dd3ce156076842d14467bd9a4b3b599efa9a5b62b2c1804001240a1ee1ab838763c741ee0fdc2b7933f26b14a01bef887d925ebae96f5f6550786f61803001253ec6a2cab70662f6959bc19b357313e5be3696b3a240f880f9dcd8ebd6ce36b244a18020012e5e6a99305ce0ffe692860d2e55487a984b4b4ca30b4107d8e2c992fea82f99e16571801001272420a5def8e1686907ed05ba74d68bdd1fca516976c6b1330f165d1021f51d6a59c0a031200040f06ffffffffffffffff0150000740640a0b01030a070102")) + + # AES_GCM_256 + ciphertext = bytes.fromhex( + "fefd9137f6a26e96b3b572282da02d8dd54271fa659737a0acdc19ccc50fd2cb1fd21aba2f9b1fa760aeaa17ce9e533c128df296559f621926c30dc5deb5397aedbc14339ab20543e7afdf6efec8ba2cecd72c94af86024e2bbe03a42c2d091e358233b758b5fbb1dbc3f6ad70a6c55c19d79766d0a87468399fa7804b8e10e15c225fc09bba138a1133467dcbd5fb5a4a2dc965cc6dcfa1460bb25b540c5867d188092907de9b497afc46d94585437be1aeaf477ab949edb0866a5fe770bc95640c5b9e83cdbfbe0aac85669277824441e283016fd9808611f03acb0f1dea388343cb542405760a1ebbbb05f2c52e8610d8178fc720c5beb34cf5aec030c920ec2ea691a3718ba1a8b4d9a04ef7a8bc7b") + associated_data = bytes.fromhex( + "40d938ff020b30ce7dfc3aed3ba582e019e700") + + plaintext: bytes = self.application_decryptor_aes_256_gcm.decrypt(ciphertext, b"\x00", associated_data, True) + + self.assertEqual(plaintext, bytes.fromhex( + "18060012d3e5394ef9763d79dcc35352c5bd817ab96ea6ee0343f1bf0b6e1c6eb7ac58e8177218050012d9f7316f0a439d5074d449827e88d8cfcd5a5086675a76dce403df0581555f1c5f4c18040012b33086adce7866f827bd296a43eb4f4159badeee5edab8298e1ce681db86478b044c18030012e4bfd134f33342ae43e481f20948ffdddfd6516deecfc6abda1741a81685768bae8018020012e26260c2e9a3766af1ba11298887a5995d29c1f30be6fd83e70b7f3f34d8f1e3bda618010012ffa6c7bdd1ff31822dc549a2ae317ce17da1627f59d13fa79dc8397a128539523b6f0a031200040f06ffffffffffffffff0150000740640a0b01030a070102")) + + def test_chacha_20_poly1305(self): + # Short Header Packet with ChaCha20-Poly1305 (From RFC 9001) + ciphertext = bytes.fromhex("655e5cd55c41f69080575d7999c25a5bfb") + associated_data = bytes.fromhex("4200bff4") + plaintext = self.chacha_decryptor.decrypt(ciphertext, bytes.fromhex("2700BFF4"), associated_data, True) + self.assertEqual(plaintext, b"\x01") diff --git a/test/quic_tests/test_quic_frame.py b/test/quic_tests/test_quic_frame.py new file mode 100644 index 0000000..12faa00 --- /dev/null +++ b/test/quic_tests/test_quic_frame.py @@ -0,0 +1,99 @@ +from unittest import TestCase +import tlexport.quic.quic_frame as frames +from tlexport.quic.quic_packet import QuicPacket, QuicPacketType, QuicHeaderType + + +class TestQuicFrameGeneration(TestCase): + def setUp(self): + self.quic_packet = QuicPacket(QuicHeaderType.LONG, QuicPacketType.HANDSHAKE, False, first_byte=None, ts=0) + + def test_ping_and_padding(self): + parsed_frames = frames.parse_frames(bytes.fromhex("010000"), self.quic_packet) + + self.assertEqual(type(parsed_frames[0]), frames.PingFrame) + self.assertEqual(parsed_frames[1].length, 2) + + def test_crypto_frame(self): + parsed_frames = frames.parse_frames(bytes.fromhex( + "0200414800000600405a020000560303b7be3c8d397996b7264f25fe5f624f4ac37e901a5acd517d408972a6ddb1cda800130100002e00330024001d0020813355ac9760c2dc4e7df93de0d5d9c120f58f38a381706c73d6177705e24a3c002b00020304") + bytes.fromhex( + "0000000000010001"), self.quic_packet) + + ack_frame: frames.AckFrame = parsed_frames[0] + self.assertEqual(0, ack_frame.largest_acknowledged) + self.assertEqual(328, ack_frame.ack_delay) + self.assertEqual(0, ack_frame.range_count) + self.assertEqual(0, ack_frame.first_ack_range) + crypto_frame: frames.CryptoFrame = parsed_frames[1] + self.assertEqual(0, crypto_frame.offset) + self.assertEqual(90, crypto_frame.crypto_length) + self.assertEqual(crypto_frame.crypto, bytes.fromhex( + "020000560303b7be3c8d397996b7264f25fe5f624f4ac37e901a5acd517d408972a6ddb1cda800130100002e00330024001d0020813355ac9760c2dc4e7df93de0d5d9c120f58f38a381706c73d6177705e24a3c002b00020304")) + + parsed_frames = frames.parse_frames(bytes.fromhex( + "064995450f413048931bbfb7f6e0450221e0964217cfd92b6556340726040da8fd7dca2eefea487c374d3f009f83dfef75842e79575cfc576e1a96fffc8c9aa699be25d97f962c06f7112a028080eb63183c504987e58aca5f192b59968100a0fb51dbca770b0bc9964fef7049c75c6d20fd99b4b4e2ca2e77fd2ddc0bb66b130c8c192b179698b9f08bf6a027bbb6e38d518fbdaec79bb1899d0203010001a38201803082017c300e0603551d0f0101ff040403020186301d0603551d250416301406082b0601050507030106082b0601050507030230120603551d130101ff040830060101ff020100301d0603551d0e041604148a747faf85cdee95cd3d9cd0e24614f371351d27301f0603551d23041830168014e4af2b26711a2b4827852f52662ceff08913713e306806082b06010505070101045c305a302606082b06010505073001861a687474703a2f2f6f6373702e706b692e676f6f672f6774737231303006082b060105050730028624687474703a2f2f706b692e676f6f672f7265706f2f63657274732f67747372312e64657230340603551d1f042d302b3029a027a0258623687474703a2f2f63726c2e706b692e676f6f672f67747372312f67747372312e63726c30570603551d200450304e3038060a2b06010401d679020503302a302806082b06010505070201161c68747470733a2f2f706b692e676f6f672f7265706f7369746f72792f3008060667810c0102013008060667810c010202300d06092a864886f70d01010b05000382020100897dac205c0c3cbe9aa857951bb4aefaaba57271b43695fddf4011034cc24614bb1424abf0507122dbadc46e7fcff16a6fc8831bd8ce895f876c87b8a90ca39ba162949395df5bae66190b02969efcb5e710693e7acb46495f46e141b1d7984d653400801a3f4f9f6c7f4900815341a4922182821af1a3445b2a5012134dc15336f34208af54fa8e77531b6438271709bd58c91b7c392d5bf3ced4ed97db1403bf0953241fc20c04799826f261f15352fd428c1b662b3f15a1bbfff69be3819a01067189352824dde1bdeb192de148cb3d598351b474c69d7cc6b1865bafcc34c4d3ccd481119500a1f4122201fab48371af8cb78c7324ac3753c200903f11fe5ced3694103bbd29aee2c73a623b6c63d980bf5971ac6327b94c17a0daf67315bf2ade8ff3a56c32813303d08651719934ba938d5db55158f7b293e801f659be719bfd4d28cecf6dc716dcf7d1d6469ba7ca6be9770ffda0b61b23831d101ad9090084e044d3a27523b33486f620b0a45e101de05246009db10f1f217051f59add06fc55f42b0e3377c34b42c2f17713fc738094eb1fbb373fce022a66b0731d32a5326c32b08ee0c423ff5b7d4d6570ac2b9b3dcedbe06d8e3280be969f9263bc97bb5db9f4e1715e2ae4ef0322b18a653a8fc09365d485cd0f0f5b83591647162d9c243ac880a62614859bf6379bac6ff9c5c30651f3e27fc5b110ba51f4dd0000000566308205623082044aa003020102021077bd0d6cdb36f91aea210fc4f058d30d300d06092a864886f70d01010b05003057310b300906035504061302424531193017060355040a1310476c6f62616c5369676e206e762d73613110300e060355040b1307526f6f74204341311b301906035504031312476c6f62616c5369676e20526f6f74204341301e170d3230303631393030303034325a170d3238303132383030303034325a3047310b300906035504061302555331223020060355040a1319476f6f676c65205472757374205365727669636573204c"), self.quic_packet) + crypto_frame: frames.CryptoFrame = parsed_frames[0] + self.assertEqual(2453, crypto_frame.offset) + self.assertEqual(1295, crypto_frame.crypto_length) + self.assertEqual(crypto_frame.crypto, bytes.fromhex( + "413048931bbfb7f6e0450221e0964217cfd92b6556340726040da8fd7dca2eefea487c374d3f009f83dfef75842e79575cfc576e1a96fffc8c9aa699be25d97f962c06f7112a028080eb63183c504987e58aca5f192b59968100a0fb51dbca770b0bc9964fef7049c75c6d20fd99b4b4e2ca2e77fd2ddc0bb66b130c8c192b179698b9f08bf6a027bbb6e38d518fbdaec79bb1899d0203010001a38201803082017c300e0603551d0f0101ff040403020186301d0603551d250416301406082b0601050507030106082b0601050507030230120603551d130101ff040830060101ff020100301d0603551d0e041604148a747faf85cdee95cd3d9cd0e24614f371351d27301f0603551d23041830168014e4af2b26711a2b4827852f52662ceff08913713e306806082b06010505070101045c305a302606082b06010505073001861a687474703a2f2f6f6373702e706b692e676f6f672f6774737231303006082b060105050730028624687474703a2f2f706b692e676f6f672f7265706f2f63657274732f67747372312e64657230340603551d1f042d302b3029a027a0258623687474703a2f2f63726c2e706b692e676f6f672f67747372312f67747372312e63726c30570603551d200450304e3038060a2b06010401d679020503302a302806082b06010505070201161c68747470733a2f2f706b692e676f6f672f7265706f7369746f72792f3008060667810c0102013008060667810c010202300d06092a864886f70d01010b05000382020100897dac205c0c3cbe9aa857951bb4aefaaba57271b43695fddf4011034cc24614bb1424abf0507122dbadc46e7fcff16a6fc8831bd8ce895f876c87b8a90ca39ba162949395df5bae66190b02969efcb5e710693e7acb46495f46e141b1d7984d653400801a3f4f9f6c7f4900815341a4922182821af1a3445b2a5012134dc15336f34208af54fa8e77531b6438271709bd58c91b7c392d5bf3ced4ed97db1403bf0953241fc20c04799826f261f15352fd428c1b662b3f15a1bbfff69be3819a01067189352824dde1bdeb192de148cb3d598351b474c69d7cc6b1865bafcc34c4d3ccd481119500a1f4122201fab48371af8cb78c7324ac3753c200903f11fe5ced3694103bbd29aee2c73a623b6c63d980bf5971ac6327b94c17a0daf67315bf2ade8ff3a56c32813303d08651719934ba938d5db55158f7b293e801f659be719bfd4d28cecf6dc716dcf7d1d6469ba7ca6be9770ffda0b61b23831d101ad9090084e044d3a27523b33486f620b0a45e101de05246009db10f1f217051f59add06fc55f42b0e3377c34b42c2f17713fc738094eb1fbb373fce022a66b0731d32a5326c32b08ee0c423ff5b7d4d6570ac2b9b3dcedbe06d8e3280be969f9263bc97bb5db9f4e1715e2ae4ef0322b18a653a8fc09365d485cd0f0f5b83591647162d9c243ac880a62614859bf6379bac6ff9c5c30651f3e27fc5b110ba51f4dd0000000566308205623082044aa003020102021077bd0d6cdb36f91aea210fc4f058d30d300d06092a864886f70d01010b05003057310b300906035504061302424531193017060355040a1310476c6f62616c5369676e206e762d73613110300e060355040b1307526f6f74204341311b301906035504031312476c6f62616c5369676e20526f6f74204341301e170d3230303631393030303034325a170d3238303132383030303034325a3047310b300906035504061302555331223020060355040a1319476f6f676c65205472757374205365727669636573204c")) + + def test_stream_frame(self): + parsed_frames = frames.parse_frames(bytes.fromhex( + "080300041f018001000006800100000740640801c00000044fc25e00c0000000997dd1d8c0000000af79f09b02e68e"), self.quic_packet) + stream_frame: frames.StreamFrame = parsed_frames[0] + self.assertEqual(stream_frame.stream_id, 3) + self.assertEqual(stream_frame.fin, False) + self.assertEqual(stream_frame.off, False) + self.assertEqual(stream_frame.len, False) + self.assertEqual(stream_frame.data_length, 45) + self.assertEqual(stream_frame.server_initiated, True) + self.assertEqual(stream_frame.stream_unidirectional, True) + self.assertEqual(stream_frame.length, 47) + + parsed_frames = frames.parse_frames(bytes.fromhex( + "0b0040a101409e0684d1d75098b2c696596454b35336572af742f31cf3505ee690a75c87a751896262d45b0692c42035105f50b4d07f66a281b0dae053fafc087ed4ce6aadf2a7979c89c6bed4b3bdc0882b83fb531149d4ec0801000200a984d61653f960220ae05f0e93352398ac0fb9a5fa352398ac782c75fd7cb1f35f398b2d4b70ddf45abefb4005dbdf115d929d29ad171863c78f0bfa3da9b632ae43d2c71213140e0605405f66aec31ec327d783b606bf661d095ad4164f98b2c696596454b35336572af742f31cf3505ee690a75c87a76a4148b4a549275a42a13f84352398bf6a4148b4a549275a93c85f85a8eb10f6236a4148b4a549275906497f872587421641925f"), self.quic_packet) + stream_frame: frames.StreamFrame = parsed_frames[0] + self.assertEqual(stream_frame.stream_id, 0) + self.assertEqual(stream_frame.fin, True) + self.assertEqual(stream_frame.off, False) + self.assertEqual(stream_frame.len, True) + self.assertEqual(stream_frame.data_length, 161) + self.assertEqual(stream_frame.server_initiated, False) + self.assertEqual(stream_frame.stream_unidirectional, False) + self.assertEqual(stream_frame.length, 165) + + stream_frame: frames.StreamFrame = parsed_frames[1] + self.assertEqual(stream_frame.stream_id, 6) + self.assertEqual(stream_frame.fin, False) + self.assertEqual(stream_frame.off, True) + self.assertEqual(stream_frame.len, True) + self.assertEqual(stream_frame.data_length, 95) + self.assertEqual(stream_frame.server_initiated, False) + self.assertEqual(stream_frame.stream_unidirectional, True) + self.assertEqual(stream_frame.length, 100) + + def test_handshake_done_packet(self): + parsed_frames = frames.parse_frames(bytes.fromhex( + "1e0740410095028230a8f84f9402b7e252734ad7cc45d4e291c4909931164d2c15d769c0504390b2198dc477ba147f7184c67ab5e27f69667733df75fd6bb8ff8d8ca0273b18010008e01f26872f1ff3d8f60b2d543c097238b39865dd3e7b5880"), self.quic_packet) + self.assertEqual(0x1e, parsed_frames[0].frame_type) + self.assertEqual(1, parsed_frames[0].length) + token_frame: frames.NewTokenFrame = parsed_frames[1] + self.assertEqual(65, token_frame.token_length) + self.assertEqual(bytes.fromhex( + "0095028230a8f84f9402b7e252734ad7cc45d4e291c4909931164d2c15d769c0504390b2198dc477ba147f7184c67ab5e27f69667733df75fd6bb8ff8d8ca0273b"), + token_frame.token) + new_connection_id_frame: frames.NewConnectionIdFrame = parsed_frames[2] + self.assertEqual(1, new_connection_id_frame.sequence_number) + self.assertEqual(0, new_connection_id_frame.retire_prior_to) + self.assertEqual(8, new_connection_id_frame.connection_id_length) + self.assertEqual(bytes.fromhex("e01f26872f1ff3d8"), new_connection_id_frame.connection_id) + self.assertEqual(bytes.fromhex("f60b2d543c097238b39865dd3e7b5880"), + new_connection_id_frame.stateless_reset_token) + + def test_datagram_frame(self): + parsed_frames = frames.parse_frames(bytes.fromhex( + "310454657374"), + self.quic_packet) + datagram_frames: frames.DatagramFrame = parsed_frames[0] + self.assertEqual(datagram_frames.length, 6) + self.assertEqual(datagram_frames.payload, b"Test") diff --git a/test/quic_tests/test_quic_key_generation.py b/test/quic_tests/test_quic_key_generation.py new file mode 100644 index 0000000..f8ef835 --- /dev/null +++ b/test/quic_tests/test_quic_key_generation.py @@ -0,0 +1,95 @@ +from unittest import TestCase +from tlexport.quic.quic_key_generation import dev_initial_keys, dev_quic_keys, key_update +from cryptography.hazmat.primitives.hashes import SHA256 +from tlexport.keylog_reader import Key +from tlexport.quic.quic_decryptor import QuicDecryptor +from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 +from tlexport.quic.quic_decode import QuicVersion + + +class TestQuicKeyGen(TestCase): + def setUp(self) -> None: + self.destination_connection_id = bytes.fromhex("8394c8f03e515708") + + self.keylog = [ + Key("CLIENT_HANDSHAKE_TRAFFIC_SECRET 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f b8902ab5f9fe52fdec3aea54e9293e4b8eabf955fcd88536bf44b8b584f14982"), + Key("SERVER_HANDSHAKE_TRAFFIC_SECRET 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 88ad8d3b0986a71965a28d108b0f40ffffe629284a6028c80ddc5dc083b3f5d1"), + Key("CLIENT_TRAFFIC_SECRET_0 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f a877a82fd5f89ba622eb03dc5868fd00a31cc2eb8646b362a75bc14893a8ef07"), + Key("SERVER_TRAFFIC_SECRET_0 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f a1bfa69e7051fd609946fd9431a51992617c4ddb9c1269c9c0b70cc91b297751"), + Key("CLIENT_EARLY_TRAFFIC_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 191c930430d813e11540996f2ed70b637f1722104d025530dedbd7f39acb1855") + ] + + def test_dev_initial_keys(self): + initial_keys = dev_initial_keys(self.destination_connection_id, QuicVersion.V1) + self.assertEqual(initial_keys["client_initial_key"], bytes.fromhex("1f369613dd76d5467730efcbe3b1a22d")) + self.assertEqual(initial_keys["client_initial_iv"], bytes.fromhex("fa044b2f42a3fd3b46fb255c")) + self.assertEqual(initial_keys["client_initial_hp"], bytes.fromhex("9f50449e04a0e810283a1e9933adedd2")) + self.assertEqual(initial_keys["server_initial_key"], bytes.fromhex("cf3a5331653c364c88f0f379b6067e37")) + self.assertEqual(initial_keys["server_initial_iv"], bytes.fromhex("0ac1493ca1905853b0bba03e")) + self.assertEqual(initial_keys["server_initial_hp"], bytes.fromhex("c206b8d9b9f0f37644430b490eeaa314")) + + def test_quic_tls_keys(self): + quic_keys = dev_quic_keys(16, self.keylog, SHA256(), QuicVersion.V1) + # Handshake Keys + self.assertEqual(quic_keys["client_handshake_key"], bytes.fromhex("30a7e816f6a1e1b3434cf39cf4b415e7")) + self.assertEqual(quic_keys["server_handshake_key"], bytes.fromhex("17abbf0a788f96c6986964660414e7ec")) + self.assertEqual(quic_keys["client_handshake_iv"], bytes.fromhex("11e70a5d1361795d2bb04465")) + self.assertEqual(quic_keys["server_handshake_iv"], bytes.fromhex("09597a2ea3b04c00487e71f3")) + self.assertEqual(quic_keys["client_handshake_hp"], bytes.fromhex("84b3c21cacaf9f54c885e9a506459079")) + self.assertEqual(quic_keys["server_handshake_hp"], bytes.fromhex("2a18061c396c2828582b41b0910ed536")) + + # Application Keys + self.assertEqual(quic_keys["client_application_key"], bytes.fromhex("e010a295f0c2864f186b2a7e8fdc9ed7")) + self.assertEqual(quic_keys["server_application_key"], bytes.fromhex("fd8c7da9de1b2da4d2ef9fd5188922d0")) + self.assertEqual(quic_keys["client_application_iv"], bytes.fromhex("eb3fbc384a3199dcf6b4c808")) + self.assertEqual(quic_keys["server_application_iv"], bytes.fromhex("02f6180e4f4aa456d7e8a602")) + self.assertEqual(quic_keys["client_application_hp"], bytes.fromhex("8a6a38bc5cc40cb482a254dac68c9d2f")) + self.assertEqual(quic_keys["server_application_hp"], bytes.fromhex("b7f6f021453e52b58940e4bba72a35d4")) + + def test_quic_key_update(self): + decryptor_n = QuicDecryptor( + [bytes.fromhex("c6d98ff3441c3fe1b2182094f69caa2ed4b716b65488960a7a984979fb23e1c8"), + bytes.fromhex("e0459b3474bdd0e44a41c144"), + bytes.fromhex("c6d98ff3441c3fe1b2182094f69caa2ed4b716b65488960a7a984979fb23e1c8"), + bytes.fromhex("e0459b3474bdd0e44a41c144"), + bytes.fromhex("9ac312a7f877468ebe69422748ad00a15443f18203a07d6060f688f30f21632b"), + bytes.fromhex("9ac312a7f877468ebe69422748ad00a15443f18203a07d6060f688f30f21632b")], ChaCha20Poly1305) + + updated = key_update(decryptor_n, SHA256, 32, ChaCha20Poly1305, QuicVersion.V1) + self.assertEqual(updated.keys[-1], + bytes.fromhex("1223504755036d556342ee9361d253421a826c9ecdf3c7148684b36b714881f9")) + + +class TestQuicKeyGenV2(TestCase): + def setUp(self) -> None: + self.destination_connection_id = bytes.fromhex("8394c8f03e515708") + + self.keylog = [ + Key("CLIENT_HANDSHAKE_TRAFFIC_SECRET 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f b8902ab5f9fe52fdec3aea54e9293e4b8eabf955fcd88536bf44b8b584f14982"), + Key("SERVER_HANDSHAKE_TRAFFIC_SECRET 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 88ad8d3b0986a71965a28d108b0f40ffffe629284a6028c80ddc5dc083b3f5d1"), + Key("CLIENT_TRAFFIC_SECRET_0 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f a877a82fd5f89ba622eb03dc5868fd00a31cc2eb8646b362a75bc14893a8ef07"), + Key("SERVER_TRAFFIC_SECRET_0 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f a1bfa69e7051fd609946fd9431a51992617c4ddb9c1269c9c0b70cc91b297751"), + Key("CLIENT_EARLY_TRAFFIC_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 191c930430d813e11540996f2ed70b637f1722104d025530dedbd7f39acb1855") + ] + + def test_dev_initial_keys(self): + initial_keys = dev_initial_keys(self.destination_connection_id, QuicVersion.V2) + self.assertEqual(initial_keys["client_initial_key"], bytes.fromhex("8b1a0bc121284290a29e0971b5cd045d")) + self.assertEqual(initial_keys["client_initial_iv"], bytes.fromhex("91f73e2351d8fa91660e909f")) + self.assertEqual(initial_keys["client_initial_hp"], bytes.fromhex("45b95e15235d6f45a6b19cbcb0294ba9")) + self.assertEqual(initial_keys["server_initial_key"], bytes.fromhex("82db637861d55e1d011f19ea71d5d2a7")) + self.assertEqual(initial_keys["server_initial_iv"], bytes.fromhex("dd13c276499c0249d3310652")) + self.assertEqual(initial_keys["server_initial_hp"], bytes.fromhex("edf6d05c83121201b436e16877593c3a")) + + def test_quic_key_update(self): + decryptor_n = QuicDecryptor( + [bytes.fromhex("3bfcddd72bcf02541d7fa0dd1f5f9eeea817e09a6963a0e6c7df0f9a1bab90f2"), + bytes.fromhex("e0459b3474bdd0e44a41c144"), + bytes.fromhex("c6d98ff3441c3fe1b2182094f69caa2ed4b716b65488960a7a984979fb23e1c8"), + bytes.fromhex("e0459b3474bdd0e44a41c144"), + bytes.fromhex("9ac312a7f877468ebe69422748ad00a15443f18203a07d6060f688f30f21632b"), + bytes.fromhex("9ac312a7f877468ebe69422748ad00a15443f18203a07d6060f688f30f21632b")], ChaCha20Poly1305) + + updated = key_update(decryptor_n, SHA256, 32, ChaCha20Poly1305, QuicVersion.V2) + self.assertEqual(updated.keys[-1], + bytes.fromhex("1223504755036d556342ee9361d253421a826c9ecdf3c7148684b36b714881f9")) diff --git a/test/quic_tests/test_quic_tls_parser.py b/test/quic_tests/test_quic_tls_parser.py new file mode 100644 index 0000000..cfedfa6 --- /dev/null +++ b/test/quic_tests/test_quic_tls_parser.py @@ -0,0 +1,75 @@ +from unittest import TestCase +from tlexport.quic.quic_tls_parser import QuicTlsSession +from tlexport.quic.quic_frame import CryptoFrame +from tlexport.quic.quic_packet import QuicPacket, QuicHeaderType, QuicPacketType + + +class TestQuicTlsParser(TestCase): + def setUp(self): + self.grease_session = QuicTlsSession() + + self.quic_tls_session = QuicTlsSession() + self.quic_tls_session_2 = QuicTlsSession() + + self.initial_packet_client = QuicPacket(QuicHeaderType.LONG, QuicPacketType.INITIAL, False, first_byte=None, ts=0) + self.initial_packet_server = QuicPacket(QuicHeaderType.LONG, QuicPacketType.INITIAL, True, first_byte=None, ts=0) + + self.handshake_packet_client = QuicPacket(QuicHeaderType.LONG, QuicPacketType.HANDSHAKE, False, first_byte=None, ts=0) + self.handshake_packet_server = QuicPacket(QuicHeaderType.LONG, QuicPacketType.HANDSHAKE, True, first_byte=None, ts=0) + + self.rtt_1_packet_client = QuicPacket(QuicHeaderType.SHORT, QuicPacketType.RTT_1, False, first_byte=None, ts=0) + self.rtt_1_packet_server = QuicPacket(QuicHeaderType.SHORT, QuicPacketType.RTT_1, True, first_byte=None, ts=0) + + self.rtt_0_packet_client = QuicPacket(QuicHeaderType.SHORT, QuicPacketType.RTT_O, False, first_byte=None, ts=0) + self.rtt_0_packet_server = QuicPacket(QuicHeaderType.SHORT, QuicPacketType.RTT_O, True, first_byte=None, ts=0) + + def test_grease_bit(self): + client_hello = bytes.fromhex("06004164010001600303b5aa1aa50bf1a0b538fc0490553b7e40f10859e82ed7f6c82cb485bdec8c5cb20000021301010001350039003f0f1185b6d35dd134fec53f53bb1cefceb7272d050480600000070480600000040480f00000090240640104800075300e01076ab20011080000000100000001000500050100000000000a000a0008001d001700180019000b00020100000d00220020040108090804040308070501080a0805050308080601080b08060603020102030010000500030268330016000000170000002300000033006b0069001d0020f501aa55e894953c84ff651d24b184f868b5fce4c402a13a640b80a0a04690650017004104b410eff4fb20bb78ef7014834162247a76267eaa13ecc5cba8c223a055ebece690bb48812b3f8e6e586c70d9614ad19afb666d376a94de75c0e223e230629a10002b0003020304ff010001000000000e000c0000096c6f63616c686f7374002d0003020100001c00024001") + + frame = CryptoFrame(client_hello, self.initial_packet_client) + self.grease_session.update_session(frame) + + self.assertEqual(self.grease_session.greasy_bit, True) + + def test_client_hello(self): + client_hello = bytes.fromhex( + "06004224010002200303baa39ecf56d1d50e2626737a5254c8e0ce1b97dd576ff9030637626c6bd5f2fc0000081301130213031304010001efffa5003f0f11f48b4afc4a98ec1e372ee23d5eb7b79638050480600000070480600000040480f00000090240640104800075300e01076ab200110800000001000000010039003f0f11f48b4afc4a98ec1e372ee23d5eb7b79638050480600000070480600000040480f00000090240640104800075300e01076ab20011080000000100000001fe0d00d40000010001e30020be6ea58a46f137aba63894dac652151e1444fd5be3424b5fa4234703d97d446500aa5048a9e3367548056e58647b1267ef63b77b9326d52973ac299474220bf04a8d084f564d06c988ca2723489f913071b5fe1a492fefb8127bbc4734104a1ca91fb56cfdff7502bdfe79945978751a65b570bfc88a48f59ad98293653b60a567a32493d51d9e8071d279fa30b81e16cda0f2b5b8e1740588d917a5eb2f05ea1672de54fdce629b643b57db28430d36eb4aaabe390bb3de5f22cdbb50e601ed349fef596da25d7166122895002d0003020001003300260024001d002086256c8e19e0e7add482405897504693eeb3c856629d5c116becabe1163b1808002b0003020304000d002400220603050304030203080708080806080b0805080a0804080906010501040103010201001600000000000e000c0000096c6f63616c686f7374001000050003026833000a000a0008001d00170018001900230000") + frame = CryptoFrame(client_hello, self.initial_packet_client) + self.quic_tls_session.update_session(frame) + self.assertEqual(self.quic_tls_session.client_random, + b"\xba\xa3\x9e\xcf\x56\xd1\xd5\x0e\x26\x26\x73\x7a\x52\x54\xc8\xe0\xce\x1b\x97\xdd\x57\x6f\xf9\x03\x06\x37\x62\x6c\x6b\xd5\xf2\xfc") + self.assertEqual(self.quic_tls_session.new_data, True) + + def test_server_hello(self): + server_hello = b"\x06\x00\x40\x5a\x02\x00\x00\x56\x03\x03\x79\xf0\xd4\x71\x26\x23" \ + b"\xe6\x55\x05\x6a\x6f\x10\x00\x05\x11\x0e\x4c\x17\x63\x10\xce\x45" \ + b"\x24\xa7\xca\x2e\x4d\x31\xf5\x38\x36\x69\x00\x13\x01\x00\x00\x2e" \ + b"\x00\x33\x00\x24\x00\x1d\x00\x20\x1a\xb1\x2a\x7d\x49\x3a\x07\xda" \ + b"\xd0\x39\x4b\x59\xcd\x21\x18\x78\xb2\x4e\x5e\xf9\xb0\x6d\xc9\xb7" \ + b"\xbd\x55\xef\x39\xaa\xa4\x4e\x0a\x00\x2b\x00\x02\x03\x04" + + frame = CryptoFrame(server_hello, self.initial_packet_server) + self.quic_tls_session.update_session(frame) + self.assertEqual(self.quic_tls_session.new_data, True) + self.assertEqual(self.quic_tls_session.alpn, None) + self.assertEqual(self.quic_tls_session.ciphersuite, b"\x13\x01") + self.assertEqual(self.quic_tls_session.tls_vers, b"\x03\x04") + + def test_handshake_messages(self): + handshake_msg = bytes.fromhex("060043ba080000780076003900690012d901c5d91b6c9e1049eb426a64b621f1797f021037ec51176eb41a9e7e0e669685d3fb550f1278b002327c363d06d8fda4f13e3240da7046060480040000070480040000040480100000080240640901030104800075300e01076ab200110800000001000000010010000500030268330b0003a00000039c000397308203933082027ba00302010202146a95f37e73b552b1705f0ebfcdce7f1f99a05821300d06092a864886f70d01010b05003059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f7374301e170d3233313232313131303732325a170d3234313232303131303732325a3059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100e48e6d6c21c0fca9810817b31ee083f7cedc98f5b9cd1f038e4b4df756abcc261f66f131902a8c031615fd5411a917f656f893d649cd604daa73bd00fdd764fe3c6c1cc347e66ffb6c0714abf0f4b9cdf24d7d7d5b2596556f45e81672a565425cd64db8815f66c6529ae6f59eacc5cfeb969523332c94193fc6f4731b25fa4d355bbd2fac165b418c021992991f2e22c93eb7bcf25dfdbf4b47b17e7386f96716dae9681ce5e086f1d1c2f09deeaa87f518d47a2f540b44319b6e078ae4253c523267c1ee5cd123dec22a9055f50bccff6e401d4c59780b3ee2cb26131c5d5e9243f069fa60875aa3a907d2a3d6242e82e2d0d3928f191a4bad3fe33f5427530203010001a3533051301d0603551d0e0416041426e46d370ddf57c69be4f3b9a85d0aa32021a316301f0603551d2304183016801426e46d370ddf57c69be4f3b9a85d0aa32021a316300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100771e8ba50a264cc9ad131e9479b51eab889ac05aa00ab3662cc6200860a9c4ee3245f53a9137298bbefdc01529ee17725e0efeb614af8dbb478499b4feedb7a4c7380aba5b8d5705c8c1ab1da1a3bd99c50a41cd060dadeb654589bc06d98db2dfb787a985e8e18b8484c9730a2c87e62299c6b7981afc26a54a4997d651d669cfab9616ea50d2028dc486885574c5beb5ba7bf4cad8473ca5477bbc") + frame = CryptoFrame(handshake_msg, self.handshake_packet_server) + self.quic_tls_session.update_session(frame) + self.assertEqual(self.quic_tls_session.alpn, b"h3") + + def test_out_of_order(self): + certificate = bytes.fromhex("0643ba419218046f2a8f27b524c8627833f09024aefa19a3ebf10909ba7ec1fa5c25b435c90f6c5edd3cc80bea12f88fef76a0897aa3cf26fec64fc73bc252c278b40b6e3c44d6153b5523a2fd3f8b77de56bb8f4f0a906f8e7414a8703cf758d441e8de0b0d58acb800000f0001040804010001b2ca8c8ebdb34c3ee8e7dcf178d1902e749d018b359193811ddb213db8972ad8cf70ea94c955082a9a84fc0198418bce654017519ae698f8753ececdd55eb8c58515c05263bc618a09092021b8b26c793059582bd321f25b085aca04d771ebed3b300900a251c3ccd3525dafd38794428ec1b4197ceb8034e7774497816f34be70bce97e775a7cc928ba6a52b44f349d91b3d14840db60a76670c311c52aa2686c026fbb5c4424afc8d862bc786c59659e173765cb03685a00296f1f6bdd10b478f6672d1cd8c94d164cd72b63e5b683e3bf1c39f7cf5439c6a92d600bd58f16a021a8efec2cc04a0524d833eeec6ec026e5f6cb5b2e708ae4683a942f27fb14000020b12aeea7d1c736b65f9b6d35c52fc846a8145edbcf3df07ec2376cee596b9b7b") + handshake_msg = bytes.fromhex("060043ba080000780076003900690012d901c5d91b6c9e1049eb426a64b621f1797f021037ec51176eb41a9e7e0e669685d3fb550f1278b002327c363d06d8fda4f13e3240da7046060480040000070480040000040480100000080240640901030104800075300e01076ab200110800000001000000010010000500030268330b0003a00000039c000397308203933082027ba00302010202146a95f37e73b552b1705f0ebfcdce7f1f99a05821300d06092a864886f70d01010b05003059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f7374301e170d3233313232313131303732325a170d3234313232303131303732325a3059310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100e48e6d6c21c0fca9810817b31ee083f7cedc98f5b9cd1f038e4b4df756abcc261f66f131902a8c031615fd5411a917f656f893d649cd604daa73bd00fdd764fe3c6c1cc347e66ffb6c0714abf0f4b9cdf24d7d7d5b2596556f45e81672a565425cd64db8815f66c6529ae6f59eacc5cfeb969523332c94193fc6f4731b25fa4d355bbd2fac165b418c021992991f2e22c93eb7bcf25dfdbf4b47b17e7386f96716dae9681ce5e086f1d1c2f09deeaa87f518d47a2f540b44319b6e078ae4253c523267c1ee5cd123dec22a9055f50bccff6e401d4c59780b3ee2cb26131c5d5e9243f069fa60875aa3a907d2a3d6242e82e2d0d3928f191a4bad3fe33f5427530203010001a3533051301d0603551d0e0416041426e46d370ddf57c69be4f3b9a85d0aa32021a316301f0603551d2304183016801426e46d370ddf57c69be4f3b9a85d0aa32021a316300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100771e8ba50a264cc9ad131e9479b51eab889ac05aa00ab3662cc6200860a9c4ee3245f53a9137298bbefdc01529ee17725e0efeb614af8dbb478499b4feedb7a4c7380aba5b8d5705c8c1ab1da1a3bd99c50a41cd060dadeb654589bc06d98db2dfb787a985e8e18b8484c9730a2c87e62299c6b7981afc26a54a4997d651d669cfab9616ea50d2028dc486885574c5beb5ba7bf4cad8473ca5477bbc") + + certificate_frame = CryptoFrame(certificate, self.handshake_packet_server) + message_frame = CryptoFrame(handshake_msg, self.handshake_packet_server) + self.quic_tls_session_2.update_session(certificate_frame) + self.quic_tls_session_2.update_session(message_frame) + + self.assertEqual(self.quic_tls_session_2.alpn, b"h3") + + diff --git a/tlexport/__init__.py b/tlexport/__init__.py index 29d32cd..56fafa5 100755 --- a/tlexport/__init__.py +++ b/tlexport/__init__.py @@ -1,5 +1,2 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- - -__version__ = 0.6 -__author__ = "Jannis Borg-Olivier, Lars Morkovsky, Daniel Baier" diff --git a/tlexport/about.py b/tlexport/about.py new file mode 100644 index 0000000..d5063cb --- /dev/null +++ b/tlexport/about.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +__version__ = 0.8 +__author__ = "Jannis Borg-Olivier, Lars Morkovsky, Daniel Baier" \ No newline at end of file diff --git a/tlexport/checksums.py b/tlexport/checksums.py index 4813749..72590f4 100755 --- a/tlexport/checksums.py +++ b/tlexport/checksums.py @@ -30,6 +30,44 @@ def ones_complement_checksum(byte_arr: bytearray) -> bytearray: return out_arr +def calculate_checksum_udp(packet: Packet): + logging.info("") + logging.info("UDP Checksum") + pseudo_header = bytearray(b'') + + # IPv4 + if not packet.ipv6_packet: + pseudo_header.extend(packet.ip_src) + pseudo_header.extend(packet.ip_dst) + pseudo_header.extend(b'\x00') + pseudo_header.extend(packet.ip.p.to_bytes(1, 'big')) + pseudo_header.extend(len(packet.tcp).to_bytes(2, 'big')) + + # IPv6 + if packet.ipv6_packet: + pseudo_header.extend(packet.ip_src) + pseudo_header.extend(packet.ip_dst) + pseudo_header.extend(len(packet.udp).to_bytes(4, 'big')) + pseudo_header.extend(b'\x00\x00\x00') + pseudo_header.extend(packet.ip.nxt.to_bytes(1, 'big')) + + udp_data = bytearray(bytes(packet.udp)) + + udp_data[6:8] = bytearray(b"\x00\x00") + + logging.info(f"pseudo header: 0x{pseudo_header.hex()}") + logging.info(f"tcp data: 0x{udp_data.hex()}") + + pseudo_header.extend(udp_data) + + calculated_checksum = ones_complement_checksum(pseudo_header) + + packet_checksum = packet.udp.sum.to_bytes(2, 'big') + logging.info(f"expected checksum: 0x{calculated_checksum.hex()}, packet checksum: 0x{packet_checksum.hex()}") + + return calculated_checksum == packet_checksum + + def calculate_checksum_tcp(packet: Packet): logging.info("") logging.info("TCP Checksum") diff --git a/tlexport/key_derivator.py b/tlexport/key_derivator.py index e4055e6..dcb088e 100755 --- a/tlexport/key_derivator.py +++ b/tlexport/key_derivator.py @@ -4,7 +4,7 @@ from cryptography.hazmat.primitives import hashes, hmac from cryptography.hazmat.primitives.ciphers import algorithms from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 -from cryptography.hazmat.primitives.kdf.hkdf import HKDFExpand +from cryptography.hazmat.primitives.kdf.hkdf import HKDFExpand, HKDF def dev_ssl_30_keys(master_secret, server_random, client_random, key_length, mac_length, key_block_length, cipher_algo, @@ -81,6 +81,8 @@ def dev_tls_12_keys(master_secret, client_random, server_random, key_length, mac if cipher_algo in [algorithms.AES, algorithms.Camellia]: iv_length = 16 + if cipher_algo == algorithms.Camellia and use_aead: + iv_length = 4 if use_aead: mac_length = 0 @@ -162,7 +164,8 @@ def dev_tls_13_keys(secret_list, key_length, hash_fun: hashes.HashAlgorithm): logging_string = "" for k in keys: - logging_string += f"{k}: {keys[k].hex()}\n" + if keys[k] is not None: + logging_string += f"{k}: {keys[k].hex()}\n" logging.info(f"{logging_string}") @@ -298,4 +301,4 @@ def prf_tls_12(secret, client_random, server_random, label, length, mac_function secret_block = secret_block + h.finalize() a0 = a1 - return secret_block[:length] + return secret_block[:length] \ No newline at end of file diff --git a/tlexport/main.py b/tlexport/main.py index 9d3b602..ac3e56e 100755 --- a/tlexport/main.py +++ b/tlexport/main.py @@ -11,11 +11,14 @@ from .session import Session from .checksums import calculate_checksum_tcp from .log import set_logger -from .__init__ import __version__ +from .about import __version__ -server_ports = [443] + + +server_ports = [443, 44330] keylog = [] sessions = [] +quic_sessions = [] class MapPortsAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): @@ -30,12 +33,14 @@ def __call__(self, parser, namespace, values, option_string=None): def arg_parser_init(): parser = argparse.ArgumentParser(description="TLExport - GENERATING DECRYPTED TLS PCAPS") + parser.add_argument("-p", "--serverports", help="additional ports to test for TLS-Connections", nargs="+", default=[443]) parser.add_argument("-i", "--infile", help="path of input file", - default="in.pcapng") + default="tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_128.pcapng") parser.add_argument("-o", "--outfile", help="path of output file", default="out.pcapng") - parser.add_argument("-s", "--sslkeylog", help="path to sslkeylogfile") + parser.add_argument("-s", "--sslkeylog", help="path to sslkeylogfile", + default="tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.log") # default False due to checksum offloading producing wrong checksums in Packet Capture parser.add_argument("-c", "--checksumTest", help="enable for checking tcp Checksums", action=argparse.BooleanOptionalAction, default=False) @@ -53,14 +58,26 @@ def arg_parser_init(): parser.add_argument("-f", "--filter", help="filter log messages by file, add files you want to filter", nargs="+") parser.add_argument('--version', action='version',version='TLExport v{version}'.format(version=__version__)) - + parser.add_argument("-g", "--greasy", help="ignore dtls, due to changes in the QUIC fixed bit, RFC 9287", + action=argparse.BooleanOptionalAction, default=False) + parser.add_argument("-a", "--metadata", help="export metadata (e.g. TLS-Handshake data), this could be useful for some packet analyzers like Wireshark or Zeek", + action=argparse.BooleanOptionalAction, default=False) parser.set_defaults(keep_original_ports=True) + return parser.parse_args() -def get_port_map(parser): - port_map = {} +def get_port_map(parser: argparse.Namespace): + """Gets ports from given arguments + + :param parser: Namespace from *argparse* module + :type parser: argparse.Namespace + + :return: directory containing how server ports are mapped to the output ports + :rtype: dict + """ + port_map: dict = {} i: str if 'mapports' not in parser or parser.mapports is None: @@ -76,18 +93,88 @@ def get_port_map(parser): return port_map -def handle_packet(packet: Packet, args, keylog, sessions: list[Session], portmap, keep_original_ports: bool): + +def handle_packet(packet: Packet, args, keylog: bytes, sessions: list[Session], portmap: dict, keep_original_ports: bool, exp_meta: bool): + """Matches packet to it's corresponding session, and initiates the handling of that packet in that session. Only used for *TLS over TCP* (NOT for QUIC, DTLS, etc.) + + :param packet: packet that is handled + :param keylog: the secrets from the SSLKEYLOGFILE **AND** decryption secret blocks containing the connection secrets + :type packet: Packet + :type keylog: bytes + :param sessions: list of all sessions that are currently handled + :type sessions: list[Session] + :param portmap: directory containing how server ports are mapped to the output ports + :type portmap: dict + """ + for session in sessions: if session.matches_session(packet): session.handle_packet(packet) return + # if no matching session is found, a new one is created if packet.dport in server_ports or packet.sport in server_ports: - sessions.append(Session(packet, server_ports, keylog, portmap, keep_original_ports)) + sessions.append(Session(packet, server_ports, keylog, portmap, keep_original_ports, exp_meta)) + #sessions.append(Session(packet, server_ports, keylog, portmap, exp_meta)) + + +def handle_quic_packet(packet: Packet, keylog, quic_sessions: list[QuicSession], portmap): + """Matches packet to a session containg QUIC traffic, and initiates the handling of that packet in that session. + Only used QUIC traffic + + :param packet: packet that is handled + :type packet: Packet + :param keylog: the secrets from the SSLKEYLOGFILE **AND** decryption secret blocks containing the connection secrets + :type keylog: bytes + :param quic_sessions: list of all quic sessions that are currently handled + :type quic_sessions: list[Session] + :param portmap: directory containing how server ports are mapped to the output ports + :type portmap: dict + """ + packet_payload = packet.tls_data + header_type = get_header_type(packet_payload) + + quic_version = QuicVersion.UNKNOWN + + if header_type == QuicHeaderType.LONG: + dcid_len = packet_payload[5] + dcid = packet_payload[6: 6 + dcid_len] + quic_vers_num = int.from_bytes(packet_payload[1:5], "big", signed=False) + match quic_vers_num: + case 1: + quic_version = QuicVersion.V1 + case 2: + quic_version = QuicVersion.V2 + case _: + quic_version = QuicVersion.UNKNOWN + + for session in quic_sessions: + # first try matching connection IDs + if header_type == QuicHeaderType.LONG: + if dcid in session.client_cids or dcid in session.server_cids: + session.handle_packet(packet, dcid, quic_version) + return + else: + # match by checking all known cid lengths for session + for cid in session.client_cids | session.server_cids: + if cid == packet_payload[1:1 + len(cid)]: + session.handle_packet(packet, cid, quic_version) + return + + # check matching ip address and port for zero length cids + if session.matches_session_dgram(packet.ip_src, packet.ip_dst, packet.sport, packet.dport): + session.handle_packet(packet, dcid, quic_version) + return + + if header_type != QuicHeaderType.SHORT: + new_session = QuicSession(packet, server_ports, keylog, portmap) + quic_sessions.append(new_session) + new_session.handle_packet(packet, dcid, quic_version) -def run(): +def run(): + """Starts the program""" args = arg_parser_init() keep_original_ports = args.keep_original_ports portmap = get_port_map(args) @@ -100,6 +187,7 @@ def run(): server_ports.extend([int(x) for x in args.serverports]) + metadata: bool = args.metadata if args.sslkeylog is not None: print(f"[*] Using keys from SSLKEYLOG: {args.sslkeylog}") @@ -113,40 +201,67 @@ def run(): pcap_reader = dpkt.pcap.Reader(file) else: pcap_reader = Reader(file) - + print(f"[*] Checking for TLS traffic on these ports: {server_ports}") for ts, buf in pcap_reader: packet = Packet(buf, ts) if ts == -1: - keylog.extend(keylog_reader.get_keys_from_string(buf.decode('ascii'))) + keylog.extend(keylog_reader.get_keys_from_string(buf.decode('ascii'))) # adds secrets from decryption secret block to keylog continue - if len(packet.tls_data) == 0: - continue + if packet.tcp_packet: + if len(packet.tls_data) == 0: + continue + + if not args.checksumTest: + checksum_test = True + else: + checksum_test = calculate_checksum_tcp(packet) - if not args.checksumTest: - checksum_test = True - else: - checksum_test = calculate_checksum_tcp(packet) if not checksum_test: logging.info("") logging.info(f"bad checksum discarded Packet {packet.get_params()}") logging.info("") - if packet.tls_packet and checksum_test: - handle_packet(packet, args, keylog, sessions, portmap, keep_original_ports) + if packet.tcp_packet and checksum_test: + handle_packet(packet, args, keylog, sessions, portmap, keep_original_ports, exp_meta=metadata) + elif packet.udp_packet: + if len(packet.tls_data) == 0: + continue + + if not args.checksumTest: + checksum_test = True + else: + checksum_test = calculate_checksum_udp(packet) + + if not checksum_test: + logging.info("") + logging.info(f"bad checksum discarded Packet {packet.get_params()}") + logging.info("") + continue + + # using fixed bit for differentiating between QUIC and D-TLS (For further information take a look at RFC 9287) + if ((int(packet.tls_data[0]) & 0x40) >> 6) == 1 or args.greasy: + # QUIC Packet + handle_quic_packet(packet, keylog, quic_sessions, portmap) + + else: + # D-TLS Packet + pass file.close() all_decrypted_sessions = [] for session in sessions: all_decrypted_sessions.extend(session.decrypt()) + for quic_session in quic_sessions: + all_decrypted_sessions.extend(quic_session.build_output(metadata)) file = open(args.outfile, "wb") - writer = dpkt.pcapng.Writer(file) + writer = dpkt.pcapng.Writer(file, snaplen=20000) for buf, ts in all_decrypted_sessions: writer.writepkt(bytes(buf), ts) diff --git a/tlexport/output_builder.py b/tlexport/output_builder.py index 9f5e3a5..52534bc 100755 --- a/tlexport/output_builder.py +++ b/tlexport/output_builder.py @@ -4,22 +4,25 @@ from scapy.packet import Raw from scapy.layers.l2 import Ether from scapy.layers.inet import IP, TCP +from scapy.layers.inet6 import IPv6 from tlexport.tlsrecord import TlsRecord from math import floor class OutputBuilder: def __init__(self, decrypted_records, server_ip, client_ip, server_port, client_port, server_mac_addr, - client_mac_addr, portmap, keep_original_ports: bool) -> None: + client_mac_addr, portmap, ipv6, keep_original_ports: bool) -> None: + self.decrypted_records = decrypted_records - self.server_ip = '.'.join(f'{c}' for c in server_ip) - self.client_ip = '.'.join(f'{c}' for c in client_ip) + self.server_ip = server_ip + self.client_ip = client_ip self.server_port = server_port self.client_port = client_port self.default_port = 8080 self.server_mac_addr = server_mac_addr self.client_mac_addr = client_mac_addr self.out = [] + self.ipv6 = ipv6 self.server_seq = 1 self.client_seq = 1 @@ -60,6 +63,8 @@ def build(self): self.conn_reset = False decrypted = record[0] + if decrypted is None: + decrypted = b'123345' ts = [] for packet in record[1].metadata: ts.append(packet.timestamp) @@ -73,15 +78,26 @@ def build(self): # due to the size difference between plaintext and ciphertext new Syn/Ack values starting at 0 are used. # timestamps for the TCP Handshake are equal to the timestamp of the first TLS-Record def build_ack_handshake(self): - syn = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, - dst=self.server_ip) / TCP( - dport=self.server_port, sport=self.client_port, flags='S', seq=0, ack=0) - syn_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, - dst=self.client_ip) / TCP( - dport=self.client_port, sport=self.server_port, flags='SA', seq=0, ack=1) - ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, - dst=self.server_ip) / TCP( - dport=self.server_port, sport=self.client_port, flags='A', seq=1, ack=1) + if not self.ipv6: + syn = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='S', seq=0, ack=0) + syn_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='SA', seq=0, ack=1) + ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='A', seq=1, ack=1) + else: + syn = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IPv6(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='S', seq=0, ack=0) + syn_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IPv6(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='SA', seq=0, ack=1) + ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IPv6(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='A', seq=1, ack=1) self.out.extend([(syn, self.ts_zero), (syn_ack, self.ts_zero), (ack, self.ts_zero)]) @@ -98,14 +114,27 @@ def build_server_packet(self, decrypted, ts): if last_len < record_len: parts.append(decrypted[last_len:]) for i in range(0, len(parts)): - packet = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, - dst=self.client_ip) / TCP( - dport=self.client_port, sport=self.server_port, flags='PA', seq=self.server_seq, - ack=self.client_seq) / Raw(parts[i]) - self.server_seq += len(parts[i]) - packet_ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, - dst=self.server_ip) / TCP( - dport=self.server_port, sport=self.client_port, flags='A', seq=self.client_seq, ack=self.server_seq) + if not self.ipv6: + + packet = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='PA', seq=self.server_seq, + ack=self.client_seq) / Raw(parts[i]) + self.server_seq += len(parts[i]) + packet_ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='A', seq=self.client_seq, ack=self.server_seq) + + else: + packet = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IPv6(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='PA', seq=self.server_seq, + ack=self.client_seq) / Raw(parts[i]) + self.server_seq += len(parts[i]) + packet_ack = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IPv6(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='A', seq=self.client_seq, ack=self.server_seq) + self.out.append((packet, ts[i])) self.out.append((packet_ack, ts[i])) @@ -123,13 +152,26 @@ def build_client_packet(self, decrypted, ts): parts.append(decrypted[last_len:]) for i in range(0, len(parts)): - packet = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, - dst=self.server_ip) / TCP( - dport=self.server_port, sport=self.client_port, flags='PA', seq=self.client_seq, - ack=self.server_seq) / Raw(parts[i]) - self.client_seq += len(parts[i]) - packet_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, - dst=self.client_ip) / TCP( - dport=self.client_port, sport=self.server_port, flags='A', seq=self.server_seq, ack=self.client_seq) + if not self.ipv6: + packet = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IP(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='PA', seq=self.client_seq, + ack=self.server_seq) / Raw(parts[i]) + self.client_seq += len(parts[i]) + + packet_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='A', seq=self.server_seq, ack=self.client_seq) + + else: + packet = Ether(src=self.client_mac_addr, dst=self.server_mac_addr) / IPv6(src=self.client_ip, + dst=self.server_ip) / TCP( + dport=self.server_port, sport=self.client_port, flags='PA', seq=self.client_seq, + ack=self.server_seq) / Raw(parts[i]) + self.client_seq += len(parts[i]) + + packet_ack = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IPv6(src=self.server_ip, + dst=self.client_ip) / TCP( + dport=self.client_port, sport=self.server_port, flags='A', seq=self.server_seq, ack=self.client_seq) self.out.append((packet, ts[i])) self.out.append((packet_ack, ts[i])) diff --git a/tlexport/packet.py b/tlexport/packet.py index b59a977..fb858ae 100755 --- a/tlexport/packet.py +++ b/tlexport/packet.py @@ -1,18 +1,26 @@ import dpkt from ipaddress import IPv6Address, IPv4Address -# data class for network packets and metadata + class Packet: - def __init__(self, packet, timestamp) -> None: + """This class serves as a wrapper class for simplifying handling network packets and their metadata.""" + def __init__(self, binary: bytes, timestamp: float) -> None: + """ + :param binary: packet data in bytes extracted by dpkt + :type binary: bytes + :param timestamp: timestamp of packet extracted by dpkt + :type timestamp: float + """ self.timestamp = timestamp - self.binary = packet + self.binary = binary self.ethernet = dpkt.ethernet.Ethernet(self.binary) - self.tls_packet = True + self.tcp_packet = True + self.udp_packet = False if not (isinstance(self.ethernet.data, dpkt.ip.IP) or isinstance(self.ethernet.data, dpkt.ip6.IP6)): - self.tls_packet = False + self.tcp_packet = False return if isinstance(self.ethernet.data, dpkt.ip6.IP6): @@ -22,26 +30,35 @@ def __init__(self, packet, timestamp) -> None: self.ip = self.ethernet.data - if not isinstance(self.ip.data, dpkt.tcp.TCP): - self.tls_packet = False - self.tls_data = b'' - return - - self.tcp = self.ip.data - self.ethernet_src = self.ethernet.src self.ethernet_dst = self.ethernet.dst self.ip_src = self.ip.src self.ip_dst = self.ip.dst - self.seq = self.tcp.seq - self.ack = self.tcp.ack + if isinstance(self.ip.data, dpkt.tcp.TCP): + self.tcp = self.ip.data + self.seq = self.tcp.seq + self.ack = self.tcp.ack - self.sport = self.tcp.sport - self.dport = self.tcp.dport + self.sport = self.tcp.sport + self.dport = self.tcp.dport + + self.tls_data = self.tcp.data + + return - self.tls_data = self.tcp.data + self.tcp_packet = False + + if isinstance(self.ip.data, dpkt.udp.UDP): + self.udp = self.ip.data + self.sport = self.udp.sport + self.dport = self.udp.dport + + self.tls_data = self.udp.data + + self.udp_packet = True + return def get_params(self): if not self.ipv6_packet: @@ -51,8 +68,12 @@ def get_params(self): src_address = IPv6Address(self.ip_src) dst_address = IPv6Address(self.ip_dst) + if self.tcp_packet: + return (f"source: {src_address} {self.sport}, " + f"destination: {dst_address} {self.dport}, " + f"sequence number: {self.seq}, timestamp: {self.timestamp}") - - return (f"source: {src_address} {self.sport}, " - f"destination: {dst_address} {self.dport}, " - f"sequence number: {self.seq}") \ No newline at end of file + else: + return (f"source: {src_address} {self.sport}, " + f"destination: {dst_address} {self.dport}, " + f"timestamp: {self.timestamp}") diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/aes_ccm_128.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_ccm_128.pcapng new file mode 100644 index 0000000..e04c1a9 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_ccm_128.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_128.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_128.pcapng new file mode 100644 index 0000000..507b215 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_128.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_256.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_256.pcapng new file mode 100644 index 0000000..066c9ed Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/aes_gcm_256.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.log b/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.log new file mode 100644 index 0000000..a66a40d --- /dev/null +++ b/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.log @@ -0,0 +1,20 @@ +CLIENT_HANDSHAKE_TRAFFIC_SECRET 978124d0f099e2cec0545dd33bdc966122f137132782a9d1bc4243790b59b8b5 8a7851e1348895e637075738b02daa604a587cf4e56f64ab214faf610537f5b7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 978124d0f099e2cec0545dd33bdc966122f137132782a9d1bc4243790b59b8b5 4d807530be95a1df0e0e6a7f5af32a728e15925c74584df29778ab4ee5728ed5 +EXPORTER_SECRET 978124d0f099e2cec0545dd33bdc966122f137132782a9d1bc4243790b59b8b5 7eadcc527b5a3475cbe7e0d0b4a8a44dbc3fb2c9ee85f25388b4df1852e647aa +CLIENT_TRAFFIC_SECRET_0 978124d0f099e2cec0545dd33bdc966122f137132782a9d1bc4243790b59b8b5 09c9714464cf83ee7b3509ef4ef39d01b5d92d824411b20de52c17796f621c4e +SERVER_TRAFFIC_SECRET_0 978124d0f099e2cec0545dd33bdc966122f137132782a9d1bc4243790b59b8b5 c06552ebe5a230a92b719e8623bc7cb0a9c187271822b3eca6674d9149d33716 +CLIENT_HANDSHAKE_TRAFFIC_SECRET de0b1165d6d5334fcb4089f4602d83e682c827d2ba7c090af728325f48653fc1 c6f3fbf7004adba6ef1c955d485ae95fd9009b426541ac79955f3d272c3fdc5709b9f4c94ae89f73974cbd424b9dcd62 +SERVER_HANDSHAKE_TRAFFIC_SECRET de0b1165d6d5334fcb4089f4602d83e682c827d2ba7c090af728325f48653fc1 11f8ffec0af15d76498aeb23f95ade71fe7c2cf46ec92aa20e0a7a2b05ad8e57c5cabb0eb08afcec398dd9528f0e3d43 +EXPORTER_SECRET de0b1165d6d5334fcb4089f4602d83e682c827d2ba7c090af728325f48653fc1 e8357e5a8a398393a5a219b31c187ac1ce01d631c49c8199b90f46afda73c08c80ab690683e6c058b83a34793ed2bc6d +CLIENT_TRAFFIC_SECRET_0 de0b1165d6d5334fcb4089f4602d83e682c827d2ba7c090af728325f48653fc1 5cd9e702734d7eb507f5f3932898dde11ff904ec31cc6b611901b52f6179f7a0091cfc6175ca7e9e92063babf140353c +SERVER_TRAFFIC_SECRET_0 de0b1165d6d5334fcb4089f4602d83e682c827d2ba7c090af728325f48653fc1 54fa3ab741fc0590ecbdd4fd18f61b346eac7fe9fc5ad657465f0fada16b3eebdf0d2a4c13440a45259f79513910c57c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 07b6a5a037810c669800c4557fe1b5a782b3e17c06420f95a018f4e677b49946 8328438133dfce795f2fa1d3b02b3203210759329c7cb3c4bfbde13c5833f26f +SERVER_HANDSHAKE_TRAFFIC_SECRET 07b6a5a037810c669800c4557fe1b5a782b3e17c06420f95a018f4e677b49946 2a51e915fe3f613e10dd4a008a229e0817d05422d2e40fdc3852bba02ba7aa8c +EXPORTER_SECRET 07b6a5a037810c669800c4557fe1b5a782b3e17c06420f95a018f4e677b49946 58eaafd460c854d4321f7d6584fb6573f234210d41279735dc3cef2289f8b0d0 +CLIENT_TRAFFIC_SECRET_0 07b6a5a037810c669800c4557fe1b5a782b3e17c06420f95a018f4e677b49946 9fc76663c32a8599a357bffdfc89613197c0f83ca1bdd6052d8015cb9149a61f +SERVER_TRAFFIC_SECRET_0 07b6a5a037810c669800c4557fe1b5a782b3e17c06420f95a018f4e677b49946 2f8474d38252a5b1f81c31e6646d39a61bfa153824000d444c2553f66731b7f7 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2c952253f432bb4b448a6bff093c4b65b687ee7661c415ee36a7494cdf25f961 050945802b40f5c95653b507c48cc0730b96c0b3dba55351e2d04862315950e6 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2c952253f432bb4b448a6bff093c4b65b687ee7661c415ee36a7494cdf25f961 85c6918993b4f52e14f8119f3cdb6ff0d5473c02e98c5087a95d4d4f685a5a22 +EXPORTER_SECRET 2c952253f432bb4b448a6bff093c4b65b687ee7661c415ee36a7494cdf25f961 8f86d37db620f52afcc7a9ebbdabe184b250918c777b3a99fc1f8a37e139e151 +CLIENT_TRAFFIC_SECRET_0 2c952253f432bb4b448a6bff093c4b65b687ee7661c415ee36a7494cdf25f961 4f2243de30fd6719c9aaafb295e858b18dc24d78a829b44d4427cb3d27f77c7a +SERVER_TRAFFIC_SECRET_0 2c952253f432bb4b448a6bff093c4b65b687ee7661c415ee36a7494cdf25f961 df7dee534d1b9c92472c93374eb7850d0a3126b5adc790f0ab01f02279667886 diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.pcapng new file mode 100644 index 0000000..98eda93 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/all_ciphersuites.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/chacha_20.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/chacha_20.pcapng new file mode 100644 index 0000000..c627a03 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/chacha_20.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/hopefully_cid_change.log b/tlexport/pcaps_und_keylogs/quic_pcaps/hopefully_cid_change.log new file mode 100644 index 0000000..7dd239e --- /dev/null +++ b/tlexport/pcaps_und_keylogs/quic_pcaps/hopefully_cid_change.log @@ -0,0 +1,408 @@ +# SSL/TLS secrets log file, generated by NSS +CLIENT_HANDSHAKE_TRAFFIC_SECRET f806ff7afcc602e78cc098177b1871c022a5e8098d17e89eadaf81dc2b99e7ad f87fc273482c7ba71f97d222b07fce6395bb04083d9fa2066c3a03d3ca3ad27d +SERVER_HANDSHAKE_TRAFFIC_SECRET f806ff7afcc602e78cc098177b1871c022a5e8098d17e89eadaf81dc2b99e7ad a59294672f222f62814f3654e3e4825f835180c20a8b874cbd04d01abd7cec49 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 9c08aa3a2726d90865614ff889ad3f02c66bf8e4376d2e514edb0f4b9bb33ab7 374f79acb76ee5e305d750886985dde2462ea5809eb165c41c6f667c4d7eb9d7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 9c08aa3a2726d90865614ff889ad3f02c66bf8e4376d2e514edb0f4b9bb33ab7 7dfa1b9301e6b25f11e2263018dbb4d5eb279749ec6d125754c6a01506fe275e +CLIENT_RANDOM eeb1f37c6a8f8919b754091b0c4a784745739382df0be851565257becff873f6 b2cf5871f9d32b52296fd8b5d20ddba4add4967fd7a26b1ecdb14360f88cbebec21b3855f785dcccab5a761a8425a61d +CLIENT_RANDOM 58db8edd9c2c5f50fd3f43dcc2b9f183b01b348fe33cb3ff553d8070c156ad04 7f6105fcf0c6a09408a8a5186a2e3126eac5a8b8a2812c9562ac7e06cbad5b3fe0984a2ed77fb4c5c9330cfcd32567c0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 405d737969a99242556f1e9934be07cd84b359f0858e9becb0b6a65944a0f224 4c2c8f31af760c0269c54cf8f414fbeaa7307d56fc58a45f818747faae238826 +SERVER_HANDSHAKE_TRAFFIC_SECRET 405d737969a99242556f1e9934be07cd84b359f0858e9becb0b6a65944a0f224 da861287dbec1f497f3f753b5a359dfd965a656433ea862ebf87f4e3fa083302 +CLIENT_TRAFFIC_SECRET_0 f806ff7afcc602e78cc098177b1871c022a5e8098d17e89eadaf81dc2b99e7ad e0504ac7b834ba8717005fb3e2540cba3d4c0ba440afe2c8d9acf796904d18f3 +SERVER_TRAFFIC_SECRET_0 f806ff7afcc602e78cc098177b1871c022a5e8098d17e89eadaf81dc2b99e7ad 4d1591bdfab7f1974481cf845cb1bc81b3602502a2e98950fad256f409888cae +EXPORTER_SECRET f806ff7afcc602e78cc098177b1871c022a5e8098d17e89eadaf81dc2b99e7ad 68103b82472652a10ad53dba3fc54b6297afb819c39a9aa13b54b265a8cfcb05 +CLIENT_TRAFFIC_SECRET_0 9c08aa3a2726d90865614ff889ad3f02c66bf8e4376d2e514edb0f4b9bb33ab7 0413041052a43bf1427b489a95a9e69be5e8e38967ccc9fb70235a78d32adcb5 +SERVER_TRAFFIC_SECRET_0 9c08aa3a2726d90865614ff889ad3f02c66bf8e4376d2e514edb0f4b9bb33ab7 af5c9915ef055acac6de36851022f0fc25c8d7d3e84e191665ad5c4e3a245ad0 +EXPORTER_SECRET 9c08aa3a2726d90865614ff889ad3f02c66bf8e4376d2e514edb0f4b9bb33ab7 207c5531295eb35f92b8a4c98a6c42109e72782eeb44f0099fd09a590d96cc78 +CLIENT_HANDSHAKE_TRAFFIC_SECRET cf2151edaf50fc6f941d64d6408a2322955b7fa72b81a2418202fb0939950d86 3a37edbaf3c359a1fdc517eda5c4ee8fcb7e6ceac2e238c48bc474b87fbccf65 +SERVER_HANDSHAKE_TRAFFIC_SECRET cf2151edaf50fc6f941d64d6408a2322955b7fa72b81a2418202fb0939950d86 1d65c150e86a48fdc4fc2155facab5bc5f56b99ab332084269a86fc3eeab0653 +CLIENT_TRAFFIC_SECRET_0 405d737969a99242556f1e9934be07cd84b359f0858e9becb0b6a65944a0f224 d8603bf056c3832cabf713596f993f9efd08ae0f7dbd03438bf3d8c3f9547577 +SERVER_TRAFFIC_SECRET_0 405d737969a99242556f1e9934be07cd84b359f0858e9becb0b6a65944a0f224 29b6c896b3620eddf44d394ed4a5f63da60f534a13280bbc1ae6e692ca1057e1 +EXPORTER_SECRET 405d737969a99242556f1e9934be07cd84b359f0858e9becb0b6a65944a0f224 64fccab971285f571bcc5d60686df53938ba5698730f654a0f6565d123ef3ddb +CLIENT_TRAFFIC_SECRET_0 cf2151edaf50fc6f941d64d6408a2322955b7fa72b81a2418202fb0939950d86 aaa7b010a393983d1660685fa1af71cdb386082e3d0f9c09568e0bd66971404a +SERVER_TRAFFIC_SECRET_0 cf2151edaf50fc6f941d64d6408a2322955b7fa72b81a2418202fb0939950d86 4ee39f4b24023743f92c63479a6ccce0607a0afa12630d0beb196e57038e36b0 +EXPORTER_SECRET cf2151edaf50fc6f941d64d6408a2322955b7fa72b81a2418202fb0939950d86 794fe2f07bab1cc050b626e73e4971680db5ae43f810515aa41ac292fe6a0942 +CLIENT_RANDOM f27ad7023b3cfb380772d694133c987558ef73b3c162fb98319a205302e18b3f ebed7b9a30df33ded41c5772abb04e9306a69a1c06ebd4c77a841d7e031f293f67a64ece873dceaaa2d8d8d2068d99fb +CLIENT_RANDOM 6fa19c6510a60d5909a3b471141b75080cc190cc550d0893dc7fa4fb6b4d9c40 b99f1785d118c426bde77ffa1b967ee8099b537284eee9211ac53ba47f8694631c521b8cc608c5421f3d60e87d015c21 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 223ddf683c3931478201cf6a364dea62c06592f07de4350ada884cddab7d433a 0e3c84c75d1bc5de315acfa746fe5ddc2b43969fbc00b620742093489e201ac8 +SERVER_HANDSHAKE_TRAFFIC_SECRET 223ddf683c3931478201cf6a364dea62c06592f07de4350ada884cddab7d433a ec52ccddc43cda33d4f54e7df127b5cde62528a511c80c03dc5778d5881a793f +CLIENT_HANDSHAKE_TRAFFIC_SECRET 66d6d1e497e08a3e47b0afa9b7c1689d346818fbe711d3bbb83745837de55ccb afd7ac746eb5defa7fa0a43e1dc3b74bc2b2bb351b20eca879cb0cd202726434 +SERVER_HANDSHAKE_TRAFFIC_SECRET 66d6d1e497e08a3e47b0afa9b7c1689d346818fbe711d3bbb83745837de55ccb d18d6904619f00cdfd587605350bdaf553ea28b7541e3998edb69cd9b160a1ec +CLIENT_HANDSHAKE_TRAFFIC_SECRET ea94a23985f38ca31c8baa13be5351d845b605006a48d6eec7b6a1e3fd44907d f4ab10e97debc481bb7f9653bb082af4f3209a0341a8473da749a8c92b572023 +SERVER_HANDSHAKE_TRAFFIC_SECRET ea94a23985f38ca31c8baa13be5351d845b605006a48d6eec7b6a1e3fd44907d b992b91214239ac1a0c8e78769e194e647627b821482a0b67abeeb2c4ccaf9cd +CLIENT_HANDSHAKE_TRAFFIC_SECRET e2258044391673ac044cc7ef76c263a840bd5d9eddde3867e4dfd4e370cd3fcd c9c1c1f7896e53c909efc2d15329138011d8b05e164061d559d683d46b7d5229 +SERVER_HANDSHAKE_TRAFFIC_SECRET e2258044391673ac044cc7ef76c263a840bd5d9eddde3867e4dfd4e370cd3fcd b48dfcb9052d0ac199cbfb53987b74339a72f13428ee9ae820201869a377aa84 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 228c89a1f1146d593c5645cc47a5af71320181e545ac9b736554c4b007573e30 d97deedbe9ac0996efe4893946afac5160dff3b425ea86c988d156049f5f4641 +SERVER_HANDSHAKE_TRAFFIC_SECRET 228c89a1f1146d593c5645cc47a5af71320181e545ac9b736554c4b007573e30 93d60a95ba7055c7f2af60bd3186c906d3511f0714d214aefd58062e93bc03f3 +CLIENT_HANDSHAKE_TRAFFIC_SECRET b85acd794d5402880b34bd337d780580a03643c6714d71afcb7a8e8cbb414396 893a04b5a827691a6da0b7b939c82f2660b576db55fcca6699303967ecf27de9 +SERVER_HANDSHAKE_TRAFFIC_SECRET b85acd794d5402880b34bd337d780580a03643c6714d71afcb7a8e8cbb414396 42e6ca5f20943e0783704882718d5a874343d409508b3e893b5d71ecf6c14753 +CLIENT_TRAFFIC_SECRET_0 223ddf683c3931478201cf6a364dea62c06592f07de4350ada884cddab7d433a 28c1489837cabcfedb10fa3cf94b7b405ed29b779a05774fe7d9d5045b538405 +SERVER_TRAFFIC_SECRET_0 223ddf683c3931478201cf6a364dea62c06592f07de4350ada884cddab7d433a ec3f5981b2d1719c1df79d1b686382eee50186fcec534c20563faef63cf445eb +EXPORTER_SECRET 223ddf683c3931478201cf6a364dea62c06592f07de4350ada884cddab7d433a 33cf9b132549d3acca6099cac35e8e42e106a5661b3dbc8100f929b14c2d5254 +CLIENT_TRAFFIC_SECRET_0 e2258044391673ac044cc7ef76c263a840bd5d9eddde3867e4dfd4e370cd3fcd 0c5c699d833e88383b971765d01c5760360ca5063a681b8a82e1b529a948be00 +SERVER_TRAFFIC_SECRET_0 e2258044391673ac044cc7ef76c263a840bd5d9eddde3867e4dfd4e370cd3fcd 69ae82fb6653fca6eee36dc5076c6f04e5c065e6c51ad306f2d92e4a5c0e1370 +EXPORTER_SECRET e2258044391673ac044cc7ef76c263a840bd5d9eddde3867e4dfd4e370cd3fcd b071c08c8f71edaecf02401d2d36e21ba17f40082f9fca527e6dc07bef5e41b7 +CLIENT_TRAFFIC_SECRET_0 b85acd794d5402880b34bd337d780580a03643c6714d71afcb7a8e8cbb414396 d65222cf6855bf6e9a822804f03151ebb51432ae8b7bd7d63e04c841209da1d2 +SERVER_TRAFFIC_SECRET_0 b85acd794d5402880b34bd337d780580a03643c6714d71afcb7a8e8cbb414396 7bba37e85925627687b8831f9ee1ea54433dc91d537f707d7102766846a5e155 +EXPORTER_SECRET b85acd794d5402880b34bd337d780580a03643c6714d71afcb7a8e8cbb414396 c79103ebfec6d0941f7d31328cb274920b7121fa382588e1f91c0cb778dc6866 +CLIENT_TRAFFIC_SECRET_0 228c89a1f1146d593c5645cc47a5af71320181e545ac9b736554c4b007573e30 253aea852ccd8ca1e5b400018216b9eab8cd1a2138476e8f95d3e0746d9e5d5c +SERVER_TRAFFIC_SECRET_0 228c89a1f1146d593c5645cc47a5af71320181e545ac9b736554c4b007573e30 a472091033744079d730cd5965868e4b66d77d0e8a35e9bc4404ab39feed06c2 +EXPORTER_SECRET 228c89a1f1146d593c5645cc47a5af71320181e545ac9b736554c4b007573e30 99606ce9852b988dc38521f7fb11f7cf5865d2cf776be483b5ce63e6b8908113 +CLIENT_TRAFFIC_SECRET_0 ea94a23985f38ca31c8baa13be5351d845b605006a48d6eec7b6a1e3fd44907d f688b5d299b87961c14b8002ee070bfc10f597e202aab9fac791f345a0569679 +SERVER_TRAFFIC_SECRET_0 ea94a23985f38ca31c8baa13be5351d845b605006a48d6eec7b6a1e3fd44907d 14fb448c033bb0cc808c0ab0b42129e6925774fbcc1d4e30c319042d197d534e +EXPORTER_SECRET ea94a23985f38ca31c8baa13be5351d845b605006a48d6eec7b6a1e3fd44907d 8368602892fc0bfcc8a302e5c03c14bb6977da2baaa95d3dc1c7af4e721984ac +CLIENT_TRAFFIC_SECRET_0 66d6d1e497e08a3e47b0afa9b7c1689d346818fbe711d3bbb83745837de55ccb 6f89e89546dae874dcd5d5aad97b838629b338ed06d82ee08bcc41b7128beab8 +SERVER_TRAFFIC_SECRET_0 66d6d1e497e08a3e47b0afa9b7c1689d346818fbe711d3bbb83745837de55ccb 253a20125c4976adcee6b087616f48dbe681be5766bc42c0f7a4eae45efc84f7 +EXPORTER_SECRET 66d6d1e497e08a3e47b0afa9b7c1689d346818fbe711d3bbb83745837de55ccb bc81557b2e51f1a743a11f82c275a4176c001d90762be43f37e3a63aecf01697 +CLIENT_HANDSHAKE_TRAFFIC_SECRET b667313b850b9dd90d39c3549c08043ecfdf7aaf1603fc1b5c91a5807d8b15ea c67ad3fd1be2163136757c5dec36abf1d0da612c4f1d82586727fcf7bf100a72 +SERVER_HANDSHAKE_TRAFFIC_SECRET b667313b850b9dd90d39c3549c08043ecfdf7aaf1603fc1b5c91a5807d8b15ea 38a544aa7131c8f44706f3985e1d906a6efa6edd5b91581590b7640744591470 +CLIENT_HANDSHAKE_TRAFFIC_SECRET b54580520fa22713838f814f893ca682ee61e0669c4dace765fb8505047a1c26 2e15d47df584553d84d05fd395f2b3d5288e6f6ebfb1293450b32fc6deb834e0 +SERVER_HANDSHAKE_TRAFFIC_SECRET b54580520fa22713838f814f893ca682ee61e0669c4dace765fb8505047a1c26 84290e7db0d509a38b2cab60bece6702982b3f4b858ed8fab29843fcda127b62 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0b865fca2644cb429a535882751330fa241bd4f0f7ffc910efbe29ae0c494075 dbb4165f4ad84822708aafd63c80b7ba995a2471c6f4882571c11930eaee5150 +SERVER_HANDSHAKE_TRAFFIC_SECRET 0b865fca2644cb429a535882751330fa241bd4f0f7ffc910efbe29ae0c494075 940a94ed0e18a808c38d48820a1fb388295d2cc3256343168a3edc1ecdfb18c3 +CLIENT_TRAFFIC_SECRET_0 b667313b850b9dd90d39c3549c08043ecfdf7aaf1603fc1b5c91a5807d8b15ea 504a09353b53bdb559711a35dc6d190b77a70619122cced66951973be0208d74 +SERVER_TRAFFIC_SECRET_0 b667313b850b9dd90d39c3549c08043ecfdf7aaf1603fc1b5c91a5807d8b15ea fcef75a2a2fc184a643e9abbaba1d166fcf2569f6a5b537561b055d4e25845f4 +EXPORTER_SECRET b667313b850b9dd90d39c3549c08043ecfdf7aaf1603fc1b5c91a5807d8b15ea 1b27a96b203de2391822f61f067bffad8986c33b9c45babbcd7de1ff52339c64 +CLIENT_TRAFFIC_SECRET_0 b54580520fa22713838f814f893ca682ee61e0669c4dace765fb8505047a1c26 f617835475543cea1e1ca45bfb2fee819d5499617e373dd34cbb386cfb5f9944 +SERVER_TRAFFIC_SECRET_0 b54580520fa22713838f814f893ca682ee61e0669c4dace765fb8505047a1c26 79241b21960ccfada3607c2c276af1d8d0a0379da3c094524b9599f7b3ede3d8 +EXPORTER_SECRET b54580520fa22713838f814f893ca682ee61e0669c4dace765fb8505047a1c26 91b9b7323c8d390f9a36515c60673657e3772765be1732400e0a0ab06a213858 +CLIENT_TRAFFIC_SECRET_0 0b865fca2644cb429a535882751330fa241bd4f0f7ffc910efbe29ae0c494075 3ad131b9c96e2f27acb8f50a73d1fa35d2bed66d42a0340254b7d062977da8b0 +SERVER_TRAFFIC_SECRET_0 0b865fca2644cb429a535882751330fa241bd4f0f7ffc910efbe29ae0c494075 b5de8c4261914de7d4bf76c3b3aa6cd18e716ff00bc5a04f7eaf845e6f186230 +EXPORTER_SECRET 0b865fca2644cb429a535882751330fa241bd4f0f7ffc910efbe29ae0c494075 4ed4f5acbbc4440ee8213e5f22d06a305aeb186484ec7a0043bee3cfafe9eca0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 81bd6be02de3fc65a2f7a22692123d2c15f80ad72ce20c77e7b7f34335d01efb 6fa2ec535616e91b01dd90a8703985f6b42006dfb4d22206c20731f76965069a +SERVER_HANDSHAKE_TRAFFIC_SECRET 81bd6be02de3fc65a2f7a22692123d2c15f80ad72ce20c77e7b7f34335d01efb 34a16b82424443ea7eea9de4ffa5fd3e8c1147eee45e2b85e823aa5586850b5d +CLIENT_TRAFFIC_SECRET_0 81bd6be02de3fc65a2f7a22692123d2c15f80ad72ce20c77e7b7f34335d01efb d86b3e2505d0ffd1ef5cc6f48111916979f356c64671557121aeadb2d9fb6ed0 +SERVER_TRAFFIC_SECRET_0 81bd6be02de3fc65a2f7a22692123d2c15f80ad72ce20c77e7b7f34335d01efb 68700db27152afa49324b57300e857a519964950731fa9bfaad84471932d92d6 +EXPORTER_SECRET 81bd6be02de3fc65a2f7a22692123d2c15f80ad72ce20c77e7b7f34335d01efb 4a063908b30eb4c34b28faf67115c1bcebfab73ed2649bb788b9a5b5e37aaf2f +CLIENT_HANDSHAKE_TRAFFIC_SECRET cb2ff43f12acca94b3fb093925b9a9345181fcdb0e34f7dcabd1d6ff94e5f18f 98c2446dc8b7f8b6b4a61480792ca90d4e593099272e3c2ca2f17f055c0faff5 +SERVER_HANDSHAKE_TRAFFIC_SECRET cb2ff43f12acca94b3fb093925b9a9345181fcdb0e34f7dcabd1d6ff94e5f18f cbfde8e627eddfeb2a6ee2ba4224627f9774dbdb6b8579bbae6e5e97ae6dd3a5 +CLIENT_TRAFFIC_SECRET_0 cb2ff43f12acca94b3fb093925b9a9345181fcdb0e34f7dcabd1d6ff94e5f18f 32e0c1214e766dd66b96eec81d020c7f92cef51876c2f1e1732f11cdebf060ab +SERVER_TRAFFIC_SECRET_0 cb2ff43f12acca94b3fb093925b9a9345181fcdb0e34f7dcabd1d6ff94e5f18f 602661c52fe469735167e0ae22408e603d91295114c98d3dba7eaa3da20f504a +EXPORTER_SECRET cb2ff43f12acca94b3fb093925b9a9345181fcdb0e34f7dcabd1d6ff94e5f18f e455eddca749a4ea15be5f91942dc214c1148bd1e81648e4c3f7dbb212cedae5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1c522ec7d53afa46ecacb2d6bae4cf1cff1327fd466821e5d14608bcfe546001 2f2aa7049984fb7639d0be78da795e11b744abe668c0e87045cb928168b81f40 +SERVER_HANDSHAKE_TRAFFIC_SECRET 1c522ec7d53afa46ecacb2d6bae4cf1cff1327fd466821e5d14608bcfe546001 d64087fbb5a688233437ea4f38cc1aed963a69f1a5c03a9bc75f3ec45e443706 +CLIENT_TRAFFIC_SECRET_0 1c522ec7d53afa46ecacb2d6bae4cf1cff1327fd466821e5d14608bcfe546001 856e8a0f26402c65aab2bf1d76198032a67daa6a4af6e4a43ac6bfa57c493d90 +SERVER_TRAFFIC_SECRET_0 1c522ec7d53afa46ecacb2d6bae4cf1cff1327fd466821e5d14608bcfe546001 b813b2550ecce9abd74e62518873b6302ac30c59a264a9ae2d531f1260f6d1c2 +EXPORTER_SECRET 1c522ec7d53afa46ecacb2d6bae4cf1cff1327fd466821e5d14608bcfe546001 d91774eddaf0925384db0d667107cc53d2a4d4c44a7b108769025a955302a1e1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 66f25169d81fd2d3cd445fedb363a6988ef60cbb7b83b5de244f38e83f996758 e31dd85490dd010d23ac6c9b3843bb641c175c7e38be9a2b1a7e1abb9a2c88c7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 66f25169d81fd2d3cd445fedb363a6988ef60cbb7b83b5de244f38e83f996758 b50f8e9d61c14d7734ac3c64f1f446da95b76d45cfc751de3915ddf833c16416 +CLIENT_TRAFFIC_SECRET_0 66f25169d81fd2d3cd445fedb363a6988ef60cbb7b83b5de244f38e83f996758 bf8fca087aacba0c34d257c0527a658d2b74af8eea9159fdd351025313a57798 +SERVER_TRAFFIC_SECRET_0 66f25169d81fd2d3cd445fedb363a6988ef60cbb7b83b5de244f38e83f996758 ce7a30ad781a932686abfc2b01d3c3a4c44d520826dbf137e494879d693f59eb +EXPORTER_SECRET 66f25169d81fd2d3cd445fedb363a6988ef60cbb7b83b5de244f38e83f996758 57149806ce53f18b03526381fa541736545047b8cc918b3389368e35476d05ea +CLIENT_HANDSHAKE_TRAFFIC_SECRET 15799ce26491c344bf34b1ebea86b5d030069db49889041a1408328986875978 66764cf2c030d5470f7e0b396aad2de3c28874d2de7e812ef391c9b8d095f0eb +SERVER_HANDSHAKE_TRAFFIC_SECRET 15799ce26491c344bf34b1ebea86b5d030069db49889041a1408328986875978 790d115d161a0e998bf48dd6ffceaf76d7415860bb8ef0851cda29d5ad50a4c6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3506c93dcde8c7697dadc366ec07bfc6cff93db740a0722097364b8db85d252c 53bfa8c6fdcfc0664cb1fc7fa49c3fc85185db430f9e28cfbe6986e3dba2bb1e +SERVER_HANDSHAKE_TRAFFIC_SECRET 3506c93dcde8c7697dadc366ec07bfc6cff93db740a0722097364b8db85d252c 8d4cfda604aecb533089e03142b475925d42fce5211c17f7b800aeaf7446907e +CLIENT_TRAFFIC_SECRET_0 15799ce26491c344bf34b1ebea86b5d030069db49889041a1408328986875978 d01f91fa89d5288ea49e9924e27cd574d3e3cfe70603ce01250c649417669e56 +SERVER_TRAFFIC_SECRET_0 15799ce26491c344bf34b1ebea86b5d030069db49889041a1408328986875978 dff2fedba2f383f337cfe520c29a43365eb606cdbc3d7a44ad8a40ccfefcd91d +EXPORTER_SECRET 15799ce26491c344bf34b1ebea86b5d030069db49889041a1408328986875978 1766aa8d663589bfdc0845bda1e5486d933d94c534cc1e2f4faf0dc98987e06b +CLIENT_TRAFFIC_SECRET_0 3506c93dcde8c7697dadc366ec07bfc6cff93db740a0722097364b8db85d252c 0f8e7a6e2c9196f478fb39cc7dd726c58d7b617ddaa1d84bcbb1e1895f4d2fb3 +SERVER_TRAFFIC_SECRET_0 3506c93dcde8c7697dadc366ec07bfc6cff93db740a0722097364b8db85d252c 5b868489540051a7eb3a5031067796d68cb48ffe6a2b5ae7290ccfd8e321218c +EXPORTER_SECRET 3506c93dcde8c7697dadc366ec07bfc6cff93db740a0722097364b8db85d252c 4082756336944cb8fcb58824b89bb46e5b544084220b2d168127132d724d0357 +CLIENT_HANDSHAKE_TRAFFIC_SECRET bd1c126ac9413aefcf052b058514d8c7961d8164505610ad209928e5446a9d83 dfc3adfb6f2cd3851961098b8219c5f2bc4ff597b4d4529f2eb86f78a41ed0ab +SERVER_HANDSHAKE_TRAFFIC_SECRET bd1c126ac9413aefcf052b058514d8c7961d8164505610ad209928e5446a9d83 b34ae964881060b4729342522cc6df64debdad55a81b8fec13a804d43001c73e +CLIENT_TRAFFIC_SECRET_0 bd1c126ac9413aefcf052b058514d8c7961d8164505610ad209928e5446a9d83 62b26e81d40ec22cca8cddfbeda89dc0375eea0e469731a4684058d4ed170f12 +SERVER_TRAFFIC_SECRET_0 bd1c126ac9413aefcf052b058514d8c7961d8164505610ad209928e5446a9d83 06d5ea7f4052aa9ddf1ee9a7660b8c641f16018d162ae90113ac8a781c57636c +EXPORTER_SECRET bd1c126ac9413aefcf052b058514d8c7961d8164505610ad209928e5446a9d83 caa92bedf2fc44c1e0fd765547eaa3ca63cd4ef683dd24d3d9d47dbec8d6f3aa +CLIENT_HANDSHAKE_TRAFFIC_SECRET 06925dfaa37d66633b5e2c447fdd9be0c83d739765a6caf84429829295c59b81 305afe8679cfc94eae2398f39175a6d36836f4594d56bb060a742f1c96ba8066 +SERVER_HANDSHAKE_TRAFFIC_SECRET 06925dfaa37d66633b5e2c447fdd9be0c83d739765a6caf84429829295c59b81 c7af641dd4f5a1be52757e0d7a37e1804aa35b8b8cca4fcbb4f0c2735e7936e1 +CLIENT_TRAFFIC_SECRET_0 06925dfaa37d66633b5e2c447fdd9be0c83d739765a6caf84429829295c59b81 25051c7b07c8105b5d78d6f4bcbb576ac8360d54d24dc9cc2b2ad4d04a883cef +SERVER_TRAFFIC_SECRET_0 06925dfaa37d66633b5e2c447fdd9be0c83d739765a6caf84429829295c59b81 21319e45ce21270037fb325af2b3f759a48843a5597f3fcedfcd06bb054e285b +EXPORTER_SECRET 06925dfaa37d66633b5e2c447fdd9be0c83d739765a6caf84429829295c59b81 78c46a8710831625c89d2b54399e70830c8198b99739d5aea82c1f292d5ea7b0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8f5936e0eb4f6e0834962928219ca5b8280b0717c64c123c0a2c4e25d68d4d58 996865d503a1e65549739783255b40ba816f2749ab76e7ab910dc07cd2137a84 +SERVER_HANDSHAKE_TRAFFIC_SECRET 8f5936e0eb4f6e0834962928219ca5b8280b0717c64c123c0a2c4e25d68d4d58 01b8c3be4faf01860d8b844946c1517a14f2c0205c7d941c14005354850c9300 +CLIENT_HANDSHAKE_TRAFFIC_SECRET c0240a9d529891f485a32e54ac580c9b41a3fe4a9e202fa0e58c0a6949da33b5 f9697fd17321f4a01a9872a5b51a84b0d5403f43688d180899bf1e4aad3c727e +SERVER_HANDSHAKE_TRAFFIC_SECRET c0240a9d529891f485a32e54ac580c9b41a3fe4a9e202fa0e58c0a6949da33b5 13cc343123d4632ee329feb7d5d58479db47dd2a98cff148b108c0e96e1897f6 +CLIENT_TRAFFIC_SECRET_0 8f5936e0eb4f6e0834962928219ca5b8280b0717c64c123c0a2c4e25d68d4d58 6595e75c52519d108df10b4556ff9eb95066d044e7eb82d209f49c0488fc6222 +SERVER_TRAFFIC_SECRET_0 8f5936e0eb4f6e0834962928219ca5b8280b0717c64c123c0a2c4e25d68d4d58 3d97f6cca4e155d3069a93fe5f04b8581b549db429a990847cabd47a7b9e4daa +EXPORTER_SECRET 8f5936e0eb4f6e0834962928219ca5b8280b0717c64c123c0a2c4e25d68d4d58 8dc1a8ace550f8b66bd7add16ccdf7f14bc5a286918da551ef39688175c15737 +CLIENT_TRAFFIC_SECRET_0 c0240a9d529891f485a32e54ac580c9b41a3fe4a9e202fa0e58c0a6949da33b5 e0ed37dfb1e749a8d5943e8cf475df764d73417e43ecadc04db00af59188181c +SERVER_TRAFFIC_SECRET_0 c0240a9d529891f485a32e54ac580c9b41a3fe4a9e202fa0e58c0a6949da33b5 1eca41069771d6398ad3bad4ba2fd855534cef1995ef4e7312a7ff93b6f98871 +EXPORTER_SECRET c0240a9d529891f485a32e54ac580c9b41a3fe4a9e202fa0e58c0a6949da33b5 09562199a2c56c3e7ce33a894748d1ad7e546a54c219683ce9efe3cf71810411 +CLIENT_HANDSHAKE_TRAFFIC_SECRET a536c7a9d87e36f96a8e29ef561794166c2bee5a688c48496f9a6ccf8524e1da 36af8401bf2db43aaac7bb5be3539776d6d4a83fd713abe9d6918602ab1f6444 +SERVER_HANDSHAKE_TRAFFIC_SECRET a536c7a9d87e36f96a8e29ef561794166c2bee5a688c48496f9a6ccf8524e1da 14bbd4ad6bea66055bded2f5853ba716f16093b753884434ff0bb7bbfd1ee239 +CLIENT_TRAFFIC_SECRET_0 a536c7a9d87e36f96a8e29ef561794166c2bee5a688c48496f9a6ccf8524e1da 56beab4a863ab16dd363ced80b77cb010d8679cd910cbbc48864b2dd142ee7a2 +SERVER_TRAFFIC_SECRET_0 a536c7a9d87e36f96a8e29ef561794166c2bee5a688c48496f9a6ccf8524e1da a898ac09f0d25778537042a379415e0a942c38e39136ab5bf120cefd0405102c +EXPORTER_SECRET a536c7a9d87e36f96a8e29ef561794166c2bee5a688c48496f9a6ccf8524e1da 50730e3b736fdf387b8164e0c764a9951c5a1167e0398941ffb803e537faa6a1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 05433626107abc7a4e91cad0f4c14c0f7e1416912352872dd9a96770219f15ac 42af5e2637508dc2ce9a4ba0e2450bc9e18018a1c1a2a0b962925fa370de0f48 +SERVER_HANDSHAKE_TRAFFIC_SECRET 05433626107abc7a4e91cad0f4c14c0f7e1416912352872dd9a96770219f15ac 540b3c349fb1709dba9244141f7955e6a56d99fc83c23af8a65ebdb19f1cce4b +CLIENT_TRAFFIC_SECRET_0 05433626107abc7a4e91cad0f4c14c0f7e1416912352872dd9a96770219f15ac 7da9fa061f61003cd7fae5314690670d76f09b2632b938cd1548b2692e2c48a1 +SERVER_TRAFFIC_SECRET_0 05433626107abc7a4e91cad0f4c14c0f7e1416912352872dd9a96770219f15ac 3871778515d0bc8aee56334b440afe61524f38e5e1196ae13c942ff8d71d5d29 +EXPORTER_SECRET 05433626107abc7a4e91cad0f4c14c0f7e1416912352872dd9a96770219f15ac 346a88dfde56820b6346bcf4753a01c06aa6c3e3cdd07f56c6bfc6a1c2909daf +CLIENT_HANDSHAKE_TRAFFIC_SECRET 24674655eb1f33d68a6223c6074c9f61f9248eca171fdc421d5e35b7d42aea66 1a27fce5e2166c0f8e4f7e343bfa120ca3843af03c8ff8fa7470dc2ec8860ea8 +SERVER_HANDSHAKE_TRAFFIC_SECRET 24674655eb1f33d68a6223c6074c9f61f9248eca171fdc421d5e35b7d42aea66 4008e2eae76826d35b6a23c4fa85a73137b64f8176b502b30aa881aa3ea100a5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 345cae40e81c70ab75f4ca653991a54808f808eb54d18db08260abbc7e12dc1d 8e086e79fd696576c13b2764d135162dcc83274faea763222f406140600c5baf +SERVER_HANDSHAKE_TRAFFIC_SECRET 345cae40e81c70ab75f4ca653991a54808f808eb54d18db08260abbc7e12dc1d 3acb1a359c389f95d865b2fb36c73ff7bf02aba75cb0517b5f7a0e97ef212bdb +CLIENT_TRAFFIC_SECRET_0 24674655eb1f33d68a6223c6074c9f61f9248eca171fdc421d5e35b7d42aea66 15fe8ebbc7a42b69a51ba3c6ee6534cea0eb93cadbde4de88c19269453fb75ee +SERVER_TRAFFIC_SECRET_0 24674655eb1f33d68a6223c6074c9f61f9248eca171fdc421d5e35b7d42aea66 28ee0b5ecc0d91b09704b45109a56472b831e83fc845014450bd3ef2e9709fa0 +EXPORTER_SECRET 24674655eb1f33d68a6223c6074c9f61f9248eca171fdc421d5e35b7d42aea66 d90b8236371419563ac72e70229885f04a7ddb0c6294c3ef61977512e35538f0 +CLIENT_TRAFFIC_SECRET_0 345cae40e81c70ab75f4ca653991a54808f808eb54d18db08260abbc7e12dc1d 18427e5bffb6df65861036bc3e124933d02e4e7cbf15a2ffc45c70b33f76f08a +SERVER_TRAFFIC_SECRET_0 345cae40e81c70ab75f4ca653991a54808f808eb54d18db08260abbc7e12dc1d 8cddea669879f5a2fdc0af379b6d4c83e8ec0d19bc9fec8e3c3728fa1414a1bc +EXPORTER_SECRET 345cae40e81c70ab75f4ca653991a54808f808eb54d18db08260abbc7e12dc1d d49cbd5c53e8dd1222f8831c26151987436c579fc1ba618da4492ae804a6db15 +CLIENT_HANDSHAKE_TRAFFIC_SECRET bc264b6478e5373cf99f82378ac36d75fdb0281efba56ed45444fd79707a83fd 308538ebc90a0ab0c09cbb8b17d8b8faba0b76eb3c52201760dd1e8951cea85e +SERVER_HANDSHAKE_TRAFFIC_SECRET bc264b6478e5373cf99f82378ac36d75fdb0281efba56ed45444fd79707a83fd 7d53c38b88c0a49b2b7f24324568c064258f8aac7d04384db9e9fbb0f95b7638 +CLIENT_TRAFFIC_SECRET_0 bc264b6478e5373cf99f82378ac36d75fdb0281efba56ed45444fd79707a83fd 8ce8972945a6a771c6676d1706df0aa3cbe1222c6bcee320c6092cd6a892547b +SERVER_TRAFFIC_SECRET_0 bc264b6478e5373cf99f82378ac36d75fdb0281efba56ed45444fd79707a83fd 8372981fd0ae573b01317bdc2379102e0d1d7887287c2e87568e0a1f0b827a94 +EXPORTER_SECRET bc264b6478e5373cf99f82378ac36d75fdb0281efba56ed45444fd79707a83fd f740e2c5da10fec90b9243fb92e9f6b5c23d7317b78e51157744ef575aee0c4c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 75f46ca41679d648fc37d796613036fcd57a140217d8d32cc4ad3fca6482656b 2c523924e33859cf0c1a5803b47ff024cfc7cc79b11516fa6886d5f17c72016f +SERVER_HANDSHAKE_TRAFFIC_SECRET 75f46ca41679d648fc37d796613036fcd57a140217d8d32cc4ad3fca6482656b ffba9562a67f8ad477758e7fb9449aba1f98b48298f7a55663ed5289ab3d895e +CLIENT_TRAFFIC_SECRET_0 75f46ca41679d648fc37d796613036fcd57a140217d8d32cc4ad3fca6482656b ee5175b2f8f56ebab19d4dea97bd28de4dbb54c46aad192af3965d6787796574 +SERVER_TRAFFIC_SECRET_0 75f46ca41679d648fc37d796613036fcd57a140217d8d32cc4ad3fca6482656b 3c9c12edc400d4a628c9302d1dfbc1d3cf25ee7ad73d8d0855adbed256bdb537 +EXPORTER_SECRET 75f46ca41679d648fc37d796613036fcd57a140217d8d32cc4ad3fca6482656b cfa502fd7eb0f16080d464f11b8a3053f823689813e18ad09ea04246d876a9af +CLIENT_HANDSHAKE_TRAFFIC_SECRET 9886debdcbe69a12b6514cbbf8b9a62be375be05247a52152f16e5819fd3fbd0 144942b7ddc5587db2146d4a29d3e65bdfc2f07accddb0cb487ca808214070df +SERVER_HANDSHAKE_TRAFFIC_SECRET 9886debdcbe69a12b6514cbbf8b9a62be375be05247a52152f16e5819fd3fbd0 bc3e03a0a26a3f27733ed2885d9dda9820ba5fe71424011db9203c9026703f9d +CLIENT_TRAFFIC_SECRET_0 9886debdcbe69a12b6514cbbf8b9a62be375be05247a52152f16e5819fd3fbd0 ae1301a80bd1ccfd56ed9df875f77e54d6de5014c9fec9b3a3433f508e7e87f5 +SERVER_TRAFFIC_SECRET_0 9886debdcbe69a12b6514cbbf8b9a62be375be05247a52152f16e5819fd3fbd0 c360ef81fd363ecb6259096e035a7d327237fcd693ae98a72bfb5038fe1ded82 +EXPORTER_SECRET 9886debdcbe69a12b6514cbbf8b9a62be375be05247a52152f16e5819fd3fbd0 625dc3d705568a8c566241384add5455a0f9b9cbd8e1805c90c01c43d83e75ad +CLIENT_HANDSHAKE_TRAFFIC_SECRET 01522ac73e5025604211522f0d10a0bb3f639c4da06ae1645abd653a73fbeec2 48c1c9567dd138697d068fa1b7e8e6158f93dd41bf9e8770a9862b497e183556 +SERVER_HANDSHAKE_TRAFFIC_SECRET 01522ac73e5025604211522f0d10a0bb3f639c4da06ae1645abd653a73fbeec2 07c85c50410fba91bd1fb33a10714cd9a3e24802870aab25b48859f4d8a3226a +CLIENT_TRAFFIC_SECRET_0 01522ac73e5025604211522f0d10a0bb3f639c4da06ae1645abd653a73fbeec2 d1eefcdc399a3fbb0dd9464106118675eac953eb0b90182792e36cee3c5442a4 +SERVER_TRAFFIC_SECRET_0 01522ac73e5025604211522f0d10a0bb3f639c4da06ae1645abd653a73fbeec2 dd50db88a1198a00f5d7d95ddeb26f280e69780f0dfa09c31f42f2c1a9a275cc +EXPORTER_SECRET 01522ac73e5025604211522f0d10a0bb3f639c4da06ae1645abd653a73fbeec2 c4e32d7ba39622e944ce5baf9cf4ae33d194eae59a8523415b6f37b44d42b866 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0fb3a80a95e969cec20d671c33cd17b5d3dd96c2b5de9ee2452b835a77f2ec60 ce932d0afb405485f34e6b12d15431fa5ce7c53cb3bf51e27add16075747f01b +SERVER_HANDSHAKE_TRAFFIC_SECRET 0fb3a80a95e969cec20d671c33cd17b5d3dd96c2b5de9ee2452b835a77f2ec60 bc4120f548e530c7e0523cfd19fd58dfb55c0a4fe92042d71088d890fb095e72 +CLIENT_TRAFFIC_SECRET_0 0fb3a80a95e969cec20d671c33cd17b5d3dd96c2b5de9ee2452b835a77f2ec60 25558e316088f21ac0f8d136cd8a6c70e89a02c2dfc92306bc3c486b753c2660 +SERVER_TRAFFIC_SECRET_0 0fb3a80a95e969cec20d671c33cd17b5d3dd96c2b5de9ee2452b835a77f2ec60 2d78eed17b11c988f09cfe1948c78d4fe82618a3bf60e6415fba375823cb5d78 +EXPORTER_SECRET 0fb3a80a95e969cec20d671c33cd17b5d3dd96c2b5de9ee2452b835a77f2ec60 c27df928dcd89b8cf8ecbcfb34d634c511c1954d32657175c145c3ee72bcb00c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0cb95731734c291e25f110338df85c5dc9ce20721f1319fcdff7b2df5476ad25 d9ff1bcc045963269de42c66a1a2eae62832f74b9ebfb4463f368b2af30b670e +SERVER_HANDSHAKE_TRAFFIC_SECRET 0cb95731734c291e25f110338df85c5dc9ce20721f1319fcdff7b2df5476ad25 079f713df129259707c407234e60a77b6db5d558a337ba6e6cfb7f9204228ecc +CLIENT_TRAFFIC_SECRET_0 0cb95731734c291e25f110338df85c5dc9ce20721f1319fcdff7b2df5476ad25 bcf0d748bbdd4a292a2c476ccd808d6873e71d2c5f380731a0e0a028acf709c9 +SERVER_TRAFFIC_SECRET_0 0cb95731734c291e25f110338df85c5dc9ce20721f1319fcdff7b2df5476ad25 da4d344f911705a3b059c518056e8a47f4b91106150d6d22974b93d652dc8e01 +EXPORTER_SECRET 0cb95731734c291e25f110338df85c5dc9ce20721f1319fcdff7b2df5476ad25 73eff4750d1a9b095371593df0416bd93b82a6036cae6a26a8de291ee93be185 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 7f914a7cbb53513ab22c75a169f756e4455ccff234b932a1f26e654cb0411d89 3f219a8e439d0cf38bd63a79bdfed80e7eb7f5917d5edb3155b2ab9187c9b6e1 +SERVER_HANDSHAKE_TRAFFIC_SECRET 7f914a7cbb53513ab22c75a169f756e4455ccff234b932a1f26e654cb0411d89 605100bf2695fe9b21e193c9d121d866e81624785a372a4b357bdf6a0c5efc85 +CLIENT_TRAFFIC_SECRET_0 7f914a7cbb53513ab22c75a169f756e4455ccff234b932a1f26e654cb0411d89 330a9ad26494bd00da43d53a54323926c4c8a49ed1113ef58e88cfb67a66d993 +SERVER_TRAFFIC_SECRET_0 7f914a7cbb53513ab22c75a169f756e4455ccff234b932a1f26e654cb0411d89 192a058bf771e3e63052f1480d098f01b34c0ac4794293cd238e0d635e1a3597 +EXPORTER_SECRET 7f914a7cbb53513ab22c75a169f756e4455ccff234b932a1f26e654cb0411d89 78bb74a33332dd7a8d0c607c872e27659eb7eaa545197c5e49497f3cb8252c85 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5fbda9c16a87a182dda2d05479ba1d7ba897c78761d41d155f1b78f6a6001a9f 4b532610eb51406fe5e3c448e15fe273cf69dec05341e260c66d4d0566c55e35 +SERVER_HANDSHAKE_TRAFFIC_SECRET 5fbda9c16a87a182dda2d05479ba1d7ba897c78761d41d155f1b78f6a6001a9f dc5b4bcf74a7cd39c872ff665649e1930bdbe09e640e7b0b2bf52200ff58f3d1 +CLIENT_TRAFFIC_SECRET_0 5fbda9c16a87a182dda2d05479ba1d7ba897c78761d41d155f1b78f6a6001a9f d06c10fe388118da42867c12dbc0a39baf785f73979377c1f39b2273da1b13c7 +SERVER_TRAFFIC_SECRET_0 5fbda9c16a87a182dda2d05479ba1d7ba897c78761d41d155f1b78f6a6001a9f 4147667884bc3a82e03f3602db0ec9a7affc7387e9aae2a9714d6ad306c988bd +EXPORTER_SECRET 5fbda9c16a87a182dda2d05479ba1d7ba897c78761d41d155f1b78f6a6001a9f ce5ae2cc8f952ab04d8db6a6bb396dfe344baa376799b8e2a421d1ef07524968 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ea665c3a48f7b4c6bca29756459b3119a7a8e7f1e0fedb201169e815641e8f13 ae10a8d4aab47d6d7375baa8a74cd51d005562bd90285404b411ff8fe87fd3d7 +SERVER_HANDSHAKE_TRAFFIC_SECRET ea665c3a48f7b4c6bca29756459b3119a7a8e7f1e0fedb201169e815641e8f13 852a660853e1d7828bfb40e7cc88f1cf9e1c148bb4818e0d161d0bb4d35b9ead +CLIENT_TRAFFIC_SECRET_0 ea665c3a48f7b4c6bca29756459b3119a7a8e7f1e0fedb201169e815641e8f13 9a7d73925792478a2d8fe98b51669d76dbbe8be5ed6389204c5d3eb212f2b456 +SERVER_TRAFFIC_SECRET_0 ea665c3a48f7b4c6bca29756459b3119a7a8e7f1e0fedb201169e815641e8f13 a4fea83e1728c6756f98ff3502d395d62a628f9a9b7eb0af8e7e437b5530c2fd +EXPORTER_SECRET ea665c3a48f7b4c6bca29756459b3119a7a8e7f1e0fedb201169e815641e8f13 ea949d0c9de3f5d0d6d90dc685956b54640e7ac51be898158d02a178f2e491c2 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5dfb782c297b0136bcdb98fcc775a3c5c27a4d12f17f16a6f5b7432d408bd25b 5a305af60667008dad7ad1a43759d198ed12fc7694e5e653820de30b97568e48 +SERVER_HANDSHAKE_TRAFFIC_SECRET 5dfb782c297b0136bcdb98fcc775a3c5c27a4d12f17f16a6f5b7432d408bd25b 685746dca80666114df7eecfa08171fe6c29220559e7eabbfaaf103889da924f +CLIENT_TRAFFIC_SECRET_0 5dfb782c297b0136bcdb98fcc775a3c5c27a4d12f17f16a6f5b7432d408bd25b 40b4df801999a5ab1bb83459da6787832465b136b817e73bf2c9966314e403d5 +SERVER_TRAFFIC_SECRET_0 5dfb782c297b0136bcdb98fcc775a3c5c27a4d12f17f16a6f5b7432d408bd25b 6e83adca04c58fda0e767377129c91133313770bfcc85ad70c72b764ccb897c4 +EXPORTER_SECRET 5dfb782c297b0136bcdb98fcc775a3c5c27a4d12f17f16a6f5b7432d408bd25b 20c51562f338db4b2c22293d3445cc9e69ffae1416aa486aac7def6ac0c74b57 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 579ba476917b52cb4af9c1e53edc382e7d1877e794cd9dd21c25812e597bc2bd dcdd5168c103c8533454710187e40a0f683b32f97a24449f339ccea3fa48d811 +SERVER_HANDSHAKE_TRAFFIC_SECRET 579ba476917b52cb4af9c1e53edc382e7d1877e794cd9dd21c25812e597bc2bd 431c99adcce98b357872c5bd12d0f61b239e82cc486ed421b176d697c77a56a8 +CLIENT_TRAFFIC_SECRET_0 579ba476917b52cb4af9c1e53edc382e7d1877e794cd9dd21c25812e597bc2bd fc279ee3934020d7cea6c65e117b462bd37b94842ce5488c688d16a427b8323f +SERVER_TRAFFIC_SECRET_0 579ba476917b52cb4af9c1e53edc382e7d1877e794cd9dd21c25812e597bc2bd 2cd7fabc80e1b3c25787e6b04ac9ef44729a44be9163f09585d0702131ab7781 +EXPORTER_SECRET 579ba476917b52cb4af9c1e53edc382e7d1877e794cd9dd21c25812e597bc2bd d93fad7fe512b08a13e7f2dc0e8ea007b89f2b8c28ed180987d37d23afa68f1d +CLIENT_HANDSHAKE_TRAFFIC_SECRET c52a937caf876782c531e3f8bc1bc40dd75253eac4ef45ee0261306638bef8e7 d3d3284250f8492fc8bc4fd661e7c0918c09272e4de8d744c7729f6e618999e3 +SERVER_HANDSHAKE_TRAFFIC_SECRET c52a937caf876782c531e3f8bc1bc40dd75253eac4ef45ee0261306638bef8e7 e39a7ea08fecf1011c6bc4daf05b362aa78744c8342850990618607adab86ddc +CLIENT_HANDSHAKE_TRAFFIC_SECRET 6b91acc70b4dafbb997752aa98ffd1cfeb5d52d272a202f1fc36fdf798527a14 3328af9247bfe801dfaed6855db3b74496a7617de4ccb16a677e4599bbcd2739 +SERVER_HANDSHAKE_TRAFFIC_SECRET 6b91acc70b4dafbb997752aa98ffd1cfeb5d52d272a202f1fc36fdf798527a14 688494e089c2344bc3ca497ebf653a4cb0bec1a541004b4ff8adfec408724f66 +CLIENT_TRAFFIC_SECRET_0 c52a937caf876782c531e3f8bc1bc40dd75253eac4ef45ee0261306638bef8e7 be9922cf719bc280254a8d01f02ffb29aa1b43122479c7a40ff5a0b195e7f1ee +SERVER_TRAFFIC_SECRET_0 c52a937caf876782c531e3f8bc1bc40dd75253eac4ef45ee0261306638bef8e7 3c714029b3cb9acee91b66ac24551862e6b8fca51121cef4589f51f248d3dcd8 +EXPORTER_SECRET c52a937caf876782c531e3f8bc1bc40dd75253eac4ef45ee0261306638bef8e7 21aa86d8b6d1a6d476db713f5ef2d177bb2039f74b86b0477aa8a8549333b278 +CLIENT_TRAFFIC_SECRET_0 6b91acc70b4dafbb997752aa98ffd1cfeb5d52d272a202f1fc36fdf798527a14 f37fbb26b911ad1eb8f2ff2bf5f79aa39766a7f723cf8b9b556fc6a49771af10 +SERVER_TRAFFIC_SECRET_0 6b91acc70b4dafbb997752aa98ffd1cfeb5d52d272a202f1fc36fdf798527a14 2dc00c12693d5dbf2b3fe617743a569549db8d5b926fa1b8e3cc43d3a905a2bb +EXPORTER_SECRET 6b91acc70b4dafbb997752aa98ffd1cfeb5d52d272a202f1fc36fdf798527a14 1d54804c71594fa720828f2ead31f3b938ef56ff0eae70c5e6a2ba372be33847 +CLIENT_HANDSHAKE_TRAFFIC_SECRET dad0bab3c8e0e90ffc66fd19c9e61a8b55198ee704782910427725d4a23d0f55 2e689ccc18557f623581ec33bbf5f34867e85c54c5d6694031dddc96d080d6d2 +SERVER_HANDSHAKE_TRAFFIC_SECRET dad0bab3c8e0e90ffc66fd19c9e61a8b55198ee704782910427725d4a23d0f55 1b3bb873934f8aa69aca4794f65e8aa29847eae3625dfdd04b0002c5127666a3 +CLIENT_TRAFFIC_SECRET_0 dad0bab3c8e0e90ffc66fd19c9e61a8b55198ee704782910427725d4a23d0f55 b8ce2d4a9e9bb51a1ef674de8e1660ed499e3322a3ffa8e2715bc976879ae617 +SERVER_TRAFFIC_SECRET_0 dad0bab3c8e0e90ffc66fd19c9e61a8b55198ee704782910427725d4a23d0f55 a490eafa866b1ab2b8789932c3463ce27debce6a14bc7cc97fb2ece10a6107fd +EXPORTER_SECRET dad0bab3c8e0e90ffc66fd19c9e61a8b55198ee704782910427725d4a23d0f55 76d1b3197d20fdd310ab90f3b054b0d020be891faa9a6c88d606fff3e5e3d4c5 +CLIENT_RANDOM cb3ec174be0b91d0f304aa6c7010dfdb5c17c7226ee5121b709e55fa1bc19a47 d10106883dc71e5971ba67b2d78c7f87ef95992a019cd5bcee44cc2be7bbbb74920ddb01c0ec908477405f4b2435ab42 +CLIENT_RANDOM c9cf75a2c0d74be33238fb9c15bc9efc0d0177f94f525f9d823861fda2a3d5f4 8d73d8ebaf599ec1cac3c3e2f49035a4d66663da8e98ecee80f1d6447fedf0eb56633e63ee5fc0a3f2401082762bdc96 +CLIENT_RANDOM 8f4275d597c55436f5780b1ee107dbb92df49f9f25c321e7e19d855024688d26 30c245258501d7f6ba0b73506629a78411945a8c3125d6373358eff33acfa2a7d0e77a90841da3ecc6140d4df106d46a +CLIENT_RANDOM 119aa0f83e98ba262187b28035778ac0e58c53052a0d0cad0af4488ce5e1df11 33c555b47ae61e415fdefd192de7120dc1563f68a62e3a93462eae217facc32607314ce07e78538de726d92fcf88a7c9 +CLIENT_RANDOM 4944db31c50b74dd55a61b4d2f85f5fb65cef7c4f4766d7cfd832edbc0be6efb c9979404b03b6b85e324a9dd8f5cd01f86067556a644317966e3490590657324d11afd8d17fc933c0045346c3e85c4b1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET eb627431ba9b0d4448488ded7ab92f144a5a8ca35ac6e7a0b2300c2ad36ec9d7 d7dd9848b17365b5c5771a6477b0b1e409b488065f6bbbea0aac68413dd46981 +SERVER_HANDSHAKE_TRAFFIC_SECRET eb627431ba9b0d4448488ded7ab92f144a5a8ca35ac6e7a0b2300c2ad36ec9d7 06b92cb30a2043f1632857e12fec50089be87dad991fcca8fde7e435f0a44332 +CLIENT_HANDSHAKE_TRAFFIC_SECRET fb814285d0aedea11f69e30f679bcf54e26f0899125291e3c4981b89374506da eff7ed3c50a71f08bd8791e99a278984fbc3541f9e91e5ac5ef6f6a58b0b851a +SERVER_HANDSHAKE_TRAFFIC_SECRET fb814285d0aedea11f69e30f679bcf54e26f0899125291e3c4981b89374506da 2b074e7fc2e1feff74c6315694133d0ddbcbe633364fdf6a49b17a3675d60ab8 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 17fd5b988d2bd53f3570bc19b802b762278d0bee674a96fe3500956e0adaef76 6726830a86aa8061204592ccbbe32cbb60b0241df1ff770ecbd28e0e286f1e82 +SERVER_HANDSHAKE_TRAFFIC_SECRET 17fd5b988d2bd53f3570bc19b802b762278d0bee674a96fe3500956e0adaef76 ef97397e783dbbed3e3e66e896fada38ed917e43fee67dba1250f513cfbb1e33 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 4cb2a47399cf961e723d41cd5fff1f7701ec223a5f8ebebf1afa30f5a9cd0c00 24160d5d3fc5c13dfeefabeaa2cda180a94965c4eb71eb3461bd0d4f800da5fd +SERVER_HANDSHAKE_TRAFFIC_SECRET 4cb2a47399cf961e723d41cd5fff1f7701ec223a5f8ebebf1afa30f5a9cd0c00 b06c62fd57c68278724862c0bee3b6eeb3b237f0761f2b3161d6488e1ac70080 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2abe941e4830422280870978a9e49d549474a8318acb92f5b5a5b138d566f6e2 4fb202b3b8309bcdcd05464f584709729c7c9827fd43e7a0f7c66e2aaf29d691 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2abe941e4830422280870978a9e49d549474a8318acb92f5b5a5b138d566f6e2 b55a63a01d018ab81519fbd8bc619b3e5b7bf6f1208003ee6cad5152c5fe1fe5 +CLIENT_TRAFFIC_SECRET_0 eb627431ba9b0d4448488ded7ab92f144a5a8ca35ac6e7a0b2300c2ad36ec9d7 a2ef4a74616ccb82c9ef9f36589523265776cdea9f52828e111b5a821620c019 +SERVER_TRAFFIC_SECRET_0 eb627431ba9b0d4448488ded7ab92f144a5a8ca35ac6e7a0b2300c2ad36ec9d7 77b0086e6dd016259f67b23a8db13faaf40be7c3fe8ac66099aedb2141eb68a7 +EXPORTER_SECRET eb627431ba9b0d4448488ded7ab92f144a5a8ca35ac6e7a0b2300c2ad36ec9d7 7783a36b719b4b54fa0b1df9bf7db1165693825403ece006853c8aef643ff6eb +CLIENT_TRAFFIC_SECRET_0 17fd5b988d2bd53f3570bc19b802b762278d0bee674a96fe3500956e0adaef76 306e3e19700de38f89ad42d208250e614e3d0c23d77070e2a9542db50eb2f3c1 +SERVER_TRAFFIC_SECRET_0 17fd5b988d2bd53f3570bc19b802b762278d0bee674a96fe3500956e0adaef76 4782d9d9888a064c533e763a00ce3f9808464589926222e758c283a2312e2d24 +EXPORTER_SECRET 17fd5b988d2bd53f3570bc19b802b762278d0bee674a96fe3500956e0adaef76 9ec830f369e403b62c2e1aff530de2c7b39d1019a23497858b7fba92ebee8c14 +CLIENT_TRAFFIC_SECRET_0 4cb2a47399cf961e723d41cd5fff1f7701ec223a5f8ebebf1afa30f5a9cd0c00 f8797a8392e47fa1e329b7b8231b4cf98d8842a9f35f4a33a1287400af2319f9 +SERVER_TRAFFIC_SECRET_0 4cb2a47399cf961e723d41cd5fff1f7701ec223a5f8ebebf1afa30f5a9cd0c00 84ddfa991a170d17b24825f84bd635024baf64c55ae2305eec6379717689efd6 +EXPORTER_SECRET 4cb2a47399cf961e723d41cd5fff1f7701ec223a5f8ebebf1afa30f5a9cd0c00 19345027998452aec84d82e0193166690e6b794626fcbb0fb9dc11d06b6c3a9f +CLIENT_TRAFFIC_SECRET_0 2abe941e4830422280870978a9e49d549474a8318acb92f5b5a5b138d566f6e2 5e5330ee1267a003d858d6de10c6ee7ab6047e4188bb84a4e0b11a3630fb57ed +SERVER_TRAFFIC_SECRET_0 2abe941e4830422280870978a9e49d549474a8318acb92f5b5a5b138d566f6e2 990ca6be339f1febdaaa9a2862af1ed5a7443cd46c949ff5ded32cef18ed0fe0 +EXPORTER_SECRET 2abe941e4830422280870978a9e49d549474a8318acb92f5b5a5b138d566f6e2 0b1a4bccf7a1d7d3c6415074296a2a1954a4c898fa537ca532ddfd7d90e2b42f +CLIENT_HANDSHAKE_TRAFFIC_SECRET 135c324e5e7f82d02bd8a0cbb1702a7e04557e729c72fedd9fb94ef007f4913c 99aa6397592f077919b12d98ba1600b5d89b333e29211b4a3ec2a077f0a6d81e +SERVER_HANDSHAKE_TRAFFIC_SECRET 135c324e5e7f82d02bd8a0cbb1702a7e04557e729c72fedd9fb94ef007f4913c 81f872ad410eaaadef7b70c2940ea68c36b275f5a970d7cc30541be009309b34 +CLIENT_TRAFFIC_SECRET_0 fb814285d0aedea11f69e30f679bcf54e26f0899125291e3c4981b89374506da 3d879996199cfcc3c631d0c36d62acdc6c76fc9afa81bdd61ab827e11b1fd7f3 +SERVER_TRAFFIC_SECRET_0 fb814285d0aedea11f69e30f679bcf54e26f0899125291e3c4981b89374506da 73ca4fd52ae0918007aea7f23e94f4bd04e64d693d407a20bf07138201b60c04 +EXPORTER_SECRET fb814285d0aedea11f69e30f679bcf54e26f0899125291e3c4981b89374506da aa49275f832b7598d1ed3a6bb2905cdf1337b058f618b6c263f5e6ab4e195b05 +CLIENT_TRAFFIC_SECRET_0 135c324e5e7f82d02bd8a0cbb1702a7e04557e729c72fedd9fb94ef007f4913c 3cf71953513a00a360a4464547bb6a3dc52dfa19fed54dee1127b9b170ef73de +SERVER_TRAFFIC_SECRET_0 135c324e5e7f82d02bd8a0cbb1702a7e04557e729c72fedd9fb94ef007f4913c c6b84bd7151b56eb5d41fc86fec6c39fade1fefda762de54c0ce42698149c143 +EXPORTER_SECRET 135c324e5e7f82d02bd8a0cbb1702a7e04557e729c72fedd9fb94ef007f4913c 3375c57825017d83919bf3ed61892dd98c0872e8fb78ddd4d50136d103683eaf +CLIENT_HANDSHAKE_TRAFFIC_SECRET 963eda45d73ff05f0fe2a5978067a58d795ddda8a6fcaffecb9e849314e9131a 1e5c37cefac2af3c53d169ce3a08e21e649e4b8ff5f053bfff14260c98fdd5e2 +SERVER_HANDSHAKE_TRAFFIC_SECRET 963eda45d73ff05f0fe2a5978067a58d795ddda8a6fcaffecb9e849314e9131a b639837be01a2294d6ca23c03619aea72124bf29ea93e7a5cb898b8ca3e595c6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 443557658914837cc8ef32e4bc5219f46bc58b0d447b6a78e135126f4c5a0e78 acd5f14ca166984a3fc78fb5736d6164165d346242a54aa83b1dc4ba119c43d9 +SERVER_HANDSHAKE_TRAFFIC_SECRET 443557658914837cc8ef32e4bc5219f46bc58b0d447b6a78e135126f4c5a0e78 20d5472f144cd6bfb47da78b8026c970b1a35d9ff2ab9037904640ee4ecee9bf +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2fa0a8209bd42f9ceb5332b675df3ce2d4ffe888e983662490944f3d79b7c18e df8c060f8805228375ad8efbb49dfc1963024f21b0817c68e5608c7bfa3fab05 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2fa0a8209bd42f9ceb5332b675df3ce2d4ffe888e983662490944f3d79b7c18e 607768492f6d7a27d462cfe068ef99e8129032a87e8b2f1918319394bd9963f0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 16756425fe6c3eb8137f7c1acde9d17a048b7257643e129b78462c117bacea7c 24a01d61b130bb5ff0eba7d36ad0467aada5fd5ab709a27c89359db8d1b4f897 +SERVER_HANDSHAKE_TRAFFIC_SECRET 16756425fe6c3eb8137f7c1acde9d17a048b7257643e129b78462c117bacea7c deb588679550548ad9c987d37ce759184a336c53f0c6ce58d1b7730e8402993e +CLIENT_HANDSHAKE_TRAFFIC_SECRET 49661bfb1a8c169ede8d75fb401df616c750c5c9f2615b286e22a1edf2933b00 6ff724c5fb9d86bf02e867ecf6b2b58aa3e77a486a6152d1c0018f5a00de9798 +SERVER_HANDSHAKE_TRAFFIC_SECRET 49661bfb1a8c169ede8d75fb401df616c750c5c9f2615b286e22a1edf2933b00 eb9fba4ac8c404dab2915c87d013f64f3ec1db1eebf2c19eb2cfcaa616b92a72 +CLIENT_TRAFFIC_SECRET_0 2fa0a8209bd42f9ceb5332b675df3ce2d4ffe888e983662490944f3d79b7c18e 0ed53b7007e36f51f1b1f5444c7a4d034c7bee0e8a8769bbfa93be3ec9c146a1 +SERVER_TRAFFIC_SECRET_0 2fa0a8209bd42f9ceb5332b675df3ce2d4ffe888e983662490944f3d79b7c18e 6627f1321c645e4692569bf5c6b255a2d9a047f53de5998e1e0c17120c6785bb +EXPORTER_SECRET 2fa0a8209bd42f9ceb5332b675df3ce2d4ffe888e983662490944f3d79b7c18e 324853324c87d4e74f019076d8a1a18c52ecb717da08cae4f36076bb96656cec +CLIENT_TRAFFIC_SECRET_0 49661bfb1a8c169ede8d75fb401df616c750c5c9f2615b286e22a1edf2933b00 6f38c3eada4a51a7cf6f6ec8b916b49461c30a5c2eeafa8be1d7d32a5e994f9c +SERVER_TRAFFIC_SECRET_0 49661bfb1a8c169ede8d75fb401df616c750c5c9f2615b286e22a1edf2933b00 e242acdb64b7fd141429ba618f39aadba9104d88b437217f29ccb2eeae92b7fb +EXPORTER_SECRET 49661bfb1a8c169ede8d75fb401df616c750c5c9f2615b286e22a1edf2933b00 334ddf0d940da44e439db116ab6a73f04a1064c1c726928902f0c8f5b41e3134 +CLIENT_TRAFFIC_SECRET_0 16756425fe6c3eb8137f7c1acde9d17a048b7257643e129b78462c117bacea7c 51dbb822e51393edebd7f676e8a959c65a367c2fe9dcead0c38a6c2d8d6d6742 +SERVER_TRAFFIC_SECRET_0 16756425fe6c3eb8137f7c1acde9d17a048b7257643e129b78462c117bacea7c 17ec1eaec4b11bc180dd313a008f357f569b2eeef9694072c94dfe493d517002 +EXPORTER_SECRET 16756425fe6c3eb8137f7c1acde9d17a048b7257643e129b78462c117bacea7c 50e93cf81f0dbe265779516f4c88adfadcaa5b9c723a1a9316b63f3bd724e708 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 6cc814dbe22d11645d7c7370cda687ce3435cf99618172b78d6b96900bf8798d b1ae34e6916ac59a28961310c2f30eee2c3f61385df277d3308fc4788723d080 +SERVER_HANDSHAKE_TRAFFIC_SECRET 6cc814dbe22d11645d7c7370cda687ce3435cf99618172b78d6b96900bf8798d c7858ec79885f612901a44a924aede6184f1a80900f545fb2e969e9ddcaa73ab +CLIENT_TRAFFIC_SECRET_0 6cc814dbe22d11645d7c7370cda687ce3435cf99618172b78d6b96900bf8798d d496bd2bd55a126677e2c14fedbc2212ea3e8e12c0991ae2e930e9d86a792d9e +SERVER_TRAFFIC_SECRET_0 6cc814dbe22d11645d7c7370cda687ce3435cf99618172b78d6b96900bf8798d 4f243e668eeacca4bf7cc0e3e581c080fccf9b9f68f9254ab874fb5a6d6d4abd +EXPORTER_SECRET 6cc814dbe22d11645d7c7370cda687ce3435cf99618172b78d6b96900bf8798d c77c4ab28b55456c6de4821886fd338bc55f3d8eb3353945151588bd0d9f92e6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET c1444b75c7fcf6dc983ec892d6ef66ecd8ca41faff213274d289bfc5015b8878 687bfcbe17282032d2110518d9b867f36e6f18fc6bc8760c67c4aec40f9cd61a +SERVER_HANDSHAKE_TRAFFIC_SECRET c1444b75c7fcf6dc983ec892d6ef66ecd8ca41faff213274d289bfc5015b8878 6a603ba2c1955662532ec0fd431ac556572e85c27de5ad7428de8d86229cafe7 +CLIENT_TRAFFIC_SECRET_0 c1444b75c7fcf6dc983ec892d6ef66ecd8ca41faff213274d289bfc5015b8878 f4313f2f0fbca6281dc4057340be037f3b2c64ae909e84e49e6b6949a12f17ce +SERVER_TRAFFIC_SECRET_0 c1444b75c7fcf6dc983ec892d6ef66ecd8ca41faff213274d289bfc5015b8878 c62366f579c712fe4b94ee338b6156b8f5832017ccc385400c61339ef36775c0 +EXPORTER_SECRET c1444b75c7fcf6dc983ec892d6ef66ecd8ca41faff213274d289bfc5015b8878 fa4ad12eb53dd3aa58cb71034592bad98cd408fab521d85cf7a7422fb95e810e +CLIENT_HANDSHAKE_TRAFFIC_SECRET ebf3b589483c2e0c3839b66191ad42b50a5385b98ecdf45977a5242aa40c68a7 5cfe857105fdcedfa3c08ccf716115f12b14b7575a2f0b0a36b29f39809785b8 +SERVER_HANDSHAKE_TRAFFIC_SECRET ebf3b589483c2e0c3839b66191ad42b50a5385b98ecdf45977a5242aa40c68a7 1ecbc1176617c7396e0fcee8d68c8d82c8e76bbd27db24ab8cd0fab6ac31e5a1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5d0c125fb9994d32118cfd929150846fffc4535cb2749418be1e1f10d1bae684 80bb16111d5151da1bee7448ffd8fad0672599e7dc5d749d0a972aba9f867896 +SERVER_HANDSHAKE_TRAFFIC_SECRET 5d0c125fb9994d32118cfd929150846fffc4535cb2749418be1e1f10d1bae684 b6405205dad5b535121fc8188d851a8ac30ec7934482c8b9a80ac8c4630d8c72 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 7cd87a7edf53042540f72193f79484620f9f63ae1a44b93d89add5254ac77a1d bcfd85a8b9d491cf81aa9ffbc2db5d1f9d1dfc1aca5662deec0ed5253ab40ce8 +SERVER_HANDSHAKE_TRAFFIC_SECRET 7cd87a7edf53042540f72193f79484620f9f63ae1a44b93d89add5254ac77a1d 71d586ee3550fde5aea492bbc522b93daf76cbc573197133f0b0e1ea851c9dcb +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0ac49566c72ccafcde3133aca1df8b60ad568f05cbfc611a335f4176ae1a72ea a299be6a7775d421bbdc7c45caeca8491df7f73eee1916ed18f8ba0f1c1e53d1 +SERVER_HANDSHAKE_TRAFFIC_SECRET 0ac49566c72ccafcde3133aca1df8b60ad568f05cbfc611a335f4176ae1a72ea ff3d828c9f971153bbde73b0cd6fa51607924a09ae023288df93ebbbd9be4a8e +CLIENT_HANDSHAKE_TRAFFIC_SECRET a370ab447ed4c66debc2f6bfb94366bd0a349ce585de31f0cc7055c7d2099a36 ac9e0cb11b8436700a00f5a34f37ebb7fab0439813367db2cc02f8434bce297a +SERVER_HANDSHAKE_TRAFFIC_SECRET a370ab447ed4c66debc2f6bfb94366bd0a349ce585de31f0cc7055c7d2099a36 1cfe0e46fd15273cf852383ec7e2604e2e21226c769988eef419162d5856e5e2 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3aff1bb689cdbc7b45bef80526c88bbdf02781ad9bc17d5ce64cb27e19006900 51cf55fb88a7f6e7989aef27323b8ee1c260cf5513452ba1849f331e50ff3da5 +SERVER_HANDSHAKE_TRAFFIC_SECRET 3aff1bb689cdbc7b45bef80526c88bbdf02781ad9bc17d5ce64cb27e19006900 e213d0dbe0f4cff149d68e906335df1e18ddea40f459a77cc165c5ce9dfd26e1 +CLIENT_TRAFFIC_SECRET_0 ebf3b589483c2e0c3839b66191ad42b50a5385b98ecdf45977a5242aa40c68a7 3563d20e430a2f2d02bed305e57ba543f05e663acb445a9c577a7d7ab1ffb539 +SERVER_TRAFFIC_SECRET_0 ebf3b589483c2e0c3839b66191ad42b50a5385b98ecdf45977a5242aa40c68a7 a42ea6bb1611ce19f0d46c7e6f037dac3471e82d02e7999d75a55b7cbc27255c +EXPORTER_SECRET ebf3b589483c2e0c3839b66191ad42b50a5385b98ecdf45977a5242aa40c68a7 804f4fd0f5c13fad343a9e0daa6e7e487da8fcb2f556a3be665ea8033a672a86 +CLIENT_TRAFFIC_SECRET_0 7cd87a7edf53042540f72193f79484620f9f63ae1a44b93d89add5254ac77a1d fd4a1aaf6eaf5109a268cea6ba8de49a3d08ecde206b6a844f45cc5552ad4ecb +SERVER_TRAFFIC_SECRET_0 7cd87a7edf53042540f72193f79484620f9f63ae1a44b93d89add5254ac77a1d ef837c9aac610663ccfd33e175bff4c22f1018931ba9584016b38ba3ec2a9aa6 +EXPORTER_SECRET 7cd87a7edf53042540f72193f79484620f9f63ae1a44b93d89add5254ac77a1d ee7a426bf4406aea0944e269fcc558ec7f6f94b4cc5bf7557de305453939eb94 +CLIENT_TRAFFIC_SECRET_0 a370ab447ed4c66debc2f6bfb94366bd0a349ce585de31f0cc7055c7d2099a36 d7064f5ca0dff2b4caefb52427a0e9016fdbd96c4a99b92aa97d24050514c1f3 +SERVER_TRAFFIC_SECRET_0 a370ab447ed4c66debc2f6bfb94366bd0a349ce585de31f0cc7055c7d2099a36 436457d725007d648298d366288dbe94e2a4f601a0571a511ea7b350d2ffefc0 +EXPORTER_SECRET a370ab447ed4c66debc2f6bfb94366bd0a349ce585de31f0cc7055c7d2099a36 2cdb516f94b1013ef08cdaef8af77bdde94a49c3d7ab30c1d368176864f4207b +CLIENT_TRAFFIC_SECRET_0 0ac49566c72ccafcde3133aca1df8b60ad568f05cbfc611a335f4176ae1a72ea 52e29341160ef9892055ee9b11ed56e0857ac6e0fb3346c670c3f593b0ad0a31 +SERVER_TRAFFIC_SECRET_0 0ac49566c72ccafcde3133aca1df8b60ad568f05cbfc611a335f4176ae1a72ea b1eabb3699f128a8b939b8db991b309103ae833b86043b3d877ac8c5a285f9e7 +EXPORTER_SECRET 0ac49566c72ccafcde3133aca1df8b60ad568f05cbfc611a335f4176ae1a72ea 5f46d793b9843cb30be6a861712c2b5138bd65afe4cd775ed08df530f881056a +CLIENT_TRAFFIC_SECRET_0 5d0c125fb9994d32118cfd929150846fffc4535cb2749418be1e1f10d1bae684 05d7fc32e6fe877669588ded645437d33b5829d961629b8b0b2e0bc16556149d +SERVER_TRAFFIC_SECRET_0 5d0c125fb9994d32118cfd929150846fffc4535cb2749418be1e1f10d1bae684 a07a6dd1124d0ff0727abb269466cff90a88cce2c274661fabce86ed6c245bba +EXPORTER_SECRET 5d0c125fb9994d32118cfd929150846fffc4535cb2749418be1e1f10d1bae684 0417b19790a8901e8dddbe3fbe067ea7080bb5e6a8d20f6f7816ec2371e5cdeb +CLIENT_TRAFFIC_SECRET_0 3aff1bb689cdbc7b45bef80526c88bbdf02781ad9bc17d5ce64cb27e19006900 bd67f07ed091b7a4f91cb6fd0658ac2b79b8f896affa49a1e12feb1043ad55c9 +SERVER_TRAFFIC_SECRET_0 3aff1bb689cdbc7b45bef80526c88bbdf02781ad9bc17d5ce64cb27e19006900 4f24d91cd37fc9ec26c896dd37b682cb91794269b69c5c8e0ae022ba2c7a0734 +EXPORTER_SECRET 3aff1bb689cdbc7b45bef80526c88bbdf02781ad9bc17d5ce64cb27e19006900 6e28fcd12c42e4fe06b5d3308c9ff29660ec5c135cd8d41b7f49715cf605b23d +CLIENT_HANDSHAKE_TRAFFIC_SECRET c88fdf529fbb321f02d3653041ff2847c43344faae62cb976656a20de3c144e9 58dbca504846e9c4c7ca50284a7f23009120c47d96e523ff2b4ff39903754f66 +SERVER_HANDSHAKE_TRAFFIC_SECRET c88fdf529fbb321f02d3653041ff2847c43344faae62cb976656a20de3c144e9 810d4e7afd52cd9e2876e6ab1ff0318048599c2a3f57c5ef84e32977189db5ee +CLIENT_TRAFFIC_SECRET_0 c88fdf529fbb321f02d3653041ff2847c43344faae62cb976656a20de3c144e9 538b90bc8c86a1ebce9347ffd779041a9997f891028a61142449479170a717a1 +SERVER_TRAFFIC_SECRET_0 c88fdf529fbb321f02d3653041ff2847c43344faae62cb976656a20de3c144e9 7797244b749137cf47d3586eb4c3455271f6be11c47285016bba7ffd3c0c4ada +EXPORTER_SECRET c88fdf529fbb321f02d3653041ff2847c43344faae62cb976656a20de3c144e9 d754c3f108b9aaec618874e6d3f77288a9ee5d227639a57d9244ab268b9a7b4c +CLIENT_HANDSHAKE_TRAFFIC_SECRET af74083a62b80a23a0afda9719455b5293c3c4e84459a9091b71fb3c6fa9f169 a1ba1afe0760889a57372557fb932026ea0f4aba970111f75d36a6f4068840ed +SERVER_HANDSHAKE_TRAFFIC_SECRET af74083a62b80a23a0afda9719455b5293c3c4e84459a9091b71fb3c6fa9f169 e562fe7b4aa073c2ddb786e38d213bb8030b6a61f653326317e282e40daed68e +CLIENT_HANDSHAKE_TRAFFIC_SECRET 40a0140ef0caaf40792a7a729eddd52afc03f274c5b563786875f960024d40f1 dbe1d6e48928ea4fb8f500fe160186188d96bf3ffa6aed6196a166a831214987 +SERVER_HANDSHAKE_TRAFFIC_SECRET 40a0140ef0caaf40792a7a729eddd52afc03f274c5b563786875f960024d40f1 e6e54878821a671c21d6b4604d68ff9fd3024b4fe58af476638f450a9221a608 +CLIENT_TRAFFIC_SECRET_0 af74083a62b80a23a0afda9719455b5293c3c4e84459a9091b71fb3c6fa9f169 ac4ec6ed789eee79108aa3d12cc41694ad8b10472ebf040514dfe51e80062a9a +SERVER_TRAFFIC_SECRET_0 af74083a62b80a23a0afda9719455b5293c3c4e84459a9091b71fb3c6fa9f169 1b46804c5c289c198536cd2613bd379578ee8ee85d431fe44181ae1c72d36200 +EXPORTER_SECRET af74083a62b80a23a0afda9719455b5293c3c4e84459a9091b71fb3c6fa9f169 6022d91edb2cf1c0ff9fc5386a8ab2e46339f083577366f1ede398af00c1445f +CLIENT_TRAFFIC_SECRET_0 40a0140ef0caaf40792a7a729eddd52afc03f274c5b563786875f960024d40f1 498b4d29caf897ddc459396e9a49062e07ff2a90a50b6db8003abfada5345b47 +SERVER_TRAFFIC_SECRET_0 40a0140ef0caaf40792a7a729eddd52afc03f274c5b563786875f960024d40f1 1684d762a749baecd8a81477f86ef5639277cfae30d8fa839d52d46ad90ef717 +EXPORTER_SECRET 40a0140ef0caaf40792a7a729eddd52afc03f274c5b563786875f960024d40f1 e60c7a6ba4d68bbe75a7a158521f4e39d5463be1743f6e974b930d3533cff900 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3140377720ac5546d18e225e8d3f976dc1cd799d0bbd1daaff27f421eeab1c13 eea0467da7484ace64dc4f7757bbd963d3fa7304dc89dc8e71819174ed9e3eab +SERVER_HANDSHAKE_TRAFFIC_SECRET 3140377720ac5546d18e225e8d3f976dc1cd799d0bbd1daaff27f421eeab1c13 14755bc0af33a0594b3b1977fe50e9ba6b9e53e939e01ce69462dd47589e1a20 +CLIENT_TRAFFIC_SECRET_0 3140377720ac5546d18e225e8d3f976dc1cd799d0bbd1daaff27f421eeab1c13 e3ecd1034053e829672872b06e2d1a41d7498a7a441325e0d110d268dddb438e +SERVER_TRAFFIC_SECRET_0 3140377720ac5546d18e225e8d3f976dc1cd799d0bbd1daaff27f421eeab1c13 a93505e548cdd90dc4301221c20d4c0bd8d55cb641d9da74e75fa6744375307c +EXPORTER_SECRET 3140377720ac5546d18e225e8d3f976dc1cd799d0bbd1daaff27f421eeab1c13 ffcbe5c308931344077564bb268045ed7e1a0f240887e2cb8810b4fa1378f53a +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0afea9a438fa650fbbf656d17d2954e5fa70c3e9924c4dbd6ee77100f1d2debe 00093b2a9c30d8a2e198a2c6f66fc37d01c651c6a51c7d67317fab02696ad441 +SERVER_HANDSHAKE_TRAFFIC_SECRET 0afea9a438fa650fbbf656d17d2954e5fa70c3e9924c4dbd6ee77100f1d2debe 36d031eb5ee8d027ab34df110e49d7eba267d3e1d78159cf8554336650e68874 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 411be5d6984adaa93e12d2ea2bbedc4d8ad573db90275469cf27519e74b7f29f c788c354880ec31a090f65feca768da08998c8941a47cd7aebb7bd78f07b50d8 +SERVER_HANDSHAKE_TRAFFIC_SECRET 411be5d6984adaa93e12d2ea2bbedc4d8ad573db90275469cf27519e74b7f29f 883603487f7dafb802a02a8957cd0a62f2c6a55e43f503fd44e8a6226b29166e +CLIENT_TRAFFIC_SECRET_0 411be5d6984adaa93e12d2ea2bbedc4d8ad573db90275469cf27519e74b7f29f c0e0b3c406ce751a60ca8b2833c923491c81a47c9ccdcfad955c2367d55347df +SERVER_TRAFFIC_SECRET_0 411be5d6984adaa93e12d2ea2bbedc4d8ad573db90275469cf27519e74b7f29f 8b912c544dda2f1ea94274c3323576fded08ced9f1177aa682abc2316cb952bc +EXPORTER_SECRET 411be5d6984adaa93e12d2ea2bbedc4d8ad573db90275469cf27519e74b7f29f f2a8da410733b02050c23f45d141589f6124d2cfad7a1318aa5827c30b689c72 +CLIENT_TRAFFIC_SECRET_0 0afea9a438fa650fbbf656d17d2954e5fa70c3e9924c4dbd6ee77100f1d2debe b1354daa62f360e1c74dcc9eb38b083ab3d91633e4366b28a386631217a1eca3 +SERVER_TRAFFIC_SECRET_0 0afea9a438fa650fbbf656d17d2954e5fa70c3e9924c4dbd6ee77100f1d2debe ecc589ae30189458adb9d3eca41ae2b1a93d4be23b00b5519dc6025cb07e5045 +EXPORTER_SECRET 0afea9a438fa650fbbf656d17d2954e5fa70c3e9924c4dbd6ee77100f1d2debe f85a6e51b27fac037b92305c9c767fc5205898270d8cf1bbc20f07a65d22d76a +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5ab6b68b195cd4c9ef780b219d5922a73fb255e9413958a950fe35ee0f698237 fe88c81bf53283647f85128179b1397f82dce2d8ccec28b6f8adf9e2e10defe5 +SERVER_HANDSHAKE_TRAFFIC_SECRET 5ab6b68b195cd4c9ef780b219d5922a73fb255e9413958a950fe35ee0f698237 70c6a5e1b70f16ea8577fd96ef5e32c3c2721e474317ab640a636964d65d945b +CLIENT_TRAFFIC_SECRET_0 5ab6b68b195cd4c9ef780b219d5922a73fb255e9413958a950fe35ee0f698237 8f5cf2b324dd4f36a62d4b7c0e4fd0d152c1f57f430f668db50f66cddf3c8143 +SERVER_TRAFFIC_SECRET_0 5ab6b68b195cd4c9ef780b219d5922a73fb255e9413958a950fe35ee0f698237 9f9b8f58b8630e4c05cab1079a3e861ffaba9add57d3ff5333503a93cba6a8f8 +EXPORTER_SECRET 5ab6b68b195cd4c9ef780b219d5922a73fb255e9413958a950fe35ee0f698237 bc5d76851f644e3440f596fed2e7d97a613801e3b04609450eef025f54c9ae7e +CLIENT_HANDSHAKE_TRAFFIC_SECRET 6227d777d474ea869e769016e440733790d63d17071f40434ce76ed4e6480eae 39ddca16d3af39c65e177ea3a303dda3cc55245d8753be0f92ca2199644c604a +SERVER_HANDSHAKE_TRAFFIC_SECRET 6227d777d474ea869e769016e440733790d63d17071f40434ce76ed4e6480eae 61712436bb2df8cec4c24b295c441e33f1d0141b8ce03bdee794c89ab5f2c775 +CLIENT_TRAFFIC_SECRET_0 6227d777d474ea869e769016e440733790d63d17071f40434ce76ed4e6480eae 32eb27076ab2f2fcb7a271f734779e5d923c45045deeb0bfaa039540b9fa3a6e +SERVER_TRAFFIC_SECRET_0 6227d777d474ea869e769016e440733790d63d17071f40434ce76ed4e6480eae 727b2d9a024a4c5321fc2b9fac7a259a8ef06bacea5511d0d548aa657f4a51c3 +EXPORTER_SECRET 6227d777d474ea869e769016e440733790d63d17071f40434ce76ed4e6480eae 2853a7161add6a78666a4c5b092d616fa892da29afcf892dbeca76490062dbf5 +CLIENT_EARLY_TRAFFIC_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 191c930430d813e11540996f2ed70b637f1722104d025530dedbd7f39acb1855 +EARLY_EXPORTER_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b b7be5704f62965c645c0d0afe29d830e2ce34bb20383df6c566281c388eb4986 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b f0c7be45b830ddc118ed0db66058a9c96d2a5f623e899644710ca19a9472475f +SERVER_HANDSHAKE_TRAFFIC_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 61f9eea4526a597c379bd58e7fdf13d345ae94c136f6f677c858220373f0b996 +CLIENT_TRAFFIC_SECRET_0 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 0c518faeef7699e276a9a63c4938f104e848b2b348776f0b2540b9b2465931c5 +SERVER_TRAFFIC_SECRET_0 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b 5a5126cfd8193260e83e4880211b3aff6f36e27b80fa58d62a3a77f133f3aba2 +EXPORTER_SECRET 8bff2e9772b22443167499eb0cb80ecac9709c649e8a94190b4820ad36ea299b b226def0c3de645137eacf2b773a4e830abfaae8b662acf5ede9a5eda9bb79b7 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ae47175e8f06d04b51c1f0e0b7dd8ee544d001dbb879f283566ba9529dadab10 f2ccee32081e0e5ff199ada4b1e228159873039f6f80a5f171ac626ef48a445b +SERVER_HANDSHAKE_TRAFFIC_SECRET ae47175e8f06d04b51c1f0e0b7dd8ee544d001dbb879f283566ba9529dadab10 018a132692aeb72e2b84fd185184cb9a34343d8595b83ba7d9f33b5c95ea99ee +CLIENT_HANDSHAKE_TRAFFIC_SECRET 7a6d70da3236acdd4313032d1a51bc54075f28362fe24945f01561af6d83eef3 df7889ff7f068d425b7b4fe163792a0483086698f0d9b3223c4abfa48644cb7a +SERVER_HANDSHAKE_TRAFFIC_SECRET 7a6d70da3236acdd4313032d1a51bc54075f28362fe24945f01561af6d83eef3 190a15d5c7c672a4aa2ba3fe765a088be30ed20d11e9213426572f68478c6afb +CLIENT_TRAFFIC_SECRET_0 7a6d70da3236acdd4313032d1a51bc54075f28362fe24945f01561af6d83eef3 9eabf3cb18b0b99e2a5289f01ec6358f8933f804d80d2a03e1daf11ecdf59e0d +SERVER_TRAFFIC_SECRET_0 7a6d70da3236acdd4313032d1a51bc54075f28362fe24945f01561af6d83eef3 27774d380109f3773c7a4a49c992944fd29db9b138fbd8f8b8649c7179f2abf3 +EXPORTER_SECRET 7a6d70da3236acdd4313032d1a51bc54075f28362fe24945f01561af6d83eef3 30bea332136dcecaf5366ece30c135da12c628de77a356a4e7f7247e89c6ae7d +CLIENT_TRAFFIC_SECRET_0 ae47175e8f06d04b51c1f0e0b7dd8ee544d001dbb879f283566ba9529dadab10 5437335f06a1164d6f374529c0c794954405269f46352a563cf75749c7dd9c38 +SERVER_TRAFFIC_SECRET_0 ae47175e8f06d04b51c1f0e0b7dd8ee544d001dbb879f283566ba9529dadab10 43f04af73d1ba36000834bfed8c00214fd2670c24264661a6a083a937ff1fd93 +EXPORTER_SECRET ae47175e8f06d04b51c1f0e0b7dd8ee544d001dbb879f283566ba9529dadab10 71bf0daf3ab8228bc701150310855353be2fef13d6e878a2cc5a8afb590c9dad +CLIENT_HANDSHAKE_TRAFFIC_SECRET 9f25ca3ea32360d18e8ed1620499f4f72e989ee0660894a1973213631601968c 2713d7afbf82358c2f0cb034167bba81b418aab3d19e1ba4bbca7a02f29de961 +SERVER_HANDSHAKE_TRAFFIC_SECRET 9f25ca3ea32360d18e8ed1620499f4f72e989ee0660894a1973213631601968c d54a4e1faa76b8b1f0000713e52c852739ef9ba94f5d8cd42155265851c9df06 +CLIENT_TRAFFIC_SECRET_0 9f25ca3ea32360d18e8ed1620499f4f72e989ee0660894a1973213631601968c f0e22314968fc23a5232c0e693c34ac7ca218b4881c77fd766f11fb5e16d4f8b +SERVER_TRAFFIC_SECRET_0 9f25ca3ea32360d18e8ed1620499f4f72e989ee0660894a1973213631601968c f3c8c0be05c748f4f913a85ac654e965a667aac04c4973c3df9ea4d5c68af6ae +EXPORTER_SECRET 9f25ca3ea32360d18e8ed1620499f4f72e989ee0660894a1973213631601968c bb93b387c742b317263c20ba3a734b87bd2988babb660e26a3b7f3fa6ceaea54 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 41d967f31b9b49e1303725c6ab39f7dd09a2aa5c2676ec6be076994a0497e303 1d77bb93a8d5b383f0e03b9e434429d2b1c2ac0b3fb4b6c45e2ba6c0abf6b38c +SERVER_HANDSHAKE_TRAFFIC_SECRET 41d967f31b9b49e1303725c6ab39f7dd09a2aa5c2676ec6be076994a0497e303 dc1e236a828278508995d0bbdacd465665625495379147f2767d84f32ba03594 +CLIENT_EARLY_TRAFFIC_SECRET 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 09c53b5297931efc93bbfdf78265d6d8821d309be8af6cd288d5e2ac0d7c45b4 +EARLY_EXPORTER_SECRET 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 567456b8bfb34d4b0ac1eb409c8ed529db396baa40a0a27aa42a912d89afc2b0 +CLIENT_TRAFFIC_SECRET_0 41d967f31b9b49e1303725c6ab39f7dd09a2aa5c2676ec6be076994a0497e303 e09511d300b5481857e5459fdc74a8ab8c7cff5a64a9c87628b181c077019384 +SERVER_TRAFFIC_SECRET_0 41d967f31b9b49e1303725c6ab39f7dd09a2aa5c2676ec6be076994a0497e303 3725c37cfc1a94b5fc6846d4a7dfb109954ca035ea4163c2d8d1f37900dd94eb +EXPORTER_SECRET 41d967f31b9b49e1303725c6ab39f7dd09a2aa5c2676ec6be076994a0497e303 77705156770c2948ba8d6ccf4e50c2d653aa63c03a9a7980383f8af8bf10e790 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 3b9935d6b00b66b5083efea57d3ba847b8abb1195c7291ac570c17c67eb687e9 +SERVER_HANDSHAKE_TRAFFIC_SECRET 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 9dc4b6126d525bca0b440c4d86ec496546e2c26cf9cc33b420c64b60947e575f +CLIENT_TRAFFIC_SECRET_0 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 23e2dc0e735fcab790a735cce88a98f39306b667b85c4564503765ab0d592151 +SERVER_TRAFFIC_SECRET_0 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e e0beccaf408e5aabf7b6691b5d2f7f731e0778ec740d982d3dc8184f84364470 +EXPORTER_SECRET 57f0e37cc211f7ac525064c5ee8f4c3273e12136112c50ea7ffe70d6dd739a5e 17949c9c279636d6c95653d4c2acd2e745c7e30613142a276f43b95e0a1e97a6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 0d637d27f9aa5dd67dbdd581dd67a81ca09a9c16be5f6a5deff13a97fcc45ab6 e944eb3d0370fbc524158e249e56662595a8fafded867b77f41b505424538bb7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 0d637d27f9aa5dd67dbdd581dd67a81ca09a9c16be5f6a5deff13a97fcc45ab6 df7976ded3c8314a3db7a3b305ce3b09761c4626919e42df2f643c4e56dff823 +CLIENT_TRAFFIC_SECRET_0 0d637d27f9aa5dd67dbdd581dd67a81ca09a9c16be5f6a5deff13a97fcc45ab6 c321a8e5d5d4200e55d2537648e0dd629f3f3f6189d680aae70f526101b93cd6 +SERVER_TRAFFIC_SECRET_0 0d637d27f9aa5dd67dbdd581dd67a81ca09a9c16be5f6a5deff13a97fcc45ab6 67d796479edd2f78a00a80b61c2b3847c0c04f68b1daa6b2c73295b3aa421c5e +EXPORTER_SECRET 0d637d27f9aa5dd67dbdd581dd67a81ca09a9c16be5f6a5deff13a97fcc45ab6 fccec06b632d793a360e67bd6c8c960abec44a60ed77d2af6d8824d055230a49 +CLIENT_RANDOM 2965f4ead54a8ce9f6e40dad88dccba1447578aa50e0ebc8920dd8628ed1e6ff b2cf5871f9d32b52296fd8b5d20ddba4add4967fd7a26b1ecdb14360f88cbebec21b3855f785dcccab5a761a8425a61d +CLIENT_EARLY_TRAFFIC_SECRET 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 3643c40065ad240261d0e4a28c419a626081ee5197c078648211bd8aab4c1b47 +EARLY_EXPORTER_SECRET 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 0ef70b0b0347600cde41f198c412be7b475287a014468282160a8c0ab129edaa +CLIENT_HANDSHAKE_TRAFFIC_SECRET c51f32104963ceb889d57ead96a1e75307162bae93a1681c1e635428d159ac9e 687973a418fb8ced69bafd8a911b558f6cf1b2249a709d7f64eea3b64b7cfc5f +SERVER_HANDSHAKE_TRAFFIC_SECRET c51f32104963ceb889d57ead96a1e75307162bae93a1681c1e635428d159ac9e 72975d52438125800cc1e2ab11363f1aff2eca6222f8fe8ef7f17dec5e41204d +CLIENT_HANDSHAKE_TRAFFIC_SECRET 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 fd205f62f742248ea98d600a12ed2c887b8e60d281b4d219082793fb81093004 +SERVER_HANDSHAKE_TRAFFIC_SECRET 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 597b399705c38c2ca704b0464a846baa356311f3bf9feac8208496b70450df9b +CLIENT_TRAFFIC_SECRET_0 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 9c8851f6cdc9f2a5d51f981f203923db9d5e21c5772c445d2b4ffaff1444a358 +SERVER_TRAFFIC_SECRET_0 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 2e5760b1a218dd389b4abaeb78adacbee64005bb8c3863996344c52b893b36d7 +EXPORTER_SECRET 70bc12e14131908204a787e18a85239258a2a50cf900da9f799de860927c8c80 7c5a686e8da753392a27fad4b16bb335efdf54fedf983de739cd7bce8f50acf0 +CLIENT_TRAFFIC_SECRET_0 c51f32104963ceb889d57ead96a1e75307162bae93a1681c1e635428d159ac9e 4fc96255ed06a132b93144364c75c1e2fb32daa20edac858931fdabd14e2de06 +SERVER_TRAFFIC_SECRET_0 c51f32104963ceb889d57ead96a1e75307162bae93a1681c1e635428d159ac9e 7e8dfd86f05be1ca777c989b2d4c732c95a0a80335415c590819f51edb6167a6 +EXPORTER_SECRET c51f32104963ceb889d57ead96a1e75307162bae93a1681c1e635428d159ac9e 8dab20345e804811f0e86b75cd5b1f8227a6dce6ef7887680029c03569040831 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 81de48b2abf3750f801d7afc8de91a9b25c1c901bb3003b56b5323fb521fb2df 8886fbc8dd258f9ff653b78b7f9db38bf9db27e68921933a19eedc401915acfa +SERVER_HANDSHAKE_TRAFFIC_SECRET 81de48b2abf3750f801d7afc8de91a9b25c1c901bb3003b56b5323fb521fb2df 0315033e6647cf50337cab758f1f3976e376b365d5b9a8e1d846ab1422b6eecf +CLIENT_TRAFFIC_SECRET_0 81de48b2abf3750f801d7afc8de91a9b25c1c901bb3003b56b5323fb521fb2df c7de03a5fab7a5e54402c17bfd65d487c6a4618498a501f99ae65fcf3a869d19 +SERVER_TRAFFIC_SECRET_0 81de48b2abf3750f801d7afc8de91a9b25c1c901bb3003b56b5323fb521fb2df 9a74cbac2f80bc9a99d5987416bed3141329c8e933835d0b534fa2049711ec08 +EXPORTER_SECRET 81de48b2abf3750f801d7afc8de91a9b25c1c901bb3003b56b5323fb521fb2df 7e93a7ddd61e14fb5e41b078c58f1a05342b690a224af4a8aea90adc1cc6aa0c +CLIENT_EARLY_TRAFFIC_SECRET ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 7e0c9568eb190e8a663fb9294b4da2a6f12374f75d795bc560b5f037335a5ef6 +EARLY_EXPORTER_SECRET ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 62825e0591b872ac8b7e298fc4dfb5910941355ccb57f04ffd9f0c7e9fa5b0c4 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 537ec6c6ad2165e6567318c0b69a0a9aa63e9949ffcdb3dfba1f9ba3afe6482a +SERVER_HANDSHAKE_TRAFFIC_SECRET ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 7db0b763c4a3af7b6483ebee40ca9e710a7924765ae169c08864c3b5ed435d20 +CLIENT_TRAFFIC_SECRET_0 ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 9172063f7114f735f3faaa61f07973b4e4fc3428bb5ae1c75a89258c430d8ce9 +SERVER_TRAFFIC_SECRET_0 ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb 2cd9d2b36dcb1254a56aa0e588a71addd28ed47ee9cb3c1addfa245ee3edec16 +EXPORTER_SECRET ebe2deae4d8f7c3f44fd7dbaefbc4a16700dfe8973206a87197ceaeea9d68bbb c52811aacc61d1da10a48515f38413be99fef17a88efa819ec3186177f48f44a diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.log b/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.log new file mode 100644 index 0000000..57cb85a --- /dev/null +++ b/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.log @@ -0,0 +1,10 @@ +CLIENT_HANDSHAKE_TRAFFIC_SECRET 378D85C9D3901DC0C12B89B6F4D4A41F35F886821CCC5323735B4FA9CB810510 8563A9E085DE15A77A7BF641AF791F8815911531D3FE999206623AB7038E67AB +SERVER_HANDSHAKE_TRAFFIC_SECRET 378D85C9D3901DC0C12B89B6F4D4A41F35F886821CCC5323735B4FA9CB810510 E05CC685F7431854964BB71229BB2DE2B064D22D1C6CF83D30B7BDA707F77E23 +EXPORTER_SECRET 378D85C9D3901DC0C12B89B6F4D4A41F35F886821CCC5323735B4FA9CB810510 5B5475934FB7C237228EE3860E85B8DFF76EF5D5B4D34607DEA826182B280982 +CLIENT_TRAFFIC_SECRET_0 378D85C9D3901DC0C12B89B6F4D4A41F35F886821CCC5323735B4FA9CB810510 02010CCDF02B29C1973BC40A90E11B5E02E2C52FE1217138A9372D10074C38A3 +SERVER_TRAFFIC_SECRET_0 378D85C9D3901DC0C12B89B6F4D4A41F35F886821CCC5323735B4FA9CB810510 032422C9E10505498D65BD5F8B9368544EB7E37F80935DF0C7C0337E26FFA77F +CLIENT_HANDSHAKE_TRAFFIC_SECRET BAA39ECF56D1D50E2626737A5254C8E0CE1B97DD576FF9030637626C6BD5F2FC 65A142BE8D004B2B433480A62F4716F03508681C2757549E15458C5F64C89827 +SERVER_HANDSHAKE_TRAFFIC_SECRET BAA39ECF56D1D50E2626737A5254C8E0CE1B97DD576FF9030637626C6BD5F2FC 138EB5618155458709F2F6AE839BB47D395A7CE6997FFDB7773502621051512D +EXPORTER_SECRET BAA39ECF56D1D50E2626737A5254C8E0CE1B97DD576FF9030637626C6BD5F2FC 6FB7664AF30EEBF597D183FF8EC1E87C1B2D7D827D26F74D538106BC3B37BC23 +CLIENT_TRAFFIC_SECRET_0 BAA39ECF56D1D50E2626737A5254C8E0CE1B97DD576FF9030637626C6BD5F2FC 4B4E77AB89B194B6CA16C9C20CB0E3C64CF04ACFED8EE2A72C4666995856ECC6 +SERVER_TRAFFIC_SECRET_0 BAA39ECF56D1D50E2626737A5254C8E0CE1B97DD576FF9030637626C6BD5F2FC E2DBA37BE0FEAC545B5FAE917EE764443E5FCADDC559333385A5EACBD9931909 diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.pcapng new file mode 100644 index 0000000..8c7c106 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/keyphase_update.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/only_quic.pcapng b/tlexport/pcaps_und_keylogs/quic_pcaps/only_quic.pcapng new file mode 100644 index 0000000..3b0c299 Binary files /dev/null and b/tlexport/pcaps_und_keylogs/quic_pcaps/only_quic.pcapng differ diff --git a/tlexport/pcaps_und_keylogs/quic_pcaps/try_retry.log b/tlexport/pcaps_und_keylogs/quic_pcaps/try_retry.log new file mode 100644 index 0000000..d2729ab --- /dev/null +++ b/tlexport/pcaps_und_keylogs/quic_pcaps/try_retry.log @@ -0,0 +1,610 @@ +# SSL/TLS secrets log file, generated by NSS +CLIENT_RANDOM fe149b3959683c81850911655a3552a29fa3a950dded9dccdae2e63c9b05ad17 4808f432e3041fad1d65ab432156500a86bccc9594a60adc59a0d908a30407cacfb71a318ecd243a1ab0c491904e2d20 +CLIENT_RANDOM de33d177076792cdd22d33829ddec2ad4ef77a97b1e68b7e95af00c12b63192c 74cef440cb32f8c7367555fe8efafd0bbd91994d6299fe0ffc30153122a13fe497b5ef91735ca1996bd5e83a0cf4f9f1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d1a1a6731d1184fcb412133944b0a74a1f133d36b1bb62f294e0f27a8e0152a6 ac4d8a9d0db8e486091f47901bdaff62f1d0e3228504b357f8899ba556b1d3f1 +SERVER_HANDSHAKE_TRAFFIC_SECRET d1a1a6731d1184fcb412133944b0a74a1f133d36b1bb62f294e0f27a8e0152a6 116b461f49a2f8b7fa3b212c399c9b7f4cbf29e8498bcf7e6e9da494f7d7ce2e +CLIENT_TRAFFIC_SECRET_0 d1a1a6731d1184fcb412133944b0a74a1f133d36b1bb62f294e0f27a8e0152a6 656f63ac39aa476fbccc98b756d0fc12158efcd44fb8a4ce8078e73d5bf88523 +SERVER_TRAFFIC_SECRET_0 d1a1a6731d1184fcb412133944b0a74a1f133d36b1bb62f294e0f27a8e0152a6 8a5e44181da04dcfac0d8c396cc55fe556e09f82420058255767249ae0680bae +EXPORTER_SECRET d1a1a6731d1184fcb412133944b0a74a1f133d36b1bb62f294e0f27a8e0152a6 3c86f03d0d1a4f4c46a6fdd3e0871f2b6472793282c4890abd27e52d9768d1e1 +CLIENT_RANDOM e7b0696c7834a6278cf5ef3f446d004ed331c4e0a17a832f76a18c7419fd6993 d48b424b448210c26ea9d44a36e4db908e602fd9b0b4cfbadf6cd40a03f02f7c2a3300614c85f7bbb7aaa2d25ea44dbe +CLIENT_RANDOM cca8c00b44526c2f6ee5bf9820b0db2c036530e98c7b0f8d20b34eae6478ecbe 64437e86d8d1a6e80e4d942e2136d2886cfbe3c2f18e4084815d987431161cc616f12ec8678c7cd32016e20a303b37c8 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ea4d710d4041dbd027c8c67ddb72f5726512562736c699896e6d4b5053471d21 d770131cf0a8b4781c9373445694111f6b9808d956cccc6d701431c190e62d58 +SERVER_HANDSHAKE_TRAFFIC_SECRET ea4d710d4041dbd027c8c67ddb72f5726512562736c699896e6d4b5053471d21 a68c6c699b548db9b6aa40d7c7d7b2fae9e415ec0a7721fde995c3a434df499b +CLIENT_TRAFFIC_SECRET_0 ea4d710d4041dbd027c8c67ddb72f5726512562736c699896e6d4b5053471d21 0f122f33c57d0fdc37affde9b6869d6697aaa33757acf8e59a83c46c6bef2145 +SERVER_TRAFFIC_SECRET_0 ea4d710d4041dbd027c8c67ddb72f5726512562736c699896e6d4b5053471d21 1180582dfecd2f652ce4357904ed1f862b4190f8081c334b00113988fcddcaf6 +EXPORTER_SECRET ea4d710d4041dbd027c8c67ddb72f5726512562736c699896e6d4b5053471d21 d5a7d332d2bcf4bf56a328cfe370a948dfb7f4c19308c9d053309ab783f6b41f +CLIENT_RANDOM df21eb8e5e3b777f50b9dc9252fcef87d3c749cf5ab67d07c57f8b171b1d98df a61c604229b1486a9a8b123f3cd5291a4b881aa0d2635207da967f20d8a7a0d1391f12404604dd66d594cfd62d8990bf +CLIENT_RANDOM 12071b04ba440c4d7e7a74041ffb4cff7a3b96aa6f14b99da73201df810db9b9 368c2aa7e87f20650b4215e3f3db6aa68a8e4dbb62e15d769f027fb4a4ac2a99a3fa85b1dbfd664f21f29392270de4d9 +CLIENT_RANDOM c87ab9c6580e00b84188dff63691bf5f806adf8a67d23eb0461531fba2eda35d 4da3d6f27eb8a69e3dcde2501ba09d8a016d4945d64e3b1773080d1ad049063ff0ce36ff9c7f302ba3d1cfacecf8b096 +CLIENT_RANDOM 8af3ce6381156d7cb0f94521949c53ee5a07b022117cf80fe3ecdeae8b781228 14dba8e6fce50adac2539e2b338c33ca191fc27f3d1fc8bfa50963ae3cb71b818d5bf8b5f5bc705d79c34e8a25ccff2f +CLIENT_HANDSHAKE_TRAFFIC_SECRET 01877ab89b0407e19c11393781acd070b30682771290f683e0941cb3c4648e2b 7ad7c82e1bdf1fb8a9e0b061ee4c13a0a6cdb99db0ebf38f8ba731d06d654250 +SERVER_HANDSHAKE_TRAFFIC_SECRET 01877ab89b0407e19c11393781acd070b30682771290f683e0941cb3c4648e2b a8caf4f8357eafee590631753eb183720322b2ba6deca0ff90cb64ab6bc862d5 +CLIENT_TRAFFIC_SECRET_0 01877ab89b0407e19c11393781acd070b30682771290f683e0941cb3c4648e2b 95d47b7165aa131ddd0acc6297669069025bc884d7a9f5a5060aaa302b97aa78 +SERVER_TRAFFIC_SECRET_0 01877ab89b0407e19c11393781acd070b30682771290f683e0941cb3c4648e2b fccd476853892211fd6aa9559e2f6b36ea2616bccc193c8d53b3ecbb1b53369c +EXPORTER_SECRET 01877ab89b0407e19c11393781acd070b30682771290f683e0941cb3c4648e2b 4bb816635bd567120c6430b0d74c07e8d92aab50534bb4265535605018b247c9 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f0eaac3d31a10468ff347d9ae4b9d3dc67e2c1ed1724bb97c0eba722161d19c0 0433e06800fcf28ba40304dceb3ef3e1390c7c97b1ec69e6f2076de3c70fe202 +SERVER_HANDSHAKE_TRAFFIC_SECRET f0eaac3d31a10468ff347d9ae4b9d3dc67e2c1ed1724bb97c0eba722161d19c0 461139d4787966d1da1325cd34c2ce1dc9af2c1d1fb7db0fbee36089c695fbf8 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1351a9b701d93617ff021105b88d6c1f90be31490a8902e6867c551df9e375f2 198cd8e5499cace0498bfad90d62d1dfde6a20de3b43703ff5ed1a42e220561f +SERVER_HANDSHAKE_TRAFFIC_SECRET 1351a9b701d93617ff021105b88d6c1f90be31490a8902e6867c551df9e375f2 3b92124dcb89830d81444692076958828bbe6aaaa06742b7d34218a8731cb274 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 051a6eeca1a6fd89e3d89ada979327857d704835161c02f18dc5630cff787dd7 248b143a80c0e5205b92e009acc9bec30f345677e91c9be69ff25e90d1444509 +SERVER_HANDSHAKE_TRAFFIC_SECRET 051a6eeca1a6fd89e3d89ada979327857d704835161c02f18dc5630cff787dd7 b4baedbbfc100025e89ef107878316ce7799686ee871047a9abdc8467455eb80 +CLIENT_TRAFFIC_SECRET_0 f0eaac3d31a10468ff347d9ae4b9d3dc67e2c1ed1724bb97c0eba722161d19c0 b6f8063844473b4dcae5e98c9f1e78244d3620b8881ce6990309326c1992ea37 +SERVER_TRAFFIC_SECRET_0 f0eaac3d31a10468ff347d9ae4b9d3dc67e2c1ed1724bb97c0eba722161d19c0 ddd8045eb9e9b97edf7a1fd112394288ba77c671bcda9a13f7d799a92d457e92 +EXPORTER_SECRET f0eaac3d31a10468ff347d9ae4b9d3dc67e2c1ed1724bb97c0eba722161d19c0 79425256ba3ed84813ec022200b875ade1f744d9be5db31cdf6587b96b978cf4 +CLIENT_TRAFFIC_SECRET_0 1351a9b701d93617ff021105b88d6c1f90be31490a8902e6867c551df9e375f2 9b9b151334b2fe11344de367d1b647b26bb4a333cb251faf8a9ed6270426a1e0 +SERVER_TRAFFIC_SECRET_0 1351a9b701d93617ff021105b88d6c1f90be31490a8902e6867c551df9e375f2 81ae7e7ebd1933015179dbdea4cd55a8c865ed0e9583d103c07689674179162c +EXPORTER_SECRET 1351a9b701d93617ff021105b88d6c1f90be31490a8902e6867c551df9e375f2 f2b03019db7120c86c4a7baf3a5782b61abab9a756b594b0fdc19242a10a651d +CLIENT_TRAFFIC_SECRET_0 051a6eeca1a6fd89e3d89ada979327857d704835161c02f18dc5630cff787dd7 24b444e062c9ec513026c3c1078fbfa1ca9359a7b245ad5739ad1b404367a116 +SERVER_TRAFFIC_SECRET_0 051a6eeca1a6fd89e3d89ada979327857d704835161c02f18dc5630cff787dd7 d8acde27f7d7ad2acb0abfba7f2668987c9faf1a98df353fd7981ae112fdda73 +EXPORTER_SECRET 051a6eeca1a6fd89e3d89ada979327857d704835161c02f18dc5630cff787dd7 3fc03638049a044e7fbabcfba6861733fbd132ffcf7e82f81f020ade5a695d40 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1eb228e7795ece6fab737df026762c7b08f0c3ec82e38c5130ae58e9c9239f56 7c6ff5ce15a8aafec0134d8e82eaac630dcd389d493cf8231a9b697b2141f761 +SERVER_HANDSHAKE_TRAFFIC_SECRET 1eb228e7795ece6fab737df026762c7b08f0c3ec82e38c5130ae58e9c9239f56 0a3e03c1ea023cb495b4934bee8b9c9a4a8a0cb5bea75b63176773a456c8f229 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d4b904df4c5cb5d3da4e7f6b0764db7bb8f07c7f68fe5dbc8ff54b37e6c2ea7a 4d569d5ab239be19f5f6f8d9d19812424b4637fbf742d6da83d9b613aebf4561 +SERVER_HANDSHAKE_TRAFFIC_SECRET d4b904df4c5cb5d3da4e7f6b0764db7bb8f07c7f68fe5dbc8ff54b37e6c2ea7a 2bd845b78ce4b5cb27a7c084bd40e7974cbdb1cd78db32eb63d09fcb17a9a610 +CLIENT_TRAFFIC_SECRET_0 1eb228e7795ece6fab737df026762c7b08f0c3ec82e38c5130ae58e9c9239f56 fcc8fc0a2981664b35de471e11abff65832607e8a98333db3cf64ca2e0bf638d +SERVER_TRAFFIC_SECRET_0 1eb228e7795ece6fab737df026762c7b08f0c3ec82e38c5130ae58e9c9239f56 ebc238669529900f20b710456eaf2f1942fb21587b4bfd3c9f6cd8d2e0b9c92a +EXPORTER_SECRET 1eb228e7795ece6fab737df026762c7b08f0c3ec82e38c5130ae58e9c9239f56 50ce4cb351e9c09b9920473f3c9fa876796a5a03310aa6a2de3a2f816ed6157a +CLIENT_TRAFFIC_SECRET_0 d4b904df4c5cb5d3da4e7f6b0764db7bb8f07c7f68fe5dbc8ff54b37e6c2ea7a 755a821abbf3b7c5164d434407536be73ecf580a58c6e0ad7f04880baef5d6a6 +SERVER_TRAFFIC_SECRET_0 d4b904df4c5cb5d3da4e7f6b0764db7bb8f07c7f68fe5dbc8ff54b37e6c2ea7a 083e441b5a4a0f7dc585f000107ddb31f7740f56d6c2ed327a5b055ba3b03275 +EXPORTER_SECRET d4b904df4c5cb5d3da4e7f6b0764db7bb8f07c7f68fe5dbc8ff54b37e6c2ea7a 497cd447c5027dfababda0a29bb1234d11c38bd6cf5d64820e6a797969ad95bf +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2aa71ba98967b258a0ce09d7b55f700f1ddfd647e1bc672d21f83712afbf9ac7 4307840d591c8fe0dede7ef870b72cfbb5d1da061e4521c958bbe2072d5f8273 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2aa71ba98967b258a0ce09d7b55f700f1ddfd647e1bc672d21f83712afbf9ac7 89461d46857a044ecc8caf4168dd9ea9c6b9bc71982f242334eed0d529172bdd +CLIENT_TRAFFIC_SECRET_0 2aa71ba98967b258a0ce09d7b55f700f1ddfd647e1bc672d21f83712afbf9ac7 c6c9e044751204c29241ced909f85f1ea0603b4f76ac370c0b3cd747c144b280 +SERVER_TRAFFIC_SECRET_0 2aa71ba98967b258a0ce09d7b55f700f1ddfd647e1bc672d21f83712afbf9ac7 f484f8d7ccab542c31f03c68232b823210ed63f273bff085048b760b9302fc91 +EXPORTER_SECRET 2aa71ba98967b258a0ce09d7b55f700f1ddfd647e1bc672d21f83712afbf9ac7 cdcb4c3d1408e607f4179d547a888f6c05db79ae42ec6f8022f087607a6a7ae6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 96ded9df2d2edb78eb99dd72232bccf065b01236641d9aa1545bcae8b63de76b ac3eff335bec3f2130df87067af54791f44ec1ad6f91c39fed82cf6b7828782a +SERVER_HANDSHAKE_TRAFFIC_SECRET 96ded9df2d2edb78eb99dd72232bccf065b01236641d9aa1545bcae8b63de76b 12338532ddc91236187e6dff3fb6fb790b0c5b1bd2a7fc570154559d5ec648e3 +CLIENT_TRAFFIC_SECRET_0 96ded9df2d2edb78eb99dd72232bccf065b01236641d9aa1545bcae8b63de76b 858342a32f25fe7965a06d8e7e29fb067dcec1f2a99fc7bdad5161b951d6cf47 +SERVER_TRAFFIC_SECRET_0 96ded9df2d2edb78eb99dd72232bccf065b01236641d9aa1545bcae8b63de76b 17e1050ba3b67314d075f58268c25c4d6d0e461796214d59c5a8cd07f14586a8 +EXPORTER_SECRET 96ded9df2d2edb78eb99dd72232bccf065b01236641d9aa1545bcae8b63de76b 3339c4ee85d4afcf5c1de4b3352c131b4fc897fc680210c395ad0f28ab0500a3 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 13fa9212acb92e6e9a236d1b0e18ec8656ca23a86748289c9cf53c680fd9d75b 48fe1c04f31ffa9ef53b1fa59fdf3f33a76e8021885d31c50b12ba639b630521 +SERVER_HANDSHAKE_TRAFFIC_SECRET 13fa9212acb92e6e9a236d1b0e18ec8656ca23a86748289c9cf53c680fd9d75b 215c64deba9369476aa7ca6cd3e57fedf55fcb69cc297ef6b3cd8d71f0952eea +CLIENT_HANDSHAKE_TRAFFIC_SECRET d5595fbe9d09f2dd9620076d87aecd3b41152fd26f08112b310b39e29c146524 20d2071d2d9156ad1ebab15497c694a47202197697d1259fdc485d0326049a0f +SERVER_HANDSHAKE_TRAFFIC_SECRET d5595fbe9d09f2dd9620076d87aecd3b41152fd26f08112b310b39e29c146524 1d7dc07d0064931e394b3671975405d284dfc10fda8996a47feeda3c7a520f1d +CLIENT_HANDSHAKE_TRAFFIC_SECRET e47f52ef3b6b5ed10fbf4561964c32d42bae55cd8945954ae6fd85a43757ffad 21a92b5cd2ede0eb1958498236b7be49b8f98abf363f4ea20a6fbabdd9e50e0c +SERVER_HANDSHAKE_TRAFFIC_SECRET e47f52ef3b6b5ed10fbf4561964c32d42bae55cd8945954ae6fd85a43757ffad 65826607c4b0bf8e949ad84fdbf9659adf3344da891bf9d9e506ca917bbb818d +CLIENT_TRAFFIC_SECRET_0 13fa9212acb92e6e9a236d1b0e18ec8656ca23a86748289c9cf53c680fd9d75b 76c6c2245fa58d118c81bf90aaab0be8bbc8570c21d8520dc79c1487dd674102 +SERVER_TRAFFIC_SECRET_0 13fa9212acb92e6e9a236d1b0e18ec8656ca23a86748289c9cf53c680fd9d75b f0a1772813e41e51eba46314bec8d00db14c1e392e4ca4b781d5f03c9bd6befa +EXPORTER_SECRET 13fa9212acb92e6e9a236d1b0e18ec8656ca23a86748289c9cf53c680fd9d75b 90e2a6bddb2841dcc9da0168561d60034adab876f4dd4c52b7e4f8e10a67b45d +CLIENT_HANDSHAKE_TRAFFIC_SECRET 991d8b7be96036cdbb3a3d488eff7c9b5b62833a9b279fd1add292f37b616017 26021cdea21b4a83a8042d4a6f93b8d30db25ea880c73eeb0d9ad0bc61352c41 +SERVER_HANDSHAKE_TRAFFIC_SECRET 991d8b7be96036cdbb3a3d488eff7c9b5b62833a9b279fd1add292f37b616017 2d682ec6113fbb86388efd7bd7a2ad75797aefb1c203c6e09bbd9b412cfc0303 +CLIENT_TRAFFIC_SECRET_0 991d8b7be96036cdbb3a3d488eff7c9b5b62833a9b279fd1add292f37b616017 199c77898bf1cb3ccdd6be6f51fd55910c1e586e2e3e2962173ed0245e18d585 +SERVER_TRAFFIC_SECRET_0 991d8b7be96036cdbb3a3d488eff7c9b5b62833a9b279fd1add292f37b616017 fe727dcb5cf5756f657bd783b0f17ec0ba5404e3b565675798c93e6b3e5720f7 +EXPORTER_SECRET 991d8b7be96036cdbb3a3d488eff7c9b5b62833a9b279fd1add292f37b616017 167ab64f39bc4e0a7c5c5644d8bf9c4b5c36ffa406413d45b7583ab40488af5b +CLIENT_TRAFFIC_SECRET_0 d5595fbe9d09f2dd9620076d87aecd3b41152fd26f08112b310b39e29c146524 af590ab37742e27ffaba7d3c526bda30bbdc1430cf6078e07879f09391194a5e +SERVER_TRAFFIC_SECRET_0 d5595fbe9d09f2dd9620076d87aecd3b41152fd26f08112b310b39e29c146524 f3d5d3996e84a1f6be40284fc819b9995803b4371fd7e52730a1e61af6d85ef9 +EXPORTER_SECRET d5595fbe9d09f2dd9620076d87aecd3b41152fd26f08112b310b39e29c146524 9b7d84640b59d8f7648f8fde37a36a2cc67d66aa0072da73464cb5b9931c012f +CLIENT_RANDOM c273746b4b20b5351184ef639c21b2342e307cff52b8e652612e3dad248b1bf4 5078a8b4bf7c99b02d991edec4c1a1bdbbbda7bdfc795f0d5b81d2eb64c2ec048bb8b4bc3685c0f6ebec5976a3075222 +CLIENT_TRAFFIC_SECRET_0 e47f52ef3b6b5ed10fbf4561964c32d42bae55cd8945954ae6fd85a43757ffad 1d31ac71bf212c54bd330b2d8bae60d40b791371f74857b25b3fb478798e05c9 +SERVER_TRAFFIC_SECRET_0 e47f52ef3b6b5ed10fbf4561964c32d42bae55cd8945954ae6fd85a43757ffad 7c890503ecf1e924f34f1768402485f72f0813944c23437bcb6197ee553c7a69 +EXPORTER_SECRET e47f52ef3b6b5ed10fbf4561964c32d42bae55cd8945954ae6fd85a43757ffad 8f35fc815837a9d2f06b401580836426d520af0b5437d5d94596fd415c464074 +CLIENT_RANDOM abf2b83157c7ec2a86fa9fb299acdd12ff1a3627cfadcb3a8036a446fc2ff7ed 7cd161096f6ce438f3b9a700caca62205766c381da8f80c3c419f805acef05997376d65321455c8aed682e2b2b2553c9 +CLIENT_HANDSHAKE_TRAFFIC_SECRET eefdbe5fec88fb5f49c62bbc9e1319eee0433bf0bea70b948aa4eff3d48df97b 67aa871064fa54f5f5892bc017915925907b1260e1257730e6ad0aff966822db +SERVER_HANDSHAKE_TRAFFIC_SECRET eefdbe5fec88fb5f49c62bbc9e1319eee0433bf0bea70b948aa4eff3d48df97b c1b1a5ea98c72c95988645a3873a81cbde659467568efba1727d093f3a80dc9c +CLIENT_TRAFFIC_SECRET_0 eefdbe5fec88fb5f49c62bbc9e1319eee0433bf0bea70b948aa4eff3d48df97b 7e8fb82660c98ee5239fc5a43eb9a949c293265ca076c6409e8b1e8590414f8c +SERVER_TRAFFIC_SECRET_0 eefdbe5fec88fb5f49c62bbc9e1319eee0433bf0bea70b948aa4eff3d48df97b bb1f7befdc3c0fc7c1347bc55accd945a3091e4da3a8ee358f4017b65c20d60c +EXPORTER_SECRET eefdbe5fec88fb5f49c62bbc9e1319eee0433bf0bea70b948aa4eff3d48df97b 1f5dca9f74ef7eb5c5b20a0e939e605fb4217c3835b767d4a6b9eb48947228a2 +CLIENT_RANDOM d0a43890f4770d3787b059c5e34a493df77b0f191069c809beee3b9266ffb290 700d03743dd05218466e9b465011189687d517a4a7e3b9ac316d9d0d2a5e4196b1762c1c10b0bff78781bc6ea3889828 +CLIENT_RANDOM c63721ae9a1619d43f5cf705f70c9fb69a7a3bedea81fd60a4e7a1f892cd3d7a 55297dca3499429f433bdafea813257c38bc604206d10931bd1c70ae32e07c4ff05b2abbb0f8874d4d0fb7e1fcda430b +CLIENT_RANDOM 527250a32fd9e35f14eb73172cda1b7c3b5c5f4504edcad3c23c63e7d2a7971c bd10329adbbef67d8ca711bf19baf63e423d9ad100eb8033804af34c6b73889bfb72607d587edfc8ba02ff948f0c8c87 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 285743f4ac81dbf79acdbbe21a10e56b99518fa0df09a1e266d3b5df1d929d7d 3894948614de26adad575f9089dec643b7c86c01cf15d96ae150f697fc33c220 +SERVER_HANDSHAKE_TRAFFIC_SECRET 285743f4ac81dbf79acdbbe21a10e56b99518fa0df09a1e266d3b5df1d929d7d 11164287ca34c23ed5adbe8927653035057b61b328c700b55a32a759c34525da +CLIENT_TRAFFIC_SECRET_0 285743f4ac81dbf79acdbbe21a10e56b99518fa0df09a1e266d3b5df1d929d7d ae340058a87188c1cc5e8803b976c79d687fed2bcacab0cf74154fdf49412974 +SERVER_TRAFFIC_SECRET_0 285743f4ac81dbf79acdbbe21a10e56b99518fa0df09a1e266d3b5df1d929d7d 7f6fe20f1621909a1b27d55cb8ba9b705d9cb47a8f3f10096cbd51eb0adb1004 +EXPORTER_SECRET 285743f4ac81dbf79acdbbe21a10e56b99518fa0df09a1e266d3b5df1d929d7d b72bf432a3dd24d9ddb9ecd704fae7133138c19ce340af28c8088f4a6e4792d9 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 14544464c6b9ed572b3f935442c8fa35722676e47df39c0a277b7ab28b0a3ed8 9000145fb56de37772b60584ba79ec57bc78737df43ca81fd935cd5c824ce9be +SERVER_HANDSHAKE_TRAFFIC_SECRET 14544464c6b9ed572b3f935442c8fa35722676e47df39c0a277b7ab28b0a3ed8 de6ab3a66e473873d1145902df307659ae5616566652660a8c205068439ebba1 +CLIENT_TRAFFIC_SECRET_0 14544464c6b9ed572b3f935442c8fa35722676e47df39c0a277b7ab28b0a3ed8 ad892e057efdcde5d5f3bd62f977448f138e821a10805c19eb92174f1e5e9f79 +SERVER_TRAFFIC_SECRET_0 14544464c6b9ed572b3f935442c8fa35722676e47df39c0a277b7ab28b0a3ed8 2a411f3d5bf404bbe163491fe8a9575e74aa440e5ccfa8084b2e9af0ac55fbc8 +EXPORTER_SECRET 14544464c6b9ed572b3f935442c8fa35722676e47df39c0a277b7ab28b0a3ed8 3f025fc57414021f19369f3683e29c8e73c7dd3e37c0b9a02def638a5cebfe60 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2c519bad84c03607b26d6d9381ea4e4b0750db1ce3ced7fa526f3bd937ef4b0f 99abc56b5a00a1c1ceac69ee5e811c62e4174517c419af28014b7ab5f48cde74 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2c519bad84c03607b26d6d9381ea4e4b0750db1ce3ced7fa526f3bd937ef4b0f d1771d223f451f7cead9eb8f99e7b6cbad83aa73f34957b362529b16fe58f40d +CLIENT_TRAFFIC_SECRET_0 2c519bad84c03607b26d6d9381ea4e4b0750db1ce3ced7fa526f3bd937ef4b0f cdd140e65fc63cae07d6d5d162f37a61b79fafa24f7dce0405dcac076d60eba0 +SERVER_TRAFFIC_SECRET_0 2c519bad84c03607b26d6d9381ea4e4b0750db1ce3ced7fa526f3bd937ef4b0f 89e60fe02ca878600205060242160ff7b6be85780273dd3d34748e3f7dd5c65f +EXPORTER_SECRET 2c519bad84c03607b26d6d9381ea4e4b0750db1ce3ced7fa526f3bd937ef4b0f 5d883835c346d24b7efe6e54d554c4915f5a3e326347d7d54899b57b8976fc1b +CLIENT_HANDSHAKE_TRAFFIC_SECRET 79dd09cbb79cda8d0c4af0337d313506c02a93af08896e2b7b36fd7d86143fb7 3567addf511cfe3dc9c21ba071f21522e68d7a144a2277dc1e8d34c169034a3c +SERVER_HANDSHAKE_TRAFFIC_SECRET 79dd09cbb79cda8d0c4af0337d313506c02a93af08896e2b7b36fd7d86143fb7 39b40b7b2771f8a14e135672be0e1da5c3319510fc63917a9fbef8c0ddb04b86 +CLIENT_TRAFFIC_SECRET_0 79dd09cbb79cda8d0c4af0337d313506c02a93af08896e2b7b36fd7d86143fb7 18a6856c8e7ed18c180e3c30b8705f9a5275181231134f979eee8436c64c3223 +SERVER_TRAFFIC_SECRET_0 79dd09cbb79cda8d0c4af0337d313506c02a93af08896e2b7b36fd7d86143fb7 f2df3f40ce87d166bf5f0d9621db477229a32ae97a3780d53d07532e6674b71a +EXPORTER_SECRET 79dd09cbb79cda8d0c4af0337d313506c02a93af08896e2b7b36fd7d86143fb7 0ba11e762960a11554b0706687972f4b71fa3e4a3d6855a2c9315ab17e044768 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 08b39e3e077af615bfaee1c6f9fde9e72b9307cafccb3093eb691e6ab3b818c0 d9989fc300ece091d298ed5568df277ccab839e364eca97da9da228f4a4dd115 +SERVER_HANDSHAKE_TRAFFIC_SECRET 08b39e3e077af615bfaee1c6f9fde9e72b9307cafccb3093eb691e6ab3b818c0 fd8bac1c7014555277e646a77ae9547d71d79166f0924d92cd844616c324167f +CLIENT_TRAFFIC_SECRET_0 08b39e3e077af615bfaee1c6f9fde9e72b9307cafccb3093eb691e6ab3b818c0 1564643f756a385d54912ed12696dbf42aa6d0623ee65692fc74269772b46007 +SERVER_TRAFFIC_SECRET_0 08b39e3e077af615bfaee1c6f9fde9e72b9307cafccb3093eb691e6ab3b818c0 fc1eb4e19440df219477b3eda57c5612b9343ea732b883436f0146e579cb39d5 +EXPORTER_SECRET 08b39e3e077af615bfaee1c6f9fde9e72b9307cafccb3093eb691e6ab3b818c0 5c7acef3cc512b849a84e5049547e4850935d481f93081a5a66f86fd0d976095 +CLIENT_HANDSHAKE_TRAFFIC_SECRET c70ed5691206a5104ce9dbbca9876c17ccc22c4bd17cd6dd284df6b89a834943 368f96ef3e36ab77f46df4ad8c3e5896fbab6b7516c5d5d80c9f5235c7b4a53f +SERVER_HANDSHAKE_TRAFFIC_SECRET c70ed5691206a5104ce9dbbca9876c17ccc22c4bd17cd6dd284df6b89a834943 f62c028017f5be1ee677824d59584dbf5863b76d2a3ad7f43e161f88e27e3cd5 +CLIENT_TRAFFIC_SECRET_0 c70ed5691206a5104ce9dbbca9876c17ccc22c4bd17cd6dd284df6b89a834943 4552f00e58480ec81ebe0c7af8c06cb012dc0489e9c8011afbb2f822917b7478 +SERVER_TRAFFIC_SECRET_0 c70ed5691206a5104ce9dbbca9876c17ccc22c4bd17cd6dd284df6b89a834943 4a26b32667e4b395f513b37f389b0034ce5ec37ff483fb05cad9a3060a9600f5 +EXPORTER_SECRET c70ed5691206a5104ce9dbbca9876c17ccc22c4bd17cd6dd284df6b89a834943 da68c1a7e7d4293fa8829d52f87ef424a97a769c76c9cbbd68663eac368c4677 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f30547fd9841cb6d69f4ecc9c40d9db95ac94771fbe00759c0c68ac2ba69e8f8 08972faac52a30f3fad0866a59033aff49c77309b652649867ca2e10f4125d0c +SERVER_HANDSHAKE_TRAFFIC_SECRET f30547fd9841cb6d69f4ecc9c40d9db95ac94771fbe00759c0c68ac2ba69e8f8 71395a242064ff7f3ba7a45bb4df5b6d3c796b213af9ae90e710fe4f6b41e991 +CLIENT_TRAFFIC_SECRET_0 f30547fd9841cb6d69f4ecc9c40d9db95ac94771fbe00759c0c68ac2ba69e8f8 ce60289a4e94156762f293fdd25797a638a531f65980339db2fdca651a647337 +SERVER_TRAFFIC_SECRET_0 f30547fd9841cb6d69f4ecc9c40d9db95ac94771fbe00759c0c68ac2ba69e8f8 2168d5182a66f3e8c68da69ceca97240746ac07b437f1fa23914b4b744ca7d21 +EXPORTER_SECRET f30547fd9841cb6d69f4ecc9c40d9db95ac94771fbe00759c0c68ac2ba69e8f8 7e5664b21d76d4a9e1ce3db2b4d48fa2a9dc0c577d6c7155379ed9fa17376f68 +CLIENT_HANDSHAKE_TRAFFIC_SECRET a07743de345039c8472bb076040b9ed6f101984ef42a84e439407bccf8a1b4b9 785f04122d04c8b735f48a3899b2a6c7425026d70a4a46db6c28dad9f0919471 +SERVER_HANDSHAKE_TRAFFIC_SECRET a07743de345039c8472bb076040b9ed6f101984ef42a84e439407bccf8a1b4b9 e8a5b3ade4a0b83fb4faf329e9b66ec53e1532f07dcbb6f113b69ac00322158c +CLIENT_TRAFFIC_SECRET_0 a07743de345039c8472bb076040b9ed6f101984ef42a84e439407bccf8a1b4b9 a378af27671cdc9f62341924bda6ec5720bdfbcb94899944167d4a5292bb987d +SERVER_TRAFFIC_SECRET_0 a07743de345039c8472bb076040b9ed6f101984ef42a84e439407bccf8a1b4b9 62ced39be836b5ff2bfb1a75193feacf3fcc7d795f7059d25cd7d060fb585cda +EXPORTER_SECRET a07743de345039c8472bb076040b9ed6f101984ef42a84e439407bccf8a1b4b9 6b6e1a467a2e5a2d7466fdd876fcdc5f1a779ab6b820382bd61b1bceca67aaf4 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 130ab99135eff36eaf7125e64949cdbbe36545ca986cbc03c64be4cb1e939d5c 8576049d4fead84eb853c578155a66183a21a0d710d1e34e7f0c5ada79e09e72 +SERVER_HANDSHAKE_TRAFFIC_SECRET 130ab99135eff36eaf7125e64949cdbbe36545ca986cbc03c64be4cb1e939d5c 3cd55d36b79196b618cc2e8a8b7b9df0eb5c184d8b08e3bd399695c5971085bf +CLIENT_TRAFFIC_SECRET_0 130ab99135eff36eaf7125e64949cdbbe36545ca986cbc03c64be4cb1e939d5c 5cf7c89dcb8562990560daf388d48522dfc6bc5f7ba3e715cb1a112491bfdfb6 +SERVER_TRAFFIC_SECRET_0 130ab99135eff36eaf7125e64949cdbbe36545ca986cbc03c64be4cb1e939d5c f070a6502ddcb9384f291ca2e2446cdd85df0c44719af267488807a8a7c54ffa +EXPORTER_SECRET 130ab99135eff36eaf7125e64949cdbbe36545ca986cbc03c64be4cb1e939d5c dd0e25a383b702e0c3a614f91a2bbe1cbd8d7f6d557b9933b2dffea9e1dd400f +CLIENT_HANDSHAKE_TRAFFIC_SECRET 20a4613e352e96baa3e6fb157c7feccd44fcfe8e3b12623a97808fb43ab085e6 5d7e595e7c969cf479359f4ec418f092f6e41a75b0a3b346a5b65846d56623cc +SERVER_HANDSHAKE_TRAFFIC_SECRET 20a4613e352e96baa3e6fb157c7feccd44fcfe8e3b12623a97808fb43ab085e6 8d4e9b6a5f50c724d6576203622778cae6a3daf26e5f1bd68adad4e6f4514ef8 +CLIENT_TRAFFIC_SECRET_0 20a4613e352e96baa3e6fb157c7feccd44fcfe8e3b12623a97808fb43ab085e6 af11ff2ec630fc2b8657f76d804d06a43d7999e4949d90a5524071490c3c65dd +SERVER_TRAFFIC_SECRET_0 20a4613e352e96baa3e6fb157c7feccd44fcfe8e3b12623a97808fb43ab085e6 cb19243c5704d28b15b829b6294491a81e8b9137298510b40eb866826283a396 +EXPORTER_SECRET 20a4613e352e96baa3e6fb157c7feccd44fcfe8e3b12623a97808fb43ab085e6 4d9c1e3ca8cb8e1c13fdfac757a223b812b2042329b66903016453e527713e11 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ff43bbb1b1dd6ebe676d90bb08c848d6a2f2299169f9b2b21e860181011f74ab 9abe079a64976bfbfe4ccfe375a7d57bd6170dafa08fbd0b05cbbe0013adba91 +SERVER_HANDSHAKE_TRAFFIC_SECRET ff43bbb1b1dd6ebe676d90bb08c848d6a2f2299169f9b2b21e860181011f74ab 3991c1d39f11bca8f20f67560d85f3cf86d595227c079fe16f074ecde91d8ba6 +CLIENT_TRAFFIC_SECRET_0 ff43bbb1b1dd6ebe676d90bb08c848d6a2f2299169f9b2b21e860181011f74ab e9140fa47e08392f78c88169366a4ecadc08be5980e598b501067098c93b9db0 +SERVER_TRAFFIC_SECRET_0 ff43bbb1b1dd6ebe676d90bb08c848d6a2f2299169f9b2b21e860181011f74ab ff1c1868404e8e3d9a86edfec3ad9bca5c13c2071468fc4b94815628f6bf3ad5 +EXPORTER_SECRET ff43bbb1b1dd6ebe676d90bb08c848d6a2f2299169f9b2b21e860181011f74ab 0483afca9c7f43eb6ef8847cefb779d1e4fbe050a5e39d1246c6b4e86db573a9 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3c632b723d00d695ef33aa5a5500703007c77f13d8d368e16af6523a43552a24 cc9f39495d5788af4599a743ab52c7e340503cf719d8f702ad2c254f459586d0 +SERVER_HANDSHAKE_TRAFFIC_SECRET 3c632b723d00d695ef33aa5a5500703007c77f13d8d368e16af6523a43552a24 661472ca22844f78ad488da26f4bd02b6b368061b8897f6099e891386c0d5e56 +CLIENT_TRAFFIC_SECRET_0 3c632b723d00d695ef33aa5a5500703007c77f13d8d368e16af6523a43552a24 8559ba833a949d1a34cdd50b55fc68b2f7a7f91b2e8f5ad569f2998d3b0ef6ed +SERVER_TRAFFIC_SECRET_0 3c632b723d00d695ef33aa5a5500703007c77f13d8d368e16af6523a43552a24 278b6693629f607e03fd2ab67bd897930d9c879ad53327af775c625d4911bb93 +EXPORTER_SECRET 3c632b723d00d695ef33aa5a5500703007c77f13d8d368e16af6523a43552a24 098cda8cc1ca8a3b293246a0d25321b1e24639c82281a2c136c5b5df0dd7cb4c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1e1443c76ea4e6ea8ad8a4b96fcef293585773d698eca3bf2f6978758a0c284b 0da1890686f3da75aa08fa4e840d254358fff2a1edffdbae265800fc20c4bc7d +SERVER_HANDSHAKE_TRAFFIC_SECRET 1e1443c76ea4e6ea8ad8a4b96fcef293585773d698eca3bf2f6978758a0c284b f2e211dbad8efb53571a0626b9068f639f03e89ed3353eb7eddc0e6f3b2d97b9 +CLIENT_TRAFFIC_SECRET_0 1e1443c76ea4e6ea8ad8a4b96fcef293585773d698eca3bf2f6978758a0c284b 51fb4939b8b5178db0235f83bffe1265c13b101f415ca36624c4c228cc1ce0c8 +SERVER_TRAFFIC_SECRET_0 1e1443c76ea4e6ea8ad8a4b96fcef293585773d698eca3bf2f6978758a0c284b 3df84161fb44abe947f394367de2f03dabc2f03e3b185a002a7f881116109cac +EXPORTER_SECRET 1e1443c76ea4e6ea8ad8a4b96fcef293585773d698eca3bf2f6978758a0c284b 5dce3d75d7864b615b910963cd104a148abb268e94adc9157ebf5ced2982cc01 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1893b32830acc9d89cb463077009339a28811ba0f6f2a163dfde984ea042e43d bbac32bf52be1afb6e12e85f4a63600d6792541bef963bf24153ba71ae2c7568 +SERVER_HANDSHAKE_TRAFFIC_SECRET 1893b32830acc9d89cb463077009339a28811ba0f6f2a163dfde984ea042e43d 2791965d57fb67fa76ced4776195cd15b0b3c6bf5c7ac90fbe706e336b16b776 +CLIENT_TRAFFIC_SECRET_0 1893b32830acc9d89cb463077009339a28811ba0f6f2a163dfde984ea042e43d ed3dbcb42bb01e2d0f7d85805fbe76b44282a10c275b654a9cc8a21cc6cd3a08 +SERVER_TRAFFIC_SECRET_0 1893b32830acc9d89cb463077009339a28811ba0f6f2a163dfde984ea042e43d 18e48639388d984016cc639e0002d704a4e22a9119979c0b55644614749ca371 +EXPORTER_SECRET 1893b32830acc9d89cb463077009339a28811ba0f6f2a163dfde984ea042e43d c27b461ca8b0e7bdd622aee28530e3ca7e30b366789bf66bed1100d1d5d8999a +CLIENT_HANDSHAKE_TRAFFIC_SECRET f721b73514733367feb231dd7d46e97bf0b3528d9cb8627fde0dfb0efc840780 a2850d40e171adbc7b3331d962ab8fe51d45146eec23d0868d272be3691ac1ad +SERVER_HANDSHAKE_TRAFFIC_SECRET f721b73514733367feb231dd7d46e97bf0b3528d9cb8627fde0dfb0efc840780 8c8b40e59ae93f0fe8e78f7c465ce0ad470d4f64fd408fbc8bda9a08ba3849b4 +CLIENT_TRAFFIC_SECRET_0 f721b73514733367feb231dd7d46e97bf0b3528d9cb8627fde0dfb0efc840780 786a5f665d1dc50bf4e82da76985e7e9c60e5d134710136001a75cc600f12fad +SERVER_TRAFFIC_SECRET_0 f721b73514733367feb231dd7d46e97bf0b3528d9cb8627fde0dfb0efc840780 34bec57c23ed3aa71110cb7eba32d4503c18f02a08d6a2a4214d84719a0f5cfb +EXPORTER_SECRET f721b73514733367feb231dd7d46e97bf0b3528d9cb8627fde0dfb0efc840780 22da91127784df91682b636dcf2fb89432c5fada6fd12aef8fdfb53e1c338d70 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d61228124c32f4e4db54441b899d15d4d1e78eba2741b4579263ca4f84601805 85840d7db6d625b0f8a8869e4f936954785a3ea88c5274334ae609e524495739 +SERVER_HANDSHAKE_TRAFFIC_SECRET d61228124c32f4e4db54441b899d15d4d1e78eba2741b4579263ca4f84601805 bb6fdc9192764f73ee3995b4b9fdd1ec0c47097800099d983ed70497f4d46364 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 66e576d5e46a16ba33c05cbc87d7e7b2f0c6029f798b2b05ca5d278fb6641605 246eaa9fff5879b71e2a9f80b560c98fbb20e4700ccb5d3a45d35722c40c7ccd +SERVER_HANDSHAKE_TRAFFIC_SECRET 66e576d5e46a16ba33c05cbc87d7e7b2f0c6029f798b2b05ca5d278fb6641605 23864a34a4693207bd59f0f720ff416a008534784f1e9adc52528c1560f48dd3 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f8a1064e6ee29a880773c967eff347955812efa69ed35736819fee494a82a179 b3e1d415b867d21b95d26f6ab7e0140aa7226dba8caf63c1893632fc18c33910 +SERVER_HANDSHAKE_TRAFFIC_SECRET f8a1064e6ee29a880773c967eff347955812efa69ed35736819fee494a82a179 68698b42640a25309d7ab8fdda3da6e1edefe73187824704ec8b9ff21a6c5155 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 7f3d5fa65e2f776fedbeb2983d3688ac9970051742186989a3758ec6fb1af83b 91133cdb7569fbc1f93822cce3ce711aa5f8de908f1a3f13d2f585ddd9bfe8d4 +SERVER_HANDSHAKE_TRAFFIC_SECRET 7f3d5fa65e2f776fedbeb2983d3688ac9970051742186989a3758ec6fb1af83b c9c6ddb613da69d11f0905cd3ba25949dc3dee93f7ef31ed9721fb8252037a58 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 6402d0b34a5b8b05aee85a9d52c45b5b1713c8416c0679b78b035e171238fdb1 26c5c86015c03b315245175e01aed01901afad4490a07a178b9344a3ed9567be +SERVER_HANDSHAKE_TRAFFIC_SECRET 6402d0b34a5b8b05aee85a9d52c45b5b1713c8416c0679b78b035e171238fdb1 b9b3a356eb936f17ddd938af4796938e728a36cbff2d4b178ef534b1dbf40c0d +CLIENT_HANDSHAKE_TRAFFIC_SECRET e322140bee2790ceff2e84775c5ce5be463a04446ade2c111938b9dc99bcd938 01078cedce1b01f369991e612bcef74de1ca1d75f3e6a30878731c523e41d19e +SERVER_HANDSHAKE_TRAFFIC_SECRET e322140bee2790ceff2e84775c5ce5be463a04446ade2c111938b9dc99bcd938 68429edf84ef89b89560e98be095461f5329b5bf897a49f183882fa8817c168c +CLIENT_TRAFFIC_SECRET_0 d61228124c32f4e4db54441b899d15d4d1e78eba2741b4579263ca4f84601805 e6101e16ca24f9772bd21efaf8b7bc6af4041af7fa74cc3beae9e8fa3ff97004 +SERVER_TRAFFIC_SECRET_0 d61228124c32f4e4db54441b899d15d4d1e78eba2741b4579263ca4f84601805 4ea3a0ad3c4b1bce8ce68c211c1d3a86132ba9f64a94bea73b7df52f957eff35 +EXPORTER_SECRET d61228124c32f4e4db54441b899d15d4d1e78eba2741b4579263ca4f84601805 916439dd7b556b2aa298cab705f822c33a2771f8fee04d3cb3adc4ee9d2c4c9b +CLIENT_TRAFFIC_SECRET_0 66e576d5e46a16ba33c05cbc87d7e7b2f0c6029f798b2b05ca5d278fb6641605 319eff3acf6b995ff5b76edbeaaa6e56839e229bfa9e192dc1be43c179b5d99f +SERVER_TRAFFIC_SECRET_0 66e576d5e46a16ba33c05cbc87d7e7b2f0c6029f798b2b05ca5d278fb6641605 5f7a9dbedc4ff340c0c6e08ba4f477e8db6d8b210123e5d677defeb19c2ab19d +EXPORTER_SECRET 66e576d5e46a16ba33c05cbc87d7e7b2f0c6029f798b2b05ca5d278fb6641605 e2321f642a8814c2966d95d34904fb3343956a407ff747d02c3067a68346d41d +CLIENT_TRAFFIC_SECRET_0 e322140bee2790ceff2e84775c5ce5be463a04446ade2c111938b9dc99bcd938 b0a3dd1ee74a3bbb248cf841117bc72cf1be0965e062813cb0a11ad285e9ac0b +SERVER_TRAFFIC_SECRET_0 e322140bee2790ceff2e84775c5ce5be463a04446ade2c111938b9dc99bcd938 593d4e09545451ba5384203e2e2c682a76c7695350ce23cebb9698be6cd38a7d +EXPORTER_SECRET e322140bee2790ceff2e84775c5ce5be463a04446ade2c111938b9dc99bcd938 a3a7ae11648fadfc856d7e487c874581561afbce261a8d2c37444f2d6a0c8c91 +CLIENT_TRAFFIC_SECRET_0 f8a1064e6ee29a880773c967eff347955812efa69ed35736819fee494a82a179 8266356b0061fca41d3599cbb17f1f943b2450c1dd2a32be4042f4acc2c48932 +SERVER_TRAFFIC_SECRET_0 f8a1064e6ee29a880773c967eff347955812efa69ed35736819fee494a82a179 3438d6c24ed0c84ced2c983c6daaeb4a1285a3c25aa03a5e71405b463540ca3d +EXPORTER_SECRET f8a1064e6ee29a880773c967eff347955812efa69ed35736819fee494a82a179 2a096a4d66bc7255d29d95335b8ba35c4970e151c382fc5ff7f468c801831c48 +CLIENT_TRAFFIC_SECRET_0 6402d0b34a5b8b05aee85a9d52c45b5b1713c8416c0679b78b035e171238fdb1 d4e8ac71b5c365a3e38560993560e679c11e7885c6e7fa568a8028098b320f0b +SERVER_TRAFFIC_SECRET_0 6402d0b34a5b8b05aee85a9d52c45b5b1713c8416c0679b78b035e171238fdb1 a0c2846c256535d7a857f04158a867cfc953f078aed88b2a65ce5d95c9368a31 +EXPORTER_SECRET 6402d0b34a5b8b05aee85a9d52c45b5b1713c8416c0679b78b035e171238fdb1 f641827d50fbb7935bee41380abf6603d3673f86c74d0222932f80df0b8a1f84 +CLIENT_TRAFFIC_SECRET_0 7f3d5fa65e2f776fedbeb2983d3688ac9970051742186989a3758ec6fb1af83b a9b4b2e47c88f81b15f8f00af2c52b6d6f1a2c5f47d0c9ed5a51a2c140c84886 +SERVER_TRAFFIC_SECRET_0 7f3d5fa65e2f776fedbeb2983d3688ac9970051742186989a3758ec6fb1af83b d914d1cdbec33082ded88200b0b55460d505d2909c0c15d87a153c49dafbd8c4 +EXPORTER_SECRET 7f3d5fa65e2f776fedbeb2983d3688ac9970051742186989a3758ec6fb1af83b 84a1e33d718ba471e993de1d870500eeb01d78e7bbaa6a77f4e84ee5e9790b73 +CLIENT_HANDSHAKE_TRAFFIC_SECRET a4bfdc0af06a0603dc3e35f4276270c0f6cddad18c0276c2a219b386631fcbb0 34b7a326e5d52b6387a8e0337a16f118001a44d0d016c20495b8cb2c762d7c8e +SERVER_HANDSHAKE_TRAFFIC_SECRET a4bfdc0af06a0603dc3e35f4276270c0f6cddad18c0276c2a219b386631fcbb0 18f5ba2220914e6f4f3f7b1c6030923be2ae7c29f84d5ed149a14d01ab9deae3 +CLIENT_TRAFFIC_SECRET_0 a4bfdc0af06a0603dc3e35f4276270c0f6cddad18c0276c2a219b386631fcbb0 d16139e20bdfec123c7622ae4b85dd9a163bee3fb454e0ac2d838eb093035872 +SERVER_TRAFFIC_SECRET_0 a4bfdc0af06a0603dc3e35f4276270c0f6cddad18c0276c2a219b386631fcbb0 257e5bf955cc2834a435b21cab2bb0ec69218b53485fadaefaa7973f970caee5 +EXPORTER_SECRET a4bfdc0af06a0603dc3e35f4276270c0f6cddad18c0276c2a219b386631fcbb0 325593fa3db0405765dfad9c11c21e73a112f8c7ed2c2e81013643625250ff25 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5161992c30c77a3106c9224ff398e83131600dd37c73d4f3c797ed0ec218c7d5 30803be8ce7867aaecab5831a548cdaee053853b1557489407727ec1c7b5703e +SERVER_HANDSHAKE_TRAFFIC_SECRET 5161992c30c77a3106c9224ff398e83131600dd37c73d4f3c797ed0ec218c7d5 215e9a5ebf330d17e5e9c54904a1b66d77a72554becb1070fae65e0f774f8301 +CLIENT_TRAFFIC_SECRET_0 5161992c30c77a3106c9224ff398e83131600dd37c73d4f3c797ed0ec218c7d5 56d507f66da3eb81ad71bb294dd3313b5623671c1ee2fe3fb01ec78278de07e8 +SERVER_TRAFFIC_SECRET_0 5161992c30c77a3106c9224ff398e83131600dd37c73d4f3c797ed0ec218c7d5 14c58202f76770bc551a120205c4cd064ceb2ab102c494c86b3fe53a62c8f08c +EXPORTER_SECRET 5161992c30c77a3106c9224ff398e83131600dd37c73d4f3c797ed0ec218c7d5 25e7c94f7b9e09908796e238f5d65d9b84de9589317e75c0f79f2837756ac817 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 6e376740b4d5d9e8950d9959f8270f22527322055216828e0fb9afa330f1b6d0 e1033695303a47503a8e4c2964570b7c42e610b43a67202f3873a7fbcb3e3307 +SERVER_HANDSHAKE_TRAFFIC_SECRET 6e376740b4d5d9e8950d9959f8270f22527322055216828e0fb9afa330f1b6d0 492716f557d37594cbd5b50a3ad2b286281483805461b738a709dbd55f55b688 +CLIENT_TRAFFIC_SECRET_0 6e376740b4d5d9e8950d9959f8270f22527322055216828e0fb9afa330f1b6d0 568ef01a79be234bdb5440d3343aa64958dc82d24e79f7ee5f97d5775a1d2bed +SERVER_TRAFFIC_SECRET_0 6e376740b4d5d9e8950d9959f8270f22527322055216828e0fb9afa330f1b6d0 6dc2c5631fe7b58a7d96c611b1343da2ba4387c707009a8868689d65e7403242 +EXPORTER_SECRET 6e376740b4d5d9e8950d9959f8270f22527322055216828e0fb9afa330f1b6d0 ed2e1a96bdbe218410eac45c7f1d8bda82fc302d64cc0914fcf10a2619e95f37 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 145b37282f19e77bcb256ab519750210d41b3eb328388d445c53f7036f4bbb3a 49bad7a382c429cdb20cd41fd15affab75f2453824891e6412ef3815a68cee34 +SERVER_HANDSHAKE_TRAFFIC_SECRET 145b37282f19e77bcb256ab519750210d41b3eb328388d445c53f7036f4bbb3a 3c6cc19b44230b91bdc805f7e7af85279eed490c9df916ec47c01425ba2747af +CLIENT_TRAFFIC_SECRET_0 145b37282f19e77bcb256ab519750210d41b3eb328388d445c53f7036f4bbb3a 6da21f04b0a1f18e404c8fbddf49e5725ab4be6704c8b2ae3ab503c7fa0bc405 +SERVER_TRAFFIC_SECRET_0 145b37282f19e77bcb256ab519750210d41b3eb328388d445c53f7036f4bbb3a 31c49d2ce99a6e15699788854f85df967c369f761ffff728446564e16f43d56f +EXPORTER_SECRET 145b37282f19e77bcb256ab519750210d41b3eb328388d445c53f7036f4bbb3a 2f206bfdf41e7af554f9609e1ed96607b56affc562b95474054f315ba3e04d15 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8b42765a16f247c77c0953b0859318c1b65df39b7176229b762424ffa44ec8b3 e95bc604e8a21f2243e1b7f0a43e85f469ab0e10822d8405e3eced2244989b1e +SERVER_HANDSHAKE_TRAFFIC_SECRET 8b42765a16f247c77c0953b0859318c1b65df39b7176229b762424ffa44ec8b3 dca43381fd277da8c45fb3ec26a628bddbbef572f4f011c818dee7dc415e46d4 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ece5ec5b28b0289b173ff7f15f7c6af2b772cf9fc509d47bd58d4aa3319b6e8a d36cd578bc14ae9263c3dbf90c3a33c9e2da952bfa0f1b79b738bb5a9cf70664 +SERVER_HANDSHAKE_TRAFFIC_SECRET ece5ec5b28b0289b173ff7f15f7c6af2b772cf9fc509d47bd58d4aa3319b6e8a de777288d768836171004790bff5dc30869320aa072ba448f839a7201d40b936 +CLIENT_TRAFFIC_SECRET_0 ece5ec5b28b0289b173ff7f15f7c6af2b772cf9fc509d47bd58d4aa3319b6e8a 6dd68344c1293f37f9ca87391294c968cdec1b865d9465846b03ad304d9cb2c9 +SERVER_TRAFFIC_SECRET_0 ece5ec5b28b0289b173ff7f15f7c6af2b772cf9fc509d47bd58d4aa3319b6e8a 4e20fb934f381c339488980a9788d7f9cc0aa68d87be2d8060ca8b60c1cb099b +EXPORTER_SECRET ece5ec5b28b0289b173ff7f15f7c6af2b772cf9fc509d47bd58d4aa3319b6e8a 3561a2d7f418d39f0efdac417a1a4b3e59175498fce003d74b2c2ea972d5b6b5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 640c7168818d4616d93d859a64ea7fac57745f7203132747525e4954927e5111 4bda2380318344a0c47edc331eb211f39fc1f5b567699d2ba2576f6cc9c45623 +SERVER_HANDSHAKE_TRAFFIC_SECRET 640c7168818d4616d93d859a64ea7fac57745f7203132747525e4954927e5111 192c93f44be4e6bb456c611c7df934a5ffd6e1467c381d15249278d92dbebbf3 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 26b6a833408541fe0fbb8c63ededfe90c4fda01d38c5c9e9236ae4124d120a50 a014f9f10e5ad51010dbb294fd9e5b7c238d7a0fccba4ceeed43b1634a180e3b +SERVER_HANDSHAKE_TRAFFIC_SECRET 26b6a833408541fe0fbb8c63ededfe90c4fda01d38c5c9e9236ae4124d120a50 731f0fe08892340575d0d1fa326a04b6d906e8fc0b000b48c48734b588685589 +CLIENT_TRAFFIC_SECRET_0 640c7168818d4616d93d859a64ea7fac57745f7203132747525e4954927e5111 177055a3ef68e4331fbda7573b472dc4dbc2707e09140ba0c0a4e08df2440cdd +SERVER_TRAFFIC_SECRET_0 640c7168818d4616d93d859a64ea7fac57745f7203132747525e4954927e5111 b43470517fdf79ed206a2095cdc742347161a9d662635cd0d2c9f14edae116b5 +EXPORTER_SECRET 640c7168818d4616d93d859a64ea7fac57745f7203132747525e4954927e5111 7b187121e8a576262f35ba1bf30c425a48b215a5d32a2a47446a573823baa3f7 +CLIENT_TRAFFIC_SECRET_0 26b6a833408541fe0fbb8c63ededfe90c4fda01d38c5c9e9236ae4124d120a50 cf8697d8944d9458b9b2a8a24c95222c5c23b8d015b1f8d4315d6240ed6c5917 +SERVER_TRAFFIC_SECRET_0 26b6a833408541fe0fbb8c63ededfe90c4fda01d38c5c9e9236ae4124d120a50 ca6ad96cb01e15bd1739642bf2b2d8c198b45caff3d7dfcee1733d89eefe0576 +EXPORTER_SECRET 26b6a833408541fe0fbb8c63ededfe90c4fda01d38c5c9e9236ae4124d120a50 d0673a5018ee22d3f282d9dd37d2406f567aa43bc3dff3ef6fab3c6825c50f00 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 80364ab4bfc46c71adecd0a7a6786f0183d479dbf29c71a4c1af8f80e01b10d6 cd67159d5d6269a72519d9e91e15d08161beffd0f31d9cd6773fbaab2e200861 +SERVER_HANDSHAKE_TRAFFIC_SECRET 80364ab4bfc46c71adecd0a7a6786f0183d479dbf29c71a4c1af8f80e01b10d6 ce67c1ea10d731a314963b240ef83fe1af56263b1a83b1cae2824ac44475bf08 +CLIENT_TRAFFIC_SECRET_0 80364ab4bfc46c71adecd0a7a6786f0183d479dbf29c71a4c1af8f80e01b10d6 032d1d51ad9c7992173c0ba5fa14ea76ac1b9398e0c52e09b9ebd0dbd2145db8 +SERVER_TRAFFIC_SECRET_0 80364ab4bfc46c71adecd0a7a6786f0183d479dbf29c71a4c1af8f80e01b10d6 349c12c024270914cada7c1325c6505c73edc122cd06bdaf6e70b0d8ecb7ba51 +EXPORTER_SECRET 80364ab4bfc46c71adecd0a7a6786f0183d479dbf29c71a4c1af8f80e01b10d6 eeef847850bd19af1e114f3620e24357bd88faf40ed888776b2856da7fc0f381 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e8f909761da51cf2253d0b08370568542f1ece322bcd59d9a6ec876d57aaa176 ec6f146f55f31defb0939952de50895e2141d0213f87f4e894ceea82136bfb79 +SERVER_HANDSHAKE_TRAFFIC_SECRET e8f909761da51cf2253d0b08370568542f1ece322bcd59d9a6ec876d57aaa176 095a81fdfb79dbb819bbaa5e1ebcae59027c7df71414d76aabe9ea86fe0bce44 +CLIENT_TRAFFIC_SECRET_0 e8f909761da51cf2253d0b08370568542f1ece322bcd59d9a6ec876d57aaa176 758746bfe9e19c0920b4002ff6a2e8b1cd1f226bc16a91cf9cce8dd1c2fbe493 +SERVER_TRAFFIC_SECRET_0 e8f909761da51cf2253d0b08370568542f1ece322bcd59d9a6ec876d57aaa176 e4dc1f70e174a228e2b71a5b312a5585141267c6de73d86a15dfc6d44ccf7a61 +EXPORTER_SECRET e8f909761da51cf2253d0b08370568542f1ece322bcd59d9a6ec876d57aaa176 9e6cdc97dcf8cdd8aa8ed83603e717e57923ee5e44596be36abb52164c95ecba +CLIENT_HANDSHAKE_TRAFFIC_SECRET 4bc9954c6a159b846b197836059513676134e637e4d3ed0805a869746d0e00e5 8e46a73eab96e1f05daf9345f24db8c01cdabd7e9ba70c21d225faa6506adabf +SERVER_HANDSHAKE_TRAFFIC_SECRET 4bc9954c6a159b846b197836059513676134e637e4d3ed0805a869746d0e00e5 73389c4d61715b1e789b4632a2551a9b6eba4c6033d650a1117cb205b55883e5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f28834d9a6aed01b68e45cb6b83c962d4c11175b314cdf23effaa11d928c0c17 dfe8372c2a50c19a1642bf2c2b265b93c8a7e7efc904db639a60f44abaeb52d0 +SERVER_HANDSHAKE_TRAFFIC_SECRET f28834d9a6aed01b68e45cb6b83c962d4c11175b314cdf23effaa11d928c0c17 2ce6176d5cc46e7fb0e8ac468918a98596a7437041f7f97616ee9b89bc860109 +CLIENT_TRAFFIC_SECRET_0 4bc9954c6a159b846b197836059513676134e637e4d3ed0805a869746d0e00e5 a47c8a793d57cb8898db6c6b4d9d998cb9b4f93b8052d043f77af7cc1880ac76 +SERVER_TRAFFIC_SECRET_0 4bc9954c6a159b846b197836059513676134e637e4d3ed0805a869746d0e00e5 6a1d7fbee7f9f0464a1e0fc3ecef53f9b8ec21d8eec98b0e046950e6eb9814f9 +EXPORTER_SECRET 4bc9954c6a159b846b197836059513676134e637e4d3ed0805a869746d0e00e5 85f41d99a00c651ae7ffe90d1c0237790de3f0ca3034a031ce37f9c2fc695df7 +CLIENT_TRAFFIC_SECRET_0 f28834d9a6aed01b68e45cb6b83c962d4c11175b314cdf23effaa11d928c0c17 8d795149a848feec567616b26d7b1cf324599ae09fb1f6768d78794781fc6fbe +SERVER_TRAFFIC_SECRET_0 f28834d9a6aed01b68e45cb6b83c962d4c11175b314cdf23effaa11d928c0c17 71d3209e0030d30f2ba4a7f8f0ebf9cad7d9b123dcf4db3dc9a7d4279ed57007 +EXPORTER_SECRET f28834d9a6aed01b68e45cb6b83c962d4c11175b314cdf23effaa11d928c0c17 87577a69edcc35a197c0e6a4f5aa53b10b6e44eec58491eea72b31c97b2145d9 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 16c492b7ba49f354578a85c0824845a5d0ea30ea81612a581d976f2e4f12ded3 b728be7915472eb4de48dcfcd5e6096118a099faf8fd70e144063ce2df4a6eaf +SERVER_HANDSHAKE_TRAFFIC_SECRET 16c492b7ba49f354578a85c0824845a5d0ea30ea81612a581d976f2e4f12ded3 1e61fea8ecf867cdbdb678fc81323a7d183c193362792e8b9117ae1895c9a9db +CLIENT_TRAFFIC_SECRET_0 16c492b7ba49f354578a85c0824845a5d0ea30ea81612a581d976f2e4f12ded3 886553cbde183f5de44460e1cb598f18ce6101f968929d6d062f961494003da0 +SERVER_TRAFFIC_SECRET_0 16c492b7ba49f354578a85c0824845a5d0ea30ea81612a581d976f2e4f12ded3 7545f6ec7999c00e40997f447938c6cc24c873983fdade75e9fb830c5887f330 +EXPORTER_SECRET 16c492b7ba49f354578a85c0824845a5d0ea30ea81612a581d976f2e4f12ded3 b3afbc6b5323a73fec6b977290297a0cad586f2494de75b2db326e2def77d093 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 15a2e7dddd4ca4d1696c4990748c24b09352ea4850a38015bf7f31f40e1295f6 87b0fad21d36f7b5510144b623c7e3a75def53450fa0ee9066942105e65882ac +SERVER_HANDSHAKE_TRAFFIC_SECRET 15a2e7dddd4ca4d1696c4990748c24b09352ea4850a38015bf7f31f40e1295f6 fb31138180aa5a37b01e74bcc01439e0149b144489e6f9238d8d09e810c2eccb +CLIENT_TRAFFIC_SECRET_0 15a2e7dddd4ca4d1696c4990748c24b09352ea4850a38015bf7f31f40e1295f6 f9bad0ffd9a44fa5c83005a22a72d6dc4c64d003fa42a742a8b3e8ea0a97fde1 +SERVER_TRAFFIC_SECRET_0 15a2e7dddd4ca4d1696c4990748c24b09352ea4850a38015bf7f31f40e1295f6 9d109b9713af13369de9e3a24918b229d88d2938b6c3034b0f4bf2031e76b25d +EXPORTER_SECRET 15a2e7dddd4ca4d1696c4990748c24b09352ea4850a38015bf7f31f40e1295f6 960a77c07b0684134775527529b49906f9046e6667a83d274f3600278fdcc998 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 45e0a85721aa4b31cf61792c8072e209900ab78d3a42e8b10cebcc40a402970e 39fce0a0c7745953cce35ab6f1d52764fdad788ccd0dc927996d416d65044666 +SERVER_HANDSHAKE_TRAFFIC_SECRET 45e0a85721aa4b31cf61792c8072e209900ab78d3a42e8b10cebcc40a402970e 04b425a70e634e8a3c7e61e80970d480b8e331954b9619e74ebe40566ca14b2c +CLIENT_TRAFFIC_SECRET_0 45e0a85721aa4b31cf61792c8072e209900ab78d3a42e8b10cebcc40a402970e 505f32ad60e4fc21b0440ce2394caf2ae1e886022ce2683a12afafc3cc3c2a19 +SERVER_TRAFFIC_SECRET_0 45e0a85721aa4b31cf61792c8072e209900ab78d3a42e8b10cebcc40a402970e 46afbc7667f46661bcefabbc1f451d4d9e393a60f9a20e8b58cf7983def3a042 +EXPORTER_SECRET 45e0a85721aa4b31cf61792c8072e209900ab78d3a42e8b10cebcc40a402970e 742b45df6a34c11179abf5019784268669bc722738c7d0f1b88b193f5138a568 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 972afb78c0bc2e6da938e3b45f67f1fcce5b7bd73662025ea770abc136abe519 ca3a9d04d5f87174d0230ea827e5cb8ab7c0daf867488a43026257cc5e999d80 +SERVER_HANDSHAKE_TRAFFIC_SECRET 972afb78c0bc2e6da938e3b45f67f1fcce5b7bd73662025ea770abc136abe519 2925876f3ae544fe68fb9e62299b71da24e500aa8d9c307083001a7b0d157abd +CLIENT_HANDSHAKE_TRAFFIC_SECRET ab59480948c23a33cf9f69aa19d155c023e20b3bee1648c22215505f6234301e 19d52561a0600969fd6651341453bf207085a6c24a0d7fad7cbdcb169edcf90d +SERVER_HANDSHAKE_TRAFFIC_SECRET ab59480948c23a33cf9f69aa19d155c023e20b3bee1648c22215505f6234301e 38bd3fbd86b5a15b41eeb9eab57cc2181a67d13a8682bfd9cb8258309535e680 +CLIENT_TRAFFIC_SECRET_0 ab59480948c23a33cf9f69aa19d155c023e20b3bee1648c22215505f6234301e b5727892164a74e53c08da36854d93646e73d542a4af56a5f8e5a6ac479b1c77 +SERVER_TRAFFIC_SECRET_0 ab59480948c23a33cf9f69aa19d155c023e20b3bee1648c22215505f6234301e 860175d9bdaef5212ac1a495b94327f7d0dbc43c06590563bda23e0a07df7809 +EXPORTER_SECRET ab59480948c23a33cf9f69aa19d155c023e20b3bee1648c22215505f6234301e 689dcc8d3c04d21c4c83c5414f5d927b708cfde2c72047a44f95075870d1612f +CLIENT_TRAFFIC_SECRET_0 972afb78c0bc2e6da938e3b45f67f1fcce5b7bd73662025ea770abc136abe519 b281e37a52f73d29304127fc089b6890bd9dfafc1d9511139d1d370114868cc1 +SERVER_TRAFFIC_SECRET_0 972afb78c0bc2e6da938e3b45f67f1fcce5b7bd73662025ea770abc136abe519 24217617426606d13bc0198551f068fb919df09fa21ad8b02cf8a91d6d867087 +EXPORTER_SECRET 972afb78c0bc2e6da938e3b45f67f1fcce5b7bd73662025ea770abc136abe519 932d858f8564f5d86e864b8f9d3ea5d8a59d78555133a9c6d43e40be32098679 +CLIENT_HANDSHAKE_TRAFFIC_SECRET b7ac4e0344fd986bfc574c74d90c9f3bc1c74e7e476c0cc89a98765a531285b3 5b90f0780f424d27a1a4f9886ea110b849f2b8a1b8b0f764bf90e3c72adf3282 +SERVER_HANDSHAKE_TRAFFIC_SECRET b7ac4e0344fd986bfc574c74d90c9f3bc1c74e7e476c0cc89a98765a531285b3 6aadd1f286e6b97b18492deeb67d7d5beae0d04612d8ad8d412dafb36b6ad11f +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8c0ce300735b462a50d7bc0c8aeb7e4e62914c1a907945a171a73431ebaf9531 726ee9523438647ca298d31f8a0f8326d9013e869f32c03fcf72987d61bb0cfc +SERVER_HANDSHAKE_TRAFFIC_SECRET 8c0ce300735b462a50d7bc0c8aeb7e4e62914c1a907945a171a73431ebaf9531 397d5739d318f39d3bb98bba6a58f5b47c753cfe6da142612eeac44baf2766ec +CLIENT_TRAFFIC_SECRET_0 8c0ce300735b462a50d7bc0c8aeb7e4e62914c1a907945a171a73431ebaf9531 6c9b4e62e18239a7ac0964ebb9e0d8f6ee8fa84fd4cb29bf3a56aed8c4333778 +SERVER_TRAFFIC_SECRET_0 8c0ce300735b462a50d7bc0c8aeb7e4e62914c1a907945a171a73431ebaf9531 6e400a5639f46e79f815f3d9cca1a5ca6e954078722fec12dc3824aa06c315c7 +EXPORTER_SECRET 8c0ce300735b462a50d7bc0c8aeb7e4e62914c1a907945a171a73431ebaf9531 e76ac91c3e84fabc9b7fdebfa5b4f01357714aabcf8955d8951d2a275078963e +CLIENT_TRAFFIC_SECRET_0 b7ac4e0344fd986bfc574c74d90c9f3bc1c74e7e476c0cc89a98765a531285b3 4b2ae2dac1a50e2ed297d2eb58f123c79b4373b165806a5bf29b667ce06f3df7 +SERVER_TRAFFIC_SECRET_0 b7ac4e0344fd986bfc574c74d90c9f3bc1c74e7e476c0cc89a98765a531285b3 1de2e189e39a697a35f3d0034eb640869a4c04dcf46102f7e497afe09992c70f +EXPORTER_SECRET b7ac4e0344fd986bfc574c74d90c9f3bc1c74e7e476c0cc89a98765a531285b3 0c96bd49ecb5daf74431717b21fc8f6eadaf6e5e8b61ef83174b5d2a86686a5b +CLIENT_HANDSHAKE_TRAFFIC_SECRET f76bfe5fc26bd28aeb4f9cde975bfba7284ccc7f00d2ff616464cda2bfd4d724 7cc2654238bb3223cca1ef1dbb45728a867072389aff06d552470ad8e3c115a3 +SERVER_HANDSHAKE_TRAFFIC_SECRET f76bfe5fc26bd28aeb4f9cde975bfba7284ccc7f00d2ff616464cda2bfd4d724 a384dcdc768867bc8d6fdbec1e8c25c9fec1733d7f9624e2e967665e6e389177 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 5631ba20252b00460fa693d258d0bb376476375c87b5281a0331fe53e220f354 1abda8fb36ac13bec8ade934ef7a15aa237ec7efbfa9f0c03ebb6bedd776737e +SERVER_HANDSHAKE_TRAFFIC_SECRET 5631ba20252b00460fa693d258d0bb376476375c87b5281a0331fe53e220f354 5831d13831464e1c06fd83b5b2294c4649a2c76644695926d2971f2560cc151a +CLIENT_TRAFFIC_SECRET_0 f76bfe5fc26bd28aeb4f9cde975bfba7284ccc7f00d2ff616464cda2bfd4d724 9911b89dc299e9c8e266e6473ed314e379e559caa4c153ce8c102437c8c4fe31 +SERVER_TRAFFIC_SECRET_0 f76bfe5fc26bd28aeb4f9cde975bfba7284ccc7f00d2ff616464cda2bfd4d724 248372c8e55e9cb149918eeafda4db67297b558600c996fa3adaf181eb5b61be +EXPORTER_SECRET f76bfe5fc26bd28aeb4f9cde975bfba7284ccc7f00d2ff616464cda2bfd4d724 9afe2af9f1c3cfa2849018d224ed30c7f445b4aaed17e3f3085ac743b42dcb48 +CLIENT_TRAFFIC_SECRET_0 5631ba20252b00460fa693d258d0bb376476375c87b5281a0331fe53e220f354 50fb241294acc59f050d1a87f1103370334412f025207fa0c3c55df611fd9dde +SERVER_TRAFFIC_SECRET_0 5631ba20252b00460fa693d258d0bb376476375c87b5281a0331fe53e220f354 f635508876b29262365c95039bbb579e91450b835ca0d4a9e1f006a944bddb3c +EXPORTER_SECRET 5631ba20252b00460fa693d258d0bb376476375c87b5281a0331fe53e220f354 6d8bba331b234f3ae0927bc5b4e9e8a51cfb76dc0da45c4222647a6ffb8edbac +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3c0d302c436e273debcd76adcf63f539d844fd14a5d8bd1b2fbf79fe87208b4b ab190bf48af8b74e3ffbbefd53cc9404b9034b8abb201123ac08f1b898d6858e +SERVER_HANDSHAKE_TRAFFIC_SECRET 3c0d302c436e273debcd76adcf63f539d844fd14a5d8bd1b2fbf79fe87208b4b 924e0432f6d35c2af6e784d44b3d231f364a7afa69c9ff40216e04bd65538092 +CLIENT_TRAFFIC_SECRET_0 3c0d302c436e273debcd76adcf63f539d844fd14a5d8bd1b2fbf79fe87208b4b 0f281683a49164c2f337701bb2d407ed30e55d36b8dc6979776b3382e15a1407 +SERVER_TRAFFIC_SECRET_0 3c0d302c436e273debcd76adcf63f539d844fd14a5d8bd1b2fbf79fe87208b4b 04b518dd04dba7c3bf66864478445f034653e80c474f446b3400bccbb3d2ce8c +EXPORTER_SECRET 3c0d302c436e273debcd76adcf63f539d844fd14a5d8bd1b2fbf79fe87208b4b f13387bd8a45c4f98abd7d447c62a1bae89296097729b8ac51fbf1ae2fda4141 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 300fdea8e2c424c056b9473fe27435bb36d5a15d0578dd8394a79c44e457cc67 c22f0115f7b9aaea660a8fc1afd627b9d495cd4c8f38a32e5a77c80f8050de56 +SERVER_HANDSHAKE_TRAFFIC_SECRET 300fdea8e2c424c056b9473fe27435bb36d5a15d0578dd8394a79c44e457cc67 c246873f6666260949df8b5525c03741d89230c42b45587d045d133a334c446f +CLIENT_TRAFFIC_SECRET_0 300fdea8e2c424c056b9473fe27435bb36d5a15d0578dd8394a79c44e457cc67 3828b5e4361bb91830b0f5e61a524808905bb4ecac34359df90693a00f6b56b4 +SERVER_TRAFFIC_SECRET_0 300fdea8e2c424c056b9473fe27435bb36d5a15d0578dd8394a79c44e457cc67 9f13f72f0c54a6e67e642baa658943533dd932d8c463d1ee1ea608e34da1c235 +EXPORTER_SECRET 300fdea8e2c424c056b9473fe27435bb36d5a15d0578dd8394a79c44e457cc67 0f8f18cdb18b8c2633f11f2efba956042523c51817dfb6ee9e100b19a2dfff77 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 07c613e12d7d774197eb67f4260011e19c48a865c61bea5c5d20abf634a024b7 6e8e747f5e3bd5542ae8b2faedcaefce9f2fd33ab60bef5b0a41a716a96de9d7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 07c613e12d7d774197eb67f4260011e19c48a865c61bea5c5d20abf634a024b7 cd3344bac0b13c29a7249bf231a5872f4ed89e01b7a1c19d507bb7cdc3e5a734 +CLIENT_TRAFFIC_SECRET_0 07c613e12d7d774197eb67f4260011e19c48a865c61bea5c5d20abf634a024b7 35b48648706ef526b2699ea3dcc1489a5954d845adfcf44ea965452a78165876 +SERVER_TRAFFIC_SECRET_0 07c613e12d7d774197eb67f4260011e19c48a865c61bea5c5d20abf634a024b7 7b9358ce2d39c7061605211b1bfb9d5ee811acadf9c308a63ea6865c34743b6d +EXPORTER_SECRET 07c613e12d7d774197eb67f4260011e19c48a865c61bea5c5d20abf634a024b7 e23b311273456d4bfb575cec47193ce4aacc2934c4fc6c9b3586889075295f98 +CLIENT_EARLY_TRAFFIC_SECRET be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 9231a34f88295e8b81ea52faadba19eb67a256ba124136199a7af8f678c948e5 +EARLY_EXPORTER_SECRET be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 ee26b61ef6c5fb28ac39314068675de1ac0a18030d6324b9f616494b137a145d +CLIENT_HANDSHAKE_TRAFFIC_SECRET be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 89ae438270a89825a59a6254095966cf1f5fd9bfa57594e22ccdfd34b7c11c17 +SERVER_HANDSHAKE_TRAFFIC_SECRET be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 b225afb65a8ad1a8d9490fd7b2f179e1745e3c6d0a071736c9c1b3ab41e88086 +CLIENT_TRAFFIC_SECRET_0 be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 b0b4d839cf5e15eec011f05811edb33a1873f39a60532c77ae579d2d53914f4c +SERVER_TRAFFIC_SECRET_0 be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 c2b8406ec70697039567f995a7355116bef3399538208b75e587292699be8b9d +EXPORTER_SECRET be60b2f27d36c50c698d64212035dde15f9f77ec0719a7991068843ba94c42b4 39fce910e6a987ab9cd56ea74bc7ece4645a02008314e45aa366db6f33759765 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 12856aaea005a48273b72b246c4da7bc3c7cca92a0fb5498d37f992ec6382e9d 6bc2e6316c5d53e5a1617c317fb396e2d5734d2d33e3032e0cc263f0a37451f3 +SERVER_HANDSHAKE_TRAFFIC_SECRET 12856aaea005a48273b72b246c4da7bc3c7cca92a0fb5498d37f992ec6382e9d 450bc39f8d288a0d5dcb5b68d9fa0d2e6c0f4b07b59eebcb07a488e20820a953 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d0018ee7ff5b7daa78043bef4f087d7cad2fe4db09de13a9861ae3eb6be90a63 f40f540ad980dd6c036cac50468c2433ee8d00bae4df6d9db6574b30b3d35df3 +SERVER_HANDSHAKE_TRAFFIC_SECRET d0018ee7ff5b7daa78043bef4f087d7cad2fe4db09de13a9861ae3eb6be90a63 82c09673da77fc681637b7546d631f46433499f6418ca487a1578f7620dfcb82 +CLIENT_HANDSHAKE_TRAFFIC_SECRET b7bedbfdb78b9ca1148c510503ce1c72c98fb9cbe59e3ff5a870151293bc4f91 b6aae39653f2aeff26f5d73d7e908166395f9242adc57e59347013587d277b84 +SERVER_HANDSHAKE_TRAFFIC_SECRET b7bedbfdb78b9ca1148c510503ce1c72c98fb9cbe59e3ff5a870151293bc4f91 d76ef85b3617ff0e5a5ca7f7a2c2a2369aa51e455631f962c32cf9d5592f6d56 +CLIENT_TRAFFIC_SECRET_0 d0018ee7ff5b7daa78043bef4f087d7cad2fe4db09de13a9861ae3eb6be90a63 1fe50d7b58adb51b9086d358cc230ea86789b665f938b1dd17e60ed3d1876a95 +SERVER_TRAFFIC_SECRET_0 d0018ee7ff5b7daa78043bef4f087d7cad2fe4db09de13a9861ae3eb6be90a63 021d42cfbdeb1cf3533e0ed163de14fcacab5f242c6bf0afa98778124c0c83f0 +EXPORTER_SECRET d0018ee7ff5b7daa78043bef4f087d7cad2fe4db09de13a9861ae3eb6be90a63 1e547a9593d22be073166f3019d679c792650d95fee5b2f53f80a84a0d114260 +CLIENT_TRAFFIC_SECRET_0 12856aaea005a48273b72b246c4da7bc3c7cca92a0fb5498d37f992ec6382e9d 21a1271a7f02d2934659dcfaca0de409e65fee5ea32128cabcf7d6a3e4d7ef37 +SERVER_TRAFFIC_SECRET_0 12856aaea005a48273b72b246c4da7bc3c7cca92a0fb5498d37f992ec6382e9d 4527815166ba54ed8ccdb8d8a8f018fa2b1108fb7d4bd3e613de10af6da92edd +EXPORTER_SECRET 12856aaea005a48273b72b246c4da7bc3c7cca92a0fb5498d37f992ec6382e9d 47a86634378ad5e9680dbdcce8cad3998717fa4817b26d66d361b3091d4ccc2d +CLIENT_TRAFFIC_SECRET_0 b7bedbfdb78b9ca1148c510503ce1c72c98fb9cbe59e3ff5a870151293bc4f91 217b061af2bf9f79ccdab6bf0e2f016df2182ec57e99f8f17dbd214c57082bba +SERVER_TRAFFIC_SECRET_0 b7bedbfdb78b9ca1148c510503ce1c72c98fb9cbe59e3ff5a870151293bc4f91 769a19cf3f3868fc758c02d09771aefb7902cc817dbd6bbf97447b8f05564cd6 +EXPORTER_SECRET b7bedbfdb78b9ca1148c510503ce1c72c98fb9cbe59e3ff5a870151293bc4f91 d7fdb1c9a599fdfdc30467244ff9c3a14974134ef3cf3ff731de4729210d5738 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e1b1b65032a4ce6b5ff9d5b11cdd8a573350db732fb99dcbded173ecec58fa24 4fa3dc35f8eacaf317083b72157b1380ccb9e12622de1134058037736a22d938 +SERVER_HANDSHAKE_TRAFFIC_SECRET e1b1b65032a4ce6b5ff9d5b11cdd8a573350db732fb99dcbded173ecec58fa24 6f70fd5323fafdec9f2bc1111ba7917570a3a481334e7eb3d3b02e96749745c2 +CLIENT_TRAFFIC_SECRET_0 e1b1b65032a4ce6b5ff9d5b11cdd8a573350db732fb99dcbded173ecec58fa24 86b32850b2d761519019eb9b917dcb51cbd06d73760539829cb14f32c3fa53ee +SERVER_TRAFFIC_SECRET_0 e1b1b65032a4ce6b5ff9d5b11cdd8a573350db732fb99dcbded173ecec58fa24 79b41503556d6edecd2a9236e08d877842a54afd05a16f5ca3c49cfd44183e26 +EXPORTER_SECRET e1b1b65032a4ce6b5ff9d5b11cdd8a573350db732fb99dcbded173ecec58fa24 3866b378585e9f593812c5fbc8e3e51eef0dd778574186b902a831ba25d1f125 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 03edd929a11ce2ceec35a819d87ffaddee420b37a4cf811df737381c4466bc0f be3e63c44f57df03c5134451cd518b28860c4d32c3b50333ccc60f10a8a53056 +SERVER_HANDSHAKE_TRAFFIC_SECRET 03edd929a11ce2ceec35a819d87ffaddee420b37a4cf811df737381c4466bc0f 395517d8f9468b6c9e97fbf829be21f8aed40179f2b16cab94d2f915edd69e64 +CLIENT_TRAFFIC_SECRET_0 03edd929a11ce2ceec35a819d87ffaddee420b37a4cf811df737381c4466bc0f 5e5409a24805f6e25efb360fffe504ddc93826f6320a1f8d25977174d93e3c53 +SERVER_TRAFFIC_SECRET_0 03edd929a11ce2ceec35a819d87ffaddee420b37a4cf811df737381c4466bc0f 1745e6ba2099907dcdbb3f2c996de194930b2e40940f0dbae21dabe7060ef4bd +EXPORTER_SECRET 03edd929a11ce2ceec35a819d87ffaddee420b37a4cf811df737381c4466bc0f e48b6b2a3c0da1f4e7f1e46270366bb70d29ca625e20b1e8486028975380c398 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e79ff1d397977341993abf4b51dcb037a8aa51e442a039b1394c5a1ba75131d2 ccd5e509b02993c6a065a91b5da276f66232b160fbc7262502f77960b02a8957 +SERVER_HANDSHAKE_TRAFFIC_SECRET e79ff1d397977341993abf4b51dcb037a8aa51e442a039b1394c5a1ba75131d2 1e88611c661c8226c9dd579c28fa1cda5432b915285924b497d0d874e7205d39 +CLIENT_TRAFFIC_SECRET_0 e79ff1d397977341993abf4b51dcb037a8aa51e442a039b1394c5a1ba75131d2 fbcc131c4712e4e4448e8223ab96d995dd4daa986169650c34aa30fba632e5c9 +SERVER_TRAFFIC_SECRET_0 e79ff1d397977341993abf4b51dcb037a8aa51e442a039b1394c5a1ba75131d2 f1e9fbc1e5d40333c405215f1dac4b70c68f3f7d76ced66205c7de395f866059 +EXPORTER_SECRET e79ff1d397977341993abf4b51dcb037a8aa51e442a039b1394c5a1ba75131d2 1265852b9b9db8a5bc42976d3a44c7b9042ebcf17459191be3da30c7d88caf65 +CLIENT_HANDSHAKE_TRAFFIC_SECRET a82f041b5e4b61137c6bdb89992f24781e24e1d7e95d1f69298f892b96a533b0 0047b59bb04dafae7ba05be03ebe2859ec5cbdd78c54435f29db623e0c017710 +SERVER_HANDSHAKE_TRAFFIC_SECRET a82f041b5e4b61137c6bdb89992f24781e24e1d7e95d1f69298f892b96a533b0 6b77102c4f1954a32b4be232a0c24004d74c2fc5b1eec828e324376607e5380b +CLIENT_HANDSHAKE_TRAFFIC_SECRET d8cb130c44c0e1b9fda29b3ff28b73025ff8ad4119e7d73961ede4f7f33b2398 88d212ea77be15fee674377e006ba98365cc2cd0be4ff192e4e853a327c9a5c7 +SERVER_HANDSHAKE_TRAFFIC_SECRET d8cb130c44c0e1b9fda29b3ff28b73025ff8ad4119e7d73961ede4f7f33b2398 44ea2fd4abceccc497a7a1d244b9b830ae7a2f89a3cadd6455350f0a7460110d +CLIENT_HANDSHAKE_TRAFFIC_SECRET a8be5f289d4c926fc1b1891151532f15c7f438caf5e09f54b4450c443ab474f3 e2aeb5c8463a70565378a7c9888ce2051bc9a58b817ba1682ddb844004a537e7 +SERVER_HANDSHAKE_TRAFFIC_SECRET a8be5f289d4c926fc1b1891151532f15c7f438caf5e09f54b4450c443ab474f3 3bc2f5f1d04ad282fbd8991620cf6dccaefc0025703c4838e381d148e8ee0b7e +CLIENT_TRAFFIC_SECRET_0 a8be5f289d4c926fc1b1891151532f15c7f438caf5e09f54b4450c443ab474f3 ebbf4dd745107a0426cf033fe7cac4cbae2e05f3b292040e46d21ad546f0a864 +SERVER_TRAFFIC_SECRET_0 a8be5f289d4c926fc1b1891151532f15c7f438caf5e09f54b4450c443ab474f3 64b358f5085e7af6c389c71e601d5fc81ca5aeb3fc2cbdaa19001238f164ed09 +EXPORTER_SECRET a8be5f289d4c926fc1b1891151532f15c7f438caf5e09f54b4450c443ab474f3 775e732498552bd1f6b862f0aea4950fc2395ae3ccdd0a8dcf5574103d499459 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d40acab372cf8c8f29f2c1711e284e8f6458146b695ab6e82e0ff229fe59dc0c 89e3e142ef2d1e9bc15f089307f96d746451be5628c08cd2d8775dcb843e4510 +SERVER_HANDSHAKE_TRAFFIC_SECRET d40acab372cf8c8f29f2c1711e284e8f6458146b695ab6e82e0ff229fe59dc0c 796ab64a0c016fef67698ea7ad8797d047a777d1779104f35d4ec372643f55c6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 22170e1f6e69ef622c7f604c9a4dbde6d913fc6ca6d673f5197e66e07a79e784 a612ef9d13897396628f650b1343fc0ba4f1364f7ab100d2160ee1b01101d9d4 +SERVER_HANDSHAKE_TRAFFIC_SECRET 22170e1f6e69ef622c7f604c9a4dbde6d913fc6ca6d673f5197e66e07a79e784 c27e65470fc96f6751af243e767955443b1232e80e0ae2c8285e09df597bb71c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 818954153bb9e74ea134264f27051c7dd85c9d4f5e9fa1e627adecd7ba3c2df7 28e15949f909e20cb6efe45969c80bed8633d8969ad6eee1cd61f294707255dc +SERVER_HANDSHAKE_TRAFFIC_SECRET 818954153bb9e74ea134264f27051c7dd85c9d4f5e9fa1e627adecd7ba3c2df7 db66d206fd496f5d651484652f4ab55c912c518dc6d404ddb1ad510fddb37109 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8fb0ec8e45b34c14b0f79704618d37df67e6c350abdacd1dc4e1ece1d4261169 e340e2fe94175c2d581578a6d5febfe019575a44d9e2c8d5608510f0f5c51411 +SERVER_HANDSHAKE_TRAFFIC_SECRET 8fb0ec8e45b34c14b0f79704618d37df67e6c350abdacd1dc4e1ece1d4261169 14c95ff602689aeb942b5d54cb09ea3ef05232bacec0eb95fc94be1cf7508ca8 +CLIENT_TRAFFIC_SECRET_0 a82f041b5e4b61137c6bdb89992f24781e24e1d7e95d1f69298f892b96a533b0 9e222d80c114df8506e573c45931bea5529563dceedd0d0e103822a5bd7856db +SERVER_TRAFFIC_SECRET_0 a82f041b5e4b61137c6bdb89992f24781e24e1d7e95d1f69298f892b96a533b0 cb300200b8ee636aac227049add333f3290219f7ca2eb1316baf074ad243ab47 +EXPORTER_SECRET a82f041b5e4b61137c6bdb89992f24781e24e1d7e95d1f69298f892b96a533b0 3f26ec0fd25909322e5d41c1140507fc24d25f4a1d869753ffeb338736ee4250 +CLIENT_TRAFFIC_SECRET_0 8fb0ec8e45b34c14b0f79704618d37df67e6c350abdacd1dc4e1ece1d4261169 5a6b9250d32a96dd0806790f957e1f536ab55458a8863e58f3abc65b4e2499b3 +SERVER_TRAFFIC_SECRET_0 8fb0ec8e45b34c14b0f79704618d37df67e6c350abdacd1dc4e1ece1d4261169 49fac66ffbfb1232432ecf817e5cbae1acf03047e9f1e92ca4fbbb164eed9617 +EXPORTER_SECRET 8fb0ec8e45b34c14b0f79704618d37df67e6c350abdacd1dc4e1ece1d4261169 bcad989eb92d1a8f3ca26d9bfbc926efef210115af209289d56f03f5128fda5e +CLIENT_TRAFFIC_SECRET_0 d8cb130c44c0e1b9fda29b3ff28b73025ff8ad4119e7d73961ede4f7f33b2398 3fde529088b849b9aa181d2b4290bf9f2784ae664289d58eec1c93b292848c05 +SERVER_TRAFFIC_SECRET_0 d8cb130c44c0e1b9fda29b3ff28b73025ff8ad4119e7d73961ede4f7f33b2398 b4f48142f691a216cc8f2d9a8a025b78258cbd4f380cfc0669b793e2b16b7206 +EXPORTER_SECRET d8cb130c44c0e1b9fda29b3ff28b73025ff8ad4119e7d73961ede4f7f33b2398 419430a4624699221fda2a24ad57c1ef1c11909bd5ddfc0ba8a4089caf7ae273 +CLIENT_TRAFFIC_SECRET_0 d40acab372cf8c8f29f2c1711e284e8f6458146b695ab6e82e0ff229fe59dc0c 857030b2bcfe78e2f0f1b020ab86389848cd4861c2003f8068b03db04f0701ec +SERVER_TRAFFIC_SECRET_0 d40acab372cf8c8f29f2c1711e284e8f6458146b695ab6e82e0ff229fe59dc0c 6ed6a5bae61775bf344190dce45d4ae8a5b374e54fc5265ef24e5918de34224a +EXPORTER_SECRET d40acab372cf8c8f29f2c1711e284e8f6458146b695ab6e82e0ff229fe59dc0c 6f9e448fb9d88dd2e021aed40dec14924b5aa97e5efd0a467aa824673f4553d4 +CLIENT_TRAFFIC_SECRET_0 818954153bb9e74ea134264f27051c7dd85c9d4f5e9fa1e627adecd7ba3c2df7 d70abbbed4f028841cf9c574a17613b589858f8ebcfad6aa897eadf243c1a0ae +SERVER_TRAFFIC_SECRET_0 818954153bb9e74ea134264f27051c7dd85c9d4f5e9fa1e627adecd7ba3c2df7 9b36af8a7a227008532047f5b89e18843dfd001cff1266d2ee7fcbb64b8061dd +EXPORTER_SECRET 818954153bb9e74ea134264f27051c7dd85c9d4f5e9fa1e627adecd7ba3c2df7 9fb8ba8850625fcb349c7ee930b003a771c0857c5e842052688a716332ddfb1c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 20365b052b1fe689f1ded8b324578d62b8c185415cf3a48975d27ee901648e23 ac5a2b1e04aca9707c7800723b660fe9d67ceb1d503fe76f638b6f0b6f79f3d7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 20365b052b1fe689f1ded8b324578d62b8c185415cf3a48975d27ee901648e23 da987c762333435c2d348ff24a242ad5007f01717f0fdd9d1a8fe635666b57c0 +CLIENT_TRAFFIC_SECRET_0 22170e1f6e69ef622c7f604c9a4dbde6d913fc6ca6d673f5197e66e07a79e784 a9b16f22ea7d3227741a3dad6ca21279012523a2685752d2cac732fb8e49635d +SERVER_TRAFFIC_SECRET_0 22170e1f6e69ef622c7f604c9a4dbde6d913fc6ca6d673f5197e66e07a79e784 d5e4902d6a0003972d16e9a389e343ecfe2efef3dc8e7c9cf4f0c25c5445c657 +EXPORTER_SECRET 22170e1f6e69ef622c7f604c9a4dbde6d913fc6ca6d673f5197e66e07a79e784 ce26f71372bc5dc37c295487c19a2bb0839d7d2917690eb4bbc99c446065cabb +CLIENT_HANDSHAKE_TRAFFIC_SECRET c0f76b284abc76d14ce8a20172bf39d1f670ac64f1000d4d8942d8b70bebc3db 38886a057ce3e6d74e1a8ea2212881a44faf2c5086c0ef34dced0d5d3192bb64 +SERVER_HANDSHAKE_TRAFFIC_SECRET c0f76b284abc76d14ce8a20172bf39d1f670ac64f1000d4d8942d8b70bebc3db 606972f2cfa794235352de8566351aeefa6b0309bff2941a6d2963e60574b896 +CLIENT_TRAFFIC_SECRET_0 20365b052b1fe689f1ded8b324578d62b8c185415cf3a48975d27ee901648e23 8444dbaf0874a964d0fc457de0e137cb7edeb0017d7d7703e939cea064226fdd +SERVER_TRAFFIC_SECRET_0 20365b052b1fe689f1ded8b324578d62b8c185415cf3a48975d27ee901648e23 08ef7bfa302b6ca9134c8de41a2b57249f478d230ea1bd87e10011b889d71a79 +EXPORTER_SECRET 20365b052b1fe689f1ded8b324578d62b8c185415cf3a48975d27ee901648e23 3601938d716018781ddee314fa7e34006a4f0d540566451a298c27acc8323034 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 79815aa65712a7524c782c467d091707af4ddb101e97c44e6b454d89e29a2627 d56d8867d62d86f24094a011c6c2e10b03a1b0e24f9d076e39d3dcbe116353f9 +SERVER_HANDSHAKE_TRAFFIC_SECRET 79815aa65712a7524c782c467d091707af4ddb101e97c44e6b454d89e29a2627 e7dfcf9dfaf759a68f346db6a21debe0fdec76670cd59ef8e84fe196f4d2eb37 +CLIENT_TRAFFIC_SECRET_0 79815aa65712a7524c782c467d091707af4ddb101e97c44e6b454d89e29a2627 4cb4dc13b2e1bba6cc1a6e763d757d7790d62569ecaa96a22409a8b20e064621 +SERVER_TRAFFIC_SECRET_0 79815aa65712a7524c782c467d091707af4ddb101e97c44e6b454d89e29a2627 1e656d1997a23c9d9ca1f88cf0e9dc45a736e8ca2c58a7a93d0bc899cc4644f5 +EXPORTER_SECRET 79815aa65712a7524c782c467d091707af4ddb101e97c44e6b454d89e29a2627 5395f3fa181e932b79f89c4f194bbb4bc992eb3fff0700b3db051d3f8af44453 +CLIENT_TRAFFIC_SECRET_0 c0f76b284abc76d14ce8a20172bf39d1f670ac64f1000d4d8942d8b70bebc3db 5373c8559fd88f772c44118eac70190e3cdb40d870ddfcc28ad935366871eab1 +SERVER_TRAFFIC_SECRET_0 c0f76b284abc76d14ce8a20172bf39d1f670ac64f1000d4d8942d8b70bebc3db c16ab6a4dd8b80d127851aedc1860d27ac8a92bd25eff67d5c13ab587df04ffc +EXPORTER_SECRET c0f76b284abc76d14ce8a20172bf39d1f670ac64f1000d4d8942d8b70bebc3db 03a5ccbb6b93216fc3a4d1f03d88e0489655d792d0ee1157f2d08d64ed40e852 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e40cadf9daa054dd8f997ad650f65c96e7fb25de15d32b28a543045eb7448576 f29456850487cc99b4fc4cb636ee6304489d4056860edb7c30ad365df3e49cb0 +SERVER_HANDSHAKE_TRAFFIC_SECRET e40cadf9daa054dd8f997ad650f65c96e7fb25de15d32b28a543045eb7448576 91ac936f2e7ea5640ed932427c36ca8ec3873ee551d75f2e2a42d5d928df54a1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 386dcce4a999db187f483000c80ee0ab394c7e65cffe8e91eed10c154482b5a1 dd44b04bf63fea30714a67f838357503936a4b576b9ba3d1bace2c499b03a19b +SERVER_HANDSHAKE_TRAFFIC_SECRET 386dcce4a999db187f483000c80ee0ab394c7e65cffe8e91eed10c154482b5a1 2a444f0c800280c38bed7e6181b40a1df10ad6713c121644be1e1d2ea034caaf +CLIENT_TRAFFIC_SECRET_0 e40cadf9daa054dd8f997ad650f65c96e7fb25de15d32b28a543045eb7448576 c4c9978a56eda59505c6755f2bd608bb002ff7e90a9727ad5fe7e6d6f9a73a49 +SERVER_TRAFFIC_SECRET_0 e40cadf9daa054dd8f997ad650f65c96e7fb25de15d32b28a543045eb7448576 c4cdf0f3dc6571357670f33dec6c0de809267965dbed65b5f87e219e37ea3331 +EXPORTER_SECRET e40cadf9daa054dd8f997ad650f65c96e7fb25de15d32b28a543045eb7448576 44c3adba49611cbdc525beecba62f8b871766fdf54377f8db4cec31764969ad3 +CLIENT_TRAFFIC_SECRET_0 386dcce4a999db187f483000c80ee0ab394c7e65cffe8e91eed10c154482b5a1 9ae951bfc12e69af5aabdcbb7b1456a72f295279fcc4ab03fad430cbd30fd501 +SERVER_TRAFFIC_SECRET_0 386dcce4a999db187f483000c80ee0ab394c7e65cffe8e91eed10c154482b5a1 5a77ecd9193dd907968dd1d04681d775b9dad0775b766e674b4e5e0d7b347e82 +EXPORTER_SECRET 386dcce4a999db187f483000c80ee0ab394c7e65cffe8e91eed10c154482b5a1 a4227995ed07685ee15506a41247e0ccbc3f03720225c8978e30aa7a5efa7d93 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 272ddb586fb94d37a0b8790809e1d50dd61566d26d2dcc39309bad87a5a930e9 b084039315e51954153d5231a83cb1de9949a0ca2ee0f979e09c4bb7f1b4773d +SERVER_HANDSHAKE_TRAFFIC_SECRET 272ddb586fb94d37a0b8790809e1d50dd61566d26d2dcc39309bad87a5a930e9 0ed457fa41aec264759f043969a7b69c312a0b519427439bc9585f5fc4b0be99 +CLIENT_TRAFFIC_SECRET_0 272ddb586fb94d37a0b8790809e1d50dd61566d26d2dcc39309bad87a5a930e9 bfb87c7ce16a7bc29ba0f5238efdaf65d77763b7666e00ff0fa20b887b372058 +SERVER_TRAFFIC_SECRET_0 272ddb586fb94d37a0b8790809e1d50dd61566d26d2dcc39309bad87a5a930e9 6876737d097119a40ce8b05119990f2e4b3322d2565f95e0f6c21cb666eb971f +EXPORTER_SECRET 272ddb586fb94d37a0b8790809e1d50dd61566d26d2dcc39309bad87a5a930e9 4c7fbf7f0ba263c7f0c3f04dc2bc26d421ec0ef07b20dc53a594e71b22cef833 +CLIENT_HANDSHAKE_TRAFFIC_SECRET c21d10171d8ff7e2996c54a8d1d708b7ba130cfeb0a67d9dab794262ea6b787d eae34b6c9b28e21b7eea3e13e5036e4483ba915f859eeeba355a64891a2bef07 +SERVER_HANDSHAKE_TRAFFIC_SECRET c21d10171d8ff7e2996c54a8d1d708b7ba130cfeb0a67d9dab794262ea6b787d 8c3b1591843ca6c397dd96bae9da69ff4b85047485685168d3e21b8956e6cf1c +CLIENT_TRAFFIC_SECRET_0 c21d10171d8ff7e2996c54a8d1d708b7ba130cfeb0a67d9dab794262ea6b787d 3e76a54cf0bfef84fba466a4ffd19a08340e37a8d638f9a79d1133ffd08f6b1c +SERVER_TRAFFIC_SECRET_0 c21d10171d8ff7e2996c54a8d1d708b7ba130cfeb0a67d9dab794262ea6b787d aa6b557090dcedca2a0dd4fea07606a526e3aaf5583b86c04e4bbdd37290e115 +EXPORTER_SECRET c21d10171d8ff7e2996c54a8d1d708b7ba130cfeb0a67d9dab794262ea6b787d 844d616061676110b8c5ad6402ab516e4ec8ff19b54f7e9e03c32791e160ed6a +CLIENT_HANDSHAKE_TRAFFIC_SECRET b652c654076ea6cf737f9d32022064d48ddff51805bdcad5e03ed0f86df9f144 d5d5990636ed30ef768812cc5278725b388a8d5d644c7d0521b85bcd3b61e149 +SERVER_HANDSHAKE_TRAFFIC_SECRET b652c654076ea6cf737f9d32022064d48ddff51805bdcad5e03ed0f86df9f144 b0fb4801086267af262bee4f864ffba3f87e69c1d766bcf06c37df18d0a5cb95 +CLIENT_TRAFFIC_SECRET_0 b652c654076ea6cf737f9d32022064d48ddff51805bdcad5e03ed0f86df9f144 b64ed92f35b825e317e1104da6107340c9bd3f370db60e5fa85ef6c5e0458d5f +SERVER_TRAFFIC_SECRET_0 b652c654076ea6cf737f9d32022064d48ddff51805bdcad5e03ed0f86df9f144 383d0e0944834b3abbd5b008c1fd853b2223d84feaea675fd33c5066f36b1ac1 +EXPORTER_SECRET b652c654076ea6cf737f9d32022064d48ddff51805bdcad5e03ed0f86df9f144 922f7ce238eaf33c85781b44aee6671861d500eeceb476a2c0d58983eb5f3cd2 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 80facf7120365dc9f85cbfe6c8a94ed7e7edac478471bd9c5629fb5797e25ce2 5717e60e81cd669fa529d8e63fad95bfcd5c0a18f11522ccd6966e7be2829cf0 +SERVER_HANDSHAKE_TRAFFIC_SECRET 80facf7120365dc9f85cbfe6c8a94ed7e7edac478471bd9c5629fb5797e25ce2 d343a0302d7d19d66d8261146d77ff519e654fc0ad615206d8b96f8a6faa4654 +CLIENT_TRAFFIC_SECRET_0 80facf7120365dc9f85cbfe6c8a94ed7e7edac478471bd9c5629fb5797e25ce2 915fd1558c9e77e3d931117d281a49f020f34ac25fe1d8937e51ad163d0d4a56 +SERVER_TRAFFIC_SECRET_0 80facf7120365dc9f85cbfe6c8a94ed7e7edac478471bd9c5629fb5797e25ce2 d9f3f87d23284415fb2b7ea827f7c276ab8288230d9df66e4cbc2072b516645e +EXPORTER_SECRET 80facf7120365dc9f85cbfe6c8a94ed7e7edac478471bd9c5629fb5797e25ce2 c17e162527d982388f818a0847061072ec242c6c75114272be4ea1a29b5f77a6 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 463c0e4e9a61b4aee3818e234395c97ee19e5c0c14a34c484cb30dcf856a4726 d421dfb3a3666d0250d3b605c53a8ddfe82746595550ab171e71b538d1e37910 +SERVER_HANDSHAKE_TRAFFIC_SECRET 463c0e4e9a61b4aee3818e234395c97ee19e5c0c14a34c484cb30dcf856a4726 423cc3b61462f4510d38928d79ae6853f16c6d1d6dfcdfc7444dd450f5e7ad21 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 2cf2650470df5e861a11ef69e74ea79cff8dfb737cea5eed9515e89a6b1fddea e9647455ae6b4eceb5afaad260741d12052abbe3d1a5b040fa2616399b8e3c98 +SERVER_HANDSHAKE_TRAFFIC_SECRET 2cf2650470df5e861a11ef69e74ea79cff8dfb737cea5eed9515e89a6b1fddea 32d3ada85a45192fc85838bbfa0b054ca2e2d45a716d6ab6cca7acf5725137a2 +CLIENT_TRAFFIC_SECRET_0 2cf2650470df5e861a11ef69e74ea79cff8dfb737cea5eed9515e89a6b1fddea f61b4ced94d84899c16dcc62a2607d145c3c6ab4eaeb35b7117ad0102b2f2c5b +SERVER_TRAFFIC_SECRET_0 2cf2650470df5e861a11ef69e74ea79cff8dfb737cea5eed9515e89a6b1fddea 2b5bb9e0be5e4658ef4f8afb4482e4e6bf0baf9cc2aaceabeab01bc91ea0d77c +EXPORTER_SECRET 2cf2650470df5e861a11ef69e74ea79cff8dfb737cea5eed9515e89a6b1fddea fdc27658dea3be879acf14d77f20293af2fcf778042aaf1cda60b2a7a5cca745 +CLIENT_TRAFFIC_SECRET_0 463c0e4e9a61b4aee3818e234395c97ee19e5c0c14a34c484cb30dcf856a4726 436c16b068fb5e35147e1dbb17e3485b7f1dff93ff019407e85d4c37741292dc +SERVER_TRAFFIC_SECRET_0 463c0e4e9a61b4aee3818e234395c97ee19e5c0c14a34c484cb30dcf856a4726 7be2480e9b695a3e0900b987edf0463d12fd5c6c6f262dab9992ca3f75ec0281 +EXPORTER_SECRET 463c0e4e9a61b4aee3818e234395c97ee19e5c0c14a34c484cb30dcf856a4726 5813eae2df258374adfb764d3873067f7bfce556de22eb8ba38b2a2126dc314a +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8c4f3da57821879c198c3c18596c98f049b5ae727815ab48ad70b285c11ae4c7 0ed08fd05c3fb5ddd7eeb426e3109e1b05fe621d68e337dad20e8b0c8c9b6e7b +SERVER_HANDSHAKE_TRAFFIC_SECRET 8c4f3da57821879c198c3c18596c98f049b5ae727815ab48ad70b285c11ae4c7 46efee51c6d9f2f30d683fbe0d11d14104a89c7034084e2d40fa129b029c0f25 +CLIENT_TRAFFIC_SECRET_0 8c4f3da57821879c198c3c18596c98f049b5ae727815ab48ad70b285c11ae4c7 74cabe40a8e7872fec0f982725208869b66428fea7346452f9189cef417fa433 +SERVER_TRAFFIC_SECRET_0 8c4f3da57821879c198c3c18596c98f049b5ae727815ab48ad70b285c11ae4c7 4ba2b84cac3cc46171d702847351b7b3492a221a0adc132677d35e6ab9c86958 +EXPORTER_SECRET 8c4f3da57821879c198c3c18596c98f049b5ae727815ab48ad70b285c11ae4c7 affb584c8d7f9846f5d70902e7124266292f2ce90656d2e45ae5da35de080b70 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 84f75200d772a1b9edd2ec53bc115e86a20eb0b1aa510348eae73efa0135f555 02dcfb6c57bb57b4d0481d8984cb6827fecac41a009bd62781298e3c6cc7a4ad +SERVER_HANDSHAKE_TRAFFIC_SECRET 84f75200d772a1b9edd2ec53bc115e86a20eb0b1aa510348eae73efa0135f555 753b154c85edf5421da0070cf66f25a82f0af00452f382a8f4784d3b8073414a +CLIENT_TRAFFIC_SECRET_0 84f75200d772a1b9edd2ec53bc115e86a20eb0b1aa510348eae73efa0135f555 41512805c23468ec190953d18c994f181a638e62c6c6032e5b1008083caf7bf6 +SERVER_TRAFFIC_SECRET_0 84f75200d772a1b9edd2ec53bc115e86a20eb0b1aa510348eae73efa0135f555 51e7990f146d1bf0170365b4f2d029e4e5f0999b9bf9cae663ffcbc6b140462b +EXPORTER_SECRET 84f75200d772a1b9edd2ec53bc115e86a20eb0b1aa510348eae73efa0135f555 e99ab26f58bd65d4adc095597a4770ac8614a99f4c8453bd0bcc675a235e3254 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8fb249094d9d7d949af534df2558d614e90e8ea07dc6d5d711bde9b5bf91ea3b 4a5d1ff61a71547589a6e67879830c5a2a36a2e483dd2ae1a818f27e90639ac4 +SERVER_HANDSHAKE_TRAFFIC_SECRET 8fb249094d9d7d949af534df2558d614e90e8ea07dc6d5d711bde9b5bf91ea3b b054bba88afcd84771e71c34b72169ffbf08623ead79584c98629180d36a78db +CLIENT_TRAFFIC_SECRET_0 8fb249094d9d7d949af534df2558d614e90e8ea07dc6d5d711bde9b5bf91ea3b 14222802d86fd27193bb150f3b3c9d0433b14d6d9c67f8541d624195f11d3f36 +SERVER_TRAFFIC_SECRET_0 8fb249094d9d7d949af534df2558d614e90e8ea07dc6d5d711bde9b5bf91ea3b cfdb6fabc1afe8acafb26bb60dacf385f5db8783f27157c446cdeb226dacf23b +EXPORTER_SECRET 8fb249094d9d7d949af534df2558d614e90e8ea07dc6d5d711bde9b5bf91ea3b 0a7ad173b5f1fc236827f3d7d92b9172b23fc8557a2f9723399b9164ad1a5b58 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 59de9df98cf4bf9e2d1a0c5964ff34275f7d71ff5c50677c90a9b8a229886636 a7b221c79183912cb7d2b41d49e3533cdcb063b8c9d84403fcd8ebc6848f6c15 +SERVER_HANDSHAKE_TRAFFIC_SECRET 59de9df98cf4bf9e2d1a0c5964ff34275f7d71ff5c50677c90a9b8a229886636 c941472de45c06590cfe4de6960a694f3dbc8e3ba89deac56ad4c2055ee51103 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 4c0eff89303e3c0f408754537416f994e4753a4473b3115dff6a72102562e9c9 af831876fbf7b33a9e4b2839c9d8df736551ab33c43a88665d455487d3bb321d +SERVER_HANDSHAKE_TRAFFIC_SECRET 4c0eff89303e3c0f408754537416f994e4753a4473b3115dff6a72102562e9c9 d73a147b32a2811c72afe459e420e28db21505669b309e077db95e73afb9f062 +CLIENT_HANDSHAKE_TRAFFIC_SECRET ed121356a4da1d48a51c1de596acc26e48030da704501c4485ef8cf16cc3ff91 d18bb781b9e6691c49004e6a5f940cf1527348a80bb8d7f0bff905cd5c8e8d51 +SERVER_HANDSHAKE_TRAFFIC_SECRET ed121356a4da1d48a51c1de596acc26e48030da704501c4485ef8cf16cc3ff91 882ee777dae5b5205ddf9cf9662a9b893e81b127a5d37b404c8e9137baee27df +CLIENT_TRAFFIC_SECRET_0 4c0eff89303e3c0f408754537416f994e4753a4473b3115dff6a72102562e9c9 df4da77e8967d2c2ae93316e7e4a9370b3e18a2b1c58e32bedafb850beba7d92 +SERVER_TRAFFIC_SECRET_0 4c0eff89303e3c0f408754537416f994e4753a4473b3115dff6a72102562e9c9 ca00d01678eedafe04b02275bed91d8f1cfb04d4022148bc2bda69277dee8d9a +EXPORTER_SECRET 4c0eff89303e3c0f408754537416f994e4753a4473b3115dff6a72102562e9c9 866c8a86cc4867eca0fdd430e5e012ebc52c695ce3cd198b8770b55ee8d12b63 +CLIENT_TRAFFIC_SECRET_0 59de9df98cf4bf9e2d1a0c5964ff34275f7d71ff5c50677c90a9b8a229886636 bcf035c22e4a13ec6d28a35d51fa07b6cfe2ab37d9be6a6aa65064ed266dc455 +SERVER_TRAFFIC_SECRET_0 59de9df98cf4bf9e2d1a0c5964ff34275f7d71ff5c50677c90a9b8a229886636 49cecb44fe4b037de69568736746913772b5458bb4b7c6c72d90028b568f72a5 +EXPORTER_SECRET 59de9df98cf4bf9e2d1a0c5964ff34275f7d71ff5c50677c90a9b8a229886636 fe4c0bd1496d27b9918b51fe239cadbb62a261955150d278ff75fa1677abdd0b +CLIENT_TRAFFIC_SECRET_0 ed121356a4da1d48a51c1de596acc26e48030da704501c4485ef8cf16cc3ff91 bfaf5849cc84ed00455f6ff330651b05dd2063cbd14eaef06087c080a02da13b +SERVER_TRAFFIC_SECRET_0 ed121356a4da1d48a51c1de596acc26e48030da704501c4485ef8cf16cc3ff91 ef62c61680d49dc6748a522c687dbf2a7bd4365b5ead7813b3ab66570c80bbea +EXPORTER_SECRET ed121356a4da1d48a51c1de596acc26e48030da704501c4485ef8cf16cc3ff91 e77ad3ee8dfc81d8d7ca02c21c8f6f23626a088ede25963cb44047150a68cd8c +CLIENT_HANDSHAKE_TRAFFIC_SECRET 28a372a1798de89cc1629820509a412e28b473e7ed4803dbd7b7065c21983fce 097beb893deb5ea0635464123154457bdb932a7b137d5b4579a8f6fcacc688a9 +SERVER_HANDSHAKE_TRAFFIC_SECRET 28a372a1798de89cc1629820509a412e28b473e7ed4803dbd7b7065c21983fce 606f2ca0bf3ea27663a5bbc677ad4e255b8303fde15935a3ea1d54b2d9457099 +CLIENT_TRAFFIC_SECRET_0 28a372a1798de89cc1629820509a412e28b473e7ed4803dbd7b7065c21983fce a1c33c1afdd5ad84f2952afadbb23f8185661a7c3cfade62d9b42721a77d48fb +SERVER_TRAFFIC_SECRET_0 28a372a1798de89cc1629820509a412e28b473e7ed4803dbd7b7065c21983fce 50259d4263250c990582f0ef3fd7913e769751589515f04efb128abd96935f8b +EXPORTER_SECRET 28a372a1798de89cc1629820509a412e28b473e7ed4803dbd7b7065c21983fce 2981d13fbf1636bb7c754653e1c3918a50e4a0f50f060b72f7a547b09d57ad12 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e083128ca077584938a9a8a5bec81617928977da016d7deace2b33b47f5b2e5c 1d711af4aa94be2597ba3f39a92129a24f9d26629821b745b6bff6e58818596a +SERVER_HANDSHAKE_TRAFFIC_SECRET e083128ca077584938a9a8a5bec81617928977da016d7deace2b33b47f5b2e5c 989c6ec2e62157b2f8e6dfb87dd7819ee3c223ec87e8dfda7aa35622d427fb7f +CLIENT_TRAFFIC_SECRET_0 e083128ca077584938a9a8a5bec81617928977da016d7deace2b33b47f5b2e5c fcef72cc9c8cd369427f33d8116d3e9c9653bfbbb3f2aa77a72d7598436180a8 +SERVER_TRAFFIC_SECRET_0 e083128ca077584938a9a8a5bec81617928977da016d7deace2b33b47f5b2e5c ee5e018cea90fa94ab1bf1b6f08da4f4a6662c92211b696c847c68266e4d13df +EXPORTER_SECRET e083128ca077584938a9a8a5bec81617928977da016d7deace2b33b47f5b2e5c ab9248edf06897379bc8f349ed3fbed18ab6d6f405c3fb7182ace9a365bff090 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8e8b270c5ca6b84e9a6d7bad64c1f772e4bddeed34dfa9a60a28b49df79aa079 dc119b645d34f010e32e863aa2e3512723c899df01a1d37749b38a76c85751e5 +SERVER_HANDSHAKE_TRAFFIC_SECRET 8e8b270c5ca6b84e9a6d7bad64c1f772e4bddeed34dfa9a60a28b49df79aa079 a5ab69509e2943bcc49a8c40ae72cec394af7ef3d2e6d3e32f6b37abf8918568 +CLIENT_TRAFFIC_SECRET_0 8e8b270c5ca6b84e9a6d7bad64c1f772e4bddeed34dfa9a60a28b49df79aa079 0ff93d4d436a85e01d9ee439e9ac5f8227bf72009a4eccabb62dffb42f85398b +SERVER_TRAFFIC_SECRET_0 8e8b270c5ca6b84e9a6d7bad64c1f772e4bddeed34dfa9a60a28b49df79aa079 5b581f2fab072efc0c79a0c5e227f6d5283ceefbba115260ec8990188f323388 +EXPORTER_SECRET 8e8b270c5ca6b84e9a6d7bad64c1f772e4bddeed34dfa9a60a28b49df79aa079 a0d0440cd1b8927e1c6651fe509f97eaad3fbbecc064c3788db185a10069bdf5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 33f3315c75117a5a0d5b0deafe4195c85470b50635d9d3dae0d89845504c4745 4c82a66018f0be72f337f1fe28ccbae4ab21b7d9a0abe60b41fe221461949a47 +SERVER_HANDSHAKE_TRAFFIC_SECRET 33f3315c75117a5a0d5b0deafe4195c85470b50635d9d3dae0d89845504c4745 44bbdf072765c97bb30c5b8845fcf29b1837b8906a8b645e020f1c54fde10e20 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 59d0d7438b7ab4b1b08700df501d79e09552b2e10a9267e6e095ad90ee922795 e6266cc88165d6d794823893d718ee814f765b2d1445d53c15b0863ebae2f1ae +SERVER_HANDSHAKE_TRAFFIC_SECRET 59d0d7438b7ab4b1b08700df501d79e09552b2e10a9267e6e095ad90ee922795 cdab5bd60fdf541e4203684037b946fddbb20ff295aef667fb3d3ae2ef16cb81 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 11a9a9131cf2f1dc86ae82d0b29215ffc7e6a0e2cb5a069559649a674ffd5d0e 39096de291a4866e88cbc8d26dd815c3c83f0e4ff235f45a6f421a0ca948634d +SERVER_HANDSHAKE_TRAFFIC_SECRET 11a9a9131cf2f1dc86ae82d0b29215ffc7e6a0e2cb5a069559649a674ffd5d0e 854d756ce9e0cf7b249ee0e93faac2345aa15e123353fce625bca25652fc19c6 +CLIENT_TRAFFIC_SECRET_0 33f3315c75117a5a0d5b0deafe4195c85470b50635d9d3dae0d89845504c4745 c8cd7ca1613010fd4f18ba78d5ad43b1200b719687ade20eed8df0564399f40e +SERVER_TRAFFIC_SECRET_0 33f3315c75117a5a0d5b0deafe4195c85470b50635d9d3dae0d89845504c4745 7f0696d5f8ab375014179cc91e724706fa6f20b927634cf59cfff0b0d80cbe3a +EXPORTER_SECRET 33f3315c75117a5a0d5b0deafe4195c85470b50635d9d3dae0d89845504c4745 61842ea8ed5767b7916cf4bf82905feec391f923aec76dfc918abcd5be87807a +CLIENT_TRAFFIC_SECRET_0 59d0d7438b7ab4b1b08700df501d79e09552b2e10a9267e6e095ad90ee922795 65a789d36a98ad30b1e0e4d6b9e0e211a0357c72a3713cd90ec2d9e714a754ad +SERVER_TRAFFIC_SECRET_0 59d0d7438b7ab4b1b08700df501d79e09552b2e10a9267e6e095ad90ee922795 5e49575847a2381da82a837c56236a9ac6195704c255bdb54ce90e3d3673831d +EXPORTER_SECRET 59d0d7438b7ab4b1b08700df501d79e09552b2e10a9267e6e095ad90ee922795 3ffcf4b227e708dcfa45a0ebb85dabdf907deb57d9c4505b841355343916797a +CLIENT_TRAFFIC_SECRET_0 11a9a9131cf2f1dc86ae82d0b29215ffc7e6a0e2cb5a069559649a674ffd5d0e 2fb15e675a93b0d84fbc239bfc33543a0aca756a41b09d689ebdb4a4058802d6 +SERVER_TRAFFIC_SECRET_0 11a9a9131cf2f1dc86ae82d0b29215ffc7e6a0e2cb5a069559649a674ffd5d0e 40c75c8047faf4597f316fdb29cfba0627ed804653a88e526e4283446d14356a +EXPORTER_SECRET 11a9a9131cf2f1dc86ae82d0b29215ffc7e6a0e2cb5a069559649a674ffd5d0e de7712b4683f8ac6666e050d8ec84b4cc4cf4a54e12dbcf467ff67ac8b18ea68 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 81c0b12745fb6ee36ad467dc6690c952f8183abddd313ddd9146579c57c60b48 035f652fe9e3b95b2cfa0b433063e808c2d1a14e4bd30fbc80f24ac9add83234 +SERVER_HANDSHAKE_TRAFFIC_SECRET 81c0b12745fb6ee36ad467dc6690c952f8183abddd313ddd9146579c57c60b48 748d25fb4462b653eaa0f3697983ce0cdbcd3657989405aded4b576339f035eb +CLIENT_HANDSHAKE_TRAFFIC_SECRET 1b222035ee1badb9fdef42c148b60f5f5db5908856df310eeeb4a7490fdd5825 7650fbaaae168ab1eecbea8270a7d43aa60c133d7226c9deec361f059ced9611 +SERVER_HANDSHAKE_TRAFFIC_SECRET 1b222035ee1badb9fdef42c148b60f5f5db5908856df310eeeb4a7490fdd5825 2485f2572c1f5a25c9ab0d95b958fc12e618ba8cd8d2b9d8896197f8a6072380 +CLIENT_TRAFFIC_SECRET_0 81c0b12745fb6ee36ad467dc6690c952f8183abddd313ddd9146579c57c60b48 59d22a1fe0b15f5891322352b02aae314917e9333b794fe42ec33f6d974f56dc +SERVER_TRAFFIC_SECRET_0 81c0b12745fb6ee36ad467dc6690c952f8183abddd313ddd9146579c57c60b48 5c3ef9e6717f93f44aeee5ef20b94e3f5646d36d079e9d3833db9bf622eae418 +EXPORTER_SECRET 81c0b12745fb6ee36ad467dc6690c952f8183abddd313ddd9146579c57c60b48 111d3180a8d6473f48b80be75a5ccec0c8f434f2f81873e04677ad875e9a69e5 +CLIENT_TRAFFIC_SECRET_0 1b222035ee1badb9fdef42c148b60f5f5db5908856df310eeeb4a7490fdd5825 9f87b7971960394dbaaa503b13fdd16f4fbbaf5fcd1338abc6f82de793f39b1f +SERVER_TRAFFIC_SECRET_0 1b222035ee1badb9fdef42c148b60f5f5db5908856df310eeeb4a7490fdd5825 9349ff270e1ea638124df94d6cc03b08c4d260042a90bbc071bdc6b8305dd3b5 +EXPORTER_SECRET 1b222035ee1badb9fdef42c148b60f5f5db5908856df310eeeb4a7490fdd5825 6f17d5f31bd98d119b5daf6bfa5b179173ad4c3a5da2e23e5b38aeceedfb3e3d +CLIENT_HANDSHAKE_TRAFFIC_SECRET 274439f8adfc9ee0508e2068cc1074e6b5449c5ddd27fc2b8ee4e595d2ec737b 5692d937870d9ce53dd0a6279c3dbf9f8b8cef848c6323c022d589c039f16074 +SERVER_HANDSHAKE_TRAFFIC_SECRET 274439f8adfc9ee0508e2068cc1074e6b5449c5ddd27fc2b8ee4e595d2ec737b f67015a3bbe36f391e3ddd7444a239ab6f053cbfd10c543cb88450f302363f3a +CLIENT_HANDSHAKE_TRAFFIC_SECRET ebbc9fcb99910135440b5302b3f8cc1b14ab8abae6a3839acc1fce72a94bf846 3d339d40a07fed26daeec3af6d081d639751ae6497f32a2a871b87fadb717241 +SERVER_HANDSHAKE_TRAFFIC_SECRET ebbc9fcb99910135440b5302b3f8cc1b14ab8abae6a3839acc1fce72a94bf846 7e9045b71ad207ecb37be89c0fd6c99317291d93ae4f41ff705f3a2f34fd25a5 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 4f53adeba5f115bbbae59f92f9e502b7d07366cd73e6b8f7ec2cb07b9e85719d a964ac1e9784c578214a3a2029018bac44a3d9e581150253370bbbb399576dca +SERVER_HANDSHAKE_TRAFFIC_SECRET 4f53adeba5f115bbbae59f92f9e502b7d07366cd73e6b8f7ec2cb07b9e85719d b1ac6a3e359689456168d348559f6e33f9033c38c6498d21e52f08939aed7288 +CLIENT_HANDSHAKE_TRAFFIC_SECRET dbeb89f7fa24666bcbae4fb8b0df84095c95489da6cca42c825f37b7a7f3ad05 db9d2d68c64b1e6c0d9330ef303a1e025f44c1d91223eccb492e9be0b96a1064 +SERVER_HANDSHAKE_TRAFFIC_SECRET dbeb89f7fa24666bcbae4fb8b0df84095c95489da6cca42c825f37b7a7f3ad05 d74fcc4f80487becb7737f415b81ed8403cf4d8cb7abc03ee0889e57ffed1fae +CLIENT_HANDSHAKE_TRAFFIC_SECRET 4b95b90b0b00c553c3476c0abfeafe93e1a814131a574e32769a14043ca60d91 4a371232307f12982f162fd9900f14d2561d99a6b5b567e98277137fa17d20ea +SERVER_HANDSHAKE_TRAFFIC_SECRET 4b95b90b0b00c553c3476c0abfeafe93e1a814131a574e32769a14043ca60d91 ff14ab36666bbd04f3c97752335cc9a6f063c712cbdb50bf386247a048327932 +CLIENT_TRAFFIC_SECRET_0 4b95b90b0b00c553c3476c0abfeafe93e1a814131a574e32769a14043ca60d91 5caa25149ea4590d1755016c594ff723581e284767a4064278636ad93d647c59 +SERVER_TRAFFIC_SECRET_0 4b95b90b0b00c553c3476c0abfeafe93e1a814131a574e32769a14043ca60d91 88d5b1607ed3c192b974cef12c2dd53a0b0a72f8e5dbbce958b9911f826e7c43 +EXPORTER_SECRET 4b95b90b0b00c553c3476c0abfeafe93e1a814131a574e32769a14043ca60d91 ab5f63862caad4c45c170e6254be1076ccf42094826a8309584877dc13a94a17 +CLIENT_EARLY_TRAFFIC_SECRET aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 5a9121c3e908ea982d99fc1144e227edf3d31446e431a2447bbd054af04ecc22 +EARLY_EXPORTER_SECRET aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 87a0643218316e1d11fcf108612e84a742830d0bd59fa03485fa001cd526b392 +CLIENT_TRAFFIC_SECRET_0 274439f8adfc9ee0508e2068cc1074e6b5449c5ddd27fc2b8ee4e595d2ec737b 7ae5a9be187215b21ed3531e496eaf57fbe295906b9302ba8e415cacf8bb06c3 +SERVER_TRAFFIC_SECRET_0 274439f8adfc9ee0508e2068cc1074e6b5449c5ddd27fc2b8ee4e595d2ec737b dc2656336d237604814a3f45d54ea5e5d6eac58f097a4cc9416a042776a0a1b4 +EXPORTER_SECRET 274439f8adfc9ee0508e2068cc1074e6b5449c5ddd27fc2b8ee4e595d2ec737b 3092575f6286803ab486e7463538755b04cbea1b3df84b637bedd0fc56f46171 +CLIENT_TRAFFIC_SECRET_0 ebbc9fcb99910135440b5302b3f8cc1b14ab8abae6a3839acc1fce72a94bf846 73bf202a81391e7869da232966d6373e901933949bff3e2a91df7dc98070d840 +SERVER_TRAFFIC_SECRET_0 ebbc9fcb99910135440b5302b3f8cc1b14ab8abae6a3839acc1fce72a94bf846 6fcd649d4251695a2e86b07e279329e351909c7225ed74764e60c56297d0658b +EXPORTER_SECRET ebbc9fcb99910135440b5302b3f8cc1b14ab8abae6a3839acc1fce72a94bf846 0003117ab52a6f2502b79b1a99f663d1b09fcacbed0f6ab9b77a2e4d53e2c295 +CLIENT_TRAFFIC_SECRET_0 4f53adeba5f115bbbae59f92f9e502b7d07366cd73e6b8f7ec2cb07b9e85719d 8b0b8c29cb09003b8f431b7c1cffff95b8d795999a4a6990b64929a8d83dc25d +SERVER_TRAFFIC_SECRET_0 4f53adeba5f115bbbae59f92f9e502b7d07366cd73e6b8f7ec2cb07b9e85719d 62c37a377bec0cc55aa074a6766e36e28854e255e04ae3fa44a0ed94efe59d37 +EXPORTER_SECRET 4f53adeba5f115bbbae59f92f9e502b7d07366cd73e6b8f7ec2cb07b9e85719d 452df825d69a93a6e0f9205b6f93494738c04c81f9fd0902506e47f8e57fde66 +CLIENT_HANDSHAKE_TRAFFIC_SECRET aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 458b7601268253791bdc08546b766d991d0d350b997c540a7285fbb806eb9945 +SERVER_HANDSHAKE_TRAFFIC_SECRET aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 e13753a4ca498d3488cfbf8bddf306a63146299ab16f407ea36fe37bb1319095 +CLIENT_TRAFFIC_SECRET_0 aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 09688debb92914fdbf3fe3ef15a9ccfa19afcb1f8b7d3fbb45f9baddb67a338d +SERVER_TRAFFIC_SECRET_0 aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 12be74df788905e045b5460829140942526c3fdf8d4e3540eceb8551e6da3a39 +EXPORTER_SECRET aeb88e9ddf1db90ab99028e41e73b9b74e46e36c89e1f7cca131dc18afe3ced6 f76ee406554856901adab55a4a340b22c1ca68b05137d08cb48ffec25b4874a2 +CLIENT_TRAFFIC_SECRET_0 dbeb89f7fa24666bcbae4fb8b0df84095c95489da6cca42c825f37b7a7f3ad05 01ec06420173f7392722e36a674b137dda4dfa85ae268b4c70b331c5a97293a2 +SERVER_TRAFFIC_SECRET_0 dbeb89f7fa24666bcbae4fb8b0df84095c95489da6cca42c825f37b7a7f3ad05 ed981c5496b372de6d606542c831e028fe5b814cf3070ee8d22ce783f3772a0e +EXPORTER_SECRET dbeb89f7fa24666bcbae4fb8b0df84095c95489da6cca42c825f37b7a7f3ad05 9f2d2c4843c7e5ead20804c0266d9694395ba8e179efe3786336531d005bcac1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 9facc6fd5abee875c8f984102a0a9a1dd410dfb8d193d5de0cca388f6477700d 59853141274b7aecd8277f2992f65c3b688519de1bedd6239e3cb333bd1fe822 +SERVER_HANDSHAKE_TRAFFIC_SECRET 9facc6fd5abee875c8f984102a0a9a1dd410dfb8d193d5de0cca388f6477700d 13b44408f31d7d7707f882f13dbf963cf252aa6408f1570492795300e16d856a +CLIENT_HANDSHAKE_TRAFFIC_SECRET 8f7ff1958480c4e2b97772b79d8c544ed117b4e39cae4a7887f1aad80d45bce5 1240214ed331fb12284412c30059159f4a74fbcab39a4620233fcd3cdc21c020 +SERVER_HANDSHAKE_TRAFFIC_SECRET 8f7ff1958480c4e2b97772b79d8c544ed117b4e39cae4a7887f1aad80d45bce5 d063db4437e499b3c7e31a3c7beb5826834ecd0b2037749f928f098f14d0ffb9 +CLIENT_TRAFFIC_SECRET_0 9facc6fd5abee875c8f984102a0a9a1dd410dfb8d193d5de0cca388f6477700d 4469e0ffd19acad1f5f7ab3de278d032eafad4fe967d7f750c8e03540c6de6ce +SERVER_TRAFFIC_SECRET_0 9facc6fd5abee875c8f984102a0a9a1dd410dfb8d193d5de0cca388f6477700d bdc96e51edb649953d9a92497784af28d13a22773a2e55518c70d08f9ac9cb6a +EXPORTER_SECRET 9facc6fd5abee875c8f984102a0a9a1dd410dfb8d193d5de0cca388f6477700d a694679015dcdba1b6eb635bfe0bf9b260943aa91b6c4d34947c887ba049e33d +CLIENT_HANDSHAKE_TRAFFIC_SECRET 57a080dea073f6349c261fd6ac7d1b3b535ee102941a6d2ebada5d771506ed63 f902a988f434e9afe3f7ef9b5a2ca139865ca58c575b04e0078a0da7025ff9c7 +SERVER_HANDSHAKE_TRAFFIC_SECRET 57a080dea073f6349c261fd6ac7d1b3b535ee102941a6d2ebada5d771506ed63 29aa27f33ca22fe46d4a5528f1b53a668dd55696c87ba944f56d1934d66a7253 +CLIENT_TRAFFIC_SECRET_0 8f7ff1958480c4e2b97772b79d8c544ed117b4e39cae4a7887f1aad80d45bce5 f826bbf290f2587f85db1bf76248bc3b4f8ca8f41ce1daea9b58b2aff8300aa6 +SERVER_TRAFFIC_SECRET_0 8f7ff1958480c4e2b97772b79d8c544ed117b4e39cae4a7887f1aad80d45bce5 1ab7acef9351e140c81f5cf34c9c47fd09ec8b087e5faf6ebb1d49ee05517805 +EXPORTER_SECRET 8f7ff1958480c4e2b97772b79d8c544ed117b4e39cae4a7887f1aad80d45bce5 6dac999e5067af3e347fbbb25db5be681f949562e638ce9c2439a9b7570ebdba +CLIENT_TRAFFIC_SECRET_0 57a080dea073f6349c261fd6ac7d1b3b535ee102941a6d2ebada5d771506ed63 ac7e4f2482a52c7999c4af186f9f37a9c9c89b4cda7a4d00413a53808edde248 +SERVER_TRAFFIC_SECRET_0 57a080dea073f6349c261fd6ac7d1b3b535ee102941a6d2ebada5d771506ed63 94a33301837295d0f2d87d4880cdf1a9892d65ef5a6b824bf7dcbf364a537cef +EXPORTER_SECRET 57a080dea073f6349c261fd6ac7d1b3b535ee102941a6d2ebada5d771506ed63 2ddb75d05ef8a8f932f86d8bc9fef0e4a0266550b58270b5e5f4698accbd855b +CLIENT_RANDOM 1cfc038cd88c8088a38622a53af3b1dc259f89fad2249e76eebafd78f455bb28 a780fa7907aa9e33bbb8f1c00b927a2271b9ebec4bd59c50ea51e2f41d71ad898c7a50b8d2d55d4c85067f801110e84e +CLIENT_RANDOM b72ab5121f1d8de3fdb7cc3503571e9321ce589a6611370b5ab6a100d23d2f92 435ce859d50a4386e62f5f8657ff3b3c7a786a3d305c11edfbc58f311c71ff34b488a29bca5842b2dab35e25cbbc4473 +CLIENT_RANDOM 8ba61121a6e96a30d92652550dc0008830c384529d34082752e4ca4160277164 3c01881996fe01fea11a85d58cd1c1ed46b97bdf8f25d3041e19051732fa7fca309720077002f22174f71a3250a616a7 +CLIENT_RANDOM 91bdd77ca2d672c595d4c7e80f075cb2d50c5d68574aa9660ae8f4929b30d084 bcd1cea96e79b120cbf09a19c124ddf08f6e677a95230db098054d85ff78651324b9c980e99aa9cd82ac1af0bab79447 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 88f983e3762791c6cac83ae7880dca479a47ece26e0731167ffce838e952c234 b95cad54b5b04ee9a64f112279a2d7d050812f355af22c67b1ba786656d0c142 +SERVER_HANDSHAKE_TRAFFIC_SECRET 88f983e3762791c6cac83ae7880dca479a47ece26e0731167ffce838e952c234 f35784f853f75e694befe152643efd00bc9c928a92567ca1f1380d023fcb794e +CLIENT_TRAFFIC_SECRET_0 88f983e3762791c6cac83ae7880dca479a47ece26e0731167ffce838e952c234 6fea67a816307f51ce4e8723affd6e7a7f7aa5bd5f6441392776d6b26d628070 +SERVER_TRAFFIC_SECRET_0 88f983e3762791c6cac83ae7880dca479a47ece26e0731167ffce838e952c234 103921f6e265a1e7630f9942f98c5bb3048e773afb107d03a81efc8723ee7893 +EXPORTER_SECRET 88f983e3762791c6cac83ae7880dca479a47ece26e0731167ffce838e952c234 9e50aa2e98c22ff5e75c11e8f7599e28dc4a4ac8585c5b77983ac9852e7122ff +CLIENT_HANDSHAKE_TRAFFIC_SECRET cb6a0eba142b95f6378025370283c00cd3a0d22a1e81077dec1bdb6da2506664 e3a7830d7e4ad948d6498d6b1c78143f4db41e6888ad12f3e27e58076ae3ac41 +SERVER_HANDSHAKE_TRAFFIC_SECRET cb6a0eba142b95f6378025370283c00cd3a0d22a1e81077dec1bdb6da2506664 56665403d0560f4d1a6a234cc4ff260c105e8020c8326dc61df8bad141e681f3 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 49bba4176cf0325c7b55e20d1adaf4694d5f9ce428da3e0a55693ab10815c28f b552261dfdef790c3342e4da71ba3dd511624b8e01ccd2b0ffa4e08d897211b0 +SERVER_HANDSHAKE_TRAFFIC_SECRET 49bba4176cf0325c7b55e20d1adaf4694d5f9ce428da3e0a55693ab10815c28f 1ce9ff175e34dee9054533f6e7054c99ab2e644c0900870cac3ceb13c59d10fa +CLIENT_TRAFFIC_SECRET_0 cb6a0eba142b95f6378025370283c00cd3a0d22a1e81077dec1bdb6da2506664 ce4e8687c6bcdf4953dad9fd183dad90fbd99fbe3e7f7a9f60b1ea1c43b67057 +SERVER_TRAFFIC_SECRET_0 cb6a0eba142b95f6378025370283c00cd3a0d22a1e81077dec1bdb6da2506664 5c68fde19552ed81e702f64b5ba99895e2ef469925900047b4f3fc1ce6d1bd17 +EXPORTER_SECRET cb6a0eba142b95f6378025370283c00cd3a0d22a1e81077dec1bdb6da2506664 95b54571b6c16bf7467a14b7fe20e211d7a33e11dbacefa3e8e1cbba06be013f +CLIENT_TRAFFIC_SECRET_0 49bba4176cf0325c7b55e20d1adaf4694d5f9ce428da3e0a55693ab10815c28f 0b81a21b603fef44f0e8ca9a13f97f58b08cf2dae4f36c63f86b184ddd90ec4b +SERVER_TRAFFIC_SECRET_0 49bba4176cf0325c7b55e20d1adaf4694d5f9ce428da3e0a55693ab10815c28f b651d5c38e9ca1bc74f6cbbfa888d3081eb46a6b73b6eaccaacd620e2779dbc8 +EXPORTER_SECRET 49bba4176cf0325c7b55e20d1adaf4694d5f9ce428da3e0a55693ab10815c28f c7e6dbf62e4cb0090a616d37c87faea32740111ce08a22f3728c8df8b45d4ec4 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3c4b0e65d3d9ff1f3524beea77ab62bd15194170801fe82538dc6cd89a35f076 a76dd35962685e50a72cc0ecfdbd2d30785269931288bbfe93cf9adb2a50a0c5 +SERVER_HANDSHAKE_TRAFFIC_SECRET 3c4b0e65d3d9ff1f3524beea77ab62bd15194170801fe82538dc6cd89a35f076 d9183a1d15404f04c07718ea1eb4a15d19dfc2c662ae047d7d5b01c506321a99 +CLIENT_TRAFFIC_SECRET_0 3c4b0e65d3d9ff1f3524beea77ab62bd15194170801fe82538dc6cd89a35f076 84238842165eb236d6252965e0fe02ff39a4ef492b22d4870a18a9671e6c0e87 +SERVER_TRAFFIC_SECRET_0 3c4b0e65d3d9ff1f3524beea77ab62bd15194170801fe82538dc6cd89a35f076 c1af98f1f22f1f70091b7f4496449fb99efe1c379a674d72f51ef2baad1bd8ce +EXPORTER_SECRET 3c4b0e65d3d9ff1f3524beea77ab62bd15194170801fe82538dc6cd89a35f076 d744eff6f475657d5526351162d25d8d5cbcb532235c8e3357c2b95169c65631 +CLIENT_HANDSHAKE_TRAFFIC_SECRET e095769b68c15658e017110729355017aec31b7718193d78a27fa30cca7f1714 fa6b1653e6b679c04b1b6197f4fb0a28b5b9e836e6fd7049140ea6cacf6c7d4a +SERVER_HANDSHAKE_TRAFFIC_SECRET e095769b68c15658e017110729355017aec31b7718193d78a27fa30cca7f1714 64538bf07ab8a547f3e6f181ee59dcb528593c476c8539dce9ee1b3fd02a77d7 +CLIENT_TRAFFIC_SECRET_0 e095769b68c15658e017110729355017aec31b7718193d78a27fa30cca7f1714 789b1f53f738132016c58ba2d9c7e058e482f012402222d67b33e92862c66dc2 +SERVER_TRAFFIC_SECRET_0 e095769b68c15658e017110729355017aec31b7718193d78a27fa30cca7f1714 9f5002ba93ec7cd4a6da1d8e12d5cab6f5c986454b2f6262bb9bd6e8dceb7ad0 +EXPORTER_SECRET e095769b68c15658e017110729355017aec31b7718193d78a27fa30cca7f1714 a1473e9d4085374e77509f9e7451f5347ca1f463290b871b3c09f40e43cb62b0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 51401a8ae02a0b04128b57a8b4a5e2938af4a3e2890b5f151bacc6f0a2365cf4 0cefbac5a0ab7dd119ac3dc890341aa2c1694f19c5cb07fd6d72a8d3feba373a +SERVER_HANDSHAKE_TRAFFIC_SECRET 51401a8ae02a0b04128b57a8b4a5e2938af4a3e2890b5f151bacc6f0a2365cf4 f77084ae8160273491454d7255ecf0abe0b04cd11a3be39a4dcdf5c5c2b2d997 +CLIENT_TRAFFIC_SECRET_0 51401a8ae02a0b04128b57a8b4a5e2938af4a3e2890b5f151bacc6f0a2365cf4 ff0a1cf8f5c422c9f7c1e84928e54ddb862c676cb3eea71e6d69b987c693eacc +SERVER_TRAFFIC_SECRET_0 51401a8ae02a0b04128b57a8b4a5e2938af4a3e2890b5f151bacc6f0a2365cf4 158f330cb5db1b7c7ec1789e12b0548317cafc9232b59260961eb61d05864ea3 +EXPORTER_SECRET 51401a8ae02a0b04128b57a8b4a5e2938af4a3e2890b5f151bacc6f0a2365cf4 97d6d9267a07edee2b1ca746019af399e31b59e9d53b6d63e359a9ee52b3855a +# SSL/TLS secrets log file, generated by NSS +SERVER_HANDSHAKE_TRAFFIC_SECRET a725fcb24777076fc44c2d4aa6ff3b15d18b838cc38263d9ceec5430d397ea33 0dc309df450affc1fd42c6f052f300c3c1705b40cc6acd44dc8d8f773714da1bd2020cb14342b72834a51883101969ac +EXPORTER_SECRET a725fcb24777076fc44c2d4aa6ff3b15d18b838cc38263d9ceec5430d397ea33 3e2045608fd3069a8126e556463f92a39592cdda35d86ea4755c4c94371ab024d6fbf1fca3f19c0157b06de1ce7397f3 +SERVER_TRAFFIC_SECRET_0 a725fcb24777076fc44c2d4aa6ff3b15d18b838cc38263d9ceec5430d397ea33 60973b013f2746ef017fd96ad7e5174e9a58a2770c35e1889bd9741db0d395e2500c4a3b50f76fbf55c9bc31911f44c1 +CLIENT_HANDSHAKE_TRAFFIC_SECRET a725fcb24777076fc44c2d4aa6ff3b15d18b838cc38263d9ceec5430d397ea33 3188743c4591df96ad6c9de7e8a56aa18451a727f36d6b89606677bc8a9c0cb23177a4dc8ad6f3cc8f45a2abe4ccf4cb +CLIENT_TRAFFIC_SECRET_0 a725fcb24777076fc44c2d4aa6ff3b15d18b838cc38263d9ceec5430d397ea33 05ca4d1dde337ebf7ba1188364dcd0b43f19e568b569cf3115ebb0b95b19ddccc4160c9f6fc4ce397d4c5f9a74ecbd67 +SERVER_HANDSHAKE_TRAFFIC_SECRET 36cfd7d183d06b4ce0cb4b412d291de56dc9f96d5d061973f089ee52a5f43dba e886d2273b60e8f4e384a9db6dedbea719018c3be005cc081a8704e70ab1a627a143fe463d26c486922b3d3fba069f70 +SERVER_HANDSHAKE_TRAFFIC_SECRET cce7e6dbb1b59136f8c2eda316182bf44ad197aa2c628fa96d7643db640ccb20 f01fe77a73129f22a07c6f2899642348271834945091f02f3c70f01caf7c6c54520b0285ff7dfa8b75e38b982e3005a5 +EXPORTER_SECRET 36cfd7d183d06b4ce0cb4b412d291de56dc9f96d5d061973f089ee52a5f43dba e9d4b16d54c6d993ab0c49110583c277896ed5dad253cc51960e483e9510ad2a359ba35aca9fd1c6d612ac487d5ba96e +SERVER_TRAFFIC_SECRET_0 36cfd7d183d06b4ce0cb4b412d291de56dc9f96d5d061973f089ee52a5f43dba ab7f9aae11c6cd998e3fb23cf16091b0534a3755da388f234cf734cd43b5ae7f62096649cac7547ec413e75585db1940 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 36cfd7d183d06b4ce0cb4b412d291de56dc9f96d5d061973f089ee52a5f43dba c8e037173b139b6f13fa163c18ce6d41f045f4854c60c66df61330d8b6e2b4e66aba8c800a86246fe76e7ed750a674f9 +CLIENT_TRAFFIC_SECRET_0 36cfd7d183d06b4ce0cb4b412d291de56dc9f96d5d061973f089ee52a5f43dba 28f7e7457a540d58482d02df689289fd04bb64ce7d5efb8fed9b208bb2c178b16db550dce6d7a49c8abfa0690c76804b +EXPORTER_SECRET cce7e6dbb1b59136f8c2eda316182bf44ad197aa2c628fa96d7643db640ccb20 ab5455f20ecbce1e284c9c3755073edbd42e82afbdd0c9568926de22494376efe2b621718f45b4a0ac1b2dd5fceb76f7 +SERVER_TRAFFIC_SECRET_0 cce7e6dbb1b59136f8c2eda316182bf44ad197aa2c628fa96d7643db640ccb20 d1c522f77cc88d6e0f1c17b4aaf5dab759c3f8292225f999f547b1a394ae6470dcd043b34037d509cf581fc2d3042055 +CLIENT_HANDSHAKE_TRAFFIC_SECRET cce7e6dbb1b59136f8c2eda316182bf44ad197aa2c628fa96d7643db640ccb20 0939065378015175d0e40f281693f5d2e037bb69d763f885f3e15b2ef23feb05b49e60e7c7c179efb38e303739f1fb6d +CLIENT_TRAFFIC_SECRET_0 cce7e6dbb1b59136f8c2eda316182bf44ad197aa2c628fa96d7643db640ccb20 f5fcbe586cc0e25b02d8fd882d19cb5be38808035856e9b9fbbe3f409529323cbfb89b882b395f670bcc7e117b3130d8 +SERVER_HANDSHAKE_TRAFFIC_SECRET 3f92139bcd7b049de6b721e764ac30c21e84dea6b7638b3a439bc4368a2f8606 3226e24f6905d6cd19a607ba995e24b9e9f52e371c68e7b9e2b5d9d05e23af1efe7f41f0b7595a7a78b7c0af48b5cd32 +EXPORTER_SECRET 3f92139bcd7b049de6b721e764ac30c21e84dea6b7638b3a439bc4368a2f8606 0efacad6dc1a7bc40063fb9813ce6fba44dcecdb8f3acc4bfa35bd36469281c6327a5d54df958d21d5315eaca0b003c4 +SERVER_TRAFFIC_SECRET_0 3f92139bcd7b049de6b721e764ac30c21e84dea6b7638b3a439bc4368a2f8606 4f9723fa36e28233b8a32670aceac04ca341d218fa1593fc850e50fd0ecfd2603e5b03231c0b09c6b25e004dc8438fa2 +CLIENT_HANDSHAKE_TRAFFIC_SECRET 3f92139bcd7b049de6b721e764ac30c21e84dea6b7638b3a439bc4368a2f8606 2f34ca6f189619ea5876d2f12460b9a33a4e05f1167bdfa4d0b0e8f9625fc11a83fe9ef23fbcd24773d449f69caedb40 +CLIENT_TRAFFIC_SECRET_0 3f92139bcd7b049de6b721e764ac30c21e84dea6b7638b3a439bc4368a2f8606 c194186972b7d844d0a4b9c75b9014e702b035fe4ada25ba5c53d554edaed9e46a371a4f493e99811b17b7703fce5258 diff --git a/tlexport/quic/__init__.py b/tlexport/quic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tlexport/quic/quic_decode.py b/tlexport/quic/quic_decode.py new file mode 100644 index 0000000..55f0027 --- /dev/null +++ b/tlexport/quic/quic_decode.py @@ -0,0 +1,27 @@ +from enum import Enum + + +def decode_variable_length_int(variable_integer: bytes) -> int: + v = variable_integer[0] + prefix = v >> 6 + length = 1 << prefix + + v = v & 0x3f + for i in range(1, length): + v = (v << 8) + variable_integer[i] + + return v + + +def get_variable_length_int_length(first_byte_of_variable_int: bytes) -> int: + v = first_byte_of_variable_int[0] + prefix = v >> 6 + length = 1 << prefix + + return length + + +class QuicVersion(Enum): + UNKNOWN = 0 + V1 = 1 + V2 = 2 diff --git a/tlexport/quic/quic_decryptor.py b/tlexport/quic/quic_decryptor.py new file mode 100644 index 0000000..e76fabc --- /dev/null +++ b/tlexport/quic/quic_decryptor.py @@ -0,0 +1,26 @@ +class QuicDecryptor: + def __init__(self, keys, bulk_cipher): + self.keys = keys + self.server_key = keys[0] + self.server_iv = keys[1] + self.client_key = keys[2] + self.client_iv = keys[3] + + self.server_bulk_cipher = bulk_cipher(self.server_key) + self.client_bulk_cipher = bulk_cipher(self.client_key) + + # associated data: Quic Header from first byte up to and including the unprotected Packet Number + def decrypt(self, ciphertext: bytes, packet_number, associated_data: bytes, isserver: bool) -> bytes: + if isserver: + decryptor = self.server_bulk_cipher + iv = self.server_iv + else: + decryptor = self.client_bulk_cipher + iv = self.client_iv + + packet_number = b"\x00" * (len(iv) - len(packet_number)) + packet_number + + nonce = bytes([_a ^ _b for _a, _b in zip(packet_number, iv)]) + print(nonce.hex()) + + return decryptor.decrypt(nonce, ciphertext, associated_data) diff --git a/tlexport/quic/quic_dissector.py b/tlexport/quic/quic_dissector.py new file mode 100644 index 0000000..35e3a8b --- /dev/null +++ b/tlexport/quic/quic_dissector.py @@ -0,0 +1,264 @@ +import struct + +from tlexport.packet import Packet +from tlexport.quic.quic_decode import decode_variable_length_int, get_variable_length_int_length +from tlexport.quic.quic_key_generation import make_hp_mask, make_chacha_hp_mask +from tlexport.quic.quic_packet import LongQuicPacket, ShortQuicPacket, QuicPacketType, QuicHeaderType + + +def byte_xor(byte1, byte2): + result = b"" + for byte1, byte2 in zip(byte1, byte2): + result += (bytes([byte1 ^ byte2])) + return result + + +def byte_and(byte1, byte2): + result = b"" + for byte1, byte2 in zip(byte1, byte2): + result += bytes([byte1 & byte2]) + return result + + +def get_header_type(datagram_data: bytes): + if datagram_data[0] >> 7 & 1 == 1: + return QuicHeaderType.LONG + else: + return QuicHeaderType.SHORT + +def get_packet_type(datagram_data: bytes): + packet_type = (datagram_data[0] & int('00100000', 2)) >> 5 + match packet_type: + case 0x00: + return QuicPacketType.INITIAL + case 0x01 | 0x02: + return QuicPacketType.HANDSHAKE + case 0x03: + return QuicPacketType.RETRY + case _: + return None + + +def remove_header_protection(header_type, sample, first_packet_byte, hp_key, datagram_data, + pn_offset, ciphersuite: bytes) -> tuple: + + if ciphersuite == b'\x13\x03': + mask = make_chacha_hp_mask(hp_key, sample) + else: + mask = make_hp_mask(hp_key, sample) + + if header_type == QuicHeaderType.LONG: + first_packet_byte = byte_xor(bytes([first_packet_byte]), byte_and(bytes([mask[0]]), bytes.fromhex("0f"))) + else: + first_packet_byte = byte_xor(bytes([first_packet_byte]), byte_and(bytes([mask[0]]), bytes.fromhex("1f"))) + + pn_len = decode_variable_length_int( + byte_and(bytes([int.from_bytes(first_packet_byte, "big")]), b"\x03")) + 1 + packet_number_field = byte_xor(datagram_data[pn_offset:pn_offset + pn_len], mask[1: pn_len + 1]) + + return first_packet_byte, packet_number_field, pn_len + + +def extract_quic_packet(in_packet: Packet, isserver, guessed_dcid: bytes = None, keys: {} = None, ciphersuite: bytes = None): + packet_buf = [] + + datagram_data = in_packet.tls_data + try: + + header_type = get_header_type(datagram_data) + + if all(b == b"\x00" for b in datagram_data): # If we have a zero-padding at the end + in_packet.tls_data = b"" + return packet_buf, in_packet + + match header_type: + + case QuicHeaderType.LONG: # if header is long header + + fmt_string = "B4sB" # First Byte, Version, DCID_Len + header_parts = struct.unpack_from(fmt_string, datagram_data) + version = header_parts[1] + + dcid_len = header_parts[2] + fmt_string = fmt_string + str(dcid_len) + "s" + dcid_len = dcid_len.to_bytes(1, "big") + header_parts = struct.unpack_from(fmt_string, datagram_data) + dcid = header_parts[3] + fmt_string = fmt_string + "s" + + header_parts = struct.unpack_from(fmt_string, datagram_data) + scid_len = decode_variable_length_int((header_parts[4])) + fmt_string = fmt_string + str(scid_len) + "s" + scid_len = scid_len.to_bytes(1, "big") + header_parts = struct.unpack_from(fmt_string, datagram_data) + scid = header_parts[5] + + pn_offset = 7 + len(dcid) + len(scid) + + packet_type = get_packet_type(datagram_data=datagram_data) + + if version == b"\x00\x00\x00\x00": + packet_type = QuicPacketType.VERSION_NEG + + match packet_type: # checks if packet type + + case QuicPacketType.VERSION_NEG: + header_parts = struct.unpack_from(fmt_string + "ssss", datagram_data) + packet = LongQuicPacket(packet_type=QuicPacketType.VERSION_NEG, version=version, dcid_len=dcid_len, + dcid=dcid, scid_len=scid_len, scid=scid, supported_version=header_parts[-1:-5], + first_byte=header_parts[0], ts=in_packet.timestamp, isserver=isserver) + packet_buf.append(packet) + + case QuicPacketType.INITIAL: # Initial packet + + header_parts = struct.unpack_from(fmt_string + "s", datagram_data) + token_len_len = get_variable_length_int_length(header_parts[-1]) + fmt_string = fmt_string + str(token_len_len) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + token_len_bytes = header_parts[-1] + token_len = decode_variable_length_int(header_parts[-1]) + fmt_string = fmt_string + str(token_len) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + token = header_parts[-1] + + packet_len_len = get_variable_length_int_length( + struct.unpack_from(fmt_string + "s", datagram_data)[-1]) + fmt_string = fmt_string + str(packet_len_len) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + packet_len = decode_variable_length_int(header_parts[-1]).to_bytes(packet_len_len, "big") + packet_len_bytes = header_parts[-1] + + pn_offset += packet_len_len + token_len_len + token_len + sample_offset = pn_offset + 4 + + sample = datagram_data[sample_offset: sample_offset + 16] + + if isserver: + hp_key = keys['server_initial_hp'] + else: + hp_key = keys['client_initial_hp'] + + decrypted_header = remove_header_protection(header_type=QuicHeaderType.LONG, + sample=sample, + first_packet_byte=header_parts[0], + hp_key=hp_key, + datagram_data=datagram_data, + pn_offset=pn_offset, ciphersuite=None) + + fmt_string += str(decrypted_header[-1]) + "s" + fmt_string += str(int.from_bytes(packet_len, "big") - decrypted_header[-1]) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + payload = header_parts[-1] + payload_len = len(payload) + + total_packet_len = 1 + 4 + 1 + int.from_bytes(dcid_len, "big") + 1 + int.from_bytes(scid_len, "big") + token_len_len + token_len + packet_len_len + \ + decrypted_header[-1] + payload_len + + packet = LongQuicPacket(packet_type=QuicPacketType.INITIAL, version=version, + dcid_len=dcid_len, dcid=dcid, scid_len=scid_len, scid=scid, + token_len=token_len, token_len_bytes=token_len_bytes, token=token, + packet_len=packet_len, packet_len_bytes=packet_len_bytes, packet_num=decrypted_header[1], + payload=payload, isserver=isserver, first_byte=decrypted_header[0], ts=in_packet.timestamp) + + packet_buf.append(packet) + + case QuicPacketType.HANDSHAKE: # if packet is handshake or RTT-0 + + packet_len_len = get_variable_length_int_length( + struct.unpack_from(fmt_string + "s", datagram_data)[-1]) + fmt_string = fmt_string + str(packet_len_len) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + packet_len = decode_variable_length_int(header_parts[-1]).to_bytes(packet_len_len, "big") + packet_len_bytes = header_parts[-1] + + pn_offset += packet_len_len + sample_offset = pn_offset + 4 + + sample = datagram_data[sample_offset: sample_offset + 16] + print("Sample: " + sample.hex()) + + if isserver: + hp_key = keys["server_handshake_hp"] + else: + hp_key = keys["client_handshake_hp"] + + decrypted_header = remove_header_protection(header_type=QuicHeaderType.LONG, + sample=sample, + first_packet_byte=header_parts[0], + hp_key=hp_key, + datagram_data=datagram_data, + pn_offset=pn_offset, ciphersuite=ciphersuite) + + fmt_string += str(decrypted_header[-1]) + "s" + fmt_string += str(int.from_bytes(packet_len, "big") - decrypted_header[-1]) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + payload = header_parts[-1] + payload_len = len(payload) + + total_packet_len = 1 + 4 + 1 + int.from_bytes(dcid_len, "big") + 1 + int.from_bytes(scid_len, "big") + packet_len_len + \ + decrypted_header[-1] + payload_len + + packet = LongQuicPacket(packet_type=QuicPacketType.HANDSHAKE, version=version, + dcid_len=dcid_len, dcid=dcid, scid_len=scid_len, scid=scid, + packet_len=packet_len, packet_num=decrypted_header[1], + payload=payload, isserver=isserver, first_byte=decrypted_header[0], + packet_len_bytes=packet_len_bytes, ts=in_packet.timestamp) + + packet_buf.append(packet) + + case QuicPacketType.RETRY: # if packet is retry + pass + + case _: + pass + + case QuicHeaderType.SHORT: # if header is short header + fmt_string = "B" + str(len(guessed_dcid)) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + + pn_offset = 1 + len(guessed_dcid) + sample_offset = pn_offset + 4 + sample = datagram_data[sample_offset:sample_offset + 16] + + if isserver: + hp_key = keys["server_application_hp"] + else: + hp_key = keys["client_application_hp"] + + decrypted_header = remove_header_protection(header_type=QuicHeaderType.SHORT, + first_packet_byte=header_parts[0], + hp_key=hp_key, + sample=sample, + pn_offset=pn_offset, + datagram_data=datagram_data, ciphersuite=ciphersuite) + + fmt_string += str(decrypted_header[-1]) + "s" + fmt_string += str(len(datagram_data) - (1 + len(guessed_dcid) + decrypted_header[-1])) + "s" + header_parts = struct.unpack_from(fmt_string, datagram_data) + payload = header_parts[-1] + key_phase = decrypted_header[0][0] >> 2 & 1 + + total_packet_len = 1 + len(guessed_dcid) + decrypted_header[-1] + len(payload) + + packet = ShortQuicPacket(packet_type=QuicPacketType.RTT_1, + dcid=guessed_dcid, + isserver=isserver, + packet_num=decrypted_header[1], + key_phase=key_phase, + payload=payload, + first_byte=decrypted_header[0], + ts=in_packet.timestamp) + + packet_buf.append(packet) + case _: + pass + in_packet.tls_data = datagram_data[total_packet_len:] + return packet_buf, in_packet + + except Exception as e: + print(e) + in_packet.tls_data = b"" + return packet_buf, in_packet + + + diff --git a/tlexport/quic/quic_frame.py b/tlexport/quic/quic_frame.py new file mode 100644 index 0000000..8a1d0ae --- /dev/null +++ b/tlexport/quic/quic_frame.py @@ -0,0 +1,420 @@ +from tlexport.quic.quic_decode import get_variable_length_int_length, decode_variable_length_int +from tlexport.quic.quic_packet import QuicPacket, ShortQuicPacket, LongQuicPacket + + +def parse_frames(payload: bytes, src_packet: ShortQuicPacket | LongQuicPacket | QuicPacket): + + frames = [] + keys = frame_type.keys() + while len(payload) != 0: + key = 0xff + for k in keys: + if payload[0] in k: + key = k + + if key != 0xff: + frame = frame_type.get(key)(payload, src_packet) + else: + frame = GenericFrame(payload, src_packet) + + frames.append(frame) + frame_length = frame.length + + payload = payload[frame_length:] + + return frames + + +class Frame: + frame_type = None + length = None + + def __init__(self, src_packet: ShortQuicPacket | LongQuicPacket | QuicPacket): + self.src_packet: ShortQuicPacket | LongQuicPacket | QuicPacket = src_packet + + +class PaddingFrame(Frame): + frame_type = 0x00 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + for i, byte in enumerate(payload): + if byte != 0: + self.length = i + return + + self.length = len(payload) + + +class GenericFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.frame_length = decode_variable_length_int(payload[1: self.length]) + self.data = payload[1 + self.length: 1 + self.length + self.frame_length] + + self.length = self.length + self.frame_length + + +class PingFrame(Frame): + frame_type = 0x01 + length = 1 + + def __init__(self, _payload, src_packet): + super().__init__(src_packet) + + +class AckFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + self.length = 1 + + self.length += get_variable_length_int_length(payload[1:2]) + self.largest_acknowledged = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.ack_delay = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.range_count = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.first_ack_range = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.ack_ranges = [] + for i in range(0, self.range_count): + self.length += get_variable_length_int_length(payload[index:index + 1]) + gap = decode_variable_length_int(payload[index:self.length]) + index = self.length + self.length += get_variable_length_int_length(payload[index:index + 1]) + ack_range_length = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.ack_ranges.append((gap, ack_range_length)) + + if self.frame_type == 0x03: + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.ect_0_count = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.ect_1_count = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.ect_ce_count = decode_variable_length_int(payload[index:self.length]) + + +class ResetStreamFrame(Frame): + frame_type = 0x04 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + + self.length += get_variable_length_int_length(payload[1:2]) + self.stream_id = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.application_protocol_error_code = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.final_size = decode_variable_length_int(payload[index:self.length]) + + +class StopSendingFrame(Frame): + frame_type = 0x05 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + + self.length += get_variable_length_int_length(payload[1:2]) + self.stream_id = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.application_protocol_error_code = decode_variable_length_int(payload[index:self.length]) + + +class CryptoFrame(Frame): + frame_type = 0x06 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + + self.length += get_variable_length_int_length(payload[1:2]) + self.offset = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.crypto_length = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += self.crypto_length + self.crypto = payload[index: self.length] + + +class NewTokenFrame(Frame): + frame_type = 0x07 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + + self.length += get_variable_length_int_length(payload[1:2]) + self.token_length = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += self.token_length + self.token = payload[index: self.length] + + +class StreamFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + self.fin = bool(self.frame_type & 1) + self.len = bool((self.frame_type >> 1) & 1) + self.off = bool((self.frame_type >> 2) & 1) + + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.stream_id = decode_variable_length_int(payload[1:self.length]) + + self.server_initiated = bool(self.stream_id & 1) + self.stream_unidirectional = bool((self.stream_id >> 1) & 1) + + index = self.length + + self.stream_data = None + + if self.off: + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.offset = decode_variable_length_int(payload[index:self.length]) + index = self.length + else: + self.offset = 0 + + if self.len: + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.data_length = decode_variable_length_int(payload[index:self.length]) + index = self.length + self.length += self.data_length + else: + self.length = len(payload) + self.data_length = len(payload) - index + + self.stream_data = payload[index:self.length] + + +class MaxDataFrame(Frame): + frame_type = 0x10 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.maximum_data = decode_variable_length_int(payload[1:self.length]) + + +class MaxStreamDataFrame(Frame): + frame_type = 0x11 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.stream_id = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index: index + 1]) + self.maximum_stream_data = decode_variable_length_int(payload[index: self.length]) + + +class MaxStreamsFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.maximum_streams = decode_variable_length_int(payload[1:self.length]) + + +class DataBlockedFrame(Frame): + frame_type = 0x14 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.maximum_data = decode_variable_length_int(payload[1:self.length]) + + +class StreamDataBlockedFrame(Frame): + frame_type = 0x15 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.stream_id = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index: index + 1]) + self.maximum_stream_data = decode_variable_length_int(payload[index: self.length]) + + +class StreamsBlockedFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.maximum_streams = decode_variable_length_int(payload[1:self.length]) + + +class NewConnectionIdFrame(Frame): + frame_type = 0x18 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.sequence_number = decode_variable_length_int(payload[1:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index: index + 1]) + self.retire_prior_to = decode_variable_length_int(payload[index: self.length]) + + self.connection_id_length = payload[self.length] + self.length += 1 + + self.connection_id = payload[self.length: self.length + self.connection_id_length] + self.length += self.connection_id_length + + self.stateless_reset_token = payload[self.length: self.length + 16] + self.length += 16 + + +class RetireConnectionIdFrame(Frame): + frame_type = 0x19 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.sequence_number = decode_variable_length_int(payload[1:self.length]) + + +class PathChallengeFrame(Frame): + frame_type = 0x1a + length = 9 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.data = payload[1:9] + + +class PathResponseFrame(Frame): + frame_type = 0x1b + length = 9 + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.data = payload[1:9] + + +class ConnectionCloseFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + + self.length = 1 + self.length += get_variable_length_int_length(payload[1:2]) + self.error_code = decode_variable_length_int(payload[1:self.length]) + index = self.length + + if self.frame_type == 0x1c: + self.length += get_variable_length_int_length(payload[index:index + 1]) + self.close_frame_type = decode_variable_length_int(payload[index:self.length]) + index = self.length + + self.length += get_variable_length_int_length(payload[index: index + 1]) + self.reason_phrase_length = decode_variable_length_int(payload[index: self.length]) + index = self.length + + self.length += self.reason_phrase_length + self.reason_phrase = payload[index: self.length] + + +class DatagramFrame(Frame): + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.frame_type = payload[0] + + self.len_bit = (payload[0] & 1) == 1 + + if self.len_bit: + var_int_length = get_variable_length_int_length(payload[1:2]) + payload_length = decode_variable_length_int(payload[1:1 + var_int_length]) + self.payload = payload[1 + var_int_length: 1 + var_int_length + payload_length] + + self.length = 1 + var_int_length + payload_length + else: + self.length = len(payload) + self.payload = payload[1:] + + +class HandshakeDoneFrame(Frame): + frame_type = 0x1e + length = 1 + + def __init__(self, _payload, src_packet): + super().__init__(src_packet) + + +class PseudoVersionNegotiationFrame(Frame): # This is not an official Frametype proposed in the RFCs! + frame_type = 0xfe + + def __init__(self, payload, src_packet): + super().__init__(src_packet) + self.payload = payload + + +frame_type = { + (0x00,): PaddingFrame, + (0x01,): PingFrame, + (0x02,): AckFrame, + (0x03,): AckFrame, + (0x04,): ResetStreamFrame, + (0x05,): StopSendingFrame, + (0x06,): CryptoFrame, + (0x07,): NewTokenFrame, + (0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f): StreamFrame, + (0x10,): MaxDataFrame, + (0x11,): MaxStreamDataFrame, + (0x12, 0x13): MaxStreamsFrame, + (0x14,): DataBlockedFrame, + (0x15,): StreamDataBlockedFrame, + (0x16, 0x17): StreamsBlockedFrame, + (0x18,): NewConnectionIdFrame, + (0x19,): RetireConnectionIdFrame, + (0x1a,): PathChallengeFrame, + (0x1b,): PathResponseFrame, + (0x1c, 0x1d): ConnectionCloseFrame, + (0x1e,): HandshakeDoneFrame, + (0x30, 0x31): DatagramFrame +} diff --git a/tlexport/quic/quic_key_generation.py b/tlexport/quic/quic_key_generation.py new file mode 100644 index 0000000..1d4a4ec --- /dev/null +++ b/tlexport/quic/quic_key_generation.py @@ -0,0 +1,185 @@ +import logging + +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.kdf.hkdf import HKDFExpand, HKDF +from cryptography.hazmat.primitives.hashes import SHA256 +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers.algorithms import AES, ChaCha20 +from cryptography.hazmat.primitives.ciphers.modes import ECB +from tlexport.quic.quic_decryptor import QuicDecryptor +from tlexport.quic.quic_decode import QuicVersion + + +def dev_quic_keys(key_length, secret_list, hash_fun: hashes.HashAlgorithm, quic_version: QuicVersion): + if QuicVersion.V1 == quic_version: + key_info = make_info(b"quic key", key_length) + iv_info = make_info(b"quic iv", 12) + hp_info = make_info(b"quic hp", key_length) + else: + key_info = make_info(b"quicv2 key", key_length) + iv_info = make_info(b"quicv2 iv", 12) + hp_info = make_info(b"quicv2 hp", key_length) + + client_early_traffic_key = None + client_early_traffic_iv = None + server_early_traffic_key = None + server_early_traffic_iv = None + client_early_traffic_hp = None + server_early_traffic_hp = None + + for secret in secret_list: + if secret.label == "CLIENT_HANDSHAKE_TRAFFIC_SECRET": + client_handshake_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + client_handshake_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + client_handshake_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + + elif secret.label == "SERVER_HANDSHAKE_TRAFFIC_SECRET": + server_handshake_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + server_handshake_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + server_handshake_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + + elif secret.label == "CLIENT_TRAFFIC_SECRET_0": + client_application_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + client_application_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + client_application_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + client_application_secret = bytes.fromhex(secret.value) + + elif secret.label == "SERVER_TRAFFIC_SECRET_0": + server_application_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + server_application_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + server_application_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + server_application_secret = bytes.fromhex(secret.value) + + elif secret.label == "CLIENT_EARLY_TRAFFIC_SECRET": + client_early_traffic_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + client_early_traffic_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + client_early_traffic_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + + elif secret.label == "SERVER_EARLY_TRAFFIC_SECRET": + server_early_traffic_key = HKDFExpand(hash_fun, key_length, key_info).derive(bytes.fromhex(secret.value)) + server_early_traffic_iv = HKDFExpand(hash_fun, 12, iv_info).derive(bytes.fromhex(secret.value)) + server_early_traffic_hp = HKDFExpand(hash_fun, key_length, hp_info).derive(bytes.fromhex(secret.value)) + + keys = { + "client_handshake_key": client_handshake_key, + "server_handshake_key": server_handshake_key, + "client_handshake_iv": client_handshake_iv, + "server_handshake_iv": server_handshake_iv, + "client_handshake_hp": client_handshake_hp, + "server_handshake_hp": server_handshake_hp, + + "client_application_key": client_application_key, + "server_application_key": server_application_key, + "client_application_iv": client_application_iv, + "server_application_iv": server_application_iv, + "client_application_hp": client_application_hp, + "server_application_hp": server_application_hp, + "client_application_sec": client_application_secret, + "server_application_sec": server_application_secret, + + "client_early_key": client_early_traffic_key, + "client_early_iv": client_early_traffic_iv, + "server_early_key": server_early_traffic_key, + "server_early_iv": server_early_traffic_iv, + "client_early_hp": client_early_traffic_hp, + "server_early_hp": server_early_traffic_hp + } + + logging_string = "" + for k in keys: + if keys[k] is not None: + logging_string += f"{k}: {keys[k].hex()}\n" + + logging.info(f"{logging_string}") + + return keys + + +def dev_initial_keys(connection_id: bytes, quic_version: QuicVersion): + key_length = 16 + hp_key_length = 16 + hash_fun = SHA256() + + if quic_version == QuicVersion.V1: + initial_salt = bytes.fromhex("38762cf7f55934b34d179ae6a4c80cadccbb7f0a") + elif quic_version == QuicVersion.V2: + initial_salt = bytes.fromhex("0dede3def700a6db819381be6e269dcbf9bd2ed9") + else: + return None + + initial_secret = HKDF(hash_fun, salt=initial_salt, length=32, info=None)._extract(connection_id) + + client_initial = HKDFExpand(hash_fun, 32, info=make_info(b"client in", 32)).derive(initial_secret) + server_initial = HKDFExpand(hash_fun, 32, info=make_info(b"server in", 32)).derive(initial_secret) + + if quic_version == QuicVersion.V1: + key_label = b"quic key" + iv_label = b"quic iv" + hp_label = b"quic hp" + else: + key_label = b"quicv2 key" + iv_label = b"quicv2 iv" + hp_label = b"quicv2 hp" + + initial_keys = { + "client_initial_key": HKDFExpand(hash_fun, key_length, make_info(key_label, key_length)).derive( + client_initial), + "client_initial_iv": HKDFExpand(hash_fun, 12, make_info(iv_label, 12)).derive(client_initial), + "client_initial_hp": HKDFExpand(hash_fun, key_length, make_info(hp_label, hp_key_length)).derive( + client_initial), + "server_initial_key": HKDFExpand(hash_fun, key_length, make_info(key_label, key_length)).derive( + server_initial), + "server_initial_iv": HKDFExpand(hash_fun, 12, make_info(iv_label, 12)).derive( + server_initial), + "server_initial_hp": HKDFExpand(hash_fun, key_length, make_info(hp_label, hp_key_length)).derive( + server_initial), + } + + return initial_keys + + +def key_update(decryptor_n: QuicDecryptor, hash_fun: hashes.HashAlgorithm, key_length: int, cipher, quic_version: QuicVersion) -> QuicDecryptor: + if quic_version.V1: + key_info = make_info(b"quic key", key_length) + iv_info = make_info(b"quic iv", 12) + ku_info = make_info(b"quic ku", hash_fun.digest_size) + else: + key_info = make_info(b"quicv2 key", key_length) + iv_info = make_info(b"quicv2 iv", 12) + ku_info = make_info(b"quicv2 ku", hash_fun.digest_size) + + server_n = decryptor_n.keys[4] + client_n = decryptor_n.keys[5] + hash_fun = hash_fun() + server_n_1 = HKDFExpand(hash_fun, hash_fun.digest_size, ku_info).derive( + server_n) + client_n_1 = HKDFExpand(hash_fun, hash_fun.digest_size, ku_info).derive( + client_n) + + client_application_key = HKDFExpand(hash_fun, key_length, key_info).derive(client_n_1) + client_application_iv = HKDFExpand(hash_fun, 12, iv_info).derive(client_n_1) + client_application_secret = client_n_1 + + server_application_key = HKDFExpand(hash_fun, key_length, key_info).derive(server_n_1) + server_application_iv = HKDFExpand(hash_fun, 12, iv_info).derive(server_n_1) + server_application_secret = server_n_1 + + return QuicDecryptor([server_application_key, server_application_iv, client_application_key, client_application_iv, + server_application_secret, client_application_secret], cipher) + + +def make_info(label, key_length): + lable_len = len(label) + 6 + return key_length.to_bytes(2, 'big') + lable_len.to_bytes(1, 'big') + b"tls13 " + label + b"\x00" + + +def make_hp_mask(hp_key: bytes, sample: bytes) -> bytes: + encryptor = Cipher(AES(hp_key), ECB()).encryptor() + mask = encryptor.update(sample) + encryptor.finalize() + return mask + + +def make_chacha_hp_mask(hp_key: bytes, sample: bytes) -> bytes: + encryptor = Cipher(ChaCha20(hp_key, sample), mode=None).encryptor() + mask = encryptor.update(b"\x00" * 5) + encryptor.finalize() + return mask diff --git a/tlexport/quic/quic_output_builder.py b/tlexport/quic/quic_output_builder.py new file mode 100644 index 0000000..bcf5236 --- /dev/null +++ b/tlexport/quic/quic_output_builder.py @@ -0,0 +1,107 @@ +from tlexport.quic.quic_frame import Frame +from scapy.packet import Raw +from scapy.layers.l2 import Ether +from scapy.layers.inet import IP, UDP +from scapy.layers.inet6 import IPv6 + + +class QUICOutputbuilder: + def __init__(self, decrypted_traffic, server_ip, client_ip, server_port, client_port, server_mac_address, + client_mac_address, portmap, ipv6): + self.decrypted_traffic: list[Frame] = decrypted_traffic + self.server_ip = server_ip + self.client_ip = client_ip + self.server_port = server_port + self.client_port = client_port + self.default_port = 8080 + self.server_mac_address = server_mac_address + self.client_mac_address = client_mac_address + self.ipv6 = ipv6 + self.out = [] + + if self.server_port in portmap.keys(): + self.server_port = portmap[self.server_port] + else: + self.server_port = self.default_port + + def build(self, metadata: bool): + pn = self.decrypted_traffic[0].src_packet.packet_num + ts = self.decrypted_traffic[0].src_packet.ts + isserver = self.decrypted_traffic[0].src_packet.isserver + packets = bytearray() + for frame in self.decrypted_traffic: + data = None + if metadata: + if frame.frame_type == 0x06: + data = frame.crypto + elif frame.frame_type == 0xfe: + data = frame.supported_version + if frame.frame_type in [0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]: + data = frame.stream_data + elif data is None: + continue + + if frame.src_packet.packet_num == pn: + packets.extend(data) + continue + else: # if packets number changes + if frame.src_packet.ts == ts: # if same ts => same datagram + pn = frame.src_packet.packet_num + packets.extend(data) + continue + else: # if not same ts => different datagram + if isserver: + if not self.ipv6: + packet = Ether(src=self.server_mac_address, dst=self.client_mac_address) / IP( + src=self.server_ip, + dst=self.client_ip) / UDP( + dport=self.client_port, sport=self.server_port) / Raw(bytes(packets)) + else: + packet = Ether(src=self.server_mac_address, dst=self.client_mac_address) / IPv6( + src=self.server_ip, + dst=self.client_ip) / UDP( + dport=self.client_port, sport=self.server_port) / Raw(bytes(packets)) + + else: + if not self.ipv6: + packet = Ether(src=self.client_mac_address, dst=self.server_mac_address) / IP( + src=self.client_ip, + dst=self.server_ip) / UDP( + dport=self.server_port, sport=self.client_port) / Raw(bytes(packets)) + else: + packet = Ether(src=self.client_mac_address, dst=self.server_mac_address) / IPv6( + src=self.client_ip.encode(), + dst=self.server_ip.encode()) / UDP( + dport=self.server_port, sport=self.client_port) / Raw(bytes(packets)) + + self.out.append((packet, ts)) + + pn = frame.src_packet.packet_num + ts = frame.src_packet.ts + isserver = frame.src_packet.isserver + packets = bytearray() + packets.extend(data) + + if isserver: + if not self.ipv6: + packet = Ether(src=self.server_mac_address, dst=self.client_mac_address) / IP(src=self.server_ip, + dst=self.client_ip) / UDP( + dport=self.client_port, sport=self.server_port) / Raw(bytes(packets)) + else: + packet = Ether(src=self.server_mac_address, dst=self.client_mac_address) / IPv6(src=self.server_ip, + dst=self.client_ip) / UDP( + dport=self.client_port, sport=self.server_port) / Raw(bytes(packets)) + + else: + if not self.ipv6: + packet = Ether(src=self.client_mac_address, dst=self.server_mac_address) / IP(src=self.client_ip, + dst=self.server_ip) / UDP( + dport=self.server_port, sport=self.client_port) / Raw(bytes(packets)) + else: + packet = Ether(src=self.client_mac_address, dst=self.server_mac_address) / IPv6(src=self.client_ip, + dst=self.server_ip) / UDP( + dport=self.server_port, sport=self.client_port) / Raw(bytes(packets)) + + self.out.append((packet, ts)) + + return self.out diff --git a/tlexport/quic/quic_packet.py b/tlexport/quic/quic_packet.py new file mode 100644 index 0000000..f81d495 --- /dev/null +++ b/tlexport/quic/quic_packet.py @@ -0,0 +1,77 @@ +from enum import Enum + + +class QuicPacketType(Enum): + INITIAL = 0x00 + RTT_O = 0x01 + RTT_1 = "RTT_1" + HANDSHAKE = 0x02 + RETRY = 0x03 + + VERSION_NEG = "VERSION_NEGOTIATION" + + +class QuicHeaderType(Enum): + SHORT = 0x00 + LONG = 0x01 + + VERSION_NEG = "VERSION_NEGOTIATION" + + +class QuicPacket: + def __init__(self, header_type: QuicHeaderType, packet_type: QuicPacketType, isserver: bool, first_byte: bytes, ts: int): + self.header_type = header_type + self.packet_type = packet_type + self.isserver = isserver + self.first_byte = first_byte + self.ts = ts + + +class LongQuicPacket(QuicPacket): + def __init__(self, packet_type: QuicPacketType, version: bytes, dcid_len: bytes, dcid: bytes, scid_len: bytes, + scid: bytes, first_byte: bytes, ts: int, + packet_len: bytes = None, packet_len_bytes: bytes = None, packet_num: bytes = None, payload: bytes = None, token_len: int = None, + token_len_bytes: bytes = None, token: bytes = None, + retry_token: bytes = None, retry_integ_tag: bytes = None, isserver: bool = False, supported_version: bytes = None): + + super().__init__(QuicHeaderType.LONG, packet_type, isserver, first_byte, ts) + self.version = version + self.dcid_len = dcid_len + self.dcid = dcid + self.scid_len = scid_len + self.scid = scid + + match packet_type: + case QuicPacketType.INITIAL: + self.token_len = token_len + self.token_len_bytes = token_len_bytes + self.token = token + self.packet_len = packet_len + self.packet_len_bytes = packet_len_bytes + self.packet_num = packet_num + self.payload = payload + + case QuicPacketType.HANDSHAKE | QuicPacketType.RTT_O: # handshake and RTT-0 have same structure + self.packet_len = packet_len + self.packet_num = packet_num + self.packet_len_bytes = packet_len_bytes + self.payload = payload + + case QuicPacketType.RETRY: + self.retry_token = retry_token + self.retry_integ_tag = retry_integ_tag + + case QuicPacketType.VERSION_NEG: + self.supported_version = supported_version + + +class ShortQuicPacket(QuicPacket): + + # init for 1-RTT Packet + def __init__(self, packet_type: QuicPacketType, key_phase: int, dcid: bytes, packet_num: int, payload: bytes, + isserver: bool, first_byte: bytes, ts: int): + super().__init__(QuicHeaderType.SHORT, packet_type, isserver, first_byte, ts) + self.key_phase = key_phase + self.dcid = dcid + self.packet_num = packet_num + self.payload = payload diff --git a/tlexport/quic/quic_session.py b/tlexport/quic/quic_session.py new file mode 100644 index 0000000..e1857a7 --- /dev/null +++ b/tlexport/quic/quic_session.py @@ -0,0 +1,471 @@ +import logging +from typing import Type, cast + +from cryptography.hazmat.primitives.ciphers.aead import AESGCM, ChaCha20Poly1305, AESCCM +from cryptography.hazmat.primitives.hashes import SHA256, SHA384 + +from tlexport.keylog_reader import Key +from tlexport.packet import Packet +from tlexport.quic.quic_decryptor import QuicDecryptor +from tlexport.quic.quic_frame import CryptoFrame, StreamFrame, NewConnectionIdFrame, ConnectionCloseFrame, Frame, \ + parse_frames, PseudoVersionNegotiationFrame +from tlexport.quic.quic_key_generation import dev_quic_keys, dev_initial_keys, key_update +from tlexport.quic.quic_packet import QuicPacket, ShortQuicPacket, LongQuicPacket, QuicPacketType +from tlexport.quic.quic_tls_parser import QuicTlsSession +from tlexport.quic.quic_dissector import extract_quic_packet +from tlexport.quic.quic_decode import QuicVersion +from tlexport.quic.quic_output_builder import QUICOutputbuilder +from ipaddress import IPv6Address, IPv4Address + + +PACKET_TYPE_MAP = { + QuicPacketType.INITIAL: (QuicPacketType.INITIAL,), + QuicPacketType.HANDSHAKE: (QuicPacketType.HANDSHAKE,), + QuicPacketType.RTT_O: (QuicPacketType.RTT_1, QuicPacketType.RTT_O), + QuicPacketType.RTT_1: (QuicPacketType.RTT_1, QuicPacketType.RTT_O) +} + + +class QuicSession: + def __init__(self, packet: Packet, server_ports, keylog: list[Key], portmap): + self.output_buffer = [] + self.greasy_bit = False + self.keylog = keylog + + self.quic_version = QuicVersion.UNKNOWN + + self.set_server_client_address(packet, server_ports) + + self.ipv6: bool = packet.ipv6_packet + + self.client_cids = set() + self.server_cids = set() + + self.server_frame_buffer = [] + self.client_frame_buffer = [] + + self.packet_buffer_quic = [] + + self.epoch_client = 0 + self.epoch_server = 0 + + self.last_key_phase_server = 0 + self.last_key_phase_client = 0 + + self.decryptors = {} + self.keys: dict[str, bytes] = {} + + self.can_decrypt = True + + self.hash_fun = None + self.cipher = None + self.key_length = None + + self.alpn = None + + self.early_traffic_keys = False + + self.tls_session = QuicTlsSession() + + self.application_data: list[list[bytes, Type[Frame], bool]] = [] + + self.packet_number_server = None + self.packet_number_client = None + self.buffer_spaces_server = None + self.buffer_spaces_client = None + + self.set_packet_number_spaces() + self.portmap = portmap + + # reset Quic Session Parameters, except output buffer and Socket Addresses + def reset(self): + self.client_cids = [] + self.server_cids = [] + + self.server_frame_buffer = [] + self.client_frame_buffer = [] + + self.packet_buffer_quic = [] + + self.epoch_client = 0 + self.epoch_server = 0 + + self.quic_version = QuicVersion.UNKNOWN + + self.last_key_phase_server = 0 + self.last_key_phase_client = 0 + + self.decryptors = {} + self.keys: dict[str, bytes] = {} + + self.can_decrypt = True + + self.hash_fun = None + self.cipher = None + self.key_length = None + + self.alpn = None + + self.greasy_bit = False + + self.early_traffic_keys = False + + self.tls_session = QuicTlsSession() + + self.application_data: list[list[bytes, Type[Frame], bool]] = [] + + self.packet_number_server: dict[tuple[QuicPacketType, QuicPacketType], int] = {} + self.packet_number_client: dict[tuple[QuicPacketType, QuicPacketType], int] = {} + self.buffer_spaces_server = {} + self.buffer_spaces_client = {} + + self.set_packet_number_spaces() + + def build_output(self, metadata: bool): + if len(self.output_buffer) > 0: + output_builder = QUICOutputbuilder(self.output_buffer, self.binary_to_ip(self.server_ip).__str__(), self.binary_to_ip(self.client_ip).__str__(), self.server_port, self.client_port, self.server_mac_addr, self.client_mac_addr, self.portmap, self.ipv6) + return output_builder.build(metadata) + else: + return [(b"\x00", 0)] + + def set_packet_number_spaces(self): + # RTT_1 and RTT_0 are in same packet_number space 12.3 + self.packet_number_server = {(QuicPacketType.INITIAL,): 0, (QuicPacketType.HANDSHAKE,): 0, + (QuicPacketType.RTT_1, QuicPacketType.RTT_O): 0} + self.packet_number_client = {(QuicPacketType.INITIAL,): 0, (QuicPacketType.HANDSHAKE,): 0, + (QuicPacketType.RTT_1, QuicPacketType.RTT_O): 0} + + self.buffer_spaces_server = {(QuicPacketType.INITIAL,): [], (QuicPacketType.HANDSHAKE,): [], + (QuicPacketType.RTT_1, QuicPacketType.RTT_O): []} + self.buffer_spaces_client = {(QuicPacketType.INITIAL,): [], (QuicPacketType.HANDSHAKE,): [], + (QuicPacketType.RTT_1, QuicPacketType.RTT_O): []} + + def handle_crypto_frame(self, frame: CryptoFrame): + self.tls_session.update_session(frame) + if self.tls_session.new_data: + if self.tls_session.client_random is not None and self.tls_session.ciphersuite is not None: + self.set_tls_decryptors(self.tls_session.client_random, self.tls_session.ciphersuite) + self.alpn = self.tls_session.alpn + self.greasy_bit = self.tls_session.greasy_bit + self.tls_session.new_data = False + self.output_buffer.append(frame) + + def handle_frame(self, frame: Frame): + isserver = frame.src_packet.isserver + # CRYPTO, STREAM, NEW_CONNECTION_ID, CONNECTION_CLOSE + match frame: + case CryptoFrame(): + frame = cast(CryptoFrame, frame) + self.handle_crypto_frame(frame) + + case StreamFrame(): + self.output_buffer.append(frame) + + case NewConnectionIdFrame(): + frame = cast(NewConnectionIdFrame, frame) + if isserver: + self.server_cids.add(frame.connection_id) + else: + self.client_cids.add(frame.connection_id) + case ConnectionCloseFrame(): + pass + + case PseudoVersionNegotiationFrame(): + self.output_buffer.append(frame) + + def check_key_epoch(self, key_phase_bit, isserver): + if isserver: + if self.last_key_phase_server != key_phase_bit: + self.epoch_server += 1 + self.last_key_phase_server = key_phase_bit + else: + if self.last_key_phase_client != key_phase_bit: + self.epoch_client += 1 + self.last_key_phase_client = key_phase_bit + + if self.epoch_client == len(self.decryptors["Application"]) or self.epoch_server == len( + self.decryptors["Application"]): + new_decryptor = key_update(self.decryptors["Application"][-1], self.hash_fun, self.key_length, self.cipher, self.quic_version) + self.decryptors["Application"].append(new_decryptor) + + def decrypt_packet(self, quic_packet: type[QuicPacket]): + decryptor: QuicDecryptor + if isinstance(quic_packet, ShortQuicPacket): + quic_packet = cast(ShortQuicPacket, quic_packet) + if quic_packet.packet_type == QuicPacketType.RTT_1: + self.check_key_epoch(quic_packet.key_phase, quic_packet.isserver) + + if quic_packet.isserver: + decryptor = self.decryptors["Application"][self.epoch_server] + else: + decryptor = self.decryptors["Application"][self.epoch_client] + + else: + quic_packet = cast(LongQuicPacket, quic_packet) + match quic_packet.packet_type: + case QuicPacketType.INITIAL: + decryptor = self.decryptors["Initial"] + case QuicPacketType.HANDSHAKE: + decryptor = self.decryptors["Handshake"] + case QuicPacketType.RTT_O: + decryptor = self.decryptors["Early"] + try: + + packet_number = self.get_full_packet_number(quic_packet) + + if isinstance(quic_packet, LongQuicPacket): + match quic_packet.packet_type: + + case QuicPacketType.INITIAL: + associated_data = quic_packet.first_byte + quic_packet.version + quic_packet.dcid_len + quic_packet.dcid + quic_packet.scid_len + quic_packet.scid + quic_packet.token_len_bytes + quic_packet.token + quic_packet.packet_len_bytes + quic_packet.packet_num + + case QuicPacketType.HANDSHAKE: + associated_data = quic_packet.first_byte + quic_packet.version + quic_packet.dcid_len + quic_packet.dcid + quic_packet.scid_len + quic_packet.scid + quic_packet.packet_len_bytes + quic_packet.packet_num #TODO: Check conversion + else: + associated_data = quic_packet.first_byte + quic_packet.dcid + quic_packet.packet_num + payload = decryptor.decrypt(quic_packet.payload, packet_number, associated_data, quic_packet.isserver) + + frames = parse_frames(payload, quic_packet) + + for frame in frames: + self.handle_frame(frame) + + except Exception as e: + print(e) + logging.warning(f"Could not decrypt Quic Packet: {quic_packet.dcid}") + + def packet_isserver(self, packet, dcid): + if dcid in self.server_cids: + return False + elif dcid in self.client_cids: + return True + elif packet.ip_src == self.client_ip and packet.sport == self.client_port: + return False + else: + return True + + def handle_packet(self, packet: Packet, dcid: bytes, quic_version: QuicVersion): + """This method handles the packets, extracts the contained QUIC-Packet(s) and + prepares the decryption for the initial QUIC-Packets + """ + if self.quic_version == QuicVersion.UNKNOWN: + self.quic_version = quic_version + + if "Initial" not in list(self.decryptors.keys()): + self.set_initial_decryptor(dcid) + + isserver = self.packet_isserver(packet, dcid) + + while len(packet.tls_data) != 0: + quic_packets, packet = extract_quic_packet(in_packet=packet, isserver=isserver, guessed_dcid=dcid, keys=self.keys, ciphersuite=self.tls_session.ciphersuite) + + self.packet_buffer_quic.extend(quic_packets) + + self.handle_quic_packet() + + def handle_quic_packet(self): + for quic_packet in self.packet_buffer_quic: + if quic_packet.packet_type not in [QuicPacketType.RETRY, QuicPacketType.VERSION_NEG]: + self.decrypt_packet(quic_packet) + + if quic_packet.packet_type == QuicPacketType.VERSION_NEG: + frame = PseudoVersionNegotiationFrame(payload=quic_packet.supported_version, src_packet=quic_packet) + self.handle_frame(frame) + + if quic_packet.packet_type == QuicPacketType.RETRY: + self.tls_session = QuicTlsSession() + self.decryptors = {} + self.keys: dict[str, bytes] = {} + + self.hash_fun = None + self.cipher = None + self.key_length = None + + self.alpn = None + + if quic_packet.packet_type == QuicPacketType.INITIAL: + if quic_packet.isserver: + self.server_cids.add(quic_packet.scid) + self.client_cids.add(quic_packet.dcid) + else: + self.client_cids.add(quic_packet.scid) + self.server_cids.add(quic_packet.dcid) + self.packet_buffer_quic = [] + + def set_server_client_address(self, packet, server_ports) -> bool: + # Returns True if packet is from server, else it returns False + if packet.sport in server_ports: + self.server_ip = packet.ip_src + self.server_port = packet.sport + self.server_mac_addr = packet.ethernet_src + + self.client_ip = packet.ip_dst + self.client_port = packet.dport + self.client_mac_addr = packet.ethernet_dst + + return True + + else: + self.server_ip = packet.ip_dst + self.server_port = packet.dport + self.server_mac_addr = packet.ethernet_dst + + self.client_ip = packet.ip_src + self.client_port = packet.sport + self.client_mac_addr = packet.ethernet_src + + return False + + def matches_session_dgram(self, ip_src, ip_dst, sport, dport): + + if (ip_src == self.server_ip and sport == self.server_port + and ip_dst == self.client_ip and dport == self.client_port): + return True + + elif (ip_src == self.client_ip and sport == self.client_port + and ip_dst == self.server_ip and dport == self.server_port): + return True + return False + + def matches_session_quic(self, cid): + if cid in self.client_cids | self.server_cids: + return True + else: + return False + + def set_initial_decryptor(self, dcid: bytes): + keys: dict[str, bytes] = dev_initial_keys(dcid, self.quic_version) + + if keys is None: + self.can_decrypt = False + return + + dec_keys = [ + keys["server_initial_key"], + keys["server_initial_iv"], + keys["client_initial_key"], + keys["client_initial_iv"] + ] + + dec = QuicDecryptor(dec_keys, AESGCM) + + self.keys.update(keys) + self.decryptors["Initial"] = dec + + def get_full_packet_number(self, quic_packet: ShortQuicPacket | LongQuicPacket) -> bytes: + if quic_packet.isserver: + largest_pkn = self.packet_number_server[PACKET_TYPE_MAP[quic_packet.packet_type]] + else: + largest_pkn = self.packet_number_client[PACKET_TYPE_MAP[quic_packet.packet_type]] + + packet_number_int = int.from_bytes(quic_packet.packet_num, "big", signed=False) + + if packet_number_int > largest_pkn == 0: + if quic_packet.isserver: + self.packet_number_server[PACKET_TYPE_MAP[quic_packet.packet_type]] = packet_number_int + else: + self.packet_number_client[PACKET_TYPE_MAP[quic_packet.packet_type]] = packet_number_int + + return quic_packet.packet_num + + truncated_pkn = packet_number_int + truncated_pkn_len = len(quic_packet.packet_num) + + pkn_len_bits = truncated_pkn_len * 8 + + expected_pkn = largest_pkn + 1 + pkn_window = 1 << pkn_len_bits + pkn_hwindow = pkn_window / 2 + pkn_mask = pkn_window - 1 + + candidate_pkn = (expected_pkn & ~pkn_mask) | truncated_pkn + + if candidate_pkn <= expected_pkn - pkn_hwindow and candidate_pkn < (1 << 62) - pkn_window: + out_pkn = candidate_pkn + pkn_window + elif candidate_pkn > expected_pkn + pkn_hwindow and candidate_pkn >= pkn_window: + out_pkn = candidate_pkn - pkn_window + else: + out_pkn = candidate_pkn + + if out_pkn > largest_pkn: + if quic_packet.isserver: + self.packet_number_server[PACKET_TYPE_MAP[quic_packet.packet_type]] = out_pkn + else: + self.packet_number_client[PACKET_TYPE_MAP[quic_packet.packet_type]] = out_pkn + + return int.to_bytes(out_pkn, 8, "big", signed=False) + + def set_tls_decryptors(self, client_random, ciphersuite: bytes): + + match ciphersuite: + # TLS_AES_128_GCM_SHA256 + case b"\x13\x01": + self.hash_fun = SHA256 + self.cipher = AESGCM + self.key_length = 16 + + # TLS_AES_256_GCM_SHA384 + case b"\x13\x02": + self.hash_fun = SHA384 + self.cipher = AESGCM + self.key_length = 32 + + # TLS_CHACHA20_POLY1305_SHA256 + case b"\x13\x03": + self.hash_fun = SHA256 + self.cipher = ChaCha20Poly1305 + self.key_length = 32 + + # TLS_AES_128_CCM_SHA256 + case b"\x13\x04": + self.hash_fun = SHA256 + self.cipher = AESCCM + self.key_length = 16 + + case _: + logging.error(f"Unknown Ciphersuite: {ciphersuite.hex()}") + self.can_decrypt = False + return + + session_keys = [] + + key: Key + for key in self.keylog: + if bytes.fromhex(key.client_random) == client_random: + session_keys.append(key) + + keys = dev_quic_keys(self.key_length, session_keys, self.hash_fun(), self.quic_version) + + self.keys.update(keys) + try: + self.decryptors["Handshake"] = QuicDecryptor( + [keys["server_handshake_key"], keys["server_handshake_iv"], keys["client_handshake_key"], + keys["client_handshake_iv"]], self.cipher) + except: + self.can_decrypt = False + logging.error("Missing Key Material") + return + + try: + self.decryptors["Application"] = [QuicDecryptor( + [keys["server_application_key"], keys["server_application_iv"], keys["client_application_key"], + keys["client_application_iv"], keys["server_application_sec"], keys["client_application_sec"]], + self.cipher)] + except: + self.can_decrypt = False + logging.error("Missing Key Material") + return + + try: + self.decryptors["Early"] = QuicDecryptor( + [keys["server_early_key"], keys["server_early_iv"], keys["client_early_key"], + keys["client_early_iv"]], self.cipher) + self.early_traffic_keys = True + except: + logging.warning("No Early Traffic Secrets") + + def binary_to_ip(self, ip_addr): + if self.ipv6: + return IPv6Address(ip_addr) + else: + return IPv4Address(ip_addr) diff --git a/tlexport/quic/quic_tls_parser.py b/tlexport/quic/quic_tls_parser.py new file mode 100644 index 0000000..2574351 --- /dev/null +++ b/tlexport/quic/quic_tls_parser.py @@ -0,0 +1,196 @@ +from tlexport.quic.quic_frame import CryptoFrame +from tlexport.quic.quic_packet import QuicPacketType +from tlexport.quic.quic_decode import get_variable_length_int_length, decode_variable_length_int + +# the Quic Session shall create only one Quic TLS Session at a time, +# when a new Quic Session is registered the Quic TLS Session must be discarded +class QuicTlsSession: + def __init__(self): + self.ciphersuite = None + self.client_random = None + self.alpn = None + self.tls_vers = None + self.new_data = False + self.greasy_bit = False + + self.server_offset = {QuicPacketType.INITIAL: 0, QuicPacketType.RTT_O: 0, QuicPacketType.RTT_1: 0, QuicPacketType.HANDSHAKE: 0} + self.client_offset = {QuicPacketType.INITIAL: 0, QuicPacketType.RTT_O: 0, QuicPacketType.RTT_1: 0, QuicPacketType.HANDSHAKE: 0} + + self.server_frame_buffer: dict[QuicPacketType, list[CryptoFrame]] = {QuicPacketType.INITIAL: [], QuicPacketType.RTT_O: [], QuicPacketType.RTT_1: [], QuicPacketType.HANDSHAKE: []} + self.client_frame_buffer: dict[QuicPacketType, list[CryptoFrame]] = {QuicPacketType.INITIAL: [], QuicPacketType.RTT_O: [], QuicPacketType.RTT_1: [], QuicPacketType.HANDSHAKE: []} + + self.server_buffer = {QuicPacketType.INITIAL: b"", QuicPacketType.RTT_O: b"", QuicPacketType.RTT_1: b"", QuicPacketType.HANDSHAKE: b""} + self.client_buffer = {QuicPacketType.INITIAL: b"", QuicPacketType.RTT_O: b"", QuicPacketType.RTT_1: b"", QuicPacketType.HANDSHAKE: b""} + + def update_session(self, frame: CryptoFrame): + if frame.src_packet.isserver: + self.server_frame_buffer[frame.src_packet.packet_type].append(frame) + self.server_frame_buffer[frame.src_packet.packet_type].sort(key=lambda x: x.offset) + + for crypto_frame in self.server_frame_buffer[frame.src_packet.packet_type]: + if crypto_frame.offset == self.server_offset[frame.src_packet.packet_type]: + self.server_buffer[frame.src_packet.packet_type] += crypto_frame.crypto + self.server_offset[frame.src_packet.packet_type] += crypto_frame.crypto_length + self.server_frame_buffer[frame.src_packet.packet_type].remove(crypto_frame) + + self.handle_buffer(True) + else: + self.client_frame_buffer[frame.src_packet.packet_type].append(frame) + self.client_frame_buffer[frame.src_packet.packet_type].sort(key=lambda x: x.offset) + + for crypto_frame in self.client_frame_buffer[frame.src_packet.packet_type]: + if crypto_frame.offset == self.client_offset[frame.src_packet.packet_type]: + self.client_buffer[frame.src_packet.packet_type] += crypto_frame.crypto + self.client_offset[frame.src_packet.packet_type] += crypto_frame.crypto_length + self.client_frame_buffer[frame.src_packet.packet_type].remove(crypto_frame) + + self.handle_buffer(False) + + def handle_buffer(self, isserver): + for quic_packet_type in [QuicPacketType.INITIAL, QuicPacketType.RTT_O, QuicPacketType.RTT_1, QuicPacketType.HANDSHAKE]: + if isserver: + buffer = self.server_buffer[quic_packet_type] + else: + buffer = self.client_buffer[quic_packet_type] + + while True: + if len(buffer) <= 4: + break + + record_len = int.from_bytes(buffer[1:4], 'big', signed=False) + + if len(buffer) < 4 + record_len: + break + self.handle_record(buffer[0], buffer[:4 + record_len]) + + buffer = buffer[4 + record_len:] + + if isserver: + self.server_buffer[quic_packet_type] = buffer + else: + self.client_buffer[quic_packet_type] = buffer + + def handle_client_hello(self, record): + if len(record) < 38: + return + client_hello_len = int.from_bytes(record[1:4], "big", signed=False) + + if len(record) < 4 + client_hello_len: + return + + record = record[4:] + self.tls_vers = record[:2] + self.client_random = record[2:34] + session_id_length = record[34] + self.session_id = record[35:35 + session_id_length] + index = 35 + session_id_length + cipher_suite_length = int.from_bytes(record[index: index + 2], "big", signed=False) + index += 2 + _ciphersuites = record[index: index + cipher_suite_length] + index += cipher_suite_length + + compression_methods_length = record[index] + _compression_methods = record[index + 1: index + 1 + compression_methods_length] + index += 1 + compression_methods_length + record = record[index:] + + self.get_extensions(record) + + self.new_data = True + + def handle_server_hello(self, record): + if len(record) < 44: + return + + session_id_length = record[38] + record = record[39 + session_id_length:] + self.ciphersuite = record[:2] + record = record[3:] + + self.get_extensions(record) + self.new_data = True + + def handle_encrypted_extensions(self, record): + if len(record) < 6: + return + + self.get_extensions(record[4:]) + self.new_data = True + + def get_extensions(self, record): + if len(record[2:]) != int.from_bytes(record[:2], 'big', signed=False): + return + record = record[2:] + + extensions = [] + while True: + + if len(record) < 4: + break + + extension_type = record[:2] + extension_length = int.from_bytes(record[2:4], 'big', signed=False) + + if len(record) < 4 + extension_length: + break + + extension_body = record[4:4 + extension_length] + + extensions.append((extension_type, extension_length, extension_body)) + + record = record[4 + extension_length:] + + for e_type, e_length, e_body in extensions: + match int.from_bytes(e_type, "big", signed=False): + case 43: + if e_length != 2: + continue + self.tls_vers = e_body + case 16: + if e_length < 3: + continue + alpn_length = e_body[2] + + if len(e_body) != 3 + alpn_length: + continue + self.alpn = e_body[3:3 + alpn_length] + # quic transport parameters + case 57: + try: + self.get_quic_transport_parameters(e_body) + except: + pass + + def get_quic_transport_parameters(self, extension_body): + parameters = [] + while True: + if len(extension_body) < 1: + break + + parameter_type_length = get_variable_length_int_length(extension_body[0:1]) + + parameter_type = decode_variable_length_int(extension_body[0:parameter_type_length]) + index = parameter_type_length + parameter_length_field_length = get_variable_length_int_length(extension_body[index: index + 1]) + parameter_length = decode_variable_length_int(extension_body[index: index + parameter_length_field_length]) + index += parameter_length_field_length + + parameter_body = extension_body[index:index + parameter_length] + + parameters.append((parameter_type, parameter_length, parameter_body)) + + extension_body = extension_body[index + parameter_length:] + + for (p_type, p_length, p_body) in parameters: + if p_type == 0x2ab2: + self.greasy_bit = True + + # Only Handshake Messages are carried in Crypto frames, alerts are Handled by QUIC + def handle_record(self, record_type, record): + match record_type: + case 1: + self.handle_client_hello(record) + case 2: + self.handle_server_hello(record) + case 8: + self.handle_encrypted_extensions(record) diff --git a/tlexport/quic/udp_output_builder.py b/tlexport/quic/udp_output_builder.py new file mode 100644 index 0000000..c83bcfa --- /dev/null +++ b/tlexport/quic/udp_output_builder.py @@ -0,0 +1,46 @@ +from typing import Type + +from scapy.layers.inet import IP, UDP +from scapy.layers.l2 import Ether +from scapy.packet import Raw + +from tlexport.quic.quic_frame import Frame + + +class UdpOutputBuilder: + # TODO: change associated data for frames + def __init__(self, decrypted_records: list[list[bytes, Type[Frame], bool]], server_ip, client_ip, server_port, + client_port, server_mac_addr, + client_mac_addr, portmap): + self.decrypted_records = decrypted_records + self.server_ip = '.'.join(f'{c}' for c in server_ip) + self.client_ip = '.'.join(f'{c}' for c in client_ip) + + self.server_port = server_port + self.client_port = client_port + self.portmap = portmap + self.default_port = 8080 + self.server_mac_addr = server_mac_addr + self.client_mac_addr = client_mac_addr + self.out = [] + + if self.server_port in portmap.keys(): + self.server_port = portmap[self.server_port] + else: + self.server_port = self.default_port + + def build(self): + for record in self.decrypted_records: + # TODO: get ts from associated packets + ts = None + isserver = record[2] + if isserver: + packet = Ether(src=self.server_mac_addr, dst=self.client_mac_addr) / IP(src=self.server_ip, + dst=self.client_ip) / UDP( + sport=self.server_port, dport=self.client_port) / Raw(record[0]) + else: + packet = Ether(dst=self.server_mac_addr, src=self.client_mac_addr) / IP(dst=self.server_ip, + src=self.client_ip) / UDP( + dport=self.server_port, sport=self.client_port) / Raw(record[0]) + + self.out.append((packet, ts)) diff --git a/tlexport/session.py b/tlexport/session.py index 75c34b5..73aa29d 100755 --- a/tlexport/session.py +++ b/tlexport/session.py @@ -1,6 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + import logging import warnings - from tlexport.packet import Packet from tlexport.tlsrecord import TlsRecord from tlexport.tlsversion import TlsVersion @@ -19,8 +21,28 @@ class Session: - def __init__(self, packet: Packet, server_ports, keylog, portmap, keep_original_ports: bool) -> None: + + def __init__(self, packet: Packet, server_ports: list[int], keylog: bytes, portmap: dict, keep_original_ports: bool, exp_meta: bool) -> None: self.start_packet = packet + + """ + This class represents the session of a server and a client. + It handles its packets by parsing them, and initiates the decryption of these packets. + However, this class is only used for *TLS over TCP*, + which means it **DOES NOT** handle network traffic containing e.g. QUIC or DTLS traffic + + :param packet: first packet of a new session instance (this packet DOES NOT have to be the first packet of the conversation in general) + :type packet: Packet + :param server_ports: the server ports that have been passed as arguments + :type server_ports: list [int] + :param keylog: the secrets from the SSLKEYLOGFILE **AND** decryption secret blocks containing the connection secrets + :type keylog: bytes + :param portmap: directory containing how server ports are mapped to the output ports + :type portmap: dict + """ + self.exp_meta = exp_meta + + self.keylog = keylog self.set_client_and_server_ports(packet, server_ports) @@ -56,6 +78,11 @@ def __init__(self, packet: Packet, server_ports, keylog, portmap, keep_original_ # search SSLKEYLOG for session log data def find_session_secrets(self): + """Searches for the secrets that were used to encrypt the sessions' traffic + + :return: the sessions' secrets + :rtype: list[bytes] + """ is_handshake_secret = 0 # Only for TLS 1.3 secrets = [] for secret in self.keylog: @@ -82,6 +109,16 @@ def find_session_secrets(self): # generate session keys from SSLKEYLOG def generate_keys(self, tls_version, server_cipher_suite, client_random, server_random): + """Generates the keys from the found sessions' secrets and sets up decryptor + + :param tls_version: the TLS-Version used in the session + :type tls_version: TlsVersion + :param server_cipher_suite: the cipher suite server and client have agreed on + :type server_cipher_suite: dict + :param client_random: client random from the TLS handshake + :type client_random: bytes + :param server_random: server random from the TLS handshake + :type server_random: bytes""" cipher_suite = cipher_suite_parser.split_cipher_suite(bytes(server_cipher_suite)) if cipher_suite is None: @@ -191,6 +228,11 @@ def set_client_and_server_ports(self, packet: Packet, server_ports): # checks if packet is in session def matches_session(self, packet: Packet): + """Checks if packet is part of the session or not + + :param packet: the checked packet + :type packet: Packet + """ if (packet.ip_src == self.server_ip and packet.sport == self.server_port and packet.ip_dst == self.client_ip and packet.dport == self.client_port): return True @@ -199,8 +241,13 @@ def matches_session(self, packet: Packet): return True return False - # add packet to session, if packet is not a duplicate, splitting into server and client packets def handle_packet(self, packet: Packet): + """Adds packet to session, if packet is not a duplicate. It splits packets from client and server + + :param packet: the handled packet + :type packet: Packet + + """ sequence = packet.seq if packet.ip_src == self.server_ip and packet.sport == self.server_port: @@ -221,6 +268,14 @@ def handle_packet(self, packet: Packet): def decrypt(self): print(f"[*] Decrypting session: [{self.binary_to_ip(self.server_ip)}:{self.server_port}-{self.binary_to_ip(self.client_ip)}:{self.client_port}]\n") + + """Starts the decryption process and sets up the output builder for writing the decrypted traffic to a new PCAPNG file + + :return: List of decrypted traffic which has been written to a new TCP packet + :rtype: list + + """ + logging.info(f"\n---------------------------------------------------------------------\n" f"Decrypting session:\n" f"Server IP: {self.binary_to_ip(self.server_ip)}\n" @@ -229,8 +284,9 @@ def decrypt(self): f"Client Port: {self.client_port}" f"\n---------------------------------------------------------------------\n") self.get_tls_records() - self.builder = OutputBuilder(self.application_traffic, self.server_ip, self.client_ip, self.server_port, - self.client_port, self.server_mac_addr, self.client_mac_addr, self.portmap, self.keep_original_ports) + self.builder = OutputBuilder(self.application_traffic, self.server_ip, self.binary_to_ip(self.client_ip).__str__(), self.binary_to_ip(self.server_port).__str__(), + self.client_port, self.server_mac_addr, self.client_mac_addr, self.portmap, self.ipv6, self.keep_original_ports) + return self.builder.build() def handle_tls_handshake_record(self, record: TlsRecord, isserver): @@ -264,6 +320,9 @@ def handle_handshake_finished(self, record, isserver): if self.client_cipher_change and not isserver and self.can_decrypt: _plaintext = self.decryptor.decrypt(record, isserver) + if self.exp_meta and _plaintext != b"": + self.application_traffic.append((_plaintext, record, isserver)) + def handle_tls_client_hello(self, record: TlsRecord): self.can_decrypt = False self.server_cipher_change = False @@ -326,7 +385,7 @@ def handle_alert(self, alert_level): self.can_decrypt = False self.client_hello_seen = False - def handle_decrypted_handshake_record(self, plaintext, isserver): + def handle_decrypted_tls_13_handshake_record(self, plaintext, isserver): index = 0 while index < len(plaintext): handshake_type = plaintext[index] @@ -342,7 +401,7 @@ def handle_tls_13_application_record(self, record: TlsRecord, isserver): plaintext = self.decryptor.decrypt(record, isserver) subrecord_type = plaintext[-1:] if subrecord_type == b'\x16': - self.handle_decrypted_handshake_record(plaintext[:-1], isserver) + self.handle_decrypted_tls_13_handshake_record(plaintext[:-1], isserver) return if subrecord_type == b'\x17': self.application_traffic.append((plaintext[:-1], record, isserver)) @@ -354,10 +413,9 @@ def handle_tls_13_application_record(self, record: TlsRecord, isserver): def handle_tls_application_record(self, record: TlsRecord, isserver): try: plaintext = self.decryptor.decrypt(record, isserver) - - self.application_traffic.append((plaintext, record, isserver)) except Exception as e: logging.warning(f"Could not decrypt Record: TLS Application Record") + self.application_traffic.append((plaintext, record, isserver)) # consumes and handles a TLS_Record def handle_tls_record(self, record: TlsRecord, isserver): @@ -368,7 +426,8 @@ def handle_tls_record(self, record: TlsRecord, isserver): # Handshake Record case 0x16: self.handle_tls_handshake_record(record, isserver) - self.application_traffic.append(None) + if self.exp_meta: + self.application_traffic.append((record.raw, record, isserver)) case 0x17: if self.decryptor is None: @@ -392,7 +451,8 @@ def handle_tls_record(self, record: TlsRecord, isserver): # Alert Record case 0x15: self.handle_alert(record.binary[0]) - self.application_traffic.append(None) + if self.exp_meta: + self.application_traffic.append((record.raw, record, isserver)) case 0x14: if isserver: @@ -400,14 +460,17 @@ def handle_tls_record(self, record: TlsRecord, isserver): else: self.client_cipher_change = True + if self.exp_meta: + self.application_traffic.append((record.raw, record, isserver)) + def binary_to_ip(self, ip_addr): if self.ipv6: return IPv6Address(ip_addr) else: return IPv4Address(ip_addr) - # extracts TLS_Records from packet buffers def get_tls_records(self): + """Extracts packets from session which together contain complete TLS_Records""" packet: Packet for packet in self.packet_buffer: if packet.ip_src == self.server_ip and packet.sport == self.server_port: @@ -427,8 +490,8 @@ def get_tls_records(self): self.client_tls_records.clear() - # extracts packets from session which together contain complete TLS_Records def extract_server_buf(self): + """Extracts packets from session which together contain complete TLS_Records""" self.server_counter += 1 self.server_packet_buffer.sort(key=lambda x: x.seq) @@ -480,8 +543,8 @@ def extract_server_buf(self): index += record_len self.server_packet_buffer.clear() - # extracts packets from session which together contain complete TLS_Records def extract_client_buf(self): + """Extracts packets from session which together contain complete TLS_Records""" self.client_counter += 1 self.client_packet_buffer.sort(key=lambda x: x.seq)