
    =Og!              
          	 d dl Z d dlZd dlmZ d dlmZmZm	Z
 d dlmZ d dlZd dlmZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d d	lmZmZm Z m!Z! 	 d d
lm"Z" n# e#$ r Y nw xY wd dlm$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dlm.Z.m/Z/  ej0        de1d e            e
j0        de1d e            ej0        de1d e            ej0        de1d e            e
j0        de1d e            ej0        de1d e           e2j3        xZ4e2_4        d e2j5        6                                D             Z7 e8e2dd          Z9 ee           G d d                      Z: ee           G d d                      Z; ee           G d  d!                      Z< ee           G d" d#                      Z=e j>        d$k    rd d%lm?Z?m@Z@ d d&lAmAZAmBZBmCZC d d'lAmDZDmEZEmFZF d dlAZGd dlHZHd dlIZId dlJZJeKZLd(gZM eNed)          ZOe.ZPeZQd* ZRd+ ZSd, ZTd- ZU ed.d/          ZVd0 ZW G d1 d2 ed2d3                    ZX G d4 d5eXe          ZY G d6 d7e          ZZeYj[        fdddd8d9Z\dKe]d:eYj[        dddddd;d<Z^e\Z_e^Z` G d= d>          Zad? Zb G d@ dAeA          ZceceZ_d        eaeZ_e        ddd:e]e3ddBdBdf	dCZfdD ZgdEZhdFZidG ZjdH ZkeldeFfdIZmdJ ZndS )L    N)
namedtuple)EnumIntEnumIntFlag)_simple_enum)OPENSSL_VERSION_NUMBEROPENSSL_VERSION_INFOOPENSSL_VERSION)_SSLContext	MemoryBIO
SSLSession)SSLErrorSSLZeroReturnErrorSSLWantReadErrorSSLWantWriteErrorSSLSyscallErrorSSLEOFErrorSSLCertVerificationError)txt2objnid2obj)RAND_statusRAND_add
RAND_bytesRAND_pseudo_bytes)RAND_egd)
HAS_SNIHAS_ECDHHAS_NPNHAS_ALPN	HAS_SSLv2	HAS_SSLv3	HAS_TLSv1HAS_TLSv1_1HAS_TLSv1_2HAS_TLSv1_3)_DEFAULT_CIPHERS_OPENSSL_API_VERSION
_SSLMethodc                 8    |                      d          o| dk    S )N	PROTOCOL_PROTOCOL_SSLv23
startswithnames    /usr/lib64/python3.11/ssl.py<lambda>r1   }   s    --K$:K2K     )sourceOptionsc                 ,    |                      d          S )NOP_r,   r.   s    r0   r1   r1      s    '' r2   AlertDescriptionc                 ,    |                      d          S )NALERT_DESCRIPTION_r,   r.   s    r0   r1   r1      s    !566 r2   SSLErrorNumberc                 ,    |                      d          S )N
SSL_ERROR_r,   r.   s    r0   r1   r1      s    .. r2   VerifyFlagsc                 ,    |                      d          S )NVERIFY_r,   r.   s    r0   r1   r1      s    ++ r2   
VerifyModec                 ,    |                      d          S )NCERT_r,   r.   s    r0   r1   r1      s    )) r2   c                     i | ]\  }}||	S  rD   ).0r/   values      r0   
<dictcomp>rG      s    QQQ;45$QQQr2   PROTOCOL_SSLv2c                   p    e Zd Zej        Zej        Zej        Z	ej
        Zej        Zej        Zej        ZdS )
