U
    <gx#                     @   s   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 d dl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
dgZeddG dd	 d	ejZG dd
 d
ejZeddG dd dejZeeef dddZ dS )    N)	dataclass)AnyIterableListOptionalSetUnion)algosx509)api)ConfigurationError)load_cert_from_pemderload_certs_from_pemder)get_and_applyTokenCriteriaPKCS11PinEntryModePKCS11SignatureConfigT)frozenc                   @   s>   e Zd ZU dZdZee ed< dZee	 ed< e
dd ZdS )r   zL
    .. versionadded:: 0.14.0

    Search criteria for a PKCS#11 token.
    Nlabelserialc              
   C   sZ   zt |d |d< W n> tk
r*   Y n, tk
rT } ztd|W 5 d }~X Y nX d S )Nr   z<Failed to parse PKCS #11 token serial number as a hex string)binascii	unhexlifyKeyError
ValueErrorr   )clsconfig_dicte r   9/tmp/pip-unpacked-wheel-w101_d3s/pyhanko/config/pkcs11.pyprocess_entries#   s    zTokenCriteria.process_entries)__name__
__module____qualname____doc__r   r   str__annotations__r   bytesclassmethodr   r   r   r   r   r      s
   
c                   @   s<   e Zd ZdZe Ze Ze Ze	e
d dddZdS )r   zT
    Pin entry behaviour if the user PIN is not supplied as part of the config.
    )valuereturnc                 C   sl   t | trXztj|   W S  tk
rT   td| dddd tD  dY qhX n| rbtjS tj	S d S )NzInvalid PIN entry mode z; must be one of z, c                 s   s   | ]}t |jV  qd S N)reprname).0xr   r   r   	<genexpr>V   s     z8PKCS11PinEntryMode.parse_mode_setting.<locals>.<genexpr>.)

isinstancer$   r   __members__upperr   r   joinPROMPTSKIP)r(   r   r   r   parse_mode_settingO   s    
 z%PKCS11PinEntryMode.parse_mode_settingN)r    r!   r"   r#   enumautor5   ZDEFERr6   staticmethodr   r7   r   r   r   r   r   /   s   
	c                       s8  e Zd ZU dZeed< dZee ed< dZee	 ed< dZ
eej ed< dZee ed< dZeeej  ed< dZee ed	< dZee	 ed
< dZee ed< dZee ed< ejZeed< dZeee  ed< dZeed< dZeed< dZeed< dZee j! ed< e"e#e d fddZ$e" fddZ%  Z&S )r   z
    Configuration for a PKCS#11 signature.

    This class is used to load PKCS#11 setup information from YAML
    configuration.
    module_pathN
cert_labelcert_idsigning_certificatetoken_criteriaother_certs	key_labelkey_idslot_nouser_pin
prompt_pinr   other_certs_to_pullT
bulk_fetchF
prefer_pssraw_mechanismsignature_mechanism)keys_suppliedc                    s   t  dd |D  d S )Nc                 S   s   h | ]}|d kr|qS ))token_labelztoken-labelr   )r-   kr   r   r   	<setcomp>   s   z:PKCS11SignatureConfig.check_config_keys.<locals>.<setcomp>)supercheck_config_keys)r   rK   	__class__r   r   rP      s
    z'PKCS11SignatureConfig.check_config_keysc                    s  t  | |dd}t|tr(|f}tt||d< |dd }|d k	rXt||d< d|krpt|d |d< d|krt|d |d< d|krd|krd|krd|krt	dd|kr|d |d< d|kr|d |d< d|kr"d|kr"d|kr"d|kr|d |d< d|kr"|d |d< t
|d	tjtjd
|d	< d|krtdt |d}d|krrd|i|d< n|d d| d S )Nr@   r   r>   rB   r=   rA   r<   zYEither 'key_id', 'key_label', 'cert_label' or 'cert_id',must be provided in PKCS#11 setuprE   )defaultrL   z?'token_label' is deprecated, use 'token_criteria.label' insteadr?   r   )rO   r   getr1   r$   listr   r   _process_pkcs11_id_valuer   r   r   r7   r5   warningswarnDeprecationWarningpop
setdefault)r   r   r@   	cert_fileZlblrQ   r   r   r      sh    






z%PKCS11SignatureConfig.process_entries)'r    r!   r"   r#   r$   r%   r<   r   r=   r&   r>   r
   Certificater?   r   r@   r   rA   rB   rC   intrD   r   r5   rE   rF   r   rG   boolrH   rI   rJ   r	   ZSignedDigestAlgorithmr'   r   rP   r   __classcell__r   r   rQ   r   r   `   s*   
	
r.   c                 C   s"   t | trt| gS t| S d S r*   )r1   r^   r&   r   r   ra   r   r   r   rV     s    

rV   )!r   r8   rW   dataclassesr   typingr   r   r   r   r   r   Z
asn1cryptor	   r
   Zpyhanko.configr   Zpyhanko.config.errorsr   Zpyhanko.keysr   r   Zpyhanko.pdf_utils.miscr   __all__ZConfigurableMixinr   Enumr   r   r$   r^   rV   r   r   r   r   <module>   s"    
1 <