o
    Þ­j[  ã                   @   sÊ   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlZddlmZ dd	lmZ dd
lmZ dZdZdZdZeƒ ZdZdd„ ZG dd„ dejƒZG dd„ dejejƒZdS )zØPure-Python RSA cryptography implementation.

Uses the ``rsa``, ``pyasn1`` and ``pyasn1_modules`` packages
to parse PEM files storing PKCS#1 or PKCS#8 keys as well as
certificates. There is no support for p12 files.
é    )Úabsolute_importN)Údecoder)Úpem)ÚCertificate)ÚPrivateKeyInfo)Ú_helpers)Ú
exceptions)Úbase)é€   é@   é    é   é   é   é   é   s   -----BEGIN CERTIFICATE-----)z-----BEGIN RSA PRIVATE KEY-----z-----END RSA PRIVATE KEY-----)z-----BEGIN PRIVATE KEY-----z-----END PRIVATE KEY-----zjThe 'rsa' library is deprecated and will be removed in a future release. Please migrate to 'cryptography'.c                 C   sZ   t | ƒ}tƒ }td|dƒD ]}| ||d … }tdd„ tt|ƒD ƒƒ}| |¡ qt|ƒS )z÷Converts an iterable of 1s and 0s to bytes.

    Combines the list 8 at a time, treating each group of 8 bits
    as a single byte.

    Args:
        bit_list (Sequence): Sequence of 1s and 0s.

    Returns:
        bytes: The decoded bytes.
    r   r   c                 s   s   � | ]	\}}|| V  qd S ©N© )Ú.0ÚvalÚdigitr   r   úZ/var/www/html/CropPilot/venv/lib/python3.10/site-packages/google/auth/crypt/_python_rsa.pyÚ	<genexpr>A   s   € z%_bit_list_to_bytes.<locals>.<genexpr>)ÚlenÚ	bytearrayÚrangeÚsumÚzipÚ_POW2ÚappendÚbytes)Úbit_listÚnum_bitsÚ	byte_valsÚstartÚ	curr_bitsÚchar_valr   r   r   Ú_bit_list_to_bytes1   s   r'   c                   @   s8   e Zd ZdZdd„ Ze ej¡dd„ ƒZ	e
dd„ ƒZdS )	ÚRSAVerifiera  Verifies RSA cryptographic signatures using public keys.

    .. deprecated::
        The `rsa` library has been archived. Please migrate to
        `cryptography`.

    Args:
        public_key (rsa.key.PublicKey): The public key used to verify
            signatures.
    c                 C   s   t jttdd� || _d S ©Nr   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚ_warning_msgÚDeprecationWarningÚ_pubkey)ÚselfÚ
public_keyr   r   r   Ú__init__R   s   ý
zRSAVerifier.__init__c              	   C   s<   t  |¡}z
tj ||| j¡W S  ttjjfy   Y dS w )NF)r   Úto_bytesÚrsaÚpkcs1Úverifyr0   Ú
ValueErrorÚVerificationError)r1   ÚmessageÚ	signaturer   r   r   r7   Z   s   
ÿzRSAVerifier.verifyc           	      C   s�   t  |¡}t|v }|r=tj |d¡}tj|tƒ d�\}}|dkr&t	 
d|¡‚|d d }t|d ƒ}tj |d¡}| |ƒS tj |d	¡}| |ƒS )
aš  Construct an Verifier instance from a public key or public
        certificate string.

        Args:
            public_key (Union[str, bytes]): The public key in PEM format or the
                x509 public key certificate.

        Returns:
            google.auth.crypt._python_rsa.RSAVerifier: The constructed verifier.

        Raises:
            ValueError: If the public_key can't be parsed.
        ÚCERTIFICATE©Úasn1Specó    úUnused bytesÚtbsCertificateÚsubjectPublicKeyInfoÚsubjectPublicKeyÚDERÚPEM)r   r4   Ú_CERTIFICATE_MARKERr5   r   Úload_pemr   Údecoder   r   ÚInvalidValuer'   Ú	PublicKeyÚ
load_pkcs1)	Úclsr2   Úis_x509_certÚderÚ	asn1_certÚ	remainingÚ	cert_infoÚ	key_bytesÚpubkeyr   r   r   Úfrom_stringb   s   
ÿzRSAVerifier.from_stringN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   r   Úcopy_docstringr	   ÚVerifierr7   ÚclassmethodrT   r   r   r   r   r(   F   s    

r(   c                   @   sT   e Zd ZdZddd„Zee ej	¡dd„ ƒƒZ
e ej	¡dd„ ƒZedd	d
„ƒZdS )Ú	RSASignera«  Signs messages with an RSA private key.

    .. deprecated::
        The `rsa` library has been archived. Please migrate to
        `cryptography`.

    Args:
        private_key (rsa.key.PrivateKey): The private key to sign with.
        key_id (str): Optional key ID used to identify this private key. This
            can be useful to associate the private key with its associated
            public key or certificate.
    Nc                 C   s    t jttdd� || _|| _d S r)   )r,   r-   r.   r/   Ú_keyÚ_key_id)r1   Úprivate_keyÚkey_idr   r   r   r3   ‘   s   ý
zRSASigner.__init__c                 C   s   | j S r   )r^   )r1   r   r   r   r`   š   s   zRSASigner.key_idc                 C   s   t  |¡}tj || jd¡S )NzSHA-256)r   r4   r5   r6   Úsignr]   )r1   r:   r   r   r   ra   Ÿ   s   
zRSASigner.signc           	      C   s¤   t  |¡}t t |¡tt¡\}}|dkrtj	j
j|dd�}n-|dkrGtj|td�\}}|dkr6t d|¡‚| d¡}tj	j
j| ¡ dd�}nt d	¡‚| ||d
�S )aŸ  Construct an Signer instance from a private key in PEM format.

        Args:
            key (str): Private key in PEM format.
            key_id (str): An optional key id used to identify the private key.

        Returns:
            google.auth.crypt.Signer: The constructed signer.

        Raises:
            ValueError: If the key cannot be parsed as PKCS#1 or PKCS#8 in
                PEM format.
        r   rD   )Úformatr   r=   r?   r@   Ú
privateKeyzNo key could be detected.)r`   )r   Ú
from_bytesr   ÚreadPemBlocksFromFileÚioÚStringIOÚ_PKCS1_MARKERÚ_PKCS8_MARKERr5   ÚkeyÚ
PrivateKeyrK   r   rH   Ú_PKCS8_SPECr   rI   ÚgetComponentByNameÚasOctetsÚMalformedError)	rL   rj   r`   Ú	marker_idrR   r_   Úkey_inforP   Úprivate_key_infor   r   r   rT   ¤   s    
ÿ
ÿ
zRSASigner.from_stringr   )rU   rV   rW   rX   r3   Úpropertyr   rY   r	   ÚSignerr`   ra   r[   rT   r   r   r   r   r\   ƒ   s    
	


r\   )rX   Ú
__future__r   rf   r,   Úpyasn1.codec.derr   Úpyasn1_modulesr   Úpyasn1_modules.rfc2459r   Úpyasn1_modules.rfc5208r   r5   Úgoogle.authr   r   Úgoogle.auth.cryptr	   r   rF   rh   ri   rl   r.   r'   rZ   r(   rt   ÚFromServiceAccountMixinr\   r   r   r   r   Ú<module>   s,   ÿ=