
    &`e<D                     :   d dl Z d dlZd dlZd dl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mZ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 eZeZ eZ! G d	 d
e          Z" ee"          Z# ee#          Z$ G d de          Z% ee%          Z& G d de          Z' G d de          Z(er	ee(         Z)n ee(          Z) G d de          Z* G d de          Z+ ee+          Z, G d de          Z- ee-          Z. G d de          Z/ ee/          Z0 ee0          Z1 G d de          Z2 G d de          Z3 ee3          Z4 G d de          Z5 ee5          Z6 G d d e          Z7 ee7          Z8 ee          Z9dZ:d!Z;d"Z<d#Z=dZ> ed$          Z?d%Z@d&ZAd'ZBd(ZCd)ZDd*ZEd+ZFd,ZGd-ZHd.ZId/ZJd#ZKd0ZLd1ZMd2ZNeBeCz  eDz  eEz  eFz  eGz  eHz  eIz  eJz  ZO ed3          ZP ed4          ZQd5eRd6ed7ed8efd9ZSePjT        ZTe8e9feT_U        eSeT_V        ePjW        ZWeee!ee
feW_U        e eW_X        eSeW_V        ePjY        ZYe eeeee$feY_U        eeY_X        ePjZ        ZZeeefeZ_U        e#eZ_X        eSeZ_V        ePj[        Z[ee#ee e)ee
e1fe[_U        ee[_X        eSe[_V        ePj\        Z\e	e0e4e6fe\_U        ee\_X        ePj]        Z]e efe]_U        ee]_X        eSe]_V        ePj^        Z^e0fe^_U        ePj_        Z_e#fe__U        ePj`        Z`efe`_U        eQja        Zaeeeeeee
fea_U        eea_X        	 dHd:ejb        d;eced         d<eedz  d8dfd=Zfd:ejb        d>edz  d?e d@e
dAe)d<eedz  dBegd8dfdCZhd:ejb        dDeced         d?e d@e
dAe)d<eedz  dBegd8dfdEZie jj        dFejb        d8ejk        d         fdG            ZldS )I    N)WinDLLWinError)
POINTER	Structurec_char_pc_ulongc_void_p	c_wchar_pcastcreate_unicode_bufferpointersizeof)
BOOLDWORDHANDLELONGLPCSTRLPCVOIDLPCWSTR
LPFILETIMELPSTRLPWSTR)TYPE_CHECKINGAny   )_set_ssl_context_verify_modec                   0    e Zd ZdefdefdefdefdeffZdS )CERT_CONTEXTdwCertEncodingTypepbCertEncodedcbCertEncoded	pCertInfo
hCertStoreN)__name__
__module____qualname__r   r
   
HCERTSTORE_fields_     3lib/python3.11/site-packages/truststore/_windows.pyr   r   '   s=        	u%	(#	% 	h	z"HHHr+   r   c                   0    e Zd Zdefd ee          ffZdS )CERT_ENHKEY_USAGEcUsageIdentifierrgpszUsageIdentifierN)r%   r&   r'   r   r   r   r)   r*   r+   r,   r.   r.   5   s-        	U#	0HHHr+   r.   c                       e Zd ZdefdeffZdS )CERT_USAGE_MATCHdwTypeUsageN)r%   r&   r'   r   r.   r)   r*   r+   r,   r2   r2   ?   s&        	5	#$HHHr+   r2   c            
       H    e Zd Zdefdefdefdefdefdefdefdefd	eff	Zd
S )CERT_CHAIN_PARAcbSizeRequestedUsageRequestedIssuancePolicydwUrlRetrievalTimeoutfCheckRevocationFreshnessTimedwRevocationFreshnessTimepftCacheResyncpStrongSignParadwStrongSignFlagsN)	r%   r&   r'   r   r2   r   r   r
   r)   r*   r+   r,   r6   r6   F   s_        	5	+,	"$45	 %(	($/	$e,	:&	H%	e$
