
    z%iA              
       n   	 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  	 d d
lm!Z! 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j^                  de0d e        e
j^                  de0d e        ej^                  de0d e        ej^                  de0d e        e
j^                  de0d e        ej^                  de0d e       e1jd                  xZ3e1_3        e1jh                  jk                         D  ci c]  \  } }|| 
 c}} Z6 e7e1dd      Z8 ee       G d d             Z9 ee       G d d             Z: ee       G d d              Z; ee       G d! d"             Z<e jz                  d#k(  rd d$lm>Z>m?Z? d d%l@m@Z@mAZAmBZB d d&l@mCZCmDZDmEZE d dl@ZFd dlGZGd dlHZHd dlIZIeJZKd'gZL eMed(      ZNe-ZOeZPd) ZQd* ZRd+ ZS ed,d-      ZTd. ZU G d/ d0 ed0d1            ZV G d2 d3eVe      ZW G d4 d5e      ZXeWj                  fdddd6d7ZZdGe[d8eWj                  dddddd9d:Z\eZZ]e\Z^ G d; d<      Z_d= Z` G d> d?e@      ZaeaeX_b        e_eX_c        d@ ZddAZedBZfdC ZgdD ZheideEfdEZjdF Zky# e"$ r Y Jw xY wc c}} w )H    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_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                 2    | j                  d      xr | dk7  S )N	PROTOCOL_PROTOCOL_SSLv23
startswithnames    7/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/ssl.py<lambda>r0   }   s    -K$:K2K     )sourceOptionsc                 $    | j                  d      S )NOP_r+   r-   s    r/   r0   r0      s    ' r1   AlertDescriptionc                 $    | j                  d      S )NALERT_DESCRIPTION_r+   r-   s    r/   r0   r0      s    !56 r1   SSLErrorNumberc                 $    | j                  d      S )N
SSL_ERROR_r+   r-   s    r/   r0   r0      s    . r1   VerifyFlagsc                 $    | j                  d      S )NVERIFY_r+   r-   s    r/   r0   r0      s    + r1   
VerifyModec                 $    | j                  d      S )NCERT_r+   r-   s    r/   r0   r0      s    ) r1   PROTOCOL_SSLv2c                       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y)
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_SUPPORTED r1   r/   rD   rD      sQ    44EE  G  G  G44r1   rD   c                   &    e Zd Z	 dZdZdZdZdZdZy)_TLSContentType                 N)	rE   rF   rG   CHANGE_CIPHER_SPECALERT	HANDSHAKEAPPLICATION_DATAHEADERINNER_CONTENT_TYPErW   r1   r/   rY   rY      s*     EIFr1   rY   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$y#)$_TLSAlertTyper   
   rZ   r[   r\      (   )   *   +   ,   -   .   /   0   1   2   3   <   F   G   P   V   Z   d   m   n   o   p   q   r   s   t   x   N)%rE   rF   rG   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_PROTOCOLrW   r1   r/   rg   rg      s     LNONO JMLMNM"&)#!$!r1   rg   c                   f    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y)_TLSMessageTyper                                          rZ   r[   r\   r]      C      r_   N)rE   rF   rG   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_HASHr`   rW   r1   r/   r   r      s     MLLKKHOJJLr1   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y| j                  d      }|s!| j                         |j                         k(  S |dkD  rt        dj                  |             | j	                  d      \  }}}d|v rt        dj                  |             |st        dj                  |             |dk7  rt        dj                  |             |j	                  d      \  }}}|r|sy|j                         |j                         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           r/   _dnsname_matchr     s    IxxzX^^---1}?FFrJL 	L &(\\#%6"Kl
