a
    kÄ#d
  ã                   @   s8  d Z ddlmZ ddlmZmZmZ ddlm  m	Z	 ddl
mZmZ ddlmZ ejr˜ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dd„ Zdd„ Zdd„ Zedd„ ƒZdZej�rG dd„ deƒZ ej!ej"ej#ej$ej%ej&e dœZ'dd„ Zej(ej$dfdd„Z)G dd„ de*ƒZ+G dd„ de*ƒZ,dS )a  
PKCS #1 methods as defined in RFC 3447.

We cannot rely solely on the cryptography library, because the openssl package
used by the cryptography library may not implement the md5-sha1 hash, as with
Ubuntu or OSX. This is why we reluctantly keep some legacy crypto here.
é    )Úabsolute_import)Úbytes_encodeÚ	hex_bytesÚ	bytes_hexN)ÚconfÚcrypto_validator)Úwarning)ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)Úhashes)Úpadding)ÚHashAlgorithmc                 C   s   t t| ƒdƒS )z”
    OS2IP conversion function from RFC 3447.

    :param s: octet string to be converted
    :return: n, the corresponding nonnegative integer
    é   )Úintr   )Ús© r   úT/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/crypto/pkcs1.pyÚ
pkcs_os2ip!   s    r   c                 C   s   dd|  }t ||  ƒS )a_  
    I2OSP conversion function from RFC 3447.
    The length parameter allows the function to perform the padding needed.
    Note that the user is responsible for providing a sufficient xLen.

    :param n: nonnegative integer to be converted
    :param sLen: intended length of the resulting octet string
    :return: corresponding octet string
    z%%0%dxé   )r   )ÚnZsLenÚfmtr   r   r   Ú
pkcs_i2osp+   s    r   c                 C   s"   d}| dkr| dL } |d7 }q|S )z�
    This is a log base 256 which determines the minimum octet string
    length for unequivocal representation of integer n by pkcs_i2osp.
    r   é   é   r   )r   Úir   r   r   Ú	pkcs_ilen;   s
    
r   c                 C   sˆ   t | ƒ} tjtdƒtƒ d�}| | ¡ tjtdƒtƒ d�}| | ¡ | ¡ | ¡  }|dk rhtdƒ dS d|d d	  }d
| d | S )zC
    Legacy method for PKCS1 v1.5 encoding with MD5-SHA1 hash.
    Úmd5)ÚbackendÚsha1é/   zFpkcs_emsa_pkcs1_v1_5_encode: intended encoded message length too shortNó   ÿé$   é   s    ó    )r   r   ZHashÚ	_get_hashr   ÚupdateÚfinalizer   )ÚMZemLenZmd5_hashZ	sha1_hashÚHZPSr   r   r   Ú"_legacy_pkcs1_v1_5_encode_md5_sha1G   s    

r*   c                   @   s   e Zd ZdZdZdZdS )ÚMD5_SHA1úmd5-sha1r"   é@   N)Ú__name__Ú
__module__Ú__qualname__ÚnameÚdigest_sizeÚ
block_sizer   r   r   r   r+   b   s   r+   )r   r   Úsha224Úsha256Úsha384Úsha512r,   c                 C   s0   zt |  ƒ W S  ty*   td|  ƒ‚Y n0 d S )NzUnknown hash function %s)Ú_hashesÚKeyError)ZhashStrr   r   r   r%   q   s    r%   c                 C   sZ   | dkrt  ¡ S | dkr,t j||ƒ|jd�S | dkrHt j||ƒ||d�S td| ƒ d S d S )NÚpkcsZpss)ÚmgfZsalt_lengthZoaep)r;   Ú	algorithmÚlabelz(Key.encrypt(): Unknown padding type (%s))r   ZPKCS1v15ZPSSr2   ZOAEPr   )ZpadStrr;   Úhr=   r   r   r   Ú_get_paddingw   s    
r?   c                   @   s0   e Zd Zed
dd„ƒZeddd„ƒZdd	„ ZdS )Ú_EncryptAndVerifyRSAr:   r5   Nc                 C   s.   |pt j}t|ƒ}t||||ƒ}| j ||¡S ©N)r   ÚMGF1r%   r?   ÚpubkeyÚencrypt)ÚselfÚmÚtr>   r;   ÚLÚpadr   r   r   rD   Ž   s    
z_EncryptAndVerifyRSA.encryptc                 C   sš   t |ƒ}|ptj}t|ƒ}t||||ƒ}zXz| j ||||¡ W n: tyz   |dkrj|dkrjtd| ƒ‚|  ||¡ Y n0 W dS  t	y”   Y dS 0 d S )Nr:   r,   zRSA verification with %sTF)
r   r   rB   r%   r?   rC   Úverifyr
   Ú_legacy_verify_md5_sha1r	   )rE   r(   ÚSrG   r>   r;   rH   rI   r   r   r   rJ   •   s    
z_EncryptAndVerifyRSA.verifyc           	      C   s®   | j d }t|ƒ|kr"tdƒ dS t|ƒ}| j}t|tƒrHtjrHt	|ƒ}tjrXt|t	ƒrd||d krptdƒ d S t
|| j|ƒ}t||ƒ}t||ƒ}|d u r¦tdƒ dS ||kS )Nr   zinvalid signature (len(S) != k)Fr   ú-Key._rsaep() expects a long between 0 and n-1z2Key._rsassa_pkcs1_v1_5_verify(): unable to encode.)Ú_modulusLenÚlenr   r   Ú_modulusÚ
isinstancer   ÚsixÚPY2ÚlongÚpowZ_pubExpr   r*   )	rE   r(   rL   Úkr   r   rF   ÚEMZEMPrimer   r   r   rK   ¦   s$    


z,_EncryptAndVerifyRSA._legacy_verify_md5_sha1)r:   r5   NN)r:   r5   NN)r.   r/   r0   r   rD   rJ   rK   r   r   r   r   r@   Œ   s
   r@   c                   @   s0   e Zd Zed
dd„ƒZeddd„ƒZdd	„ ZdS )Ú_DecryptAndSignRSAr:   r5   Nc                 C   s.   |pt j}t|ƒ}t||||ƒ}| j ||¡S rA   )r   rB   r%   r?   ÚkeyÚdecrypt)rE   ÚCrG   r>   r;   rH   rI   r   r   r   rZ   ½   s    
z_DecryptAndSignRSA.decryptc                 C   sx   t |ƒ}|ptj}t|ƒ}t||||ƒ}z| j |||¡W S  tyr   |dkrd|dkrdtd| ƒ‚|  |¡ Y S 0 d S )Nr:   r,   zRSA signature with %s)	r   r   rB   r%   r?   rY   Úsignr
   Ú_legacy_sign_md5_sha1)rE   r(   rG   r>   r;   rH   rI   r   r   r   r\   Ä   s    
z_DecryptAndSignRSA.signc                 C   s    t |ƒ}| jd }t||ƒ}|d u r0tdƒ d S t|ƒ}| j}t|tƒrVtj	rVt
|ƒ}tj	rft|t
ƒrr||d kr~tdƒ d S | j ¡ j}t|||ƒ}t||ƒS )Nr   z/Key._rsassa_pkcs1_v1_5_sign(): unable to encoder   rM   )r   rN   r*   r   r   rP   rQ   r   rR   rS   rT   rY   Zprivate_numbersÚdrU   r   )rE   r(   rV   rW   rF   r   ZprivExpr   r   r   r   r]   Ñ   s     

z(_DecryptAndSignRSA._legacy_sign_md5_sha1)r:   r5   NN)r:   r5   NN)r.   r/   r0   r   rZ   r\   r]   r   r   r   r   rX   »   s
   rX   )-Ú__doc__Ú
__future__r   Zscapy.compatr   r   r   Zscapy.libs.sixZlibsrR   Zscapy.configr   r   Zscapy.errorr   Zcrypto_validZcryptography.exceptionsr	   r
   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   Z%cryptography.hazmat.primitives.hashesr   r   r   r   r*   r%   r+   ÚMD5ÚSHA1ÚSHA224ÚSHA256ÚSHA384ÚSHA512r8   rB   r?   Úobjectr@   rX   r   r   r   r   Ú<module>   s>   

ù
/