efb955a82d2ec859f8c6f15025070bfa43cec0ba
[libgcrypt.git] / tests / ac.c
1 /* pubkey.c - Public key encryption/decryption tests
2  *      Copyright (C) 2003 Free Software Foundation, Inc.
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26
27 #include "../src/gcrypt.h"
28
29 static int verbose;
30
31 static void
32 die (const char *format, ...)
33 {
34   va_list arg_ptr ;
35
36   va_start( arg_ptr, format ) ;
37   vfprintf (stderr, format, arg_ptr );
38   va_end(arg_ptr);
39   exit (1);
40 }
41
42 void
43 check_run (void)
44 {
45   gcry_ac_handle_t handle;
46   gcry_ac_key_pair_t key_pair;
47   gcry_ac_key_t key_sec, key_pub;
48   gpg_error_t err = 0;
49   unsigned int a = 0x4223;
50   gcry_mpi_t x, x2;
51   gcry_ac_data_t data;
52   gcry_ac_key_spec_rsa_t rsa_spec;
53
54   rsa_spec.e = gcry_mpi_new (0);
55   gcry_mpi_set_ui (rsa_spec.e, 1);
56
57   err = gcry_ac_open (&handle, GCRY_AC_RSA, 0);
58   assert (! err);
59
60   x = gcry_mpi_new (0);
61   gcry_mpi_set_ui (x, a);
62
63   err = gcry_ac_key_pair_generate (handle, &key_pair, 1024, (void *) &rsa_spec);
64   assert (! err);
65
66   key_sec = gcry_ac_key_pair_extract (key_pair, GCRY_AC_KEY_SECRET);
67   key_pub = gcry_ac_key_pair_extract (key_pair, GCRY_AC_KEY_PUBLIC);
68
69   err = gcry_ac_data_encrypt (handle, GCRY_AC_FLAG_DATA_NO_BLINDING,
70                               key_pub, x, &data);
71   assert (! err);
72
73   err = gcry_ac_data_decrypt (handle, GCRY_AC_FLAG_DATA_NO_BLINDING,
74                               key_sec, &x2, data);
75   assert (! err);
76
77   assert (! gcry_mpi_cmp (x, x2));
78
79   gcry_ac_data_destroy (data);
80
81   err = gcry_ac_data_sign (handle, key_sec, x, &data);
82   assert (! err);
83   err = gcry_ac_data_verify (handle, key_pub, x, data);
84   assert (! err);
85
86   gcry_ac_data_destroy (data);
87
88   err = gcry_ac_data_sign (handle, key_sec, x, &data);
89   assert (! err);
90   {
91     const char *label;
92     gcry_mpi_t y;
93
94     err = gcry_ac_data_get_index (data, 0, &label, &y);
95     assert (! err);
96     gcry_mpi_add_ui (y, y, 1);
97     
98     err = gcry_ac_data_set (data, label, y);
99     assert (! err);
100
101     err = gcry_ac_data_verify (handle, key_pub, x, data);
102     assert (gpg_err_code (err) == GPG_ERR_BAD_SIGNATURE);
103   }
104
105   gcry_ac_close (handle);
106 }
107
108 int
109 main (int argc, char **argv)
110 {
111   int debug = 0;
112   int i = 1;
113
114   if (argc > 1 && !strcmp (argv[1], "--verbose"))
115     verbose = 1;
116   else if (argc > 1 && !strcmp (argv[1], "--debug"))
117     verbose = debug = 1;
118
119   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
120   if (!gcry_check_version (GCRYPT_VERSION))
121     die ("version mismatch\n");
122   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
123   if (debug)
124     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
125
126   for (; i > 0; i--)
127     check_run ();
128   
129   return 0;
130 }