
    ~)                         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Jr	  SSK
Jr  SSK
Jr  SSKJr  SS	KJr  SS
KJr  SSKJr   " S S\R&                  5      rg)z=Import a provided key from file into KMS using an Import Job.    )absolute_import)division)unicode_literalsN)base)
exceptions)flags)maps)log)filesc                   R    \ rS rSrSr\S 5       rS rS rS r	S r
S rS	 rS
 rSrg)Import!   a  Import a version into an existing crypto key.

Imports wrapped key material into a new version within an existing crypto key
following the import procedure documented at
https://cloud.google.com/kms/docs/importing-a-key.

## EXAMPLES

The following command will read the files 'path/to/ephemeral/key' and
'path/to/target/key' and use them to create a new version with algorithm
'google-symmetric-encryption'  within the 'frodo' crypto key, 'fellowship'
keyring, and 'us-central1' location using import job 'strider' to unwrap the
provided key material.

  $ {command} --location=global \
       --keyring=fellowship \
       --key=frodo \
       --import-job=strider \
       --wrapped-key-file=path/to/target/key \
       --algorithm=google-symmetric-encryption
c                 n   [         R                  " U S5        [         R                  " U S5        [         R                  " U S5        [         R                  " U S5        [         R
                  " U 5        [         R                  " U S5        [         R                  " U 5        [         R                  " U 5        g )Nz"The containing key to import into.z8to re-import into. Omit this field for first-time importz	to importzto import from)	r   AddKeyResourceFlagsAddCryptoKeyVersionFlagAddRsaAesWrappedKeyFileFlagAddWrappedKeyFileFlagAddImportedVersionAlgorithmFlagAddRequiredImportJobArgumentAddPublicKeyFileFlagAddTargetKeyFileFlag)parsers    'lib/surface/kms/keys/versions/import.pyArgsImport.Args8   s    	f&JK	!!JL	%%fk:	4	))&1	&&v/?@	v&	v&    c                     [         R                  " U5      n[        U5      U:  a%  [        R                  " SR                  U5      5      eU$ )Nz6The file is larger than the maximum size of {0} bytes.)r   ReadBinaryFileContentslenr   BadFileExceptionformat)selfpath	max_bytesdatas       r   	_ReadFileImport._ReadFileD   sI    ''-D
4y9''
B
I
I  Kr   c                    UUR                   R                  R                  UR                   R                  R                  UR                   R                  R                  UR                   R                  R
                  4;   $ N)	ImportJobImportMethodValueValuesEnumRSA_OAEP_3072_SHA256RSA_OAEP_4096_SHA256RSA_OAEP_3072_SHA256_AES_256RSA_OAEP_4096_SHA256_AES_256r"   import_methodmessagess      r   _IsSha2ImportMethodImport._IsSha2ImportMethodL   sj    66KK66KK66	%	%x'9'9	$	$%A%AC C Cr   c                    XR                   R                  R                  UR                   R                  R                  UR                   R                  R                  UR                   R                  R
                  4;   $ r)   )r*   r+   RSA_OAEP_3072_SHA1_AES_256RSA_OAEP_4096_SHA1_AES_256r.   r/   r0   s      r   _IsRsaAesWrappingImportMethod$Import._IsRsaAesWrappingImportMethodT   se    //KK88%//KK88%//KK::%//KK::< < <r   c                      U R                  UR                  SS9$ ! [        R                   a5  n[        R
                  " SR                  UR                  U5      5      eS nAff = f)N   r$   z)Failed to read public key file [{0}]: {1})r&   public_key_filer   Errorr   r    r!   )r"   argses      r   _ReadPublicKeyBytesImport._ReadPublicKeyBytes^   s`    (^^D00E^BB;; (''
5
<
<""A'( ((s    A%0A  A%c                    UR                   R                  UR                  US95      nUR                  UR                  R
                  R                  :w  a0  [        R                  " SSR                  X%R                  5      5      eU$ )N)namez
import-jobz.Import job [{0}] is not active (state is {1}).)
&projects_locations_keyRings_importJobsGet5CloudkmsProjectsLocationsKeyRingsImportJobsGetRequeststater*   StateValueValuesEnumACTIVEr   BadArgumentExceptionr!   )r"   r?   import_job_nameclientr2   
import_jobs         r   _FetchImportJobImport._FetchImportJobf   s    >>BBFF  	G 	"#J 8--BBIII++
HOO//12 2 r   c           	          SSK Jn  SSKJn  SSK Jn  SSKJn	  SSK Jn
  W
R                  5       nU R                  X5      (       a  U
R!                  5       nU R#                  X5      (       d  UUR$                  R&                  R(                  :X  a  S	nOAUUR$                  R&                  R*                  :X  a  S
nO[-        SR/                  U5      5      eUSUR0                  -  -
  S-
  n[3        U5      U:  a&  [4        R6                  " SSR/                  U5      5      eSnUnWR9                  UW" 5       S9nU R#                  X5      (       a-  [:        R<                  " S5      nWR?                  XU" 5       5      nURA                  UW	RC                  U	RE                  U5      US S95      nUU-   $ ! [         a9    [        R                  R                  S5        [        R                  " S5         GNf = f)Nr   )serialization)default_backend)keywrap)padding)hasheszCannot load the Pyca cryptography library. Either the library is not installed, or site packages are not enabled for the Google Cloud SDK. Please consult https://cloud.google.com/kms/docs/crypto for further instructions.   i  i   zunexpected import method: {0}   ztarget-key-filezFThe file is larger than the import method's maximum size of {0} bytes.r   )backend    )mgf	algorithmlabel)#cryptography.hazmat.primitivesrR   cryptography.hazmat.backendsrS   rT   )cryptography.hazmat.primitives.asymmetricrU   rV   ImportErrorr
   errPrintsysexitSHA1r3   SHA256r8   r*   r+   r,   r-   
ValueErrorr!   digest_sizer   r   r    load_pem_public_keyosurandomaes_key_wrap_with_paddingencryptOAEPMGF1)r"   r1   public_key_bytestarget_key_bytesrM   r2   rR   rS   rT   rU   rV   shamodulus_byte_lengthmax_target_key_sizeaes_wrapped_keyto_be_rsa_wrapped_key
public_keyrsa_wrapped_keys                     r   _CkmRsaAesKeyWrapImport._CkmRsaAesKeyWrapp   s    ?>8C7 ++-C88MMOc --mFF
;;PPQ (
;;PPQ (8??NOO/1s3FG!K		!4	4))V/0
 	
 O,22/"3 3 5J))-BB jjn99
?3DFo ((c*cFHO _,,_  	ggmm $ %
 
hhqks   F/ /?G21G2c                    [         R                  " 5       n[         R                  " 5       n[        R                  " U5      R                  5       nS nUR                  (       a5  UR                  nUR                  (       a  [        R                  " SS5      eOUR                  n[        U5      [        UR                  5      :X  a  [        R                  " SS5      eS nU(       a   U R                  USS9nU R#                  XX#5      nUR                  (       a  S n	 U R                  UR                  SS9n	S n
UR$                  (       a  U R'                  U5      n
O%UR(                  R*                  R-                  S
5      n
U R/                  UR0                  U
XU5      nUR3                  [        R4                  " U5      R                  5       S9nUR7                  [8        R:                  R=                  UR>                  5      UUS9Ul         URB                  (       a3  [        RD                  " U5      R                  5       UR@                  l#        URH                  RK                  U5      $ ! [        R                   a*  n[        R                  " SR!                  XW5      5      eS nAff = f! [        R                   a5  n[        R                  " S	R!                  UR                  U5      5      eS nAff = f)N)z--wrapped-key-filez--rsa-aes-wrapped-key-filezGEither wrapped-key-file or rsa-aes-wrapped-key-file should be provided.)z--target-key-filez---wrapped-key-file/--rsa-aes-wrapped-key-filezAEither a pre-wrapped key or a key to be wrapped must be provided.r;   r<   z*Failed to read wrapped key file [{0}]: {1}i    z)Failed to read target key file [{0}]: {1}ascii)parent)r\   	importJob
wrappedKey)&cloudkms_baseGetClientInstanceGetMessagesModuler   ParseImportJobNameRelativeNamewrapped_key_filersa_aes_wrapped_key_filer   OneOfArgumentsRequiredExceptionbooltarget_key_filer&   r   r>   r    r!   rO   r=   rA   	publicKeypemencoderz   importMethodICloudkmsProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsImportRequestParseCryptoKeyNameImportCryptoKeyVersionRequestr	   ALGORITHM_MAPPER_FOR_IMPORTGetEnumForChoicer\   importCryptoKeyVersionRequestversionParseCryptoKeyVersionNamecryptoKeyVersion8projects_locations_keyRings_cryptoKeys_cryptoKeyVersionsr   )r"   r?   rM   r2   rL   r   wrapped_key_bytesr@   rN   rr   rq   reqs               r   Run
Import.Run   s   ,,.F..0H..t4AACO ..		&	&88@UW 	W 
'
 66d&:&:!;;66
P
MO O & NN+;uNM %%dVNJ*>>$*>*>$>O 			33D9%//33::7C001H1H1A1A19; 
\
\''-::< ] >C(0(N(N22CCNN!$	 )O )&C% ||;@;Z;Z
< 
''8 JJQQ S [[ &))8?? %& 	&& [[ *))7>>$$a)* 	**s0   &I+ J, +J)?%J$$J),K5 0K00K5 N)__name__
__module____qualname____firstlineno____doc__staticmethodr   r&   r3   r8   rA   rO   rz   r   __static_attributes__r   r   r   r   r   !   sA    , 	' 	'C<(<-|Dr   r   )r   
__future__r   r   r   rk   rd   googlecloudsdk.api_lib.cloudkmsr   r   googlecloudsdk.callioper   googlecloudsdk.command_lib.kmsr   r	   googlecloudsdk.corer
   googlecloudsdk.core.utilr   Commandr   r   r   r   <module>r      sA    D &  ' 	 
 A ( . 0 / # *QT\\ Qr   