U
    b                     @   s  d dl Z d dlZd dlZd dlmZmZ z d dlmZ d dlm	Z	m
Z
 W n ek
r`   eZ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eedddZeeedddZd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/hZed0d1e d2 ejZeed3d4d5Zd6Z ed7Z!d8d9d:d;d<d=gZ"eed3d>d?Z#dS )@    N)Any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-ivybibab/jwt/utils.pyforce_bytes   s
    


r   )inputr   c                 C   sB   t | tr| d} t| d }|dkr8| dd|  7 } t| S )Nascii   r      =)r	   r
   r   lenbase64urlsafe_b64decode)r   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r| d} t| }tj|ddS )Nr   big)	byteorder)r	   r
   r   r   int
from_bytes)r   datar   r   r   from_base64url_uint5   s    

r(   )num	num_bytesr   c                 C   s    dd| | f }t |dS )Nz%0*x   r   )binasciia2b_hexr   )r)   r*   Z
padded_hexr   r   r   number_to_bytes=   s    r.   )stringr   c                 C   s   t t| dS )N   )r%   r,   b2a_hex)r/   r   r   r   bytes_to_numberB   s    r2   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!   F   s    
r!   )der_sigcurver   c                 C   s2   |j }|d d }t| \}}t||t|| S )N   r3   )key_sizer   r.   )r8   r9   num_bitsr*   rsr   r   r   der_to_raw_signatureQ   s    r?   )raw_sigr9   r   c                 C   sT   |j }|d d }t| d| kr*tdt| d | }t| |d  }t||S )Nr:   r3   r+   zInvalid signature)r;   r   r    r2   r   )r@   r9   r<   r*   r=   r>   r   r   r   raw_to_der_signatureZ   s    rA   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rC   r   r   r   is_pem_format   s    rI   s   -cert-v01@openssh.coms   \A(\S+)[ \t]+(\S+)s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521c                    sP   t  fddtD rdS t }|rL|d}t|tt d  krLdS dS )Nc                 3   s   | ]}| kV  qd S rD   r   ).0Zstring_valuerH   r   r   	<genexpr>   s     zis_ssh_key.<locals>.<genexpr>Tr4   F)any_SSH_KEY_FORMATS_SSH_PUBKEY_RCmatchgroup_CERT_SUFFIXr   )rC   Zssh_pubkey_matchZkey_typer   rH   r   
is_ssh_key   s    

rR   )$r   r,   retypingr   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r   ModuleNotFoundErrorr
   r   r   r   r   r%   r"   r(   r.   r2   r!   r?   rA   Z_PEMScompilejoinDOTALLrF   rE   rI   rQ   rN   rM   rR   r   r   r   r   <module>   sl   
		


