U
    ct                     @   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 d dlm	Z	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 d d	lmZmZ d d
lmZ d dlmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9 e:e;Z<eddG dd dZ=ej>ej?ee+e
ej@ dddZAeG dd dZBe'eeCedddZDej>ej?eej@ejEf ee'e+eCeee
e' eBf d 	d!d"ZFej>ej?eej@ejEf ee'eeCee'd#	d$d%ZGeG d&d' d'ZHe
e- ej>ejIeeJ ee- d(d)d*ZKejIeejL ej@ej>eCd+d,d-ZMej@ej?ej@ejIej>eHeCd.d/d0ZNej?eejL ej@ejIej>eHeCd1d2d3ZOeej@ejEf ee-e'ee	ePe
e- f eCeHeeeeP  d4
d5d6ZQe-ej>e+eHeeCej>f d7d8d9ZRd]ej?ej@e	ePe
e- f eHee% ee) ee- d:d;d<ZSej@eej@ejEf e-eCeHeeeP  d=d>d?ZTej@eej@ejEf e-ee- eHd@dAdBZUd^e4ej@eHee dCdDdEZVeeP eWeHedFdGdHZXd_eej@ejEf e'eee dIdJdKZYeddG dLdM dMZZeddG dNdO dOZ[eddG dPdQ dQZ\eej@ejEf ee-e'e4e	ePe
e- f eCeHeee[ dR
dSdTZ]d`eej@ejEf e'e4eee e\dUdVdWZ^dXdY Z_eej@ejEf ej>ej?ej>dZd[d\Z`dS )a    N)defaultdict)	dataclassfield)datetime)DictListOptionalSetTupleUnion)cmscrlx509)InvalidSignature)ValProcState)	AuthorityAuthorityWithCert)ValidationContext)CertificateFetchErrorCRLNoMatchesErrorCRLValidationErrorCRLValidationIndeterminateErrorPathValidationErrorPSSParameterMismatchRevokedError)ValidationTimingParams)ValidationPath)CertRevTrustPolicy)CertificateRegistry)CRLContainerRevinfoUsabilityRating)KNOWN_CRL_ENTRY_EXTENSIONSKNOWN_CRL_EXTENSIONSVALID_REVOCATION_REASONS)RevinfoManager)ConsListget_ac_extension_valueget_issuer_dnvalidate_sigT)frozenc                   @   s&   e Zd ZU dZeed< ee ed< dS )CRLWithPathsz0
    A CRL with a number of candidate paths
    r   pathsN)__name__
__module____qualname____doc__r   __annotations__r   r    r1   r1   N/tmp/pip-unpacked-wheel-rwcmptg8/pyhanko_certvalidator/revinfo/validate_crl.pyr*   /   s   
r*   )crl_authority_namecertificate_listcert_issuer_authcert_registryreturnc          	         s   |j }d }t|tr|j}|||}|s@| |j kr@|| |}|s|jd k	rg }| |h}|j|2 z"3 d H W }|j|krf|d| qf6 |S )Nr   )	issuer
isinstancer   ZcertificateZretrieve_by_nameZfetcherZfetch_crl_issuerssubjectinsert)	r3   r4   r5   r6   Zdelegated_issuerZcert_issuer_cert
candidatesZvalid_namescertr1   r1   r2    _find_candidate_crl_issuer_certs9   s,    
  
r>   c                   @   sd   e Zd ZU eed< dZeed< dZeed< dZeed< dZeed< e	e
dZee ed< d	d
 ZdS )_CRLIssuerSearchErrscandidate_issuersr   candidates_skippedsignatures_failedunauthorized_certspath_building_failuresdefault_factoryexplicit_errorsc                 C   s   | j dk}| j r| j| j kr"t S | j| j kr6tdS | j| j krRt|rLdndS | j| j krnt|rhdndS | jrt| jdkr| jd S d}|d		d
d | jD 7 }t|S d S )N   z#CRL signature could not be verifiedzDThe CRL issuers that were identified are not authorized to sign CRLszAThe CRL issuer that was identified is not authorized to sign CRLszSThe chain of trust for the CRL issuers that were identified could not be determinedzQThe chain of trust for the CRL issuer that was identified could not be determinedr   z&Unable to determine CRL trust status. z; c                 s   s   | ]}t |V  qd S N)str).0er1   r1   r2   	<genexpr>   s     z/_CRLIssuerSearchErrs.get_exc.<locals>.<genexpr>)
r@   rA   r   rB   r   rC   rD   rG   lenjoin)selfpluralmsgr1   r1   r2   get_exch   s2    