lF2J  	  F2J  	  cF2J  	  2:1C1CC1H.s.C#5#;#;#===r1   c                    	 	 t        j                  |       }t        j                  |      | k(  r|S t        dj	                  |             # t
        $ r Y nw xY w	 t        j                  t         j                  |       S # t
        $ r t        dj	                  |             t        $ r Y nw xY wt        dj	                  |             )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     r/   _inet_patonr   I  s      (
 T"f,K 9@@H     !1!16:: 4 $$*F6N4 	4  3::6B
CCs#   A 	AA#B   +B.-B.c                 @    	 t        | j                               }||k(  S N)r   rstrip)cert_ipaddresshost_ipips      r/   _ipaddress_matchr   l  s&     
^**,	-B=r1   DefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  b   	 t        j                         } t        j                  j	                  | d   | d         }t        j                  j	                  | d   | d         }t        t        j                  j                  |      r|nd t        j                  j                  |      r|nd g|  S )Nr   r   r   r   )	rH   get_default_verify_pathsosenvirongetr   pathisfileisdir)partscafilecapaths      r/   r   r   |  s    ))+E ZZ^^E!HeAh/FZZ^^E!HeAh/Fv(>fD(*f(=f4&$& &r1   c                   L     e Zd Z	 dZ fdZe fd       Ze fd       Z xZS )_ASN1ObjectrW   c                 :    t        |   | gt        |d       S )NFr-   super__new___txt2obj)clsoid	__class__s     r/   r  z_ASN1Object.__new__  s    ws?Xc%>??r1   c                 8    	 t        |   | gt        |       S r   )r  r  _nid2obj)r  nidr  s     r/   fromnidz_ASN1Object.fromnid  s     	ws3Xc]33r1   c                 <    	 t        |   | gt        |d       S )NTr-   r  )r  r.   r  s     r/   fromnamez_ASN1Object.fromname  s#    	ws?Xd%>??r1   )	rE   rF   rG   	__slots__r  classmethodr  r  __classcell__r  s   @r/   r  r    s=    I@ 4 4
 @ @r1   r  znid shortname longname oidc                       e Zd Z	 dZdZy)Purposez1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)rE   rF   rG   SERVER_AUTHCLIENT_AUTHrW   r1   r/   r  r    s    %K%Kr1   r  c                   h    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   )category
stacklevel)warningswarnDeprecationWarningPROTOCOL_TLSr   r  )r  protocolargskwargsselfs        r/   r  zSSLContext.__new__  s;    MMK+
 $H""31r1   c                     |y t        |t              r |j                  d      j                  d      S |j                  d      S )Nidnaascii)
isinstancestrencodedecode)r0  r   s     r/   _encode_hostnamezSSLContext._encode_hostname  s>    #&??6*11'::??7++r1   c           	      F    | j                   j                  |||||| |      S )N)sockserver_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostnamecontextsession)sslsocket_class_create)r0  r:  r;  r<  r=  r>  r@  s          r/   wrap_socketzSSLContext.wrap_socket  s7     ##++#$;!5+ , 
 	
r1   c                 b    | j                   j                  |||| j                  |      ||       S )N)r;  r>  r@  r?  )sslobject_classrB  r8  )r0  incomingoutgoingr;  r>  r@  s         r/   wrap_biozSSLContext.wrap_bio  s<     ##++hK 11/BT , 
 	
