
                             S r SSKJr  SSKJr  SSKJ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.    )absolute_import)division)unicode_literalsN)
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)OpensslCrypt2   z,Base Class for OpenSSL encryption functions.c                     Xl         g Nopenssl_executable)selfr&   s     r   __init__OpensslCrypt.__init__5   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.RunOpenSSL8   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.GetKeyPairR   s    ??HcmmJ&?@AAr   c                 &    U R                  SS/US9$ )z%Returns a public key from a key pair.rsaz-puboutr9   )r>   )r'   r   s     r   GetPublicKeyOpensslCrypt.GetPublicKeyV   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-inkeyrI   N)base64	b64decodetempfileNamedTemporaryFilewriteflushnamer>   )r'   r   enc_messagedestroy_keyencrypted_message_datatfopenssl_argsmessages           r   DecryptMessageOpensslCrypt.DecryptMessageZ   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   rN   rO   	b64encode)r'   
public_keyrD   r   decoded_keyexponent	key_bytesmodulus_startmodulusb64_modb64_exps              r   GetModulusExponentFromPublicKey,OpensslCrypt.GetModulusExponentFromPublicKeyp   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_LENGTHrE   rJ   r[   rj   r   r   r   r   r!   r!   2   s/    414 #5 B>. 2Dr   r!   )r   
__future__r   r   r   rN   r0   rP   googlecloudsdk.api_lib.computer   googlecloudsdk.corer   rB   rl   Errorr	   r   objectr!   r   r   r   <module>rr      sR    8 &  '    5 # 
  7z'' 7	#[6 [r   