z_CRLIssuerSearchErrs.get_excN)r,   r-   r.   intr0   rA   rB   rC   rD   r   listrG   r   r   rS   r1   r1   r1   r2   r?   _   s   
r?   candidate_crl_issuer_pathvalidation_contextissuing_authority_identical
proc_statec           	   
      s   | | jrd S zR|j}|s,|jddd }ddlm} |j| }||| t||ddI d H  W nP t	k
r } z2| j}t
jd|jj d	|d
 td| W 5 d }~X Y nX d S )NT)Z	never_defz CRL issuerr   )intl_validate_path)ee_name_overridecert_path_stack)rZ   zPath for CRL issuer z could not be validated.exc_infoz8The CRL issuer certificate path could not be validated. )Zcheck_validationlastr\   describe_certZpyhanko_certvalidator.validater[   r]   Zconsr   r   loggerwarningr:   Zhuman_friendlyr   )	rW   rX   rY   rZ   Ztemp_overrider[   	new_stackrL   Ziss_certr1   r1   r2   _validate_crl_issuer_path   s4     re   )	r3   r4   r=   r5   	cert_pathcertificate_registryis_indirectrZ   r7   c             	      s:  t |  }t| |||dI d H }	|j}
tt|	d}g }|	D ]}|j|
k}|j	|
kod|j|k}|s|s|s| j
d7  _
qD|j}|rd|jkr| jd7  _qDzt||j W n& tk
r   | jd7  _Y qDY nX ||}|s&z||}W n( tk
r$   | jd7  _Y qDY nX || qD||fS )N)r5   r6   )r@   rH   Zcrl_sign)hashlibsha256dumpdigestr>   namer?   rN   r:   r8   rA   key_usage_valuenativerC   _verify_crl_signature
public_keyr   rB   check_path_verif_recursiontruncate_to_issuer_and_appendLookupErrorrD   append)r3   r4   r=   r5   rf   rg   rh   rZ   Zcert_sha256Zcandidate_crl_issuerscert_issuer_nameerrscandidate_pathscandidate_crl_issuerZdirect_issuerZindirect_issuerrn   	cand_pathr1   r1   r2   _find_candidate_crl_paths   sR    

 


r{   )	r3   r4   r=   r5   rf   rX   rh   rZ   r7   c                   s   t | |||||j||dI d H \}}	|D ]}
|
j}||rR|j|| |
  S ||}
zP| o~|d k	o~|j |j k}t	|
|||dI d H  |j|| |
W   S  t
k
r } z|	j| W Y q(W 5 d }~X Y q(X q(|	 d S )Nr=   r5   rf   rg   rh   rZ   rV   )r{   rg   r`   rr   revinfo_managerZrecord_crl_issuerrs   rq   rk   re   r   rG   ru   rS   )r3   r4   r=   r5   rf   rX   rh   rZ   rx   rw   rW   ry   rY   rL   r1   r1   r2   _find_crl_issuer   sV    
  
r~   c                   @   s,   e Zd ZU eedZeed< dZeed< dS )_CRLErrsrE   failuresr   issuer_failuresN)	r,   r-   r.   r   rU   r   r0   r   rT   r1   r1   r1   r2   r   B  s   
r   )delta_listsr3   crl_idpparent_crl_akir7   c                 C   sp   | D ]f}|j }|j|krq|j}|d kr0|d k	s|d k	rB|d krBq|d k	rX|j|jkrXq||jkrdq|  S d S rI   )crl_datar8    issuing_distribution_point_valuero   authority_key_identifier)r   r3   r   r   Zcandidate_delta_cl_contZcandidate_delta_clZdelta_crl_idpr1   r1   r2   _find_matching_delta_crlH  s"    

r   )r   crl_dps
crl_issuerr3   r7   c                 C   s`  d}d}d}g }| d }|rrd}|j dkrB|jD ]}	||	 q0n0|j }
|
j|j  |tjd|
d |r,|D ]}|r qL|d }|rd}|j dkr|jD ]}	|	|krd} qqn6|j }
|
j|j  tjd|
d}||krd}q||d r|d}|d D ]}||krd} q|qq|n d}tjd|d}	|	|krLd}|p^| p^| S )NFdistribution_pointT	full_namedirectory_namerm   valuer   )rm   chosenru   r:   copyZuntagr   GeneralName)r   r   r   r3   Zhas_idp_nameZhas_dp_nameZidp_dp_matchZidp_general_namesZidp_dp_nameZgeneral_nameZinner_extended_issuer_namedpZdp_nameZdp_extended_issuer_nameZdp_crl_authority_namer1   r1   r2   _match_dps_idp_namesf  sl    


 


 
 
