§
    ¥”jì_  ã                   ó(  — 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
 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 dd	lmZ dd
lmZ ddlmZmZ d„ Z G d„ de j        ¦  «        Z  G d„ de e j        ¦  «        Z! G d„ de!¦  «        Z"ee
ej#        ef                  Z$ G d„ d¦  «        Z% G d„ de%¦  «        Z& G d„ de"¦  «        Z' G d„ d¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z* G d„ d ee         ¦  «        Z+ G d!„ d"e ¦  «        Z,dS )#é    N)Údefaultdict)ÚAsyncGeneratorÚIterableÚIteratorÚListÚOptionalÚUnion)Úx509)Ú
trust_listé   )Ú	AuthorityÚAuthorityWithCertÚCertTrustAnchorÚTrustAnchorÚTrustedServiceType)ÚPathBuildingError)ÚCertificateFetcher)ÚValidationPath)ÚCancelableAsyncIteratorÚConsListc                 ó^   — 	 t          t          | ¦  «        ¦  «        S # t          $ r Y d S w xY w©N)ÚnextÚiterÚStopIteration)Úiterables    úm/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/pyhanko_certvalidator/registry.pyÚ_first_or_noner      s=   € ðÝ•D˜‘N”NÑ#Ô#Ð#øÝð ð ð Øˆtˆtðøøøs   ‚ ž
,«,c                   ó^   — e Zd ZdZdefd„Zdefd„Zdefd„Zdefd„Zde	j
        fd	„Zd
„ ZdS )ÚCertificateCollectionzS
    Abstract base class for read-only access to a collection of certificates.
    Úkey_identifierc                 óF   — t          |                      |¦  «        ¦  «        S )zÕ
        Retrieves a cert via its key identifier

        :param key_identifier:
            A byte string of the key identifier

        :return:
            None or an asn1crypto.x509.Certificate object
        )r   Úretrieve_many_by_key_identifier©Úselfr!   s     r   Úretrieve_by_key_identifierz0CertificateCollection.retrieve_by_key_identifier$   s'   € õ Ø×0Ò0°Ñ@Ô@ñ
ô 
ð 	
ó    c                 ó   — t           ‚)zõ
        Retrieves possibly multiple certs via the corresponding key identifiers

        :param key_identifier:
            A byte string of the key identifier

        :return:
            A list of asn1crypto.x509.Certificate objects
        ©ÚNotImplementedErrorr$   s     r   r#   z5CertificateCollection.retrieve_many_by_key_identifier2   ó
   € õ "Ð!r'   Úkey_hashc                 óF   — t          |                      |¦  «        ¦  «        S )a&  
        Retrieves a cert via the SHA-1 hash of its public key
        (the standard way to compute the SubjectKeyIdentifier extension)

        :param key_hash:
            A byte string of the key identifier

        :return:
            None or an asn1crypto.x509.Certificate object
        )r   Úretrieve_many_by_key_hash©r%   r,   s     r   Úretrieve_by_key_hashz*CertificateCollection.retrieve_by_key_hash>   s    € õ ˜d×<Ò<¸XÑFÔFÑGÔGÐGr'   c                 ó   — t           ‚)zï
        Retrieves possibly multiple certs via the corresponding key identifiers

        :param key_hash:
            A byte string of the key identifier

        :return:
            A list of asn1crypto.x509.Certificate objects
        r)   r/   s     r   r.   z/CertificateCollection.retrieve_many_by_key_hashK   r+   r'   Únamec                 ó   — t           ‚)zÌ
        Retrieves a list certs via their subject name

        :param name:
            An asn1crypto.x509.Name object

        :return:
            A list of asn1crypto.x509.Certificate objects
        r)   ©r%   r2   s     r   Úretrieve_by_namez&CertificateCollection.retrieve_by_nameW   r+   r'   c                 ó   — t           ‚)a]  
        Retrieve a certificate by its ``issuer_serial`` value.

        :param issuer_serial:
            The ``issuer_serial`` value of the certificate.
        :return:
            The certificate corresponding to the ``issuer_serial`` key
            passed in.
        :return:
            None or an asn1crypto.x509.Certificate object
        r)   ©r%   Úissuer_serials     r   Úretrieve_by_issuer_serialz/CertificateCollection.retrieve_by_issuer_serialc   ó
   € õ "Ð!r'   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úbytesr&   r#   r0   r.   r
   ÚNamer5   r9   © r'   r   r    r       s»   € € € € € ðð ð
¸ð 
ð 
ð 
ð 
ð
"¸eð 
"ð 
"ð 
"ð 
"ðH¨Uð Hð Hð Hð Hð
"°%ð 
"ð 
"ð 
"ð 
"ð
" T¤Yð 
"ð 
"ð 
"ð 
"ð"ð "ð "ð "ð "r'   r    c                   óP   — e Zd Zdej        defd„Zdeej                 fd„Zd„ Z	dS )ÚCertificateStoreÚcertÚreturnc                 ó   — t           ‚)úå
        Register a single certificate.

        :param cert:
            Certificate to add.
        :return:
            ``True`` if the certificate was added, ``False`` if it already
            existed in this store.
        r)   ©r%   rD   s     r   ÚregisterzCertificateStore.registers   r+   r'   Úcertsc                 óD   — d}|D ]}||                       |¦  «        z  }Œ|S )a  
        Register multiple certificates.

        :param certs:
            Certificates to register.
        :return:
            ``True`` if at least one certificate was added, ``False``
            if all certificates already existed in this store.
        F©rI   )r%   rJ   ÚaddedrD   s       r   Úregister_multiplez"CertificateStore.register_multiple   s5   € ð ˆØð 	)ð 	)ˆDØ�T—]’] 4Ñ(Ô(Ñ(ˆEˆEØˆr'   c                 ó   — t           ‚r   r)   ©r%   s    r   Ú__iter__zCertificateStore.__iter__�   s   € Ý!Ð!r'   N)