r1   c                 <   t        j                  dt        d       t               }|D ]`  }t	        |d      }t        |      dk(  st        |      dkD  rt        d      |j                  t        |             |j                  |       b | j                  |       y )N'ssl NPN is deprecated, use ALPN insteadr   r(  r3  r      z(NPN protocols must be 1 to 255 in length)
r)  r*  r+  	bytearraybyteslenr   appendextend_set_npn_protocols)r0  npn_protocolsprotosr-  bs        r/   set_npn_protocolszSSLContext.set_npn_protocols  s    5	

 % 	Hh(A1v{c!fslIJJMM#a&!MM!	 	'r1   c                 b     d  _         y t              st        d       fd}| _         y )Nznot a callable objectc                 :    j                  |      } | ||      S r   )r8  )sslobj
servernamesslctxr0  server_name_callbacks      r/   shim_cbz3SSLContext.set_servername_callback.<locals>.shim_cb  s"    !22:>
+FJGGr1   )sni_callbackcallable	TypeError)r0  r\  r]  s   `` r/   set_servername_callbackz"SSLContext.set_servername_callback  s6    ' $D01 788H !(Dr1   c                    t               }|D ]`  }t        |d      }t        |      dk(  st        |      dkD  rt        d      |j	                  t        |             |j                  |       b | j                  |       y )Nr3  r   rL  z)ALPN protocols must be 1 to 255 in length)rM  rN  rO  r   rP  rQ  _set_alpn_protocols)r0  alpn_protocolsrT  r-  rU  s        r/   set_alpn_protocolszSSLContext.set_alpn_protocols  sq    & 	Hh(A1v{c!fslJKKMM#a&!MM!	 	  (r1   c                 
   t               }	 t        |      D ]0  \  }}}|dk(  s|du s|j                  |v s |j                  |       2 	 |r| j                  |       |S # t        $ r t        j                  d       Y 6w xY w)Nx509_asnTz-unable to enumerate Windows certificate store)cadata)rM  r   r  rQ  PermissionErrorr)  r*  load_verify_locations)r0  	storenamepurposecertscertencodingtrusts          r/   _load_windows_store_certsz$SSLContext._load_windows_store_certs  s    	K):9)E +%hz)}u(<T*	+ &&e&4	  	KMMIJ	Ks   A! A! A! !BBc                     t        |t              st        |      t        j                  dk(  r#| j
                  D ]  }| j                  ||        | j                          y )Nr   )r4  r  r`  sysplatform_windows_cert_storesrq  set_default_verify_paths)r0  rl  rk  s      r/   load_default_certszSSLContext.load_default_certs  sV    ';/G$$<<7"!66 C	..y'BC%%'r1   minimum_versionc                 *    t        t        |         S r   )rD   r  rx  r0  r  s    r/   rx  zSSLContext.minimum_version      eg566r1   c                     |t         j                  k(  r$| xj                  t        j                   z  c_        t
        t        t          j                  | |       y r   )	rD   rL   optionsr3   OP_NO_SSLv3r  r#  rx  __set__r0  valuer  s     r/   rx  zSSLContext.minimum_version  s?    
(((!4!4 44*j9AA$Nr1   c                 *    t        t        |         S r   )rD   r  maximum_versionrz  s    r/   r  zSSLContext.maximum_version$  r{  r1   c                 J    t         t        t        
  j                  | |       y r   )r  r#  r  r  r  s     r/   r  zSSLContext.maximum_version(  s    *j9AA$Nr1   c                 *    t        t        |         S r   )r3   r  r}  rz  s    r/   r}  zSSLContext.options,  s    uw''r1   c                 J    t         t        t        
  j                  | |       y r   )r  r#  r}  r  r  s     r/   r}  zSSLContext.options0  s    j*-55dEBr1   r   c                 b    | j                   t        j                  z  }|t        j                  k7  S r   _host_flagsrH   r   )r0  ncss     r/   hostname_checks_common_namez&SSLContext.hostname_checks_common_name5  s)    ""T%F%FFC$;;;;r1   c                     |r%| xj                   t        j                   z  c_         y | xj                   t        j                  z  c_         y r   r  )r0  r  s     r/   r  z&SSLContext.hostname_checks_common_name:  s6      T%F%F$FF   D$E$EE r1   c                      yNTrW   r0  s    r/   r  z&SSLContext.hostname_checks_common_nameA  s    r1   c                 8    	 t         |   }||j                  S y r   )r  _msg_callbackuser_function)r0  innerr  s     r/   r  zSSLContext._msg_callbackE  s)    	> %&&&r1   c                     #t         t        t        
  j                  | d        y t	        d      st         d      fd}|_        t         t        t        
  j                  | |       y )N__call__z is not callable.c                 .   	 t        |      }	 t        |      }|t        j                  k(  rt        }n |t        j                  k(  rt
        }nt        }	  ||      } | |||||      S # t        $ r Y gw xY w# t        $ r Y jw xY w# t        $ r Y 6w xY wr   )rD   r   rY   rd   ra   rg   r   )conn	directionversioncontent_typemsg_typedatamsg_enumcallbacks          r/   r  z'SSLContext._msg_callback.<locals>.inneru  s    $W-.|< 555*!6!66(*#H- D)W((D: :'  
    s4   A* A9 B *	A65A69	BB	BB)r  r#  r  r  hasattrr`  r  )r0  r  r  r  s    ` r/   r  zSSLContext._msg_callbackl  sf    *j7??dKx,xj(9:;;	:2 'j*3;;D%Hr1   c                 *    t        t        |         S r   )r'   r  r-  rz  s    r/   r-  zSSLContext.protocol  s    %'*++r1   c                 *    t        t        |         S r   )r<   r  verify_flagsrz  s    r/   r  zSSLContext.verify_flags  s    57/00r1   c                 J    t         t        t        
  j                  | |       y r   )r  r#  r  r  r  s     r/   r  zSSLContext.verify_flags  s    j*2::4Gr1   c                 R    t         |   }	 t        |      S # t        $ r |cY S w xY wr   )r  verify_moder?   r   r  s     r/   r  zSSLContext.verify_mode  s1    #	e$$ 	L	s   
 &&c                 J    t         t        t        
  j                  | |       y r   )r  r#  r  r  r  s     r/   r  zSSLContext.verify_mode  s    j*199$Fr1   r   )FTTNN)FNN)rE   rF   rG   ru  rA  rE  r  r8  rC  rH  rV  ra  re  rq  r  r   rw  r  r   propertyrx  setterr  r}  rH   r  r  r-  r  r  r  r  s   @r/   r#  r#    s   >)OO	, -2,0)-26
  8=/3
( (	) *1)<)< ( {-.		7 
	7 
			O 
 	O
 
	7 
	7 
			O 
 	O ( ( ^^C C t34		< 
	< 
%	+	+	F 
,	F 
	 
	 $ $L #I #IJ , , 1 1 H H   G Gr1   r#  )r  r	  rh  c                   	 t        | t              st        |       | t        j                  k(  r"t        t              }t        |_        d|_	        n.| t        j                  k(  rt        t              }nt        |       |s|s|r|j                  |||       n$|j                  t        k7  r|j                  |        t!        |d      rBt"        j$                  j'                  d      }|r!t(        j*                  j,                  s||_        |S )NTkeylog_filenameSSLKEYLOGFILE)r4  r  r`  r  r   r#  PROTOCOL_TLS_CLIENTCERT_REQUIREDr  check_hostnamer!  PROTOCOL_TLS_SERVERr   rj  	CERT_NONErw  r  r  r  r  rs  flagsignore_environmentr  )rl  r  r	  rh  r?  
