+ err = gpgme_op_sign(ctx, gpgtext, gpgsig, GPGME_SIG_MODE_DETACH);
+ if (err != GPG_ERR_NO_ERROR) {
+ if (err == GPG_ERR_CANCELED) {
+ /* ignore cancelled signing */
+ privacy_reset_error();
+ debug_print("gpgme_op_sign cancelled\n");
+ } else {
+ privacy_set_error(_("Data signing failed, %s"), gpgme_strerror(err));
+ debug_print("gpgme_op_sign error : %x\n", err);
+ }
+ gpgme_release(ctx);
+ return FALSE;
+ }
+ result = gpgme_op_sign_result(ctx);
+ if (result && result->signatures) {
+ gpgme_new_signature_t sig = result->signatures;
+ if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) {
+ micalg = g_strdup_printf("pgp-%s", g_ascii_strdown(gpgme_hash_algo_name(
+ result->signatures->hash_algo),-1));
+ } else {
+ micalg = g_strdup(gpgme_hash_algo_name(
+ result->signatures->hash_algo));
+ }
+ while (sig) {
+ debug_print("valid signature: %s\n", sig->fpr);
+ sig = sig->next;
+ }
+ } else if (result && result->invalid_signers) {
+ gpgme_invalid_key_t invalid = result->invalid_signers;
+ while (invalid) {
+ g_warning("invalid signer: %s (%s)", invalid->fpr,
+ gpgme_strerror(invalid->reason));
+ privacy_set_error(_("Data signing failed due to invalid signer: %s"),
+ gpgme_strerror(invalid->reason));
+ invalid = invalid->next;
+ }
+ gpgme_release(ctx);
+ return FALSE;
+ } else {
+ /* can't get result (maybe no signing key?) */
+ debug_print("gpgme_op_sign_result error\n");
+ privacy_set_error(_("Data signing failed, no results."));