HHHr+   r6   c                       e Zd ZdefdeffZdS )CERT_TRUST_STATUSdwErrorStatusdwInfoStatusN)r%   r&   r'   r   r)   r*   r+   r,   rA   rA   Z   s%        	% 	HHHr+   rA   c                   <    e Zd ZdefdefdefdefdefdefdeffZ	dS )	CERT_CHAIN_ELEMENTr7   pCertContextTrustStatuspRevocationInfopIssuanceUsagepApplicationUsagepwszExtendedErrorInfoN)
r%   r&   r'   r   PCERT_CONTEXTrA   r
   PCERT_ENHKEY_USAGEr   r)   r*   r+   r,   rE   rE   a   sP        	5	'	)*	H%	-.	01	 '*HHHr+   rE   c                   N    e Zd Zdefdefdefd ee          fdefdefdeffZ	dS )	CERT_SIMPLE_CHAINr7   rG   cElement
rgpElementpTrustListInfofHasRevocationFreshnessTimer<   N)
r%   r&   r'   r   rA   r   PCERT_CHAIN_ELEMENTr
   r   r)   r*   r+   r,   rO   rO   p   sY        	5	)*	U	ww2334	8$	&-	$e,HHHr+   rO   c            	       T    e Zd Zdefdefdefd ee          fdefdefdefdeffZ	d	S )
CERT_CHAIN_CONTEXTr7   rG   cChainrgpChaincLowerQualityChainContextrgpLowerQualityChainContextrS   r<   N)
r%   r&   r'   r   rA   r   PCERT_SIMPLE_CHAINr
   r   r)   r*   r+   r,   rV   rV      sa        	5	)*	5	WW/001	$e,	&1	&-	$e,	HHHr+   rV   c                   *    e Zd ZdefdefdefdeffZdS ) SSL_EXTRA_CERT_CHAIN_POLICY_PARAr7   
