U
    c'                     @  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/d
d
d0d1d2Z)e
d3Z*ed4d5G d6d7 d7ee* Z+e
d8Z,G d9d: 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-rwcmptg8/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   Z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    r1   bytesc                 C  s:   t | tjr| jS t| }d|j| d d jf }|S d S )Ns   %s:%dr'   Zserial_number)r*   r   r/   issuer_serialr,   sha256native)r-   r)   Zresult_bytesr   r   r    r3   ;   s    r3   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)r5   parsed)r   extr7   r   r    r!   M   s   z)get_ac_extension_value.<locals>.<genexpr>r'   
extensions)r"   r#   r6   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_nameZgeneral_namer   r   r    _get_absolute_http_crlsV   s    


r@   zList[x509.DistributionPoint]c                 C  s   t | d}tt|S )Ncrl_distribution_pointsr<   listr@   )r&   Zdps_extr   r   r    _get_ac_crl_dpsi   s    
rD   c                 C  s   t | d}tt|S )NZfreshest_crlrB   )r&   Zdelta_dps_extr   r   r    _get_ac_delta_crl_dpsp   s    
rE   c                C  sL   t | tj}|rt| j}nt| }|rH|r:|| j n|t|  |S r.   )	r*   r   r/   rC   rA   rD   extendZdelta_crl_distribution_pointsrE   )r-   Z
use_deltasZis_pkcsourcesr   r   r    get_relevant_crl_dpsw   s    	rH   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ocspZaccess_locationr?   )zhttp://zhttps://)r5   r   lower
startswith)Zaia_extentrylocationurlr   r   r    _get_http_ocsp_urls   s    
rP   r0   c                 C  s*   t | tjr| j}n
t| d}tt|S )Nauthority_information_access)r*   r   r/   "authority_information_access_valuer<   rC   rP   )r-   aiar   r   r    get_ocsp_urls   s    
rT   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 )NrQ   rA   c                 s  s   | ]}|d  j dkV  qdS )rI   rJ   N)r5   )r   rM   r   r   r    r!      s     z'get_declared_revinfo.<locals>.<genexpr>F)r*   r   r/   rR   Zcrl_distribution_points_valuer<   any)r-   rS   Zcrl_dpsZhas_crlZhas_ocspr   r   r    get_declared_revinfo   s    

rV   r   )	signaturesigned_datapublic_key_infosig_algo	hash_algoc                 C  sh  ddl m}m} |dkr2|d d jd kr2|d|jdkr| }t|tjsTt	|d d j}|d k	r|||jkr||ddd	i|d< t
| }	|d
krt|	tjst	tt|  }
|	| |t |
 n|dkrt|	tjst	t|tjst	|d }|d jdks"td|d d j}|d j}tt|  }tjtj|d|d}tt|  }|	| ||| n|dkrt|	tjst	tt|  }|	| || n|dkr t|	tjst	tt|  }|	| |t| nd|dkr*t|	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)r_   )Zmgfra   Zecdsar   r   zSignature mechanism z is not supported.)!errorsr]   r^   r5   r_   copyr*   r
   ZRSASSAPSSParamsAssertionErrorr   Zload_der_public_keydumpr   ZRSAPublicKeygetattrr   upperverifyr   ZPKCS1v15r$   ZPSSZMGF1r   ZDSAPublicKeyr   ZEllipticCurvePublicKeyZECDSAr   ZEd25519PublicKeyr   ZEd448PublicKey)rW   rX   rY   rZ   r[   r`   r]   r^   Zpss_key_paramsZpub_keyhZmgaZmgf_md_nameZsalt_lenZmgf_mdZpss_paddingZ	hash_specr   r   r    validate_sig   sl    



 




rj   ListElemT)frozenc                   @  sp   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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rn   rm   r   r   r   r    empty  s    zConsList.emptyrk   )valuer   c                 C  s   t | t  S r.   )rm   rr   )rs   r   r   r    sing  s    zConsList.singc                 c  s"   | }|j d k	r|j V  |j}qd S r.   )rn   ro   )selfcurr   r   r    __iter__  s    
zConsList.__iter__)rn   r   c                 C  s
   t || S r.   rq   )ru   rn   r   r   r    cons%  s    zConsList.consc                 C  s   dt tt |  dS )Nz	ConsList())rC   reversedru   r   r   r    __repr__(  s    zConsList.__repr__c                 C  s
   | j d k	S r.   rp   r{   r   r   r    __bool__+  s    zConsList.__bool__)__name__
__module____qualname____annotations__ro   staticmethodrr   rt   rw   rx   r|   r}   r   r   r   r    rm     s   
rm   Tc                   @  s   e Zd Zdd ZdS )CancelableAsyncIteratorc                   s   t d S r.   )r$   r{   r   r   r    cancel3  s    zCancelableAsyncIterator.cancelN)r~   r   r   r   r   r   r   r    r   2  s   r   )N)/
__future__r   abcZdataclassesr   typingr   r   r   r   r   r	   Z
asn1cryptor
   r   r   r   Zasn1crypto.keysr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r%   r,   r1   r3   r<   r@   rD   rE   rH   rP   rT   rV   rj   rk   rm   r   ABCr   r   r   r   r    <module>   s4     
		 J