U v`ƪ<@sdZddlmZddlZddlZddlmZddlmZddlm Z Gdd d ej Z Gd d d ej Z d Z d ZdZdZe dededediZedZdZdZedediZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4ed5ed6ed7ed8ed9ed:ed;ede!d?e"d@e#dAe$dBe%dCe&dDe'dEe(dFe)dGe*dHe+dIe,dJe-dKe.dLe/dMe0dNe1dOe2dPe3dQe4dRiZ5dSdTdUdUgZ6dVdWZ7dXdYZ8GdZd[d[e9Z:Gd\d]d]ej Z;Gd^d_d_ej ZGdbdcdcej Z?Gdddedeej Z@Gdfdgdgej ZAGdhdidiej ZBGdjdkdkej ZCGdldmdmej ZDeDZEeDZFeDZGeDZHeDZIeDZJeDZKdne@fdoeAfdpeBfdqeEfdreCfdseFfdteGfdueHfdveIfdweJfdxeKfdy ZLGdzd{d{ej ZMed|ZNGd}d~d~eOZPddZQejRZSGdddeOZTGdddeOZUGdddeOZVGdddeOZWGdddeOZXGdddeOZYGdddeOZZGdddeOZ[GdddeOZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbdS)z0Secure Sockets Layer / Transport Layer Security.)absolute_importN)dpkt)ssl_ciphersuites) compat_ordc@seZdZdZddZdS)SSL2))lenHrcCstj|||jd@rL|jd@}|_|jd||j|d|_|_nf|jd@}|_t|jd}|jdd||_|jd|d|||_|jd||d|_dS)Niii?rr)rPacketunpackrdatamsgrpad)selfbufnZpadlenr`/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/ssl.pyr s $ z SSL2.unpackN__name__ __module__ __qualname____hdr__r rrrrrsrc@s eZdZdZddZddZdS)TLS))typeB)versionr r)rr rcOsg|_tjj|f||dS)N)recordsrr __init__rargskwargsrrrr@sz TLS.__init__cCstj||d}t|j|ddkr~|dtd||d|dd}|jt||||}|j|d|_qdS)Nr!H) rr r rr structrappend TLSRecord)rrpointerendrrrr Ds(z TLS.unpackN)rrrrrr rrrrr9sriiZSSL3zTLS 1.0zTLS 1.1zTLS 1.2)ssssSSL3_AD_WARNING SSL3_AD_FATAL ()*+,-./0123<FGPZdnopqrsSSL3_AD_CLOSE_NOTIFYSSL3_AD_UNEXPECTED_MESSAGESSL3_AD_BAD_RECORD_MACSSL3_AD_DECOMPRESSION_FAILURESSL3_AD_HANDSHAKE_FAILURESSL3_AD_NO_CERTIFICATESSL3_AD_BAD_CERTIFICATESSL3_AD_UNSUPPORTED_CERTIFICATESSL3_AD_CERTIFICATE_REVOKEDSSL3_AD_CERTIFICATE_EXPIREDSSL3_AD_CERTIFICATE_UNKNOWNSSL3_AD_ILLEGAL_PARAMETERTLS1_AD_DECRYPTION_FAILEDTLS1_AD_RECORD_OVERFLOWTLS1_AD_UNKNOWN_CATLS1_AD_ACCESS_DENIEDTLS1_AD_DECODE_ERRORTLS1_AD_DECRYPT_ERRORTLS1_AD_EXPORT_RESTRICTIONTLS1_AD_PROTOCOL_VERSIONTLS1_AD_INSUFFICIENT_SECURITYTLS1_AD_INTERNAL_ERRORTLS1_AD_USER_CANCELLEDTLS1_AD_NO_RENEGOTIATIONTLS1_AD_UNSUPPORTED_EXTENSION TLS1_AD_CERTIFICATE_UNOBTAINABLETLS1_AD_UNRECOGNIZED_NAME'TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE"TLS1_AD_BAD_CERTIFICATE_HASH_VALUETLS1_AD_UNKNOWN_PSK_IDENTITY!Br$!IcCs`|dks tt|d}|dkr$dnd}t|||d|d}||||}|||fS)a3 Parse an array described using the 'Type name' syntax from the spec Read a length at the start of buf, and returns that many bytes after, in a tuple with the TOTAL bytes consumed (including the size). This does not check that the array is the right length for any given datatype. rr%Nr)AssertionError _SIZE_FORMATSr&r )rZlenbytesZ size_formatpaddingsizer rrrparse_variable_arrays   rtcCs~td|ddd}g}d}||krztd|||dd}|d7}t||dd\}}|||f||7}q |S)aI Parse TLS extensions in passed buf. Returns an ordered list of extension tuples with ordinal extension type as first value and extension data as second value. Passed buf must start with the 2-byte extensions length TLV. http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml r$Nr-r)r&r rtr')rZextensions_length extensionsr)Zext_typeext_dataparsedrrrparse_extensionss rxc@s eZdZdS) SSL3ExceptionN)rrrrrrrrysryc@s$eZdZdZdZddZddZdS)r(aT SSLv3 or TLSv1+ packet. In addition to the fields specified in the header, there are compressed and decrypted fields, indicating whether, in the language of the spec, this is a TLSPlaintext, TLSCompressed, or TLSCiphertext. The application will have to figure out when it's appropriate to change these values. )rrr)rr r)lengthr rcOs@|dd|_|dd|_tjj|f||t|j|_dS)N compressedF encrypted) popr|r}rr rrr r{r rrrrszTLSRecord.__init__cCsRtj|||j}||||j|_t|j|jkrBtdd|_d|_ dS)NzTLSRecord data was too short.T) rr r Z __hdr_len__r{r rNeedDatar|r})rr header_lengthrrrr s zTLSRecord.unpackN)rrr__doc__rrr rrrrr(s  r(c@seZdZdZdZdS)TLSChangeCipherSpeczE ChangeCipherSpec message is just a single byte with value 1 ))rrrN)rrrrrrrrrrsrc@seZdZdZdS) TLSAppDatazK As far as TLSRecord is concerned, AppData is just an opaque blob. N)rrrrrrrrr src@seZdZdZdS)TLSAlert))levelrr) descriptionrrN)rrrrrrrrrsrc@seZdZeZdS)TLSHelloRequestNrrrtuplerrrrrrsrc@seZdZdZddZdS)TLSClientHello))rr r,randomZ32sz c Cstj||t|jd\|_}t|j|dd\}}||7}tt|d}z$ddtd|d|D|_ Wn8t k r}zt dt|j dW5d}~XYnXt|j|dd\}}||7}td t|||_t|j|dd krt|j|d|_dS) Nrr-cSsg|]}tj|qSr)rBY_CODE).0coderrr -sz)TLSClientHello.unpack..!r 'Unknown or invalid cipher suite type %xrz{0}B)rr r rtr session_idintrr& ciphersuitesKeyErrorryr!formatcompression_methodsrxru)rrr)rrwZnum_ciphersuiteserrrrr #s  (zTLSClientHello.unpackNrrrrrrsrc@seZdZdZddZdS)TLSServerHello))rr Z0x0301rc Cs ztj||t|jd\|_}z.td|j||dd}tj||_ Wn8t k r}zt dt |j dW5d}~XYnX|d7}td|j||dd|_|d7}t|j|ddkrt|j|d|_Wntjk rtjYnXdS)Nrr$r-rrrkr)rr r rtr rr&rr cipher_suiterryrr! compressionrrxruerrorr)rrr)rrrrrr As( zTLSServerHello.unpackNrrrrrr;src@seZdZeZddZdS)TLSCertificatecCszbtj||t|jd\}}g|_d}||kr`t|j|dd\}}|j|||7}q*Wntjk r~tj YnXdS)Nr%) rr r rtr certificatesr'r&rr)rrZ all_certsZ all_certs_lenr)certrwrrrr Zs zTLSCertificate.unpackN)rrrrrr rrrrrWsrc@seZdZeZdS)TLSUnknownHandshakeNrrrrrrhsrZ HelloRequestZ ClientHelloZ ServerHelloZNewSessionTicket CertificateZServerKeyExchangeZCertificateRequestZServerHelloDoneZCertificateVerifyZClientKeyExchangeZFinished) rrr-rm r1c@s(eZdZdZdZddZeddZdS) TLSHandshakean A TLS Handshake message This goes for all messages encapsulated in the Record layer, but especially important for handshakes and app data: A message may be spread across a number of TLSRecords, in addition to the possibility of there being more than one in a given Record. You have to put together the contents of TLSRecord's yourself. )rz) length_bytesZ3srcCsntj||t|jd}|dkr2td|j|jd|j|_t |j|jkrZtj |d|j|_dS)Nz$Unknown or invalid handshake type %dr) rr r HANDSHAKE_TYPESgetrryr r{rr)rrZ embedded_typerrrr szTLSHandshake.unpackcCstdd|jdS)Nrlrnr)r&r rrrrrr{szTLSHandshake.lengthN)rrrrrr propertyr{rrrrrs  r)r1r;r<c@seZdZddZdS) SSLFactorycCs$|dd}|tkrt|St|S)Nrr%)SSL3_VERSION_BYTESr(r)clsrvrrr__new__s zSSLFactory.__new__N)rrrrrrrrrsrcCsdt|}}g}|d|kr||d|d}|tkrvzt||d}||Wqtjk rrYqYqXntd|||d|t|7}q||fS)aE Attempt to parse one or more TLSRecord's out of buf Args: buf: string containing SSL/TLS messages. May have an incomplete record on the end Returns: [TLSRecord] int, total bytes consumed, != len(buf) if an incomplete record was left at the end. Raises SSL3Exception. rr#rr%NzBad TLS version in buf: %r)rrr(r'rrry)rirmsgsrr rrrtls_multi_factorys  rc@s4eZdZdZeddZddZddZdd Zd S) TestTLSzu Test basic TLS functionality. Test that each TLSRecord is correctly discovered and added to TLS.records cCstd|_dS)Ns X\/*eIq h0ܞMGj+, # $rs/0'(vwz{/<5=A |}3g9kE2@8jDfU www.iana.org#   )rprrrr setup_classszTestTLS.setup_classcCst|jjdkstdSNr)rrrrprrrrtest_records_lengthszTestTLS.test_records_lengthcCs|jjdjdkstdS)Nrr<)rrrrprrrrtest_record_typeszTestTLS.test_record_typecCs|jjdjdkstdS)Nrr+)rrrrprrrrtest_record_version szTestTLS.test_record_versionN) rrrr classmethodrrrrrrrrrs  rc@s\eZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS) TestTLSRecordz Test basic TLSRecord functionality For this test, the contents of the record doesn't matter, since we're not parsing the next layer. cCstd|_dS)Nsabcdefghzzzzzzzzzzz)r(rrrrrrszTestTLSRecord.setup_classcCs|jjdkstdS)Nrrrrprrrrtest_content_typeszTestTLSRecord.test_content_typecCs|jjdkstdS)Nr,)rrrprrrr test_versionszTestTLSRecord.test_versioncCs|jjdkstdS)N)rr{rprrrr test_lengthszTestTLSRecord.test_lengthcCs|jjdkstdS)Nabcdefgh)rr rprrrr test_data!szTestTLSRecord.test_datacCs$|jjdkst|jjdks tdSNT)rr|rpr}rrrrtest_initial_flags$sz TestTLSRecord.test_initial_flagscCs`tdddd}|jdkst|jdks*t|jdks8t|jdksFt||jks\tdS)Nrr,r)rrr r)r(rrprr{r packr)rp2rrr test_repack(s zTestTLSRecord.test_repackcCst|jdkstdS)Nrrrrprrrrtest_total_length0szTestTLSRecord.test_total_lengthcCsddl}|tjtddS)Nrsabc)pytestraisesrrr(rrrrr'test_raises_need_data_when_buf_is_short4sz5TestTLSRecord.test_raises_need_data_when_buf_is_shortN)rrrrrrrrrrrrrrrrrrr s rc@s,eZdZdZeddZddZddZdS) TestTLSChangeCipherSpecz/It's just a byte. This will be quick, I promisecCstd|_dS)N)rrrrrrr<sz#TestTLSChangeCipherSpec.setup_classcCs|jjdkstdSrrrrrr test_parses@sz#TestTLSChangeCipherSpec.test_parsescCst|jdkstdSrrrrrrrCsz)TestTLSChangeCipherSpec.test_total_lengthN)rrrrrrrrrrrrr9s  rc@seZdZdZddZdS)TestTLSAppDataz"AppData is basically just a stringcCstd}|dkstdS)NZabcdefgh)rrp)rdrrr test_valueJszTestTLSAppData.test_valueN)rrrrrrrrrrGsrc@s0eZdZeddZddZddZddZd S) TestTLSHandshakecCstd|_dS)Ns)rhrrrrrPszTestTLSHandshake.setup_classcCst|jjtdkstdSr) isinstancerr rrprrrrtest_created_inside_messageTsz,TestTLSHandshake.test_created_inside_messagecCs|jjdkstdSr)rr{rprrrrrWszTestTLSHandshake.test_lengthcCsddl}|tjtddS)Nrs)rrrrrrrrrtest_raises_need_dataZsz&TestTLSHandshake.test_raises_need_dataN)rrrrrrrrrrrrrOs  rc@sLeZdZdZeddZddZddZdd Zd d Z d d Z ddZ dS)TestClientHelloz5This data is extracted from and verified by WiresharkcCstd|_t|j|_dS)NsF0100019903015008220ce5e0e78b6891afe204498c9363feffbe03235a2d9e05b7d990eb708d2009bc0192e008e6fa8fe47998fca91311ba30ddde14a9587dc674b11c3d3e5ed1005200ffc00ac0140088008700390038c00fc00500840035c007c009c011c0130045004400330032c00cc00ec002c0040096004100050004002fc008c01200160013c00dc003000ac006c010c00bc00100020001010000fc0000000e000c0000096c6f63616c686f7374000a00080006001700180019000b00020100002300d0a50b2e9f618a9ea9bf493ef49b421835cd2f6b05bbe1179d8edf70d58c33d656e8696d36d7e7e0b9d3ecc0e4de339552fa06c64c0fcb550a334bc43944e2739ca342d15a9ebbe981ac87a0d38160507d47af09bdc16c5f0ee4cdceea551539382333226048a026d3a90a0535f4a64236467db8fee22b041af986ad0f253bc369137cd8d8cd061925461d7f4d7895ca9a4181ab554dad50360ac31860e971483877c9335ac1300c5e78f3e56f3b8e0fc16358fcaceefd5c8d8aaae7b35be116f8832856ca61144fcdd95e071b94d0cf7233740000FFFFFFFFFFFFFFFF _hexdecoder rrrrrrrbszTestClientHello.setup_classcCst|jjtdkstdS)z+Make sure the correct class was constructedTN)rrr rrprrrrtest_client_hello_constructedxsz-TestClientHello.test_client_hello_constructedcCs|jjjtdkstdS)Ns@5008220ce5e0e78b6891afe204498c9363feffbe03235a2d9e05b7d990eb708drr rrrprrrrtest_client_random_correctsz*TestClientHello.test_client_random_correctcCsVtdd|jjjDtdt|jjjtdks.z!{0}Hs00ffc00ac0140088008700390038c00fc00500840035c007c009c011c0130045004400330032c00cc00ec002c0040096004100050004002fc008c01200160013c00dc003000ac006c010c00bc00100020001r4) rrr rr&r rrrrprrrrtest_cipher_suites  z!TestClientHello.test_cipher_suitecCs|jjjtdkstdS)Ns@09bc0192e008e6fa8fe47998fca91311ba30ddde14a9587dc674b11c3d3e5ed1)rr rrrprrrrtest_session_idszTestClientHello.test_session_idcCst|jjjdgkstdS)Nr)listrr rrprrrrtest_compression_methodssz(TestClientHello.test_compression_methodscCst|jdkstdS)Nirrrrrrsz!TestClientHello.test_total_lengthN) rrrrrrrrrrrrrrrrr_s rc@s<eZdZdZeddZddZddZdd Zd d Z d S) TestServerHellozAgain, from WiresharkcCstd|_t|j|_dS)Ns0200004d03015008220c8ec43c5462315a7c99f5d5b6bff009ad285b51dc18485f352e9fdecd2009bc0192e008e6fa8fe47998fca91311ba30ddde14a9587dc674b11c3d3e5ed10002000005ff01000100rrrrrrszTestServerHello.setup_classcCst|jjtdkstdSr)rrr rrprrrrtest_constructedsz TestServerHello.test_constructedcCs|jjjtdkstdS)Ns@5008220c8ec43c5462315a7c99f5d5b6bff009ad285b51dc18485f352e9fdecdrrrrrtest_random_correctsz#TestServerHello.test_random_correctcCs|jjjjdkstdS)NZTLS_RSA_WITH_NULL_SHA)rr rnamerprrrrrsz!TestServerHello.test_cipher_suitecCst|jdkstdS)NQrrrrrrsz!TestServerHello.test_total_lengthN) rrrrrrrrrrrrrrrs rc@s$eZdZdZeddZddZdS)TestTLSCertificatez*eN~5?8#'1'#s:)ԘH3"V\ȪJ!0ƶiq L:>3na<~kQf.s=v`:uNUyс$~Kx ? }⥦Z6Fs(1o hXVkѦ.500U#0Qhu)֋4ȚϯZ:JNh|H eo"KgK j7EÕa |z}jP6|J՝Z{mluItZYf]O(UJ Hz& S* ܸx]fI'wwN!е3@xETq^L䂋/%:l0 u޺4NA'c0cu?q4̓ ^ߡ߾$k00\m+B]0  *H  0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0 131022120000Z 281022120000Z0p1 0 UUS10U  DigiCert Inc10U www.digicert.com1/0-U&DigiCert SHA2 High Assurance Server CA0"0  *H 0 /$m_ d}"&eB@ܟv>0UOZUV*И @;rȸC: Օ@M_WPhܤ-ƭ^DX*75 '2ZQ';B3(Ļ(̚+# x{^qJ>#MגuD5eS%9 cth 7RH9Z]ݠ !&oJ!AmH/hS/^I0E0U00U0U%0++04+(0&0$+0http://ocsp.digicert.com0KUD0B0@><:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0=U 60402U 0*0(+https://www.digicert.com/CPS0UQhuiGԘ&cd+0  *H  m\hJQ/kDcnlq[4Ny)-j yGYq}kYX=1%\8柂[1NxI'r>A 6nGI^H|I&B@֒d WT^kĀrV00 NW$+u-}y' ꪅ (AYC(ҁ{;w@bAE>3ga.riW@pɴ)rrrrrrrszTestTLSCertificate.setup_classcCst|jjjdkstdSNr-)rrr rrprrrrtest_num_certs!sz!TestTLSCertificate.test_num_certsN)rrrrrrrrrrrrs orc@sDeZdZdZeddZddZddZdd Zd d Z d d Z dS)TestTLSMultiFactoryzMade up test datacCs td|_t|j\|_|_dS)Nsf1703010010AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1703010010BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1703010010CCCCCCCC)rr rr bytes_parsedrrrrr's zTestTLSMultiFactory.setup_classcCst|jdkstdSr)rrrprrrrtest_num_messages1sz%TestTLSMultiFactory.test_num_messagescCs|jdkstdS)Nr5)rrprrrrtest_bytes_parsed6sz%TestTLSMultiFactory.test_bytes_parsedcCs|jdjtdkstdS)Nrs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArr rrprrrrtest_first_msg_data9sz'TestTLSMultiFactory.test_first_msg_datacCs|jdjtdkstdS)Nrs BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBrrrrrtest_second_msg_data<sz(TestTLSMultiFactory.test_second_msg_datac Csddl}ttd\}}t|dks(t|dks4tttd\}}t|dksTt|dks`tttd\}}t|dkst|dkstttd\}}t|dkst|dkstttd\}}t|dkst|dkst|jtd d ttd W5QRXdS) Nrs17s1703s170301s17030100s 1703010000rr#zBad TLS version in buf: matchs 000000000000)rrrrrprry)rrrrrrrtest_incomplete?s$     z#TestTLSMultiFactory.test_incompleteN) rrrrrrrrrrrrrrrr%s rcCsddlm}|d}t|}|jdks*t|jdks8t|jdksFt|jdksTt|d}t|}|jdksrt|jdkst|jdkstdS) Nr unhexlifyZ0001020304050607rssZ 8001030607)binasciirrrrpr rr )rZ buf_paddingssl2Zbuf_no_paddingrrr test_ssl2Vs  rc CsBddl}ddlm}|d}|jtddt|W5QRXdS)NrrZP0301000000000000000000000000000000000000000000000000000000000000000001020002001c'Unknown or invalid cipher suite type 1cr)rrrrryrrrrrrrtest_clienthello_invalidcipherps rc Csnddl}ddlm}|d}|jtddt|W5QRX|dd}|tjt|W5QRXdS)NrrZL030100000000000000000000000000000000000000000000000000000000000000000102001crr)rrrrryrrrrrrrtest_serverhello_invalidciphers  rc Cs@ddl}ddlm}|d}|tjt|W5QRXdS)NrrZ 0000030000)rrrrrrrrrrr#test_tlscertificate_unpacking_errors rc CsBddl}ddlm}|d}|jtddt|W5QRXdS)NrrZ7b000000z%Unknown or invalid handshake type 123r)rrrrryrrrrrtest_tlshandshake_invalid_types r cCsLddlm}|d}t|}t|ts*t|d}t|}t|tsHtdS)NrrZ 0003010000Z000000)rrrrr(rpr)rZ buf_tls31ZtlsZbuf_ssl2rrrrtest_sslfactorys r )cr __future__rr&rrrrcompatrr rrZSSL3_VZTLS1_VZTLS11_VZTLS12_VZssl3_versions_strsetrr.r/Zalert_level_strrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjZalert_description_strrqrtrx Exceptionryr(rstrrrrrrrrZTLSNewSessionTicketZTLSServerKeyExchangeZTLSCertificateRequestZTLSServerHelloDoneZTLSCertificateVerifyZTLSClientKeyExchangeZ TLSFinishedrrZ RECORD_TYPESobjectrra2b_hexrrrrrrrrrrrrrrr r rrrrs`    #$ '' -,5w1