§
    ¥”jpr  ã                   ó2  — d Z ddlZddlZ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mZmZ ddl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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' 	 ddlm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddlm0Z1 ddlm2Z3 n# e4$ rZ5 e4de5¦  «        ‚dZ5[5ww xY wg d¢Z6 ej7        e8¦  «        Z9dee         de3j:        deee;e;f                  fd„Z<dee         de3j:        de=fd„Z>	 	 d5dee3j?                 dee@         dee         dee3j:                 fd„ZA ed¬¦  «         G d„ d¦  «        ¦   «         ZBe+jC        e+jD        e+jE        e+jF        e+jG        d œZHe+jI        e+jJ        e+jK        e+jL        e+jM        d œZNe(jO        e(jP        e(jQ        e(jR        e(jS        d œZTe+jU        e+jV        e+jW        e+jX        e+jY        d œZZe+j[        e+j\        e+j]        e+j^        e+j_        d œZ`e+ja        e+jP        e+jQ        e+jR        e+jS        d œZbd!ejc        d"e;d#e=d$e
e;ef         deBf
d%„Zd	 	 	 	 d6d&e;dee@         d'ee;         dee         d(ee;eedf         de.fd)„Zf	 	 d5d*e;d+e=d,ee;         d-eeg         fd.„Zhd"e;d/e=fd0„Zi G d1„ d2e#¦  «        Zj G d3„ d4¦  «        ZkdS )7zÐ
This module provides PKCS#11 integration for pyHanko, by providing a wrapper
for `python-pkcs11 <https://github.com/danni/python-pkcs11>`_ that can be
seamlessly plugged into a :class:`~.signers.PdfSigner`.
é    N)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚUnion)ÚalgosÚcoreÚx509)ÚRSASSAPSSParams)Úhashes)ÚPKCS11PinEntryModeÚPKCS11SignatureConfigÚPKCS11SigningPinEntryModeÚTokenCriteria)Úcoalesce)ÚSigningError)ÚSigner)ÚCertificateStore)Úget_pyca_cryptography_hash)ÚMGFÚPROTECTED_AUTHÚ	AttributeÚ	MechanismÚObjectClassÚPKCS11ErrorÚSessionÚ	SignMixin)Úlib)ÚtypeszŸpyhanko.sign.pkcs11 requires pyHanko to be installed with the [pkcs11] option. You can install missing dependencies by running "pip install 'pyHanko[pkcs11]'".)ÚPKCS11SignerÚPKCS11SigningContextÚ
find_tokenÚopen_pkcs11_sessionÚselect_pkcs11_signing_paramsÚcriteriaÚtokenÚreturnc                 ó  — | €g S g }| j         �,|j         | j         k    r|                     d| j         f¦  «         | j        �>|j        | j        k    r.|                     d| j                             ¦   «         f¦  «         |S )NÚlabelÚserial)r-   Úappendr.   Úhex)r)   r*   Ú	err_itemss      úb/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/pyhanko/sign/pkcs11.pyÚcriteria_mismatchesr3   >   sˆ   € ð ÐØˆ	à€Ià„~Ð! e¤k°X´^Ò&CÐ&CØ×Ò˜' 8¤>Ð2Ñ3Ô3Ð3Ø„Ð" u¤|°x´Ò'FÐ'FØ×Ò˜( H¤O×$7Ò$7Ñ$9Ô$9Ð:Ñ;Ô;Ð;ØÐó    c                 ó$   — t          | |¦  «         S ©N)r3   )r)   r*   s     r2   Úcriteria_satisfied_byr7   M   s   € õ # 8¨UÑ3Ô3Ð3Ð3r4   ÚslotsÚslot_noÚtoken_criteriac                 ó<  — |€>|€<t          | ¦  «        dk    r| d                              ¦   «         S t          d¦  «        ‚d}|€?| D ];}	 |                     ¦   «         }t          ||¦  «        r|} nŒ,# t          $ r Y Œ8w xY wn˜|t          | ¦  «        k    r"t          d|› dt          | ¦  «        › �¦  «        ‚| |                              ¦   «         }t	          ||¦  «        }|r5d                     d„ |D ¦   «         ¦  «        }t          d	|› d
|› d�¦  «        ‚|}|S )a€  
    Internal helper method to find a token.

    :param slots:
        The list of slots.
    :param slot_no:
        Slot number to use. If not specified, the first slot containing a token
        satisfying the criteria will be used
    :param token_criteria:
        Criteria the token must satisfy.
    :return:
        A PKCS#11 token object, or ``None`` if none was found.
    Né   r   zJModule has more than 1 slot; slot index or token criteria must be providedzSlot index z too large; there are only ú, c              3   ó*   K  — | ]\  }}|› d |›�V — ŒdS )z is not N© )Ú.0ÚfieldÚvals      r2   ú	<genexpr>zfind_token.<locals>.<genexpr>�   sE   è è € ð  ð  Ù.8¨e°S�5Ð)Ð) #Ð)Ð)ð ð  ð  ð  ð  ð  r4   zToken in slot z does not satisfy criteria; ú.)ÚlenÚ	get_tokenr   r7   r3   Újoin)r8   r9   r:   r*   ÚslotÚ	cur_tokenÚerrorsÚerr_strs           r2   r&   r&   S   sŽ  € ð& Ð ' /Ýˆu‰:Œ:˜Š?ˆ?Ø˜”8×%Ò%Ñ'Ô'Ð'åð#ñô ð ð
 €EØ€Øð 	ð 	ˆDðØ ŸNšNÑ,Ô,�	Ý(¨¸ÑCÔCð Ø%�EØ�Eðøõ ð ð ð Ø�ðøøøøð •c˜%‘j”jÒ Ð ÝØN˜gÐNÐNÅ#ÀeÁ*Ä*ÐNÐNñô ð ð ˜'”N×,Ò,Ñ.Ô.ˆ	Ý$ ^°YÑ?Ô?ˆØð 	Ø—i’ið  ð  Ø<Bð ñ  ô  ñ ô ˆGõ ØP ÐPÐPÀgÐPÐPÐPñô ð ð ˆEØ€Ls   Á
&A3Á3
B Á?B T)Úfrozenc                   ó‚   — e Zd ZU dZeeef         ed<   	 ee	e
ge
f                  ed<   	 ee	e
ge
f                  ed<   dS )ÚPKCS11SignatureOperationSpeczq
    Internal helper class to describe how to invoke a signature operation on
    a key in a PKCS #11 token.
    Úsign_kwargsÚpre_sign_transformÚpost_sign_transformN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr   Ú__annotations__r   r   Úbytesr?   r4   r2   rN   rN   Œ   s|   € € € € € € ðð ð
 �c˜3�h”ÐÐÑðð ! ¨5¨'°5¨.Ô!9Ô:Ð:Ð:Ñ:ðð " (¨E¨7°E¨>Ô":Ô;Ð;Ð;Ñ;ðð r4   rN   )Úsha1Úsha224Úsha256Úsha384Úsha512Úsignature_mechanismÚdigest_algorithmÚuse_raw_mechanismrO   c                 ó  — ddl m} ddlm} d}d}i }	 | j        }	n# t
          $ r | d         j        }	Y nw xY w|	dk    r6|r"t          j        |d<   t          |d¬	¦  «        }�n†t          |         |d<   �nt|	d