TLSVersionN)__name__
__module____qualname___sslPROTO_MINIMUM_SUPPORTEDMINIMUM_SUPPORTEDPROTO_SSLv3SSLv3PROTO_TLSv1TLSv1PROTO_TLSv1_1TLSv1_1PROTO_TLSv1_2TLSv1_2PROTO_TLSv1_3TLSv1_3PROTO_MAXIMUM_SUPPORTEDMAXIMUM_SUPPORTEDrD   r2   r0   rJ   rJ      sJ        4EE G G G4r2   rJ   c                   (    e Zd Z	 dZdZdZdZdZdZdS )_TLSContentType                 N)	rK   rL   rM   CHANGE_CIPHER_SPECALERT	HANDSHAKEAPPLICATION_DATAHEADERINNER_CONTENT_TYPErD   r2   r0   r^   r^      s8         EIFr2   r^   c                       e 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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dZ dZ!d Z"d!Z#d"Z$d#S )$_TLSAlertTyper   
   r_   r`   ra      (   )   *   +   ,   -   .   /   0   1   2   3   <   F   G   P   V   Z   d   m   n   o   p   q   r   s   t   x   N)%rK   rL   rM   CLOSE_NOTIFYUNEXPECTED_MESSAGEBAD_RECORD_MACDECRYPTION_FAILEDRECORD_OVERFLOWDECOMPRESSION_FAILUREHANDSHAKE_FAILURENO_CERTIFICATEBAD_CERTIFICATEUNSUPPORTED_CERTIFICATECERTIFICATE_REVOKEDCERTIFICATE_EXPIREDCERTIFICATE_UNKNOWNILLEGAL_PARAMETER
UNKNOWN_CAACCESS_DENIEDDECODE_ERRORDECRYPT_ERROREXPORT_RESTRICTIONPROTOCOL_VERSIONINSUFFICIENT_SECURITYINTERNAL_ERRORINAPPROPRIATE_FALLBACKUSER_CANCELEDNO_RENEGOTIATIONMISSING_EXTENSIONUNSUPPORTED_EXTENSIONCERTIFICATE_UNOBTAINABLEUNRECOGNIZED_NAMEBAD_CERTIFICATE_STATUS_RESPONSEBAD_CERTIFICATE_HASH_VALUEUNKNOWN_PSK_IDENTITYCERTIFICATE_REQUIREDNO_APPLICATION_PROTOCOLrD   r2   r0   rl   rl      s         LNONO JMLMNM"&)#!$!r2   rl   c                   h    e 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dZdZdZdZdZdZdZdZdS )_TLSMessageTyper                                          r_   r`   ra   rb      C      rd   N)rK   rL   rM   HELLO_REQUESTCLIENT_HELLOSERVER_HELLOHELLO_VERIFY_REQUESTNEWSESSION_TICKETEND_OF_EARLY_DATAHELLO_RETRY_REQUESTENCRYPTED_EXTENSIONSCERTIFICATESERVER_KEY_EXCHANGECERTIFICATE_REQUESTSERVER_DONECERTIFICATE_VERIFYCLIENT_KEY_EXCHANGEFINISHEDCERTIFICATE_URLCERTIFICATE_STATUSSUPPLEMENTAL_DATA
KEY_UPDATE
NEXT_PROTOMESSAGE_HASHre   rD   r2   r0   r   r      s         MLLKKHOJJLr2   r   win32)enum_certificates	enum_crls)socketSOCK_STREAMcreate_connection)
SOL_SOCKETSO_TYPE_GLOBAL_DEFAULT_TIMEOUT
tls-uniqueHOSTFLAG_NEVER_CHECK_SUBJECTc                    	 | sdS |                      d          }|s*|                                 |                                k    S |dk    r"t          d                    |                     |                     d          \  }}}d|v r"t          d                    |                     |s"t          d                    |                     |dk    r"t          d                    |                     |                    d          \  }}}|r|sdS |                                |                                k    S )	NF*r   z1too many wildcards in certificate DNS name: {!r}..z9wildcard can only be present in the leftmost label: {!r}.z>sole wildcard without additional labels are not support: {!r}.z<partial wildcards in leftmost label are not supported: {!r}.)countlowerCertificateErrorformat	partition)dnhostname	wildcardsdn_leftmostsepdn_remainderhostname_leftmosthostname_remainders           r0   _dnsname_matchr     sq     uI .xxzzX^^----1}}?FFrJJL L 	L &(\\#%6%6"Kl
lF2JJ    	    F2JJ    	  cF2JJ    	  2:1C1CC1H1H.s. C u#5#;#;#=#===r2   c                    	 	 t          j        |           }t          j        |          | k    r|S t          d                    |                     # t
          $ r Y nw xY w	 t          j        t           j        |           S # t
          $ r# t          d                    |                     t          $ r Y nw xY wt          d                    |                     )Nz'{!r} is not a quad-dotted IPv4 address.z+{!r} is neither an IPv4 nor an IP6 address.z{!r} is not an IPv4 address.)	_socket	inet_aton	inet_ntoa
ValueErrorr   OSError	inet_ptonAF_INET6AttributeError)ipnameaddrs     r0   _inet_patonr   I  s    ((
 T""f,,K 9@@HH       !16::: 4 4 4 $$*F6NN4 4 	4    3::6BB
C
CCs#   A 
A A $B 5B;:B;c                 R    	 t          |                                           }||k    S N)r   rstrip)cert_ipaddresshost_ipips      r0   _ipaddress_matchr  l  s,     
^**,,	-	-B=r2   c                 `   	 t          j        dt          d           | st          d          	 t	          |          }n# t          $ r d }Y nw xY wg }|                     dd          }|D ]f\  }}|dk    r+|t          ||          r d S |                    |           6|dk    r*|t          ||          r d S |                    |           g|sP|                     d	d          D ]9}|D ]4\  }}|d
k    r)t          ||          r  d S |                    |           5:t          |          dk    r;t          d|dd                    t          t          |                              t          |          dk    rt          d|d|d                   t          d          )Nz"ssl.match_hostname() is deprecatedr   category
stacklevelztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDsubjectAltNamerD   DNSz
IP Addresssubject
commonNamer   z	hostname z doesn't match either of z, z doesn't match r   z=no appropriate commonName or subjectAltName fields were found)warningswarnDeprecationWarningr   r   getr   appendr  lenr   joinmaprepr)certr   r   dnsnamessankeyrF   subs           r0   match_hostnamer  x  sC    M,#   
  ; : ; ; 	;h''    H
((#R
(
(C # #
U%<<>%#B#BOOE""""L  "'7w'G'G"OOE""" 
+ 88Ir** 	+ 	+C! + +
U ,&&%eX66 OOE***+ 8}}qxx3tX#6#6777 9 : : 	: 
X!		xx! & ' ' 	'   / 0 0 	0s   A   AADefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  z   	 t          j                    } t          j                            | d         | d                   }t          j                            | d         | d                   }t          t          j                            |          r|nd t          j                            |          r|nd g| R  S )Nr   r   r   r   )	rN   get_default_verify_pathsosenvironr  r  pathisfileisdir)partscafilecapaths      r0   r  r    s    )++E Z^^E!HeAh//FZ^^E!HeAh//Fv(>(>HffD(*f(=(=Gff4&$& & & &r2   c                   X     e Zd Z	 dZ fdZe fd            Ze fd            Z xZS )_ASN1ObjectrD   c                 V     t                      j        | gt          |d          R  S )NFr.   super__new___txt2obj)clsoid	__class__s     r0   r*  z_ASN1Object.__new__  s.    uwws?Xc%>%>%>????r2   c                 T    	  t                      j        | gt          |          R  S r   )r)  r*  _nid2obj)r,  nidr.  s     r0   fromnidz_ASN1Object.fromnid  s,    	uwws3Xc]]3333r2   c                 X    	  t                      j        | gt          |d          R  S )NTr.   r(  )r,  r/   r.  s     r0   fromnamez_ASN1Object.fromname  s3    	uwws?Xd%>%>%>????r2   )	rK   rL   rM   	__slots__r*  classmethodr2  r4  __classcell__r.  s   @r0   r&  r&    s        I@ @ @ @ @ 4 4 4 4 [4
 @ @ @ @ [@ @ @ @ @r2   r&  znid shortname longname oidc                       e Zd Z	 dZdZdS )Purposez1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)rK   rL   rM   SERVER_AUTHCLIENT_AUTHrD   r2   r0   r:  r:    s        %K%KKKr2   r:  c                       e Zd Z	 dZdZdZd dZd Z	 	 	 	 d!dZ	 	 d"dZ	d	 Z
d
 Zd Zd Zej        fdZ eed          r>e fd            Zej         fd            Ze fd            Zej         fd            Ze fd            Zej         fd            Z eed          red             Zej        d             Zned             Ze fd            Zej         fd            Ze fd            Ze fd            Zej         fd            Ze fd            Zej         fd            Z xZS )#
SSLContext)CAROOTNc                 z    |#t          j        dt          d           t          }t	          j        | |          }|S )Nz9ssl.SSLContext() without protocol argument is deprecated.r   r  )r  r  r  PROTOCOL_TLSr   r*  )r,  protocolargskwargsselfs        r0   r*  zSSLContext.__new__  sH    MK+   
 $H"311r2   c                     |d S t          |t                    r(|                    d                              d          S |                    d          S )Nidnaascii)
isinstancestrencodedecode)rF  r   s     r0   _encode_hostnamezSSLContext._encode_hostname  sQ    4#&& 	,??6**11':::??7+++r2   FTc           	      D    | j                             |||||| |          S )N)sockserver_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostnamecontextsession)sslsocket_class_create)rF  rP  rQ  rR  rS  rT  rV  s          r0   wrap_socketzSSLContext.wrap_socket  s9     #++#$;!5+ , 
 
 	
r2   c                 h    | j                             ||||                     |          ||           S )N)rQ  rT  rV  rU  )sslobject_classrX  rN  )rF  incomingoutgoingrQ  rT  rV  s         r0   wrap_biozSSLContext.wrap_bio  sA     #++hK 11/BBT , 
 
 	
r2   c                    t          j        dt          d           t                      }|D ]~}t	          |d          }t          |          dk    st          |          dk    rt          d          |                    t          |                     |                    |           | 	                    |           d S )N'ssl NPN is deprecated, use ALPN insteadr   r  rI  r      z(NPN protocols must be 1 to 255 in length)
r  r  r  	bytearraybytesr  r   r  extend_set_npn_protocols)rF  npn_protocolsprotosrC  bs        r0   set_npn_protocolszSSLContext.set_npn_protocols  s    5	
 	
 	
 	

 % 	 	Hh((A1vv{{c!ffsllIJJJMM#a&&!!!MM!'''''r2   c                 v     	d  _         d S t                    st          d           fd}| _         d S )Nznot a callable objectc                 H                         |          } | ||          S r   )rN  )sslobj
servernamesslctxrF  server_name_callbacks      r0   shim_cbz3SSLContext.set_servername_callback.<locals>.shim_cb0  s+    !22:>>
++FJGGGr2   )sni_callbackcallable	TypeError)rF  rp  rq  s   `` r0   set_servername_callbackz"SSLContext.set_servername_callback)  sl    ' $D011 9 7888H H H H H H !(Dr2   c                 N   t                      }|D ]~}t          |d          }t          |          dk    st          |          dk    rt          d          |                    t          |                     |                    |           |                     |           d S )NrI  r   rb  z)ALPN protocols must be 1 to 255 in length)rc  rd  r  r   r  re  _set_alpn_protocols)rF  alpn_protocolsrh  rC  ri  s        r0   set_alpn_protocolszSSLContext.set_alpn_protocols6  s    & 	 	Hh((A1vv{{c!ffsllJKKKMM#a&&!!!MM!  (((((r2   c                    t                      }	 t          |          D ].\  }}}|dk    r"|du s	|j        |v r|                    |           /n$# t          $ r t          j        d           Y nw xY w|r|                     |           |S )Nx509_asnTz-unable to enumerate Windows certificate store)cadata)rc  r   r-  re  PermissionErrorr  r  load_verify_locations)rF  	storenamepurposecertsr  encodingtrusts          r0   _load_windows_store_certsz$SSLContext._load_windows_store_certsA  s    	K):9)E)E + +%hz))}}u(<(<T***	+
  	K 	K 	KMIJJJJJ	K 	5&&e&444s   >A A0/A0c                     t          |t                    st          |          t          j        dk    r | j        D ]}|                     ||           |                                  d S )Nr   )rJ  r&  rt  sysplatform_windows_cert_storesr  set_default_verify_paths)rF  r  r  s      r0   load_default_certszSSLContext.load_default_certsO  st    ';// 	%G$$$<7""!6 C C	..y'BBBB%%'''''r2   minimum_versionc                 D    t          t                      j                  S r   )rJ   r)  r  rF  r.  s    r0   r  zSSLContext.minimum_versionX      egg5666r2   c                     |t           j        k    r| xj        t          j         z  c_        t          t          t                    j                            | |           d S r   )	rJ   rR   optionsr4   OP_NO_SSLv3r)  r>  r  __set__rF  rF   r.  s     r0   r  zSSLContext.minimum_version\  sP    
(((!4 44*j))9AA$NNNNNr2   c                 D    t          t                      j                  S r   )rJ   r)  maximum_versionr  s    r0   r  zSSLContext.maximum_versionb  r  r2   c                 n    t          t          t                    j                            | |           d S r   )r)  r>  r  r  r  s     r0   r  zSSLContext.maximum_versionf  s,    *j))9AA$NNNNNr2   c                 D    t          t                      j                  S r   )r4   r)  r  r  s    r0   r  zSSLContext.optionsj  s    uww'''r2   c                 n    t          t          t                    j                            | |           d S r   )r)  r>  r  r  r  s     r0   r  zSSLContext.optionsn  s,    j*%%-55dEBBBBBr2   r   c                 J    | j         t          j        z  }|t          j        k    S r   _host_flagsrN   r   )rF  ncss     r0   hostname_checks_common_namez&SSLContext.hostname_checks_common_names  s     "T%FFC$;;;r2   c                 x    |r| xj         t          j         z  c_         d S | xj         t          j        z  c_         d S r   r  )rF  rF   s     r0   r  z&SSLContext.hostname_checks_common_namex  sH     F  T%F$FF      D$EE    r2   c                     dS NTrD   rF  s    r0   r  z&SSLContext.hostname_checks_common_name  s    4r2   c                 B    	 t                      j        }||j        S d S r   )r)  _msg_callbackuser_function)rF  innerr.  s     r0   r  zSSLContext._msg_callback  s*    	> %&&4r2   c                 :   5t          t          t                    j                            | d            d S t	          d          st           d          fd}|_        t          t          t                    j                            | |           d S )N__call__z is not callable.c                 P   	 t          |          }n# t          $ r Y nw xY w	 t          |          }n# t          $ r Y nw xY w|t          j        k    rt          }n|t          j        k    rt
          }nt          }	  ||          }n# t          $ r Y nw xY w | |||||          S r   )rJ   r   r^   ri   rf   rl   r   )conn	directionversioncontent_typemsg_typedatamsg_enumcallbacks          r0   r  z'SSLContext._msg_callback.<locals>.inner  s    $W--   .|<<    555*!666(*#8H--    8D)W((D: : :s-    
  4 
A A<B 
BB)r)  r>  r  r  hasattrrt  r  )rF  r  r  r.  s    ` r0   r  zSSLContext._msg_callback  s    *j))7??dKKKFx,, 	<x:::;;;	: 	: 	: 	: 	:2 'j*%%3;;D%HHHHHr2   c                 D    t          t                      j                  S r   )r(   r)  rC  r  s    r0   rC  zSSLContext.protocol  s    %''*+++r2   c                 D    t          t                      j                  S r   )r=   r)  verify_flagsr  s    r0   r  zSSLContext.verify_flags  s    577/000r2   c                 n    t          t          t                    j                            | |           d S r   )r)  r>  r  r  r  s     r0   r  zSSLContext.verify_flags  s,    j*%%2::4GGGGGr2   c                 n    t                      j        }	 t          |          S # t          $ r |cY S w xY wr   )r)  verify_moder@   r   r  s     r0   r  zSSLContext.verify_mode  sF    #	e$$$ 	 	 	LLL	s   % 44c                 n    t          t          t                    j                            | |           d S r   )r)  r>  r  r  r  s     r0   r  zSSLContext.verify_mode  s,    j*%%199$FFFFFr2   r   )FTTNN)FNN)rK   rL   rM   r  rW  r[  r*  rN  rY  r^  rj  ru  ry  r  r:  r;  r  r  r   propertyr  setterr  r  rN   r  r  rC  r  r  r7  r8  s   @r0   r>  r>    s       >)OO	 	 	 	, , , -2,0)-26
 
 
 
  8=/3
 
 
 