keylogfiles         r/   create_default_contextr    s     g{+  
 '%%%01+!%	G''	'01!!6%%fff=					) 	""7+w)*ZZ^^O4
cii::&0G#Nr1   F)	cert_reqsr  rl  certfilekeyfiler  r	  rh  c                n   	 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|	j                  ||       |s|s|r|	j                  |||       n$|	j                  t        k7  r|	j                  |       t!        |	d      rBt"        j$                  j'                  d      }
|
r!t(        j*                  j,                  s|
|	_        |	S )NTzcertfile must be specifiedr  r  )r4  r  r`  r  r   r  r!  r  r   r#  r  r  load_cert_chainrj  r  rw  r  r  r  r  rs  r  r  r  )r-  r  r  rl  r  r  r  r	  rh  r?  r  s              r/   _create_unverified_contextr    s     g{+  
 '%%%*H	G''	'*H!!"G+G'!%x5667'2 6%%fff=					) 	""7+w)*ZZ^^O4
cii::&0G#Nr1   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y)	SSLObjectc                 F    t        | j                  j                   d      )NzU does not have a public constructor. Instances are returned by SSLContext.wrap_bio().r`  r  rE   r0  r.  r/  s      r/   __init__zSSLObject.__init__  s+    ~~&&' (L M
 	
r1   Nc                 d    | j                  |       }|j                  ||||||      }||_        |S )N)r;  r>  ownerr@  )r  	_wrap_bio_sslobj)	r  rF  rG  r;  r>  r@  r?  r0  rY  s	            r/   rB  zSSLObject._create$  sD     {{3""hK+ # 

 r1   c                 0    	 | j                   j                  S r   r  r?  r  s    r/   r?  zSSLObject.context0  s    6||###r1   c                 &    || j                   _        y r   r  r0  ctxs     r/   r?  zSSLObject.context5  s    "r1   c                 0    	 | j                   j                  S r   r  r@  r  s    r/   r@  zSSLObject.session9  s    /||###r1   c                 &    || j                   _        y r   r  r0  r@  s     r/   r@  zSSLObject.session>  s    &r1   c                 0    	 | j                   j                  S r   r  session_reusedr  s    r/   r  zSSLObject.session_reusedB  s    <||***r1   c                 0    	 | j                   j                  S r   )r  r;  r  s    r/   r;  zSSLObject.server_sideG  s    3||'''r1   c                 0    	 | j                   j                  S r   )r  r>  r  s    r/   r>  zSSLObject.server_hostnameL  s    	#||+++r1   c                 ~    	 || j                   j                  ||      }|S | j                   j                  |      }|S r   )r  read)r0  rO  buffervs       r/   r  zSSLObject.readR  sG    	
 !!#v.A  !!#&Ar1   c                 :    	 | j                   j                  |      S r   )r  writer0  r  s     r/   r  zSSLObject.write^  s    	
 ||!!$''r1   c                 :    	 | j                   j                  |      S r   )r  getpeercertr0  binary_forms     r/   r  zSSLObject.getpeercertf  s    	 ||''44r1   c                 >    	 t        j                  dt        d       y NrJ  r   rK  )r)  r*  r+  r  s    r/   selected_npn_protocolzSSLObject.selected_npn_protocolo  s    	 	5	