r;   r<   r=   r
   ÚCertificateÚboolrI   r   rN   rQ   rA   r'   r   rC   rC   r   sk   € € € € € ð
"˜TÔ-ð 
"°$ð 
"ð 
"ð 
"ð 
"ð x°Ô0@Ô'Að ð ð ð ð "ð "ð "ð "ð "r'   rC   c                   óˆ   — e Zd ZdZed„ ¦   «         Zd„ Zdej        de	fd„Z
d„ Zd„ Zd	efd
„Zdefd„Zdej        fd„Zd„ ZdS )ÚSimpleCertificateStorez-
    Simple trustless certificate store.
    c                 óN   —  | ¦   «         }|D ]}|                      |¦  «         Œ|S r   rL   )ÚclsrJ   ÚresultrD   s       r   Ú
from_certsz!SimpleCertificateStore.from_certs˜   s6   € à�‘”ˆØð 	"ð 	"ˆDØ�OŠO˜DÑ!Ô!Ð!Ð!Øˆr'   c                 óª   — i | _         t          t          ¦  «        | _        t          t          ¦  «        | _        t          t          ¦  «        | _        d S r   )rJ   r   ÚlistÚ_subject_mapÚ_key_identifier_mapÚ_key_hash_maprP   s    r   Ú__init__zSimpleCertificateStore.__init__Ÿ   s?   € ØˆŒ
Ý'­Ñ-Ô-ˆÔÝ#.­tÑ#4Ô#4ˆÔ Ý(­Ñ.Ô.ˆÔÐÐr'   rD   rE   c                 óŠ  — |j         | j        v rdS || j        |j         <   |j        j        }| j        |j        j                                      |¦  «         | j        |                              |¦  «         |j	        r&| j
        |j	                                      |¦  «         n | j
        |                              |¦  «         dS )rG   FT)r8   rJ   Ú
public_keyÚsha1r\   ÚsubjectÚhashableÚappendr^   r!   r]   )r%   rD   r,   s      r   rI   zSimpleCertificateStore.register¥   s½   € ð Ô ¤Ð+Ð+Ø�5Ø)-ˆŒ
�4Ô%Ñ&Ø”?Ô'ˆØÔ˜$œ,Ô/Ô0×7Ò7¸Ñ=Ô=Ð=ØÔ˜8Ô$×+Ò+¨DÑ1Ô1Ð1ØÔð 	<ØÔ$ TÔ%8Ô9×@Ò@ÀÑFÔFÐFÐFàÔ$ XÔ.×5Ò5°dÑ;Ô;Ð;Øˆtr'   c                 ó   — | j         |         S r   )rJ   )r%   Úitems     r   Ú__getitem__z"SimpleCertificateStore.__getitem__»   s   € ØŒz˜$ÔÐr'   c                 óN   — t          | j                             ¦   «         ¦  «        S r   )r   rJ   ÚvaluesrP   s    r   rQ   zSimpleCertificateStore.__iter__¾   s   € Ý�D”J×%Ò%Ñ'Ô'Ñ(Ô(Ð(r'   r!   c                 ó   — | j         |         S r   )r]   r$   s     r   r#   z6SimpleCertificateStore.retrieve_many_by_key_identifierÁ   s   € ØÔ'¨Ô7Ð7r'   r,   c                 ó   — | j         |         S r   )r^   r/   s     r   r.   z0SimpleCertificateStore.retrieve_many_by_key_hashÄ   s   € ØÔ! (Ô+Ð+r'   r2   c                 ó&   — | j         |j                 S r   )r\   rd   r4   s     r   r5   z'SimpleCertificateStore.retrieve_by_nameÇ   s   € ØÔ  ¤Ô/Ð/r'   c                 ó6   — 	 | |         S # t           $ r Y d S w xY wr   )ÚKeyErrorr7   s     r   r9   z0SimpleCertificateStore.retrieve_by_issuer_serialÊ   s4   € ð	Ø˜Ô&Ð&øÝð 	ð 	ð 	Ø�4�4ð	øøøs   ‚
 Š
—N)r;   r<   r=   r>   ÚclassmethodrY   r_   r
   rR   rS   rI   rh   rQ   r?   r#   r.   r@   r5   r9   rA   r'   r   rU   rU   “   sí   € € € € € ðð ð ðð ñ „[ðð/ð /ð /ð˜TÔ-ð °$ð ð ð ð ð, ð  ð  ð)ð )ð )ð8¸eð 8ð 8ð 8ð 8ð,°%ð ,ð ,ð ,ð ,ð0 T¤Yð 0ð 0ð 0ð 0ðð ð ð ð r'   rU   c                   ón   — e Zd ZdZdej        defd„Zdede	e
         fd„Zdej        dee
         fd„ZdS )	ÚTrustManagerz%
    Abstract trust manager API.
    rD   rE   c                 óJ   — |                       t          |¦  «        ¦  «        duS )úï
        Checks if a certificate is in the list of trust roots in this registry

        :param cert:
            An asn1crypto.x509.Certificate object

        :return:
            A boolean - if the certificate is in the CA list
        N)Úas_trust_anchorr   rH   s     r   Úis_rootzTrustManager.is_rootÙ   s&   € ð ×#Ò#Õ$5°dÑ$;Ô$;Ñ<Ô<ÀDÐHÐHr'   Ú	authorityc                 ó   — t           ‚)zù
        If the authority is a trust anchor, return its identity as such
        (with qualifications as applicable).

        If the authority is not a trust anchor, return None.


        :param authority:
            An authority object.
        r)   )r%   rw   s     r   ru   zTrustManager.as_trust_anchorå   s
   € õ "Ð!r'   c                 ó   — t           ‚)zô
        Find potential issuers that might have (directly) issued
        a particular certificate.

        :param cert:
            Issued certificate.
        :return:
            An iterator with potentially relevant trust anchors.
        r)   rH   s     r   Úfind_potential_issuersz#TrustManager.find_potential_issuersò   r:   r'   N)r;   r<   r=   r>   r
   rR   rS   rv   r   r   r   ru   r   rz   rA   r'   r   rr   rr   Ô   sœ   € € € € € ðð ð