( ( ( ( ( (	) 	) 	)   *1)< ( ( ( ( w{-.. O		7 	7 	7 	7 
	7 
		O 	O 	O 	O 
 		O
 
	7 	7 	7 	7 
	7 
		O 	O 	O 	O 
 		O ( ( ( ( X( ^C C C C ^C wt344 		< 	< 
	< 
%	+	F 	F 
,	+	F 	F 
	 	 
	 $ $ $ $ X$L #I #I #I #I #IJ , , , , X, 1 1 1 1 X1 H H H H H     X G G G G G G G G Gr2   r>  )r#  r$  r|  c                @   	 t          | t                    st          |           | t          j        k    r(t          t                    }t          |_        d|_	        n4| t          j
        k    rt          t                    }nt          |           |s|s|r|                    |||           n%|j        t          k    r|                    |            t!          |d          r9t"          j                            d          }|rt(          j        j        s||_        |S )NTkeylog_filenameSSLKEYLOGFILE)rJ  r&  rt  r:  r;  r>  PROTOCOL_TLS_CLIENTCERT_REQUIREDr  check_hostnamer<  PROTOCOL_TLS_SERVERr   r~  	CERT_NONEr  r  r  r  r  r  flagsignore_environmentr  )r  r#  r$  r|  rU  
keylogfiles         r0   create_default_contextr    s"    g{++ !   
 '%%%011+!%	G'	'	'011!!! , ,6 ,%%fff====				)	) 	""7+++w)** 1Z^^O44
 	1ci: 	1&0G#Nr2   F)	cert_reqsr  r  certfilekeyfiler#  r$  r|  c                   	 t          |t                    st          |          |t          j        k    r
| t
          } n)|t          j        k    r
| t          } nt          |          t          |           }	||	_
        |||	_        |rd|	_
        |r|st          d          |s|r|	                    ||           |s|s|r|	                    |||           n%|	j        t          k    r|	                    |           t!          |	d          r9t"          j                            d          }
|
rt(          j        j        s|
|	_        |	S )NTcertfile must be specifiedr  r  )rJ  r&  rt  r:  r;  r  r<  r  r   r>  r  r  load_cert_chainr~  r  r  r  r  r  r  r  r  r  r  )rC  r  r  r  r  r  r#  r$  r|  rU  r  s              r0   _create_unverified_contextr    s    g{++ !   
 '%%%*H	G'	'	'*H!!!""G+G' &!% 7x 75666 37 3'222  , ,6 ,%%fff====				)	) 	""7+++w)** 1Z^^O44
 	1ci: 	1&0G#Nr2   c                   :   e Zd Z	 d Ze	 	 dd            Zed             Zej        d             Zed             Z	e	j        d             Z	ed	             Z
ed
             Zed             ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd ZdS ) 	SSLObjectc                 :    t          | j        j         d          )NzU does not have a public constructor. Instances are returned by SSLContext.wrap_bio().rt  r.  rK   rF  rD  rE  s      r0   __init__zSSLObject.__init__\  s.    ~& M M M
 
 	
r2   FNc                 t    |                      |           }|                    ||||||          }||_        |S )N)rQ  rT  ownerrV  )r*  	_wrap_bio_sslobj)	r,  r\  r]  rQ  rT  rV  rU  rF  rm  s	            r0   rX  zSSLObject._createb  sL     {{3""hK+ # 
 

 r2   c                     	 | j         j        S r   r  rU  r  s    r0   rU  zSSLObject.contextn  s    6|##r2   c                     || j         _        d S r   r  rF  ctxs     r0   rU  zSSLObject.contexts  s    "r2   c                     	 | j         j        S r   r  rV  r  s    r0   rV  zSSLObject.sessionw  s    /|##r2   c                     || j         _        d S r   r  rF  rV  s     r0   rV  zSSLObject.session|  s    &r2   c                     	 | j         j        S r   r  session_reusedr  s    r0   r  zSSLObject.session_reused  s    <|**r2   c                     	 | j         j        S r   )r  rQ  r  s    r0   rQ  zSSLObject.server_side  s    3|''r2   c                     	 | j         j        S r   )r  rT  r  s    r0   rT  zSSLObject.server_hostname  s    	#|++r2      c                 x    	 || j                             ||          }n| j                             |          }|S r   )r  read)rF  r  buffervs       r0   r  zSSLObject.read  sB    	
 !!#v..AA!!#&&Ar2   c                 8    	 | j                             |          S r   )r  writerF  r  s     r0   r  zSSLObject.write  s    	
 |!!$'''r2   c                 8    	 | j                             |          S r   )r  getpeercertrF  binary_forms     r0   r  zSSLObject.getpeercert  s    	 |''444r2   c                 @    	 t          j        dt          d           d S Nr`  r   ra  )r  r  r  r  s    r0   selected_npn_protocolzSSLObject.selected_npn_protocol  s5    	 	5	
 	
 	
 	
 	
 	
r2   c                 6    	 | j                                         S r   )r  selected_alpn_protocolr  s    r0   r  z SSLObject.selected_alpn_protocol  s    	 |22444r2   c                 6    	 | j                                         S r   )r  cipherr  s    r0   r  zSSLObject.cipher  s    	(|""$$$r2   c                 6    	 | j                                         S r   )r  shared_ciphersr  s    r0   r  zSSLObject.shared_ciphers  s    	 |**,,,r2   c                 6    	 | j                                         S r   )r  compressionr  s    r0   r  zSSLObject.compression  s    	P|'')))r2   c                 6    	 | j                                         S r   )r  pendingr  s    r0   r  zSSLObject.pending  s    F|##%%%r2   c                 :    	 | j                                          d S r   )r  do_handshaker  s    r0   r   zSSLObject.do_handshake  s    *!!#####r2   c                 6    	 | j                                         S r   )r  shutdownr  s    r0   unwrapzSSLObject.unwrap  s    /|$$&&&r2   r   c                 8    	 | j                             |          S r   )r  get_channel_bindingrF  cb_types     r0   r  zSSLObject.get_channel_binding  s     	M |//888r2   c                 6    	 | j                                         S r   r  r  r  s    r0   r  zSSLObject.version  s    	!|##%%%r2   c                 4    | j                                         S r   )r  verify_client_post_handshaker  s    r0   r  z&SSLObject.verify_client_post_handshake  s    |88:::r2   )FNNNr  NFr   )rK   rL   rM   r  r6  rX  r  rU  r  rV  r  rQ  rT  r  r  r  r  r  r  r  r  r  r   r  r  r  r  rD   r2   r0   r  r  M  s       
 
 
 5:=A	 	 	 [	 $ $ X$ ^# # ^# $ $ X$ ^' ' ^' + + X+ ( ( X( , , X,

 
 
 
( ( (5 5 5 5
 
 
5 5 5% % %
- - -* * *
& & &$ $ $' ' '9 9 9 9& & &
; ; ; ; ;r2   r  c                 P    	 t          t          | j                  j        | _        | S r   )getattrr  rK   __doc__)funcs    r0   _sslcopydocr    s     49dm44<DLKr2   c                       e Zd Z	 d Ze	 	 	 d0 fd	            Zeed                         Zej	        d             Zeed                         Z
e
j	        d	             Z
eed
                         Zd Zd1dZd Zd2dZd Zed3d            Zed             Zed             Zed             Zed             Zed             Zd4 fd	Zd1 fd	Zd Zd4 fd	Zd5 fd	Zd6 fd	Zd7 fd	Zd6 fd	Zd7 fd 	Zd! Z d" Z!ed#             Z" fd$Z#ed%             Z$ed&             Z% fd'Z&ed3d(            Z' fd)Z(d* Z)d+ Z* fd,Z+ed8d.            Z,ed/             Z- xZ.S )9	SSLSocketc                 :    t          | j        j         d          )NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().r  r  s      r0   r  zSSLSocket.__init__  s+    ~& ) ) )
 
 	
r2   FTNc                    |                     t          t                    t          k    rt	          d          |r"|rt          d          |t          d          |j        r|st          d          |                                }t          |j	        |j
        |j        |                                          }	 | j        | fi |	}
 t          t          |
          j        di |	 |                                 	 ||
_        ||
_        d|
_        d |
_        ||
_        |                    |          |
_        ||
_        ||
_        	 |
                                 d}n# t8          $ r}|j        t:          j        k    r d}|
                                }|
                     d           	 |
!                    d          }n9# t8          $ r,}|j        t:          j        t:          j"        fvr d	}Y d }~nd }~ww xY w|
                     |           |r/d
}tG          |j        |          }||_$        d |_%        	 |# d }w xY wY d }~nd }~ww xY w|
&                    |           ||
_'        |rm|
j        (                    |
||
j        |
|
j                  |
_        |r=|
                                }|dk    rt          d          |
)                                 n,#  	 |
*                                 n# t8          $ r Y nw xY w xY w|
S )Nz!only stream sockets are supportedz4server_hostname can only be specified in client modez,session can only be specified in client modez'check_hostname requires server_hostname)familytypeprotofilenoFTr   r2   z5Closed before TLS handshake with data in recv buffer.r  rV          zHdo_handshake_on_connect should not be specified for non-blocking socketsrD   )+
getsockoptr   r   r   NotImplementedErrorr   r  
gettimeoutdictr  r  r  r  r*  r)  r  r  detach_context_session_closedr  rQ  rN  rT  rR  rS  getpeernamer   errnoENOTCONNgetblockingsetblockingrecvEINVALr   reasonlibrary
settimeout
_connected_wrap_socketr   close)r,  rP  rQ  rR  rS  rT  rU  rV  sock_timeoutrE  rF  	connectedeblockingnotconn_pre_handshake_datar-   notconn_pre_handshake_data_errortimeoutr.  s                     r0   rX  zSSLSocket._create  s    ??:w//;>>%&IJJJ 	0 3  "2 3 3 3"  "/ 0 0 0! 	H/ 	HFGGG((;TYdj;;==
 
 
 s{3))&))'i'11&111C	#DM#DM DLDL*D#*#;#;O#L#LD +BD((<D%#!  """D !		C  @ @ @7en,,!	++--  '''
5
 261.. 5 5 5wu~u|&DDD14......	5
   ***- @ UF7?7P7P4>D4;?C4<@>> <@8????@ @ @ @ @%@F OOL)))'DO (#}99+t';  :     + ("oo//G#~~()sttt%%'''	

   s   AK E$ !K $
I.AI
0GI

G<"G72I
7G<<?I
<H>>II
K 
IBK L!K65L6
L LLLc                     | j         S r   )r#  r  s    r0   rU  zSSLSocket.contextY  s     }r2   c                 ,    || _         || j        _        d S r   )r#  r  rU  r  s     r0   rU  zSSLSocket.context^  s    "r2   c                 ,    | j         | j         j        S d S r   r  r  s    r0   rV  zSSLSocket.sessionc  s     <#<'' $#r2   c                 >    || _         | j        || j        _        d S d S r   )r$  r  rV  r  s     r0   rV  zSSLSocket.sessioni  s)    <##*DL    $#r2   c                 ,    | j         | j         j        S d S r   r  r  s    r0   r  zSSLSocket.session_reusedo  s     <#<.. $#r2   c                 :    t          d| j        j        z            )NzCan't dup() %s instances)r  r.  rK   r  s    r0   dupzSSLSocket.dupu  s$    !"<"&."9#: ; ; 	;r2   c                     d S r   rD   )rF  msgs     r0   _checkClosedzSSLSocket._checkClosedy  s    r2   c                 @    | j         s|                                  d S d S r   )r0  r&  r  s    r0   _check_connectedzSSLSocket._check_connected}  s0     	
 	 	r2   r  c                 D   	 |                                   | j        t          d          	 || j                            ||          S | j                            |          S # t          $ r1}|j        d         t          k    r| j        r|Y d }~dS Y d }~dS  d }~ww xY w)Nz'Read on closed or unwrapped SSL socket.r   r2   )rC  r  r   r  r   rD  SSL_ERROR_EOFrS  )rF  r  r  xs       r0   r  zSSLSocket.read  s    	- 	<FGGG	!|((f555|((--- 	 	 	vayM))d.G)%1111133333	s#   A$ 
