U
    ;g)                     @  s  d dl m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mZmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZ d	d
ddddZdddddZdddddZdddddZ dd
dddZ!dddd Z"dd!dd"d#Z#dd!dd$d%Z$dd!dd&d'Z%d(d) Z&dd*d+d,Z'dd*d-d.Z(d<ddd/d0d1d2d3Z)e
d4Z*ed5d6G d7d8 d8ee* Z+e
d9Z,G d:d; d;ej-ee, Z.dS )=    )annotationsN)	dataclass)AsyncIteratorGenericListOptionalTypeVarUnion)algoscmscorex509)PublicKeyInfo)hashesserialization)dsaeced448ed25519paddingrsazx509.GeneralNamesstrz	x509.Name)nameserr_msg_prefixreturnc                 C  sB   zt dd | D }W n" tk
r8   t| dY nX | S )Nc                 s  s   | ]}|j d kr|jV  qdS )Zdirectory_nameN)namechosen).0gname r   >/tmp/pip-unpacked-wheel-hgp_x7fx/pyhanko_certvalidator/util.py	<genexpr>   s    
 z#extract_dir_name.<locals>.<genexpr>z>; only distinguished names are supported, and none were found.)nextStopIterationNotImplementedErrorZuntag)r   r   r   r   r   r    extract_dir_name   s    
r%   zcms.AttributeCertificateV2)	attr_certr   c                 C  sR   | d d }|j dkr|j}n*|j}t|d tjs>|d }n
tg }t|dS )Nac_infoissuerZv1_formissuer_namez Could not extract AC issuer name)r   r   
isinstancer   Voidr   GeneralNamesr%   )r&   Z
issuer_recZaa_namesZissuerv2r   r   r    extract_ac_issuer_dir_name#   s    


r-   z3Union[x509.Certificate, cms.AttributeCertificateV2])certr   c                 C  s   t | tjr| jS t| S d S N)r*   r   Certificater(   r-   r.   r   r   r    get_issuer_dn2   s    r2   bytesc                 C  s:   t | tjr| jS t| }d|j| d d jf }|S d S )Ns   %s:%dr'   serial_number)r*   r   r0   issuer_serialr-   sha256native)r.   r)   Zresult_bytesr   r   r    r5   ;   s    r5   r&   ext_namec                   s<   z t  fdd| d d D W S  tk
r6   Y d S X d S )Nc                 3  s&   | ]}|d  j  kr|d jV  qdS )Zextn_idZ
extn_valueN)r7   parsed)r   extr9   r   r    r!   M   s   z)get_ac_extension_value.<locals>.<genexpr>r'   
extensions)r"   r#   r8   r   r<   r    get_ac_extension_valueI   s    

r>   z$Optional[x509.CRLDistributionPoints])dpsc                 c  sX   | d krd S | D ]B}|d }t |tjr*q|jdkr6q|jD ]}|jdkr<|V  q<qd S )Ndistribution_pointZname_relative_to_crl_issueruniform_resource_identifier)r*   r   r+   r   r   )r?   r@   Zdistribution_point_namegeneral_namer   r   r    _get_absolute_http_crlsV   s    


rC   zList[x509.DistributionPoint]c                 C  s   t | d}tt|S )Ncrl_distribution_pointsr>   listrC   )r&   Zdps_extr   r   r    _get_ac_crl_dpsi   s    
rG   c                 C  s   t | d}tt|S )NZfreshest_crlrE   )r&   Zdelta_dps_extr   r   r    _get_ac_delta_crl_dpsp   s    
rH   c                C  sL   t | tj}|rt| j}nt| }|rH|r:|| j n|t|  |S r/   )	r*   r   r0   rF   rD   rG   extendZdelta_crl_distribution_pointsrH   )r.   Z
use_deltasZis_pkcsourcesr   r   r    get_relevant_crl_dpsw   s    	rK   c                 c  sV   | d krd S | D ]@}|d j dkr|d }|jdkr6q|j }| dr|V  qd S )Naccess_methodocspaccess_locationrA   )zhttp://zhttps://)r7   r   lower
startswith)Zaia_extentrylocationurlr   r   r    _get_http_ocsp_urls   s    
rT   r1   c                 C  s*   t | tjr| j}n
t| d}tt|S )Nauthority_information_access)r*   r   r0   "authority_information_access_valuer>   rF   rT   )r.   aiar   r   r    get_ocsp_urls   s    
rX   c                 C  s^   t | tjr| j}| j}nt| d}t| d}|d k	}|d k	rRtdd |D }nd}||fS )NrU   rD   c                 s  s   | ]}|d  j dkV  qdS )rL   rM   N)r7   )r   rQ   r   r   r    r!      s     z'get_declared_revinfo.<locals>.<genexpr>F)r*   r   r0   rV   Zcrl_distribution_points_valuer>   any)r.   rW   Zcrl_dpsZhas_crlZhas_ocspr   r   r    get_declared_revinfo   s    

