o
    Œõ±jÐ  ã                   @   s¶   d dl mZmZmZmZ d dlZd dlZd dl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 ddlmZ d	d
gZdd
„ Zddd	„Zdd„ ZdS )é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNé   )ÚCertificate)
Úarray_from_pointerÚbuffer_from_bytesÚbytes_from_bufferÚcastÚderefÚis_nullÚnewÚnullÚstruct_from_bufferÚunwrapé   )Úcrypt32ÚCrypt32ConstÚ	get_errorÚhandle_error)Ústr_clsÚextract_from_systemÚsystem_pathc                   C   s   d S )N© r   r   r   ú‹/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/oscrypto/_win/trust_list.pyr      s   Fc           !      C   s.  i }i }t j  ¡ }dD �]†}t tƒ |¡}t|ƒ tƒ }	 t ||¡}t|ƒr)�n]t|ƒ}d}	d}
d}|j	t
jkr:qt|jt|jƒƒ}
t |
¡ ¡ }||v rOqd||< t|jƒ}t|jƒ}zt j  |¡}||krt| rr| t |
¡dƒ W qW n ttfy€   Y nw t|jƒ}zt j  |¡}||k r�| r›| t |
¡dƒ W qW n0 ttfyÎ } z"|dk rÄ|jd d t|ƒ }|f|jd	d…  |_|‚W Y d}~nd}~ww tƒ }tƒ }ttd
dƒ}t  |t
j!tƒ |¡}t"ƒ \}}|sõ|t
j#krõt|ƒ |t
j#krýd}	nJt$t%|ƒƒ}t  |t
j!t&td|ƒ|¡}t|ƒ t'td|ƒ}t|ƒ}|j(dk�r0| �r/| t |
¡dƒ qt)td|j*|j(ƒ}|D ]}| +| ,d¡¡ �q;d}|	�sit |
¡}|j-�ri|j-D ]}|j.}||v�rg| +|¡ �qX| �r~|�s~|du �ryt |
¡}| |dƒ |
||f||< qt /|d¡} t| ƒ d}q| 0¡ S )aÅ  
    Extracts trusted CA certificates from the Windows certificate store

    :param cert_callback:
        A callback that is called once for each certificate in the trust store.
        It should accept two parameters: an asn1crypto.x509.Certificate object,
        and a reason. The reason will be None if the certificate is being
        exported, otherwise it will be a unicode string of the reason it won't.

    :param callback_only_on_failure:
        A boolean - if the callback should only be called when a certificate is
        not exported.

    :raises:
        OSError - when an error is returned by the OS crypto library

    :return:
        A list of 3-element tuples:
         - 0: a byte string of a DER-encoded certificate
         - 1: a set of unicode strings that are OIDs of purposes to trust the
              certificate for
         - 2: a set of unicode strings that are OIDs of purposes to reject the
              certificate for
    )ÚROOTÚCATFNznot yet validzno longer validr   z - r   zDWORD *zCERT_ENHKEY_USAGE *ÚCERT_ENHKEY_USAGEzexplicitly distrustedÚLPCSTRÚascii)1ÚdatetimeÚutcnowr   ÚCertOpenSystemStoreWr   r   ÚCertEnumCertificatesInStorer   r   ÚdwCertEncodingTyper   ÚX509_ASN_ENCODINGr
   ÚpbCertEncodedÚintÚcbCertEncodedÚhashlibÚsha1ÚdigestÚ	pCertInfoÚ_convert_filetime_to_timestampÚ	NotBeforeÚfromtimestampr   ÚloadÚ
ValueErrorÚOSErrorÚNotAfterÚargsr   Úsetr   ÚCertGetEnhancedKeyUsageÚ%CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAGr   ÚCRYPT_E_NOT_FOUNDr	   r   r   r   ÚcUsageIdentifierr   ÚrgpszUsageIdentifierÚaddÚdecodeÚextended_key_usage_valueÚdottedÚCertCloseStoreÚvalues)!Úcert_callbackÚcallback_only_on_failureÚcertificatesÚ	processedÚnowÚstoreÚstore_handleÚcontext_pointerÚcontextÚ	trust_allÚdatar,   Ú	cert_infoÚnot_before_secondsÚ
not_beforeÚnot_after_secondsÚ	not_afterÚeÚmessageÚ
trust_oidsÚreject_oidsÚto_readÚresÚ
error_codeÚ_Úusage_bufferÚkey_usage_pointerÚ	key_usageÚoidsÚoidÚcertÚcert_oidÚresultr   r   r   r   #   sÒ   



ýü
ýý€úü
	

üü



€


„~c                 C   s.   t  dt  d| j| j¡¡d }|d }|d S )a  
    Windows returns times as 64-bit unsigned longs that are the number
    of hundreds of nanoseconds since Jan 1 1601. This converts it to
    a datetime object.

    :param filetime:
        A FILETIME struct object

    :return:
        An integer unix timestamp
    s   >Qs   >LLr   i€–˜ l    !l
 )ÚstructÚunpackÚpackÚdwHighDateTimeÚdwLowDateTime)ÚfiletimeÚhundreds_nano_secondsÚseconds_since_1601r   r   r   r.   Ì   s   ýþùr.   )NF) Ú
__future__r   r   r   r   r!   r*   rb   Ú_asn1r   Ú_ffir   r	   r
   r   r   r   r   r   r   r   Ú_crypt32r   r   r   r   Ú_typesr   Ú__all__r   r   r.   r   r   r   r   Ú<module>   s   0þ
 *