2003-07-29 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / encrypt-sign.c
1 /* encrypt-sign.c -  encrypt and verify functions
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 "context.h"
27 #include "ops.h"
28
29 \f
30 static gpgme_error_t
31 encrypt_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)
32 {
33   gpgme_error_t err;
34
35   err = _gpgme_progress_status_handler (priv, code, args);
36   if (!err)
37     err = _gpgme_encrypt_status_handler (priv, code, args);
38   if (!err)
39     err = _gpgme_sign_status_handler (priv, code, args);
40   return err;
41 }
42
43
44 static gpgme_error_t
45 encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[],
46                     gpgme_encrypt_flags_t flags,
47                     gpgme_data_t plain, gpgme_data_t cipher)
48 {
49   gpgme_error_t err;
50
51   err = _gpgme_op_reset (ctx, synchronous);
52   if (err)
53     return err;
54
55   if (!plain)
56     return gpg_error (GPG_ERR_NO_DATA);
57   if (!cipher || !recp)
58     return gpg_error (GPG_ERR_INV_VALUE);
59
60   err = _gpgme_op_encrypt_init_result (ctx);
61   if (err)
62     return err;
63
64   err = _gpgme_op_sign_init_result (ctx);
65   if (err)
66     return err;
67
68   if (ctx->passphrase_cb)
69     {
70       err = _gpgme_engine_set_command_handler
71         (ctx->engine, _gpgme_passphrase_command_handler, ctx, NULL);
72       if (err)
73         return err;
74     }
75
76   _gpgme_engine_set_status_handler (ctx->engine,
77                                     encrypt_sign_status_handler, ctx);
78   
79   return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, flags, plain,
80                                         cipher, ctx->use_armor,
81                                         ctx /* FIXME */);
82 }
83
84
85 /* Encrypt plaintext PLAIN within CTX for the recipients RECP and
86    store the resulting ciphertext in CIPHER.  Also sign the ciphertext
87    with the signers in CTX.  */
88 gpgme_error_t
89 gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_key_t recp[],
90                              gpgme_encrypt_flags_t flags,
91                              gpgme_data_t plain, gpgme_data_t cipher)
92 {
93   return encrypt_sign_start (ctx, 0, recp, flags, plain, cipher);
94 }
95
96
97 /* Encrypt plaintext PLAIN within CTX for the recipients RECP and
98    store the resulting ciphertext in CIPHER.  Also sign the ciphertext
99    with the signers in CTX.  */
100 gpgme_error_t
101 gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_key_t recp[],
102                        gpgme_encrypt_flags_t flags,
103                        gpgme_data_t plain, gpgme_data_t cipher)
104 {
105   gpgme_error_t err = encrypt_sign_start (ctx, 1, recp, flags, plain, cipher);
106   if (!err)
107     err = _gpgme_wait_one (ctx);
108   return err;
109 }