I˜DÔ,ð 
I°ð 
Ið 
Ið 
Ið 
Ið"¨ð "°xÀÔ7Lð "ð "ð "ð "ð"ØÔ$ð"à	�+Ô	ð"ð "ð "ð "ð "ð "r'   rr   c                   óê   — e Zd ZdZd„ Ze	 	 ddee         dee         dd fd„¦   «         Zde	e
ej        f         fd	„Zd
ej        fd„Zdefd„Zdeej                 fd„Zd
ej        dee
         fd„ZdS )ÚSimpleTrustManagerzk
    Trust manager backed by a list of trust roots, possibly in addition to the
    system trust list.
    c                 ó^   — t          ¦   «         | _        t          t          ¦  «        | _        d S r   )ÚsetÚ_rootsr   r[   Ú_root_subject_maprP   s    r   r_   zSimpleTrustManager.__init__  s#   € Ý‘e”eˆŒÝ!,­TÑ!2Ô!2ˆÔÐÐr'   NÚtrust_rootsÚextra_trust_rootsrE   c                 óâ   — |€d„ t          j        ¦   «         D ¦   «         }nt          |¦  «        }|�|                     |¦  «         t	          ¦   «         }|D ]}|                     |¦  «         Œ|S )a  
        :param trust_roots:
            If the operating system's trust list should not be used, instead
            pass a list of asn1crypto.x509.Certificate objects. These
            certificates will be used as the trust roots for the path being
            built.

        :param extra_trust_roots:
            If the operating system's trust list should be used, but augmented
            with one or more extra certificates. This should be a list of
            asn1crypto.x509.Certificate objects.
        :return:
        Nc                 ó   — g | ]
}|d          ‘ŒS )r   rA   )Ú.0Úes     r   ú
<listcomp>z,SimpleTrustManager.build.<locals>.<listcomp>  s   € Ð?Ð?Ð? A˜1˜Qœ4Ð?Ð?Ð?r'   )r   Úget_listr[   Úextendr|   Ú_register_root)rW   r�   r‚   ÚmanagerÚ
trust_roots        r   ÚbuildzSimpleTrustManager.build  s†   € ð& ÐØ?Ð?­Ô)<Ñ)>Ô)>Ð?Ñ?Ô?ˆKˆKå˜{Ñ+Ô+ˆKàÐ(Ø×ÒÐ0Ñ1Ô1Ð1å$Ñ&Ô&ˆØ%ð 	/ð 	/ˆJØ×"Ò" :Ñ.Ô.Ð.Ð.Øˆr'   rŒ   c                 ó   — t          |t          ¦  «        r|}nt          |¦  «        }|| j        vrM|j        }| j                             |¦  «         | j        |j        j                  	                    |¦  «         d S d S r   )
Ú
isinstancer   r   r   rw   Úaddr€   r2   rd   re   )r%   rŒ   Úanchorrw   s       r   rŠ   z!SimpleTrustManager._register_root+  s€   € Ý�j¥+Ñ.Ô.ð 	1ØˆFˆFå$ ZÑ0Ô0ˆFØ˜œÐ$Ð$ØÔ(ˆIØŒK�OŠO˜FÑ#Ô#Ð#ØÔ" 9¤>Ô#:Ô;×BÒBÀ6ÑJÔJÐJÐJÐJð %Ð$r'   rD   c                 ó.   — t          |¦  «        | j        v S )rt   )r   r   rH   s     r   rv   zSimpleTrustManager.is_root5  s   € õ ˜tÑ$Ô$¨¬Ð3Ð3r'   rw   c                 óš   ‡— 	 | j         ‰j        j                 }t          ˆfd„|D ¦   «         ¦  «        S # t          t
          f$ r Y d S w xY w)Nc              3   ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S r   )rw   )r…   r‘   rw   s     €r   ú	<genexpr>z5SimpleTrustManager.as_trust_anchor.<locals>.<genexpr>F  s=   øè è € ð ð àØÔ# yÒ0Ð0ð à0Ð0Ð0Ð0ðð r'   )r€   r2   rd   r   ro   r   )r%   rw   Úpossible_matchess    ` r   ru   z"SimpleTrustManager.as_trust_anchorB  s|   ø€ ð	Ø#Ô5°i´nÔ6MÔNÐÝð ð ð ð à.ðñ ô ñ ô ð øõ
 �-Ð(ð 	ð 	ð 	Ø�4�4ð	øøøs   ƒ15 µA
Á	A
c                 ó$   — d„ | j         D ¦   «         S )Nc              3   ób   K  — | ]*}t          |j        t          ¦  «        ¯|j        j        V — Œ+d S r   )r�   rw   r   Úcertificate)r…   Úroots     r   r•   z0SimpleTrustManager.iter_certs.<locals>.<genexpr>O  sN   è è € ð 
ð 
àÝ˜$œ.Õ*;Ñ<Ô<ð
ØŒNÔ&ð
ð 
ð 
ð 
ð 
ð 
r'   )r   rP   s    r   Ú
iter_certszSimpleTrustManager.iter_certsN  s%   € ð
ð 
àœð
ñ 
ô 
ð 	
r'   c              #   óÌ   K  — |j         j        }| j        |         D ]G}|j        j        }|t
          j        t
          j        fvrŒ)|j         	                    |¦  «        r|V — ŒHd S r   )
