Fixed HMAC for SHA-384 and SHA-512 with keys longer than 64 bytes.
[libgcrypt.git] / tests / ac.c
1 /* pubkey.c - Public key encryption/decryption tests
2  *      Copyright (C) 2003, 2005 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 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <assert.h>
29
30 #include "../src/gcrypt.h"
31
32 static int verbose;
33
34 static void
35 die (const char *format, ...)
36 {
37   va_list arg_ptr ;
38
39   va_start( arg_ptr, format ) ;
40   vfprintf (stderr, format, arg_ptr );
41   va_end(arg_ptr);
42   exit (1);
43 }
44
45 void
46 key_copy (gcry_ac_handle_t handle,
47           gcry_ac_key_type_t type,
48           gcry_ac_key_t *key_cp, gcry_ac_key_t key)
49 {
50   gcry_error_t err = 0;
51
52   err = gcry_ac_key_init (key_cp, handle, type,
53                           gcry_ac_key_data_get (key));
54
55   assert (! err);
56 }
57
58 void
59 check_one (gcry_mpi_t x)
60 {
61   gcry_ac_handle_t handle;
62   gcry_ac_key_pair_t key_pair;
63   gcry_ac_key_t key_sec, key_sec_cp, key_pub, key_pub_cp;
64   gcry_error_t err = 0;
65   gcry_mpi_t x2;
66   gcry_ac_data_t data, data2;
67   gcry_ac_key_spec_rsa_t rsa_spec;
68
69   rsa_spec.e = gcry_mpi_new (0);
70   gcry_mpi_set_ui (rsa_spec.e, 1);
71
72   err = gcry_ac_open (&handle, GCRY_AC_RSA, 0);
73   assert (! err);
74
75   err = gcry_ac_key_pair_generate (handle, 1024, &rsa_spec, &key_pair, NULL);
76   assert (! err);
77
78   key_sec = gcry_ac_key_pair_extract (key_pair, GCRY_AC_KEY_SECRET);
79   key_copy (handle, GCRY_AC_KEY_SECRET, &key_sec_cp, key_sec);
80
81   key_pub = gcry_ac_key_pair_extract (key_pair, GCRY_AC_KEY_PUBLIC);
82   key_copy (handle, GCRY_AC_KEY_PUBLIC, &key_pub_cp, key_pub);
83
84   err = gcry_ac_data_encrypt (handle, GCRY_AC_FLAG_NO_BLINDING, key_pub_cp, x, &data);
85   assert (! err);
86
87   err = gcry_ac_data_decrypt (handle, GCRY_AC_FLAG_NO_BLINDING, key_sec_cp, &x2, data);
88   assert (! err);
89
90   assert (! gcry_mpi_cmp (x, x2));
91
92   gcry_ac_data_destroy (data);
93
94   err = gcry_ac_data_sign (handle, key_sec, x, &data);
95   assert (! err);
96   err = gcry_ac_data_copy (&data2, data);
97   assert (! err);
98   gcry_ac_data_destroy (data);
99   err = gcry_ac_data_copy (&data, data2);
100   assert (! err);
101   gcry_ac_data_destroy (data2);
102
103   err = gcry_ac_data_verify (handle, key_pub, x, data);
104   assert (! err);
105
106   gcry_ac_data_destroy (data);
107
108   err = gcry_ac_data_sign (handle, key_sec, x, &data);
109   assert (! err);
110   {
111     const char *label;
112     gcry_mpi_t y;
113
114     err = gcry_ac_data_get_index (data, 0, 0, &label, &y);
115     assert (! err);
116     gcry_mpi_add_ui (y, y, 1);
117     
118     err = gcry_ac_data_verify (handle, key_pub, x, data);
119     assert (gcry_err_code (err) == GPG_ERR_BAD_SIGNATURE);
120   }
121
122   gcry_ac_close (handle);
123 }
124
125 void
126 check_run (void)
127 {
128   /*const char *s = "All Hail Discordia."; -- not used */
129   unsigned int a = 0x4223;
130   gcry_mpi_t x;
131
132   x = gcry_mpi_new (0);
133   gcry_mpi_set_ui (x, a);
134   check_one (x);
135   gcry_mpi_release (x);
136 }
137
138 int
139 main (int argc, char **argv)
140 {
141   int debug = 0;
142   int i = 1;
143
144   if (argc > 1 && !strcmp (argv[1], "--verbose"))
145     verbose = 1;
146   else if (argc > 1 && !strcmp (argv[1], "--debug"))
147     verbose = debug = 1;
148
149   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
150   if (!gcry_check_version (GCRYPT_VERSION))
151     die ("version mismatch\n");
152   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
153   if (debug)
154     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
155   /* No valuable keys are create, so we can speed up our RNG. */
156   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
157
158   for (; i > 0; i--)
159     check_run ();
160   
161   return 0;
162 }