r1   c                 8    	 | j                   j                         S r   )r  selected_alpn_protocolr  s    r/   r  z SSLObject.selected_alpn_protocoly  s    	 ||2244r1   c                 8    	 | j                   j                         S r   )r  cipherr  s    r/   r  zSSLObject.cipher  s    	(||""$$r1   c                 8    	 | j                   j                         S r   )r  shared_ciphersr  s    r/   r  zSSLObject.shared_ciphers  s    	 ||**,,r1   c                 8    	 | j                   j                         S r   )r  compressionr  s    r/   r  zSSLObject.compression  s    	P||''))r1   c                 8    	 | j                   j                         S r   )r  pendingr  s    r/   r  zSSLObject.pending  s    F||##%%r1   c                 :    	 | j                   j                          y r   )r  do_handshaker  s    r/   r  zSSLObject.do_handshake  s    *!!#r1   c                 8    	 | j                   j                         S r   )r  shutdownr  s    r/   unwrapzSSLObject.unwrap  s    /||$$&&r1   c                 :    	 | j                   j                  |      S r   )r  get_channel_bindingr0  cb_types     r/   r  zSSLObject.get_channel_binding  s    	M ||//88r1   c                 8    	 | j                   j                         S r   r  r  r  s    r/   r  zSSLObject.version  s    	!||##%%r1   c                 6    | j                   j                         S r   )r  verify_client_post_handshaker  s    r/   r  z&SSLObject.verify_client_post_handshake  s    ||88::r1   )FNNN   NFr   )rE   rF   rG   r  r  rB  r  r?  r  r@  r  r;  r>  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rW   r1   r/   r  r    s    
 5:=A	 	 $ $ ^^# # $ $ ^^' ' + + ( ( , ,

(5
5%
-*
&$'9&
;r1   r  c                 Z    	 t        t        | j                        j                  | _        | S r   )getattrr  rE   __doc__)funcs    r/   _sslcopydocr     s"    49dmm4<<DLKr1   c                   \    e Zd Z	 d Ze	 	 	 d* 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d+d	Zd
 Zd,dZd Zed-d       Zed        Zed        Zed        Zed        Zed        Zd. fd	Zd+ fd	Zd Zd. fd	Zd/ fd	Zd0 fd	Zd1 fd	Zd0 fd	Zd1 fd	Zd Z d Z!ed        Z" fdZ#ed         Z$ed!        Z% fd"Z&ed-d#       Z' fd$Z(d% Z)d& Z* fd'Z+ed2d(       Z,ed)        Z- xZ.S )3	SSLSocketc                 F    t        | j                  j                   d      )NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().r  r  s      r/   r  zSSLSocket.__init__  s)    ~~&&' (( )
 	
r1   c                    |j                  t        t              t        k7  rt	        d      |r|rt        d      |t        d      |j                  r|st        d      t        |j                  |j                  |j                  |j                               } | j                  | fi |}	t        t        |	>  di | |j!                         }
|j#                          ||	_        ||	_        d|	_        d |	_        ||	_        |j/                  |      |	_        ||	_        ||	_        	 |	j7                          d}|	jO                  |
       ||	_(        |rn	 |	j$                  jS                  |	||	j0                  |	|	j&                        |	_        |r0|	j!                         }|dk(  rt        d      |	jU                          |	S |	S # t8        $ r}|j:                  t:        j<                  k7  r d}|	j?                         }|	jA                  d       	 |	jC                  d      }nE# t8        $ r9}|j:                  t:        j<                  t:        jD                  fvr d	}Y d }~nd }~ww xY w|	jA                  |       |rQd
}tG        j:                  |      }||_$        d |_%        	 |	jM                          n# t8        $ r Y nw xY w	 |# d }w xY wY d }~d }~ww xY w# t8        t
        f$ r |	jM                           w xY w)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   r1   z5Closed before TLS handshake with data in recv buffer.r  r@          zHdo_handshake_on_connect should not be specified for non-blocking socketsrW   )+
getsockoptr   r   r   NotImplementedErrorr   r  dictr  r  r  r  r  r  r  r  
gettimeoutdetach_context_session_closedr  r;  r8  r>  r<  r=  getpeernamer   errnoENOTCONNgetblockingsetblockingrecvEINVALr   reasonlibraryclose
settimeout
_connected_wrap_socketr  )r  r:  r;  r<  r=  r>  r?  r@  r/  r0  sock_timeout	connectedeblockingnotconn_pre_handshake_datar   notconn_pre_handshake_data_errortimeoutr  s                     r/   rB  zSSLSocket._create  s    ??:w/;>%&IJJ  "2 3 3"  "/ 0 0!!/FGG;;TYYdjj;;=
 s{{3)&)i'1&1(&&77H'>$$8!'	L I%##}}99+t';';  :   +"oo/G#~()stt%%' ts  #	<ww%..(I'')HU#
