Advertisement
RussX9

tls.lua

Aug 21st, 2014
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.54 KB | None | 0 0
  1. ---
  2. -- A library providing functions for doing TLS/SSL communications
  3. --
  4. -- These functions will build strings and process buffers. Socket communication
  5. -- is left to the script to implement.
  6. --
  7. -- @author "Daniel Miller <bonsaiviking@gmail.com>"
  8.  
  9. local stdnse = require "stdnse"
  10. local bin = require "bin"
  11. local os = require "os"
  12. local table = require "table"
  13. _ENV = stdnse.module("tls", stdnse.seeall)
  14.  
  15. -- Most of the values in the tables below are from:
  16. -- http://www.iana.org/assignments/tls-parameters/
  17. PROTOCOLS = {
  18. ["SSLv3"] = 0x0300,
  19. ["TLSv1.0"] = 0x0301,
  20. ["TLSv1.1"] = 0x0302,
  21. ["TLSv1.2"] = 0x0303
  22. }
  23.  
  24. --
  25. -- TLS Record Types
  26. --
  27. TLS_RECORD_HEADER_LENGTH = 5
  28.  
  29. TLS_CONTENTTYPE_REGISTRY = {
  30. ["change_cipher_spec"] = 20,
  31. ["alert"] = 21,
  32. ["handshake"] = 22,
  33. ["application_data"] = 23,
  34. ["heartbeat"] = 24
  35. }
  36.  
  37. --
  38. -- TLS Alert Levels
  39. --
  40. TLS_ALERT_LEVELS = {
  41. ["warning"] = 1,
  42. ["fatal"] = 2,
  43. }
  44.  
  45. --
  46. -- TLS Alert Record Types
  47. --
  48. TLS_ALERT_REGISTRY = {
  49. ["close_notify"] = 0,
  50. ["unexpected_message"] = 10,
  51. ["bad_record_mac"] = 20,
  52. ["decryption_failed"] = 21,
  53. ["record_overflow"] = 22,
  54. ["decompression_failure"] = 30,
  55. ["handshake_failure"] = 40,
  56. ["no_certificate"] = 41,
  57. ["bad_certificate"] = 42,
  58. ["unsupported_certificate"] = 43,
  59. ["certificate_revoked"] = 44,
  60. ["certificate_expired"] = 45,
  61. ["certificate_unknown"] = 46,
  62. ["illegal_parameter"] = 47,
  63. ["unknown_ca"] = 48,
  64. ["access_denied"] = 49,
  65. ["decode_error"] = 50,
  66. ["decrypt_error"] = 51,
  67. ["export_restriction"] = 60,
  68. ["protocol_version"] = 70,
  69. ["insufficient_security"] = 71,
  70. ["internal_error"] = 80,
  71. ["user_canceled"] = 90,
  72. ["no_renegotiation"] = 100,
  73. ["unsupported_extension"] = 110,
  74. ["certificate_unobtainable"] = 111,
  75. ["unrecognized_name"] = 112,
  76. ["bad_certificate_status_response"] = 113,
  77. ["bad_certificate_hash_value"] = 114,
  78. ["unknown_psk_identity"] = 115
  79. }
  80.  
  81. --
  82. -- TLS Handshake Record Types
  83. --
  84. TLS_HANDSHAKETYPE_REGISTRY = {
  85. ["hello_request"] = 0,
  86. ["client_hello"] = 1,
  87. ["server_hello"] = 2,
  88. ["hello_verify_request"] = 3,
  89. ["NewSessionTicket"] = 4,
  90. ["certificate"] = 11,
  91. ["server_key_exchange"] = 12,
  92. ["certificate_request"] = 13,
  93. ["server_hello_done"] = 14,
  94. ["certificate_verify"] = 15,
  95. ["client_key_exchange"] = 16,
  96. ["finished"] = 20,
  97. ["certificate_url"] = 21,
  98. ["certificate_status"] = 22,
  99. ["supplemental_data"] = 23,
  100. ["next_protocol"] = 67,
  101. }
  102.  
  103. --
  104. -- Compression Algorithms
  105. -- http://www.iana.org/assignments/comp-meth-ids
  106. --
  107. COMPRESSORS = {
  108. ["NULL"] = 0,
  109. ["DEFLATE"] = 1,
  110. ["LZS"] = 64
  111. }
  112.  
  113. ---
  114. -- RFC 4492 section 5.1.1 "Supported Elliptic Curves Extension".
  115. ELLIPTIC_CURVES = {
  116. sect163k1 = 1,
  117. sect163r1 = 2,
  118. sect163r2 = 3,
  119. sect193r1 = 4,
  120. sect193r2 = 5,
  121. sect233k1 = 6,
  122. sect233r1 = 7,
  123. sect239k1 = 8,
  124. sect283k1 = 9,
  125. sect283r1 = 10,
  126. sect409k1 = 11,
  127. sect409r1 = 12,
  128. sect571k1 = 13,
  129. sect571r1 = 14,
  130. secp160k1 = 15,
  131. secp160r1 = 16,
  132. secp160r2 = 17,
  133. secp192k1 = 18,
  134. secp192r1 = 19,
  135. secp224k1 = 20,
  136. secp224r1 = 21,
  137. secp256k1 = 22,
  138. secp256r1 = 23,
  139. secp384r1 = 24,
  140. secp521r1 = 25,
  141. arbitrary_explicit_prime_curves = 0xFF01,
  142. arbitrary_explicit_char2_curves = 0xFF02,
  143. }
  144.  
  145. ---
  146. -- RFC 4492 section 5.1.2 "Supported Point Formats Extension".
  147. EC_POINT_FORMATS = {
  148. uncompressed = 0,
  149. ansiX962_compressed_prime = 1,
  150. ansiX962_compressed_char2 = 2,
  151. }
  152.  
  153. ---
  154. -- Extensions
  155. -- RFC 6066, draft-agl-tls-nextprotoneg-03
  156. -- https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
  157. --
  158. EXTENSIONS = {
  159. ["server_name"] = 0,
  160. ["max_fragment_length"] = 1,
  161. ["client_certificate_url"] = 2,
  162. ["trusted_ca_keys"] = 3,
  163. ["truncated_hmac"] = 4,
  164. ["status_request"] = 5,
  165. ["user_mapping"] = 6,
  166. ["client_authz"] = 7,
  167. ["server_authz"] = 8,
  168. ["cert_type"] = 9,
  169. ["elliptic_curves"] = 10,
  170. ["ec_point_formats"] = 11,
  171. ["srp"] = 12,
  172. ["signature_algorithms"] = 13,
  173. ["use_srtp"] = 14,
  174. ["heartbeat"] = 15,
  175. ["application_layer_protocol_negotiation"] = 16,
  176. ["status_request_v2"] = 17,
  177. ["signed_certificate_timestamp"] = 18,
  178. ["client_certificate_type"] = 19,
  179. ["server_certificate_type"] = 20,
  180. ["padding"] = 21, -- Temporary, expires 2015-03-12
  181. ["SessionTicket TLS"] = 35,
  182. ["next_protocol_negotiation"] = 13172,
  183. ["renegotiation_info"] = 65281,
  184. }
  185.  
  186. ---
  187. -- Builds data for each extension
  188. -- Defaults to tostring (i.e. pass in the packed data you want directly)
  189. EXTENSION_HELPERS = {
  190. ["server_name"] = function (server_name)
  191. -- Only supports host_name type (0), as per RFC
  192. -- Support for other types could be added later
  193. return bin.pack(">P", bin.pack(">CP", 0, server_name))
  194. end,
  195. ["max_fragment_length"] = tostring,
  196. ["client_certificate_url"] = tostring,
  197. ["trusted_ca_keys"] = tostring,
  198. ["truncated_hmac"] = tostring,
  199. ["status_request"] = tostring,
  200. ["elliptic_curves"] = function (elliptic_curves)
  201. local list = {}
  202. for _, name in ipairs(elliptic_curves) do
  203. list[#list+1] = bin.pack(">S", ELLIPTIC_CURVES[name])
  204. end
  205. return bin.pack(">P", table.concat(list))
  206. end,
  207. ["ec_point_formats"] = function (ec_point_formats)
  208. local list = {}
  209. for _, format in ipairs(ec_point_formats) do
  210. list[#list+1] = bin.pack(">C", EC_POINT_FORMATS[format])
  211. end
  212. return bin.pack(">p", table.concat(list))
  213. end,
  214. ["next_protocol_negotiation"] = tostring,
  215. }
  216.  
  217. --
  218. -- Encryption Algorithms
  219. --
  220. CIPHERS = {
  221. ["TLS_NULL_WITH_NULL_NULL"] = 0x0000,
  222. ["TLS_RSA_WITH_NULL_MD5"] = 0x0001,
  223. ["TLS_RSA_WITH_NULL_SHA"] = 0x0002,
  224. ["TLS_RSA_EXPORT_WITH_RC4_40_MD5"] = 0x0003,
  225. ["TLS_RSA_WITH_RC4_128_MD5"] = 0x0004,
  226. ["TLS_RSA_WITH_RC4_128_SHA"] = 0x0005,
  227. ["TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"] = 0x0006,
  228. ["TLS_RSA_WITH_IDEA_CBC_SHA"] = 0x0007,
  229. ["TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x0008,
  230. ["TLS_RSA_WITH_DES_CBC_SHA"] = 0x0009,
  231. ["TLS_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x000A,
  232. ["TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"] = 0x000B,
  233. ["TLS_DH_DSS_WITH_DES_CBC_SHA"] = 0x000C,
  234. ["TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"] = 0x000D,
  235. ["TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x000E,
  236. ["TLS_DH_RSA_WITH_DES_CBC_SHA"] = 0x000F,
  237. ["TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x0010,
  238. ["TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"] = 0x0011,
  239. ["TLS_DHE_DSS_WITH_DES_CBC_SHA"] = 0x0012,
  240. ["TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"] = 0x0013,
  241. ["TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x0014,
  242. ["TLS_DHE_RSA_WITH_DES_CBC_SHA"] = 0x0015,
  243. ["TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x0016,
  244. ["TLS_DH_anon_EXPORT_WITH_RC4_40_MD5"] = 0x0017,
  245. ["TLS_DH_anon_WITH_RC4_128_MD5"] = 0x0018,
  246. ["TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA"] = 0x0019,
  247. ["TLS_DH_anon_WITH_DES_CBC_SHA"] = 0x001A,
  248. ["TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"] = 0x001B,
  249. ["SSL_FORTEZZA_KEA_WITH_NULL_SHA"] = 0x001C,
  250. ["SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA"] = 0x001D,
  251. ["TLS_KRB5_WITH_DES_CBC_SHA-or-SSL_FORTEZZA_KEA_WITH_RC4_128_SHA"] = 0x001E, --TLS vs SSLv3
  252. ["TLS_KRB5_WITH_3DES_EDE_CBC_SHA"] = 0x001F,
  253. ["TLS_KRB5_WITH_RC4_128_SHA"] = 0x0020,
  254. ["TLS_KRB5_WITH_IDEA_CBC_SHA"] = 0x0021,
  255. ["TLS_KRB5_WITH_DES_CBC_MD5"] = 0x0022,
  256. ["TLS_KRB5_WITH_3DES_EDE_CBC_MD5"] = 0x0023,
  257. ["TLS_KRB5_WITH_RC4_128_MD5"] = 0x0024,
  258. ["TLS_KRB5_WITH_IDEA_CBC_MD5"] = 0x0025,
  259. ["TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"] = 0x0026,
  260. ["TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"] = 0x0027,
  261. ["TLS_KRB5_EXPORT_WITH_RC4_40_SHA"] = 0x0028,
  262. ["TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"] = 0x0029,
  263. ["TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"] = 0x002A,
  264. ["TLS_KRB5_EXPORT_WITH_RC4_40_MD5"] = 0x002B,
  265. ["TLS_PSK_WITH_NULL_SHA"] = 0x002C,
  266. ["TLS_DHE_PSK_WITH_NULL_SHA"] = 0x002D,
  267. ["TLS_RSA_PSK_WITH_NULL_SHA"] = 0x002E,
  268. ["TLS_RSA_WITH_AES_128_CBC_SHA"] = 0x002F,
  269. ["TLS_DH_DSS_WITH_AES_128_CBC_SHA"] = 0x0030,
  270. ["TLS_DH_RSA_WITH_AES_128_CBC_SHA"] = 0x0031,
  271. ["TLS_DHE_DSS_WITH_AES_128_CBC_SHA"] = 0x0032,
  272. ["TLS_DHE_RSA_WITH_AES_128_CBC_SHA"] = 0x0033,
  273. ["TLS_DH_anon_WITH_AES_128_CBC_SHA"] = 0x0034,
  274. ["TLS_RSA_WITH_AES_256_CBC_SHA"] = 0x0035,
  275. ["TLS_DH_DSS_WITH_AES_256_CBC_SHA"] = 0x0036,
  276. ["TLS_DH_RSA_WITH_AES_256_CBC_SHA"] = 0x0037,
  277. ["TLS_DHE_DSS_WITH_AES_256_CBC_SHA"] = 0x0038,
  278. ["TLS_DHE_RSA_WITH_AES_256_CBC_SHA"] = 0x0039,
  279. ["TLS_DH_anon_WITH_AES_256_CBC_SHA"] = 0x003A,
  280. ["TLS_RSA_WITH_NULL_SHA256"] = 0x003B,
  281. ["TLS_RSA_WITH_AES_128_CBC_SHA256"] = 0x003C,
  282. ["TLS_RSA_WITH_AES_256_CBC_SHA256"] = 0x003D,
  283. ["TLS_DH_DSS_WITH_AES_128_CBC_SHA256"] = 0x003E,
  284. ["TLS_DH_RSA_WITH_AES_128_CBC_SHA256"] = 0x003F,
  285. ["TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"] = 0x0040,
  286. ["TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0041,
  287. ["TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"] = 0x0042,
  288. ["TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0043,
  289. ["TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"] = 0x0044,
  290. ["TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0045,
  291. ["TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"] = 0x0046,
  292. ["TLS_ECDH_ECDSA_WITH_NULL_SHA-draft"] = 0x0047, --draft-ietf-tls-ecc-00
  293. ["TLS_ECDH_ECDSA_WITH_RC4_128_SHA-draft"] = 0x0048, --draft-ietf-tls-ecc-00
  294. ["TLS_ECDH_ECDSA_WITH_DES_CBC_SHA-draft"] = 0x0049, --draft-ietf-tls-ecc-00
  295. ["TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x004A, --draft-ietf-tls-ecc-00
  296. ["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA-draft"] = 0x004B, --draft-ietf-tls-ecc-00
  297. ["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA-draft"] = 0x004C, --draft-ietf-tls-ecc-00
  298. ["TLS_ECDH_ECNRA_WITH_DES_CBC_SHA-draft"] = 0x004D, --draft-ietf-tls-ecc-00
  299. ["TLS_ECDH_ECNRA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x004E, --draft-ietf-tls-ecc-00
  300. ["TLS_ECMQV_ECDSA_NULL_SHA-draft"] = 0x004F, --draft-ietf-tls-ecc-00
  301. ["TLS_ECMQV_ECDSA_WITH_RC4_128_SHA-draft"] = 0x0050, --draft-ietf-tls-ecc-00
  302. ["TLS_ECMQV_ECDSA_WITH_DES_CBC_SHA-draft"] = 0x0051, --draft-ietf-tls-ecc-00
  303. ["TLS_ECMQV_ECDSA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x0052, --draft-ietf-tls-ecc-00
  304. ["TLS_ECMQV_ECNRA_NULL_SHA-draft"] = 0x0053, --draft-ietf-tls-ecc-00
  305. ["TLS_ECMQV_ECNRA_WITH_RC4_128_SHA-draft"] = 0x0054, --draft-ietf-tls-ecc-00
  306. ["TLS_ECMQV_ECNRA_WITH_DES_CBC_SHA-draft"] = 0x0055, --draft-ietf-tls-ecc-00
  307. ["TLS_ECMQV_ECNRA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x0056, --draft-ietf-tls-ecc-00
  308. ["TLS_ECDH_anon_NULL_WITH_SHA-draft"] = 0x0057, --draft-ietf-tls-ecc-00
  309. ["TLS_ECDH_anon_WITH_RC4_128_SHA-draft"] = 0x0058, --draft-ietf-tls-ecc-00
  310. ["TLS_ECDH_anon_WITH_DES_CBC_SHA-draft"] = 0x0059, --draft-ietf-tls-ecc-00
  311. ["TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA-draft"] = 0x005A, --draft-ietf-tls-ecc-00
  312. ["TLS_ECDH_anon_EXPORT_WITH_DES40_CBC_SHA-draft"] = 0x005B, --draft-ietf-tls-ecc-00
  313. ["TLS_ECDH_anon_EXPORT_WITH_RC4_40_SHA-draft"] = 0x005C, --draft-ietf-tls-ecc-00
  314. ["TLS_RSA_EXPORT1024_WITH_RC4_56_MD5"] = 0x0060,
  315. ["TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5"] = 0x0061,
  316. ["TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA"] = 0x0062,
  317. ["TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"] = 0x0063,
  318. ["TLS_RSA_EXPORT1024_WITH_RC4_56_SHA"] = 0x0064,
  319. ["TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"] = 0x0065,
  320. ["TLS_DHE_DSS_WITH_RC4_128_SHA"] = 0x0066,
  321. ["TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"] = 0x0067,
  322. ["TLS_DH_DSS_WITH_AES_256_CBC_SHA256"] = 0x0068,
  323. ["TLS_DH_RSA_WITH_AES_256_CBC_SHA256"] = 0x0069,
  324. ["TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"] = 0x006A,
  325. ["TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"] = 0x006B,
  326. ["TLS_DH_anon_WITH_AES_128_CBC_SHA256"] = 0x006C,
  327. ["TLS_DH_anon_WITH_AES_256_CBC_SHA256"] = 0x006D,
  328. ["TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD"] = 0x0072, --draft-ietf-tls-openpgp-keys-05
  329. ["TLS_DHE_DSS_WITH_AES_128_CBC_RMD"] = 0x0073, --draft-ietf-tls-openpgp-keys-05
  330. ["TLS_DHE_DSS_WITH_AES_256_CBC_RMD"] = 0x0074, --draft-ietf-tls-openpgp-keys-05
  331. ["TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD"] = 0x0077, --draft-ietf-tls-openpgp-keys-05
  332. ["TLS_DHE_RSA_WITH_AES_128_CBC_RMD"] = 0x0078, --draft-ietf-tls-openpgp-keys-05
  333. ["TLS_DHE_RSA_WITH_AES_256_CBC_RMD"] = 0x0079, --draft-ietf-tls-openpgp-keys-05
  334. ["TLS_RSA_WITH_3DES_EDE_CBC_RMD"] = 0x007C, --draft-ietf-tls-openpgp-keys-05
  335. ["TLS_RSA_WITH_AES_128_CBC_RMD"] = 0x007D, --draft-ietf-tls-openpgp-keys-05
  336. ["TLS_RSA_WITH_AES_256_CBC_RMD"] = 0x007E, --draft-ietf-tls-openpgp-keys-05
  337. ["TLS_GOSTR341094_WITH_28147_CNT_IMIT"] = 0x0080, --draft-chudov-cryptopro-cptls-04
  338. ["TLS_GOSTR341001_WITH_28147_CNT_IMIT"] = 0x0081, --draft-chudov-cryptopro-cptls-04
  339. ["TLS_GOSTR341094_WITH_NULL_GOSTR3411"] = 0x0082, --draft-chudov-cryptopro-cptls-04
  340. ["TLS_GOSTR341001_WITH_NULL_GOSTR3411"] = 0x0083, --draft-chudov-cryptopro-cptls-04
  341. ["TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0084,
  342. ["TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"] = 0x0085,
  343. ["TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0086,
  344. ["TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"] = 0x0087,
  345. ["TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0088,
  346. ["TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"] = 0x0089,
  347. ["TLS_PSK_WITH_RC4_128_SHA"] = 0x008A,
  348. ["TLS_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x008B,
  349. ["TLS_PSK_WITH_AES_128_CBC_SHA"] = 0x008C,
  350. ["TLS_PSK_WITH_AES_256_CBC_SHA"] = 0x008D,
  351. ["TLS_DHE_PSK_WITH_RC4_128_SHA"] = 0x008E,
  352. ["TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x008F,
  353. ["TLS_DHE_PSK_WITH_AES_128_CBC_SHA"] = 0x0090,
  354. ["TLS_DHE_PSK_WITH_AES_256_CBC_SHA"] = 0x0091,
  355. ["TLS_RSA_PSK_WITH_RC4_128_SHA"] = 0x0092,
  356. ["TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x0093,
  357. ["TLS_RSA_PSK_WITH_AES_128_CBC_SHA"] = 0x0094,
  358. ["TLS_RSA_PSK_WITH_AES_256_CBC_SHA"] = 0x0095,
  359. ["TLS_RSA_WITH_SEED_CBC_SHA"] = 0x0096,
  360. ["TLS_DH_DSS_WITH_SEED_CBC_SHA"] = 0x0097,
  361. ["TLS_DH_RSA_WITH_SEED_CBC_SHA"] = 0x0098,
  362. ["TLS_DHE_DSS_WITH_SEED_CBC_SHA"] = 0x0099,
  363. ["TLS_DHE_RSA_WITH_SEED_CBC_SHA"] = 0x009A,
  364. ["TLS_DH_anon_WITH_SEED_CBC_SHA"] = 0x009B,
  365. ["TLS_RSA_WITH_AES_128_GCM_SHA256"] = 0x009C,
  366. ["TLS_RSA_WITH_AES_256_GCM_SHA384"] = 0x009D,
  367. ["TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"] = 0x009E,
  368. ["TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"] = 0x009F,
  369. ["TLS_DH_RSA_WITH_AES_128_GCM_SHA256"] = 0x00A0,
  370. ["TLS_DH_RSA_WITH_AES_256_GCM_SHA384"] = 0x00A1,
  371. ["TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"] = 0x00A2,
  372. ["TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"] = 0x00A3,
  373. ["TLS_DH_DSS_WITH_AES_128_GCM_SHA256"] = 0x00A4,
  374. ["TLS_DH_DSS_WITH_AES_256_GCM_SHA384"] = 0x00A5,
  375. ["TLS_DH_anon_WITH_AES_128_GCM_SHA256"] = 0x00A6,
  376. ["TLS_DH_anon_WITH_AES_256_GCM_SHA384"] = 0x00A7,
  377. ["TLS_PSK_WITH_AES_128_GCM_SHA256"] = 0x00A8,
  378. ["TLS_PSK_WITH_AES_256_GCM_SHA384"] = 0x00A9,
  379. ["TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"] = 0x00AA,
  380. ["TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"] = 0x00AB,
  381. ["TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"] = 0x00AC,
  382. ["TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"] = 0x00AD,
  383. ["TLS_PSK_WITH_AES_128_CBC_SHA256"] = 0x00AE,
  384. ["TLS_PSK_WITH_AES_256_CBC_SHA384"] = 0x00AF,
  385. ["TLS_PSK_WITH_NULL_SHA256"] = 0x00B0,
  386. ["TLS_PSK_WITH_NULL_SHA384"] = 0x00B1,
  387. ["TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"] = 0x00B2,
  388. ["TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"] = 0x00B3,
  389. ["TLS_DHE_PSK_WITH_NULL_SHA256"] = 0x00B4,
  390. ["TLS_DHE_PSK_WITH_NULL_SHA384"] = 0x00B5,
  391. ["TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"] = 0x00B6,
  392. ["TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"] = 0x00B7,
  393. ["TLS_RSA_PSK_WITH_NULL_SHA256"] = 0x00B8,
  394. ["TLS_RSA_PSK_WITH_NULL_SHA384"] = 0x00B9,
  395. ["TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BA,
  396. ["TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BB,
  397. ["TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BC,
  398. ["TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BD,
  399. ["TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BE,
  400. ["TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BF,
  401. ["TLS_EMPTY_RENEGOTIATION_INFO_SCSV"] = 0x00FF,
  402. ["TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C0,
  403. ["TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C1,
  404. ["TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C2,
  405. ["TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C3,
  406. ["TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C4,
  407. ["TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C5,
  408. ["TLS_ECDH_ECDSA_WITH_NULL_SHA"] = 0xC001,
  409. ["TLS_ECDH_ECDSA_WITH_RC4_128_SHA"] = 0xC002,
  410. ["TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"] = 0xC003,
  411. ["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"] = 0xC004,
  412. ["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"] = 0xC005,
  413. ["TLS_ECDHE_ECDSA_WITH_NULL_SHA"] = 0xC006,
  414. ["TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"] = 0xC007,
  415. ["TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"] = 0xC008,
  416. ["TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"] = 0xC009,
  417. ["TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"] = 0xC00A,
  418. ["TLS_ECDH_RSA_WITH_NULL_SHA"] = 0xC00B,
  419. ["TLS_ECDH_RSA_WITH_RC4_128_SHA"] = 0xC00C,
  420. ["TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC00D,
  421. ["TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"] = 0xC00E,
  422. ["TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"] = 0xC00F,
  423. ["TLS_ECDHE_RSA_WITH_NULL_SHA"] = 0xC010,
  424. ["TLS_ECDHE_RSA_WITH_RC4_128_SHA"] = 0xC011,
  425. ["TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC012,
  426. ["TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"] = 0xC013,
  427. ["TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"] = 0xC014,
  428. ["TLS_ECDH_anon_WITH_NULL_SHA"] = 0xC015,
  429. ["TLS_ECDH_anon_WITH_RC4_128_SHA"] = 0xC016,
  430. ["TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"] = 0xC017,
  431. ["TLS_ECDH_anon_WITH_AES_128_CBC_SHA"] = 0xC018,
  432. ["TLS_ECDH_anon_WITH_AES_256_CBC_SHA"] = 0xC019,
  433. ["TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"] = 0xC01A,
  434. ["TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC01B,
  435. ["TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"] = 0xC01C,
  436. ["TLS_SRP_SHA_WITH_AES_128_CBC_SHA"] = 0xC01D,
  437. ["TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"] = 0xC01E,
  438. ["TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"] = 0xC01F,
  439. ["TLS_SRP_SHA_WITH_AES_256_CBC_SHA"] = 0xC020,
  440. ["TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"] = 0xC021,
  441. ["TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"] = 0xC022,
  442. ["TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"] = 0xC023,
  443. ["TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"] = 0xC024,
  444. ["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"] = 0xC025,
  445. ["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"] = 0xC026,
  446. ["TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"] = 0xC027,
  447. ["TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"] = 0xC028,
  448. ["TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"] = 0xC029,
  449. ["TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"] = 0xC02A,
  450. ["TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"] = 0xC02B,
  451. ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"] = 0xC02C,
  452. ["TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"] = 0xC02D,
  453. ["TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"] = 0xC02E,
  454. ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] = 0xC02F,
  455. ["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"] = 0xC030,
  456. ["TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"] = 0xC031,
  457. ["TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"] = 0xC032,
  458. ["TLS_ECDHE_PSK_WITH_RC4_128_SHA"] = 0xC033,
  459. ["TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"] = 0xC034,
  460. ["TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"] = 0xC035,
  461. ["TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"] = 0xC036,
  462. ["TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"] = 0xC037,
  463. ["TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"] = 0xC038,
  464. ["TLS_ECDHE_PSK_WITH_NULL_SHA"] = 0xC039,
  465. ["TLS_ECDHE_PSK_WITH_NULL_SHA256"] = 0xC03A,
  466. ["TLS_ECDHE_PSK_WITH_NULL_SHA384"] = 0xC03B,
  467. ["TLS_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC03C,
  468. ["TLS_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC03D,
  469. ["TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"] = 0xC03E,
  470. ["TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"] = 0xC03F,
  471. ["TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC040,
  472. ["TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC041,
  473. ["TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"] = 0xC042,
  474. ["TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"] = 0xC043,
  475. ["TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC044,
  476. ["TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC045,
  477. ["TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"] = 0xC046,
  478. ["TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"] = 0xC047,
  479. ["TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"] = 0xC048,
  480. ["TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"] = 0xC049,
  481. ["TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04A,
  482. ["TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04B,
  483. ["TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04C,
  484. ["TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04D,
  485. ["TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04E,
  486. ["TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04F,
  487. ["TLS_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC050,
  488. ["TLS_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC051,
  489. ["TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC052,
  490. ["TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC053,
  491. ["TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC054,
  492. ["TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC055,
  493. ["TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"] = 0xC056,
  494. ["TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"] = 0xC057,
  495. ["TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"] = 0xC058,
  496. ["TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"] = 0xC059,
  497. ["TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"] = 0xC05A,
  498. ["TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"] = 0xC05B,
  499. ["TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"] = 0xC05C,
  500. ["TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"] = 0xC05D,
  501. ["TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"] = 0xC05E,
  502. ["TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"] = 0xC05F,
  503. ["TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC060,
  504. ["TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC061,
  505. ["TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC062,
  506. ["TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC063,
  507. ["TLS_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC064,
  508. ["TLS_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC065,
  509. ["TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC066,
  510. ["TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC067,
  511. ["TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC068,
  512. ["TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC069,
  513. ["TLS_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06A,
  514. ["TLS_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06B,
  515. ["TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06C,
  516. ["TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06D,
  517. ["TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06E,
  518. ["TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06F,
  519. ["TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC070,
  520. ["TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC071,
  521. ["TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC072,
  522. ["TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC073,
  523. ["TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC074,
  524. ["TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC075,
  525. ["TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC076,
  526. ["TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC077,
  527. ["TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC078,
  528. ["TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC079,
  529. ["TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07A,
  530. ["TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07B,
  531. ["TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07C,
  532. ["TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07D,
  533. ["TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07E,
  534. ["TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07F,
  535. ["TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC080,
  536. ["TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC081,
  537. ["TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC082,
  538. ["TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC083,
  539. ["TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC084,
  540. ["TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC085,
  541. ["TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC086,
  542. ["TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC087,
  543. ["TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC088,
  544. ["TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC089,
  545. ["TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08A,
  546. ["TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08B,
  547. ["TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08C,
  548. ["TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08D,
  549. ["TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08E,
  550. ["TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08F,
  551. ["TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC090,
  552. ["TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC091,
  553. ["TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC092,
  554. ["TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC093,
  555. ["TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC094,
  556. ["TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC095,
  557. ["TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC096,
  558. ["TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC097,
  559. ["TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC098,
  560. ["TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC099,
  561. ["TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC09A,
  562. ["TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC09B,
  563. ["TLS_RSA_WITH_AES_128_CCM"] = 0xC09C,
  564. ["TLS_RSA_WITH_AES_256_CCM"] = 0xC09D,
  565. ["TLS_DHE_RSA_WITH_AES_128_CCM"] = 0xC09E,
  566. ["TLS_DHE_RSA_WITH_AES_256_CCM"] = 0xC09F,
  567. ["TLS_RSA_WITH_AES_128_CCM_8"] = 0xC0A0,
  568. ["TLS_RSA_WITH_AES_256_CCM_8"] = 0xC0A1,
  569. ["TLS_DHE_RSA_WITH_AES_128_CCM_8"] = 0xC0A2,
  570. ["TLS_DHE_RSA_WITH_AES_256_CCM_8"] = 0xC0A3,
  571. ["TLS_PSK_WITH_AES_128_CCM"] = 0xC0A4,
  572. ["TLS_PSK_WITH_AES_256_CCM"] = 0xC0A5,
  573. ["TLS_DHE_PSK_WITH_AES_128_CCM"] = 0xC0A6,
  574. ["TLS_DHE_PSK_WITH_AES_256_CCM"] = 0xC0A7,
  575. ["TLS_PSK_WITH_AES_128_CCM_8"] = 0xC0A8,
  576. ["TLS_PSK_WITH_AES_256_CCM_8"] = 0xC0A9,
  577. ["TLS_PSK_DHE_WITH_AES_128_CCM_8"] = 0xC0AA,
  578. ["TLS_PSK_DHE_WITH_AES_256_CCM_8"] = 0xC0AB,
  579. ["TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCC13,
  580. ["TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCC14,
  581. ["TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCC15,
  582. ["SSL_RSA_FIPS_WITH_DES_CBC_SHA"] = 0xFEFE,
  583. ["SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"] = 0xFEFF,
  584. }
  585.  
  586. local function find_key(t, value)
  587. local k, v
  588.  
  589. for k, v in pairs(t) do
  590. if v == value then
  591. return k
  592. end
  593. end
  594.  
  595. return nil
  596. end
  597.  
  598. ---
  599. -- Read a SSL/TLS record
  600. -- @param buffer The read buffer
  601. -- @param i The position in the buffer to start reading
  602. -- @return The current position in the buffer
  603. -- @return The record that was read, as a table
  604. function record_read(buffer, i)
  605. local b, h, len
  606.  
  607. ------------
  608. -- Header --
  609. ------------
  610.  
  611. -- Ensure we have enough data for the header.
  612. if #buffer - i < TLS_RECORD_HEADER_LENGTH then
  613. return i, nil
  614. end
  615.  
  616. -- Parse header.
  617. h = {}
  618. local j, typ, proto = bin.unpack(">CS", buffer, i)
  619. local name = find_key(TLS_CONTENTTYPE_REGISTRY, typ)
  620. if name == nil then
  621. stdnse.debug1("Unknown TLS ContentType: %d", typ)
  622. return j, nil
  623. end
  624. h["type"] = name
  625. name = find_key(PROTOCOLS, proto)
  626. if name == nil then
  627. stdnse.debug1("Unknown TLS Protocol: 0x%x", typ)
  628. return j, nil
  629. end
  630. h["protocol"] = name
  631.  
  632. j, h["length"] = bin.unpack(">S", buffer, j)
  633.  
  634. -- Ensure we have enough data for the body.
  635. len = j + h["length"] - 1
  636. if #buffer < len then
  637. return i, nil
  638. end
  639.  
  640. -- Convert to human-readable form.
  641.  
  642. ----------
  643. -- Body --
  644. ----------
  645.  
  646. h["body"] = {}
  647. while j < len do
  648. -- RFC 2246, 6.2.1 "multiple client messages of the same ContentType may
  649. -- be coalesced into a single TLSPlaintext record"
  650. -- TODO: implement reading of fragmented records
  651. b = {}
  652. table.insert(h["body"], b)
  653. if h["type"] == "alert" then
  654. -- Parse body.
  655. j, b["level"] = bin.unpack("C", buffer, j)
  656. j, b["description"] = bin.unpack("C", buffer, j)
  657.  
  658. -- Convert to human-readable form.
  659. b["level"] = find_key(TLS_ALERT_LEVELS, b["level"])
  660. b["description"] = find_key(TLS_ALERT_REGISTRY, b["description"])
  661. elseif h["type"] == "handshake" then
  662. -- Parse body.
  663. j, b["type"] = bin.unpack("C", buffer, j)
  664. local blen, blen_upper
  665. j, blen_upper, blen = bin.unpack("C>S", buffer, j)
  666. blen = blen + blen_upper * 0x10000
  667. local msg_end = j + blen
  668.  
  669. -- Convert to human-readable form.
  670. b["type"] = find_key(TLS_HANDSHAKETYPE_REGISTRY, b["type"])
  671.  
  672. if b["type"] == "server_hello" then
  673. -- Parse body.
  674. j, b["protocol"] = bin.unpack(">S", buffer, j)
  675. j, b["time"] = bin.unpack(">I", buffer, j)
  676. j, b["random"] = bin.unpack("A28", buffer, j)
  677. j, b["session_id_length"] = bin.unpack("C", buffer, j)
  678. j, b["session_id"] = bin.unpack("A" .. b["session_id_length"], buffer, j)
  679. j, b["cipher"] = bin.unpack(">S", buffer, j)
  680. j, b["compressor"] = bin.unpack("C", buffer, j)
  681. -- Optional extensions for TLS only
  682. if j < msg_end and h["protocol"] ~= "SSLv3" then
  683. local num_exts
  684. b["extensions"] = {}
  685. j, num_exts = bin.unpack(">S", buffer, j)
  686. for e = 0, num_exts do
  687. if j >= msg_end then break end
  688. local extcode, datalen
  689. j, extcode = bin.unpack(">S", buffer, j)
  690. extcode = find_key(EXTENSIONS, extcode) or extcode
  691. j, b["extensions"][extcode] = bin.unpack(">P", buffer, j)
  692. end
  693. end
  694.  
  695. -- Convert to human-readable form.
  696. b["protocol"] = find_key(PROTOCOLS, b["protocol"])
  697. b["cipher"] = find_key(CIPHERS, b["cipher"])
  698. b["compressor"] = find_key(COMPRESSORS, b["compressor"])
  699. else
  700. -- TODO: implement other handshake message types
  701. stdnse.debug2("Unknown handshake message type: %s", b["type"])
  702. j = msg_end
  703. end
  704. elseif h["type"] == "heartbeat" then
  705. j, b["type"], b["payload_length"] = bin.unpack("C>S", buffer, j)
  706. j, b["payload"], b["padding"] = bin.unpack("PP", buffer, j)
  707. else
  708. stdnse.debug1("Unknown message type: %s", h["type"])
  709. end
  710. end
  711.  
  712. -- Ignore unparsed bytes.
  713. j = len+1
  714.  
  715. return j, h
  716. end
  717.  
  718. ---
  719. -- Build a SSL/TLS record
  720. -- @param type The type of record ("handshake", "change_cipher_spec", etc.)
  721. -- @param protocol The protocol and version ("SSLv3", "TLSv1.0", etc.)
  722. -- @param b The record body
  723. -- @return The SSL/TLS record as a string
  724. function record_write(type, protocol, b)
  725. return table.concat({
  726. -- Set the header as a handshake.
  727. bin.pack("C", TLS_CONTENTTYPE_REGISTRY[type]),
  728. -- Set the protocol.
  729. bin.pack(">S", PROTOCOLS[protocol]),
  730. -- Set the length of the header body.
  731. bin.pack(">S", #b),
  732. b
  733. })
  734. end
  735.  
  736. ---
  737. -- Build a client_hello message
  738. --
  739. -- The options table has the following keys:
  740. -- * <code>"protocol"</code> - The TLS protocol version string
  741. -- * <code>"ciphers"</code> - a table containing the cipher suite names. Defaults to the NULL cipher
  742. -- * <code>"compressors"</code> - a table containing the compressor names. Default: NULL
  743. -- * <code>"extensions"</code> - a table containing the extension names. Default: no extensions
  744. -- @param t Table of options
  745. -- @return The client_hello record as a string
  746. function client_hello(t)
  747. local b, ciphers, compressor, compressors, h, len
  748.  
  749. ----------
  750. -- Body --
  751. ----------
  752.  
  753. b = {}
  754. -- Set the protocol.
  755. table.insert(b, bin.pack(">S", PROTOCOLS[t["protocol"]]))
  756.  
  757. -- Set the random data.
  758. table.insert(b, bin.pack(">I", os.time()))
  759.  
  760. -- Set the random data.
  761. table.insert(b, stdnse.generate_random_string(28))
  762.  
  763. -- Set the session ID.
  764. table.insert(b, bin.pack("C", 0))
  765.  
  766. -- Cipher suites.
  767. ciphers = {}
  768. if t["ciphers"] ~= nil then
  769. -- Add specified ciphers.
  770. for _, cipher in pairs(t["ciphers"]) do
  771. table.insert(ciphers, bin.pack(">S", CIPHERS[cipher]))
  772. end
  773. else
  774. -- Use NULL cipher
  775. table.insert(ciphers, bin.pack(">S", CIPHERS["TLS_NULL_WITH_NULL_NULL"]))
  776. end
  777. table.insert(b, bin.pack(">P", table.concat(ciphers)))
  778.  
  779. -- Compression methods.
  780. compressors = {}
  781. if t["compressors"] ~= nil then
  782. -- Add specified compressors.
  783. for _, compressor in pairs(t["compressors"]) do
  784. if compressor ~= "NULL" then
  785. table.insert(compressors, bin.pack("C", COMPRESSORS[compressor]))
  786. end
  787. end
  788. end
  789. -- Always include NULL as last choice
  790. table.insert(compressors, bin.pack("C", COMPRESSORS["NULL"]))
  791. table.insert(b, bin.pack(">p", table.concat(compressors)))
  792.  
  793. -- TLS extensions
  794. if PROTOCOLS[t["protocol"]] and
  795. PROTOCOLS[t["protocol"]] ~= PROTOCOLS["SSLv3"] then
  796. local extensions = {}
  797. if t["extensions"] ~= nil then
  798. -- Add specified extensions.
  799. for extension, data in pairs(t["extensions"]) do
  800. if type(extension) == "number" then
  801. table.insert(extensions, bin.pack(">S", extension))
  802. else
  803. table.insert(extensions, bin.pack(">S", EXTENSIONS[extension]))
  804. end
  805. table.insert(extensions, bin.pack(">P", data))
  806. end
  807. end
  808. -- Extensions are optional
  809. if #extensions ~= 0 then
  810. table.insert(b, bin.pack(">P", table.concat(extensions)))
  811. end
  812. end
  813.  
  814. ------------
  815. -- Header --
  816. ------------
  817.  
  818. b = table.concat(b)
  819.  
  820. h = {}
  821.  
  822. -- Set type to ClientHello.
  823. table.insert(h, bin.pack("C", TLS_HANDSHAKETYPE_REGISTRY["client_hello"]))
  824.  
  825. -- Set the length of the body.
  826. len = bin.pack(">I", #b)
  827. -- body length is 24 bits big-endian, so the 3 LSB of len
  828. table.insert(h, len:sub(2,4))
  829.  
  830. table.insert(h, b)
  831.  
  832. return record_write("handshake", t["protocol"], table.concat(h))
  833. end
  834.  
  835. local function read_atleast(s, n)
  836. local buf = {}
  837. local count = 0
  838. while count < n do
  839. local status, data = s:receive_bytes(n - count)
  840. if not status then
  841. return status, data, table.concat(buf)
  842. end
  843. buf[#buf+1] = data
  844. count = count + #data
  845. end
  846. return true, table.concat(buf)
  847. end
  848.  
  849. --- Get an entire record into a buffer
  850. --
  851. -- Caller is responsible for closing the socket if necessary.
  852. -- @param sock The socket to read additional data from
  853. -- @param buffer The string buffer holding any previously-read data
  854. -- (default: "")
  855. -- @param i The position in the buffer where the record should start
  856. -- (default: 1)
  857. -- @return status Socket status
  858. -- @return Buffer containing at least 1 record if status is true
  859. -- @return Error text if there was an error
  860. function record_buffer(sock, buffer, i)
  861. buffer = buffer or ""
  862. i = i or 1
  863. local count = #buffer:sub(i)
  864. local status, resp, rem
  865. if count < TLS_RECORD_HEADER_LENGTH then
  866. status, resp, rem = read_atleast(sock, TLS_RECORD_HEADER_LENGTH - count)
  867. if not status then
  868. return false, buffer .. rem, resp
  869. end
  870. buffer = buffer .. resp
  871. count = count + #resp
  872. end
  873. -- ContentType, ProtocolVersion, length
  874. local _, _, _, len = bin.unpack(">CSS", buffer, i)
  875. if count < TLS_RECORD_HEADER_LENGTH + len then
  876. status, resp = read_atleast(sock, TLS_RECORD_HEADER_LENGTH + len - count)
  877. if not status then
  878. return false, buffer, resp
  879. end
  880. buffer = buffer .. resp
  881. end
  882. return true, buffer
  883. end
  884.  
  885. return _ENV;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement