|  | # Copyright 2020 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | from recipe_engine import recipe_api | 
|  |  | 
|  |  | 
|  | class KMSApi(recipe_api.RecipeApi): | 
|  | """Provides KMS support for recipe secrets.""" | 
|  |  | 
|  | def get_secret(self, input_file, secret_path): | 
|  | """Decrypts the encrypted secret. | 
|  |  | 
|  | Args: | 
|  | input_file (str): encrypted file of the secret. | 
|  | secret_path (Path): path of decrypted secret. | 
|  | """ | 
|  | cloudkms_dir = self.m.path['start_dir'].join('cloudkms') | 
|  | cloudkms_package = 'infra/tools/luci/cloudkms/${platform}' | 
|  | self.m.cipd.ensure( | 
|  | cloudkms_dir, | 
|  | self.m.cipd.EnsureFile().add_package(cloudkms_package, 'latest') | 
|  | ) | 
|  | encrypt_file = self.m.path['cleanup'].join(input_file) | 
|  | self.m.gsutil.download('flutter_configs', input_file, encrypt_file) | 
|  | cloudkms = cloudkms_dir.join( | 
|  | 'cloudkms.exe' if self.m.platform.name == 'win' else 'cloudkms' | 
|  | ) | 
|  | self.m.step( | 
|  | 'cloudkms get key', [ | 
|  | cloudkms, 'decrypt', '-input', encrypt_file, '-output', secret_path, | 
|  | 'projects/flutter-infra/locations/global' | 
|  | '/keyRings/luci/cryptoKeys/flutter-infra' | 
|  | ] | 
|  | ) | 
|  |  | 
|  | def decrypt_secrets(self, env, secrets): | 
|  | """Decrypts the secrets. | 
|  |  | 
|  | This method decrypts files stored in GCS using kms certificates and sets | 
|  | environment variables pointing to the location of the decrypted file. You | 
|  | have to be careful of not printing the content of the decrypted file or | 
|  | adding the content of the decrypted file as an environment variable as it | 
|  | will print in the logs. | 
|  |  | 
|  | Args: | 
|  | env(dict): Current environment variables. | 
|  | secrets(dict): The key is the n. me of the env variable referencing the | 
|  | decrypted file and the value is the path to the encrypted file in gcs. | 
|  | """ | 
|  | for k, v in secrets.items(): | 
|  | secret_path = self.m.path['cleanup'].join(k) | 
|  | self.m.kms.get_secret(v, secret_path) | 
|  | env[k] = secret_path |