URI: 
       tmpgp.c - mixmaster - mixmaster 3.0 patched for libressl
  HTML git clone git://parazyd.org/mixmaster.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
       tmpgp.c (6229B)
       ---
            1 /* mpgp -- (C) 2000 - 2006 Ulf Moeller and others.
            2 
            3    mpgp may be redistributed and modified under certain conditions.
            4    This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
            5    ANY KIND, either express or implied. See the file COPYRIGHT for
            6    details.
            7 
            8    Test application for OpenPGP features
            9    $Id: mpgp.c 934 2006-06-24 13:40:39Z rabbi $ */
           10 
           11 #define MPGPVERSION "0.3.0"
           12 
           13 #include "mix3.h"
           14 #include "pgp.h"
           15 #include <stdlib.h>
           16 #include <string.h>
           17 #include <fcntl.h>
           18 #include <assert.h>
           19 #include <sys/types.h>
           20 #include <sys/stat.h>
           21 #include <time.h>
           22 #include <fcntl.h>
           23 #ifdef POSIX
           24 #include <unistd.h>
           25 #include <termios.h>
           26 #endif /* POSIX */
           27 
           28 int pass(BUFFER *b)
           29 {
           30   char p[LINELEN];
           31   int fd;
           32   int n;
           33 
           34 #ifdef HAVE_TERMIOS
           35   struct termios attr;
           36 #endif /* HAVE_TERMIOS */
           37 
           38   fprintf(stderr, "enter passphrase: ");
           39   fflush(stderr);
           40 #ifdef HAVE_TERMIOS
           41   fd = open("/dev/tty", O_RDONLY);
           42   if (tcgetattr(fd, &attr) != 0)
           43     return (-1);
           44   attr.c_lflag &= ~ECHO;
           45   attr.c_lflag |= ICANON;
           46   if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
           47     return (-1);
           48   n = read(fd, p, LINELEN);
           49 
           50   attr.c_lflag |= ECHO;
           51   if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
           52     return (-1);
           53   close(fd);
           54   p[n - 1] = 0;
           55 
           56 #else /* end of HAVE_TERMIOS */
           57   fgets(p, LINELEN, stdin);
           58   if (p[strlen(p)-1]=='\n')
           59     p[strlen(p)-1] = 0;
           60 #endif /* else if not HAVE_TERMIOS */
           61 
           62   fprintf(stderr, "\n");
           63   buf_appends(b, p);
           64   return (0);
           65 }
           66 
           67 void usage(char *n)
           68 {
           69   fprintf(stderr, "Usage: %s -e [-b] user@domain\n", n);
           70   fprintf(stderr, "       %s -s [-b] [yourname@domain]\n", n);
           71   fprintf(stderr, "       %s -c [-b]\n", n);
           72   fprintf(stderr, "       %s -C [-b]\n", n);
           73   fprintf(stderr, "       %s -d [passphrase]\n", n);
           74   fprintf(stderr, "       %s -g[r] yourname@domain [bits]\n", n);
           75   fprintf(stderr, "       %s -a[+-] [-b]\n", n);
           76   fprintf(stderr, "       %s -V\n\n", n);
           77   fprintf(stderr, "PGP public key ring: %s\n", PGPPUBRING);
           78   fprintf(stderr, "PGP secret key ring: %s\n", PGPSECRING);
           79 }
           80 
           81 int decrypt(BUFFER *u, BUFFER *option, char *n)
           82 {
           83   BUFFER *v;
           84   BUFFER *sig;
           85   int err = 0;
           86 
           87   v = buf_new();
           88   sig = buf_new();
           89 
           90   buf_set(v, u);
           91   err = pgp_decrypt(v, NULL, sig, PGPPUBRING, PGPSECRING);
           92   if (err >= 0 || err == PGP_SIGBAD)
           93     buf_move(u, v);
           94 
           95   if (err == PGP_ERR) {
           96     pass(option);
           97     err = pgp_decrypt(u, option, sig, PGPPUBRING, PGPSECRING);
           98   }
           99   switch (err) {
          100   case PGP_NOMSG:
          101     fprintf(stderr, "%s: Not a PGP message.\n", n);
          102     break;
          103   case PGP_ERR:
          104     fprintf(stderr, "%s: Can't read message.\n", n);
          105     break;
          106   case PGP_SIGOK:
          107     fprintf(stderr, "%s: Valid signature: %s\n", n, sig->data);
          108     err = 0;
          109     break;
          110   case PGP_SIGNKEY:
          111     fprintf(stderr, "%s: Unknown signature key %s, cannot verify.\n", n, sig->data);
          112     err = 1;
          113     break;
          114   case PGP_SIGBAD:
          115     fprintf(stderr, "%s: Bad signature.\n", n);
          116     err = 1;
          117     break;
          118   }
          119 
          120   buf_free(v);
          121   buf_free(sig);
          122 
          123   return (err);
          124 }
          125 
          126 int main(int argc, char *argv[])
          127 {
          128   BUFFER *u, *option, *pp;
          129   char *filename = NULL;
          130   char *cmd = NULL;
          131   int text = 1;
          132   int err = 99;
          133   int bits = 0;
          134 
          135   mix_init(NULL);
          136   VERBOSE = 3;
          137 
          138   u = buf_new();
          139   option = buf_new();
          140   pp = buf_new();
          141 
          142   if (argc > 1 && argv[1][0] == '-')
          143     cmd = argv[1];
          144 
          145   if (argc == 1 || (cmd > 0 && (cmd[1] == 'e' || cmd[1] == 'c' ||
          146                                 cmd[1] == 'd' || cmd[1] == 'a' ||
          147                                 cmd[1] == 's' || cmd[1] == 'C'))) {
          148     if ((argc > 2 && (cmd == NULL || cmd[1] == 'a')) || argc > 3) {
          149       FILE *f;
          150 
          151       f = fopen(argv[argc - 1], "rb");
          152       if (f == NULL) {
          153         fprintf(stderr, "%s: Can't open %s\n", argv[0], argv[argc - 1]);
          154         err = -1;
          155       } else {
          156         buf_read(u, f);
          157         fclose(f);
          158         filename = argv[argc - 1];
          159         argc--;
          160       }
          161     } else
          162       buf_read(u, stdin);
          163   }
          164   if (argc == 1)
          165     err = decrypt(u, option, argv[0]);
          166 
          167   if (argc > 2 && argv[2][0] == '-' && argv[2][1] == 'b') {
          168     text = 0;
          169     if (argc > 3)
          170       buf_appends(option, argv[3]);
          171   } else if (argc > 2)
          172     buf_appends(option, argv[2]);
          173 
          174   if (cmd)
          175     switch (cmd[1]) {
          176     case 's':
          177       err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
          178                         NULL, PGPPUBRING, PGPSECRING);
          179       if (err != 0) {
          180         pass(pp);
          181         err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
          182                           pp, PGPPUBRING, PGPSECRING);
          183       }
          184       if (err != 0)
          185         fprintf(stderr, "Error.\n");
          186       break;
          187     case 'e':
          188       if (option->length) {
          189         err = pgp_encrypt(PGP_ENCRYPT | (text ? PGP_TEXT : 0), u, option, NULL,
          190                           NULL, PGPPUBRING, PGPSECRING);
          191         if (err < 0)
          192           fprintf(stderr, "%s: can't encrypt message for %s\n",
          193                   argv[0], argv[2]);
          194       }
          195       break;
          196     case 'c':
          197       pass(option);
          198       err = pgp_encrypt(PGP_CONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
          199                         NULL, NULL, PGPPUBRING, PGPSECRING);
          200       if (err < 0)
          201         fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
          202       break;
          203     case 'C':
          204       pass(option);
          205       err = pgp_encrypt(PGP_NCONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
          206                         NULL, NULL, PGPPUBRING, PGPSECRING);
          207       if (err < 0)
          208         fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
          209       break;
          210     case 'g':
          211       if (argc < 3) {
          212         err = 99;
          213         goto end;
          214       }
          215       pass(pp);
          216       if (argc == 4)
          217         sscanf(argv[3], "%d", &bits);
          218       err = pgp_keygen(cmd[2] == 'r' ? PGP_ES_RSA : PGP_E_ELG,
          219                        bits, option, pp, PGPPUBRING, PGPSECRING, 0);
          220       break;
          221     case 'a':
          222       switch (cmd[2]) {
          223       case '-':
          224         err = pgp_dearmor(u, u);
          225         if (err == -1)
          226           fprintf(stderr, "Not a PGP-armored message\n");
          227         goto end;
          228       case '+':
          229         break;
          230       default:
          231         pgp_literal(u, filename, text);
          232         pgp_compress(u);
          233         break;
          234       }
          235       err = pgp_armor(u, PGP_ARMOR_NORMAL);
          236       break;
          237     case 'd':
          238       err = decrypt(u, option, argv[0]);
          239       break;
          240     case 'h':
          241       usage(argv[0]);
          242       err = 0;
          243       break;
          244     case 'V':
          245       fprintf(stderr, "mpgp version %s\n", MPGPVERSION);
          246       fprintf(stderr, "(C) 2000 - 2004 Ulf Moeller and others.\n");
          247       fprintf(stderr, "See the file COPYRIGHT for details.\n");
          248       err = 0;
          249       break;
          250     }
          251 end:
          252   if (err == 99)
          253     usage(argv[0]);
          254 
          255   if (err >= 0)
          256     buf_write(u, stdout);
          257 
          258   buf_free(option);
          259   buf_free(pp);
          260   buf_free(u);
          261 
          262   mix_exit();
          263   return (err == -1 ? 1 : err);
          264 }