1
 .2YYq\* 1775>>5<<"@@-0*	1
 X&) Q3;AGGV3L0:@07;?08JJL <:: 8<4# *%#	<l Z( 

s   ,G A+K 
KAKH&%K&	I(//I#K#I((<K%J65K6	K?KKKKKKK!K>c                     | j                   S r   )r  r  s    r/   r?  zSSLSocket.context  s     }}r1   c                 4    || _         || j                  _        y r   )r  r  r?  r  s     r/   r?  zSSLSocket.context!  s    "r1   c                 H    | j                   | j                   j                  S y r   r  r  s    r/   r@  zSSLSocket.session&  s#     <<#<<''' $r1   c                 N    || _         | j                  || j                  _        y y r   )r  r  r@  r  s     r/   r@  zSSLSocket.session,  s$    <<##*DLL  $r1   c                 H    | j                   | j                   j                  S y r   r  r  s    r/   r  zSSLSocket.session_reused2  s#     <<#<<... $r1   c                 F    t        d| j                  j                  z        )NzCan't dup() %s instances)r  r  rE   r  s    r/   dupzSSLSocket.dup8  s$    !"<"&.."9"9#: ; 	;r1   c                      y r   rW   )r0  msgs     r/   _checkClosedzSSLSocket._checkClosed<  s    r1   c                 >    | j                   s| j                          y y r   )r  r  r  s    r/   _check_connectedzSSLSocket._check_connected@  s    
  r1   c                 F   	 | j                          | j                  t        d      	 || j                  j                  ||      S | j                  j                  |      S # t        $ r4}|j
                  d   t        k(  r| j                  r|Y d }~yY d }~y d }~ww xY w)Nz'Read on closed or unwrapped SSL socket.r   r1   )r0  r  r   r  r   r.  SSL_ERROR_EOFr=  )r0  rO  r  xs       r/   r  zSSLSocket.readH  s    	- 	<<FGG	!||((f55||((-- 	vvayM)d.G.G%	s#   A# A# #	B ,$BBB c                     	 | j                          | j                  t        d      | j                  j                  |      S )Nz(Write on closed or unwrapped SSL socket.)r0  r  r   r  r  s     r/   r  zSSLSocket.write]  s@    	9 	<<GHH||!!$''r1   c                 x    | j                          | j                          | j                  j                  |      S r   )r0  r2  r  r  r  s     r/   r  zSSLSocket.getpeercertf  s/    ||''44r1   c                 \    | j                          t        j                  dt        d       y r  )r0  r)  r*  r+  r  s    r/   r  zSSLSocket.selected_npn_protocoll  s(    5	

 r1   c                     | j                          | j                  t        j                  sy | j                  j	                         S r   )r0  r  rH   r   r  r  s    r/   r  z SSLSocket.selected_alpn_protocolv  s4    <<t}}<<6688r1   c                 p    | j                          | j                  y | j                  j                         S r   )r0  r  r  r  s    r/   r  zSSLSocket.cipher~  s.    <<<<&&((r1   c                 p    | j                          | j                  y | j                  j                         S r   )r0  r  r  r  s    r/   r  zSSLSocket.shared_ciphers  s.    <<<<..00r1   c                 p    | j                          | j                  y | j                  j                         S r   )r0  r  r  r  s    r/   r  zSSLSocket.compression  s.    <<<<++--r1   c                     | j                          | j                  8|dk7  rt        d| j                  z        | j                  j	                  |      S t
        |   ||      S )Nr   z3non-zero flags not allowed in calls to send() on %s)r0  r  r   r  r  r  send)r0  r  r  r  s      r/   r>  zSSLSocket.send  sd    <<#z INN#$ $ <<%%d++7<e,,r1   c                     | j                          | j                  t        d| j                  z        |t        |   ||      S t        |   |||      S )Nz%sendto not allowed on instances of %s)r0  r  r   r  r  sendto)r0  r  flags_or_addrr   r  s       r/   r@  zSSLSocket.sendto  s^    <<#D!^^, - -\7>$667>$t<<r1   c                 2    t        d| j                  z        )Nz&sendmsg not allowed on instances of %sr  r  r  s      r/   sendmsgzSSLSocket.sendmsg  s      ""J"&..#1 2 	2r1   c                    | j                          | j                  }|dk7  rt        d| j                  z        d}t	        |      5 }|j                  d      5 }t        |      }||k  r| j                  ||d        }||z  }||k  rd d d        d d d        y t        | %  ||      S # 1 sw Y   "xY w# 1 sw Y   y xY w)Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
