diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 1998-06-08 20:05:39 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 1998-06-08 20:05:39 +0000 |
commit | 90bea32a9b22777b4b32e787661aa532c7d77fc2 (patch) | |
tree | c440dc034d44d8b7c95073cc80b7a3f3b3b6c219 /pgpinvoke.c | |
parent | 6f8d5623a93d23e714f3252ab1bca02b9fc3bc86 (diff) |
GPG support, first take.
Diffstat (limited to 'pgpinvoke.c')
-rw-r--r-- | pgpinvoke.c | 604 |
1 files changed, 361 insertions, 243 deletions
diff --git a/pgpinvoke.c b/pgpinvoke.c index 81823b13..d69c3800 100644 --- a/pgpinvoke.c +++ b/pgpinvoke.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997 Thomas Roessler <roessler@guug.de> + * Copyright (C) 1997-1998 Thomas Roessler <roessler@guug.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,333 +26,451 @@ #include "pgp.h" -pid_t pgp_invoke_decode (FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, int need_passphrase) +/******************************************************************* + * + * PGP V2 Invocation stuff + * + *******************************************************************/ + +pid_t pgp_v2_invoke_decode(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, int need_passphrase) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_DECODE); - - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), "%scat %s%s | " - "%s +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f", - need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", - need_passphrase ? "- " : "", - fname, - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), "%scat %s%s | " - "%sv +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f " - "--OutputInformationFD=2", - need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", - need_passphrase ? "- " : "", - fname, - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - } + snprintf(cmd, sizeof(cmd), "%scat %s%s | " + "%s +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f", + need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", + need_passphrase ? "- " : "", + fname, + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } -pid_t pgp_invoke_verify(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *signedstuff, const char *sigfile) +pid_t pgp_v2_invoke_verify(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *signedstuff, const char *sigfile) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_VERIFY); - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } - - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), - "%s +language=%s +pubring=%s +secring=%s +batchmode +verbose=0 %s %s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), - "%sv +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 +batchmode +verbose=0 %s %s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - } - + snprintf(cmd, sizeof(cmd), + "%s +language=%s +pubring=%s +secring=%s +batchmode +verbose=0 %s %s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff); + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } +pid_t pgp_v2_invoke_decrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s +language=%s +pubring=%s +secring=%s " + "+verbose=0 +batchmode -f", + fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} -pid_t pgp_invoke_decrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, + + + +pid_t pgp_v2_invoke_sign(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *fname) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_DECRYPT); - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } + snprintf(cmd, sizeof(cmd), + "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s " + "+language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -abfst %s %s", + fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), + PgpSignAs ? "-u" : "", + PgpSignAs ? PgpSignAs : ""); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s +language=%s +pubring=%s +secring=%s " - "+verbose=0 +batchmode -f", - fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %sv +language=%s +pubring=%s +secring=%s " - "+verbose=0 +batchmode -f --OutputInformationFD=2", - fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - } + +pid_t pgp_v2_invoke_encrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, const char *uids, int sign) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%scat %s%s | %s +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode -aeft%s %s%s %s", + sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", + sign ? "- " : "", + fname, + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), + option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", + sign ? "s" : "", + sign && PgpSignAs ? "-u " : "", + sign && PgpSignAs ? PgpSignAs : "", + uids); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + +void pgp_v2_invoke_import(struct pgp_vinfo *pgp, const char *fname) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s -ka %s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname); + mutt_system(cmd); +} + +pid_t pgp_v2_invoke_export(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), "%s -kxaf +language=%s +pubring=%s +secring=%s 0x%8s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + pgpinfd, pgpoutfd, pgperrfd); } -pid_t pgp_invoke_sign(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) +pid_t pgp_v2_invoke_verify_key(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_SIGN); - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } + snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s +batchmode -kcc 0x%8s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s " - "+language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -abfst %s %s", - fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), - PgpSignAs ? "-u" : "", - PgpSignAs ? PgpSignAs : ""); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %ss " - "+language=%s +pubring=%s +secring=%s +verbose=0 -abft %s %s", - fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), - PgpSignAs ? "-u" : "", - PgpSignAs ? PgpSignAs : ""); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - } +/******************************************************************* + * + * PGP V3 Invocation stuff + * + *******************************************************************/ + + +pid_t pgp_v3_invoke_decode(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, int need_passphrase) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), "%scat %s%s | " + "%sv +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f " + "--OutputInformationFD=2", + need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", + need_passphrase ? "- " : "", + fname, + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } -pid_t pgp_invoke_encrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, const char *uids, int sign) +pid_t pgp_v3_invoke_verify(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *signedstuff, const char *sigfile) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%sv +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 +batchmode +verbose=0 %s %s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + +pid_t pgp_v3_invoke_encrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, const char *uids, int sign) { char cmd[HUGE_STRING]; char tmpcmd[HUGE_STRING]; char *cp; char *keylist; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_ENCRYPT); - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } - - switch(pgp->v) + snprintf(cmd, sizeof(cmd), + "%scat %s%s | %se +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode +nobatchinvalidkeys=off -aft%s %s%s", + sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", + sign ? "- " : "", + fname, + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), + option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", + sign ? "s" : "", + sign && PgpSignAs ? "-u " : "", + sign && PgpSignAs ? PgpSignAs : ""); + + keylist = safe_strdup(uids); + + for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " ")) { - case PGP_V2: - snprintf(cmd, sizeof(cmd), - "%scat %s%s | %s +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode -aeft%s %s%s %s", - sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", - sign ? "- " : "", - fname, - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), - option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", - sign ? "s" : "", - sign && PgpSignAs ? "-u " : "", - sign && PgpSignAs ? PgpSignAs : "", - uids); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), - "%scat %s%s | %se +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode +nobatchinvalidkeys=off -aft%s %s%s", - sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", - sign ? "- " : "", - fname, - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), - option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", - sign ? "s" : "", - sign && PgpSignAs ? "-u " : "", - sign && PgpSignAs ? PgpSignAs : ""); - - keylist = safe_strdup(uids); - for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " ")) - { - snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", - cmd, cp); - strcpy(cmd, tmpcmd); - } - safe_free((void **) &keylist); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - + snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", + cmd, cp); + strcpy(cmd, tmpcmd); } + safe_free((void **) &keylist); return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } - -void pgp_invoke_extract(const char *fname) +pid_t pgp_v3_invoke_decrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_EXTRACT); + + snprintf(cmd, sizeof(cmd), + "PGPPASSFD=0; export PGPPASSFD; cat - %s | %sv +language=%s +pubring=%s +secring=%s " + "+verbose=0 +batchmode -f --OutputInformationFD=2", + fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring)); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} - if(!pgp) - { - mutt_error("Unknown PGP version."); - return; - } - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s -ka %s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname); - break; +pid_t pgp_v3_invoke_sign(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) +{ + char cmd[HUGE_STRING]; - case PGP_V3: - snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s -a --OutputInformationFD=1 %s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname); - break; + snprintf(cmd, sizeof(cmd), + "PGPPASSFD=0; export PGPPASSFD; cat - %s | %ss " + "+language=%s +pubring=%s +secring=%s +verbose=0 -abft %s %s", + fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), + PgpSignAs ? "-u" : "", + PgpSignAs ? PgpSignAs : ""); - default: - mutt_error("Unknown PGP version."); - return; + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} +void pgp_v3_invoke_import(struct pgp_vinfo *pgp, const char *fname) +{ + char cmd[HUGE_STRING]; - } + snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s -a --OutputInformationFD=1 %s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname); mutt_system(cmd); } -pid_t pgp_invoke_verify_key(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +pid_t pgp_v3_invoke_export(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_VERIFY_KEY); - if(!pgp) - { - mutt_error("Unknown PGP version."); - return -1; - } + snprintf(cmd, sizeof(cmd), "%sk -xa +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 0x%8s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + +pid_t pgp_v3_invoke_verify_key(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s +batchmode -c --OutputInformationFD=1 0x%8s", + NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + + +/******************************************************************* + * + * GNU Privacy Guard invocation stuff + * + * Credits go to Werner Koch for sending me the code on which this + * is based. + * + *******************************************************************/ + +pid_t pgp_gpg_invoke_decode(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, int need_passphrase) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%s%s --no-verbose -v --batch --status-fd 2 -o - " + "--decrypt %s", + NONULL(*pgp->binary), need_passphrase? " --passphrase-fd 0":"", + fname); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + +pid_t pgp_gpg_invoke_verify(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *signedstuff, const char *sigfile) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%s --no-verbose --batch --status-fd 2 -o - " + "--verify %s %s", + NONULL(*pgp->binary), sigfile, signedstuff); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} - switch(pgp->v) +pid_t pgp_gpg_invoke_decrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%s --passphrase-fd 0 --no-verbose -v --batch --status-fd 2 -o - " + "--decrypt %s", + NONULL(*pgp->binary), fname ); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} + +static char *gpg_digalg(void) +{ + static char digalg[STRING]; + if(PgpSignMicalg && !strncasecmp(PgpSignMicalg, "pgp-", 4)) + strfcpy(digalg, PgpSignMicalg + 4, sizeof(digalg)); + else { - case PGP_V2: - snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s +batchmode -kcc 0x%8s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); - break; - - case PGP_V3: - snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s +batchmode -c --OutputInformationFD=1 0x%8s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); - break; - - default: - mutt_error("Unknown PGP version."); - return -1; - + /* We use md5 here as the default value as it's the good + * old default value for PGP and will be used in the + * message's headers. + */ + + strcpy(digalg, "md5"); } + return digalg; +} + +pid_t pgp_gpg_invoke_sign(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) +{ + char cmd[HUGE_STRING]; + + snprintf(cmd, sizeof(cmd), + "%s --no-verbose -vv --batch --status-fd 2 -o - " + "--passphrase-fd 0 --digest-algo %s " + "--detach-sign --textmode --armor %s%s %s", + NONULL(*pgp->binary), + gpg_digalg(), + *PgpSignAs? "-u " : "", + *PgpSignAs? PgpSignAs : "", fname ); + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } -pid_t pgp_invoke_extract_key(FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) + +pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, const char *uids, int sign) { char cmd[HUGE_STRING]; - struct pgp_vinfo *pgp = pgp_get_vinfo(PGP_EXTRACT_KEY); + char tmpcmd[HUGE_STRING]; + char *cp; + char *keylist; + + snprintf(cmd, sizeof(cmd), + "%s%s --no-verbose --batch --status-fd 2 -o - " + "--digest-algo %s " + "--encrypt%s --textmode --armor %s%s", + NONULL(*pgp->binary), + sign? " --passphrase-fd 0":"", + gpg_digalg(), + sign? " --sign":"", + *PgpSignAs? "-u " : "", + *PgpSignAs? PgpSignAs : "" ); + + keylist = safe_strdup(uids); - if(!pgp) + for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " ")) { - mutt_error("Unknown PGP version."); - return -1; + snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", + cmd, cp); + strcpy(cmd, tmpcmd); } + safe_free((void **) &keylist); + snprintf(tmpcmd, sizeof(tmpcmd), "%s %s", cmd, fname); + strcpy(cmd, tmpcmd); + + return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + pgpinfd, pgpoutfd, pgperrfd); +} - switch(pgp->v) - { - case PGP_V2: - snprintf(cmd, sizeof(cmd), "%s -kxaf +language=%s +pubring=%s +secring=%s 0x%8s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); - break; +void pgp_gpg_invoke_import(struct pgp_vinfo *pgp, const char *fname) +{ + mutt_error("pgp_gpg_invoke_import() has not yet been implemented."); +} + +pid_t pgp_gpg_invoke_export(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +{ + mutt_error("pgp_gpg_invoke_export() has not yet been implemented."); + return -1; +} - case PGP_V3: - snprintf(cmd, sizeof(cmd), "%sk -xa +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 0x%8s", - NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id); - break; - default: - mutt_error("Unknown PGP version."); - return -1; +pid_t pgp_gpg_invoke_verify_key(struct pgp_vinfo *pgp, + FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +{ + char cmd[HUGE_STRING]; - } + snprintf(cmd, sizeof(cmd), + "%sm --no-verbose --batch --fingerprint --check-sigs %s%s", + NONULL(*pgp->binary), (strlen(id)==8 || strlen(id)==16)? "0x":"", id ); return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); |