
    4bh              
       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    -/opt/python-3.12.12/usr/lib/python3.12/ssl.py<lambda>r0   }   s    -K$:K2KK    )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6r1   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  sl    &Hh(A1v{c!fslJKKMM#a&!MM! ' 	  (r1   c                 *   	 t        |      D ]2  \  }}}|dk(  s|du s|j                  |v s 	 | j                  |       4 y # t        $ r"}t	        j
                  d|       Y d }~\d }~ww xY w# t        $ r t	        j
                  d       Y y w xY w)Nx509_asnT)cadataz.Bad certificate in Windows certificate store: z-unable to enumerate Windows certificate store)r   r  load_verify_locationsr   r)  r*  PermissionError)r0  	storenamepurposecertencodingtrustexcs          r/   _load_windows_store_certsz$SSLContext._load_windows_store_certs  s    
	K):9)E%hz)}u(<d 66d6C *F  ( d$MM,Z[^Za*bccd 	KMMIJ	Ks?   A1 A1 A A1 	A.A)$A1 )A..A1 1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  sO    ';/G$$<<7"!66	..y'B 7%%'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.options/  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_name4  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_name9  s6      T%F%F$FF   D$E$EE r1   c                      yNTrW   r0  s    r/   r  z&SSLContext.hostname_checks_common_name@  s    r1   c                 8    	 t         |   }||j                  S y r   )r  _msg_callbackuser_function)r0  innerr  s     r/   r  zSSLContext._msg_callbackD  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>.innert  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_callbackk  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
( (	)K *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   ri  	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_chainri  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.context/  s    6||###r1   c                 &    || j                   _        y r   r  r0  ctxs     r/   r?  zSSLObject.context4  s    "r1   c                 0    	 | j                   j                  S r   r  r@  r  s    r/   r@  zSSLObject.session8  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_reusedA  s    <||***r1   c                 0    	 | j                   j                  S r   )r  r;  r  s    r/   r;  zSSLObject.server_sideF  s    3||'''r1   c                 0    	 | j                   j                  S r   )r  r>  r  s    r/   r>  zSSLObject.server_hostnameK  s    	#||+++r1   c                 ~    	 || j                   j                  ||      }|S | j                   j                  |      }|S r   )r  read)r0  rO  buffervs       r/   r  zSSLObject.readQ  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.getpeercerte  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_protocoln  s    	 	5	
r1   c                 8    	 | j                   j                         S r   )r  selected_alpn_protocolr  s    r/   r  z SSLObject.selected_alpn_protocolx  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      |j                         }t        |j                  |j                  |j                  |j                               }	 | j                  | fi |	}
t        t        |
B  di |	 |j#                          	 ||
_        ||
_        d|
_        d |
_        ||
_        |j/                  |      |
_        ||
_        ||
_        	 |
j7                          d}|
jM                  |       ||
_'        |rk|
j$                  jQ                  |
||
j0                  |
|
j&                        |
_        |r0|
j                         }|dk(  rt        d      |
jS                          |
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                  |       |r0d
}tG        j:                  |      }||_$        d |_%        	 |# d }w xY wY d }~rd }~ww xY w#  	 |
jU                           # t8        $ r Y  w xY 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  
gettimeoutdictr  r  r  r  r  r  r  r  detach_context_session_closedr  r;  r8  r>  r<  r=  getpeernamer   errnoENOTCONNgetblockingsetblockingrecvEINVALr   reasonlibrary
settimeout
_connected_wrap_socketr  close)r  r:  r;  r<  r=  r>  r?  r@  sock_timeoutr/  r0  	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C	#DM#DM DLDL*D#*#;#;O#LD +BD((<D%#!  "D !	OOL)'DO#}}99+t';';  :   +"oo/G#~()stt%%' o  @77enn,!	++-  '
5
 261. 5wwu~~u||&DD14.	5
   *- UF7?7P4>D4;?C4<@>> <@8 .%@b	

   s   %AJ9 -G =BJ9 	J6AJ1H#"J1#	I%,/I J1 I%%<J1"J$$J((J1+J9 1J66J9 9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_reused0  s#     <<#<<... $r1   c                 F    t        d| j                  j                  z        )NzCan't dup() %s instances)r  r  rE   r  s    r/   dupzSSLSocket.dup6  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.readF  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.getpeercertd  s/    ||''44r1   c                 \    | j                          t        j                  dt        d       y r  )r0  r)  r*  r+  r  s    r/   r  zSSLSocket.selected_npn_protocolj  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_protocolt  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                          |)|%t        |      5 }|j                  }d d d        |sd}nd}| j                  /|dk7  rt	        d| j
                  z        | j                  ||      S t        | !  |||      S # 1 sw Y   \xY w)Nr  r   z8non-zero flags not allowed in calls to recv_into() on %s)	r0  rG  nbytesr  r   r  r  r  	recv_into)r0  r  rV  r  rJ  r  s        r/   rW  zSSLSocket.recv_into  s    >!'4![[F (!F<<#z L..!" " 99VV,,7$VVU;; ('s   B		B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/   rY  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_into)r0  r  rV  r  r  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         re  )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/   ri  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   rm  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rp  r0  r   s     r/   rn  zSSLSocket.connectE  s    	4'r1   c                 (    	 | j                  |d      S r  rr  rs  s     r/   rm  zSSLSocket.connect_exJ  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/   rv  zSSLSocket.acceptO  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_binding[  sJ    <<#<<33G<<33 >EEgN  r1   c                 P    | j                   | j                   j                         S y r   r  r  s    r/   r  zSSLSocket.versionf  s"    <<#<<''))r1   )FTTNNNr   r  r  )r   )r   N)r  r   ra  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  rW  rY  r[  r]  r_  r  r  r  r  ri  r  rp  rn  rm  rv  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  u  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    s    & 	F%%n5wIA
BeAs1vr2
321Qqt92
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	1T  t <))$/G = 
2  (( =< 
2  ((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_errorry  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     sa  Xt  	 " H H   N N 3 3   : 2 2	   8   (K
   x'
   6
   h.
   8+
   ()
 0:/F/F F*,2<2H2H2N2N2PQ2P;45$;2PQ:'7>  h5 5 5 h   h&" &" &"R h     : <<71 9 9 ? ?     % %d,JK  . + .>b DF	   4 &@*],HI @*&k5 &AG AGH $+#6#6 $$"&t$L49*/9L9L$($"&tD4n !7  4 X; X;v| |@ '
 &
 
7< +
(
; .A$(2I),;g*  		T Rs   J% =J1%J.-J.