o
    &zhl7                  
   @   s  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
 d dlmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZ g d	ZG d
d dejZeddG dd dZG dd dee jZe	dedZdee dee fddZdd Z dee dee dededef
ddZ!deej" fd d!Z#eddG d"d# d#eZ$eddG d$d% d%eZ%e
e&ej'e%f Z(e
e&ej)e$f Z*d&ee( dee% fd'd(Z+d)ee* dee$ fd*d+Z,dS ),    N)	dataclass)datetime)IterableListOptionalTypeVarUnion)algoscrlocsp)	type_name)IssuedItemContainerValidationTimingParams)#FRESHNESS_FALLBACK_VALIDITY_DEFAULTCertRevTrustPolicyFreshnessReqType)RevinfoUsabilityRatingRevinfoUsabilityRevinfoContainerOCSPContainerCRLContainersort_freshest_firstprocess_legacy_crl_inputprocess_legacy_ocsp_inputc                   @   sJ   e Zd ZdZe Z	 e Z	 e Z	 e Z		 e
defddZdS )r   zz
    Description of whether a piece of revocation information
    is considered usable in the circumstances provided.
    returnc                 C   s   | t jt jfv S )zs
        Boolean indicating whether the assigned rating corresponds to
        a "fresh" judgment in AdES.
        )r   OKTOO_NEWself r   a/var/www/html/kangema/venv/lib/python3.10/site-packages/pyhanko_certvalidator/revinfo/archival.pyusable_ades=   s   z"RevinfoUsabilityRating.usable_adesN)__name__
__module____qualname____doc__enumautor   STALEr   UNCLEARpropertyboolr!   r   r   r   r    r      s    r   T)frozenc                   @   s,   e Zd ZU dZeed< 	 dZee ed< dS )r   z`
    Usability rating and cutoff date for a particular piece of
    revocation information.
    ratingNlast_usable_at)	r"   r#   r$   r%   r   __annotations__r.   r   r   r   r   r   r    r   J   s   
 r   c                   @   s>   e Zd ZdZdededefddZede	e
j fddZd	S )
r   z<
    A container for a piece of revocation information.
    policytiming_paramsr   c                 C      t )af  
        Assess the usability of the revocation information given a
        revocation information trust policy and timing parameters.

        :param policy:
            The revocation information trust policy.
        :param timing_params:
            Timing-related information.
        :return:
            A :class:`.RevinfoUsability` judgment.
        NotImplementedError)r   r0   r1   r   r   r    	usable_atb   s   zRevinfoContainer.usable_atc                 C   r2   )z
        Extract the signature mechanism used to guarantee the authenticity
        of the revocation information, if applicable.
        r3   r   r   r   r    revinfo_sig_mechanism_usedr   s   z+RevinfoContainer.revinfo_sig_mechanism_usedN)r"   r#   r$   r%   r   r   r   r5   r*   r   r	   SignedDigestAlgorithmr6   r   r   r   r    r   ]   s    
r   RevInfoType)boundlstr   c                 C   s   dt fdd}t| |ddS )aV  
    Sort a list of revocation information containers in freshest-first order.

    Revocation information that does not have a well-defined issuance date
    will be grouped at the end.

    :param lst:
        A list of :class:`.RevinfoContainer` objects of the same type.
    :return:
        The same list sorted from fresh to stale.
    	containerc                 S   s   | j }|d u|fS N)issuance_date)r;   dtr   r   r    _key   s   z!sort_freshest_first.<locals>._keyT)keyreverse)r   sorted)r:   r?   r   r   r    r      s   
r   c                 C   s>   | j }|d u r|d ur||kr|| }|d urt|| }|S r<   )	freshnessabs)r0   this_updatenext_updatetime_tolerancefreshness_deltar   r   r    _freshness_delta   s   rI   rE   rF   r0   r1   c           	      C   s&  | d u r	t tjS |j}|j}|jtjkr8t|| ||}|d u r%t tjS |j	}| | |k r7t tj
| | dS nV|jtjkr^t|| ||}|d u rNt tjS | || k r]t tj
| | dS n0|jtjkr|d u rl| t }|j}|s||| | k r|t tjS ||| krt tj
|| dS ntt tjS )N)r.   )r   r   r)   validation_timerG   freshness_req_typer   TIME_AFTER_SIGNATURErI   best_signature_timer(   MAX_DIFF_REVOCATION_VALIDATIONDEFAULTr   retroactive_revinfor   r4   r   )	rE   rF   r0   r1   rJ   rG   rH   signature_poe_timeretroactiver   r   r    _judge_revinfo   sZ   




rS   c                 C   s:   | d j }|dkrd S | d }|d j dkrd S |d jS )Nresponse_status
successfulresponse_bytesresponse_typebasic_ocsp_responseresponse)nativeparsed)ocsp_responsestatusrV   r   r   r    _extract_basic_ocsp_response   s   

r^   c                   @   s   e Zd ZU dZejed< 	 dZeed< 	 e	dejde
d  fddZedee fd	d
ZdededefddZdeej fddZdeej fddZedeej fddZdS )r   z)
    Container for an OCSP response.
    ocsp_response_datar   indexr\   r   c                    s:   t  }|du r
g S |d } fddtt|d D S )a  
        Turn an OCSP response object into one or more :class:`.OCSPContainer`
        objects. If a :class:`.OCSPContainer` contains more than one
        ``SingleResponse``, then the same OCSP response will be duplicated
        into multiple containers, each with a different ``index`` value.

        :param ocsp_response:
            An OCSP response.
        :return:
            A list of :class:`.OCSPContainer` objects, one for each
            ``SingleResponse`` value.
        Ntbs_response_datac                    s   g | ]}t  |d qS ))r_   r`   )r   ).0ixr\   r   r    