r0  r  r   r  
memoryviewcastrO  r>  r  sendall)	r0  r  r  r   view	byte_viewamountr  r  s	           r/   rI  zSSLSocket.sendall  s    <<#z LNN#$ $ ED! T499S> YYfn		)EF"34AQJE fn   7?4//   s$   B7/B+
B7+B4	0B77C c                 f    	 | j                   | j                  |||      S t        |   |||      S r   )r  _sendfile_use_sendr  sendfile)r0  fileoffsetr   r  s       r/   rO  zSSLSocket.sendfile  s?    	 <<#**4?? 7#D&%88r1   c                     | j                          | j                  .|dk7  rt        d| j                  z        | j	                  |      S t
        |   ||      S )Nr   z3non-zero flags not allowed in calls to recv() on %s)r0  r  r   r  r  r  r  r0  buflenr  r  s      r/   r  zSSLSocket.recv  s^    <<#z INN#$ $ 99V$$7<..r1   c                     | j                          |r|t        |      }n|d}| j                  /|dk7  rt        d| j                  z        | j                  ||      S t        |   |||      S )Nr  r   z8non-zero flags not allowed in calls to recv_into() on %s)r0  rO  r  r   r  r  r  	recv_intor0  r  nbytesr  r  s       r/   rV  zSSLSocket.recv_into  s}    v~[F^F<<#z L..!" " 99VV,,7$VVU;;r1   c                     | j                          | j                  t        d| j                  z        t        |   ||      S )Nz'recvfrom not allowed on instances of %s)r0  r  r   r  r  recvfromrS  s      r/   rZ  zSSLSocket.recvfrom  sI    <<#F!^^, - - 7#FE22r1   c                     | j                          | j                  t        d| j                  z        t        |   |||      S )Nz,recvfrom_into not allowed on instances of %s)r0  r  r   r  r  recvfrom_intorW  s       r/   r\  zSSLSocket.recvfrom_into  sK    <<#K!^^, - - 7(??r1   c                 2    t        d| j                  z        )Nz&recvmsg not allowed on instances of %srC  r  s      r/   recvmsgzSSLSocket.recvmsg  s    !"J"&..#1 2 	2r1   c                 2    t        d| j                  z        )Nz+recvmsg_into not allowed on instances of %srC  r  s      r/   recvmsg_intozSSLSocket.recvmsg_into  s     ! #')-#8 9 	9r1   c                 p    | j                          | j                  | j                  j                         S yNr   )r0  r  r  r  s    r/   r  zSSLSocket.pending  s.    <<#<<''))r1   c                 R    | j                          d | _        t        |   |       y r   )r0  r  r  r  )r0  howr  s     r/   r  zSSLSocket.shutdown  s#    r1   c                     | j                   r#| j                   j                         }d | _         |S t        dt        |       z         NzNo SSL wrapper around )r  r  r   r5  )r0  ss     r/   r  zSSLSocket.unwrap
  s<    <<%%'ADLH5D	ABBr1   c                 |    | j                   r| j                   j                         S t        dt        |       z         rf  )r  r  r   r5  r  s    r/   r  z&SSLSocket.verify_client_post_handshake  s1    <<<<<<>>5D	ABBr1   c                 0    d | _         t        | 	          y r   )r  r  _real_closerz  s    r/   rj  zSSLSocket._real_close  s    r1   c                     | j                          | j                         }	 |dk(  r|r| j                  d        | j                  j	                          | j                  |       y # | j                  |       w xY w)Nr
  )r2  r  r  r  r  )r0  blockr&  s      r/   r  zSSLSocket.do_handshake  s]    //#	%#~%%LL%%'OOG$DOOG$s   2A& &A9c                    | j                   rt        d      | j                  s| j                  t        d      | j                  j                  | d| j                  | | j                        | _        	 |rt        | %  |      }nd }t        | )  |       |s#d| _        | j                  r| j                          |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)r;  r   r  r  r?  r  r>  r  r  
