Ë
    U¼Sfë  ã                   ó  — 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„ Z G d„ dej0                  «      Z G d„ dej4                  ej6                  «      Zy)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-----c                 óØ   — t        | «      }t        «       }t        d|d«      D ];  }| ||dz    }t        d„ t	        t
        |«      D «       «      }|j                  |«       Œ= 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              3   ó,   K  — | ]  \  }}||z  –— Œ y ­w©N© )Ú.0ÚvalÚdigits      ú\C:\Users\user\Documents\project_loop\venv\Lib\site-packages\google/auth/crypt/_python_rsa.pyú	<genexpr>z%_bit_list_to_bytes.<locals>.<genexpr>;   s   è ø€ ÒK¡z s¨E�s˜U•{ÑKùs   ‚)ÚlenÚ	bytearrayÚrangeÚsumÚzipÚ_POW2ÚappendÚbytes)Úbit_listÚnum_bitsÚ	byte_valsÚstartÚ	curr_bitsÚchar_vals         r   Ú_bit_list_to_bytesr*   +   sn   € ô �8‹}€HÜ“€IÜ�q˜( AÓ&ò #ˆØ˜U U¨Q¡YÐ/ˆ	ÜÑK´S¼À	Ó5JÔKÓKˆØ×Ñ˜Õ"ð#ô �ÓÐó    c                   ój   — e Zd ZdZd„ Z ej                  ej                  «      d„ «       Z	e
d„ «       Zy)ÚRSAVerifierz¦Verifies RSA cryptographic signatures using public keys.

    Args:
        public_key (rsa.key.PublicKey): The public key used to verify
            signatures.
    c                 ó   — || _         y r   )Ú_pubkey)ÚselfÚ
public_keys     r   Ú__init__zRSAVerifier.__init__H   s	   € Ø!ˆ�r+   c                 óÖ   — t        j                  |«      }	 t        j                  j	                  ||| j
                  «      S # t        t        j                  j                  f$ r Y yw xY w)NF)r   Úto_bytesÚrsaÚpkcs1Úverifyr/   Ú