A$ $
B.BBBc                     	 |                                   | j        t          d          | j                            |          S )Nz(Write on closed or unwrapped SSL socket.)rC  r  r   r  r  s     r0   r  zSSLSocket.write  sH    	9 	<GHHH|!!$'''r2   c                     |                                   |                                  | j                            |          S r   )rC  rE  r  r  r  s     r0   r  zSSLSocket.getpeercert  s<    |''444r2   c                 f    |                                   t          j        dt          d           d S r  )rC  r  r  r  r  s    r0   r  zSSLSocket.selected_npn_protocol  s=    5	
 	
 	
 	

 tr2   c                     |                                   | j        t          j        sd S | j                                        S r   )rC  r  rN   r   r  r  s    r0   r  z SSLSocket.selected_alpn_protocol  s<    <t}4<66888r2   c                 n    |                                   | j        d S | j                                        S r   )rC  r  r  r  s    r0   r  zSSLSocket.cipher  s5    <4<&&(((r2   c                 n    |                                   | j        d S | j                                        S r   )rC  r  r  r  s    r0   r  zSSLSocket.shared_ciphers  s5    <4<..000r2   c                 n    |                                   | j        d S | j                                        S r   )rC  r  r  r  s    r0   r  zSSLSocket.compression  s5    <4<++---r2   r   c                     |                                   | j        7|dk    rt          d| j        z            | j                            |          S t                                          ||          S )Nr   z3non-zero flags not allowed in calls to send() on %s)rC  r  r   r.  r  r)  send)rF  r  r  r.  s      r0   rQ  zSSLSocket.send  su    <#zz IN#$ $ $ <%%d+++77<<e,,,r2   c                     |                                   | j        t          d| j        z            |"t	                                          ||          S t	                                          |||          S )Nz%sendto not allowed on instances of %s)rC  r  r   r.  r)  sendto)rF  r  flags_or_addrr   r.  s       r0   rS  zSSLSocket.sendto  ss    <#D!^, - - -\77>>$66677>>$t<<<r2   c                 0    t          d| j        z            )Nz&sendmsg not allowed on instances of %sr  r.  r  s      r0   sendmsgzSSLSocket.sendmsg  s#     ""J"&.#1 2 2 	2r2   c                    |                                   | j        |dk    rt          d| j        z            d}t	          |          5 }|                    d          5 }t          |          }||k     r(|                     ||d                    }||z  }||k     (d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S t                      	                    ||          S )Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
rC  r  r   r.  
memoryviewcastr  rQ  r)  sendall)	rF  r  r  r   view	byte_viewamountr  r.  s	           r0   r\  zSSLSocket.sendall  sx   <#zz LN#$ $ $ ED!! T499S>> YYfnn		)EFF"344AQJE fnn                                 77??4///s6   C!>B+C+B/	/C2B/	3CC
Cc                     	 | j         |                     |||          S t                                          |||          S r   )r  _sendfile_use_sendr)  sendfile)rF  fileoffsetr   r.  s       r0   rb  zSSLSocket.sendfile  sH    	 <#**4??? 77##D&%888r2   c                     |                                   | j        2|dk    rt          d| j        z            |                     |          S t                                          ||          S )Nr   z3non-zero flags not allowed in calls to recv() on %s)rC  r  r   r.  r  r)  r+  rF  buflenr  r.  s      r0   r+  zSSLSocket.recv  sq    <#zz IN#$ $ $ 99V$$$77<<...r2   c                 X   |                                   |7|3t          |          5 }|j        }d d d            n# 1 swxY w Y   |sd}nd}| j        3|dk    rt	          d| j        z            |                     ||          S t                                          |||          S )Nr  r   z8non-zero flags not allowed in calls to recv_into() on %s)	rC  rZ  nbytesr  r   r.  r  r)  	recv_into)rF  r  ri  r  r]  r.  s        r0   rj  zSSLSocket.recv_into  s    >!'' )4![F) ) ) ) ) ) ) ) ) ) ) ) ) ) ) "!F<#zz L.!" " " 99VV,,,77$$VVU;;;s   =AAc                     |                                   | j        t          d| j        z            t	                                          ||          S )Nz'recvfrom not allowed on instances of %s)rC  r  r   r.  r)  recvfromrf  s      r0   rl  zSSLSocket.recvfrom&  sX    <#F!^, - - - 77##FE222r2   c                     |                                   | j        t          d| j        z            t	                                          |||          S )Nz,recvfrom_into not allowed on instances of %s)rC  r  r   r.  r)  recvfrom_into)rF  r  ri  r  r.  s       r0   rn  zSSLSocket.recvfrom_into.  sZ    <#K!^, - - - 77((???r2   c                 0    t          d| j        z            )Nz&recvmsg not allowed on instances of %srV  r  s      r0   recvmsgzSSLSocket.recvmsg6  s!    !"J"&.#1 2 2 	2r2   c                 0    t          d| j        z            )Nz+recvmsg_into not allowed on instances of %srV  r  s      r0   recvmsg_intozSSLSocket.recvmsg_into:  s#    ! #')-#8 9 9 	9r2   c                 n    |                                   | j        | j                                        S dS Nr   )rC  r  r  r  s    r0   r  zSSLSocket.pending>  s5    <#<'')))1r2   c                     |                                   d | _        t                                          |           d S r   )rC  r  r)  r  )rF  howr.  s     r0   r  zSSLSocket.shutdownF  s:    r2   c                     | j         r"| j                                         }d | _         |S t          dt          |           z             NzNo SSL wrapper around )r  r  r   rK  )rF  ss     r0   r  zSSLSocket.unwrapK  sF    < 	C%%''ADLH5D		ABBBr2   c                     | j         r| j                                         S t          dt          |           z             rx  )r  r  r   rK  r  s    r0   r  z&SSLSocket.verify_client_post_handshakeT  s;    < 	C<<<>>>5D		ABBBr2   c                 V    d | _         t                                                       d S r   )r  r)  _real_closer  s    r0   r|  zSSLSocket._real_close[  s&    r2   c                 "   |                                   |                                 }	 |dk    r|r|                     d            | j                                         |                     |           d S # |                     |           w xY w)Nr  )rE  r   r/  r  r   )rF  blockr9  s      r0   r   zSSLSocket.do_handshake_  s    //##	%#~~%~%%%L%%'''OOG$$$$$DOOG$$$$s   6A7 7Bc                    | j         rt          d          | j        s| j        t          d          | j                            | d| j        | | j                  | _        	 |r"t                      	                    |          }n#d }t                      
                    |           |s"d| _        | j        r|                                  |S # t          t          f$ r	 d | _         w xY w)Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!Fr  T)rQ  r   r0  r  rU  r1  rT  r$  r)  
