Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}