r   )r=   r4   r   r   r3   rw   r7   c                 C   s   t || j||d}|s8|jd|f | jd7  _dS |d jrh| jrh| jd jrh|jd|f dS |d jr| jr| jd jdkr|jd	|f dS |d
 jr|jd|f dS dS )Nr   r   r   r3   z{The CRL issuing distribution point extension does not share any names with the certificate CRL distribution point extensionrH   Fonly_contains_user_certscazMCRL only contains end-entity certificates and certificate is a CA certificateonly_contains_ca_certszNCRL only contains CA certificates and certificate is an end-entity certificateZonly_contains_attribute_certsz(CRL only contains attribute certificatesT)r   crl_distribution_points_valuer   ru   r   ro   Zbasic_constraints_value)r=   r4   r   r   r3   rw   matchr1   r1   r2   _handle_crl_idp_ext_constraints  sT    



r   )r4   r   r   r   r3   rw   r7   c                 C   sf   t ||||d}|s6|jd| f | jd7  _dS |d jpH|d j}|rb|jd| f dS dS )	Nr   zThe CRL issuing distribution point extension does not share any names with the attribute certificate's CRL distribution point extensionrH   Fr   r   zVCRL only contains public-key certificates, but certificate is an attribute certificateT)r   r   ru   r   ro   )r4   r   r   r   r3   rw   r   Zpkc_onlyr1   r1   r2   )_handle_attr_cert_crl_idp_ext_constraints  s2    	
r   )
r=   r5   certificate_list_contpathrX   delta_lists_by_issuer
use_deltasrw   rZ   r7   c	              
      s  |j }	zt||j|j|d\}
}W n tk
r8   Y d S X |j|	}|sz(t||	| ||||
|dI d H }|j}W nd t	k
r   | j
d7  _
Y d S  ttfk
r } z |j|jd |	f W Y d S d }~X Y nX t|| ||
|d}|d k rd S |j|j|jd}|j}|tjkrX|tjkr.d}n|tjkr@d}nd	}|j||f d S |rxt|	||j|j||d
}nd }zt|| |||d\}}W n tk
r   Y d S X |j}|jr|jnd }|r|d ks||k rtj||d|d|S )Nrg   rw   )r=   r5   rf   rX   rh   rZ   rH   r   r   r=   r   rh   rw   policytiming_paramszCRL is not recent enoughzCRL is too recentz&CRL freshness could not be established)r4   r   r   r   r   rw   r   r=   r   delta_certificate_list_contrw   ZCRL)reasonZrevocation_dtZrevinfo_typerZ   ) r   _get_crl_authority_namerm   rg   rt   r}   Zcheck_crl_issuerr~   r`   r   r   r   r   r   ru   args!_get_crl_scope_assuming_authority	usable_atZrevinfo_policyr   ratingr    OKSTALETOO_NEW_maybe_get_delta_crl_check_cert_on_crl_and_deltaNotImplementedErrorZpoint_in_time_validationZvalidation_timer   format)r=   r5   r   r   rX   r   r   rw   rZ   r4   rh   r3   r   Zcrl_issuer_pathrL   interim_reasonsfreshness_resultr   rR   r   revoked_daterevoked_reasonZtimingcontrol_timer1   r1   r2   _handle_single_crl  s    


	r   )r   rv   rg   rw   r7   c           
      C   s   | j }|j}t|o|d j}|s*|j}nf|d }|rb|jdkrN|jd j}q| j|j}n.|j	r||
|j	}	|	j}n|jd| f t||fS )zR
    Figure out the name of the entity on behalf of which the CRL was issued.
    Zindirect_crlr   r   r   zcCRL is marked as an indirect CRL, but provides no mechanism for locating the CRL issuer certificate)r   r   boolro   r8   rm   r   r   ru   r   Zretrieve_by_key_identifierr:   r   rt   )
r   rv   rg   rw   r4   r   rh   r3   Zcrl_idp_nameZtmp_crl_issuerr1   r1   r2   r     s2    


r   )r4   r   r   rw   r   r   r7   c                 C   s  | j rt| j dkrd S |j}| j}||jg }t|||| jd}	|	sLd S |	j}
|
j	t
 rp|jd|	f d S zt|
|j W n& tk
r   |jd|	f Y d S X |r|r|	j||d}|j}|tjkr|tjkrd}n|tjkrd}nd}|j||	f d S |	S d S )	Nr   )r   r3   r   r   zIOne or more unrecognized critical extensions are present in the delta CRLz)Delta CRL signature could not be verifiedr   zDelta CRL is stalezDelta CRL is too recentz,Delta CRL freshness could not be established)Zfreshest_crl_valuerN   r:   r   gethashabler   r   r   critical_extensionsr"   r   ru   rp   rq   r   r   r   r    r   r   r   )r4   r   r   rw   r   r   r3   r   Zcandidate_delta_listsr   delta_certificate_listr   r   rR   r1   r1   r2   r     sj    
 
 

r   )r   r=   r   rh   rw   r7   c                 C   s~  |j }|j}t|tj}d}d}	|r,|j}
n
t|d}
|
rptjd| jd}|
D ] }|d rNd}||d krNd}	qN| j}t	|}||k}|o|	o|}|o|	 p| }| j
|k}|s|s|r|r| jd7  _d S |d k	r|rt||| |||d}nt|
|| |||d	}|sd S d }|r4|d
 jd k	r4|d
 j}d }|rB|}|d krVt }n|}|jt rz|jd|f d S |S )NFZcrl_distribution_pointsr   r   r   TrH   )r=   r4   r   r   r3   rw   )r   r4   r   r   r3   rw   Zonly_some_reasonszCOne or more unrecognized critical extensions are present in the CRL)r   r   r9   r   Certificater   r&   r   r:   r'   r8   r   r   r   ro   r#   r   r   r"   r   ru   )r   r=   r   rh   rw   r4   r   is_pkcZhas_dp_crl_issuerZdp_matchr   Zcrl_issuer_general_namer   r3   rv   Zsame_issuerZindirect_matchZmissing_idpZindirect_crl_issuerZcrl_idp_matchZidp_reasonsZreason_keysr   r1   r1   r2   r     s    
 

		


r   r   c           
      C   s   |j }d }d }t|}|r`|j }	zt|||	| j\}}W n& tk
