# standard imports import json import logging from typing import Optional from urllib.request import Request, urlopen # third-party imports import gnupg # local imports logg = logging.getLogger() class Signer: """ :cvar gpg_path: :type gpg_path: :cvar gpg_passphrase: :type gpg_passphrase: :cvar key_file_path: :type key_file_path: """ gpg_path: str = None gpg_passphrase: str = None key_file_path: str = None def __init__(self): self.gpg = gnupg.GPG(gnupghome=self.gpg_path) # parse key file data key_file = open(self.key_file_path, 'r') self.key_data = key_file.read() key_file.close() def get_operational_key(self): """ :return: :rtype: """ # import key data into keyring self.gpg.import_keys(key_data=self.key_data) gpg_keys = self.gpg.list_keys() key_algorithm = gpg_keys[0].get('algo') key_id = gpg_keys[0].get("keyid") logg.debug(f'using signing key: {key_id}, algorithm: {key_algorithm}') return gpg_keys[0] def sign_digest(self, data: bytes): """ :param data: :type data: :return: :rtype: """ data = json.loads(data) digest = data['digest'] key_id = self.get_operational_key().get('keyid') signature = self.gpg.sign(digest, passphrase=self.gpg_passphrase, keyid=key_id) return str(signature)