Úissuerrd   r€   Útrust_qualifiersÚtrusted_service_typer   ÚUNSPECIFIEDÚCERTIFICATE_AUTHORITYrw   Úis_potential_issuer_of)r%   rD   Úissuer_hashablerš   Úsvc_types        r   rz   z)SimpleTrustManager.find_potential_issuersU  sƒ   è è € ð œ+Ô.ˆàÔ*¨?Ô;ð 	ð 	ˆDØÔ,ÔAˆHØÝ"Ô.Ý"Ô8ð ð ð ð ØŒ~×4Ò4°TÑ:Ô:ð Ø�
�
�
øð	ð 	r'   )NN)r;   r<   r=   r>   r_   rp   r   ÚTrustRootListr�   r	   r   r
   rR   rŠ   rv   r   ru   r   r›   rz   rA   r'   r   r|   r|     s5  € € € € € ðð ð
3ð 3ð 3ð ð 04Ø59ðð à˜mÔ,ðð $ MÔ2ðð 
ð	ð ð ñ „[ðð>K¨¨{¸DÔ<LÐ/LÔ)Mð Kð Kð Kð Kð4˜DÔ,ð 4ð 4ð 4ð 4ð
¨ð 
ð 
ð 
ð 
ð
˜H TÔ%5Ô6ð 
ð 
ð 
ð 
ðØÔ$ðà	�+Ô	ðð ð ð ð ð r'   r|   c            	       ó  ‡ — e Zd ZdZddœdee         fˆ fd„Ze	 dddœdee	j
                 dee         fd„¦   «         Z	 dd	e	j        d
ee	j
                 fˆ fd„Zde	j
        dedeeee	j
        f                  fd„Zde	j
        fd„Zˆ xZS )ÚCertificateRegistryz§
    Contains certificate lists used to build validation paths, and
    is also capable of fetching missing certificates if a certificate
    fetcher is supplied.
    N©Úcert_fetcherr©   c                óV   •— t          ¦   «                              ¦   «          || _        d S r   )Úsuperr_   Úfetcher)r%   r©   Ú	__class__s     €r   r_   zCertificateRegistry.__init__l  s$   ø€ Ý‰Œ×ÒÑÔÐØ#ˆŒˆˆr'   rA   rJ   c                ó`   —  | |¬¦  «        }|D ]}|                      |¦  «         Œ||_        |S )aŽ  
        Convenience method to set up a certificate registry and import
        certs into it.

        :param certs:
            Initial list of certificates to import.
        :param cert_fetcher:
            Certificate fetcher to handle retrieval of missing certificates
            (in situations where that is possible).
        :return:
            A populated certificate registry.
        r¨   )rI   r¬   )rW   rJ   r©   rX   rD   s        r   r�   zCertificateRegistry.buildp  sF   € ð( '* c°|Ð&DÑ&DÔ&DˆØð 	"ð 	"ˆDØ�OŠO˜DÑ!Ô!Ð!Ð!à%ˆŒØˆr'   r2   Úfirst_certificatec                 óÜ   •— g }d}t          ¦   «                              |¦  «        D ],}|r|j        |j        k    r|}Œ|                     |¦  «         Œ-|r|                     d|¦  «         |S )af  
        Retrieves a list certs via their subject name

        :param name:
            An asn1crypto.x509.Name object

        :param first_certificate:
            An asn1crypto.x509.Certificate object that if found, should be
            placed first in the result list

        :return:
            A list of asn1crypto.x509.Certificate objects
        Nr   )r«   r5   Úsha256re   Úinsert)r%   r2   r¯   ÚoutputÚfirstrD   r­   s         €r   r5   z$CertificateRegistry.retrieve_by_name‹  s…   ø€ ð& ˆØˆÝ‘G”G×,Ò,¨TÑ2Ô2ð 	$ð 	$ˆDØ ð $Ð%6Ô%=ÀÄÒ%LÐ%LØ��à—’˜dÑ#Ô#Ð#Ð#Øð 	$Ø�MŠM˜!˜UÑ#Ô#Ð#Øˆr'   rD   Útrust_managerrE   c              #   ó  K  — |j         j        }|                     |¦  «        E d {V —† | j        |         D ]S}|                     |¦  «        rŒ|j        r|j        r|j        |j        k    rŒ7|j        r|j        |j        k    rŒO|V — ŒTd S r   )	r�   rd   rz   r\   rv   Úauthority_key_identifierr!   Úauthority_issuer_serialr8   )r%   rD   rµ   r£   r�   s        r   rz   z*CertificateRegistry.find_potential_issuers©  sÇ   è è € ð œ+Ô.ˆð !×7Ò7¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=àÔ'¨Ô8ð 
	ð 
	ˆFØ×$Ò$ VÑ,Ô,ð ØØÔ,ð °Ô1Fð ØÔ0°FÔ4IÒIÐIØØÔ+ð ØÔ/°6Ô3GÒGÐGØàˆLˆLˆLˆLð
	ð 
	r'   c                ó®   K  — | j         €d S d„ | j                              |¦  «        2 ¦   «         ƒ d {V —†}|                      |¦  «         |D ]}|W V — Œd S )Nc              “   ó$   K  — g | 3 d {V —†	 }|‘Œ6 S r   rA   )r…   r�   s     r   r‡   zGCertificateRegistry.fetch_missing_potential_issuers.<locals>.<listcomp>Å  sL   è è € ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
