41fe308527c0d52d9b9caec0efc73d133130132e
[gpgme.git] / tests / gpg / t-encrypt-sym.c
1 /* t-encrypt-sym.c  - regression test
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 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 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <assert.h>
25 #include <unistd.h>
26
27 #include <gpgme.h>
28
29 #define fail_if_err(err)                                        \
30   do                                                            \
31     {                                                           \
32       if (err)                                                  \
33         {                                                       \
34           fprintf (stderr, "%s:%d: gpgme_error_t %s\n",         \
35                    __FILE__, __LINE__, gpgme_strerror (err));   \
36           exit (1);                                             \
37         }                                                       \
38     }                                                           \
39   while (0)
40
41
42 static void
43 print_data (gpgme_data_t dh)
44 {
45   char buf[100];
46   int ret;
47   
48   ret = gpgme_data_seek (dh, 0, SEEK_SET);
49   if (ret)
50     fail_if_err (GPGME_File_Error);
51   while ((ret = gpgme_data_read (dh, buf, 100)) > 0)
52     fwrite (buf, ret, 1, stdout);
53   if (ret < 0)
54     fail_if_err (GPGME_File_Error);
55 }
56
57
58 static gpgme_error_t
59 passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info,
60                int last_was_bad, int fd)
61 {
62   write (fd, "abc\n", 4);
63   return 0;
64 }
65
66
67 int 
68 main (int argc, char **argv)
69 {
70   gpgme_ctx_t ctx;
71   gpgme_error_t err;
72   gpgme_data_t plain, cipher;
73   const char *text = "Hallo Leute\n";
74   char *text2;
75   char *p;
76   size_t len;
77
78   err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
79   fail_if_err (err);
80
81   err = gpgme_new (&ctx);
82   fail_if_err (err);
83   gpgme_set_armor (ctx, 1);
84
85   p = getenv("GPG_AGENT_INFO");
86   if (!(p && strchr (p, ':')))
87     gpgme_set_passphrase_cb (ctx, passphrase_cb, NULL);
88
89   err = gpgme_data_new_from_mem (&plain, text, strlen (text), 0);
90   fail_if_err (err);
91
92   err = gpgme_data_new (&cipher);
93   fail_if_err (err);
94
95   err = gpgme_op_encrypt (ctx, 0, 0, plain, cipher);
96   fail_if_err (err);
97
98   fflush (NULL);
99   fputs ("Begin Result Encryption:\n", stdout);
100   print_data (cipher);
101   fputs ("End Result.\n", stdout);
102
103   gpgme_data_seek (cipher, 0, SEEK_SET);
104
105   gpgme_data_release (plain);
106   err = gpgme_data_new (&plain);
107   fail_if_err (err);
108
109   err = gpgme_op_decrypt (ctx, cipher, plain);
110   fail_if_err (err);
111
112   fputs ("Begin Result Decryption:\n", stdout);
113   print_data (plain);
114   fputs ("End Result.\n", stdout);
115
116   text2 = gpgme_data_release_and_get_mem (plain, &len);
117   if (strncmp (text, text2, len))
118     {
119       fprintf (stderr, "%s:%d: Wrong plaintext\n", __FILE__, __LINE__);
120       exit (1);
121     }
122
123   gpgme_data_release (cipher);
124   gpgme_release (ctx);
125
126   return 0;
127 }
128
129