
                         v    S r SSKJr  SSKrSSKrSSKJr  SrSrSr	Sr
SqS	 r " S
 S\5      r " S S\5      rg)zPure Python crypto-related routines for oauth2client.

Uses the ``rsa``, ``pyasn1`` and ``pyasn1_modules`` packages
to parse PEM files storing PKCS#1 or PKCS#8 keys as well as
certificates.
    )pemN)_helpersz\
PKCS12 format is not supported by the RSA library.
Either install PyOpenSSL, or please convert .p12 format
to .pem format:
    $ cat key.p12 | \
    >   openssl pkcs12 -nodes -nocerts -passin pass:notasecret | \
    >   openssl rsa > key.pem
)   @                      )z-----BEGIN RSA PRIVATE KEY-----z-----END RSA PRIVATE KEY-----)z-----BEGIN PRIVATE KEY-----z-----END PRIVATE KEY-----c                    [        U 5      n[        5       n[        R                  R	                  SUS5       H;  nXUS-    n[        S [        [        U5       5       5      nUR                  U5        M=     [        U5      $ )z~Converts an iterable of 1's and 0's to bytes.

Combines the list 8 at a time, treating each group of 8 bits
as a single byte.
r   r	   c              3   .   #    U  H  u  pX-  v   M     g 7fN ).0valdigits      2lib/third_party/oauth2client/_pure_python_crypt.py	<genexpr>%_bit_list_to_bytes.<locals>.<genexpr>8   s      @)>:3 {)>s   )
len	bytearraysixmovesxrangesumzip_POW2appendbytes)bit_listnum_bits	byte_valsstart	curr_bitschar_vals         r   _bit_list_to_bytesr'   .   s{     8}HI!!!Xq1519-	 @),UI)>@ @"	 2
     c                   4    \ rS rSrSrS rS r\S 5       rSr	g)RsaVerifier>   zuVerifies the signature on a message.

Args:
    pubkey: rsa.key.PublicKey (or equiv), The public key to verify with.
c                     Xl         g r   _pubkey)selfpubkeys     r   __init__RsaVerifier.__init__E   s    r(   c                     [         R                  " USS9n [        R                  R	                  XU R
                  5      $ ! [        [        R                  R                  4 a     gf = f)a  Verifies a message against a signature.

Args:
    message: string or bytes, The message to verify. If string, will be
             encoded to bytes as utf-8.
    signature: string or bytes, The signature on the message. If
               string, will be encoded to bytes as utf-8.

Returns:
    True if message was signed by the private key associated with the
    public key that this object was constructed with.
utf-8encodingF)r   	_to_bytesrsapkcs1verifyr.   
ValueErrorVerificationError)r/   message	signatures      r   r:   RsaVerifier.verifyH   sW     $$Ww?	99##GEECII778 		s   )A $A('A(c                    [         R                  " U5      nU(       a  SSKJn  SSKJn  [        R                  R                  US5      nUR                  XTR                  5       S9u  pgUS:w  a  [        SU5      eUS   S	   n[        US
   5      n	[        R                  R                  U	S5      n
O [        R                  R                  US5      n
U " U
5      $ )aW  Construct an RsaVerifier instance from a string.

Args:
    key_pem: string, public key in PEM format.
    is_x509_cert: bool, True if key_pem is an X509 cert, otherwise it
                  is expected to be an RSA key in PEM format.

Returns:
    RsaVerifier instance.

Raises:
    ValueError: if the key_pem can't be parsed. In either case, error
                will begin with 'No PEM start marker'. If
                ``is_x509_cert`` is True, will fail to find the
                "-----BEGIN CERTIFICATE-----" error, otherwise fails
                to find "-----BEGIN RSA PUBLIC KEY-----".
r   decoder)rfc2459CERTIFICATEasn1Specr(   Unused bytestbsCertificatesubjectPublicKeyInfosubjectPublicKeyDERPEM)r   r7   pyasn1.codec.derrB   pyasn1_modulesrC   r8   r   load_pemdecodeCertificater;   r'   	PublicKey
load_pkcs1)clskey_pemis_x509_certrB   rC   der	asn1_cert	remaining	cert_info	key_bytesr0   s              r   from_stringRsaVerifier.from_string[   s    & $$W-0.''""7M:C#*>>#@S@S@U>#V IC ;;!"234JKI*95G+HII]]--i?F]]--gu=F6{r(   r-   N)
__name__
__module____qualname____firstlineno____doc__r1   r:   classmethodr\   __static_attributes__r   r(   r   r*   r*   >   s%    & ! !r(   r*   c                   8    \ rS rSrSrS rS r\SS j5       rSr	g)		RsaSignerr   zqSigns messages with a private key.

Args:
    pkey: rsa.key.PrivateKey (or equiv), The private key to sign with.
c                     Xl         g r   _key)r/   pkeys     r   r1   RsaSigner.__init__   s    	r(   c                     [         R                  " USS9n[        R                  R	                  XR
                  S5      $ )zSigns a message.

Args:
    message: bytes, Message to be signed.

Returns:
    string, The signature of the message for the given key.
r4   r5   zSHA-256)r   r7   r8   r9   signri   )r/   r=   s     r   rm   RsaSigner.sign   s/     $$Ww?yy~~gyy)<<r(   c                 P   [         R                  " U5      n[        R                  " [        R
                  " U5      [        [        5      u  p4US:X  a)  [        R                  R                  R                  USS9nOUS:X  a  SSKJn  SSKJn  [         c  UR#                  5       qUR%                  U[         S9u  pU	S:w  a  ['        S	U	5      eUR)                  S
5      n
[        R                  R                  R                  U
R+                  5       SS9nO['        S5      eU " U5      $ )a8  Construct an RsaSigner instance from a string.

Args:
    key: string, private key in PEM format.
    password: string, password for private key file. Unused for PEM
              files.

Returns:
    RsaSigner instance.

Raises:
    ValueError if the key cannot be parsed as PKCS#1 or PKCS#8 in
    PEM format.
r   rK   )formatr   rA   )rfc5208rE   r(   rG   
privateKeyzNo key could be detected.)r   _from_bytesr   readPemBlocksFromFiler   StringIO_PKCS1_MARKER_PKCS8_MARKERr8   key
PrivateKeyrS   rM   rB   rN   rq   _PKCS8_SPECPrivateKeyInforP   r;   getComponentByNameasOctets)rT   rx   password	marker_idr[   rj   rB   rq   key_inforY   	pkey_infos              r   r\   RsaSigner.from_string   s
   " ""3'"88LL}m =	 >77%%008= 1 ?D!^0."#224k")..K #1 #1HC ;; 33LAI77%%001C1C1E8= 1 ?D 8994yr(   rh   N)
notasecret)
r^   r_   r`   ra   rb   r1   rm   rc   r\   rd   r   r(   r   rf   rf      s%    
= ' 'r(   rf   )rb   rN   r   r8   r   oauth2clientr   _PKCS12_ERRORr   rv   rw   rz   r'   objectr*   rf   r   r(   r   <module>r      sW     
 
 ! 	&2. ?& ?D> >r(   