r^   |jd|f  Y nX |d krzt|||| j\}}W n& tk
r   |jd|f  Y nX |r|jdkrd }d }||fS )Nz]One or more unrecognized critical extensions are present in the CRL entry for the certificateZremove_from_crl)r   r'   find_cert_in_listr:   r   r   ru   ro   )
r   r=   r   r   rw   r4   r   r   rv   r   r1   r1   r2   r   l  sN       r   )r}   r=   rw   r   c                    s   |  |I d H }| j}tt}tt}|D ]}|j}	|d k	r`|j}
|
d ks*|
|ks*||	 |kr`q*z4|	jj}|	jd kr|| 	| n|| 	| W q* t
k
r } z&d}tj||d |j	||	f W 5 d }~X Y q*X q*||fS )Nz/Generic processing error while classifying CRL.r^   )Zasync_retrieve_crlspoe_managerr   rU   r   Zissuance_dater8   r   Zdelta_crl_indicator_valueru   
ValueErrorloggingdebugr   )r}   r=   rw   r   Zcertificate_listsr   complete_lists_by_issuerr   r   r4   ZissuedZissuer_hashablerL   rR   r1   r1   r2   _classify_relevant_crls  s:    


$r   checked_reasons
total_crlsrw   rZ   c                 C   s^   | dh8 } | t krZ||jkr0td|  dS |jsB|jd td|  d|jS d S )NZunusedz%No CRLs were issued by the issuer of z, or any indirect CRL issuer)z6The available CRLs do not cover all revocation reasonszUnable to determine if z; is revoked due to insufficient information from known CRLs)r#   r   r   ra   r   ru   r   r   r1   r1   r2   _process_crl_completeness  s    	

