o
    PDi[                     @   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 )zPure-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 )zConverts 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   V/var/www/Datamplify/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,   =