
    x                         S r SSKrSSKrSSKrSSKJr  SSKJr  SSKrSr	 " S S\R                  5      rS r " S	 S
\5      rg)z1Utilities for encryption functions using openssl.    N)
exceptions)logi   c                       \ rS rSrSrSrg)OpenSSLException   z.Exception for problems with OpenSSL functions. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       >lib/googlecloudsdk/api_lib/compute/openssl_encryption_utils.pyr   r      s    6r   r   c                    U R                  5       n U R                  S5      nUS   R                  S5      (       a  US   R                  S5      (       d  [        SR	                  U 5      5      eSR                  USS 5      $ )z9Returns key with header, footer and all newlines removed.   
r   s   -----z;The following key does not appear to be in PEM format: 
{0}r      )stripsplit
startswithr   formatjoin)key	key_liness     r   StripKeyr   #   su    		#ii)
A,
!
!(
+
+r]%%h//
F	  
)Ab/	""r   c                   P    \ rS rSrSrS rSS jr\4S jrS r	SS jr
\4S	 jrS
rg)OpensslCrypt/   z,Base Class for OpenSSL encryption functions.c                     Xl         g Nopenssl_executable)selfr#   s     r   __init__OpensslCrypt.__init__2   s    0r   Nc                 >   U R                   /nUR                  U5         [        R                  " U[        R                  [        R                  [        R                  S9nUR                  U5      u  pV[        R                  " SR                  SR                  U5      U5      5        UR                  (       a)  [        SR                  US   UR                  U5      5      eU$ ! [         a-  n[        SR                  US   UR                  5      5      eSnAff = f)zARun an openssl command with optional input and return the output.)stdinstdoutstderrz-Ran command "{0}" with standard error of:
{1} z[{0}] exited with [{1}].r   Nz)[{0}] exited with return code [{1}]:
{2}.)r#   extend
subprocessPopenPIPEcommunicater   debugr   r   OSErrorr   strerror
returncode)r$   cmd_args	cmd_inputcommandpoutputr*   es           r   
RunOpenSSLOpensslCrypt.RunOpenSSL5   s     &&'GNN8E


7*//",//*//Ka}}Y/nf	ii@)624 	|| I$fWQZvFH HM  E 
$
+
+GAJ


CE E	Es   B	C% %
D/(DDc                 P    U R                  S[        R                  " U5      /5      $ )z&Returns an RSA key pair (private key).genrsa)r;   six	text_type)r$   
key_lengths     r   
GetKeyPairOpensslCrypt.GetKeyPairO   s    ??HcmmJ&?@AAr   c                 &    U R                  SS/US9$ )z%Returns a public key from a key pair.rsaz-puboutr6   )r;   )r$   r   s     r   GetPublicKeyOpensslCrypt.GetPublicKeyS   s    ??E9-?==r   c                    A[         R                  " U5      n[        R                  " 5        nUR	                  U5        UR                  5         SSSSUR                  /nU R                  XdS9nSSS5        U$ ! , (       d  f       W$ = f)zReturns a decrypted message using the provided key.

Args:
  key: An openssl key pair (private key).
  enc_message: a base64 encoded encrypted message.
  destroy_key: Unused for OpenSSL.
Returns:
  Decrypted version of enc_message
rsautlz-decryptz-oaepz-inkeyrF   N)base64	b64decodetempfileNamedTemporaryFilewriteflushnamer;   )r$   r   enc_messagedestroy_keyencrypted_message_datatfopenssl_argsmessages           r   DecryptMessageOpensslCrypt.DecryptMessageW   s|     	#--k: 
	$	$	&"hhsmhhj
GXrwwGlOg	 
'
 N 
'	&
 Ns   AA99
Bc                     [        U5      n[        R                  " U5      nUSS nUS-  nUS-  (       a  US-  nSU-
  nXGS n[        R                  " U5      n	[        R                  " U5      n
X4$ )zBReturns a base64 encoded modulus and exponent from the public key.N   r   )r   rK   rL   	b64encode)r$   
public_keyrA   r   decoded_keyexponent	key_bytesmodulus_startmodulusb64_modb64_exps              r   GetModulusExponentFromPublicKey,OpensslCrypt.GetModulusExponentFromPublicKeym   s     :
C""3'K 23H aIA~1niNM+Gw'Gx(Gr   r"   r!   )F)r	   r
   r   r   r   r%   r;   DEFAULT_KEY_LENGTHrB   rG   rX   rg   r   r   r   r   r   r   /   s/    414 #5 B>. 2Dr   r   )r   rK   r-   rM   googlecloudsdk.api_lib.computer   googlecloudsdk.corer   r?   ri   Errorr   r   objectr   r   r   r   <module>rn      sK    8    5 # 
  7z'' 7	#[6 [r   