k    r7|r!t          j        |d<   t          |d¬	¦  «        }nt          |         |d<   |}�n7|	dk    r6|r!t          j        |d<   t          |d¬	¦  «        }nt          |         |d<   |}nû|	dk    r‹|rt          d¦  «        ‚| d         }
||
d         d         j        k    sJ ‚t           |         |d<   t"          |         }|
d         d         d         j        }t$          |         }|
d         j        }|||f|d<   nj|	dk    r!|rt          d¦  «        ‚t          j        |d<   nC|	dk    r&|rt          d¦  «        ‚t          j        |d<   d|d<   nd|vrt          d|	› d�¦  «        ‚ |j        di |¤Ž t+          |||¬¦  «        S )a”  
    Internal helper function to set up a PKCS #11 signing operation.

    :param signature_mechanism:
        The signature mechanism to use (as an ASN.1 value)
    :param digest_algorithm:
        The digest algorithm to use
    :param use_raw_mechanism:
        Whether to attempt to use the raw mechanism on pre-hashed data.
    :param sign_kwargs:
        Override kwargs manually.
    :return:
    r   )Úencode_dsa_signature)Úencode_ecdsa_signatureNÚ	algorithmÚrsassa_pkcs1v15Ú	mechanismT)Úwrap_digest_infoÚdsaFÚecdsaÚ
