U
    c                     @   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   </tmp/pip-unpacked-wheel-c04l8219/oscrypto/_win/trust_list.pyr      s    Fc           !      C   s:  i }i }t j  }dD ]}tt |}t| t }t||}t|rPqt|}d}	d}
d}|j	t
jkrrq8t|jt|j}
t|
 }||krq8d||< t|j}t|j}z0t j |}||kr| r| t|
d W q8W n ttfk
r   Y nX t|j}z4t j |}||k r@| r<| t|
d W q8W nb ttfk
r } z>|dk r|jd d t| }|f|jd	d  |_|W 5 d}~X Y nX t }t }ttd
d}t |t
j!t |}t" \}}|s|t
j#krt| |t
j#krd}	nt$t%|}t |t
j!t&td||}t| t'td|}t|}|j(dkrl| r8| t|
d q8t)td|j*|j(}|D ]}|+|,d qd}|	st|
}|j-r|j-D ] }|j.}||kr|+| q| r|s|dkrt|
}| |d |
||f||< q8t/|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CAFNTznot yet validzno longer validr   z - r   zDWORD *zCERT_ENHKEY_USAGE *ZCERT_ENHKEY_USAGEzexplicitly distrustedZLPCSTRascii)1datetimeutcnowr   ZCertOpenSystemStoreWr   r   ZCertEnumCertificatesInStorer   r   ZdwCertEncodingTyper   ZX509_ASN_ENCODINGr
   ZpbCertEncodedintZcbCertEncodedhashlibsha1digestZ	pCertInfo_convert_filetime_to_timestampZ	NotBeforefromtimestampr   load
ValueErrorOSErrorZNotAfterargsr   setr   ZCertGetEnhancedKeyUsageZ%CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAGr   ZCRYPT_E_NOT_FOUNDr	   r   r   r   ZcUsageIdentifierr   ZrgpszUsageIdentifieradddecodeZextended_key_usage_valueZdottedZCertCloseStorevalues)!Zcert_callbackZcallback_only_on_failureZcertificates	processednowstoreZstore_handleZcontext_pointercontextZ	trust_alldatar$   Z	cert_infoZnot_before_secondsZ
not_beforeZnot_after_secondsZ	not_afteremessageZ
trust_oidsZreject_oidsZto_readresZ
error_code_Zusage_bufferZkey_usage_pointerZ	key_usageZoidsoidcertZ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packZdwHighDateTimeZdwLowDateTime)ZfiletimeZhundreds_nano_secondsZseconds_since_1601r   r   r   r%      s    r%   )NF) 
__future__r   r   r   r   r   r"   r;   Z_asn1r   Z_ffir   r	   r
   r   r   r   r   r   r   r   Z_crypt32r   r   r   r   _typesr   __all__r   r   r%   r   r   r   r   <module>   s   0
 *