2021-03-04 17:47:13 +01:00
|
|
|
# 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")
|
2021-04-08 07:09:38 +02:00
|
|
|
logg.debug(f'using signing key: {key_id}, algorithm: {key_algorithm}')
|
2021-03-04 17:47:13 +01:00
|
|
|
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)
|
|
|
|
|
|
|
|
|