<listcomp>)  s    
z,OCSPContainer.load_multi.<locals>.<listcomp>	responses)r^   rangelen)clsr\   rX   tbs_responser   rd   r    
load_multi  s   
zOCSPContainer.load_multic                 C   s   |   }|d u r
d S |d jS )NrE   )extract_single_responserZ   )r   cert_responser   r   r    r=   .  s   
zOCSPContainer.issuance_dater0   r1   c                 C   s>   |   }|d u rttjS |d j}|d j}t||||dS )NrE   rF   r0   r1   )rl   r   r   r)   rZ   rS   )r   r0   r1   rm   rE   rF   r   r   r    r5   6  s   


zOCSPContainer.usable_atc                 C   s
   t | jS )z
        Extract the ``BasicOCSPResponse``, assuming there is one (i.e.
        the OCSP response is a standard, non-error response).
        )r^   r_   r   r   r   r    extract_basic_ocsp_responseF  s   
z)OCSPContainer.extract_basic_ocsp_responsec                 C   s@   |   }|du r
dS |d }t|d | jkrdS |d | j S )z^
        Extract the unique ``SingleResponse`` value identified by the
        index.
        Nra   rf   )ro   rh   r`   )r   rX   rj   r   r   r    rl   N  s   z%OCSPContainer.extract_single_responsec                 C   s   |   }|d u r
d S |d S Nsignature_algorithm)ro   )r   
basic_respr   r   r    r6   ]  s   z(OCSPContainer.revinfo_sig_mechanism_usedN)r"   r#   r$   r%   r   OCSPResponser/   r`   intclassmethodr   rk   r*   r   r   r=   r   r   r   r5   BasicOCSPResponsero   SingleResponserl   r	   r7   r6   r   r   r   r    r     s6   
 

r   c                   @   s^   e Zd ZU dZejed< 	 dedede	fddZ
edee fdd	Zedejfd
dZdS )r   z<
    Container for a certificate revocation list (CRL).
    crl_datar0   r1   r   c                 C   s.   | j d }|d j}|d j}t||||dS )Ntbs_cert_listrE   rF   rn   )rx   rZ   rS   )r   r0   r1   ry   rE   rF   r   r   r    r5   p  s   


zCRLContainer.usable_atc                 C   s   | j d }|d jS )Nry   rE   )rx   rZ   )r   ry   r   r   r    r=   z  s   

zCRLContainer.issuance_datec                 C   s
   | j d S rp   )rx   r   r   r   r    r6     s   
z'CRLContainer.revinfo_sig_mechanism_usedN)r"   r#   r$   r%   r
   CertificateListr/   r   r   r   r5   r*   r   r   r=   r	   r7   r6   r   r   r   r    r   e  s   
 


r   crlsc                 C   sb   g }| D ]*}t |trtj|}t |tjrt|}t |tr&|| qtdt| |S )z
    Internal function to process legacy CRL data into one or more
    :class:`.CRLContainer`.

    :param crls:
        Legacy CRL input data.
    :return:
        A list of :class:`.CRLContainer` objects.
    zScrls must be a list of byte strings or asn1crypto.crl.CertificateList objects, not )	
isinstancebytesr
   rz   loadr   append	TypeErrorr   )r{   new_crlscrl_r   r   r    r     s   

r   ocspsc                 C   sp   g }| D ]1}t |trtj|}t |tjr"t|}|| qt |tr-|| qt	dt
| |S )z
    Internal function to process legacy OCSP data into one or more
    :class:`.OCSPContainer`.

    :param ocsps:
        Legacy OCSP input data.
    :return:
        A list of :class:`.OCSPContainer` objects.
    zRocsps must be a list of byte strings or asn1crypto.ocsp.OCSPResponse objects, not )r|   r}   r   rs   r~   r   rk   extendr   r   r   )r   	new_ocspsocsp_extrr   r   r    r     s   


r   )-abcr&   dataclassesr   r   typingr   r   r   r   r   
asn1cryptor	   r
   r   pyhanko_certvalidator._typesr   pyhanko_certvalidator.ltv.typesr   r   !pyhanko_certvalidator.policy_declr   r   r   __all__Enumr   r   ABCr   r8   r   rI   rS   rv   r^   r   r   r}   rz   LegacyCompatCRLrs   LegacyCompatOCSPr   r   r   r   r   r    <module>   s^    + 

O
b