dwAuthType	fdwCheckspwszServerNameN)r%   r&   r'   r   r   r)   r*   r+   r,   r]   r]      s5        	5	u	e	7#	HHHr+   r]   c                   $    e Zd ZdefdefdeffZdS )CERT_CHAIN_POLICY_PARAr7   dwFlagspvExtraPolicyParaN)r%   r&   r'   r   r
   r)   r*   r+   r,   rb   rb      s-        	5	E	h'HHHr+   rb   c                   0    e Zd ZdefdefdefdefdeffZdS )CERT_CHAIN_POLICY_STATUSr7   dwErrorlChainIndexlElementIndexpvExtraPolicyStatusN)r%   r&   r'   r   r   r
   r)   r*   r+   r,   rf   rf      s=        	5	E		$	)HHHr+   rf   c                   `    e Zd Zdefdefdefdefdefdefdefdefd	efd
efdefdefdeffZdS )CERT_CHAIN_ENGINE_CONFIGr7   hRestrictedRoothRestrictedTrusthRestrictedOthercAdditionalStorerghAdditionalStorerc   r:   MaximumCachedCertificatesCycleDetectionModulushExclusiveRoothExclusiveTrustedPeopledwExclusiveFlagsN)r%   r&   r'   r   r(   r
   r)   r*   r+   r,   rl   rl      s}        	5	J'	Z(	Z(	U#	x(	E	 %(	$e,	 %(	:&	"J/	U#HHHr+   rl   i   s   Memory   s   1.3.6.1.5.5.7.3.1i   i             @          i   i   i @     i   i   zcrypt32.dllzkernel32.dllresult_argsreturnc                 &    | st                      |S Nr   )r   r   r   s      r,   _handle_win_errorr      s     jjKr+   ssl_context
cert_chainserver_hostnamec           
         d}t          t          dddd          }	 |dd         D ]5}t          |t          t          z  |t          |          t          d           6|d         }t          t          t          z  |t          |                    }t                      }d|_	        t          dz  t                    |_        t                      }||_        t                      }	||	_        t#          |	          |	_        t'          |	          }
| j        t*          j        z  rt.          }n| j        t*          j        z  rt2          }nd}	 t5          | d|||
||           nE# t*          j        $ r3 |                     d          }|rt;          | ||||
||           n Y nw xY wt=          |d           |rt?          |           dS dS # t=          |d           |rt?          |           w w xY w)z9Verify the cert_chain from the server using Windows APIs.Nr   r   )chain_flagsT)binary_form) CertOpenStoreCERT_STORE_PROV_MEMORY CertAddEncodedCertificateToStoreX509_ASN_ENCODINGPKCS_7_ASN_ENCODINGlenCERT_STORE_ADD_USE_EXISTINGCertCreateCertificateContextr.   r/   r   OID_PKIX_KP_SERVER_AUTHr0   r2   r4   r6   r8   r   r7   r   verify_flagssslVERIFY_CRL_CHECK_CHAIN!CERT_CHAIN_REVOCATION_CHECK_CHAINVERIFY_CRL_CHECK_LEAF$CERT_CHAIN_REVOCATION_CHECK_END_CERT_get_and_verify_cert_chainSSLCertVerificationErrorget_ca_certs_verify_using_custom_ca_certsCertCloseStoreCertFreeCertificateContext)r   r   r   rF   hIntermediateCertStore
cert_bytes	leaf_certcert_enhkey_usagecert_usage_matchchain_params
pChainParar   custom_ca_certss                r,   _verify_peercerts_implr   B  sz    L*+A1dAtTTG5$QRR. 	 	J,&!$77J+    qM	3 33YI
 

 .//-.*2:Q,@W1X1X.+--!2&((&6#$\22\**
#c&@@ 	;KK%(AA 	>KKK	 '&'     + 	 	 	
 3>2J2J  3K 3 3O  -#* # +      	* 	-q111 	5&|44444	5 	5 	-q111 	5&|4444	5s0   D+G	 E G	 ?F!G	  F!!G	 	$G-hChainEnginer   pPeerCertContextr   r   c           
      ~   d }	 t          t                                }t          ||d |||d |           |j        }t	                      }	t          |	          |	_        t          |	_        d|	_	        |rt          |          |	_        t                      }
t          t          |	          t                    |
_        | j        t"          j        k    r|
xj        t(          z  c_        | j        s|
xj        t,          z  c_        t          |
          |
_        t          |
          }t/                      }t          |          |_        t          |          }t1          t2          |||           |j        }|rt7          d          }t9          t:          t<          z  d |d|t          |          d           }|dk    rd|dd|j         d}n|j         !                                }t#          j"        |          }||_#        ||_$        |d 	 |rtK          |j                   d S d S # |rtK          |j                   w w xY w)Nr   i   zCertificate chain policy error z#xz [])&r   PCERT_CHAIN_CONTEXTCertGetCertificateChaincontentsr]   r   r7   AUTHTYPE_SERVERr^   r_   r   r`   rb   r   r
   rd   verify_moder   	CERT_NONErc   (CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGScheck_hostname*CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAGrf    CertVerifyCertificateChainPolicyCERT_CHAIN_POLICY_SSLrg   r   FormatMessageWFORMAT_MESSAGE_FROM_SYSTEMFORMAT_MESSAGE_IGNORE_INSERTSri   valuestripr   verify_messageverify_codeCertFreeCertificateChain)r   r   r   r   r   r   r   ppChainContextpChainContext ssl_extra_cert_chain_policy_parachain_policypPolicyParapolicy_statuspPolicyStatus
error_codeerror_message_buferror_message_charserror_messageerrs                      r,   r   r     s    NK> !4!6!677"		
 		
 		
 '/ ,L+M+M(28,3
 3
