U
    ;g                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
mZ d dlmZmZ d dlmZmZ ddd	d
ddgZe jG dd de jZeeeeejf Zee
e dddZeddG dd dZe jG dd	 d	e jZeddG dd
 d
ZeedddZG dd dZdS )    N)	dataclass)datetimetimezone)AnyDictIteratorOptionalUnion)corex509)CRLContainerOCSPContainerValidationObjectTypeValidationObjectPOETypeKnownPOE
POEManagerdigest_for_poec                   @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
d ZdS )r   zF
    Types of validation objects recognised by ETSI TS 119 102-2.
    certificateCRLOCSPResponse	timestampZevidencerecordZ	publicKeyZ
signedDataotherc                 C   s   d| j  S )Nz!urn:etsi:019102:validationObject:valueself r   A/tmp/pip-unpacked-wheel-hgp_x7fx/pyhanko_certvalidator/ltv/poe.pyurn$   s    zValidationObjectType.urnN)__name__
__module____qualname____doc__CERTIFICATEr   OCSP_RESPONSE	TIMESTAMPZEVIDENCE_RECORDZ
PUBLIC_KEYZSIGNED_DATAOTHERr   r   r   r   r   r      s   )thingreturnc                 C   s6   t | trtjS t | tr tjS t | tjr2tjS d S N)	
isinstancer   r   r   r   r%   r   Certificater$   )r(   r   r   r   guess_validation_object_type+   s    

r-   T)frozenc                   @   s"   e Zd ZU dZeed< eed< dS )r   z
    A validation object used in the course of a validation operation
    for which proofs of existence can potentially be gathered.
    object_typer   N)r    r!   r"   r#   r   __annotations__r   r   r   r   r   r   7   s   
c                   @   s*   e Zd ZdZdZdZeedddZdS )r   providedZ
validationpolicyr)   c                 C   s   d| j  S )Nzurn:etsi:019102:poetype:r   r   r   r   r   r   V   s    zPOEType.urnN)	r    r!   r"   ZPROVIDED
VALIDATIONZPOLICYpropertystrr   r   r   r   r   r   P   s
   c                   @   s6   e Zd ZU eed< eed< eed< dZee	 ed< dS )r   poe_typedigestpoe_timeNvalidation_object)
r    r!   r"   r   r0   bytesr   r:   r   r   r   r   r   r   r   [   s   
)datar)   c                 C   s   t |  S r*   )hashlibsha256r8   )r<   r   r   r   r   c   s    c                   @   s   e Zd ZdZdee dddZdeeee e	dddZ
deeee e	d	d
dZe	e	dddZee	 dddZeedddZdd Zdd ZdS )r   z~
    Class to manage proof-of-existence (POE) claims.

    :param current_dt_override:
        Override the current time.
    Ncurrent_dt_overridec                 C   s   i | _ || _d S r*   )_poes_current_dt_override)r   r@   r   r   r   __init__o   s    zPOEManager.__init__)r<   r7   dtr)   c                 C   s   t |tr|}nFt |tjr&| }n0t |tr<|j }nt |trR|j }nt	t
|}|pr| jprttj}t|}d}|rt||d}| t||||dS )ao  
        Register a new POE claim if no POE for an earlier time is available.

        :param data:
            Data to register a POE claim for.
        :param poe_type:
            The type of POE.
        :param dt:
            The POE time to register. If ``None``, assume the current time.
        :return:
            The oldest POE datetime available.
        N)r/   r   r7   r8   r9   r:   )r+   r;   r
   Z	Asn1Valuedumpr   Zcrl_datar   Zocsp_response_dataNotImplementedErrorr   rB   r   nowr   utcr-   r   register_known_poer   )r   r<   r7   rD   Zb_datar8   Zvo_typeZvor   r   r   registers   s.    



zPOEManager.register)r8   r7   rD   r)   c                 C   s,   |p| j pttj}| t|||ddS )a  
        Register a new POE claim if no POE for an earlier time is available.

        :param digest:
            SHA-256 digest of the data to register a POE claim for.
        :param dt:
            The POE time to register. If ``None``, assume the current time.
        :param poe_type:
            The type of POE.
        :return:
            The oldest POE datetime available.
        NrE   )rB   r   rH   r   rI   rJ   r   )r   r8   r7   rD   r   r   r   register_by_digest   s    zPOEManager.register_by_digest)	known_poer)   c                 C   sN   |j }|j}z| j| }|j |kr(|W S W n tk
r>   Y nX || j|< |S )z
        Register a new POE claim if no POE for an earlier time is available.

        :param known_poe:
            The POE object to register.
        :return:
            The oldest POE for the given digest.
        )r9   r8   rA   KeyError)r   rM   rD   r8   Zcur_poer   r   r   rJ      s    	



zPOEManager.register_known_poer3   c                 C   s   t | j S )z
        Iterate over the current earliest known POE for all items currently
        being managed.

        Returns an iterator with :class:`KnownPOE` objects.
        )iterrA   valuesr   r   r   r   __iter__   s    zPOEManager.__iter__)itemr)   c                 C   s   | j |tjddjS )a  
        Return the earliest available POE for an item.

        .. note::
            This is a wrapper around :meth:`register` with `dt=None`, and hence
            will register the current time as the POE time for the given item.
            This side effect is intentional.

        :param item:
            Item to get the current POE time for.
        :return:
            A datetime object representing the earliest available POE for the
            item.
        N)r7   rD   )rK   r   r4   r9   )r   rR   r   r   r   __getitem__   s
      zPOEManager.__getitem__c                 C   s*   t |tstt|D ]}| | qdS )ze
        Combine data in another POE manager with the POEs managed by this
        instance.
        N)r+   r   	TypeErrorrO   rJ   )r   r   Zpoer   r   r   __ior__   s    
zPOEManager.__ior__c                 C   s   t | jd}t| j|_|S )Nr?   )r   rB   dictrA   )r   Znew_instancer   r   r   __copy__   s    zPOEManager.__copy__)N)N)N)r    r!   r"   r#   r   r   rC   KnownObjectTyper   r   rK   r;   rL   rJ   r   rQ   rS   rU   rW   r   r   r   r   r   g   s*    0 	
) enumr=   dataclassesr   r   r   typingr   r   r   r   r	   Z
asn1cryptor
   r   Z&pyhanko_certvalidator.revinfo.archivalr   r   __all__uniqueEnumr   r;   r,   rX   objectr-   r   r   r   r   r   r   r   r   r   <module>   s6   

