U
    –6{iØ  ã                   @   s€  d dl Z d dlZd dlZd dlmZ z d dlmZ d dlmZm	Z	 W n e
k
rX   Y nX eeef edœdd„Zeeef edœd	d
„Zeedœdd„Zeedœdd„Zeeef edœdd„Zeeedœdd„Zeedœdd„Zeedœdd„Zededœdd„Zededœdd „Zd!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0hZe d1d2 e¡ d3 ej¡Zeed4œd5d6„Zd7Zeed4œd8d9„Z dS ):é    N)ÚUnion)ÚEllipticCurve)Údecode_dss_signatureÚencode_dss_signature)ÚvalueÚreturnc                 C   s.   t | tƒr|  d¡S t | tƒr"| S tdƒ‚d S )Nzutf-8zExpected a string value)Ú
isinstanceÚstrÚencodeÚbytesÚ	TypeError)r   © r   ú-/tmp/pip-unpacked-wheel-6i4o_yj7/jwt/utils.pyÚforce_bytes   s
    


r   )Úinputr   c                 C   s6   t | ƒ}t|ƒd }|dkr,|dd|  7 }t |¡S )Né   r   ó   =)r   ÚlenÚbase64Úurlsafe_b64decode)r   Zinput_bytesÚremr   r   r   Úbase64url_decode   s
    r   c                 C   s   t  | ¡ dd¡S )Nr   ó    )r   Úurlsafe_b64encodeÚreplace)r   r   r   r   Úbase64url_encode$   s    r   )Úvalr   c                 C   s0   | dk rt dƒ‚t| ƒ}t|ƒdkr(d}t|ƒS )Nr   zMust be a positive integeró    )Ú
ValueErrorÚbytes_from_intr   r   )r   Z	int_bytesr   r   r   Úto_base64url_uint(   s    r    c                 C   s   t t| ƒƒ}tj|dd�S )NÚbig)Ú	byteorder)r   r   ÚintÚ
from_bytes)r   Údatar   r   r   Úfrom_base64url_uint4   s    r&   )ÚnumÚ	num_bytesr   c                 C   s    dd| | f }t  | d¡¡S )Nz%0*xé   Úascii)ÚbinasciiÚa2b_hexr
   )r'   r(   Z
padded_hexr   r   r   Únumber_to_bytes9   s    r-   )Ústringr   c                 C   s   t t | ¡dƒS )Né   )r#   r+   Úb2a_hex)r.   r   r   r   Úbytes_to_number>   s    r1   c                 C   s2   | }d}|dkr"|dL }|d7 }q| j |ddd�S )Nr   é   é   r!   F)Úsigned)Úto_bytes)r   Ú	remainingZbyte_lengthr   r   r   r   B   s    
r   r   )Úder_sigÚcurver   c                 C   s2   |j }|d d }t| ƒ\}}t||ƒt||ƒ S )Né   r2   )Úkey_sizer   r-   )r7   r8   Únum_bitsr(   ÚrÚsr   r   r   Úder_to_raw_signatureM   s    r>   )Úraw_sigr8   r   c                 C   sX   |j }|d d }t| ƒd| kr*tdƒ‚t| d |… ƒ}t| |d … ƒ}tt||ƒƒS )Nr9   r2   r)   zInvalid signature)r:   r   r   r1   r   r   )r?   r8   r;   r(   r<   r=   r   r   r   Úraw_to_der_signatureV   s    r@   s   CERTIFICATEs   TRUSTED CERTIFICATEs   PRIVATE KEYs
   PUBLIC KEYs   ENCRYPTED PRIVATE KEYs   OPENSSH PRIVATE KEYs   DSA PRIVATE KEYs   RSA PRIVATE KEYs   RSA PUBLIC KEYs   EC PRIVATE KEYs   DH PARAMETERSs   NEW CERTIFICATE REQUESTs   CERTIFICATE REQUESTs   SSH2 PUBLIC KEYs   SSH2 ENCRYPTED PRIVATE KEYs   X509 CRLs   ----[- ]BEGIN (ó   |s,   )[- ]----?
.+??
----[- ]END \1[- ]----?
?)Úkeyr   c                 C   s   t t | ¡ƒS ©N)ÚboolÚ_PEM_REÚsearch©rB   r   r   r   Úis_pem_format�   s    rH   )s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521c                 C   s
   |   t¡S rC   )Ú
startswithÚ_SSH_KEY_FORMATSrG   r   r   r   Ú
is_ssh_key�   s    rK   )!r   r+   ÚreÚtypingr   Z,cryptography.hazmat.primitives.asymmetric.ecr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r   ÚModuleNotFoundErrorr   r	   r   r   r   r#   r    r&   r-   r1   r   r>   r@   Z_PEMSÚcompileÚjoinÚDOTALLrE   rD   rH   rJ   rK   r   r   r   r   Ú<module>   s\   		ðÿþú

