U
    #FZh                     @   s   d 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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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-----c                 C   sZ   t | }t }td|dD ]6}| ||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   d/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/google/auth/crypt/_python_rsa.py	<genexpr>;   s     z%_bit_list_to_bytes.<locals>.<genexpr>)len	bytearrayrangesumzip_POW2appendbytes)Zbit_listZnum_bitsZ	byte_valsstartZ	curr_bitsZchar_valr   r   r   _bit_list_to_bytes+   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 )	RSAVerifierzVerifies RSA cryptographic signatures using public keys.

    Args:
        public_key (rsa.key.PublicKey): The public key used to verify
            signatures.
    c                 C   s
   || _ d S r   )_pubkey)self
public_keyr   r   r   __init__H   s    zRSAVerifier.__init__c              	   C   sB   t |}ztj||| jW S  ttjjfk
r<   Y dS X d S )NF)r   to_bytesrsapkcs1verifyr$   
ValueErrorZVerificationError)r%   message	signaturer   r   r   r+   K   s
    
zRSAVerifier.verifyc           	      C   s   t |}t|k}|rttj|d}tj|t d\}}|dkrLt	
d||d d }t|d }tj|d}n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Zasn1Spec    Unused bytesZtbsCertificateZsubjectPublicKeyInfoZsubjectPublicKeyDERZPEM)r   r(   _CERTIFICATE_MARKERr)   r   Zload_pemr   decoder   r   InvalidValuer"   Z	PublicKey
load_pkcs1)	clsr&   Zis_x509_certZderZ	asn1_cert	remainingZ	cert_info	key_bytesZpubkeyr   r   r   from_stringS   s    
zRSAVerifier.from_stringN)__name__
__module____qualname____doc__r'   r   copy_docstringr	   Verifierr+   classmethodr;   r   r   r   r   r#   @   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.

    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   || _ || _d S r   )_key_key_id)r%   private_keykey_idr   r   r   r'   ~   s    zRSASigner.__init__c                 C   s   | j S r   )rE   )r%   r   r   r   rG      s    zRSASigner.key_idc                 C   s   t |}tj|| jdS )NzSHA-256)r   r(   r)   r*   signrD   )r%   r-   r   r   r   rH      s    
zRSASigner.signc           	      C   s   t |}tt|tt\}}|dkr>tj	j
j|dd}nZ|dkrtj|td\}}|dkrlt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   r3   )formatr   r0   r1   r2   Z
privateKeyzNo key could be detected.)rG   )r   
from_bytesr   ZreadPemBlocksFromFileioStringIO_PKCS1_MARKER_PKCS8_MARKERr)   keyZ
PrivateKeyr7   r   r5   _PKCS8_SPECr   r6   ZgetComponentByNameZasOctetsZMalformedError)	r8   rO   rG   Z	marker_idr:   rF   Zkey_infor9   Zprivate_key_infor   r   r   r;      s&    
  
 
zRSASigner.from_string)N)N)r<   r=   r>   r?   r'   propertyr   r@   r	   SignerrG   rH   rB   r;   r   r   r   r   rC   t   s   	



rC   )r?   
__future__r   rK   Zpyasn1.codec.derr   Zpyasn1_modulesr   Zpyasn1_modules.rfc2459r   Zpyasn1_modules.rfc5208r   r)   Zgoogle.authr   r   Zgoogle.auth.cryptr	   r   r4   rM   rN   rP   r"   rA   r#   rR   ZFromServiceAccountMixinrC   r   r   r   r   <module>   s$   4