rsassa_pssz$RSASSA-PSS not available in raw modeÚ
parametersÚhash_algorithmÚmask_gen_algorithmÚsalt_lengthÚmechanism_paramÚed25519z!Ed25519 not available in raw modeÚed448zEd448 not available in raw mode)FNzSignature algorithm 'z' is not supported.)rO   rP   rQ   r?   )Úpkcs11.util.dsarb   Úpkcs11.util.ecrc   Úsignature_algoÚ
ValueErrorÚnativer   ÚRSA_PKCSÚ_hash_fullyÚRSA_MECH_MAPÚDSAÚDSA_MECH_MAPÚECDSAÚECDSA_MECH_MAPÚNotImplementedErrorÚRSASSA_PSS_MECH_MAPÚDIGEST_MECH_MAPÚMGF_MECH_MAPÚEDDSAÚupdaterN   )r^   r_   r`   rO   rb   rc   rP   rQ   Úkwargsrt   ÚparamsÚpss_digest_paramÚmgf_valÚpss_mgf_paramÚpss_salt_lens                  r2   r(   r(   Ø   s	  € ð& 5Ð4Ð4Ð4Ð4Ð4Ø5Ð5Ð5Ð5Ð5Ð5àÐØÐØ€FðAØ,Ô;ˆˆøÝð Að Að AØ,¨[Ô9Ô@ˆˆˆðAøøøð Ð*Ò*Ð*Øð 	AÝ"+Ô"4ˆF�;ÑÝ!,Ø °4ð"ñ "ô "ÐÑõ #/Ð/?Ô"@ˆF�;ÑÑØ	˜5Ò	 Ð	 Øð 	AÝ"+¤-ˆF�;ÑÝ!,Ø °5ð"ñ "ô "ÐÐõ #/Ð/?Ô"@ˆF�;ÑØ2ÐÑØ	˜7Ò	"Ð	"Øð 	CÝ"+¤/ˆF�;ÑÝ!,Ø °5ð"ñ "ô "ÐÐõ
 #1Ð1AÔ"BˆF�;ÑØ4ÐÐØ	˜<Ò	'Ð	'Øð 	NÝ%Ð&LÑMÔMÐMØ"5°lÔ"CˆØ 6Ð*:Ô#;¸KÔ#HÔ#OÒOÐOÐOÐOõ 2Ð2BÔCˆˆ{Ñå*Ð+;Ô<ÐàÐ-Ô.¨|Ô<¸[ÔIÔPˆÝ$ WÔ-ˆØ˜mÔ,Ô3ˆð ØØð%
ˆÐ Ñ!Ð!ð
 
˜9Ò	$Ð	$Øð 	Kå%Ð&IÑJÔJÐJÝ'œoˆˆ{ÑÐØ	˜7Ò	"Ð	"Øð 	Iå%Ð&GÑHÔHÐHÝ'œoˆˆ{ÑØ$1ˆÐ Ñ!Ð!Ø	˜KÐ	'Ð	'Ý!ØG NÐGÐGÐGñ
ô 
ð 	
ð €F„MÐ Ð �KÐ Ð Ð Ý'ØØ-Ø/ðñ ô ð s   ” œ6µ6Úlib_locationÚtoken_labelÚuser_pinc                 ó&  — t          | ¦  «        }|€,|�*t          j        dt          ¦  «         t	          |¬¦  «        }|                     ¦   «         }t          |||¬¦  «        }|€t          |�d|›d�nd¦  «        ‚i }|�||d<    |j        d	i |¤ŽS )
a³  
    Open a PKCS#11 session

    :param lib_location:
        Path to the PKCS#11 module.
    :param slot_no:
        Slot number to use. If not specified, the first slot containing a token
        labelled ``token_label`` will be used.
    :param token_label:
        .. deprecated:: 0.14.0
            Use ``token_criteria`` instead.

        Label of the token to use. If ``None``, there is no constraint.
    :param token_criteria:
        Criteria that the token should match.
    :param user_pin:
        User PIN to use, or :attr:`.PROTECTED_AUTH`. If ``None``, authentication
        is skipped.

        .. note::
            Some PKCS#11 implementations do not require PIN when the token
            is opened, but will prompt for it out-of-band when signing.
            Whether :attr:`.PROTECTED_AUTH` or ``None`` is used in this case
            depends on the implementation.
    :return:
        An open PKCS#11 session object.
    Nz9'token_label' is deprecated, use 'token_criteria' instead)r-   )r9   r:   zNo token matching criteria z foundzNo token foundrŒ   r?   )	Úp11_libÚwarningsÚwarnÚDeprecationWarningr   Ú	get_slotsr&   r   Úopen)	rŠ   r9   r‹   r:   rŒ   r"   r8   r*   r„   s	            r2   r'   r'   =  sÍ   € õD �,Ñ
Ô
€CàÐ +Ð"9ÝŒØGÝñ	
ô 	
ð 	
õ '¨[Ð9Ñ9Ô9ˆà�MŠM‰OŒO€EÝ�u g¸nÐMÑMÔM€EØ€}ÝàÐ)ð C¨.ÐBÐBÐBÐBà!ñ
ô 
ð 	
ð €FØÐØ%ˆˆzÑàˆ5Œ:ÐÐ˜ÐÐÐr4   Úobject_kindÚ
no_resultsr-   Úid_valuec                 ó  — g }|�|                      d|› d�¦  «         |�>|                      dt          j        |¦  «                             d¦  «        › d�¦  «         |rdd                     |¦  «        › �nd}|r	d| › |› d	�}nd
| › |› d	�}|S )Nzlabel 'ú'zID 'Úasciiz with r=   Ú zCould not find rD   zFound more than one )r/   ÚbinasciiÚhexlifyÚdecoderG   )r”   r•   r-   r–   Ú	info_strsÚ	qualifierÚerrs          r2   Ú_format_pull_err_msgr¡   x  sË   € ð €IØÐØ×ÒÐ+ 5Ð+Ð+Ð+Ñ,Ô,Ð,ØÐØ×ÒÐM¥Ô 0°Ñ :Ô :× AÒ AÀ'Ñ JÔ JÐMÐMÐMÑNÔNÐNØ3<ÐDÐ/˜Ÿš 9Ñ-Ô-Ð/Ð/Ð/À"€IØð ?Ø9 Ð9¨YÐ9Ð9Ð9ˆˆà> [Ð>°)Ð>Ð>Ð>ˆØ€Jr4   rg   c                óV   ‡ ‡‡— t          ‰ ¦  «        Šdt          dt          fˆ ˆˆfd„}|S )NÚdatar+   c                 ó$  •— t          j        ‰¦  «        }|                     | ¦  «         |                     ¦   «         }‰rOt	          j        ‰                     ¦   «         t          j        ¦   «         dœ|dœ¦  «         	                    ¦   «         S |S )N)rd   rk   )r_   Údigest)
r   ÚHashrƒ   Úfinalizer   Ú
DigestInfoÚlowerr   ÚNullÚdump)r£   Úhr¥   r_   Úmd_specrg   s      €€€r2   Ú_hz_hash_fully.<locals>._hŽ  s�   ø€ ÝŒK˜Ñ Ô ˆØ	�Š�‰ŒˆØ—’‘”ˆØð 	ÝÔ#ð &6×%;Ò%;Ñ%=Ô%=Ý&*¤i¡k¤kð)ð )ð %ðð ñô ÷ Šd‰fŒfðð ˆMr4   )r   rX   )r_   rg   r®   r­   s   `` @r2   rx   rx   ‹  sP   øøø€ Ý(Ð)9Ñ:Ô:€Gð•ð �5ð ð ð ð ð ð ð ð ð" €Ir4   c                   óx  ‡ — e Zd ZU dZeeef         ed<   eeef         ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d&ded	e	e
         d
e	ej                 de	e
         de	e         de	e         de	ej                 de	ee
ef                  fˆ fd„Zd„ Zedefd„¦   «         Zed„ ¦   «         Zdedee
ef         fd„Zde
dee
ef         defd„Z	 d'dede
defd„Zdeej                 fd„Zdeeef         fd„Zde	e
         de	e         deeef         fd„Zdeeef         fd „Zde	e
         de	e         fd!„Zd"„ Z d#„ Z!d$„ Z"d%„ Z#ˆ xZ$S )(r$   a÷	  
    Signer implementation for PKCS11 devices.

    :param pkcs11_session:
        The PKCS11 session object to use.
    :param cert_label:
        The label of the certificate that will be used for signing, to
        be pulled from the PKCS#11 token.
    :param cert_id:
        ID of the certificate object that will be used for signing, to
        be pulled from the PKCS#11 token.
    :param signing_cert:
        The signer's certificate. If the signer's certificate is provided via
        this parameter, the ``cert_label`` and ``cert_id`` parameters will not
        be used to retrieve the signer's certificate.
    :param ca_chain:
        Set of other relevant certificates
        (as :class:`.asn1crypto.x509.Certificate` objects).
    :param key_label:
        The label of the key that will be used for signing.
        Defaults to the value of ``cert_label`` if left unspecified and
        ``key_id`` is also unspecified.

        .. note::
            At least one of ``key_id``, ``key_label`` and ``cert_label`` must
            be supplied.
    :param key_id:
        ID of the private key object (optional).
    :param other_certs_to_pull:
        List labels of other certificates to pull from the PKCS#11 device.
        Defaults to the empty tuple. If ``None``, pull *all* certificates.
    :param bulk_fetch:
        Boolean indicating the fetching strategy.
        If ``True``, fetch all certs and filter the unneeded ones.
        If ``False``, fetch the requested certs one by one.
        Default value is ``True``, unless ``other_certs_to_pull`` has one or
        fewer elements, in which case it is always treated as ``False``.
    :param use_raw_mechanism:
        Use the 'raw' equivalent of the selected signature mechanism. This is
        useful when working with tokens that do not support a hash-then-sign
        mode of operation.

        .. note::
            This functionality is only available for ECDSA at this time.
            Support for other signature schemes will be added on an as-needed
            basis.
    :param signature_mechanism:
        Specify the signature mechanism explicitly. By default, pyHanko will
        attempt to infer it from the key's properties.
    :param base_sign_kwargs:
        Directly specify some of the keyword arguments passed to the
        :meth:`pkcs11.SignMixin.sign` method.

        This can be used as an escape hatch to enable functionality
        (advanced auth, additional signing mechanisms) that are not
        directly supported by pyHanko.
    Údefault_cert_query_paramsÚdefault_key_query_paramsNFTr?   Úpkcs11_sessionÚ
cert_labelÚsigning_certÚ	key_labelÚkey_idÚcert_idr^   Úbase_sign_kwargsc                 óÒ  •— t          ||s|nd¦  «        | _        t          |
|s|nd¦  «        | _        t          ||s|
nd¦  «        | _        t          ||
s|nd¦  «        | _        || _        || _        d| _        |�t          |¦  «        dk    rd| _	        n|	| _	        || _
        d| _        d| _        |pi | _        d| _        t          ¦   «                              ||||¬¦  «         |r| j                             |¦  «         |�| j                             |¦  «         t(          j        t,          j        i| _        t(          j        t,          j        t(          j        di| _        dS )z-
        Initialise a PKCS11 signer.
        NFr<   )Ú
prefer_pssÚembed_rootsr´   r^   T)r   r³   r¶   r·   rµ   r²   Úother_certsÚ_other_certs_loadedrE   Ú
bulk_fetchr`   Ú_key_handleÚ_loadedÚ_sign_kwargsÚ_PKCS11Signer__loading_eventÚsuperÚ__init__Ú_cert_registryÚregister_multipleÚregisterr   ÚCLASSr   ÚCERTIFICATEr°   ÚPRIVATE_KEYÚSIGNr±   )Úselfr²   r³   r´   Úca_chainrµ   rº   r»   Úother_certs_to_pullr¾   r¶   r·   r`   r^   r¸   Ú	__class__s                  €r2   rÄ   zPKCS11Signer.__init__ã  sƒ  ø€ õ( #Ø¨Ð:˜	˜	°dñ
ô 
ˆŒõ ˜v°iÐ'I w wÀTÑJÔJˆŒÝ °zÐ)K¨¨ÀtÑLÔLˆŒÝ! )¸vÐ-O¨Z¨ZÈ4ÑPÔPˆŒØ,ˆÔØ.ˆÔØ#(ˆÔ ØÐ*­sÐ3FÑ/GÔ/GÈ1Ò/LÐ/LØ#ˆDŒOˆOà(ˆDŒOØ!2ˆÔØ04ˆÔØˆŒØ,Ð2°ˆÔØ#ˆÔÝ‰Œ×ÒØ!Ø#Ø%Ø 3ð	 	ñ 	
ô 	
ð 	
ð ð 	<ØÔ×1Ò1°(Ñ;Ô;Ð;ØÐ#ØÔ×(Ò(¨Ñ6Ô6Ð6åŒO�[Ô4ð*
ˆÔ&õ ŒO�[Ô4ÝŒN˜Dð)
ˆÔ%Ð%Ð%r4   c                 óˆ   — | j         s5|                      ¦   «         }| j                             |¦  «         d| _         | j        S )NT)r½   Ú_load_other_certsrÅ   rÆ   )rÌ   Úcertss     r2   Ú_init_cert_registryz PKCS11Signer._init_cert_registry  sH   € ð Ô'ð 	,Ø×*Ò*Ñ,Ô,ˆEØÔ×1Ò1°%Ñ8Ô8Ð8Ø'+ˆDÔ$ØÔ"Ð"r4   r+   c                 ó*   — |                       ¦   «         S r6   )rÓ   ©rÌ   s    r2   Úcert_registryzPKCS11Signer.cert_registry$  s   € ð ×'Ò'Ñ)Ô)Ð)r4   c                 ó8   — |                       ¦   «          | j        S r6   )Ú_load_objectsÚ_signing_certrÕ   s    r2   r´   zPKCS11Signer.signing_cert*  s   € à×ÒÑÔÐØÔ!Ð!r4   Údata_to_signc                 ó   — | j         S )a�  
        Supply keyword arguments to pass to the :meth:`pkcs11.SignMixin.sign`
        method.

        This can be used as an escape hatch to enable functionality
        (advanced auth, additional signing mechanisms) that are not
        directly supported by pyHanko.

        :param data_to_sign:
            The data being signed.

            .. note::
                In typical cases this parameter can be ignored;
                pyHanko exposes it to subclasses to allow for
                just-in-time credentials that depend on
                the content being signed.

        :return:
            A dictionary of keyword arguments.
        )rÁ   )rÌ   rÚ   s     r2   rO   zPKCS11Signer.sign_kwargs0  s   € ð* Ô Ð r4   r_   rO   c                 ó€   — |                      ¦   «         }t          |                      |¦  «        || j        |¬¦  «        S )N)r`   rO   )r©   r(   Ú"get_signature_mechanism_for_digestr`   )rÌ   r_   rO   s      r2   Ú_select_pkcs11_signing_paramsz*PKCS11Signer._select_pkcs11_signing_paramsG  sK   € ð ,×1Ò1Ñ3Ô3ÐÝ+Ø×3Ò3Ð4DÑEÔEØØ"Ô4Ø#ð	
ñ 
ô 
ð 	
r4   r£   c              ƒ   ól  ‡‡‡K  — |rdS |                       ¦   «         ƒ d {V —† ddlm} | j        €J ‚| j        Š|                      ||                      ‰¦  «        ¬¦  «        Š‰j        �‰                     ‰¦  «        Šˆˆˆfd„}t          j        ¦   «         }| 	                    d |¦  «        ƒ d {V —†S )Ns   00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000r   )r!   )rO   c                  óf   •—  ‰j         ‰fi ‰j        ¤Ž} ‰j        �‰                     | ¦  «        } | S r6   )ÚsignrO   rQ   )Ú	signaturer£   ÚkhÚspecs    €€€r2   Ú_perform_signaturez7PKCS11Signer.async_sign_raw.<locals>._perform_signaturee  sA   ø€ Ø˜œ Ð9Ð9¨Ô(8Ð9Ð9ˆIØÔ'Ð3Ø ×4Ò4°YÑ?Ô?�	ØÐr4   )
Úensure_objects_loadedÚpkcs11r!   r¿   rÞ   rO   rP   ÚasyncioÚget_running_loopÚrun_in_executor)	rÌ   r£   r_   Údry_runr!   rå   Úlooprã   rä   s	    `     @@r2   Úasync_sign_rawzPKCS11Signer.async_sign_rawR  s  øøøè è € ð ð 	à�:à×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø$Ð$Ð$Ð$Ð$Ð$àÔÐ+Ð+Ð+ØÔ(ˆØ×1Ò1Ø¨$×*:Ò*:¸4Ñ*@Ô*@ð 2ñ 
ô 
ˆð Ô"Ð.Ø×*Ò*¨4Ñ0Ô0ˆDð	ð 	ð 	ð 	ð 	ð 	ð 	õ Ô'Ñ)Ô)ˆØ×)Ò)¨$Ð0BÑCÔCÐCÐCÐCÐCÐCÐCÐCr4   c                 óD   — t          |                      ¦   «         ¦  «        S r6   )ÚsetÚ_PKCS11Signer__pullrÕ   s    r2   rÑ   zPKCS11Signer._load_other_certsn  s   € Ý�4—;’;‘=”=Ñ!Ô!Ð!r4   c                 ó*   — t          | j        ¦  «        S )z‚
        Search parameters to bulk fetch certificates from the token.

        .. note:: Can be overridden in subclasses.
        )Údictr°   rÕ   s    r2   Úbulk_cert_fetch_paramsz#PKCS11Signer.bulk_cert_fetch_paramsq  s   € õ �DÔ2Ñ3Ô3Ð3r4   r-   c                 ór   — t          | j        ¦  «        }|�||t          j        <   |�||t          j        <   |S )z…
        Search parameters to fetch a single certificate from the token.

        .. note:: Can be overridden in subclasses.
        )rò   r°   r   ÚLABELÚID)rÌ   r-   r·   Úquery_paramss       r2   Úsingle_cert_fetch_paramsz%PKCS11Signer.single_cert_fetch_paramsy  sE   € õ .2ØÔ*ñ.
ô .
ˆð ÐØ,1ˆL�œÑ)ØÐØ)0ˆL�œÑ&ØÐr4   c                 óš   — t          | j        ¦  «        }| j        �| j        |t          j        <   | j        �| j        |t          j        <   |S )z€
        Search parameters to fetch the signing key from the token.

        .. note:: Can be overridden in subclasses.
        )rò   r±   rµ   r   rõ   r¶   rö   )rÌ   r÷   s     r2   Úsigning_key_fetch_paramsz%PKCS11Signer.signing_key_fetch_params�  sF   € õ .2°$Ô2OÑ-PÔ-PˆØŒ>Ð%Ø,0¬NˆL�œÑ)ØŒ;Ð"Ø)-¬ˆL�œÑ&àÐr4   c                 óZ  — |                       ||¦  «        }| j                             |¦  «        }t          |¦  «        }t	          |¦  «        dk    r7|d         }t
          j                             |t          j	                 ¦  «        S t          d| ||¬¦  «        }t          |¦  «        ‚)Nr<   r   Úcertificate©r•   r-   r–   )rø   r²   Úget_objectsÚlistrE   r   ÚCertificateÚloadr   ÚVALUEr¡   r   )rÌ   r-   r·   r÷   ÚqÚresultsÚcert_objr    s           r2   Ú_pull_single_certzPKCS11Signer._pull_single_cert›  s¦   € ð
 ×4Ò4°U¸GÑDÔDˆØÔ×+Ò+¨LÑ9Ô9ˆõ �q‘'”'ˆÝˆw‰<Œ<˜1ÒÐØ˜q”zˆHÝÔ#×(Ò(¨µ)´/Ô)BÑCÔCÐCå&ØØ&˜;ØØ ð	ñ ô ˆCõ ˜cÑ"Ô"Ð"r4   c                 ó  — |                       ¦   «         }| j                             |¦  «        }t          |¦  «        }t	          |¦  «        dk    r|d         S t          d| | j        | j        ¬¦  «        }t          |¦  «        ‚)Nr<   r   zprivate keyrý   )	rú   r²   rþ   rÿ   rE   r¡   rµ   r¶   r   )rÌ   r÷   r  r  r    s        r2   Ú_pull_signing_key_handlez%PKCS11Signer._pull_signing_key_handle²  s…   € Ø×4Ò4Ñ6Ô6ˆØÔ×+Ò+¨LÑ9Ô9ˆå�q‘'”'ˆÝˆw‰<Œ<˜1ÒÐØ˜1”:Ðå&ØØ&˜;Ø”nØœð	ñ ô ˆCõ ˜cÑ"Ô"Ð"r4   c              #   ó@  K  — | j         }|�t          |¦  «        dk    rd S |�| j        r¶| j                             |                      ¦   «         ¦  «        }t                               d¦  «         |D ]k}|t          j	                 }|�||v rQd|› d�}t                               |¦  «         t          j                             |t          j                 ¦  «        V — Œld S |D ];}d|› d�}t                               |¦  «         |                      |d ¬¦  «        V — Œ<d S )Nr   z.Pulling all certificates from PKCS#11 token...zFound certificate with label 'z' on token.z Pulling certificate with label 'z' from PKCS#11 token...©r-   r·   )r¼   rE   r¾   r²   rþ   ró   ÚloggerÚdebugr   rõ   r   r   r  r  r  )rÌ   Úother_cert_labelsr  r  r-   Úmsgs         r2   Ú__pullzPKCS11Signer.__pullÂ  se  è è € Ø Ô,ÐØÐ(­SÐ1BÑ-CÔ-CÀqÒ-HÐ-Hð ˆFØÐ$¨¬Ð$àÔ#×/Ò/°×0KÒ0KÑ0MÔ0MÑNÔNˆAÝ�LŠLÐIÑJÔJÐJØð Kð K�Ø ¥¤Ô1�Ø$Ð,°Ð9JÐ0JÐ0Jð N¸5ÐMÐMÐM�CÝ—L’L Ñ%Ô%Ð%ÝÔ*×/Ò/°½¼Ô0IÑJÔJÐJÐJÐJøðKð Kð +ð 	Hð 	H�ð
(°uð (ð (ð (ð õ —’˜SÑ!Ô!Ð!Ø×,Ò,°5À$Ð,ÑGÔGÐGÐGÐGÐGð	Hð 	Hr4   c              ƒ   ó0  K  — | j         rdS | j        €dt          j        ¦   «         x| _        }t          j        ¦   «         }|                     d| j        ¦  «        ƒ d{V —† |                     ¦   «          dS | j                             ¦   «         ƒ d{V —† dS )aÎ  
        Async method that, when awaited, ensures that objects
        (relevant certificates, key handles, ...) are loaded.

        This coroutine is guaranteed to be called & awaited in :meth:`sign_raw`,
        but some property implementations may cause object loading to be
        triggered synchronously (for backwards compatibility reasons).
        This blocks the event loop the first time it happens.

        To avoid this behaviour, asynchronous code should ideally perform
        `await signer.ensure_objects_loaded()` after instantiating the signer.

        .. note::
            The asynchronous context manager on :class:`PKCS11SigningContext`
            takes care of that automatically.
        N)	rÀ   rÂ   rè   ÚEventré   rê   rØ   rï   Úwait)rÌ   Úeventrì   s      r2   ræ   z"PKCS11Signer.ensure_objects_loadedã  s¬   è è € ð$ Œ<ð 	ØˆFØÔÐ'Ý+2¬=©?¬?Ð:ˆDÔ  5ÝÔ+Ñ-Ô-ˆDØ×&Ò& t¨TÔ-?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø�IŠI‰KŒKˆKˆKˆKð Ô&×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r4   c                 óÞ   — | j         rd S |                      ¦   «          | j        €&|                      | j        | j        ¬¦  «        | _        |                      ¦   «         }|| _        d| _         d S )Nr
  T)rÀ   rÓ   rÙ   r  r³   r·   r  r¿   )rÌ   rã   s     r2   rØ   zPKCS11Signer._load_objects  sx   € ØŒ<ð 	ØˆFà× Ò Ñ"Ô"Ð"ØÔÐ%Ø!%×!7Ò!7Ø”o¨t¬|ð "8ñ "ô "ˆDÔð ×*Ò*Ñ,Ô,ˆØˆÔàˆŒˆˆr4   )NNNNFTr?   TNNFNN)F)%rR   rS   rT   rU   r   r   r   rW   r    r   rV   r   r   rX   r   ÚSignedDigestAlgorithmrÄ   rÓ   Úpropertyr   rÖ   r´   rO   rN   rÞ   rí   r	   rÑ   ró   rø   rú   r  r  rð   ræ   rØ   Ú__classcell__)rÏ   s   @r2   r$   r$   ¥  s)  ø€ € € € € € ð8ð 8ðt  $ I¨s NÔ3Ð3Ð3Ñ3Ø" 9¨c >Ô2Ð2Ð2Ñ2ð
 %)Ø37ØØ#'ØØØØØ"&Ø#'ØØEIØ59ð6
ð 6
àð6
ð ˜S”Mð6
ð ˜tÔ/Ô0ð	6
ð ˜C”=ð6
ð ˜”ð6
ð ˜%”ð6
ð & eÔ&AÔBð6
ð # 4¨¨S¨¤>Ô2ð6
ð 6
ð 6
ð 6
ð 6
ð 6
ðp#ð #ð #ð ð*Ð/ð *ð *ð *ñ „Xð*ð
 ð"ð "ñ „Xð"ð
!¨ð !°$°s¸C°x´.ð !ð !ð !ð !ð.	
Ø #ð	
Ø26°s¸C°x´.ð	
à	%ð	
ð 	
ð 	
ð 	
ð ;@ðDð DØðDØ-0ðDà	ðDð Dð Dð Dð8" 3 tÔ'7Ô#8ð "ð "ð "ð "ð4¨¨Y¸¨^Ô(<ð 4ð 4ð 4ð 4ðà˜Œ}ðð ˜%”ðð 
ˆi˜ˆnÔ	ð	ð ð ð ð(¨$¨y¸#¨~Ô*>ð ð ð ð ð#à˜Œ}ð#ð ˜%”ð#ð #ð #ð #ð.#ð #ð #ð Hð Hð HðB.ð .ð .ð<ð ð ð ð ð ð r4   r$   c                   ó\   — e Zd ZdZ	 ddedee         fd„Zd„ Zde	fd„Z
d	„ Zd
„ Zd„ Zd„ ZdS )r%   z+Context manager for PKCS#11 configurations.NÚconfigrŒ   c                 ó0   — || _         d | _        || _        d S r6   )r  Ú_sessionÚ	_user_pin)rÌ   r  rŒ   s      r2   rÄ   zPKCS11SigningContext.__init__  s   € ð ˆŒØ+/ˆŒØ!ˆŒˆˆr4   c                 ó˜   — | j         p| j        j        }|�t          |¦  «        }n$| j        j        t
          j        k    rt          }nd }|S r6   )r  r  rŒ   rV   Ú
prompt_pinr   ÚDEFERr   )rÌ   Úpins     r2   Ú_handle_pinz PKCS11SigningContext._handle_pin  sJ   € ØŒnÐ4 ¤Ô 4ˆàˆ?Ý�c‘(”(ˆCˆCØŒ[Ô#Õ'9Ô'?Ò?Ð?Ý ˆCˆCàˆCØˆ
r4   r+   c                 óB  — | j         }|                      ¦   «         }	 t          |j        |j        |j        |¬¦  «        x| _        }nG# t          j        $ r5}t          d|j        › dt          |¦  «        j        › d|› �¦  «        |‚d }~ww xY wi }|j        t          j        k    r|j        p||d<   t!          ||j        |j        |j        |j        |j        |j        |j        |j        |j        |j        |j        |¬¦  «        }|j        rd|j        t<          j        <   |S )N)r9   r:   rŒ   z'PKCS#11 error while opening session to z: [z] r   )rÍ   rµ   rº   r`   rÎ   r¾   r¶   r·   r´   r^   r¸   T) r  r!  r'   Úmodule_pathr9   r:   r  rç   r   r   ÚtyperR   Úsigning_pin_moder   ÚREAUTHENTICATEÚsigning_pinr$   r³   r¼   rµ   rº   Úraw_mechanismrÎ   r¾   r¶   r·   Úsigning_certificater^   Úonly_resident_certsr°   r   ÚTOKEN)rÌ   r  r   ÚsessionÚexÚbase_signing_kwargsÚsigners          r2   Ú_instantiatez!PKCS11SigningContext._instantiate&  s`  € Ø”ˆØ×ÒÑ Ô ˆð
	Ý&9ØÔ"ØœØ%Ô4Øð	'ñ 'ô 'ð ˆDŒM˜G˜Gøõ Ô!ð 	ð 	ð 	ÝØj¸&Ô:LÐjÐjÕQUÐVXÑQYÔQYÔQbÐjÐjÐfhÐjÐjñô àðøøøøð	øøøð !ÐØÔ"Õ&?Ô&NÒNÐNØ)/Ô);Ð)B¸sÐ Ñ&ÝØØÔØÔ'ØÔ&ØÔ(Ø$Ô2Ø &Ô :ØÔ(Ø”=Ø”NØÔ3Ø &Ô :Ø0ð