rZ   r   zalgos.SignedDigestAlgorithm)	signaturesigned_datapublic_key_infosigned_digest_algorithmc                 C  s  ddl m}m} |j}|dkr8|d d jd kr8|d|jdkr| }t|tj	sZt
|d d j}|d k	r||jkr|ddd	i|d< t| }	|d
kr|j}
t|	tjst
tt|
  }|	| |t | n|dkr|j}
t|	tjst
t|tj	st
|d }|d jdks6td|d d j}|d j}tt|  }tjtj|d|d}tt|
  }|	| ||| n|dkr|j}
t|	tjst
tt|
  }|	| || n|dkr |j}
t|	tjst
tt|
  }|	| |t| nd|dkrJt|	tj s<t
|	| | n:|dkrtt|	t!j"sft
|	| | ntd| dd S )N   )DSAParametersUnavailablePSSParameterMismatchr   	algorithm
parametersz,DSA public key parameters were not provided.Z
rsassa_psszPPublic key info includes PSS parameters that do not match those on the signaturer   Zrsassa_pkcs1v15Zmask_gen_algorithmZmgf1zOnly MFG1 is supportedsalt_length)rb   )mgfrd   Zecdsar   r   zSignature mechanism z is not supported.)#errorsr`   ra   Zsignature_algor7   rb   copyr*   r
   ZRSASSAPSSParamsAssertionErrorr   load_der_public_keydump	hash_algor   RSAPublicKeygetattrr   upperverifyr   PKCS1v15r$   PSSMGF1r   DSAPublicKeyr   EllipticCurvePublicKeyECDSAr   Ed25519PublicKeyr   Ed448PublicKey)r[   r\   r]   r^   rc   r`   ra   Zsig_algoZpss_key_paramsZpub_keyrk   hZmgaZmgf_md_nameZsalt_lenZmgf_mdZpss_paddingZ	hash_specr   r   r    validate_sig   sv    



 




ry   ListElemT)frozenc                   @  s   e Zd ZU ded< dZded< edddd	Zed
ddddZdd Ze	ddddZ
d
ddddZdd Zdd ZdS )ConsListzOptional[ListElem]headNzOptional[ConsList[ListElem]]tailzConsList[ListElem])r   c                   C  s
   t d dS )Nr}   r|   r   r   r   r    empty  s    zConsList.emptyrz   )valuer   c                 C  s   t | t  S r/   )r|   r   )r   r   r   r    sing  s    zConsList.singc                 c  s"   | }|j d k	r|j V  |j}qd S r/   )r}   r~   )selfcurr   r   r    __iter__#  s    
zConsList.__iter__c                 C  s$   | }d }|j d k	r |j}|j }q|S r/   )r~   r}   )r   r   resultr   r   r    last)  s    
zConsList.last)r}   r   c                 C  s
   t || S r/   r   )r   r}   r   r   r    cons2  s    zConsList.consc                 C  s   dt tt |  dS )Nz	ConsList())rF   reversedr   r   r   r    __repr__5  s    zConsList.__repr__c                 C  s
   | j d k	S r/   r   r   r   r   r    __bool__8  s    zConsList.__bool__)__name__
__module____qualname____annotations__r~   staticmethodr   r   r   propertyr   r   r   r   r   r   r   r    r|     s   
r|   Tc                   @  s   e Zd Zdd ZdS )CancelableAsyncIteratorc                   s   t d S r/   )r$   r   r   r   r    cancel@  s    zCancelableAsyncIterator.cancelN)r   r   r   r   r   r   r   r    r   ?  s   r   )N)/
__future__r   abcdataclassesr   typingr   r   r   r   r   r	   Z
asn1cryptor
   r   r   r   Zasn1crypto.keysr   Zcryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r%   r-   r2   r5   r>   rC   rG   rH   rK   rT   rX   rZ   ry   rz   r|   r   ABCr   r   r   r   r    <module>   s4     
		 O%