connect_exconnectrR  r   r   )rF  r   r  rcr.  s       r0   _real_connectzSSLSocket._real_connectj  s    	B@AAA ? 	Pdl6NOOO|00%- 1 
 
	 &WW''--%%% ("&/ (%%'''I$ 	 	 	DL	s   $A,C C+c                 4    	 |                      |d           d S )NFr  rF  r   s     r0   r  zSSLSocket.connect  s#    	4'''''r2   c                 0    	 |                      |d          S r  r  r  s     r0   r  zSSLSocket.connect_ex  s    	!!$---r2   c                     	 t                                                      \  }}| j                            || j        | j        d          }||fS )NT)rR  rS  rQ  )r)  acceptrU  rY  rR  rS  )rF  newsockr   r.  s      r0   r  zSSLSocket.accept  sZ    	> ((,**7,0,H)-)B $ + & & }r2   r   c                     | j         | j                             |          S |t          vr"t          d                    |                    d S )Nz({0} channel binding type not implemented)r  r  CHANNEL_BINDING_TYPESr   r   r  s     r0   r  zSSLSocket.get_channel_binding  sV    <#<33G<<<333 >EEgNN   4r2   c                 F    | j         | j                                         S d S r   r	  r  s    r0   r  zSSLSocket.version  s#    <#<'')))4r2   )FTTNNNr   r  r  )r   )r   N)r  r   rt  r  )/rK   rL   rM   r  r6  rX  r  r  rU  r  rV  r  r@  rC  rE  r  r  r  r  r  r  r  r  rQ  rS  rW  r\  rb  r+  rj  rl  rn  rp  rr  r  r  r  r  r|  r   r  r  r  r  r  r  r7  r8  s   @r0   r  r    si       ;
 
 
 FJ;?&*\ \ \ \ \ [\|   [ X ^# # ^# ( ( [ X( ^+ + ^+
 / / [ X/; ; ;        *( ( ( 5 5 5 [5
   [ 9 9 [9 ) ) [) 1 1 [1 . . [.	- 	- 	- 	- 	- 	-= = = = = =2 2 20 0 0 0 0 0 9 9 9 9 9 9	/ 	/ 	/ 	/ 	/ 	/< < < < < <&3 3 3 3 3 3@ @ @ @ @ @2 2 29 9 9   [    
 C C [C C C [C     % % % [%    4( ( (
. . .

 
 
 
 
    [   [    r2   r  Tc
                 p   t          j        dt          d           |r|st          d          |r|st          d          t	          |          }
||
_        |r|
                    |           |r|
                    ||           |	r|
                    |	           |
	                    | |||          S )Nz=ssl.wrap_socket() is deprecated, use SSLContext.wrap_socket()r   r  z5certfile must be specified for server-side operationsr  )rP  rQ  rR  rS  )
r  r  r  r   r>  r  r~  r  set_ciphersrY  )rP  r  r  rQ  r  ssl_versionca_certsrR  rS  ciphersrU  s              r0   rY  rY    s     MG#   
  '8 ' & ' ' 	' 7x 75666%%G#G 0%%h/// 3'222 %G$$${ 71    r2   c                 6   	 ddl m} ddlm} d}d}	 |                    | d d                                                   dz   } || dd          |          } ||d         |f|dd	         z             S # t          $ r t          d
| d|d          w xY w)Nr   )strptime)timegm)JanFebMarAprMayJunJulAugSepOctNovDecz %d %H:%M:%S %Y GMTr   r   r   r   z
time data z does not match format "%b")timer  calendarr  indextitler   )	cert_timer  r  monthstime_formatmonth_numbertts          r0   cert_time_to_secondsr    s     F (K
7||IbqbM$7$7$9$9::Q> Xim[11 vr!ul+b1g5666  F F Fj-6YYE F F 	FFs   2A7 7!Bz-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----c                    	 t          t          j        |           dd          t          g}|fdt	          dt                    d          D             z  }|                    t          dz              d                    |          S )NASCIIstrictc                 *    g | ]}||d z            S )@   rD   )rE   ifs     r0   
<listcomp>z(DER_cert_to_PEM_cert.<locals>.<listcomp>  s%    
3
3
31QqtV9
3
3
3r2   r   r  
)	rK  base64standard_b64encode
PEM_HEADERranger  r  
PEM_FOOTERr  )der_cert_bytesssr  s     @r0   DER_cert_to_PEM_certr    s    & 	F%n55wIIA
B
3
3
3
3eAs1vvr22
3
3
33BIIj4   99R==r2   c                    	 |                      t                    st          dt          z            |                                                     t
                    st          dt
          z            |                                 t          t                    t          t
                              }t          j        |	                    dd                    S )Nz(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %sr  r  )
