static gpgme_error_t gpgsm_encrypt(void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags, gpgme_data_t plain, gpgme_data_t ciph, int use_armor) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; if(!gpgsm) return gpg_error(GPG_ERR_INV_VALUE); if(!recp) return gpg_error(GPG_ERR_NOT_IMPLEMENTED); gpgsm->input_cb.data = plain; err = gpgsm_set_fd(gpgsm, INPUT_FD, map_input_enc(gpgsm->input_cb.data)); if(err) return err; gpgsm->output_cb.data = ciph; err = gpgsm_set_fd(gpgsm, OUTPUT_FD, use_armor ? "--armor" : 0); if(err) return err; gpgsm_clear_fd(gpgsm, MESSAGE_FD); err = set_recipients(gpgsm, recp); if(!err) err = start(gpgsm, "ENCRYPT"); return err; }
static gpgme_error_t gpgsm_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text, gpgme_data_t plaintext) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; if (!gpgsm) return gpg_error (GPG_ERR_INV_VALUE); gpgsm->input_cb.data = sig; err = gpgsm_set_fd (gpgsm, INPUT_FD, map_input_enc (gpgsm->input_cb.data)); if (err) return err; if (plaintext) { /* Normal or cleartext signature. */ gpgsm->output_cb.data = plaintext; err = gpgsm_set_fd (gpgsm, OUTPUT_FD, 0); gpgsm_clear_fd (gpgsm, MESSAGE_FD); } else { /* Detached signature. */ gpgsm->message_cb.data = signed_text; err = gpgsm_set_fd (gpgsm, MESSAGE_FD, 0); gpgsm_clear_fd (gpgsm, OUTPUT_FD); } if (!err) err = start (gpgsm, "VERIFY"); return err; }
static gpgme_error_t gpgsm_import(void *engine, gpgme_data_t keydata) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; if(!gpgsm) return gpg_error(GPG_ERR_INV_VALUE); gpgsm->input_cb.data = keydata; err = gpgsm_set_fd(gpgsm, INPUT_FD, map_input_enc(gpgsm->input_cb.data)); if(err) return err; gpgsm_clear_fd(gpgsm, OUTPUT_FD); gpgsm_clear_fd(gpgsm, MESSAGE_FD); err = start(gpgsm, "IMPORT"); return err; }
static gpgme_error_t gpgsm_decrypt(void *engine, gpgme_data_t ciph, gpgme_data_t plain) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; if(!gpgsm) return gpg_error(GPG_ERR_INV_VALUE); gpgsm->input_cb.data = ciph; err = gpgsm_set_fd(gpgsm, INPUT_FD, map_input_enc(gpgsm->input_cb.data)); if(err) return gpg_error(GPG_ERR_GENERAL); /* FIXME */ gpgsm->output_cb.data = plain; err = gpgsm_set_fd(gpgsm, OUTPUT_FD, 0); if(err) return gpg_error(GPG_ERR_GENERAL); /* FIXME */ gpgsm_clear_fd(gpgsm, MESSAGE_FD); err = start(engine, "DECRYPT"); return err; }
static gpgme_error_t gpgsm_genkey(void *engine, gpgme_data_t help_data, int use_armor, gpgme_data_t pubkey, gpgme_data_t seckey) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; if(!gpgsm || !pubkey || seckey) return gpg_error(GPG_ERR_INV_VALUE); gpgsm->input_cb.data = help_data; err = gpgsm_set_fd(gpgsm, INPUT_FD, map_input_enc(gpgsm->input_cb.data)); if(err) return err; gpgsm->output_cb.data = pubkey; err = gpgsm_set_fd(gpgsm, OUTPUT_FD, use_armor ? "--armor" : 0); if(err) return err; gpgsm_clear_fd(gpgsm, MESSAGE_FD); err = start(gpgsm, "GENKEY"); return err; }
static gpgme_error_t gpgsm_sign(void *engine, gpgme_data_t in, gpgme_data_t out, gpgme_sig_mode_t mode, int use_armor, int use_textmode, int include_certs, gpgme_ctx_t ctx /* FIXME */) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; char *assuan_cmd; int i; gpgme_key_t key; if(!gpgsm) return gpg_error(GPG_ERR_INV_VALUE); /* FIXME: This does not work as RESET does not reset it so we can't revert back to default. */ if(include_certs != GPGME_INCLUDE_CERTS_DEFAULT) { /* FIXME: Make sure that if we run multiple operations, that we can reset any previously set value in case the default is requested. */ if(asprintf(&assuan_cmd, "OPTION include-certs %i", include_certs) < 0) return gpg_error_from_errno(errno); err = gpgsm_assuan_simple_command(gpgsm->assuan_ctx, assuan_cmd, NULL, NULL); free(assuan_cmd); if(err) return err; } for(i = 0; (key = gpgme_signers_enum(ctx, i)); i++) { const char *s = key->subkeys ? key->subkeys->fpr : NULL; if(s && strlen(s) < 80) { char buf[100]; strcpy(stpcpy(buf, "SIGNER "), s); err = gpgsm_assuan_simple_command(gpgsm->assuan_ctx, buf, NULL, NULL); } else err = gpg_error(GPG_ERR_INV_VALUE); gpgme_key_unref(key); if(err) return err; } gpgsm->input_cb.data = in; err = gpgsm_set_fd(gpgsm, INPUT_FD, map_input_enc(gpgsm->input_cb.data)); if(err) return err; gpgsm->output_cb.data = out; err = gpgsm_set_fd(gpgsm, OUTPUT_FD, use_armor ? "--armor" : 0); if(err) return err; gpgsm_clear_fd(gpgsm, MESSAGE_FD); err = start(gpgsm, mode == GPGME_SIG_MODE_DETACH ? "SIGN --detached" : "SIGN"); return err; }