Improve.
[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, data2;
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_copy (&data2, data);
84   assert (! err);
85   gcry_ac_data_destroy (data);
86   err = gcry_ac_data_copy (&data, data2);
87   assert (! err);
88   gcry_ac_data_destroy (data2);
89
90   err = gcry_ac_data_verify (handle, key_pub, x, data);
91   assert (! err);
92
93   gcry_ac_data_destroy (data);
94
95   err = gcry_ac_data_sign (handle, key_sec, x, &data);
96   assert (! err);
97   {
98     const char *label;
99     gcry_mpi_t y;
100
101     err = gcry_ac_data_get_index (data, 0, &label, &y);
102     assert (! err);
103     gcry_mpi_add_ui (y, y, 1);
104     
105     err = gcry_ac_data_set (data, label, y);
106     assert (! err);
107
108     err = gcry_ac_data_verify (handle, key_pub, x, data);
109     assert (gpg_err_code (err) == GPG_ERR_BAD_SIGNATURE);
110   }
111
112   gcry_ac_close (handle);
113 }
114
115 int
116 main (int argc, char **argv)
117 {
118   int debug = 0;
119   int i = 1;
120
121   if (argc > 1 && !strcmp (argv[1], "--verbose"))
122     verbose = 1;
123   else if (argc > 1 && !strcmp (argv[1], "--debug"))
124     verbose = debug = 1;
125
126   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
127   if (!gcry_check_version (GCRYPT_VERSION))
128     die ("version mismatch\n");
129   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
130   if (debug)
131     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
132
133   for (; i > 0; i--)
134     check_run ();
135   
136   return 0;
137 }