Changes to make use of code taken from libassuan. This replaces the
[gnupg.git] / g10 / decrypt.c
1 /* decrypt.c - verify signed data
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
3  *               2004 Free Software Foundation, Inc.
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <errno.h>
27 #include <assert.h>
28
29 #include "options.h"
30 #include "packet.h"
31 #include "errors.h"
32 #include "iobuf.h"
33 #include "keydb.h"
34 #include "memory.h"
35 #include "util.h"
36 #include "main.h"
37 #include "status.h"
38 #include "i18n.h"
39
40
41
42 /****************
43  * Assume that the input is an encrypted message and decrypt
44  * (and if signed, verify the signature on) it.
45  * This command differs from the default operation, as it never
46  * writes to the filename which is included in the file and it
47  * rejects files which don't begin with an encrypted message.
48  */
49
50 int
51 decrypt_message( const char *filename )
52 {
53     IOBUF fp;
54     armor_filter_context_t afx;
55     progress_filter_context_t pfx;
56     int rc;
57     int no_out=0;
58
59     /* open the message file */
60     fp = iobuf_open(filename);
61     if (fp && is_secured_file (iobuf_get_fd (fp)))
62       {
63         iobuf_close (fp);
64         fp = NULL;
65         errno = EPERM;
66       }
67     if( !fp ) {
68         log_error(_("can't open `%s'\n"), print_fname_stdin(filename));
69         return G10ERR_OPEN_FILE;
70     }
71
72     handle_progress (&pfx, fp, filename);
73
74     if( !opt.no_armor ) {
75         if( use_armor_filter( fp ) ) {
76             memset( &afx, 0, sizeof afx);
77             iobuf_push_filter( fp, armor_filter, &afx );
78         }
79     }
80
81     if( !opt.outfile ) {
82         no_out = 1;
83         opt.outfile = "-";
84     }
85     rc = proc_encryption_packets( NULL, fp );
86     if( no_out )
87        opt.outfile = NULL;
88     iobuf_close(fp);
89     return rc;
90 }
91
92 void
93 decrypt_messages(int nfiles, char *files[])
94 {
95   IOBUF fp;
96   armor_filter_context_t afx;  
97   progress_filter_context_t pfx;
98   char *p, *output = NULL;
99   int rc=0,use_stdin=0;
100   unsigned int lno=0;
101   
102   if (opt.outfile)
103     {
104       log_error(_("--output doesn't work for this command\n"));
105       return;
106         
107     }
108
109   if(!nfiles)
110     use_stdin=1;
111
112   for(;;)
113     {
114       char line[2048];
115       char *filename=NULL;
116
117       if(use_stdin)
118         {
119           if(fgets(line, DIM(line), stdin))
120             {
121               lno++;
122               if (!*line || line[strlen(line)-1] != '\n')
123                 log_error("input line %u too long or missing LF\n", lno);
124               else
125                 {
126                   line[strlen(line)-1] = '\0';
127                   filename=line;
128                 }
129             }
130         }
131       else
132         {
133           if(nfiles)
134             {
135               filename=*files;
136               nfiles--;
137               files++;
138             }
139         }
140
141       if(filename==NULL)
142         break;
143
144       print_file_status(STATUS_FILE_START, filename, 3);      
145       output = make_outfile_name(filename);
146       if (!output)
147         goto next_file;
148       fp = iobuf_open(filename);
149       if (fp && is_secured_file (iobuf_get_fd (fp)))
150         {
151           iobuf_close (fp);
152           fp = NULL;
153           errno = EPERM;
154         }
155       if (!fp)
156         {
157           log_error(_("can't open `%s'\n"), print_fname_stdin(filename));
158           goto next_file;
159         }
160
161       handle_progress (&pfx, fp, filename);
162
163       if (!opt.no_armor)
164         {
165           if (use_armor_filter(fp))
166             {
167               memset(&afx, 0, sizeof afx);
168               iobuf_push_filter(fp, armor_filter, &afx);
169             }
170         }
171       rc = proc_packets(NULL, fp);
172       iobuf_close(fp);
173       if (rc)
174         log_error("%s: decryption failed: %s\n", print_fname_stdin(filename),
175                   g10_errstr(rc));
176       p = get_last_passphrase();
177       set_next_passphrase(p);
178       m_free (p);
179
180     next_file:
181       /* Note that we emit file_done even after an error. */
182       write_status( STATUS_FILE_DONE );
183       m_free(output);
184     }
185
186   set_next_passphrase(NULL);  
187 }