U
    gW                     @   sx   d dl 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mZ eeedddZed	d
G dd de
ZdS )    )	dataclass)OptionalSet)x509)InvalidCertificateError)ConfigurableMixinprocess_bit_string_flagsprocess_oidsrequiredZpresentneed_allc                 C   s   |r| |  S t | |@ S d S N)boolr
    r   D/tmp/pip-unpacked-wheel-owvgwkas/pyhanko/sign/validation/settings.py_match_usages   s    
r   T)frozenc                       s   e Zd ZU dZdZeee  ed< dZ	eee  ed< dZ
eee  ed< dZeed< dZeed	< ejd
ddZdd Zdd Ze fddZ  ZS )KeyUsageConstraintsa5  
    Convenience class to pass around key usage requirements and validate them.
    Intended to be flexible enough to handle both PKIX and ISO 32000 certificate
    seed value constraint semantics.

    .. versionchanged:: 0.6.0
        Bring extended key usage semantics in line with :rfc:`5280` (PKIX).
    N	key_usagekey_usage_forbiddenextd_key_usageT explicit_extd_key_usage_requiredFmatch_all_key_usages)certc                 C   s   |  |j | |j d S r   )_validate_key_usageZkey_usage_value_validate_extd_key_usageZextended_key_usage_value)selfr   r   r   r   validatef   s    zKeyUsageConstraints.validatec                 C   s   | j s
d S | j pt }| jp t }|d k	r4t|jnt }||@ }|rjtdd |}tdd| d| j}t|||stdd |}td|rdnd	 d
d| dd S )Nc                 S   s   |  ddS N_ replacesr   r   r   <lambda>z       z9KeyUsageConstraints._validate_key_usage.<locals>.<lambda>zBThe active key usage policy explicitly bans certificates used for , .c                 S   s   |  ddS r   r!   r#   r   r   r   r%      r&   z%The active key usage policy requires  zat least one of zthe key usage extensions z to be present.)	r   setr   nativemapr   joinr   r   )r   Zkey_usage_extension_valuer   r   Zcert_kuZforbidden_ku	rephrasedZneed_all_kur   r   r   r   j   s(    z'KeyUsageConstraints._validate_key_usagec                 C   s   | j d krd S |d k	}|r$t|jnt }d|kr<| js<d S | j pFt }|s^| jrZtdd S t||dds|rtdd |}dd| d	}nd
}td| d S )NZany_extended_key_usagezEThe active key usage policy requires an extended key usage extension.F)r   c                 S   s   |  ddS r   r!   r#   r   r   r   r%      r&   z>KeyUsageConstraints._validate_extd_key_usage.<locals>.<lambda>zRelevant key purposes are r'   r(   z,There are no acceptable extended key usages.zfThe extended key usages for which this certificate is valid do not match the active key usage policy. )r   r*   r+   r   r   r   r,   r-   )r   Zeku_extension_valueZhas_extd_key_usage_extZcert_ekur   r.   Zok_listr   r   r   r      s2    
z,KeyUsageConstraints._validate_extd_key_usagec              	      sv   t  | dD ]6}||d }|d k	rtttj||dd||< q|dd }|d k	rrtttj	|d|d< d S )N)r   r   r   -r   zextd-key-usage)
superprocess_entriesgetr*   r   r   ZKeyUsager"   r	   ZKeyPurposeId)clsZconfig_dictZkey_usage_settZaffected_flagsr   	__class__r   r   r1      s(    

  z#KeyUsageConstraints.process_entries)__name__
__module____qualname____doc__r   r   r   str__annotations__r   r   r   r   r   r   ZCertificater   r   r   classmethodr1   __classcell__r   r   r4   r   r      s   
		
 #r   N)Zdataclassesr   typingr   r   Z
asn1cryptor   Zpyhanko_certvalidator.errorsr   Zpyhanko.config.apir   r   r	   r*   r   r   r   r   r   r   r   <module>   s   