U
    8hIF                  	   @   s6  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
 d
eZ"ee"Z#ee#Z$G dd deZ%ee%Z&G dd deZ'G dd deZ(er ee( Z)nee(Z)G dd deZ*G dd deZ+ee+Z,G dd deZ-ee-Z.G dd deZ/ee/Z0ee0Z1G dd deZ2G dd deZ3ee3Z4G dd deZ5ee5Z6G dd  d eZ7ee7Z8e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/ZJd0ZKd#ZLd1ZMd0ZNd2ZOeBeCB eDB eEB eFB eGB eHB eIB eJB ZPed3ZQed4ZReSeeed5d6d7ZTeQjUZUe8e9feU_VeTeU_WeQjXZXeee!ee
feX_Ve eX_YeTeX_WeQjZZZe eeeee$feZ_VeeZ_YeQj[Z[eeefe[_Ve#e[_YeTe[_WeQj\Z\ee#ee e)ee
e1fe\_Vee\_YeTe\_WeQj]Z]e	e0e4e6fe]_Vee]_YeQj^Z^e efe^_Vee^_YeTe^_WeQj_Z_e0fe__VeQj`Z`e#fe`_VeQjaZaefea_VeRjbZbeeeeeee
feb_Veeb_YdDejcedee efdB dd8d9d:ZgejcedB e e
e)efdB ehdd;d<d=Ziejcedee e e
e)efdB ehdd>d?d@Zje jkejcejld dAdBdCZmdS )E    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                   @   s.   e Zd ZdefdefdefdefdeffZdS )CERT_CONTEXTZdwCertEncodingTypeZpbCertEncodedZcbCertEncodedZ	pCertInfoZ
hCertStoreN)__name__
__module____qualname__r   r	   
HCERTSTORE_fields_ r#   r#   ]C:\Users\jeffr\AppData\Local\Temp\pip-install-hfyjq797\pip\pip\_vendor\truststore\_windows.pyr   '   s   r   c                   @   s    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   
r%   c                   @   s   e Zd ZdefdeffZdS )CERT_USAGE_MATCHZdwTypeUsageN)r   r   r    r   r%   r"   r#   r#   r#   r$   r(   ?   s   r(   c                
   @   sF   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RequestedUsageZRequestedIssuancePolicydwUrlRetrievalTimeoutZfCheckRevocationFreshnessTimedwRevocationFreshnessTimeZpftCacheResyncZpStrongSignParaZdwStrongSignFlagsN)	r   r   r    r   r(   r   r   r	   r"   r#   r#   r#   r$   r*   F   s   r*   c                   @   s   e Zd ZdefdeffZdS )CERT_TRUST_STATUSZdwErrorStatusZdwInfoStatusN)r   r   r    r   r"   r#   r#   r#   r$   r/   Z   s   r/   c                   @   s:   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_ELEMENTr+   pCertContextTrustStatusZpRevocationInfoZpIssuanceUsageZpApplicationUsageZpwszExtendedErrorInfoN)
r   r   r    r   PCERT_CONTEXTr/   r	   PCERT_ENHKEY_USAGEr   r"   r#   r#   r#   r$   r0   a   s   r0   c                   @   s>   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_CHAINr+   r2   ZcElementZ
rgpElementZpTrustListInfofHasRevocationFreshnessTimer.   N)
r   r   r    r   r/   r   PCERT_CHAIN_ELEMENTr	   r   r"   r#   r#   r#   r$   r5   p   s   
r5   c                	   @   sD   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_CONTEXTr+   r2   ZcChainZrgpChainZcLowerQualityChainContextZrgpLowerQualityChainContextr6   r.   N)
r   r   r    r   r/   r   PCERT_SIMPLE_CHAINr	   r   r"   r#   r#   r#   r$   r8      s   
r8   c                   @   s(   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_PARAr+   
dwAuthType	fdwCheckspwszServerNameN)r   r   r    r   r   r"   r#   r#   r#   r$   r:      s
   r:   c                   @   s"   e Zd ZdefdefdeffZdS )CERT_CHAIN_POLICY_PARAr+   dwFlagspvExtraPolicyParaN)r   r   r    r   r	   r"   r#   r#   r#   r$   r>      s   r>   c                   @   s.   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_STATUSr+   dwErrorZlChainIndexlElementIndexZpvExtraPolicyStatusN)r   r   r    r   r   r	   r"   r#   r#   r#   r$   rA      s   rA   c                   @   s^   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_CONFIGr+   ZhRestrictedRootZhRestrictedTrustZhRestrictedOtherZcAdditionalStoreZrghAdditionalStorer?   r-   ZMaximumCachedCertificatesZCycleDetectionModulushExclusiveRootZhExclusiveTrustedPeopleZdwExclusiveFlagsN)r   r   r    r   r!   r	   r"   r#   r#   r#   r$   rD      s   rD   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                 C   s   | s