r   )r=   r   rX   rZ   c                    sT  t | tj}|p(tt||s"dndd}|j}t }t|| |I dH \}}	z|	| }
W n( t
k
r   td|  dY nX g }| D ]}|| qt|}t }|D ]}z4t| |
||||	|||d	I dH }|dk	r||O }W q tk
r0 } z&d}tj||d |j||f W 5 d}~X Y qX qt||||}|dk	rP|dS )	a  
    Verifies a certificate against a list of CRLs, checking to make sure the
    certificate has not been revoked. Uses the algorithm from
    https://tools.ietf.org/html/rfc5280#section-6.3 as a basis, but the
    implementation differs to allow CRLs from unrecorded locations.

    :param cert:
        An asn1crypto.x509.Certificate or asn1crypto.cms.AttributeCertificateV2
        object to check for in the CRLs

    :param path:
        A pyhanko_certvalidator.path.ValidationPath object of the cert's
        validation path, or in the case of an AC, the AA's validation path.

    :param validation_context:
        A pyhanko_certvalidator.context.ValidationContext object to use for caching
        validation information

    :param use_deltas:
        A boolean indicating if delta CRLs should be used

    :param proc_state:
        Internal state for error reporting and policy application decisions.

    :raises:
        pyhanko_certvalidator.errors.CRLNoMatchesError - when none of the CRLs match the certificate
        pyhanko_certvalidator.errors.CRLValidationError - when any error occurs trying to verify the CertificateList
        pyhanko_certvalidator.errors.RevokedError - when the CRL indicates the certificate has been revoked
    zattribute certificateN)r]   r\   +Could not determine issuer certificate for 	 in path.)	r=   r5   r   r   rX   r   r   rw   rZ   .Generic processing error while validating CRL.r^   )r9   r   r   r   r%   singr}   r   r   find_issuing_authorityrt   r   ra   valuesextendrN   setr   r   r   r   r   ru   r   )r=   r   rX   r   rZ   r   r}   rw   r   r   r5   crls_to_processissuer_crlsr   r   r   r   rL   rR   excr1   r1   r2   
verify_crl  sb    %

$   
r   c                   @   s&   e Zd ZU dZeed< ee ed< dS )ProvisionalCRLTrustz_
    A provisional CRL path, together with an optional delta CRL that may be
    relevant.
    r   deltaN)r,   r-   r.   r/   r   r0   r   r   r1   r1   r1   r2   r   P  s   
r   c                   @   s8   e Zd ZU dZeed< ee ed< eed< e	j
ed< dS )CRLOfInterestz
    A CRL of interest.
    r   
prov_pathsrh   r3   N)r,   r-   r.   r/   r   r0   r   r   r   r   Namer1   r1   r1   r2   r   c  s   

r   c                   @   s*   e Zd ZU dZee ed< ee ed< dS )CRLCollectionResultzb
    The result of a CRL collection operation for AdES point-in-time
    validation purposes.
    crlsfailure_msgsN)r,   r-   r.   r/   r   r   r0   rJ   r1   r1   r1   r2   r     s   
r   )
r=   r5   r   r   r}   r   r   rw   rZ   r7   c	              
      sH  |j }	|j}
