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()