connect_exconnectr<  r  r   )r0  r   rn  rcr  s       r/   _real_connectzSSLSocket._real_connect)  s    @AA ??dll6NOO||00%-- 1 
	W'-%"&//%%'I$ 	DL	s   6A	C   Cc                 *    	 | j                  |d       y )NFrq  r0  r   s     r/   ro  zSSLSocket.connectC  s    	4'r1   c                 (    	 | j                  |d      S r  rs  rt  s     r/   rn  zSSLSocket.connect_exH  s    	!!$--r1   c                     	 t         |          \  }}| j                  j                  || j                  | j
                  d      }||fS )NT)r<  r=  r;  )r  acceptr?  rC  r<  r=  )r0  newsockr   r  s      r/   rw  zSSLSocket.acceptM  sV    	> (,,**7,0,H,H)-)B)B $ + & }r1   c                     | j                   | j                   j                  |      S |t        vrt        dj	                  |            y )Nz({0} channel binding type not implemented)r  r  CHANNEL_BINDING_TYPESr   r   r  s     r/   r  zSSLSocket.get_channel_bindingY  sJ    <<#<<33G<<33 >EEgN  r1   c                 P    | j                   | j                   j                         S y r   r  r  s    r/   r  zSSLSocket.versiond  s"    <<#<<''))r1   )FTTNNNr   r  r  )r   )r   N)r  r   rb  r  )/rE   rF   rG   r  r  rB  r  r   r?  r  r@  r  r-  r0  r2  r  r  r  r  r  r  r  r  r>  r@  rD  rI  rO  r  rV  rZ  r\  r^  r`  r  r  r  r  rj  r  rq  ro  rn  rw  r  r  r  r  s   @r/   r  r    s   ;
 FJ;?&*] ]~    ^^# # (  ( ^^+ +
 /  /;*( 5 5
   9 9 ) ) 1 1 . .	-=20 9	/<3@29  
 C C C C % %4(
.

    r1   r  c                     	 ddl m} ddlm} d}d}	 |j	                  | d d j                               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          r/   cert_time_to_secondsr  s  s     F (K
7||IbqM$7$7$9:Q> im[1 r!ul+b1g566  F-6E F 	FFs   %A A3z-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----c                    	 t        t        j                  |       dd      }t        g}|t	        dt        |      d      D cg c]
  }|||dz     c}z  }|j                  t        dz          dj                  |      S c c}w )NASCIIstrictr   @   
)	r5  base64standard_b64encode
PEM_HEADERrangerO  rP  
PEM_FOOTERjoin)der_cert_bytesfssis       r/   DER_cert_to_PEM_certr    sy    & 	F%%n5wIA
BeAs1vr2
31Qqt9
33BIIj4 99R= 4s   A?c                 b   	 | j                  t              st        dt        z        | j                         j	                  t
              st        dt
        z        | j                         t        t              t        t
                }t        j                  |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  rO  r  decodebytesr6  )pem_cert_stringds     r/   PEM_cert_to_DER_certr    s    4 %%j1C%& ' 	'  "++J7A%& ' 	'JZ0@AAahhw9::r1   c                 (   	 | \  }}|t         }nt        }t        |||      }t        | |      5 }|j	                  ||      5 }	|	j                  d      }
d d d        d d d        t        
      S # 1 sw Y   xY w# 1 sw Y   t        
      S xY w)N)r  r  )r&  )r>  T)r  r  _create_stdlib_contextr   rC  r  r  )r   ssl_versionca_certsr&  hostportr  r?  r:  sslsockdercerts              r/   get_server_certificater    s     JD$!		$[/8,46G 
4	1 0T  t < 	0))$/G	00  ((	0 	00  ((s#   A>A2A>2A;	7A>>Bc                 .    t         j                  | d      S )Nz	<unknown>)_PROTOCOL_NAMESr  )protocol_codes    r/   get_protocol_namer    s    }k::r1   r   )lrs  r  collectionsr   enumr   _Enumr   _IntEnumr   _IntFlagr   rH   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r   r   r   r   ImportErrorr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   	_convert_rE   r'   r,  r*   __members__itemsr  r  _SSLv2_IF_EXISTSrD   rY   rg   r   rt  r   r   r   r   r   r   r   r   r   r  r  r)  r   socket_errorrz  r  HAS_NEVER_CHECK_COMMON_NAME_RESTRICTED_SERVER_CIPHERSr   r   r   r   r   r   r  r  r#  r   r  r  r  _create_default_https_contextr  r  r   r  rA  rE  r  r  r  r  r  r  r  r  )r.   r  s   00r/   <module>r     s[  Xt  	 " H H   N N 3 3   : 2 2	   8   (K
   x'
   6
   h.
   8+
   ()
 0:/F/F F*,2<2H2H2N2N2PQ;45$;Q:'7>  h5 5 5 h   h&" &" &"R h     : <<71 9 9 ? ?     % %d,JK  . + .>b DF	   4 &@*],HI @*&k5 &BG BGJ $+#6#6 $$"&t$L49*/9L9L$($"&tD4n !7  4 X; X;vy yz '
 &
 
7< +
(
; .A$(2I),;c*  		T Rs   J% =J1%J.-J.