zt||j|
|d\}}W n tk
r<   Y d S X z&t||	| |||
||dI d H \}}W nd tk
r   | jd7  _Y d S  tt	fk
r } z |j
|jd |	f W Y d S d }~X Y nX g }|D ]Z}|j}t|| |||d}|d k rq|rt|	|||d}nd }t||d}|| q|s8d S t||||dS )	Nr   r|   rH   r   r   )r4   r   r   rw   )r   r   )r   r   rh   r3   )r   rg   r   rm   rt   r{   r   r   r   r   r   ru   r   r`   r   r   r   r   )r=   r5   r   r   r}   r   r   rw   rZ   r4   registryrh   r3   rx   _rL   Zprovisional_resultsrz   Zputative_issuerr   r   Zprovr1   r1   r2   _assess_crl_relevance  st    

r   )r=   r   r}   r   rZ   r7   c                    s0  |pt t|d}t }t|| ||d}|I dH \}}	g }
| D ]}|
| qDz|| }W n( tk
r   t	d|
  dY nX g }|
D ]}z6t| ||||	||||d	I dH }|dk	r|| W q tk
r } z&d}tj||d |j||f W 5 d}~X Y qX qt|d	d
 |jD dS )ah  
    Collect potentially relevant CRLs with the associated validation
    paths. Will not perform actual path validation.

    :param cert:
        The certificate under scrutiny.
    :param path:
        The path currently being evaluated.
    :param revinfo_manager:
        The revocation info manager.
    :param control_time:
        The control time before which the validation info should have been
        issued.
    :param use_deltas:
        Whether to include delta CRLs.
    :param proc_state:
        The state of any prior validation process.
    :return:
        A :class:`.CRLCollectionResult`.
    )r]   )r   Nr   r   )	r=   r5   r   r   r   r   r}   rw   rZ   r   r^   c                 S   s   g | ]}|d  qS )r   r1   )rK   fr1   r1   r2   
<listcomp>+  s     z4collect_relevant_crls_with_paths.<locals>.<listcomp>)r   r   )r   r%   r   r   r   r   r   r   rt   r   ra   r   ru   r   r   r   r   r   )r=   r   r}   r   r   rZ   rw   Zclassify_jobr   r   r   r   r5   Zrelevant_crlsr   resultrL   rR   r1   r1   r2    collect_relevant_crls_with_paths  sT       
$r   c              
   C   s   | d j }| d j}z.t| d j| d  |||| d d d W nF tk
rn } ztd|W 5 d}~X Y n tk
r   tdY nX dS )	a2  
    Verifies the digital signature on an asn1crypto.crl.CertificateList object

    :param certificate_list:
        An asn1crypto.crl.CertificateList object

    :raises:
        pyhanko_certvalidator.errors.CRLValidationError - when the signature is
        invalid or uses an unsupported algorithm
    Zsignature_algorithm	signaturetbs_cert_list
parameters)r   Zsigned_dataZpublic_key_infoZsig_algo	hash_algor   z/Invalid signature parameters on CertificateListNz5Unable to verify the signature of the CertificateList)signature_algor   r(   ro   rk   r   r   r   )r4   rq   r   r   rL   r1   r1   r2   rp   /  s*    




rp   )r=   rv   r4   r3   c           	      C   s   |d d }t | tjr | j}n| d d j}|}|D ]l}|jt rJt |jr`|j|kr`|j}||krjq6|d j|krzq6|j	st
d}n|j	}|d j|f  S dS )	a!  
    Looks for a cert in the list of revoked certificates

    :param cert:
        An asn1crypto.x509.Certificate object of the cert being checked,
        or an asn1crypto.cms.AttributeCertificateV2 object in the case
        of an attribute certificate.

    :param cert_issuer_name:
        The certificate issuer's distinguished name

    :param certificate_list:
        An ans1crypto.crl.CertificateList object to look in for the cert

    :param crl_authority_name:
        The distinguished name of the default authority for which the CRL issues
        certificates.

    :return:
        A tuple of (None, None) if not present, otherwise a tuple of
        (asn1crypto.x509.Time object, asn1crypto.crl.CRLReason object)
        representing the date/time the object was revoked and why
    r   revoked_certificatesZac_infoserial_numberZuser_certificateunspecifiedZrevocation_date)NN)r9   r   r   r   ro   r   r!   r   Zissuer_nameZcrl_reason_valuer   Z	CRLReason)	r=   rv   r4   r3   r   Zcert_serialZlast_issuer_nameZrevoked_certZ
crl_reasonr1   r1   r2   r   Q  s0    
r   )NN)N)TN)TN)ari   r   collectionsr   Zdataclassesr   r   r   typingr   r   r   r	   r
   r   Z
asn1cryptor   r   r   Zcryptography.exceptionsr   Zpyhanko_certvalidator._stater   Zpyhanko_certvalidator.authorityr   r   Zpyhanko_certvalidator.contextr   Zpyhanko_certvalidator.errorsr   r   r   r   r   r   r   Zpyhanko_certvalidator.ltv.typesr   Zpyhanko_certvalidator.pathr   Z!pyhanko_certvalidator.policy_declr   Zpyhanko_certvalidator.registryr   Z&pyhanko_certvalidator.revinfo.archivalr   r    Z'pyhanko_certvalidator.revinfo.constantsr!   r"   r#   Z%pyhanko_certvalidator.revinfo.managerr$   Zpyhanko_certvalidator.utilr%   r&   r'   r(   	getLoggerr,   rb   r*   r   ZCertificateListr   r>   r?   r   re   ZAttributeCertificateV2r{   r~   r   ZIssuingDistributionPointbytesr   ZCRLDistributionPointsr   r   r   rJ   r   r   r   r   r   r   rT   r   r   r   r   r   r   r   rp   r   r1   r1   r1   r2   <module>   sf   $	

&,+IFGC.
u1  L
g> -#  _U  N#