ValueErrorÚVerificationError)r0   ÚmessageÚ	signatures      r   r7   zRSAVerifier.verifyK   sU   € ä×#Ñ# GÓ,ˆð	Ü—9‘9×#Ñ# G¨Y¸¿¹ÓEÐEøÜœCŸI™I×7Ñ7Ð8ò 	Ùð	ús   —*A Á#A(Á'A(c                 ó¸  — t        j                  |«      }t        |v }|r”t        j                  j                  |d«      }t        j                  |t        «       ¬«      \  }}|dk7  rt        j                  d|«      ‚|d   d   }t        |d   «      }t        j                  j                  |d«      }n t        j                  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©Úasn1Specr+   úUnused bytesÚtbsCertificateÚsubjectPublicKeyInfoÚsubjectPublicKeyÚDERÚPEM)r   r4   Ú_CERTIFICATE_MARKERr5   r   Úload_pemr   Údecoder   r	   ÚInvalidValuer*   Ú	PublicKeyÚ
load_pkcs1)	Úclsr1   Úis_x509_certÚderÚ	asn1_certÚ	remainingÚ	cert_infoÚ	key_bytesÚpubkeys	            r   Úfrom_stringzRSAVerifier.from_stringS   sÂ   € ô ×&Ñ& zÓ2ˆ
Ü*¨jÐ8ˆñ Ü—'‘'×"Ñ" :¨}Ó=ˆCÜ#*§>¡>°#ÄÃÔ#NÑ ˆI�yØ˜CÒÜ ×-Ñ-¨n¸iÓHÐHà!Ð"2Ñ3Ð4JÑKˆIÜ*¨9Ð5GÑ+HÓIˆIÜ—]‘]×-Ñ-¨i¸Ó?‰Fä—]‘]×-Ñ-¨j¸%Ó@ˆFÙ�6‹{Ðr+   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r   Úcopy_docstringr
   ÚVerifierr7   ÚclassmethodrT   r   r+   r   r-   r-   @   sE   „ ñò"ð €X×Ñ˜TŸ]™]Ó+ñó ,ðð ñó ñr+   r-   c                   ó¼   — e Zd ZdZdd„Ze ej                  ej                  «      d„ «       «       Z
 ej                  ej                  «      d„ «       Zedd„«       Zy)Ú	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                 ó    — || _         || _        y r   )Ú_keyÚ_key_id)r0   Úprivate_keyÚkey_ids      r   r2   zRSASigner.__init__~   s   € ØˆŒ	Øˆ�r+   c                 ó   — | j                   S r   )r`   )r0   s    r   rb   zRSASigner.key_id‚   s   € ð �|‰|Ðr+   c                 ó‚   — t        j                  |«      }t        j                  j	                  || j
                  d«      S )NzSHA-256)r   r4   r5   r6   Úsignr_   )r0   r:   s     r   re   zRSASigner.sign‡   s-   € ä×#Ñ# GÓ,ˆÜ�y‰y�~‰~˜g t§y¡y°)Ó<Ð<r+   c                 óH  — t        j                  |«      }t        j                  t	        j
                  |«      t        t        «      \  }}|dk(  r,t        j                  j                  j                  |d¬«      }nž|dk(  r„t        j                  |t        ¬«      \  }}|dk7  rt        j                   d|«      ‚|j#                  d«      }t        j                  j                  j                  |j%                  «       d¬«      }nt        j&                  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.)rb   )r   Ú
from_bytesr   ÚreadPemBlocksFromFileÚioÚStringIOÚ_PKCS1_MARKERÚ_PKCS8_MARKERr5   ÚkeyÚ
PrivateKeyrK   r   rH   Ú_PKCS8_SPECr	   rI   ÚgetComponentByNameÚasOctetsÚMalformedError)	rL   ro   rb   Ú	marker_idrR   ra   Úkey_inforP   Úprivate_key_infos	            r   rT   zRSASigner.from_stringŒ   s÷   € ô ×!Ñ! #Ó&ˆÜ"×8Ñ8Ü�K‰K˜Óœm¬]ó 
Ñˆ	�9ð
 ˜Š>ÜŸ'™'×,Ñ,×7Ñ7¸	È%Ð7ÓP‰Kà˜!Š^Ü")§.¡.°Ä[Ô"QÑˆH�iØ˜CÒÜ ×-Ñ-¨n¸iÓHÐHØ'×:Ñ:¸<ÓHÐÜŸ'™'×,Ñ,×7Ñ7Ø ×)Ñ)Ó+°Eð 8ó ‰Kô ×+Ñ+Ð,GÓHÐHá�; vÔ.Ð.r+   r   )rU   rV   rW   rX   r2   Úpropertyr   rY   r
   ÚSignerrb   re   r[   rT   r   r+   r   r]   r]   t   sr   „ ñóð Ø€X×Ñ˜TŸ[™[Ó)ñó *ó ðð €X×Ñ˜TŸ[™[Ó)ñ=ó *ð=ð ò"/ó ñ"/r+   r]   )rX   Ú
__future__r   rk   Úpyasn1.codec.derr   Úpyasn1_modulesr   Úpyasn1_modules.rfc2459r   Úpyasn1_modules.rfc5208r   r5   Úgoogle.authr   r	   Úgoogle.auth.cryptr
   r!   rF   rm   rn   rq   r*   rZ   r-   ry   ÚFromServiceAccountMixinr]   r   r+   r   ú<module>r‚      su   ðñõ 'ã 	å $Ý Ý .Ý 1Û 
å  Ý "Ý "à%€Ø4Ð ØT€ØL€ÙÓ€òô*1�$—-‘-ô 1ôh;/�—‘˜T×9Ñ9õ ;/r+   