ñ 
ô 
ˆð Ô%ð 	EØ@DˆFÔ,­Y¬_Ñ=Øˆs   �)A ÁBÁ0BÂBc                 ó*   — |                       ¦   «         S r6   )r0  rÕ   s    r2   Ú	__enter__zPKCS11SigningContext.__enter__K  s   € Ø× Ò Ñ"Ô"Ð"r4   c              ƒ   ó¦   K  — t          j        ¦   «         }|                     d | j        ¦  «        ƒ d {V —†}|                     ¦   «         ƒ d {V —† |S r6   )rè   ré   rê   r0  ræ   )rÌ   rì   r/  s      r2   Ú
__aenter__zPKCS11SigningContext.__aenter__N  sg   è è € ÝÔ'Ñ)Ô)ˆØ×+Ò+¨D°$Ô2CÑDÔDÐDÐDÐDÐDÐDÐDˆØ×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Øˆr4   c                 ó8   — | j                              ¦   «          d S r6   ©r  Úclose©rÌ   Úexc_typeÚexc_valÚexc_tbs       r2   Ú__exit__zPKCS11SigningContext.__exit__T  s   € ØŒ×ÒÑÔÐÐÐr4   c              ƒ   ó<   K  — | j                              ¦   «          d S r6   r6  r8  s       r2   Ú	__aexit__zPKCS11SigningContext.__aexit__W  s    è è € ØŒ×ÒÑÔÐÐÐr4   r6   )rR   rS   rT   rU   r   r   rV   rÄ   r!  r$   r0  r2  r4  r<  r>  r?   r4   r2   r%   r%     sµ   € € € € € Ø5Ð5ð HLð"ð "Ø+ð"Ø7?À´}ð"ð "ð "ð "ð	ð 	ð 	ð#˜lð #ð #ð #ð #ðJ#ð #ð #ðð ð ðð ð ðð ð ð ð r4   r%   )NN)NNNN)lrU   rè   r›   Úloggingr�   Údataclassesr   Útypingr   r   r   r   r   r	   r
   r   rç   Ú
