U
    DÖb7  ã                   @   s8  d dl Z d dlZd dlZd dlZddlmZmZmZ zd dlm	Z	m
Z
 W n ek
r\   Y nX dd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdddddd d!d"d#d$d%d&d'd(d)d*hZe d+d, e¡ d- ej¡Zeed.œd/d0„Zd1Ze d2¡Z d3d4d5d6d7d8gZ!eed.œd9d:„Z"dS );é    Né   )Úbinary_typeÚbytes_from_intÚ	text_type)Údecode_dss_signatureÚencode_dss_signaturec                 C   s.   t | tƒr|  d¡S t | tƒr"| S tdƒ‚d S ©Nzutf-8zExpected a string value)Ú
isinstancer   Údecoder   Ú	TypeError©Úvalue© r   ú+/usr/lib/python3/dist-packages/jwt/utils.pyÚforce_unicode   s
    


r   c                 C   s.   t | tƒr|  d¡S t | tƒr"| S tdƒ‚d S r   )r	   r   Úencoder   r   r   r   r   r   Úforce_bytes   s
    


r   c                 C   sB   t | tƒr|  d¡} t| ƒd }|dkr8| dd|  7 } t | ¡S )NÚasciié   r   ó   =)r	   r   r   ÚlenÚbase64Zurlsafe_b64decode)ÚinputZremr   r   r   Úbase64url_decode"   s    

r   c                 C   s   t  | ¡ dd¡S )Nr   ó    )r   Zurlsafe_b64encodeÚreplace)r   r   r   r   Úbase64url_encode.   s    r   c                 C   s0   | dk rt dƒ‚t| ƒ}t|ƒdkr(d}t|ƒS )Nr   zMust be a positive integeró    )Ú
ValueErrorr   r   r   )ÚvalZ	int_bytesr   r   r   Úto_base64url_uint2   s    r    c                 C   sJ   t | tƒr|  d¡} t| ƒ}t dt|ƒ |¡}td dd„ |D ƒ¡dƒS )Nr   z%sBÚ c                 S   s   g | ]}d | ‘qS )z%02xr   )Ú.0Zbyter   r   r   Ú
<listcomp>E   s     z'from_base64url_uint.<locals>.<listcomp>é   )	r	   r   r   r   ÚstructZunpackr   ÚintÚjoin)r   ÚdataZbufr   r   r   Úfrom_base64url_uint>   s
    

r)   c              
   C   sV   |s| S z|   ¡ }| |¡ W n2 ttfk
rP } ztd| ƒ‚W 5 d }~X Y nX |S )Nz-original and updates must be a dictionary: %s)ÚcopyÚupdateÚAttributeErrorr   r   )ZoriginalZupdatesZmerged_optionsÚer   r   r   Ú
merge_dictH   s    r.   c                 C   s$   dd| | f }t  | d¡¡}|S )Nz%0*xé   r   )ÚbinasciiZa2b_hexr   )ZnumÚ	num_bytesZ
padded_hexZ
big_endianr   r   r   Únumber_to_bytesU   s    r2   c                 C   s   t t | ¡dƒS )Nr$   )r&   r0   Zb2a_hex)Ústringr   r   r   Úbytes_to_number[   s    r4   c                 C   s2   |j }|d d }t| ƒ\}}t||ƒt||ƒ S )Né   é   )Úkey_sizer   r2   )Zder_sigÚcurveÚnum_bitsr1   ÚrÚsr   r   r   Úder_to_raw_signature_   s    r<   c                 C   sT   |j }|d d }t| ƒd| kr*tdƒ‚t| d |… ƒ}t| |d … ƒ}t||ƒS )Nr5   r6   r/   zInvalid signature)r7   r   r   r4   r   )Zraw_sigr8   r9   r1   r:   r;   r   r   r   Úraw_to_der_signatureh   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[- ]----?
?)ÚkeyÚreturnc                 C   s   t t | ¡ƒS ©N)ÚboolÚ_PEM_REÚsearch©r?   r   r   r   Úis_pem_format“   s    rF   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 rA   r   )r"   Zstring_valuerE   r   r   Ú	<genexpr>¥   s     zis_ssh_key.<locals>.<genexpr>Tr   F)ÚanyÚ_SSH_KEY_FORMATSÚ_SSH_PUBKEY_RCÚmatchÚgroupÚ_CERT_SUFFIXr   )r?   Zssh_pubkey_matchZkey_typer   rE   r   Ú
is_ssh_key¤   s    

rN   )#r   r0   Úrer%   Úcompatr   r   r   Z/cryptography.hazmat.primitives.asymmetric.utilsr   r   ÚImportErrorr   r   r   r   r    r)   r.   r2   r4   r<   r=   Z_PEMSÚcompiler'   ÚDOTALLrC   ÚbytesrB   rF   rM   rJ   rI   rN   r   r   r   r   Ú<module>   sn   		
	ðÿþú

ú