Ø#ˆFð
ð 
ð 
ð 
s   …)r¬   Úfetch_cert_issuersrN   )r%   rD   Úissuersr�   s       r   Úfetch_missing_potential_issuersz3CertificateRegistry.fetch_missing_potential_issuersÁ  s›   è è € ØŒ<ÐØˆFð
ð 
Ø'+¤|×'FÒ'FÀtÑ'LÔ'Lð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð 	×Ò˜wÑ'Ô'Ð'àð 	ð 	ˆFØˆLˆLˆLˆLˆLð	ð 	r'   )rA   r   )r;   r<   r=   r>   r   r   r_   rp   r   r
   rR   r�   r@   r5   rr   r   r	   r   rz   r½   Ú__classcell__)r­   s   @r   r§   r§   e  sa  ø€ € € € € ðð ð HLð $ð $ð $¨Ð1CÔ(Dð $ð $ð $ð $ð $ð $ð ð -/ðð 6:ð	ð ð à˜Ô(Ô)ðð Ð1Ô2ð	ð ð ñ „[ðð: 9=ðð àŒiðð $ DÔ$4Ô5ðð ð ð ð ð ð<ØÔ$ðØ5Aðà	�%˜ TÔ%5Ð5Ô6Ô	7ðð ð ð ð0
¸$Ô:Jð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r'   r§   c                   ód   — e Zd ZdZdedefd„Zd„ Zdej	        fd„Z
dej	        dee         fd	„Zd
S )ÚPathBuilderz(
    Class to handle path building.
    rµ   Úregistryc                 ó"   — || _         || _        d S r   )rµ   rÁ   )r%   rµ   rÁ   s      r   r_   zPathBuilder.__init__Ó  s   € ð +ˆÔØ ˆŒˆˆr'   c                 óP   — t          j        |                      |¦  «        ¦  «        S )aÛ  
        Builds a list of ValidationPath objects from a certificate in the
        operating system trust store to the end-entity certificate

        .. note::
            This is a synchronous equivalent of :meth:`async_build_paths`
            that calls the latter in a new event loop. As such, it can't be used
            from within asynchronous code.

        :param end_entity_cert:
            A byte string of a DER or PEM-encoded X.509 certificate, or an
            instance of asn1crypto.x509.Certificate

        :return:
            A list of pyhanko_certvalidator.path.ValidationPath objects that
            represent the possible paths from the end-entity certificate to one
            of the CA certs.
        )ÚasyncioÚrunÚasync_build_paths)r%   Úend_entity_certs     r   Úbuild_pathszPathBuilder.build_pathsÙ  s"   € õ& Œ{˜4×1Ò1°/ÑBÔBÑCÔCÐCr'   rÇ   c              ƒ   ót   K  — g }|                       |¦  «        2 3 d{V —†}|                     |¦  «         Œ6 |S )a1  
        Builds a list of ValidationPath objects from a certificate in the
        operating system trust store to the end-entity certificate, returning
        all paths in a single list.

        :param end_entity_cert:
            A byte string of a DER or PEM-encoded X.509 certificate, or an
            instance of asn1crypto.x509.Certificate

        :return:
            A list of pyhanko_certvalidator.path.ValidationPath objects that
            represent the possible paths from the end-entity certificate to one
            of the CA certs.
        N)Úasync_build_paths_lazyre   )r%   rÇ   ÚpathsrX   s       r   rÆ   zPathBuilder.async_build_pathsî  se   è è € ð  ')ˆØ ×7Ò7¸ÑHÔHð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!�&Ø�LŠL˜Ñ Ô Ð Ð ð Ið ˆs   š7rE   c                 óš   — t          | t          j        |¦  «        t          j        |j        ¦  «        g ¬¦  «        }t	          ||¦  «        S )a¢  
        Builds a list of ValidationPath objects from a certificate in the
        operating system trust store to the end-entity certificate, and emit
        them as an asynchronous generator.

        :param end_entity_cert:
            A byte string of a DER or PEM-encoded X.509 certificate, or an
            instance of asn1crypto.x509.Certificate

        :return:
            An asynchronous iterator that yields
            pyhanko_certvalidator.path.ValidationPath objects that
            represent the possible paths from the end-entity certificate to one
            of the CA certs, and raises PathBuildingError
            if no paths could be built
        )ÚpathÚ
certs_seenÚfailed_paths)Ú_PathWalkerr   Úsingr8   ÚLazyPathIterator)r%   rÇ   Úwalkers      r   rÊ   z"PathBuilder.async_build_paths_lazy  sM   € õ( ØÝ”˜Ñ/Ô/Ý”} _Ô%BÑCÔCØð	
ñ 
ô 
ˆõ   ¨Ñ8Ô8Ð8r'   N)r;   r<   r=   r>   rr   r§   r_   rÈ   r
   rR   rÆ   r   r   rÊ   rA   r'   r   rÀ   rÀ   Î  sž   € € € € € ðð ð!Ø)ð!Ø5Hð!ð !ð !ð !ðDð Dð Dð*°tÔ7Gð ð ð ð ð,9Ø#Ô/ð9à	  Ô	0ð9ð 9ð 9ð 9ð 9ð 9r'   rÀ   c                   ó¬   — e Zd Zdddej        dee         fd„Zed„ ¦   «         Z	d„ Z