asn1cryptor   r   r   Úasn1crypto.algosr   Úcryptography.hazmat.primitivesr   Úpyhanko.config.pkcs11r   r   r   r   Úpyhanko.pdf_utils.miscr   Úpyhanko.sign.generalr   Úpyhanko.sign.signersr   Úpyhanko_certvalidator.registryr   Úpyhanko_certvalidator.utilr   r   r   r   r   r   r   r    r!   r"   rŽ   r#   Ú	p11_typesÚImportErrorÚeÚ__all__Ú	getLoggerrR   r  ÚTokenrV   r3   Úboolr7   ÚSlotÚintr&   rN   ÚSHA1_RSA_PKCSÚSHA224_RSA_PKCSÚSHA256_RSA_PKCSÚSHA384_RSA_PKCSÚSHA512_RSA_PKCSry   ÚSHA1_RSA_PKCS_PSSÚSHA224_RSA_PKCS_PSSÚSHA256_RSA_PKCS_PSSÚSHA384_RSA_PKCS_PSSÚSHA512_RSA_PKCS_PSSr   ÚSHA1ÚSHA224ÚSHA256ÚSHA384ÚSHA512r�   Ú
ECDSA_SHA1ÚECDSA_SHA224ÚECDSA_SHA256ÚECDSA_SHA384ÚECDSA_SHA512r}   ÚDSA_SHA1Ú
DSA_SHA224Ú
DSA_SHA256Ú
DSA_SHA384Ú
DSA_SHA512r{   ÚSHA_1r€   r  r(   Úobjectr'   rX   r¡   rx   r$   r%   r?   r4   r2   ú<module>ro     s   ððð ð €€€Ø €€€Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ià €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +Ø -Ð -Ð -Ð -Ð -Ð -Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø AÐ AÐ AÐ AÐ AÐ Aðð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð &Ð%Ð%Ð%Ð%Ð%Ø)Ð)Ð)Ð)Ð)Ð)Ð)øØð ð ð Ø
ˆ+ð	Eð 	
ñ	ô ð øøøøðøøøðð ð €ð 
ˆÔ	˜8Ñ	$Ô	$€ðØ�}Ô%ðØ.7¬oðà	ˆ%��S�Œ/Ôðð ð ð ð4Ø�}Ô%ð4Ø.7¬oð4à	ð4ð 4ð 4ð 4ð "Ø.2ð6ð 6Ø�	”Ôð6à�cŒ]ð6ð ˜]Ô+ð6ð ˆiŒoÔð	6ð 6ð 6ð 6ðr €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð. Ô#ØÔ'ØÔ'ØÔ'ØÔ'ðð €ð Ô'ØÔ+ØÔ+ØÔ+ØÔ+ðð Ð ð ŒHØŒjØŒjØŒjØŒjðð €ð Ô ØÔ$ØÔ$ØÔ$ØÔ$ðð €ð ÔØÔ"ØÔ"ð
 Ô"ØÔ"ð
ð 
€ð ŒOØÔØÔØÔØÔðð €ðbØÔ4ðbàðbð ðbð �c˜3�h”ð	bð
 "ðbð bð bð bðN "Ø!%Ø.2Ø)-ð8 ð 8 Øð8 à�cŒ]ð8 ð ˜#”ð8 ð ˜]Ô+ð	8 ð
 �C˜ Ð%Ô&ð8 ð ð8 ð 8 ð 8 ð 8 ð|  Ø $ð	ð Øðàðð �CŒ=ðð �uŒoð	ð ð ð ð& #ð ¸Dð ð ð ð ð4ið ið ið ið i�6ñ iô ið iðXGð Gð Gð Gð Gñ Gô Gð Gð Gð Gs   Á2 B ÂB)ÂB$Â$B)