diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 17afd6ddf20..15bff0c2915 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -214,6 +214,8 @@ https://github.com/elastic/beats/compare/v6.4.0...master[Check the HEAD diff] *Packetbeat* +- Support new TLS version negotiation introduced in TLS 1.3. {issue}8647[8647]. + *Winlogbeat* *Functionbeat* diff --git a/packetbeat/_meta/kibana/6/dashboard/Packetbeat-tls.json b/packetbeat/_meta/kibana/6/dashboard/Packetbeat-tls.json index 4e9d447bb2f..9b08834f475 100644 --- a/packetbeat/_meta/kibana/6/dashboard/Packetbeat-tls.json +++ b/packetbeat/_meta/kibana/6/dashboard/Packetbeat-tls.json @@ -447,7 +447,7 @@ "id": "2", "params": { "customLabel": "TLS version", - "field": "tls.server_hello.version", + "field": "tls.version", "order": "desc", "orderBy": "1", "size": 5 @@ -485,7 +485,7 @@ } }, "savedSearchId": "8f0ff590-d37d-11e7-9914-4982455b3063", - "title": "TLS Client Version", + "title": "TLS Server Public Key Size", "uiStateJSON": {}, "version": 1, "visState": { @@ -501,8 +501,8 @@ "enabled": true, "id": "2", "params": { - "customLabel": "Client version", - "field": "tls.client_hello.version", + "customLabel": "Public Key Size", + "field": "tls.server_certificate.public_key_size", "order": "desc", "orderBy": "1", "size": 5 @@ -518,7 +518,7 @@ "legendPosition": "right", "type": "pie" }, - "title": "TLS Client Version", + "title": "Server Public Key Size", "type": "pie" } }, @@ -1153,13 +1153,13 @@ "store": "appState" }, "exists": { - "field": "tls.server_hello.version" + "field": "tls.version" }, "meta": { "alias": null, "disabled": false, "index": "packetbeat-*", - "key": "tls.server_hello.version", + "key": "tls.version", "negate": false, "type": "exists", "value": "exists" @@ -1207,13 +1207,13 @@ "store": "appState" }, "exists": { - "field": "tls.client_hello.version" + "field": "tls.server_certificate.public_key_size" }, "meta": { "alias": null, "disabled": false, "index": "packetbeat-*", - "key": "tls.client_hello.version", + "key": "tls.server_certificate.public_key_size", "negate": false, "type": "exists", "value": "exists" @@ -1238,7 +1238,7 @@ "@timestamp", "desc" ], - "title": "TLS Client Version", + "title": "Server Public Key Size", "version": 1 }, "id": "8f0ff590-d37d-11e7-9914-4982455b3063", @@ -1626,4 +1626,4 @@ } ], "version": "6.2.4" -} \ No newline at end of file +} diff --git a/packetbeat/docs/fields.asciidoc b/packetbeat/docs/fields.asciidoc index 6322f4ec322..c0553b4c80a 100644 --- a/packetbeat/docs/fields.asciidoc +++ b/packetbeat/docs/fields.asciidoc @@ -5595,6 +5595,18 @@ TLS-specific event fields. +*`tls.version`*:: ++ +-- +type: keyword + +example: TLS 1.3 + +The version of the TLS protocol used. + + +-- + *`tls.handshake_completed`*:: + -- @@ -5699,6 +5711,16 @@ type: keyword Length of the session ticket, if provided, or an empty string to advertise support for tickets. +-- + +*`tls.client_hello.extensions.supported_versions`*:: ++ +-- +type: keyword + +List of TLS versions that the client is willing to use. + + -- @@ -5755,6 +5777,16 @@ type: keyword Used to announce that a session ticket will be provided by the server. Always an empty string. +-- + +*`tls.server_hello.extensions.supported_versions`*:: ++ +-- +type: keyword + +Negotiated TLS version to be used. + + -- [float] diff --git a/packetbeat/include/fields.go b/packetbeat/include/fields.go index 5207f8b9343..74ac82c0f31 100644 --- a/packetbeat/include/fields.go +++ b/packetbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "eJzs/Xt3IzeSIIr/70+Bo57zs2qXoh71sF376zurllS2tqtUaj3a3TM9hwIzQRKjJJAGkGLRO/e734PAI4FMJJkUWWX3bsnnuCQyMyIABAKBeB6gR7J8izI+n3P2DUKKqoK8RWfu75zITNBSUc7eov/nGwQ/dzMiCZpQUuQSZZwpTBnKscIIj3mlkJoRRNgTFZzNCVOIMrSY0Wymv7AglMBM4kzDRVygScEXaIElynCpKkHy4TfIIngLbxwghufkLZJEPBFhgSSJA/LgacQnQIp5B6kZVub3HD4OSBh+EyHJCkqYGm2LizKqKFaboKMZ2Qxfwac0wwWyL2+GmJbrkV1eI5zngki5yXSa9ydczLF6i3KuNDGMK9w9/O2JWTHsTegRBBdrqbmM0FvMlE2bqBGVCKNS8E/LAVIzKg1Xezh290h4jws6pQwXdkqC4Q79C++4QD/d3V0P9GgQ+YTnZUEG8HowO+STEjjTg5wIPkdY45nQaSXwuCAeloaDZgTnRAzQeIlyMsFVodDD3w7ecbHAIie5/u3BzpD+uWeFRlAPRY8wp1IDzgeIKoSLBV5KNMN65E+4qMgAYZbrr+ZYZTMiPTBN9YNf/wcYEuPMzJedBdlcvfM+3DQlPL2Emo1+JPzyGlFmIIIIMstpXnYI1bIkb9FU8MpBCiVSiLTgGcDxX/iXCR+VnDIVfGPX7C3634UezuvjASo0ZT/8v8FDHWznNoIZgUPryA+n0jEOuotWCj9hWkRMoH84K5aITtCSV5oJKCMIRw/MlCrl28PDxWIxJAWWimbDjB9OK5qTQ8IO7WeSYJHNDsuimlImD+dYKiIOK0nZ9ICyKZHqABZmOFPz4t/NIK4Fz4iUXPwHAo4paUkKTQFlwXmxAzLaBFzCJ3YyS0cHMu/9hz6XgHT0nk+lwnKWZrWSC7VedBV4SQR6hfTTbr0syp1KL3ixH0n+UU2I4hkvUCW1yOCiRYMWeIwrJEuS0QnVW13NSM3wKiuBvaSs5ub0jli9yssGmcuyx0mnn3KTFQrV/Uj2GXH4YXn7l/cDdENyKgd67W7uP7zQ/+5p5WJPs1OGJYDTH3ixIsgvFRUk11NXkZjKHS3tLk5JDXAz1aAXCTFDz3O989aj0eoiZvkB7NPno7P7Z7uRbahl7W6MfRELUhAse2CUfKIWWBD3RqjjaN0O/m2rGMMACNUaNENjYo4zPp9ThWiutwFGkswxUzRDT0RIQ6dV/2FDjMgTgYPK3gH23mml/EJ/uJe+CfS5B4BmT5UkxaRLp9+TCgs1UnRO9qKjN8eKpHdpvHP+/ve///3gw4eD8/O7n356++HD29vb4ZwWBf23phw6OTp+fXB0fHDy6u741dujN2+PXg+Pvjv+tx6iiM6tmjWhQipU4uyRKC8rYZha5RkTwpAkpMkFe/po+qcZ45xLhQTJtBZqmZ7kG495opXZNXo0y2mGFZFa/QAG1MeIniv3FwM8cAABPP39BBfSUuqY1k2hFsISYYYoU0TMSa63qCFVKv2r1nWadBZ8MaL5OkoVERq/4egcjbGeE8405zNiDqY5UdjuAJbXynuE7anAbB0qRgQswV/fn155pR4OZ8oQI2rBxaNdjiZ4XikiRuuR3JKMa618U1zxdZxXwl9Z2/pyB+prwUsiFCX1NQ7goBmXao2qPcdZPzUZoVsD9MPpmR8Wlohajsv1jSfay5qDPXNnlRCa/4D5vmmR4S8Xa6moF/Py+umVG+nGBDWgriVv9Lw7yd6ro+F3x68H6OC7V8Oj4+O9re8ktByZMT+E91l4o76VIKkEZdMIpj1Q3IlXYEVVlRPYWQVnU/OXJCUWbvawObUTE2J2Rd9Va+2NZy1dBLInXzk6fzfL5wlav4gRSLOgu11EWj696TegaNO92c2mW7vlnt48d9Xe+FV7s6tN9/Tm97Tt+q5bauNtvnzbbLzf0SIGJP0ONl9wF163iGa54DrMqvmYiN2du1qHk+2FCXSONcR9HP8nyRRaUDVzfKW4fkFRZqYf9Ls5wbISZB4aIFFCLQlpY0SNrJ40Ulx51TemVU9844uV+gNCdxqWm0k+cbrYN51EjJeKfF4SAMM3DWVQT+L2qmC4FLvUB88DuL+pSthQCMPxfuYD6nejVNBypIf9uziattEIN127WEhvwFu/X7Vw3Tr+fpXCL7jxfkdKBRDzu9l82+mFX3z7/Y7WMSDpN9+C/VXD8BD+/euHIX8p7tTFr/phX/0wxEuzebnexnr24RrR3Fsf4W9jZw3W23t0vN11LWAOn+AC3Z1dh/ZamnsfCHhUWj6Qu8DruK0rJAoLaXlEYlWaCkOhHUHSNbDWpL6YETUjLWeuFgqUjXnFcrRP5lTZTWeCWV7Ukya04Gs/V0dKvBiiv+KiIt7rRJl9a4iuuIsn8Ruk5FLScUFGEBUSKfOUBX/wSjXMzAqrSq4etpZ5MzqdoYI8kcK+knAeG+m4wEu9pTM+LytFIJzFQwLqUE5KwnKJOHOuP3CRD9DYLqcgsiqUjXOZE8zCE5My874WVbXzECB0OJ7XTtHHPwd/XAjBRfD3rQlEan58ZgKJzMfRlM6JmvE1uyZwgx4+ETE+NC8lJ7WOS4LQICojLcm+CE7c/R8v7gbo+uOt/v/9nQkOkhxx9sIENd3+5X0IBGnUaP/24v3F2d3Ag7y/Pj+9uxig84v3F/rfGkrL/xp5KVY58m0wnXvD+HmBlHD7CDIhQiLFE6P28DTh9zfvUYnVDFWlZjZz0EqFZIHlDO0fvjAAfCADnfjXqEQPh5UkQh4ePwwiqJ66+pkHA0jLGy0t5aD1oFqWemjFMloWhceFca03dAbGFZrQorDRILgoohnQx0TT76QH+gxppdHCHDWF1KpZdtMUh8VpvommoH42HKh+9JEsD8w2l4oL93S9e81bj6TpKfylImIZ2TgeyXLBRY+NBK9qAYnRrJpjPUCcA1nGxRsOk2oFRM+5X7VxvWiS692kNbeCPhL08OPFHbKsMjKRT/+qif2j0mqhgWpjY6gKObQJx2wwffxCzCBA1EeIMBNn4TUXXeC5jCZEkU89YmY0ixBQ8QSeE0WEjJdZn6ZYmDAGLSr0saIHGjwfrf3dTNCJOri5Pmu+Xb9hxqVq7I3BMK7ImkPmA5EST4kFdQ2K1phg5c7zMNqukhUsnQ/xJFoKo7kHEUhqcFaXgvgQUoEXwMsWYhiraI/aGSnKSVUYxVjwalwQOeNcQ6gDOwRe1MrMDfzRjIZsqy0Of7gbgZaO+A07mxtygV41/ZQ/Fxtb1nEIluYCYM/hBRX1VtjHZVlQezMyYVicFUsrV8eUYbGs4XvwvKpnXpBSEEmYiq5XaQYRRJacSbLzkRqwv/VQI0U4vOAE+vCH4GO0H2jH8sUmmnEIHQlSmDAqngptSnOcmTFF5z2Ol4U+vrKCZ48Q4aLFoOL80el/BVFkVUyV1txIRqXXnBHE3UgwScg4WBhuTvElpaxGXWRq2GfX9xtT1YXL3OvomsAPiKaLb2pNXkBXXIXaj6S/kqZy0+ZHK9lQQdhUzQZwh3Z3H/OZw3N5jQLhp+9kJgo9NZvmAxcGZR0P7VHrO8Pzh23Y6Z9r3DmTAWO13lwT5wX8hh+J1rCsbqJcmKXNagDND03pE2G1lKjhWAHmVRQfO3xz/wHtC4KLA61DHMw5o4oLyqYv4O6U4fquhwvJ0Qw/EXPpgkPRoj9Q/MASou8gFXOTvpgRhs6vbkNtzeN2sZI5lRl/ImK5bidngvudnLIu7GSKnfGqYX1QXB/kRGrtlMqZGULEbGbyNxBMncMpOM53OhYtyvXd0gxCgyf5sM0WHlJf9qDAIWiOHzUj6mORMsTVjNQzk2kFX5+WC1IUz56RnM+fOSmXbMUgzN0LjGvpmfNgzj9+aMzeJUOKiLkXTD+/RFf4iU4N49/RuVYPT68v09fNnE4mRBCWETQmaqE1iYecz8/MQr0HHBcsf9BXZf9i64lbhQXo+U4f0PptrQH8yfyVmJkzp+eaZEJ4z537Pu0ELkBFYYM77T2ywwimAQz1rz0EexAdrinUnJN74zafeq176DK34Cl4LbwSEWXTTuqEKRMTQG2SFTOng7k7WsEDMOFupa8QITDDCzMulcVkn7/jgCqiY6C/M7Z9/edDw3bZTdewPWkOYw+LmaMNaz1MVYLVNj5eEmGS2uRSKjJHPMjjNIQHcycqxuDu0aJG74JfeZ+Ye/fk56TGBr+vJ8Y+6NgK2BkWf0oYETbwn0rDys1o7/+phyIVnpfPC/cOnvNOpNNqWkmFTt6oGTo5On4zQMcnb1++fvv65fDly5N+swskmSPUR0/DBhEk4yKHHFw/vmZqEZ6uuR6fijFVQt9E9LNmtux1VfN7SYRZKMxy+CM42GpJtixJK45cS4doHjm4aexH5o/RBgYZL6u09I6SIy2yBgUksKv2jm0Bq2vj5qP5F+c5te4Ifa8PM5MAT53x2BHzEiRPoQ5D1AqyatLMVFsxT7LgnndxdpsW8hdnt36GYgKj+cLTOirfgjwNPoLJe4t68CwAShkoGr4VeO7QeCUO5YyWpc0KrpUGQXyyjt2ybstxxbgi0dKZPSffwpGsxa5dIM2+5iQv+NTaWQH30El4LZJB0MDF/PT6g7W7RUe/GZYVUk6047I8tPrrMBh8aPvJOTHG2WyG2ZQgOvEgYUL0nQUO1png1XSmFfuqFpnSWPr+jCePOMyUsxkewYP1IVZlMy2NXQokMmOy/obNM2Vj6ftM7v1rLJnN/NdMaH682HwzPBoeHYjspEVMcEQ+k5KrQO9YQ4bjixYVNN+OhntGf9HKSE6YohNq7rdwMhn+2acTpM9U8olKJV+0KPTc/hY41nA4vL/gVZFr4Q38TPNhalzf41eT10dHeWtcpJyRORG4GG07wgsHaZtBmptJjpjeTGCXhS0kEdY3BK1vQBqaNA6+B7OaNH/we27V6CdtETiuc/6c6lx/YgXg8XoBqMHA4enNyFp9tgLR6D9YEGcyVLw0/s9hbHfTj1i13A4XG/eCMYKAPJSb7+aEmoNSqg7qUnf0TznDkrxFL1PTu6f1nIOj1wcnL++Ovn979Prty1fD71+//LeeATTnWJFDuIU1VB5bakG5XOXorXdGvNtpiWy1eRfASHEaRFcs/aNlNrxBzaOC4BTmGztJ1oXgfG/h+rS1gVotQyv2Vz2n//6PvVLwvAK96x97A/SPPcKeTv6x9x89Z/U9leDVtkis+UVxTQoiOJuFB2yL3gKPSdGmONLoIoL/9yNZHr81d67jgcZ6Yv866Vky4c9keWiubCWmojmR+ufMaKluIDjPTS5fePgq7hYC3c5ANMJJbJUSRqQi8aKbIckhOi0KZ+DSOxF8jrk+Vu0MrpLJDznPHomAWzt6ePxePtgZ7Jhee9NtzW/gp0D1rjtOcshPpCg4+pmLIu/JEq0tQ7xZ1LByVOgkuJEnhn5p7T1wITa2ngS8eMEyzjKsCItlDvI2EeXmvxaZcJufCEKKJTJ+U63/w2V+XhWKlo0iGd5xB2cMqH5LR0bG52PKIGhJcTiI2sOrE9F5lccnw1nwUT/d+J2R6w3XCYDWKhplE4GlElWmKusHNStTa6DmRNA630TweU9leII+ECVoZnye0muw+lxh6OLsBAwKwKoTArVejF4K7lIaoNePDQKa4SIU8Uik4FOJ5jibUWbWpyYivPBDrA5Ggsy5Iu55xCslaU4CXGnqMIoLMKGmeg4vuxTwiKUN2BoUcKtFH2r9zjgdTdzmp24p+BPNA3tosHVJoOZurdGacTl0Q8cIoSgj2ckATTMyCB0bZuNNqcIFzwhmHZLKGgVpQdVyFBiIogFV8oBgqQ6Os+3GdRogQ2BjCqqSUWn4tl6YDpIFmfa7vbTp70fmDSB4Fm2USYVZRoa91G1PID04Pnn56vWb777/4QiPs5xMjvqRemnxoctzxzBAqNuoa6jc/vLlCQitvz1IcN/2NKP4mVInwznJaTXvR94HJwGCIjY9qMNZxiu4emxC25s3b7777rvvv//+hx9+6EfeXS0PDUaI3BRTzOiv2AbH+uPV3ruW9XkawdJfQg4XhDfB6XmgD2OmwjqA3VqOfItOf771hNB8gH7kfFoQczKijzc/osscbBVWM4A7bwSqvhqmzlwjqr3M9GUO44/7nb3+rfB25d1bLbWxNlLZ4klZixxkK8qYk89G7fFJCKZxoZuRokQZF0YBMGcPBEp7iB6HDVbCbKkFiL67bH7k2Be32683BgiaY4anxjlDZU1n8n5tlN+2FNmNzcTjRqFxwyOZawVut0YigOn9pwa3vg+OK1ooFPp3YyoUnm5HRM20lgQ8bePafqw1Ggi2fPblb4VJfw0FlzC81hUpTFK1OR2xLDhvfdFPGoQpLXZzmifHBOVEYVrIQASEKSV8EuTmmKSNw8gy3X9/RmmM5rXe6aitmpoBjd03Za1BaWlnb0omH5ILk5hlARLZZoCGa/KZbPaTc1t2kYy605OSOS4rcF0HZd1W4olTkZ8xqjAtuQ/CnM8x7aONJi77PZO0DIo2almNvwB2jyW5kYPLmt/DwWd9ty9cyZonueLu3tN017WP9YiSrqMchH98nMPhZy3sGE2oIAtcFANfc8nAHSCiss0lwudhxmign0n4gP/ri8mNNLYnwvLoQpu0oa3kYmArAyda+ASuHbjEPD5b2a+JRBJBcTEyAZA7QWUg2pDKNkIXyjHkk4kkaihJmx/7y+A7FxhioEXXKcpQFIsb614+4tM+Y0xm9AnKftzfnfmAIAuZSnRwdPz25VEry9sYkCEvY0zQwetXR0dJlRW+ac/H1j77ZkFUw7u1rQzEScOg1wQgiIlSQqUgptBvjgprzXfwICYL3fI5cWMCuRiBeiAsh2TnhwF6cJJL/05zCf+U8A/UcX5IzpJ7qS3Yo1gLG44QfNQ7diCIOodsGxv8bmMsQPtiS/RIWT5E9yb0am6KapsHouiBGS5LAkaZghjjoZ5oa+2GHW4t1SZhpvYLmcSQwHvHDPxofTZQ9HbuLHbxnG2qNvYprA04Sdv860t6vpOwFg3H6eAuBrA5Os9sT61AlYun5wSqmNVOGQQgUPaT6lIeYOv6bODfhBsuz20NJHNraUXIoJX+/oSC51cUKzLlYrnlqsLUOlhdrn3ricEmpMsJt/itxlDm4EaQaW7cXmCfGnFtY7i5MXdoeeNd7tbIG/qyNMfA0rcNvSgIu/dRDG6gNkpSDz45Vjal7NMBlEc4WDnuRjjes48qmzjmGno4Ag1jRYeZfRJO1icslnB+RfBsxKfi7jcIFDfhTAUkclOWFVC/wiQjmXT2rBJULZ3bRQ5imDayaVzw7BFcMQL9UmGBmYIwvf/hAsz1v3MuiHHv08zj0BAikFhCCjGz58IAYn4QPeQ2yOrTUi/vAou8PjzS53QdYLzxQgviTSltOc7zqtihNcvAM4zdVwdpZDPGbwRQ6xq0JiKJi6AOf2Lc86X8pUgPW5MmSdsG8OxxW4Ada5dxlpESdCqMHuyzD2hfc4NWMQ+d4CHqhU9e8ePErYot1diqvHZihuhSxb7ScEKNSNHTaiqlFMsYmok9gBw8S4QJXcQsDz6yKwvxq0D1MLbnBRNfl1xJ3DqeiN6C6zT/lcEI3/UMQbi1yPxBZq/g7mO7dlYA/WySvEiHR8O/ZX2dc4JN5u0TEYEXxCda+FAFvTjfSpPxH0E01t+ygKRHIrTQMjkulfBEUuJCtZikEtJrbLjWyggg1zemB4MnZvoP6F6zj6oYViBNIajdunptLQA54wtm/A2ZKpZoSSAx979Qzk1oExePEUjKTM69EaHRV5cS/f/+cHzy6n/U+a/NvNT/gjApLh41IbCXQJGqFewIoDHY0OxRJvlz75aU6PgHdPT925M3b4+PzK3x7OLd2yNDx609KMxf0aLpZRMEK3BZEGGeOB7aF4+PjpLvLLiY69MhI1JOKi28peJlSXL3mvlXiuyPx0dD/d9xA0Iu1R9PhsfDk+GJLNUfj09envTcBQjd4IVJN3YBM1rbYIoKz/v31sKVkzlnUgmsTEgOZYpM9UwkBBtqNJLRq05ZTj4RE1CR82wUxAW4jkBGVmGmHx83i1ibqBuSD8LEr7FmCCUoeXLdix5c+dNweQH3W1MJPpwZT0b4XWvHzLCcPW+31GxVu81Tv53+6ey895L9BPVASiJmuAQdwsRaTyibElEKytQLvYoCL+wCmLQxyFdoiBnUe1U3tz91hnCuUQVdJk0iEsx9hZm7QXEBSQY41/sc6n90aBEGmpw5E6q110JcXYmNzb4ORvTylipfZCeWz3o/KJLBk+YQ1XS0CBwTfXil9Dazu9wLUEdPxPGccMZWUpkQsigXDg6Ob+J1dMdYm5ravrBmnuqCaQFdR8PjYdp2Bd90KFE252zdWb7KcujS1sKjGLoMYMbTNjx/kzTZGy3kjSDjFcjN6rgskGaoWTKe1z7cxYB1PpVpgaYoy5QRWf8z+M6mDAYfOeQt/aButeEfHrrQSmnrmqgFr7/11960FoNt9ZuYGCMWoK+NZsjGwKkJTg7by0Uwx0v0zqYygKSHgwDMSRkuhuihHueD4fUwa8d/Fy9N3K0upHDQWDdPrB8CDYOpQ8aXWqs1DhZcluaaWOLsUR+J5laqbx3GXpdYnJb9t34kQW/YJ0Mj0BObprzNlGt47dKmh8H8xYuv59/P/SAcRS0WIeM0vakElY8jmXHRvhJOCo57mvZuqHxEAMVccylvqdtonwynw+BGzovKFA2Jl+1eErTklbDX/G9l3RLRXIj1Yq0dzEjfmbcZ0RXcuemvJAeoawY3MGGnMsMF6FpHmtGOnXMgab2ZY8pMxYRJVbjGe/oKAXYGNcMM/OvO7KHFB5aSThsioyZOmvpnGswCm8NOEoKwNR/AUMwMBukfNtcrYRXVdz6LqWEBtTbSd/UDnQHKPpfSe1LjcAg4m+sE5vV2z0SlsaQhOqLoGmqLcRu2WwRXWAhdGHVGPEGxpBjLRvaCFmK/+npV2AFmuFj+6lUD5zU2PBFBgiyQ6VQQUwcgPiLrLBAxhfqiG8zNHbxjyq9B8YzlvKAsvEal56hrlrrnaY3+u7u56jlb5JMiTDbTjtuUd1IN7O2htLY6kG9lMC4KvkAEy6UemyJw7ECN2xBEMOleGyutYtVc6tAy3YNuoBWMrfumjkFOBcRS2vV+kZyiZlTDejznJGhBnIp/qPdfAxdloeunB6pL/UJtOHBeHmNvZf53I+GSKKvAd7Lh2t9Z8yu6PEf795fn0GXSn22Ba23/Fr6sB4/4ghGRpAe+2XhV4a1vTRp7baBrgJ5uNtRrQedYLI0ghjH+2BhGGktUY3ljPGFURieO+Xo2qa8yb14dpRF/0LwTrgpliGcKCn+GlqgkCZL+2iQhugC118gUkWK25NS+t6BA012c5043fNDQHsIiFvrnQVP4kN6i8ygmN3Ehioh5j6UyFWlg0K5+zwLcGzk0dU1iybbBMicKg2fAZNvmCWVjSnisXPzoP+jnfv2R8NDTn2EhlmH6EK4Dr30Z9SBxyt3sPTwuNE2RUR0OFYYurw2izT21erYpI0yNdhtP7OG2I3Agll4sR1Ty0fau9TMDDV3efgQHeyK0d5PK+KuyS335eShGbyvTt/GZXJwdzKfNuUkHLGdULXeA40wfDQ0JHYa2xTvgp/qTfltAv9DUtkP+Ddkd8A3RqbGDO7e5B1XOlhKqINs0lQHC6IkKVYUfQWW4c4jNbwbwe0BXznMZRGpFfr9G8qJP2Avr+sQ7M0qyPsx4UZBMOftxmI8JLgFvEzHNzRkhOXnG1v2/LpJtldW7Dm5rzdP2mwQY09VRiSpnBbOUspAYNnaGpoVWQB/cuw+2khRkh94z+snde20qZ1U0PKS/VLiA09AGP9vqXMDyQIzvgR754o3NibA4MVOPN6O5N+KaqVdcv9M5562p7RXns1mYtQ39MXyXMjudyqhwGeMK4WKBl9ImX5l6ZdblY0wUgrg6+M1rGWXGrtMrG+xtZLeunA/rwdeDe0hkyTw/BhlkJy3rbr3JJdg6nvonm/q3Bs8O4kRtWE3HZnnHhc2qc4m9tsJF0Dh8HqYumurgPvnxITbZXU7Q03zgUrmszTHKbxqgqFu/z+ELToMIYs1C3WxjftKb5g/ooy8Vd2ssaClU/uIlh2WB1SRlM9xo3j82C9Q5sGg/I0xxOUDVuGKqGqAFZTlfSBPa/yIlZ3MsFja5IkVxT1lbOys/4Ax9vEV/6+mSbI2ldbmMyJngOS36RPnVBOVkTDHrS84tMijQviD5DKsBMu8PoIDDWObJOU2R2t/bGXh6j4bHJ8M3z527KCi/RRMW2YwqAoUaNqLq0/dvRm9ePZeoEG1KJ1WqbOikd3fXG+mk7RIVGoSrJCxBu3eVl59Re8hVJI4amayauVWyWanSF5w3AJPu0bhzSYIkW0faNJ9J37r6q4qWKlsc3ja0ie9eAW2vjl51EzTmeXt79o/evrOKErBFTZKGmqTF1I9ZcFG0y4LtJN0FpqaV7BJQcDw8bjN1wacxT7/nayr9vmvW2fKWBMWDejebcy8U6dpuDt7zqe11ZLVjT0/i1G+lc6CHn09vrh4G6OHi5kb/c3n17mM6VePi5qYtSbcKOeuOzSp4hgtQSj8s9YBC8bZRyE/n9DUYuy7t5V2NQXUiEFJRrABsg+CJCNyYTDgwSUEVCFuqUAVed58nW2KRDPq9NPcXAeYzcyF+sCgerNujDhZ3Nx3MAl+0hhyBDNjCQrJ6WiIOxw1+0BrgMHXVgpLtuBAE50toJGNNiMYCJE2RfMgteiSIsIznNsKakdhhVFBGJJTsebKFnAqCGYRPrq0T9ayANCS5jTT7thWR9ktFBFzrbG6Guaz1CkqL5IwNBohlzVX04XOPUJ8bavuxoI2kTlJt7H8MgOHRpDOMl7YgM2RKcSSJDYo3TEeFozR9jsJB+zOd0ODbLl9jt7dxlb9xjcdxm8G0ptW1XdlOnl+5EBILDXVGXAfKWeCva7QMfCYV5w6MEx+O45TAkwnNEvvwhmR8Picsd0EGsOPeNmb8v7meg63PXZPB1hcVe2R8wVJTEMJqTYVNsiD5aFuzQJCf7COPrE8z+MoeIJDhkdZGfjgZHg+PhycxvX+whcxkawR2eMO6j2Y4hP4qpOMp1+4R4KVJ/L6tPjoqXEPR3dFhIaYpaRfqdRyys/nwfS03mxBPx+5mxFOy4ZRAg4mdzYdpV2Emwxgyq7kpQBTMO/rvjYVI0vryzfcdxH7GSUvRbL8LqW5T4Mk+edU+x8NqWPFh/rH9Tf9U0ajIlnXaECa0cgdeS+g9nM4Wzfi8xGypNSmouVVf6sI0cCwlz6iJOqRqliodteQVwkJAEXGT5KOIaSAZZAhhZjQqOCDjei8ebziYZ9yDttRIwnVYZaP6fGnT4fiHMffIBs80rJIb883H22Yh/DSTNDtlDEMocU1oPlEmeUmvN5TJNLbZUpAJ/UTkwKdJgj9lyOXwvz1oPnioJBEjUyQbPtx86T+71RVI7zC9vkhXG6utrmuZ9MtYW0MyvqCV1a36Omvri23KmbQMrAci65vm1GVkhfRJSJQxje7b9D0SwXqZXmryXg1fDY8Ojo9PDmwK8HOJNLhX0xrJEJsQEAuS6+jD59TD6BQf2GHskBlw93fnR11+0OaNxnmo+hTz8BDND6NtZGvuhjd8I+UeHAUlzR+sgJIKL6UL7DPIXGENfdUPQqYyXtI6pGBa8DEugmLqjuSmOb6/1MKiV7X1VYHBdkawmFbzjhTwD3iJxsQey74cFWQnScIkBbd/sqpQwLf/vndQ7A3QnhbV+l+Xa/hm7z+eK+J6DCtxCiNrgIT0BJRh6CtdCj4VeG4D/wSSdE4LnM5pl0G2nt8aiTN9g6Juni1jhCvw7QZhicGr3XK519EmatsMfYcKQHVkhelNBt8P7BZTLmMGS79nO+KV4jrZVijdRh/2V2pcTexm6UQVfgeVaY3IqEODjK6Mw71v44G6FN4JZbm16DrJBYlVptGlM+17eA69fiPlw/stq/a4zqW2jLhrG5RabNP2xAajm9iNYllX9DWNTuu2Q5Ce8kjkqkTJxvwFpQPMWrHAUdJNmg/3uJzY+whB5FNJBCUsA+u5lFCyX58kGqYgOVSPMGWfB/qlCKA+nexNhtusO5q7XBhHIAQVulWHZyRlU4gCtpWpm5TW6uHL78hrMp6QI0zeZK9++O4kH5MfJkfH373Cx29efjcef3/y6rvJm+Dd1XE9PaXuSg8KKbBUNDO51D0VkzCC1HdM9fU77C5aUUbMCO1GCwYTx53YXhF76D0cl3pHPVkEYJkCy2YhoVBCSKxrafXgAJr4L9fGKIL8AMz0sF0UzmYhV1ZEArQOvFLF+ay7QXxmQ6kAemPdt1HgV/Lly+HJsG90QqOhl2PJUMr34UsqTbKNNN5Z/oiwVmmNVYMoE3EfC/uwyyPuZspwfr5QXys3CTvvbOUGtkVvq0oU8el/f/N+9VF/f/O+GZ+M6z7n9zfvTdtsJDM9JQPbHwT6RGJrwQqQuPrQtW/O1dBZbb6oRDH8bw9Rl2U72iH6MyHG6Vi3TQnKsCxmhJEnInymZj2gZ+oEM0EmLfbpb/l6VxWFXgczNd4L2qe10IN+TaN/MBl2/w5GPQPjP/ZnSpXy7eHhYrEY2rNlmPHDaUVzckjYYQQqOnwOBbH9hw/fDE/iB01PADthMzUv/jAK/X0jvfgjZ1wc2Xw/IV+Y4dmzKd6fzZGG49KMo4hU6XEPXT7hQ0NTJAxKaug1VlwrVwjb3uh4irV+0Olkr0SBpKJFYcvW1CEA1pWt+UXrI3pjmgSZ1MrUq8JQI+lRmittiYVh9fqm7UL4M1M7IFbWbCPIh3jceqsYb3f79vmF/bA+tuj+5v02eZ9dmZ+WUUPfqWbvmrXfvnr18tBw8L/+8seIo/+geNvRakTUdpL/FmB4Ld5EntXSag+o3EtlAUBvJrCTvH1wYQ+u2glIL4DcPfS2HPoshZXbQ6onfM8213U/l8yEkNi27rBV5niJQJzYDK3La72nD7mAau7W2V0szakBlqsIZBC5b7qqmwBnaZp4R25dUA6n3Afd1HkDUapXNJP1WNpmglSxeSjBE+UF9Kw335rGV69epqP/Xr1skxLmgm9+wkBSdudy2h2zN/ztJIfmE6MdnO5UWjhiQfJvMYF6l5rTwxAU16Uz3xjLb3Oa44POTXlDOKXEAwiGfwXBQD5BRcygRkmIEZKFzFZLVqNhXMOB3eJrRgdjcblG5jsMOLVy6Z4aNA6heCKMKmstxAyRealqumAI5omHCIqB0Lh0+hwvqq82rhqfK5ViKvL9thxqyNYi+nPx6UTg6Twu/fMcqyEXYdiPVmjwBAoV6gX5w0Ow9xUvO5nvD8lTyZHYJt5lrm9H/L2F0thIbXQllrIB9lm1PQyUJLpvmsNrXJXkhu2mfLmBpok07f2FRx1PCVKQJxywhuIorIL5LnDr4CfT1YVAnm/Y20V/QqG0ZXhJBkQzVxzXF62h+aC+4jEIMlhaekyNXlN8hteXHzWrfdRfzqb6sdHApmraWH1LirjU7u48JqEVrsbR2lL+bocdeHMxhvxNU1cRKf5IGP2VJLpYkTmmzwzTXrPhDOg4nw3tpMjielO4Y75ZbI5u5eybByGWhbPlHAoh6UcSc33vqzFBcAPYR1ykg7UkOsdpxtnEMEqzKUwjitFXvmyW4QrlgwmjaEsJFH6+mawwIJ3EqA1DWs22ntex4AuNxMku/e7SOIM8ODnjCxvAviBjb5ICS2yzarO9mFae8IYHvv/O7swt6K963TNLzlNsWQyiVlpoGwVvtt7SPpG+u8nMDjJhGqbTtUjn+D8TjW36+zE/6PdT04o6pnVO2XYI9fubICyxyvrIndVXn2y2Cc5NI4TOZoLPexaubB4TXTT0Twvtiaw7juxZ+ZT9mbgX4s/CyP0wfw6ObmM+0HNYtwsPW4X71G1fX+ebJMYPrvoOSOmskfVtag/ZGgY4z0fwwMiX7LFhAKZvihPW0emlHx3CW8NGU+pEQ+qOGVnVcPra+p+7Ok43ukx30eY8u7XDpoOWtS2N12IIduA6HM3CFuux2AdGgXeyszlxB/b1TYm7kHd16+7u1N1BwsaduFewHDQJ9ataF84z3xx86s969hVNS9h6uBt71Aq8A0G/bt52o/tWt66Zofs7AdyW3oHWC00nuPlO71k540KNQFmd1rmRmGUzLhy+A7/Lv4k1Mq8WhR14Nyt4ZaoCfZFevQG6eapT1Rds2FuTsv1xvK6dbo3rSzfWtUxra1fFdasSQC7ZhIeMaqPnm/3QHW/qz9dyZlg3q//lQg57RwCvse02j+xvZSPA18/SYzXWX5hcHTtXfw4/S2Cqv6+L6EUndg0UhTO1etPXL62d3ojozSa55PkOmD+YgZLnRsdOoqq2FTEBpmueo/vL8zYi/X9Z4m1viAGqGmIbGc930Xk8RMZz0jGFfUVHP0QGGprjso0JrCHGjL0rdAHINM5diuMAbxZJ5lVod3AgJfEauFbC4PkvZS1b9k4//OV6rylX9Id14FPYsHDYIQIsVLRhYZayWB5sWfsEaAVIpp2jrdMpBBcDFyquP7QFSRIYo8IoHUQ2DErPOQfIJ4XIp7LA0DQOBb0m2yxRYCkPtooif4dpodGYGjUGYgKT+XqnqC7PE3jIJxNqtjt1y0Fcgexg+xJpFxZUEIppfur2tJjxSiWOGywlfWqjH3NeEMx6alITJIkauOZZpvWDH9/hLxWpUhOQVwKPE8kBz8Ltqh1hB3Y9fvAo7270ngJWQ0ZduHGl+EFOCpIIj30W9gCgQWoS/CtmDPWJE/lggWlbWjwLuQty1XcJ58UxVZXqaqi2ClXqYJHVnIgDhXvu5Mt21qoDMkBPuKAmTdimV7m6i5oZGClSfEgK+kTEskHBxpVQ/SQcmOYWtnCLRXzgTyqHDyk8TQo7SB87gHrHW9LDfJFVC9VnnQGPDOw93pVO/ZUIHkWT6h9GFsXyICdZgQXJzYspIe0XcreEO7Cmw3XnhhK80leXg0eyZXfeD7ZSkgWoX05vH5w97nz3uPhlyBvJFMLZI+OLguRTaLNokjzcUqbJgopTn29bSwLZD5aZ7ObOOGO2ykrUZVz/lNW4oHJGcusXb9FMJwdGSm1H9LmRfRATTyfdgo9ODiBAZ6fYAGICGXDr9jdzI9DBwOr9+bLexqG4ezJlUhMKohU7287zJctphpUrkmtku9kyMyzRmBCGSkGeKK8ktPm1WF3H6AgYlKE3Me5ZQcEN1JaHzRINzyL7tN5JdYzEip3ks1m3uth9hE8xBBVQ96uDDMqXmRhTcgyOSDlEZyYmjE8iWE9Y6DkFKpJKMmY5Vqnu5M9cXw/QycLUbprPSU5TST4bIb2xupMH5w/J9EGjCFM70Js/XH648I0jOnVnfas6hBtRNy2uJtwO6XEgEzMwIzgn4rNaR90xaFC50D6tWK/SoOZb92W44uygJMLlqewfQzea8JOTFwkKXCezLdQON2IHamA6n/2Q5ECfdp+6lG7WVb8sC1tnMIQbBG4lpTlc9/mWqG3MuOLWNKF48ppU0o5Wmc/iqBqeN97YnP9OVXiXc+wOq5Xzm+rruMWQ6+6XCVTbSzGHZVkS61dpYakkEVtP45m+2EMOkLRuq/axWZa7Q4ODZQNsLoQAS4lZLnBgITxzn7XMhP4b9PTq8OVmBsMQE0paDSNUl8kI1pqA2kRQl4p2R86autCtKY37U3WOuRU53MaEVp4s3RjXY3Xgho23UhSglZFkMSUNoZ4kJmzUXPvEoRJlk5wg9LzA0+bg0ZqY+RbmdxqI6dEKJlRuq9SKRv3LGLVUguD5trjRqcEDuji2QPXmQSZBwmjZcItz/ZxNjXAjQiCFwSaNmhfR3waIgn9/WmGBmSIkrzX/+jEfOW5racOocQjZmBj+1j0DvMlcG4/+lDknpr6JanEINJhextNKX0PNtQlnpv9PqiRwSFJB2DRKOorJ6sOHpy5bqt3ez0B3Uzfm+TLIL5gTtI/tL1Sigs6prZl78vrNhz8hyuz7jZ6zXdk+6yaztXnO/uKSPWyh5pp1IEjZbfakemK44PlCK5aN6EtJLcu8Ft6gkT8NpQh9VRm7d76V9vGvQu6rkPsq5D6fkPsmufUFkVWhnrfzz6P+zWZlVSUYyS3YTbd0Q5d/1vJG4qgq2naJxvj5onsvp2agzyzwRUtlWzX8kB5WzUcdNKF1LNUi7abJTLVbQONA9lvj04D0sNSqxQTOicIrieuatBZ1Z3xecklALNi1cpFNaRJWzyCKijoum7E5aWK7mSpJ8kdWLP2smXRISRT6EeoKjsC8I0f6hmSOPkdGI1qvi2qFm7W1vjzJ8EFPersOwq3ovTbR3nHxSG57OMMHKsqQnttIi47qh2nKM16Mmm62NPUrtlqL9BXbLeNFNWcSSWIjHm3QnlEQ4QAqBc+rDA7ONVsxHEn5SJYjC/3zDub6z34Upgq0Ke1VMZUUdg0y8ZSy6ahZzypN5oYcA/ULA/gmN9KUKLf9FaGs28y1o3PFgf5yf3Hz98OLv12c3d9dmMRBPdzKgbN2BtPnI2C3PCi4Z+SW8aNTadaz+7RZIZc2OuSsk8HzWRAx42UODNq7lCRJMFNUwgSPWsE7MW29TsO7elKguWwEuluX6nc4dhLYZwJbpLZZ3GVB2ObUiLInXjyRfPWJuOaw2ZguqHlTF4cwt0e/rHpFo+bZXWStOk12Q5M5K3oT1PKu7JKicBtITHOEJxMjaW1psH1CwU/qD7mBTY1flmSAJhUD/7vp62rLKxiIL9ZNs5iS3Y0KoNWdM/fe3V+d3V1+vNrThO2d/vjjzcWPp3cXe4PaC9soHNxFaCPcdcvJJ37KDuPpWk1Eo1zyVkR8ZMTVS4GOohh6spm5MFt5H0sww+g/EstYO79IiQVJId1C8l3fXFyf3lxsK/MccXF1wa0mriX3HA6rjlyer15EQX4Z7e4akNjIQevFr9eB35Tkr9eBmPqv14Gv14HtrwOoYev/vNLUp4u5aF9LZfJKYH6+CtavgvWrYEVfBevvXLAmXRqyKksuVEuf74jxQ+vj/FpTEUR5mqswVNSuSsRLk3oIvaEdHY4JTSy4a6pgfV4ZnxNpW/8EfjHM0MdrffG7rS8QydHiSs0092TNEDPU35GTCkq2getaFadCUxjhsSXHTB/s6Bs0J9kMMyrnehiVbMm39NkSJcW1OHI1v6ZMYyRozwwwIyPZ5WlNM4d6YJUkHR6yBRZa8KW94z1jART55GsfOngDE/3Os6wSJtnoZ/MNyHsoKgAndJIoCL563mJfQNxWWUFOQYMzT53vFzyxQJ8gGaFPtkKg9DoERFEjaiyMNxc/Xt7eXdyA6/G3cPq1hKgJTlvt+ltj7uyJ+i4I4If4U0jb0nToX0mm6BOB0NCEhRFNeFHwRVR1ByJKfa/dxaHrhc0ajf7jsQS1D3Y3iZAjTssVhhMuurH28XunUWqwX8xYbfk6t17coLe2QYRcAmob1leT9VeT9VeT9VeT9Wc0WXec/kI0kkx7n/61euTqJ7hqMaCIR+U/o2ijZowWZsi+DwUZwpMM2y98I8e7GWEDlJOSmJPRXjPJp4yUhoWhZrDL3JnjpYW3qS7RqPkQz03fgMBgVHbsqcjKThrmMoVlY50imsJnEbILxaqmRAUV4jYiw56s25/U7oh2pSFMWY32i32OZUFwPvL9fLJmoG/fuWrR2T6gAySoIE+kcPQHJgkl6HRqkjzDbZGYVNTIbKBptxXaOFRslVFFK2WyebnHhb4VQOoTqLntga4hHwB8dtoFgRwYS/6CCIIeGV8wTbkfBdy+QsfTDOcuE5ebLjpoX1IGzR9RxWztwyJYqzrSwi/mi7XrBzerL7V+M/wEIr5O5M3jYvUriR0XPHtsljb4rAu2mHFJmhn8poi94Xswk2QzMBptynwLQVVUODM9oE12/rlV7CK1HC78Gpfd6HSu1btq3WznWOGRnaKVBLazhLsJvFRoTjBzLlaYZrstsERYPtpCfOAr0DvA3mWjMgApand9mwBp728PLtoZ00ITaFW4NSTt9CaxA3qkmqsdevDbG6hiRqxFdZlSlLBqPtK0V4LsTK3teXj4Zq4EYWRp0PcykKMkq/zb/USSm/qdLnNoJdxsibGYgkDZ3axueFvoJtuXlJ1l5dOrIOvz/Kez66dXrZRP83GU4dlVDdZBRBvVhFMCM4mBvGd0zfyvaPbualjo8nwALfRZzueOBzN9jjBrYYveNLbOgfFTWAuctX9iljsLuD5lpOQZbbpUfBWXMB1V+qZDOITV7iWazJuWJOMsbxcmWJWFH8/Gld94FhYiBS71AI3+Ymkakylm3tyIs18qKqlxAcZHvCCMLHDhFKEEzU3v5DOW0CZDCQIu03glFEfU3lnRjC/gK82fbnmMRhqBo0rahPyDA2RtKBXTSoVCXKCx4DjXfyRr8mmkI9pOXKedeXd3QZWsoJOcr2HeUZfFFbnaDFmD9+Pmdd55E04QZN1pVD7PrCYqhkVl0FymkNxqyliivSWvxF6AKsm7Gt0OR2MnMByLH6BLUbNdzCVxjokIICOfFJKKlK5q15hzJZXA5Qp+FqTAy22HAUDCwSRkjHWE4ix0uEWQ9umQDBE2U2BAmqdSJTws685xtulmvPM0fSvRh9MzT/R+gZd61hc8hdAuOHtGGdX2hLFGC3IInzDWosD6NPQVgYbo3niXI0h6oj6+e3dxo/e5/uP07M+rqhTxcpQsTLqiVYdmIRAu/cfmjTilsSrtGxjmqqkFkgOZmuUZLzc7D+Lyb/r1eht5Ix7wn+kFm8KJRb7AonVBeubausuQA2s2g/MkQsE1xIhacPGI9i+0uGak0fTwvX7oDhePA0RUlpon43lvEdu0Lq1Kg7azk7oWrlLePGvEFe3WTIybHF9Pw81StFBjAvXEoXAPGU6HKKcy409EDFrA+GRCxKBuzZmTrKCMDDRZA8Tw4wDav0HTUxPE0zRQ1EEkAs+JImJkgY0K2nIv9vZ/p4ZNpV0v2+jQmo1h6LV0dFvEdvtIWR/s7JHc9OCaVjav1w9BdozRwobjd2TlXXKEdKU5vd/gaKANukHt68GeX96effzrxc0L0DKLgjebTaLGgeHehoMQQ09FmlUFFuFZMyZeuegKkbFnta/hs5Oht89urbk90bzCRXSMG1/cDLO8sHFYLVirg168CvfZls4xlhGeHp8foAkZsZ6MFiR/mspqzDqDOOb400hfoEZO8Ej6a1rwJAxrzx7LHH+i82ruEssjceP0q44BaYZe0KKwmiTOMlJ2DQ6CbtZx2C7FRyA8oCQXt5pCsXS1qto3QP3zRFju/Bsm1C4UJFA0NQA9RH+F5yWa47bXIJtxbuK3cjKhLJDuFosJRQqbShot8Im0gQWbu0GTQKbmo4PjajzVoZktYCY7HftRoHdcuJPLRKTWRIEDDsrnkdXc7Q/0iL4OhjA9uJvq4g55IWbzoOW3YevWlaEFDNwAgkhegKXcdf6W6Ilio0MZmFCg/Na25UqPlcmRkXW7kkzxgKwcbQ0cI31SgxZRk9qCZki3QCSqvRmN22FyaIaR3cZeUjYd2aDH5EiTERRrRnsaKQKaGbWoVcFSK44qhudjOq1MmdReOxxKjWBWTTDUozHuD8/DvO7KRGp51wJm2zTZ2jZ8ouBlcxyYUAy9EfNKKrEEtwQXilYQDAngkwe8pXBMtKCXw8Zd3IWMgCJx8+4Mvfzh5HVn8Ks+cEZzLJu66PM5z8BEGuaqGzivC4azRHiJ1fA76K5UNlJ0TkZ8MpFEjSTJdnYSmgKCyEC20xoLC/tVZLL5tr32diIo88Y16LB1xrnIKYO4sXtG9abCBbrTOPfv78661GzBK7UjzQtMDgBulUyo9TOjTdtX2uN0K9lLi4FV27WwgwVbL+X0Zvj+zffh4+3RbCbfmCp3PJrUCdWxKLTO67+6u27z37MktjvHvsSpy6LujSuIqm9dI7iTjiwb7W7XP+Ma1jR+I2tSurn4y/3F7V19S+u4lWEEYzHsmDJIouiWNEToUpPkQ+3LYmkIAhvWi4FTPe0DlUw4lxrHolmOpS0d5YmhTd0drAVd9xJzG0iuRKNFzjNXor7t106WoEl8FPvUHjFvmApgXfUHV6d/ruvTsiAQHLR463FshwydrlI1PPDzi7P3l1cX9V2JtwB5RwW4/WeRtdeaY3J33kC4Tw8zBbhfPufuiDew4RamiHjChe0N7rxEYFOYp0ISKqZoEW0KgZlxKPkmBzcXVxc/X179CF0quy72gowpWH3/zxjxny6vztcNecy5Gk1oQT7j1cjtO8VrTRkDZo24jn/6Vv/5rVGREtxdG5JtWXMf9OQtuvCtvRDUrUyZDJ3OV7dtj/PV7cFGlYVztnkbwq36X2mt5PzqFpU4e9Q6YH1b9t1qrHunFHwq8NyoylPCiDAZBY2zwKSwAdwAGJUo4yUlvvFPIsKy23vRg/669qG932PV2BCPlEFNNhOgaFc9WcUCWMyk/lEZ+m5ty37Fhe86I5bWugKDo8wMLwKXKlvqjeuQRNjhfR7iSs24oAqrrdtRncIsQQqWPUuNDwqrYDlyY5X3/lWGHAXLlpm6aYxwqoiNAZUqXbvdDEyQrILypCOv832O4S1mBAxKFt2Ti061KYwwRq9z0rbNMzBK9BhKTiTduo/KmnVypy4VJFMydCtqVaMSsiKNoAwzYj8DxXKIbrqnw1kXO4frsyJHth/75+RJR6YdIkRDQk/3UIJEID15nQPIZiR71CdxTqVe9y+0XoBLdnnEtaTFUEwYGpV5G60PqO4cjhIV07pZPuqsrryr8UDeJERiUSEVen18YrOkfTKzVvQXRDTFnymeuqIg9Ep57yS8VjYqCeI9KUmvPl7c3Hy8SXZbMtKooYisOVVC4Wb8lXolKMmH6HJS3wqN3cX2K5WIcXZQCsrakZrZDAucaaUY7Y+Jvm29PAHD2pg/EXR88uYFGN+0FOKShI9jQeoCuo3AaiwRkRku9Tmtr0XHR67mrkT7/zg/P38xRH/C2SOSBYYSwPq0+qXikCojiHu5cQDisRygDAtBoecZrKA0ydFa20cTQnLzPhj5hU0t/IcaoH8IeC6C9w8WZY0ml2+xWAyn0JJ+mPFUQzC/jA0/djsr2XqcBcm4yGVj8VK4T09PT1cgbCZvJ6JMsHEOboT18moFTqKKfFQWlRxxtnK0BLLrTNJCeWBSMSzr7pO79+cvkIaCOCMmGwkaF8fL3fKZ6Pf++zEovnsTzodjLIZTXmA2HXIxHe7pk2Iv/KCpPxHkK7Pk+h44D9rG3r0/t9UBzKWEITIfE2j5nfHSJWZFAA0w/fRMqfLt4SF0j8tkNZnQT0BBan7xHP+qV48Pq8dUoBqTi17dklZJS4awEHjp9r9JNssphG1irRuCf8qEuAI+JG1HPF9Terxs6VWdKoeluVV85Dlaf5ibIHklMuJ513Vf9grdQ87k0CJ/MCIvTOJrkLdS0DZFq3Mg+LolISmoJALkanKB7S8d8sIR01dcAJM1Rt6mKEnIh791o+8vPPQhtwURKXHi50AV/RkjthwEXgGr1SSWaY6XaExQhrNZ43wak4mWOjTMscqpzLDI9Un6b0RwFwgzJ5jVmhPMRCIKlnFVoxqm90DnPDR01nUagCbBeqnqGH4z8qENgcPMlxOi0r1Rkjja2bseam+8W/QQpl/dNv32GkbJZ5ZXdUC+v/g5gQXytymZzcSupvg3klY1AV5iNYF2PAjszE28gGU3yrKi0kdUM9s3VvGaMRbXYFUZE5yMlK4R/04kZkDQF5CaV7erSfhtJafvzPnFdlzdC/SZW64m+TfacjUBa7Zc68EvteVqxL+TLRcQ9FttuYCE38uW+6qwBHPxz6q08FIN292sWix1oVnJPpfklb2jvTTwvN3odI2tK2xhHiTrgQtas/TtxVnHQMgnNRKrzFQXnxRhOalT5mwBkaYYrIf1p9Pzv17c3HYMrsrLZuDseiFuGyZz8a1E9+fXqMTLguMcaUBonzJjsHtR98zU9+nAh/XT3d11y4mlP9zMi2WhoqQbq1G3JdUaU2PcUVfM1kh6d85clVIBDu5m0MKKjYnqju1iGbjH9ZGnJ8BKlGH6ISxIy0/hlvrg/uayhUpPmbIFT52wcmmI9nWYCiiE472kYQNt5/hSHD18OlgsFgca1kElChNAmz+k2wuuarm3kxKV7Xk9RXNchuoVjAWXJhYybFQtvUKV6n9qfn42MfxmGKahYem6/HldY1wQMAK7x+rWcam4VEsCKBJ6FaL2VN4FCUJp6esQSaIZQLXtQwiUnvkcy/QK6DVNTv+6EJdmZaRws/Rr5pjaaz07Pq7abInqRy3CAVuHhwCFUvfV0auO7KCZwK3g6ZV4zBudmK64QhNesa5klX+erdJ2X5ufrfZKCxo00Nxur7Rgjpd+r9gDj2bz8MC7PPvQPvDMxOmvNmsLbWGjjaI3emhIjVaeQFiqn2fJpaTjgoyMyG/upleNv9+kNrXZ7u0YtV45kqdoVs0xgzJUcFbBAeQVxm5RYr5JpmWuywn1qWNQFLUTdjIfti9sI1E6ReBnmq7OABn/1TMnzJVj7poxC/2ZUxZov7WeOSdzuAAFW++D/ai1/dwXeVrp7Nh8AQa00QZ0O+lZWcHt+5ejw8NFVJ8Hc8KUSSMyWxqiizLMoLTkmDIslnsRrAkXyHx+MMaS5AO0p0/wPROASz4p9zEXaM+WyTFfQi0v+DsC2CZszZYpKNvBfAi8MDLY+4658GV97BcSfbx6//eVuxee2+HqOJKMm9anzdYHjX0OSlynmycHblO0J4kyhUGnRCXcoWYl66nnZQYFhPQZBxdRU54X4sfSuBtWLzNvq7fvDubsIijVqqkBnquH4Xe7jx5u5pjbbPgwgN5F0QUTj+ikNUU2uHPT82J7lgAzh08/HIbhgG7D3l/9+erjz1d7A7T3nuN8L05b37tVXBD95TkpiILfznjFFBH6V33n1f/eFnh8pkQBUG7uzwReFPqJJiysJDxeZRmR8Os7TPVbUIe2UrO9jc+I/zsnqTmoFEeDTknmZcGXCDN3GZJkoO/JgkDFxZjDLd+m4MypqTEaqRJW4kE01b4kMbAHN9FDv4DmtvEQHAgeS6pghH8Psg1GcdnWZ66+iwpsVG9tykovDfZTM6sHnCbY7GYjErcntilH6jIlYJBjUBm5e9p+azLCyTCK/EY62MaEAIr1E/LbkuImBf+ycxoMUHfxNBLMh/1D54MiOqoigHCZbR6CK0/lf+oxmGV4GlfZI9nWu2ih2GZA4SXfjq5dKqM1mUY0br9XtbiqcFEHWUYBuH5u6graEYT91nJ0SrqI7nSNps1mMTB52XX3cWWUxdRvQKZZ50eybM8tOLP70+fSQTWsaJGlPv314Qz+iT767M7J8TNVl2yqSUH7dOKsT6smCRzt1uCy5VrW/nZfGahi7RtJ3UU0kbpiI5PdIHJOJDggJWE56DM5Vnhg/H4+EX9OoUz+6svElx9mLJE+8zitaEsP8JlcphWgN69syZHcDVeaRkTWY+ATdtexm12I34JCJ0D67QhwMa7jEeP1e4uaD687+JaKmKZxTjhbks01Hm7SEyLEymyD3zOFZgpzUiRyazbbZpm5SyHKMgHWp8Oc2N8QwF+rblFGFcXFZ6TDYrAnl/d4bn5UPREx5pKq5bZKCRDiW4NYUbTnwe85ibOCFoEXo0ZzlS3UksDWghd1gxl/Zu1pDUCi4XC4B27fvUJUKNO3ZPPZypPVEGziOEbN2J9nqSMmJMSVg9JC/VtZ4DHSN2dJp+zbHhOYE6l2Qo0GBIYmzrYkCVeKz3kiB3OjNTVUOVhoDn3IbIYykOS+8iQh8qkUplEDtFI0ZbObnriE7UUqzPLxcm//j0cvBmhPFnyxt//HY/07NAmSkj6Rvf0/nrwYOBOd5i+b9DppIPBiDIxyxna7YrbSpZM3W7uWwQmARirkpkfnTslyV9cUWZudl+RTqWii1uyGvI4V1txCxdLFw/kwuPg8b81sTGcI+HISL/3//+URyvFS2iyhEJttMWebp+wxvjC2N1JIgmh847SpxWPJi0oRdM/opxbN+y9PDsZ05cTJgpBylLj/bSizNBgkiWkMTBma00xwXwnJ7o5vC1GNMmN9NK+slhuhurajE7Rxv4NiI+47n/6+Yr4Ybxb4fUZ+6K0JClIC5ASyMF1bz8bWTIT/tuybLgDYOfPXK+m/VDRhfdhmFGqFbYpK21NHCQI+GhDEQMNKE4W9HmI5qhjd3uRzdnqL9jM+L7EgB5jlB3KByxdRiQW/i1de5L4cQWbawA4Fwufs9Nb4LFFV5lg1iv70leKg7+zq/qOBUalo5rR0n6yMLnA2Q4QpsTQNoYOQ/WQIiw2b2dPkWlUMYK50zrSDP57rZXVSwUt3FzTiVAbviedsyvNx6IjXn5yPO8JgzLd/6ggA1cglcYO3/o6s4JJYQWPyxU1EkRWlFiJaUFE7o41bfEanMyJsQzHv7kdofxKmqD5AhOQDTPKDi0N+eIFwWZqWtA6DbYKKJVqQougK26lnBG0UONBsV7hiiexB6uiq+3G5Tu22jJetERUZLnxqeZPjYmdMeC6EOaRNqidVUZzxojApJlcbpcSbttP+ZevE6PMUiFETY5phRVhkYNW6CySvw5NeUWmAiF1+lW3smHOF9ocvPHNFCFakObvnPe4J5z5uNsA8xsJoO12jcvnRrYk2dq47fvuYaLrQX9beElvno7ab5Tyzt0DFEZ9ThQ5Mp3ZoqePi9kyVBvdsoJ1WBTyoR66P7IMInS0Wq3kpyB6oCtUoR9E12ht4dcuzpQ7HcFWdOwY/JkF5iTRJN/b7nVktawL8lJZFYkbcirwTfN4Pz88zIvyNMKuEBB6lrusLlR5mGxssSz80p+h/3X68qjkDMli860OmVhlF8eugqlmxBIUFtBjigiBi4pzkAOECGkKapKl5JRWaY5XNTHySRx3BN8vps74ifjUt48Onr22so8fp3kT/AkQO0L9wkRMx1r/NKFMD9C/kU1lgapv8/4tkuJQzrtpzaVjqHYj9W6I3fF85n5zags6pnVZ7EvqxWZHtWao94yla6iMhPfmQTuhnn8YlLLE9Vhp9Lx0tsZR1AtGWFLFXkOMEs284TX9qT1NcrctwmmYXA9oJo/odbtVIBEUmCqJImyzzxM6IsggNp5ZETLiYN2un6FMmqFiOfGE+KKRjNd8BksSUU7w3ID+6+5v0BOAoBdTrDh8wq3DRHqqRF5cb6IxWwgQae9N3+PF6dHNx/f7vNrwH9rHtBGk4wbdZrH1pjl53sFr11++tMutUtCJ6P7Ls5vqsOwAbrdDMPtHOadAwfbBakAFWz0KqBxEuimckY12fwZsm+wrUGme/Td4JymL5PCTmeOiFpeUx75wcCxSeTwDa2GQVwg5ac2s4HeBHUnXKkxXQNPMm4qo78t1HkwI/dcstjcfXFLM7El5IcYkg+bDasBqjYxIivpWmDT7NB3oImVZKtbyu1OygYvRTF8bpNhhh+z0H5Uoe8uCNFU3fmR0iuRkmqfB8M+35VIypEhrl5XlY+R5IQnOczSgjkP/ralh24bbPrssTD0Nb/cDtu8G1eyl/KcJL9/L2L++7rtz6u80yLh14tFnlUNm8w25uS3NXW02zLzYI9cLS19k6sVCJpPsRQ0Erko8EX2xj240Ic7Zujd2EiE6qovOa7WmIAAb1EPjC50EXWCpTCLdD5FImiWh0yV1P9uXV7cXNnStW2o9qmqeKZzGy0JcHoILkmvYEkdA+t7a39KXy9uL9xdl6KoM191epCByfONV4RbVATWODJ74ohbDqK+jb4ApmGhsszLZ1ZWQlHFi1BhWoJ9/KFelTJtB3B8FkdXxbZE2CHdSJt5371AuLVpGTtiuHzcpNNglrLF+9a9dYvnp3i55eHb7cLFfPwEVbpuqtn2VNnfcpOJus4a/ElM4p42K0NR4Asx6bwivBPb1CZx8/XH+8vzoPyisrnPLNtKKmVzCBhl3DA9OeKf1CWevzQFdwtESw9IGb7Nq6Us+NKWhouo7zyml8Yl9zqaaCdB/b9QObnd0O0WbM+AxpA4i2lTa70BmccL6e7kppSMrAlqpWr1Ag6/qWZOkl7pJYut2EBqYkT0TEwUvrgbqXNkgANvVx48/end6dvm98dn16dXn2mXSEye9eR9iKwqaOYGWJIDkNz7Eb/XeHGIHvNpMgDjzaSIIYMluJHb08jXGkHJBc69gM4dQNPFmRa3MnWozsc7rQDCZfjNWupZoJOlHBYt7BBwc312cdK1o/sJmO4jFttq6t4jRrVtTYUtSM58ZcFVSeWbGU/qJyHouPCS1Io2SNcaAFYCvr65PgbtKCzIuu2Jj6Uc2IWFBpQVyeB3Up3Kq5zssdrbxptgFzh3f5cNUMHH1omgaY3kJ6ef7ejDhp0XvO/mpH+TSI0WtkDbJU+tDteqUiiD024KeMADGbyUzglHDj1XC6L6j1M/3pdbuuCOXn3fv2PcDutfcbdlxRxeaSc4ZZLmf4kYwyPi8LorbtIvCzbVQBS/3+FjEy5Yoa9dQ3o6mPJe+XkURK+0wEr+7aYwqzE5aJZQkO1c5SFtV821FY1tADCAgzxFsEtuY3KgV5oryS7sEukgDPyEinFnEbRclcTpozFhFmBEzFciIK8NRYiQiSBX1kWixE8PZobsothMO9PId8Y0WzR6Lqr83fiHxShHWM1jSKGGVE2M63ZOS94LvjLdtIwxyazseuoqZvgbWbIKokKeJxu8AL+0ZAcPeoZqQo2rX6NqkB1b4Sr2KDNTOCnKiN6+rolfJX6PGy3TZ1QaGDQqJDmtZGKmbmLK+EcVbSFHeHg7J9V0g+ymg566oF1Qxt6zG49za8zYINxxC3y6uka+gXEtsEd0sIlPSTbw8PF4vFkGKGh1xMD+tGYvJQFfKgPuIbfw4/zdS8+EP84UFHJa5gWvgcwt9rGbCzKQqjAAM0dttHU2bpkc+cGA39QIM9oHnjLzMt6VnwwiI95ObmaQ0Zwun0vgsguWaEXq1wvSxjOKmNiBpqFRHQ123kWnsmenOv3p8tgh3T+v7U33QSgMuysFhHBV4SMfJFfIKTc1uC2kyDgr0V0HAANHjZsXq/DbuHZTfgyBwXn4l80x6fx6ehwTgwMcSGRVzTZzIv1dJGkSYh6jMjf9LHgCS+lRQIFQCatM4ZBvonPBYg4MG1HVwvOS+VC7+ByFap6rBcJ+TieE1IYtVqMslT860C8lo1iyzHwax2nTgQS+MPnN3Om4GJZEUV8Zgaw/O3N5C9jtda4MbLZw2qdVzseICtc6LXMFuwvBTuP8Yvcho0Q4bNz7rTYEthnDq7W+RfWUAkD9GhWO7+toL13jYixYzximU2Ngo3RKxPc+lkfWTYP1gPdFos8FI2hXGvS8Ra6RqN7Kx+sUNVMAGcUUDMMCGrNxbW6zrf/u310Q/WJlDXCu+QBoLiYpQwz26w/2G315MBkSwabNuXFqJmXI1M+fgk3kYoYgvpuZ52W34+uHsEa0JNkQPoEbiCBjzpasDfiwR4vYMCyPkjXW2dTVuu0SNZjnAx5YKq2Xy3ItiDbZzA8WIZOjSW9pFsrvLo5vZ0gM5vT7WWc3F2fnu6fkiN2DzUm3lv6a/eqhiSluZf1wryi05hi90dFR1U4kIRwSDfc2SU9RSNa+9ltxXUNEanNTh0BYbh1Mp2NdfGi232ORSoDDcZQ9cXH9oG02iRqlSB5p5nsRt00NLRCNnmaGMY685hSAUVqaN0o9PtzIBp1rxtYuNiihn9dScXrY8BLJtT1AsvLkYVo1uf5/eMmvRoyiLwK6iAw5Fl7SLWG6K+tnC0FBJkqsdvCbGruYKGjM/nnKW6q29MxhW4PQRcvW1ikwuHrs//tfuQSll1nDtr98QFU1Qt3fVKVlrRYzmyHci/bo2vW+OfemtMKJsSAX2Be++PNFP7SLH8dds6sHJgXZr+txJ9OH8dktiaWX/szfDx7rDe/nR6cNwX78nrN7vFfPL6TQN3l5nqs1ynnKHg63Xq63Xq63UqGs3X69TX6xT6ep16NsqvOuP/ETrj1+vU163xdWt8vU71xfp7u061sLZuU6Nshmk7zWllLa+zGaQJTZASlVRe3bLXqV7RaJ+Hgl7xcLggwnTw27I8bKqtuAtWACQA1DQXf4J8H/hQkIzQp2SsdLB4bdpWXnPfBW/WimYQFtn7Svuf+OXzzrv/dfoSEDonZad8SKJHUWivnG0r5NIOYq0cazoD4gBbk4MkXXkcxkURPgN9xrtsbjPQ07HIqgLKnswIEDz85v8LAAD//wQi3XM=" + return "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" } diff --git a/packetbeat/protos/tls/_meta/fields.yml b/packetbeat/protos/tls/_meta/fields.yml index 868f09edccb..3a6a6014892 100644 --- a/packetbeat/protos/tls/_meta/fields.yml +++ b/packetbeat/protos/tls/_meta/fields.yml @@ -6,6 +6,12 @@ - name: tls type: group fields: + - name: version + type: keyword + description: > + The version of the TLS protocol used. + example: "TLS 1.3" + - name: handshake_completed type: boolean description: > @@ -69,6 +75,11 @@ Length of the session ticket, if provided, or an empty string to advertise support for tickets. + - name: supported_versions + type: keyword + description: > + List of TLS versions that the client is willing to use. + - name: server_hello type: group fields: @@ -105,6 +116,11 @@ Used to announce that a session ticket will be provided by the server. Always an empty string. + - name: supported_versions + type: keyword + description: > + Negotiated TLS version to be used. + - name: client_certificate type: group description: Certificate provided by the client for authentication. diff --git a/packetbeat/protos/tls/extensions.go b/packetbeat/protos/tls/extensions.go index b1531c7269f..c9240b40f88 100644 --- a/packetbeat/protos/tls/extensions.go +++ b/packetbeat/protos/tls/extensions.go @@ -66,6 +66,7 @@ var extensionMap = map[uint16]extension{ 13: {"signature_algorithms", parseSignatureSchemes, false}, 16: {"application_layer_protocol_negotiation", parseALPN, false}, 35: {"session_ticket", parseTicket, false}, + 43: {"supported_versions", parseSupportedVersions, false}, 0xff01: {"renegotiation_info", ignoreContent, false}, } @@ -272,3 +273,47 @@ func parseALPN(buffer bufferView) interface{} { } return protos } + +func parseSupportedVersions(buffer bufferView) interface{} { + // Parsing the supported_versions extensions requires knowing whether the + // extension is included in a client_hello or server_hello, but a workaround + // can be done by looking at the extension length. + + // Server-side extension has length 2: Selected version (2 bytes) + if buffer.length() == 2 { + var ver tlsVersion + if !buffer.read8(0, &ver.major) || !buffer.read8(1, &ver.minor) { + return nil + } + return ver.String() + } + + // Client-side extension has at least 3 bytes: 1 byte length + 2 byte entry + if buffer.length() >= 3 { + var listBytes uint8 + if !buffer.read8(0, &listBytes) { + return nil + } + if 1+int(listBytes) > buffer.length() || listBytes&1 != 0 { + return nil + } + + numEntries := int(listBytes) / 2 + if numEntries == 0 { + return nil + } + list := make([]string, 0, numEntries) + for i := 0; i < numEntries; i++ { + var val uint16 + if !buffer.read16Net(1+2*i, &val) { + return nil + } + if !isGreaseValue(val) { + list = append(list, tlsVersion{major: uint8(val >> 8), minor: uint8(val & 0xff)}.String()) + } + } + return list + } + + return nil +} diff --git a/packetbeat/protos/tls/extensions_test.go b/packetbeat/protos/tls/extensions_test.go index 7b5f2e37410..9b56a0540cd 100644 --- a/packetbeat/protos/tls/extensions_test.go +++ b/packetbeat/protos/tls/extensions_test.go @@ -157,3 +157,74 @@ func TestParseSrp(t *testing.T) { r = parseSrp(*mkBuf(t, "FF726f6f74", 5)) assert.Nil(t, r) } + +func TestParseSupportedVersions(t *testing.T) { + for _, testCase := range []struct { + title string + data string + expected interface{} + }{ + { + title: "negotiation", + data: "080304030303020301", + expected: []string{"TLS 1.3", "TLS 1.2", "TLS 1.1", "TLS 1.0"}, + }, + { + title: "negotiation with GREASE", + data: "0c7a7a0304030303020301fafa", + expected: []string{"TLS 1.3", "TLS 1.2", "TLS 1.1", "TLS 1.0"}, + }, + { + title: "selected TLS 1.3", + data: "0304", + expected: "TLS 1.3", + }, + { + title: "selected future version", + data: "0305", + expected: "TLS 1.4", + }, + { + title: "empty error", + data: "00", + }, + { + title: "odd length error", + data: "0b7a7a0304030303020301FF", + }, + { + title: "out of bounds", + data: "FF", + }, + { + title: "out of bounds (2)", + data: "805a5a03040302", + }, + { + title: "valid excess data", + data: "0403030304FFFFFFFFFFFFFF", + expected: []string{"TLS 1.2", "TLS 1.3"}, + }, + } { + t.Run(testCase.title, func(t *testing.T) { + r := parseSupportedVersions(*mkBuf(t, testCase.data, len(testCase.data)/2)) + if testCase.expected == nil { + assert.Nil(t, r, testCase.data) + return + } + switch v := testCase.expected.(type) { + case string: + version, ok := r.(string) + assert.True(t, ok) + assert.Equal(t, v, version) + case []string: + list, ok := r.([]string) + assert.True(t, ok) + assert.Len(t, list, len(v)) + assert.Equal(t, v, list) + default: + assert.Fail(t, "wrong expected type", v) + } + }) + } +} diff --git a/packetbeat/protos/tls/tls.go b/packetbeat/protos/tls/tls.go index 3b053fb9160..fd836385c3e 100644 --- a/packetbeat/protos/tls/tls.go +++ b/packetbeat/protos/tls/tls.go @@ -358,6 +358,24 @@ func (plugin *tlsPlugin) createEvent(conn *tlsConnectionData) beat.Event { if len(fingerprints) > 0 { tls["fingerprints"] = fingerprints } + + // TLS version in use + if conn.handshakeCompleted > 1 { + var version string + if serverHello != nil { + var ok bool + if value, exists := serverHello.extensions.Parsed["supported_versions"]; exists { + version, ok = value.(string) + } + if !ok { + version = serverHello.version.String() + } + } else if clientHello != nil { + version = clientHello.version.String() + } + tls["version"] = version + } + fields := common.MapStr{ "type": "tls", "status": status, diff --git a/packetbeat/protos/tls/tls_test.go b/packetbeat/protos/tls/tls_test.go index cb23fdb3c18..7d6b52d7cc7 100644 --- a/packetbeat/protos/tls/tls_test.go +++ b/packetbeat/protos/tls/tls_test.go @@ -40,6 +40,18 @@ type eventStore struct { const ( expectedClientHello = `{"dst":{"IP":"192.168.0.2","Port":27017,"Name":"","Cmdline":"","Proc":""},"server":"example.org","src":{"IP":"192.168.0.1","Port":6512,"Name":"","Cmdline":"","Proc":""},"status":"Error","tls":{"client_certificate_requested":false,"client_hello":{"extensions":{"_unparsed_":["renegotiation_info","23","status_request","18","30032"],"application_layer_protocol_negotiation":["h2","http/1.1"],"ec_points_formats":["uncompressed"],"server_name_indication":["example.org"],"session_ticket":"","signature_algorithms":["ecdsa_secp256r1_sha256","rsa_pss_sha256","rsa_pkcs1_sha256","ecdsa_secp384r1_sha384","rsa_pss_sha384","rsa_pkcs1_sha384","rsa_pss_sha512","rsa_pkcs1_sha512","rsa_pkcs1_sha1"],"supported_groups":["x25519","secp256r1","secp384r1"]},"supported_ciphers":["TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_3DES_EDE_CBC_SHA"],"supported_compression_methods":["NULL"],"version":"3.3"},"fingerprints":{"ja3":{"hash":"94c485bca29d5392be53f2b8cf7f4304","str":"771,49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53-10,65281-0-23-35-13-5-18-16-30032-11-10,29-23-24,0"}},"handshake_completed":false,"resumed":false},"type":"tls"}` expectedServerHello = `{"extensions":{"_unparsed_":["renegotiation_info","status_request"],"application_layer_protocol_negotiation":["h2"],"ec_points_formats":["uncompressed","ansiX962_compressed_prime","ansiX962_compressed_char2"],"session_ticket":""},"selected_cipher":"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","selected_compression_method":"NULL","version":"3.3"}` + rawClientHello = "16030100c2010000be03033367dfae0d46ec0651e49cca2ae47317e8989df710" + + "ee7570a88b9a7d5d56b3af00001c3a3ac02bc02fc02cc030cca9cca8c013c014" + + "009c009d002f0035000a01000079dada0000ff0100010000000010000e00000b" + + "6578616d706c652e6f72670017000000230000000d0014001204030804040105" + + "0308050501080606010201000500050100000000001200000010000e000c0268" + + "3208687474702f312e3175500000000b00020100000a000a00086a6a001d0017" + + "0018aaaa000100" + rawServerHello = "160303004a0200004603037806e1be0c363bcc1fe14a906d1ff1b11dc5369d91" + + "c631ed660d6c0f156f420700c02f00001eff01000100000b0004030001020023" + + "000000050000001000050003026832" + + rawChangeCipherSpec = "1403030000" ) func (e *eventStore) publish(event beat.Event) { @@ -150,14 +162,7 @@ func TestInvalidAlert(t *testing.T) { func TestClientHello(t *testing.T) { results, tls := testInit() - reqData, err := hex.DecodeString( - "16030100c2010000be03033367dfae0d46ec0651e49cca2ae47317e8989df710" + - "ee7570a88b9a7d5d56b3af00001c3a3ac02bc02fc02cc030cca9cca8c013c014" + - "009c009d002f0035000a01000079dada0000ff0100010000000010000e00000b" + - "6578616d706c652e6f72670017000000230000000d0014001204030804040105" + - "0308050501080606010201000500050100000000001200000010000e000c0268" + - "3208687474702f312e3175500000000b00020100000a000a00086a6a001d0017" + - "0018aaaa000100") + reqData, err := hex.DecodeString(rawClientHello) assert.Nil(t, err) tcpTuple := testTCPTuple() @@ -180,10 +185,7 @@ func TestClientHello(t *testing.T) { func TestServerHello(t *testing.T) { results, tls := testInit() - reqData, err := hex.DecodeString( - "160303004a0200004603037806e1be0c363bcc1fe14a906d1ff1b11dc5369d91" + - "c631ed660d6c0f156f420700c02f00001eff01000100000b0004030001020023" + - "000000050000001000050003026832") + reqData, err := hex.DecodeString(rawServerHello) assert.Nil(t, err) tcpTuple := testTCPTuple() @@ -321,7 +323,7 @@ func TestCompletedHandshake(t *testing.T) { assert.Empty(t, results.events) // Then a change cypher spec message - reqData, err = hex.DecodeString("1403030000") + reqData, err = hex.DecodeString(rawChangeCipherSpec) req = protos.Packet{Payload: reqData} private = tls.Parse(&req, tcpTuple, 0, private) assert.NotNil(t, private) @@ -332,3 +334,98 @@ func TestCompletedHandshake(t *testing.T) { assert.NotNil(t, private) assert.NotEmpty(t, results.events) } + +func TestTLS13VersionNegotiation(t *testing.T) { + results, tls := testInit() + + // First, a client hello + reqData, err := hex.DecodeString( + "16030102310100022d03039b9e3d533312e698bdc35c8d86902204c0f2505682" + + "2e0ae66b5f7bff999a7c6220944f9b7806d887e27500dc6a05cfed8becf3d65a" + + "9a75ab618828f1b9e418d16800222a2a130113021303c02bc02fc02cc030cca9" + + "cca8c013c014009c009d002f0035000a010001c2baba0000ff01000100000000" + + "1d001b000018746c7331332e63727970746f2e6d6f7a696c6c612e6f72670017" + + "000000230000000d001400120403080404010503080505010806060102010005" + + "00050100000000001200000010000e000c02683208687474702f312e31755000" + + "00000b000201000033002b00292a2a000100001d00208c80626064298b32ef53" + + "5d9305355e992b98baaa5db28e22a718741eab108d48002d00020101002b000b" + + "0a9a9a0304030303020301000a000a00082a2a001d00170018001b0003020002" + + "6a6a000100002900ed00c800c21f81d2ec6041f6cecd60949000000000784b0a" + + "740ce3334a066d552e3d94af270080b67e1a29ea0e6dbccdbe6ea8699cda3e28" + + "94f98dbea2fa3b1040acdf8dd3f7edefed8f768a6076a034b63c9464e9a22301" + + "1d6ef9ff0f8ce74e7a5701da7f957116b5a3c0600541f86fb00ca54dc9f4eaec" + + "6a657331881c1fcd23c59cca16d27af51a71301c38870de721382175d3de8423" + + "d809edfcd417861a3ca83e40cf631616e0791efbcc79a0fdfe0d57c6ede4dd4f" + + "8dc54cdb7904a8924f10c55f97e5fcc1f813e6002120720c822a09c99a10b09e" + + "de25dded2e4c62eff486bf7827f89613f3038d5a200a") + assert.Nil(t, err) + tcpTuple := testTCPTuple() + req := protos.Packet{Payload: reqData} + var private protos.ProtocolData + + private = tls.Parse(&req, tcpTuple, 0, private) + assert.NotNil(t, private) + assert.Empty(t, results.events) + + // Then a server hello + change cypher spec + reqData, err = hex.DecodeString( + "160303007a020000760303225084578024a693566bc71ba223826eeffc875b20" + + "27eec7337bf5fdf0eb1de720944f9b7806d887e27500dc6a05cfed8becf3d65a" + + "9a75ab618828f1b9e418d168130100002e00330024001d002070b27700b360aa" + + "3941a22da86901c00e174dc3d83e13cf4159b34b3de6809372002b0002030414" + + "0303000101") + req = protos.Packet{Payload: reqData} + private = tls.Parse(&req, tcpTuple, 1, private) + assert.NotNil(t, private) + assert.Empty(t, results.events) + + // Then a change cypher spec from the client + reqData, err = hex.DecodeString(rawChangeCipherSpec) + req = protos.Packet{Payload: reqData} + private = tls.Parse(&req, tcpTuple, 0, private) + assert.NotNil(t, private) + assert.NotEmpty(t, results.events) + + iVersion, err := results.events[0].Fields.GetValue("tls.version") + assert.Nil(t, err) + + version, ok := iVersion.(string) + assert.True(t, ok) + assert.Equal(t, "TLS 1.3", version) +} + +func TestLegacyVersionNegotiation(t *testing.T) { + results, tls := testInit() + + // First, a client hello + reqData, err := hex.DecodeString(rawClientHello) + assert.Nil(t, err) + tcpTuple := testTCPTuple() + req := protos.Packet{Payload: reqData} + var private protos.ProtocolData + + private = tls.Parse(&req, tcpTuple, 0, private) + assert.NotNil(t, private) + assert.Empty(t, results.events) + + // Then a server hello + change cypher spec + reqData, err = hex.DecodeString(rawServerHello + rawChangeCipherSpec) + req = protos.Packet{Payload: reqData} + private = tls.Parse(&req, tcpTuple, 1, private) + assert.NotNil(t, private) + assert.Empty(t, results.events) + + // Then a change cypher spec from the client + reqData, err = hex.DecodeString(rawChangeCipherSpec) + req = protos.Packet{Payload: reqData} + private = tls.Parse(&req, tcpTuple, 0, private) + assert.NotNil(t, private) + assert.NotEmpty(t, results.events) + + iVersion, err := results.events[0].Fields.GetValue("tls.version") + assert.Nil(t, err) + + version, ok := iVersion.(string) + assert.True(t, ok) + assert.Equal(t, "TLS 1.2", version) +}