def sign(filename): """Returns detached signature for file""" plaintext = _get_file_data(filename) ciphertext = core.Data() ctx = core.Context() ctx.set_armor(1) ctx.set_passphrase_cb(_passphrase_callback) ctx.op_keylist_start(str(config["gpg_key_uid"]), 0) sigkey = ctx.op_keylist_next() ##print sigkey.uids[0].uid ctx.signers_clear() ctx.signers_add(sigkey) passwd_is_incorrect = None while passwd_is_incorrect is None or passwd_is_incorrect: try: ctx.op_sign(plaintext, ciphertext, pygpgme.GPGME_SIG_MODE_DETACH) passwd_is_incorrect = False except errors.GPGMEError: passwd_is_incorrect = True uid = config["gpg_key_uid"] stored = config["gpg_key_passphrase_isstored"] passwd = get_gpg_passwd_from_user(stored, passwd_is_incorrect, uid) if passwd is None: return config["gpg_key_passphrase"] = repr(passwd) ctx.set_passphrase_cb(_passphrase_callback) ciphertext.seek(0, 0) signature = ciphertext.read() return signature
def genkey(): """Creates a new standard GPG key""" # Initialize our context. core.check_version(None) context = core.Context() context.set_armor(1) # Check if standard key is already present keyname = str(config["gpg_key_uid"]) context.op_keylist_start(keyname, 0) key = context.op_keylist_next() # If no key is chosen generate one no_key = key is None or not key or not keyname if no_key: # If no GPG key is set in config, choose one uid = choose_uid(context) if no_key and uid is not None: # A key has been chosen config["gpg_key_uid"] = repr(uid) stored = config["gpg_key_passphrase_isstored"] passwd = get_gpg_passwd_from_user(stored=stored, uid=uid) if passwd is None: sys.exit() else: config["gpg_key_passphrase"] = repr(passwd) elif no_key and uid is None: # No key has been chosen --> Create new one # Show progress dialog dlg_msg = _("Generating new GPG key {}.\nThis may take some time.\n \n" "Progress bar may stall. Please wait.").format(keyname) dlg = wx.ProgressDialog(_("GPG key generation"), dlg_msg, maximum=200, parent=None, style=wx.PD_ELAPSED_TIME) class CBFs(object): """Callback functions for pyme""" progress = 0 def cbf(self, what=None, type=None, current=None, total=None, hook=None): """Callback function that updates progress dialog""" dlg.Update(self.progress % 199) self.progress += 1 cbfs = CBFs() gpg_key_parameters = get_key_params_from_user() config["gpg_key_uid"] = repr(str( \ [val for key, val in gpg_key_parameters if key == 'Name-Real'][0])) config["gpg_key_passphrase"] = repr(str(([val \ for key, val in gpg_key_parameters if key == 'Passphrase'][0]))) gpg_key_parameters_string = get_key_params_string(gpg_key_parameters) context.set_progress_cb(cbfs.cbf, None) context.op_genkey(gpg_key_parameters_string, None, None) dlg.Destroy()