Line data Source code
1 : /* decrypt-verify.c - Decrypt and verify function.
2 : Copyright (C) 2000 Werner Koch (dd9jn)
3 : Copyright (C) 2001, 2002, 2003, 2004 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 Lesser General Public License as
9 : published by the Free Software Foundation; either version 2.1 of
10 : the License, or (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 : Lesser General Public License for more details.
16 :
17 : You should have received a copy of the GNU Lesser General Public
18 : License along with this program; if not, write to the Free Software
19 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 : 02111-1307, USA. */
21 :
22 : #if HAVE_CONFIG_H
23 : #include <config.h>
24 : #endif
25 :
26 : #include "debug.h"
27 : #include "gpgme.h"
28 : #include "ops.h"
29 :
30 :
31 : static gpgme_error_t
32 16 : decrypt_verify_status_handler (void *priv, gpgme_status_code_t code,
33 : char *args)
34 : {
35 : gpgme_error_t err;
36 :
37 16 : err = _gpgme_progress_status_handler (priv, code, args);
38 16 : if (!err)
39 16 : err = _gpgme_decrypt_status_handler (priv, code, args);
40 16 : if (!err)
41 16 : err = _gpgme_verify_status_handler (priv, code, args);
42 16 : return err;
43 : }
44 :
45 :
46 : static gpgme_error_t
47 1 : decrypt_verify_start (gpgme_ctx_t ctx, int synchronous,
48 : gpgme_data_t cipher, gpgme_data_t plain)
49 : {
50 : gpgme_error_t err;
51 :
52 1 : err = _gpgme_op_reset (ctx, synchronous);
53 1 : if (err)
54 0 : return err;
55 :
56 1 : err = _gpgme_op_decrypt_init_result (ctx);
57 1 : if (err)
58 0 : return err;
59 :
60 1 : err = _gpgme_op_verify_init_result (ctx);
61 1 : if (err)
62 0 : return err;
63 :
64 1 : if (!cipher)
65 0 : return gpg_error (GPG_ERR_NO_DATA);
66 1 : if (!plain)
67 0 : return gpg_error (GPG_ERR_INV_VALUE);
68 :
69 1 : if (ctx->passphrase_cb)
70 : {
71 1 : err = _gpgme_engine_set_command_handler
72 : (ctx->engine, _gpgme_passphrase_command_handler, ctx, NULL);
73 1 : if (err)
74 0 : return err;
75 : }
76 :
77 1 : _gpgme_engine_set_status_handler (ctx->engine,
78 : decrypt_verify_status_handler, ctx);
79 :
80 1 : return _gpgme_engine_op_decrypt_verify (ctx->engine, cipher, plain);
81 : }
82 :
83 :
84 : /* Decrypt ciphertext CIPHER and make a signature verification within
85 : CTX and store the resulting plaintext in PLAIN. */
86 : gpgme_error_t
87 0 : gpgme_op_decrypt_verify_start (gpgme_ctx_t ctx, gpgme_data_t cipher,
88 : gpgme_data_t plain)
89 : {
90 : gpgme_error_t err;
91 :
92 0 : TRACE_BEG2 (DEBUG_CTX, "gpgme_op_decrypt_verify_start", ctx,
93 : "cipher=%p, plain=%p", cipher, plain);
94 :
95 0 : if (!ctx)
96 0 : return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
97 :
98 0 : err = decrypt_verify_start (ctx, 0, cipher, plain);
99 0 : return TRACE_ERR (err);
100 : }
101 :
102 :
103 : /* Decrypt ciphertext CIPHER and make a signature verification within
104 : CTX and store the resulting plaintext in PLAIN. */
105 : gpgme_error_t
106 1 : gpgme_op_decrypt_verify (gpgme_ctx_t ctx, gpgme_data_t cipher,
107 : gpgme_data_t plain)
108 : {
109 : gpgme_error_t err;
110 :
111 1 : TRACE_BEG2 (DEBUG_CTX, "gpgme_op_decrypt_verify", ctx,
112 : "cipher=%p, plain=%p", cipher, plain);
113 :
114 1 : if (!ctx)
115 0 : return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
116 :
117 1 : err = decrypt_verify_start (ctx, 1, cipher, plain);
118 1 : if (!err)
119 1 : err = _gpgme_wait_one (ctx);
120 1 : return TRACE_ERR (err);
121 : }
|