r-   r  r   stripendswithr  r  r  decodebytesrL  )pem_cert_stringds     r0   PEM_cert_to_DER_certr    s    4 %%j11 'C%& ' ' 	'  ""++J77 'A%& ' ' 	'JZ0@ @AAahhw99:::r2   c                 L   	 | \  }}|t           }nt          }t          |||          }t          | |          5 }|                    ||          5 }	|	                    d          }
d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          |
          S )N)r  r#  )r9  )rT  T)r  r  _create_stdlib_contextr   rY  r  r  )r   r  r  r9  hostportr  rU  rP  sslsockdercerts              r0   get_server_certificater  
  s5    JD$!			$[/8,46 6 6G 
4	1	1	1 0T  t << 	0))$//G	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	00 0 0 0 0 0 0 0 0 0 0 0 0 0 0  (((s5   BA5)B5A9	9B<A9	=BBBc                 8    t                               | d          S )Nz	<unknown>)_PROTOCOL_NAMESr  )protocol_codes    r0   get_protocol_namer     s    }k:::r2   r   )or  r  collectionsr   enumr   _Enumr   _IntEnumr   _IntFlagr   rN   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r+  r   r0  r   r   r   r   r   ImportErrorr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   	_convert_rK   r(   rB  r+   __members__itemsr  r  _SSLv2_IF_EXISTSrJ   r^   rl   r   r  r   r   r   r   r   r   r   r   r   r  r'  r  r   socket_errorr  r  HAS_NEVER_CHECK_COMMON_NAME_RESTRICTED_SERVER_CIPHERSr   r   r   r  r  r  r  r&  r:  r>  r;  r  r  r  _create_default_https_contextr  r  r  r  rW  r[  rY  r  r  r  r  r  r  r  r  rD   r2   r0   <module>r     s  Xt 


 				 " " " " " " H H H H H H H H H H        N N N N N N N N N N 3 3 3 3 3 3 3 3 3 3                  : 9 9 9 9 9 9 9 E E E E E E E E E E E E	 	 	 	D	
                        8 7 7 7 7 7 7 7  (KK   
  x''   
  66   
  h..   
  8++   
  ())   
 0:/F F*,QQ*2H2N2N2P2PQQQ7:'7>>  h5 5 5 5 5 5 5 5 h        h&" &" &" &" &" &" &" &"R h               : <711111111 9 9 9 9 9 9 9 9 9 9 ? ? ? ? ? ? ? ? ? ?        % %gd,JKK  . + .> .> .>b D  D  DF	 	 	;0 ;0 ;0|  Z 4  & & &@ @ @ @ @**],HII @ @ @*& & & & &k5 & & &BG BG BG BG BG BG BG BGJ $+#6 $$"&t$ $ $ $ $L49*/9L$($"&tD4 4 4 4 4n !7  4 X; X; X; X; X; X; X; X;v  | | | | | | | |@ '
 &
  #T!Y(4(,%)   @7 7 7< +
(
  ; ; ; .A$(2I) ) ) ),; ; ; ; ;s   A& &A.-A.