d„ Zd	eeej        f         fd
„Zd	eeej        f         fd„Zd„ ZdS )Ú_IssuerFetcherÚpath_builderrÀ   rD   rÎ   c                 óä   — || _         || _        || _        | j        j                             || j        j        ¦  «        }t          |¦  «        | _        d| _        d| _	        d | _
        d| _        d S )Nr   F)rD   rÖ   rÎ   rÁ   rz   rµ   r   Úlocal_iss_iterÚlocal_issuers_foundÚfetched_issuers_foundÚ_fetched_casÚ_fetching_done)r%   rÖ   rD   rÎ   Úlocal_issuerss        r   r_   z_IssuerFetcher.__init__"  s}   € ð ˆŒ	Ø(ˆÔØ$ˆŒØÔ)Ô2×IÒIØ�$Ô#Ô1ñ
ô 
ˆõ # =Ñ1Ô1ˆÔØ#$ˆÔ Ø%&ˆÔ"àð 	Ôð $ˆÔÐÐr'   c                 ó    — | j         | j        z   S r   )rÙ   rÚ   rP   s    r   Úissuers_foundz_IssuerFetcher.issuers_found6  s   € àÔ'¨$Ô*DÑDÐDr'   c                 ó   — | S r   rA   rP   s    r   Ú	__aiter__z_IssuerFetcher.__aiter__:  ó   € Øˆr'   c                 ó   — | S r   rA   rP   s    r   rQ   z_IssuerFetcher.__iter__=  râ   r'   rE   c                 ó    — | j         D ]@}t          |t          j        ¦  «        r|j        }|| j        v rŒ-| xj        dz  c_        |c S t          ‚)Nr   )rØ   r�   r
   rR   r8   rÎ   rÙ   r   ©r%   r�   Úcert_ids      r   Ú__next__z_IssuerFetcher.__next__@  sd   € ØÔ)ð 	ð 	ˆFÝ˜&¥$Ô"2Ñ3Ô3ð Ø Ô.�Ø˜dœoÐ-Ð-ØØÐ$Ô$¨Ñ)Ð$Ô$ØˆMˆMˆMÝÐr'   c              ƒ   óT  K  — 	 t          | ¦  «        S # t          $ r Y nw xY w| j        €7| j        s0| j        s)| j        j                             | j        ¦  «        | _        | j        �;| j        2 3 d {V —†}|j	        }|| j
        v rŒ| xj        dz  c_        |c S 6 d| _        t          ‚)Nr   T)r   r   rÛ   rÙ   rÜ   rÖ   rÁ   r½   rD   r8   rÎ   rÚ   ÚStopAsyncIterationrå   s      r   Ú	__anext__z_IssuerFetcher.__anext__J  s   è è € ð	Ý˜‘:”:ÐøÝð 	ð 	ð 	ØˆDð	øøøð ÔÐ%ØÔ,ð &àÔ'ð &ð Ô!Ô*×JÒJØ”Iñô ð Ôð ÔÐ(Ø $Ô 1ð ð ð ð ð ð ð �fØ Ô.�Ø˜dœoÐ-Ð-ØØÐ*Ô*¨aÑ/Ð*Ô*Ø���ð !2ð #'ˆDÔÝ Ð s   „ “
 Ÿ Á/Bc              ƒ   óv   K  — | j         �/| j                              ¦   «         ƒ d {V —† d | _         d| _        d S d S )NT)rÛ   ÚacloserÜ   rP   s    r   Úcancelz_IssuerFetcher.cancelf  sT   è è € ØÔÐ(ØÔ#×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø $ˆDÔØ"&ˆDÔÐÐð )Ð(r'   N)r;   r<   r=   r
   rR   r   r?   r_   Úpropertyrß   rá   rQ   r	   r   rç   rê   rí   rA   r'   r   rÕ   rÕ   !  sæ   € € € € € ð$à#ð$ð Ôð$ð ˜U”Oð	$ð $ð $ð $ð( ðEð Eñ „XðEðð ð ðð ð ð˜% ¨TÔ-=Ð =Ô>ð ð ð ð ð!  {°DÔ4DÐ'DÔ!Eð !ð !ð !ð !ð8'ð 'ð 'ð 'ð 'r'   rÕ   c            
       ó|   — e Zd Zdddeej                 dee         deeej                          fd„Zd„ Z	d„ Z
d	„ Zd
S )rÐ   rÖ   rÀ   rÍ   rÎ   rÏ   c                 ó¾   — || _         || _        || _        |j        }t	          |t
          j        ¦  «        sJ ‚t          |||¦  «        | _        || _	        d | _
        d S r   )rÍ   rÖ   rÎ   Úheadr�   r
   rR   rÕ   Ú_issuer_fetcherrÏ   Ú_next_level)r%   rÖ   rÍ   rÎ   rÏ   rD   s         r   r_   z_PathWalker.__init__n  sd   € ð ˆŒ	Ø(ˆÔØ$ˆŒØŒyˆÝ˜$¥Ô 0Ñ1Ô1Ð1Ð1Ð1Ý-¨l¸DÀ*ÑMÔMˆÔØ(ˆÔØ26ˆÔÐÐr'   c              ƒ   óÂ   K  — | j         �&| j                              ¦   «         ƒ d {V —† d | _         | j        �(| j                             ¦   «         ƒ d {V —† d | _        d S d S r   )rò   rí   ró   rP   s    r   rí   z_PathWalker.cancel~  s„   è è € ØÔÐ+ØÔ&×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø#'ˆDÔ ØÔÐ'ØÔ"×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø#ˆDÔÐÐð (Ð'r'   c                 ó   — | S r   rA   rP   s    r   rá   z_PathWalker.__aiter__†  râ   r'   c              ƒ   óÀ  K  — | j         €t          ‚d }|�€H| j        �€	 | j                              ¦   «         ƒ d {V —†}nF# t          $ r9}| j         j        s| j                             | j        ¦  «         d | _         |‚d }~ww xY wt          |t          ¦  «        r3t          | j        ¦  «        }t          ||d d…         |d         ¦  «        S t          | j        | j                             |¦  «        | j                             |j        ¦  «        | j        ¦  «        | _        	 | j                             ¦   «         ƒ d {V —†}n# t          $ r
 d | _        Y nw xY w|�®H|S )Néÿÿÿÿ)rò   ré   ró   rê   rß   rÏ   re   rÍ   r�   r   r[   r   rÐ   rÖ   ÚconsrÎ   r8   )r%   Ú	next_pathÚnext_issuerr†   rJ   s        r   rê   z_PathWalker.__anext__‰  s•  è è € ØÔÐ'Ý$Ð$Øˆ	ØÑØÔÑ'ðØ(,Ô(<×(FÒ(FÑ(HÔ(HÐ"HÐ"HÐ"HÐ"HÐ"HÐ"H�K�KøÝ)ð ð ð ØÔ/Ô=ð <ØÔ)×0Ò0°´Ñ;Ô;Ð;Ø+/�DÔ(Ø�Gøøøøð	øøøõ
 ˜k­;Ñ7Ô7ð å  ¤™OœO�EÝ)¨+°u¸S¸b¸S´zÀ5ÈÄ9ÑMÔMÐMõ (3ØÔ)Øœ	Ÿš {Ñ3Ô3Øœ×,Ò,¨[Ô-FÑGÔGØÔ)ñ	(ô (�DÔ$ð(Ø"&Ô"2×"<Ò"<Ñ">Ô">Ð>Ð>Ð>Ð>Ð>Ð>�	�	øÝ%ð (ð (ð (Ø#'�Ô Ð Ð ð(øøøð5 Ñð8 Ðs'   Ÿ? ¿
BÁ	4A=Á=BÄ$E ÅEÅEN)r;   r<   r=   r   r
   rR   r?   r   r_   rí   rá   rê   rA   r'   r   rÐ   rÐ   m  s”   € € € € € ð7à#ð7ð �tÔ'Ô(ð7ð ˜U”Oð	7ð
 ˜8 DÔ$4Ô5Ô6ð7ð 7ð 7ð 7ð $ð $ð $ðð ð ð ð  ð  ð  ð  r'   rÐ   c                   ó\   — e Zd ZU dZee         ed<   dedej	        fd„Z
d„ Zd„ Zdefd	„ZdS )
rÒ   NÚ_as_rootrÓ   rD   c                 óÌ   — |j         j                             t          |¦  «        ¦  «        }|rt	          |g d ¦  «        | _        || _        d| _        |j        j	        | _
        d S )Nr   )rÖ   rµ   ru   r   r   rü   Ú_walkerÚemitted_countrc   Úhuman_friendlyÚ_name)r%   rÓ   rD   Úmaybe_trust_anchors       r   r_   zLazyPathIterator.__init__¯  sg   € à#Ô0Ô>×NÒNÝ˜dÑ#Ô#ñ
ô 
Ðð ð 	IÝ*Ð+=¸rÀ4ÑHÔHˆDŒMØ.4ˆŒØˆÔØ”\Ô0ˆŒ
ˆ
ˆ
r'   c              ƒ   óZ   K  — | j         �!| j                              ¦   «         ƒ d {V —† d S d S r   )rþ   rí   rP   s    r   rí   zLazyPathIterator.cancelº  sB   è è € ØŒ<Ð#Ø”,×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð $Ð#r'   c                 ó   — | S r   rA   rP   s    r   rá   zLazyPathIterator.__aiter__¾  râ   r'   rE   c              ƒ   óÖ  K  — | j         €t          ‚| j        �| xj        dz  c_        d | _         | j        S 	 | j                              ¦   «         ƒ d {V —†}| xj        dz  c_        |S # t          $ r Y nw xY w| j        dk    ra| j         j        d         j        }t          |t          j	        ¦  «        sJ ‚|j
        j        }d | _         t          d| j        › d|› d�¦  «        ‚t          ‚)Nr   r   z7Unable to build a validation path for the certificate "z" - no issuer matching "z" was found)rþ   ré   rü   rÿ   rê   rÏ   rñ   r�   r
   rR   r�   r   r   r  )r%   rù   Ú	path_headÚmissing_issuer_names       r   rê   zLazyPathIterator.__anext__Á  s1  è è € ØŒ<ÐÝ$Ð$ØŒ]Ð&ØÐÔ !Ñ#ÐÔØˆDŒLØ”=Ð ð	Ø"œl×4Ò4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆIØÐÔ !Ñ#ÐÔØÐøÝ!ð 	ð 	ð 	ØˆDð	øøøð Ô Ò"Ð"ØœÔ1°!Ô4Ô9ˆIÝ˜i­Ô)9Ñ:Ô:Ð:Ð:Ð:Ø"+Ô"2Ô"AÐØˆDŒLÝ#ð7Ø”Zð7ð 7à(ð7ð 7ð 7ñô ð õ
 !Ð s   ·0A( Á(
A5Á4A5)r;   r<   r=   rü   r   r   Ú__annotations__rÐ   r
   rR   r_   rí   rá   rê   rA   r'   r   rÒ   rÒ   ¬  s‰   € € € € € € Ø)-€Hˆh�~Ô&Ð-Ð-Ñ-ð	1˜{ð 	1°$Ô2Bð 	1ð 	1ð 	1ð 	1ð(ð (ð (ðð ð ð! ð !ð !ð !ð !ð !ð !r'   rÒ   c                   ód   — e Zd ZdZdee         fd„Zd„ Zdefd„Z	defd„Z
d	ej        fd
„Zd„ ZdS )ÚLayeredCertificateStorezi
    Trustless certificate store that looks up certificates in other stores
    in a specific order.
    Ústoresc                 ó   — || _         d S r   )Ú_stores)r%   r  s     r   r_   z LayeredCertificateStore.__init__ã  s   € ØˆŒˆˆr'   c              #   ó\   K  — | j         D ]!} t          ||¦  «        |¦  «        E d {V —† Œ"d S r   )r  Úgetattr)r%   Úmethod_nameÚsearch_termÚstores       r   Ú_forallzLayeredCertificateStore._forallæ  sT   è è € Ø”\ð 	@ð 	@ˆEØ2•w˜u kÑ2Ô2°;Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð	@ð 	@r'   r!   c                 óH   — t          |                      d|¦  «        ¦  «        S )Nr#   ©r[   r  r$   s     r   r#   z7LayeredCertificateStore.retrieve_many_by_key_identifierê  s&   € ÝØ�LŠLÐ:¸NÑKÔKñ
