4ce728937d035c855be64f5d05c9bd01f1c83317
[gpgme.git] / gpgme / decrypt-verify.c
1 /* decrypt-verify.c - Decrypt and verify function.
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2002, 2003 g10 Code GmbH
4
5    This file is part of GPGME.
6  
7    GPGME is free software; you can redistribute it and/or modify it
8    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    GPGME is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include "gpgme.h"
26 #include "ops.h"
27
28 \f
29 static gpgme_error_t
30 decrypt_verify_status_handler (void *priv, gpgme_status_code_t code,
31                                char *args)
32 {
33   gpgme_error_t err;
34
35   err = _gpgme_progress_status_handler (priv, code, args);
36   if (!err)
37     err = _gpgme_decrypt_status_handler (priv, code, args);
38   if (!err)
39     {
40       err = _gpgme_verify_status_handler (priv, code, args);
41       /* The verify status handler might not be in the state to verify
42          a signature, either because there is no signature or we are
43          currently processing the encrytion layer, and thus it will
44          likely return "invalid engine" - we have to ignore it
45          therefore. */
46       if (gpg_err_code (err) == GPG_ERR_INV_ENGINE)
47         err = 0;
48     }
49   return err;
50 }
51
52
53 static gpgme_error_t
54 decrypt_verify_start (gpgme_ctx_t ctx, int synchronous,
55                       gpgme_data_t cipher, gpgme_data_t plain)
56 {
57   gpgme_error_t err;
58
59   err = _gpgme_op_reset (ctx, synchronous);
60   if (err)
61     return err;
62
63   err = _gpgme_op_decrypt_init_result (ctx);
64   if (err)
65     return err;
66
67   err = _gpgme_op_verify_init_result (ctx);
68   if (err)
69     return err;
70
71   if (!cipher)
72     return gpg_error (GPG_ERR_NO_DATA);
73   if (!plain)
74     return gpg_error (GPG_ERR_INV_VALUE);
75
76   if (ctx->passphrase_cb)
77     {
78       err = _gpgme_engine_set_command_handler
79         (ctx->engine, _gpgme_passphrase_command_handler, ctx, NULL);
80       if (err)
81         return err;
82     }
83
84   _gpgme_engine_set_status_handler (ctx->engine,
85                                     decrypt_verify_status_handler, ctx);
86   
87   return _gpgme_engine_op_decrypt (ctx->engine, cipher, plain);
88 }
89
90
91 /* Decrypt ciphertext CIPHER and make a signature verification within
92    CTX and store the resulting plaintext in PLAIN.  */
93 gpgme_error_t
94 gpgme_op_decrypt_verify_start (gpgme_ctx_t ctx, gpgme_data_t cipher,
95                                gpgme_data_t plain)
96 {
97   return decrypt_verify_start (ctx, 0, cipher, plain);
98 }
99
100
101 /* Decrypt ciphertext CIPHER and make a signature verification within
102    CTX and store the resulting plaintext in PLAIN.  */
103 gpgme_error_t
104 gpgme_op_decrypt_verify (gpgme_ctx_t ctx, gpgme_data_t cipher,
105                          gpgme_data_t plain)
106 {
107   gpgme_error_t err = decrypt_verify_start (ctx, 1, cipher, plain);
108   if (!err)
109     err = _gpgme_wait_one (ctx);
110   return err;
111 }