github.com/sentienttechnologies/studio-go-runner@v0.0.0-20201118202441-6d21f2ced8ee/assets/crypto/signer.py (about) 1 # Copyright 2020 (c) Cognizant Digital Business, Evolutionary AI. All rights reserved. Issued under the Apache 2.0 License. 2 # 3 import os 4 import sys 5 import paramiko 6 import base64 7 import traceback 8 9 10 class Signer: 11 """ 12 Implementation for experiment payload builder 13 using private key ed25519 SSH signing. 14 """ 15 def __init__(self, key_fn: str): 16 """ 17 param: keypath - file path to .pem file with public key 18 """ 19 20 key_path = os.path.abspath(key_fn) 21 self.key = None 22 try: 23 self.key = paramiko.Ed25519Key.from_private_key_file(filename=key_path) 24 except Exception as ex: 25 print('FAILED to import private key file: {} {}'.format(key_path, traceback.format_exc(ex))) 26 os.exit(-1) 27 28 def _sign_str(self, payload: str): 29 if self.key is None: 30 print('signing key is missing') 31 os.exit(-1) 32 sig = self.key.sign_ssh_data(bytes(payload, 'utf-8')) 33 if isinstance(sig, paramiko.Message): 34 sig = sig.asbytes() 35 return base64.b64encode(sig).decode() 36 37 def sign(self, payload: str): 38 return self._sign_str(payload) 39 40 41 def main(): 42 if len(sys.argv) < 4: 43 print('USAGE {} private-key-file-path file-to-sign signature-file-path'.format(sys.argv[0])) 44 sys.exit(-1) 45 46 with open(sys.argv[3], 'w+') as f: 47 signer = Signer(sys.argv[1]) 48 with open(sys.argv[2], 'r') as file: 49 data = file.read() 50 try: 51 result = signer.sign(data) 52 except Exception as ex: 53 f.write('FAILED to sign data {}'.format(ex)) 54 sys.exit(-1) 55 56 f.write(result) 57 58 59 if __name__ == '__main__': 60 main()