ô 
ð 	
r'   r,   c                 óH   — t          |                      d|¦  «        ¦  «        S )Nr.   r  r/   s     r   r.   z1LayeredCertificateStore.retrieve_many_by_key_hashï  s   € Ý�D—L’LÐ!<¸hÑGÔGÑHÔHÐHr'   r2   c                 óH   — t          |                      d|¦  «        ¦  «        S )Nr5   r  r4   s     r   r5   z(LayeredCertificateStore.retrieve_by_nameò  s   € Ý�D—L’LÐ!3°TÑ:Ô:Ñ;Ô;Ð;r'   c                 ó\   ‡— ˆfd„| j         D ¦   «         }t          d„ |D ¦   «         ¦  «        S )Nc              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r   )r9   )r…   r  r8   s     €r   r•   zDLayeredCertificateStore.retrieve_by_issuer_serial.<locals>.<genexpr>ö  sE   øè è € ð 
ð 
àð ×+Ò+¨MÑ:Ô:ð
ð 
ð 
ð 
ð 
ð 
r'   c              3   ó   K  — | ]}|®|V — Œ	d S r   rA   )r…   Úcs     r   r•   zDLayeredCertificateStore.retrieve_by_issuer_serial.<locals>.<genexpr>ú  s"   è è € ÐEÐE A°q°}˜a°}°}°}°}ÐEÐEr'   )r  r   )r%   r8   Ú
candidatess    ` r   r9   z1LayeredCertificateStore.retrieve_by_issuer_serialõ  sL   ø€ ð
ð 
ð 
ð 
àœð
ñ 
ô 
ˆ
õ ÐEÐE¨ÐEÑEÔEÑEÔEÐEr'   N)r;   r<   r=   r>   r   r    r_   r  r?   r#   r.   r
   r@   r5   r9   rA   r'   r   r
  r
  Ý  s½   € € € € € ðð ð
˜tÐ$9Ô:ð ð ð ð ð@ð @ð @ð
¸eð 
ð 
ð 
ð 
ð
I°%ð Ið Ið Ið Ið< T¤Yð <ð <ð <ð <ðFð Fð Fð Fð Fr'   r
  )-ÚabcrÄ   Úcollectionsr   Útypingr   r   r   r   r   r	   Ú
asn1cryptor
   Úoscryptor   rw   r   r   r   r   r   Úerrorsr   Úfetchersr   rÍ   r   Úutilr   r   r   ÚABCr    rC   rU   rR   r¥   rr   r|   r§   rÀ   rÕ   rÐ   rÒ   r
  rA   r'   r   ú<module>r&     sY  ðð €
€
€
Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Là Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð &Ð %Ð %Ð %Ð %Ð %Ø (Ð (Ð (Ð (Ð (Ð (Ø  Ð  Ð  Ð  Ð  Ð  Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ðP"ð P"ð P"ð P"ð P"˜CœGñ P"ô P"ð P"ðf"ð "ð "ð "ð "Ð,¨c¬gñ "ô "ð "ðB;ð ;ð ;ð ;ð ;Ð-ñ ;ô ;ð ;ð| ˜˜tÔ/°Ð<Ô=Ô>€ð*"ð *"ð *"ð *"ð *"ñ *"ô *"ð *"ðZað að að að a˜ñ aô að aðHfð fð fð fð fÐ0ñ fô fð fðRP9ð P9ð P9ð P9ð P9ñ P9ô P9ð P9ðfI'ð I'ð I'ð I'ð I'ñ I'ô I'ð I'ðX<ð <ð <ð <ð <ñ <ô <ð <ð~.!ð .!ð .!ð .!ð .!Ð.¨~Ô>ñ .!ô .!ð .!ðbFð Fð Fð Fð FÐ3ñ Fô Fð Fð Fð Fr'   