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-w101_d3s/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|||ƒs®tdd„ |ƒ}td|r–d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¤|r’t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   Ú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   ÚCertificater   r   r   Úclassmethodr1   Ú__classcell__r   r   r5   r   r      s   
		
 #r   N)Ú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   