t  |S )Nr   )rN   rO   rP   r#   r#   r$   _handle_win_error   s    rR   )ssl_context
cert_chainserver_hostnamerQ   c                 C   s  |st dd}ttdddd}zJ|dd D ]}t|ttB |t	|t
d q2|d }tttB |t	|}t }d|_td t|_t }||_t }	||	_t|	|	_t|	}
| jt j@ rt}n| jt j@ rt}nd}zt| d|||
||d W nv t jk
rj } zT| jdd}|rXzt| ||||
||d W n t jk
rT   |dY nX n W 5 d}~X Y nX W 5 t|d |rt| X dS )z9Verify the cert_chain from the server using Windows APIs.z#Peer sent no certificates to verifyNr   r   )chain_flagsT)binary_form) sslSSLCertVerificationErrorCertOpenStoreCERT_STORE_PROV_MEMORYCertCloseStoreCertFreeCertificateContext CertAddEncodedCertificateToStoreX509_ASN_ENCODINGPKCS_7_ASN_ENCODINGlenCERT_STORE_ADD_USE_EXISTINGCertCreateCertificateContextr%   r&   r   OID_PKIX_KP_SERVER_AUTHr'   r(   r)   r*   r,   r   r+   r   verify_flagsVERIFY_CRL_CHECK_CHAIN!CERT_CHAIN_REVOCATION_CHECK_CHAINVERIFY_CRL_CHECK_LEAF$CERT_CHAIN_REVOCATION_CHECK_END_CERT_get_and_verify_cert_chainget_ca_certs_verify_using_custom_ca_certs)rS   rT   rU   r1   hIntermediateCertStore
cert_bytesZ	leaf_certZcert_enhkey_usageZcert_usage_matchZchain_params
pChainPararV   ecustom_ca_certsr#   r#   r$   _verify_peercerts_implC  s    	

  

	


rr   )rS   hChainEnginerm   pPeerCertContextro   rU   rV   rQ   c              	   C   sb  d }zDtt }t||d |||d | |j}t }	t|	|	_t|	_	d|	_
| jdkrZt|	_
|rht||	_t }
tt|	t|
_| jtjkr|
 jtO  _t|
|
_t|
}t }t||_t|}tt||| |j}|rHtd}tttB d |d|t|d }|dkr"d|dd|j  d}n
|j!" }t#|}||_$||_%|d W 5 |r\t |j X d S )Nr   Fi   zCertificate chain policy error z#xz [])&CertFreeCertificateChaincontentsr   PCERT_CHAIN_CONTEXTCertGetCertificateChainr:   r   r+   AUTHTYPE_SERVERr;   r<   check_hostname$SECURITY_FLAG_IGNORE_CERT_CN_INVALIDr
   r=   r>   r   r	   r@   verify_moderX   	CERT_NONEr?   (CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGSrA    CertVerifyCertificateChainPolicyCERT_CHAIN_POLICY_SSLrB   r   FormatMessageWFORMAT_MESSAGE_FROM_SYSTEMFORMAT_MESSAGE_IGNORE_INSERTSrC   valuestriprY   Zverify_messageZverify_code)rS   rs   rm   rt   ro   rU   rV   ZppChainContextZpChainContextZ ssl_extra_cert_chain_policy_paraZchain_policyZpPolicyParaZpolicy_statusZpPolicyStatusZ
error_codeZerror_message_bufZerror_message_charserror_messageerrr#   r#   r$   rj     s    	



 





rj   )rS   rq   rm   rt   ro   rU   rV   rQ   c              	   C   s   d }t tdd dd }zt|D ]}	t|ttB |	t|	td  qt	 }
t
|
|
_||
_t|
}tt }t|| |j}t| |||||| W 5 |rt| t|d X d S )Nr   )rZ   r[   CertFreeCertificateChainEnginer\   r^   r_   r`   ra   rb   rD   r   r+   rE   r   HCERTCHAINENGINE CertCreateCertificateChainEnginerw   rj   )rS   rq   rm   rt   ro   rU   rV   rs   ZhRootCertStorern   Zcert_chain_engine_configZpConfigZphChainEnginer#   r#   r$   rl     sD    	


rl   )ctxrQ   c              	   c   s@   | j }| j}d| _ t| tj z
d V  W 5 || _ t| | X d S )NF)r{   r}   r   rX   r~   )r   r{   r}   r#   r#   r$   _configure_context-  s    
r   )N)n
contextlibrX   typingctypesr   r   r   r   r   r   r	   r
   r   r   r   r   Zctypes.wintypesr   r   r   r   r   r   r   r   r   r   r   r   Z_ssl_constantsr   r   r!   ZHCRYPTPROV_LEGACYr   r3   ZPCCERT_CONTEXTr%   r4   r(   r*   ZPCERT_CHAIN_PARAr/   r0   r7   r5   r9   r8   rx   ZPCCERT_CHAIN_CONTEXTr:   r>   ZPCERT_CHAIN_POLICY_PARArA   ZPCERT_CHAIN_POLICY_STATUSrD   ZPCERT_CHAIN_ENGINE_CONFIGZPHCERTCHAINENGINEr_   r`   r[   rb   ZUSAGE_MATCH_TYPE_ORrd   ri   rg   Z1CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGSZ7CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAGZ'CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAGZ*CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAGZ)CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAGZ,CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAGZ.CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGSZ%CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAGZ%CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAGr|   rz   r   r   r   r   Zwincryptkernel32boolrR   r   argtypeserrcheckrZ   restyper^   rc   ry   r   r\   rv   r]   r   r   
SSLContextlistbytesstrrr   intrj   rl   contextmanagerIteratorr   r#   r#   r#   r$   <module>   sP  00

	


	 ][4