Fix bug 977.
[libgcrypt.git] / tests / ac-data.c
1 /* ac-data.c - Public key encryption/decryption tests
2  *      Copyright (C) 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 <stdlib.h>
25 #include <stdio.h>
26 #include <assert.h>
27
28 #define assert_err(err) \
29   do \
30     if (err) \
31       { \
32         fprintf (stderr, "Error occured at line %i: %s\n", \
33                  __LINE__, gcry_strerror (err)); \
34         exit (1); \
35       } \
36   while (0)
37
38 #include "../src/gcrypt.h"
39
40 static int verbose;
41
42 static void
43 die (const char *format, ...)
44 {
45   va_list arg_ptr ;
46
47   va_start( arg_ptr, format ) ;
48   vfprintf (stderr, format, arg_ptr );
49   va_end(arg_ptr);
50   exit (1);
51 }
52
53 static void
54 check_sexp_conversion (gcry_ac_data_t data, const char **identifiers)
55 {
56   gcry_ac_data_t data2;
57   gcry_error_t err;
58   gcry_sexp_t sexp;
59   unsigned int i;
60   const char *label1, *label2;
61   gcry_mpi_t mpi1, mpi2;
62   size_t length1, length2;
63
64   err = gcry_ac_data_to_sexp (data, &sexp, identifiers);
65   assert_err (err);
66   if (verbose)
67     gcry_sexp_dump (sexp);
68   err = gcry_ac_data_from_sexp (&data2, sexp, identifiers);
69   assert_err (err);
70
71   length1 = gcry_ac_data_length (data);
72   length2 = gcry_ac_data_length (data2);
73   assert (length1 == length2);
74
75   for (i = 0; i < length1; i++)
76     {
77       err = gcry_ac_data_get_index (data, 0, i, &label1, &mpi1);
78       assert_err (err);
79       err = gcry_ac_data_get_index (data2, 0, i, &label2, &mpi2);
80       assert_err (err);
81       if (verbose)
82         {
83           fprintf (stderr, "Label1=`%s'\n", label1);
84           fprintf (stderr, "Label2=`%s'\n", label2);
85         }
86       assert (! strcmp (label1, label2));
87       assert (! gcry_mpi_cmp (mpi1, mpi2));
88     }
89
90   gcry_ac_data_destroy (data2);
91   gcry_sexp_release (sexp);
92 }
93
94 void
95 check_run (void)
96 {
97   const char *identifiers[] = { "foo",
98                                 "bar",
99                                 "baz",
100                                 "hello",
101                                 "somemoretexthere",
102                                 "blahblahblah",
103                                 NULL };
104   const char *identifiers_null[] = { NULL };
105   gcry_ac_data_t data;
106   gcry_error_t err;
107   const char *label0;
108   const char *label1;
109   gcry_mpi_t mpi0;
110   gcry_mpi_t mpi1;
111   gcry_mpi_t mpi2;
112
113   /* Initialize values.  */
114
115   label0 = "thisisreallylonglabelbutsincethereisnolimitationonthelengthoflabelsitshouldworkjustfine";
116   mpi0 = gcry_mpi_new (0);
117   assert (mpi0);
118   gcry_mpi_set_ui (mpi0, 123456);
119
120   err = gcry_ac_data_new (&data);
121   assert_err (err);
122
123   check_sexp_conversion (data, identifiers);
124   check_sexp_conversion (data, identifiers_null);
125   check_sexp_conversion (data, NULL);
126
127   err = gcry_ac_data_set (data, 0, label0, mpi0);
128   assert_err (err);
129   err = gcry_ac_data_get_index (data, 0, 0, &label1, &mpi1);
130   assert_err (err);
131   assert (label0 == label1);
132   assert (mpi0 == mpi1);
133   check_sexp_conversion (data, identifiers);
134   check_sexp_conversion (data, identifiers_null);
135   check_sexp_conversion (data, NULL);
136
137   if (verbose)
138     printf ("data-set-test-0 succeeded\n");
139
140   gcry_ac_data_clear (data);
141
142   err = gcry_ac_data_set (data, GCRY_AC_FLAG_COPY, label0, mpi0);
143   assert_err (err);
144
145   err = gcry_ac_data_set (data, GCRY_AC_FLAG_COPY, "foo", mpi0);
146   assert_err (err);
147   err = gcry_ac_data_set (data, GCRY_AC_FLAG_COPY, "foo", mpi0);
148   assert_err (err);
149   err = gcry_ac_data_set (data, GCRY_AC_FLAG_COPY, "bar", mpi0);
150   assert_err (err);
151   err = gcry_ac_data_set (data, GCRY_AC_FLAG_COPY, "blah1", mpi0);
152   assert_err (err);
153   check_sexp_conversion (data, identifiers);
154   check_sexp_conversion (data, identifiers_null);
155   check_sexp_conversion (data, NULL);
156
157   err = gcry_ac_data_get_name (data, 0, label0, &mpi1);
158   assert_err (err);
159   assert (mpi0 != mpi1);
160   err = gcry_ac_data_get_name (data, GCRY_AC_FLAG_COPY, label0, &mpi2);
161   assert_err (err);
162   assert (mpi0 != mpi1);
163   assert (mpi1 != mpi2);
164   err = gcry_ac_data_get_index (data, 0, 0, &label1, &mpi1);
165   assert_err (err);
166   gcry_mpi_release (mpi0);
167   gcry_mpi_release (mpi2);
168
169   if (verbose)
170     printf ("data-set-test-1 succeeded\n");
171
172   gcry_ac_data_clear (data);
173   assert (! gcry_ac_data_length (data));
174   check_sexp_conversion (data, identifiers);
175   check_sexp_conversion (data, identifiers_null);
176   check_sexp_conversion (data, NULL);
177
178   if (verbose)
179     printf ("data-set-test-2 succeeded\n");
180  
181   gcry_ac_data_destroy (data);
182  
183
184 }
185
186 int
187 main (int argc, char **argv)
188 {
189   int debug = 0;
190   int i = 1;
191
192   if (argc > 1 && !strcmp (argv[1], "--verbose"))
193     verbose = 1;
194   else if (argc > 1 && !strcmp (argv[1], "--debug"))
195     verbose = debug = 1;
196
197   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
198   if (!gcry_check_version (GCRYPT_VERSION))
199     die ("version mismatch\n");
200   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
201   if (debug)
202     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
203
204   for (; i > 0; i--)
205     check_run ();
206   
207   return 0;
208 }