(/ 7F(356(2 	Y>G>X>X,;-//)-455x*
 *
& "cm33  $LL  ) 	O  $NN  $\22l++022%m44..(!		
 	
 	
 #*
 	  5d ; ;"0*-JJ!())# # #a'' q* q q qS`Sn q q q 1 7 = = ? ?.}==C!.C(CO41	 4  	>$^%<=====	> 	>> 	>$^%<====	>s   HH# #H<r   c           	      8   d }t          t          dd dd           }	 |D ]5}	t          |t          t          z  |	t          |	          t          d            6t                      }
t          |
          |
_	        ||
_
        t          |
          }t          t                                }t          ||           |j        }t          | ||||||           |rt!          |           t#          |d           d S # |rt!          |           t#          |d           w xY w)Nr   )r   r   r   r   r   r   r   rl   r   r7   rt   r   HCERTCHAINENGINE CertCreateCertificateChainEnginer   r   CertFreeCertificateChainEnginer   )r   r   r   r   r   r   r   r   hRootCertStorer   cert_chain_engine_configpConfigphChainEngines                r,   r   r     s[    L"#91dAtLLN&*) 	 	J,!$77J+    $<#=#= *01I*J*J '2@ /233 0 2 233(	
 	
 	
 %- 	#"	
 	
 	
  	9*<888~q)))))  	9*<888~q))))s   B7C6 6#Dctxc              #      K   | j         }| j        }d| _         t          | t          j                   	 d V  || _         t          | |           d S # || _         t          | |           w xY w)NF)r   r   r   r   r   )r   r   r   s      r,   _configure_contextr      s|      'N/KC cm4447+$S+66666 ,$S+6666s   A A)r   )m
contextlibr   typingctypesr   r   r   r   r   r	   r
   r   r   r   r   r   ctypes.wintypesr   r   r   r   r   r   r   r   r   r   r   r   _ssl_constantsr   r   r(   HCRYPTPROV_LEGACYr   rL   PCCERT_CONTEXTr.   rM   r2   r6   PCERT_CHAIN_PARArA   rE   rT   rO   r[   rV   r   PCCERT_CHAIN_CONTEXTr]   rb   PCERT_CHAIN_POLICY_PARArf   PCERT_CHAIN_POLICY_STATUSrl   PCERT_CHAIN_ENGINE_CONFIGPHCERTCHAINENGINEr   r   r   r   USAGE_MATCH_TYPE_ORr   r   r   1CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS7CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG'CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAGr   )CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG,CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG.CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS%CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG%CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAGr   r   r   r   r   wincryptkernel32boolr   r   argtypeserrcheckr   restyper   r   r   r   r   r   r   r   r   
SSLContextlistbytesstrr   intr   r   contextmanagerIteratorr   r*   r+   r,   <module>r      s       



                                                            & % % % % % % % 8 8 8 8 8 8 
     9    %%''    	    W.//     y       i     0/w//    	   	 	 	 	 	 	 	 	 g011 	 	 	 	 		 	 	 	 W.// 
 
 
 
 
 
 
 
 g011 w233     y       Y    "'"899     y    $G$<==     y   $ $G$<== G,--    "   "(#788 '1 $$. !4> 1:D 7*4 '-7 *,6 )/9 ,1; .(2 %(2 % '  *  6=>-. 11 0	0
 33 55 ,, ,, ) 6-  6.!!d s # #     $,#L  -   ) ->   )& %):E8L " * #+#L  			-   ) ,0   ('D ).%(@  %'4  $(9  %": 		$    #'  #4   #+#L  	-   ) ,0   ((%u-  + #< %8$:  !%@ '4&6  #!)!H +;*=  '(			
	    #'O5 O5O5UO5 4ZO5 
	O5 O5 O5 O5dU>U>"T)U> 'U> 	U>
 !U> 4ZU> U> 
U> U> U> U>p1*1*%[1* '1* 	1*
 !1* 4Z1* 1* 
1* 1* 1* 1*h 	7CN 	7vt/D 	7 	7 	7 	7 	7 	7r+   