o
    vh                     @   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 g dZe jG dd	 d	e jZeeeeejf Zd
ede
e f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dedef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	timestampevidencerecord	publicKey
signedDataotherc                 C      d| j  S )Nz!urn:etsi:019102:validationObject:valueself r!   [/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/pyhanko_certvalidator/ltv/poe.pyurn#   s   zValidationObjectType.urnN)__name__
__module____qualname____doc__CERTIFICATEr   OCSP_RESPONSE	TIMESTAMPEVIDENCE_RECORD
PUBLIC_KEYSIGNED_DATAOTHERr#   r!   r!   r!   r"   r      s    r   thingreturnc                 C   s6   t | trtjS t | trtjS t | tjrtjS d S N)	
isinstancer   r   r   r   r)   r   Certificater(   )r/   r!   r!   r"   guess_validation_object_type*   s   

r4   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   6   s   
 r   c                   @   s*   e Zd ZdZdZdZedefddZdS )r   provided
validationpolicyr0   c                 C   r   )Nzurn:etsi:019102:poetype:r   r   r!   r!   r"   r#   U   s   zPOEType.urnN)	r$   r%   r&   PROVIDED
VALIDATIONPOLICYpropertystrr#   r!   r!   r!   r"   r   O   s    r   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   r7   bytesr   rC   r   r   r!   r!   r!   r"   r   Z   s
   
 r   datac                 C   s   t |  S r1   )hashlibsha256rA   )rE   r!   r!   r"   r   b   s   r   c                	   @   s   e Zd ZdZddee fddZ	ddededee d	e	fd
dZ
	ddededee d	e	fddZde	d	e	fddZd	ee	 fddZded	ef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 r1   )_poes_current_dt_override)r    rH   r!   r!   r"   __init__n   s   
zPOEManager.__init__rE   r@   dtr0   c                 C   s   t |tr|}n#t |tjr| }nt |tr|j }nt |tr)|j }nt	t
|}|p9| jp9ttj}t|}d}|rHt||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)r6   r   r@   rA   rB   rC   )r2   rD   r
   	Asn1Valuedumpr   crl_datar   ocsp_response_dataNotImplementedErrorr   rJ   r   nowr   utcr4   r   register_known_poer   )r    rE   r@   rL   b_datarA   vo_typevor!   r!   r"   registerr   s.   



zPOEManager.registerrA   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.
        NrM   )rJ   r   rS   r   rT   rU   r   )r    rA   r@   rL   r!   r!   r"   register_by_digest   s   zPOEManager.register_by_digest	known_poec                 C   sL   |j }|j}z| j| }|j |kr|W S W n	 ty   Y nw || 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.
        )rB   rA   rI   KeyError)r    r[   rL   rA   cur_poer!   r!   r"   rU      s   	


zPOEManager.register_known_poec                 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.
        )iterrI   valuesr   r!   r!   r"   __iter__   s   zPOEManager.__iter__itemc                 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)r@   rL   )rY   r   r<   rB   )r    ra   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)r2   r   	TypeErrorr^   rU   )r    r   poer!   r!   r"   __ior__   s
   
zPOEManager.__ior__c                 C   s   t | jd}t| j|_|S )N)rH   )r   rJ   dictrI   )r    new_instancer!   r!   r"   __copy__   s   zPOEManager.__copy__r1   )r$   r%   r&   r'   r   r   rK   KnownObjectTyper   r   rY   rD   rZ   rU   r   r`   rb   re   rh   r!   r!   r!   r"   r   f   s8    
0
	
r   ) enumrF   dataclassesr   r   r   typingr   r   r   r   r	   
asn1cryptor
   r   &pyhanko_certvalidator.revinfo.archivalr   r   __all__uniqueEnumr   rD   r3   ri   objectr4   r   r   r   r   r   r!   r!   r!   r"   <module>   s0    


