U
    Nf"                     @   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 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)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-fbovo6ns/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autor4   ZDEFERr5   staticmethodr   r6   r   r   r   r   r   /   s   
	c                       s&  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< 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)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   rI   	__class__r   r   rN      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=   rA   r<   r@   r;   zYEither 'key_id', 'key_label', 'cert_label' or 'cert_id',must be provided in PKCS#11 setuprD   )defaultrJ   z?'token_label' is deprecated, use 'token_criteria.label' insteadr>   r   )rM   r   getr0   r#   listr   r   _process_pkcs11_id_valuer   r   r   r6   r4   warningswarnDeprecationWarningpop
setdefault)r   r   r?   	cert_fileZlblrO   r   r   r      sh    






z%PKCS11SignatureConfig.process_entries)$r   r    r!   r"   r#   r$   r;   r   r<   r%   r=   r	   ZCertificater>   r   r?   r   r@   rA   rB   intrC   r   r4   rD   rE   r   rF   boolrG   rH   r&   r   rN   r   __classcell__r   r   rO   r   r   `   s(   
	r-   c                 C   s"   t | trt| gS t| S d S r)   )r0   r[   r%   r   r   r^   r   r   r   rT     s    

rT   ) r   r7   rU   Zdataclassesr   typingr   r   r   r   r   r   Z
asn1cryptor	   Zpyhanko.configr
   Zpyhanko.config.errorsr   Zpyhanko.keysr   r   Zpyhanko.pdf_utils.miscr   __all__ZConfigurableMixinr   Enumr   r   r#   r[   rT   r   r   r   r   <module>   s"    
1 2