mpi: Add an API for EC point operations.
[libgcrypt.git] / tests / t-mpi-point.c
1 /* t-mpi-point.c  - Tests for mpi point functions
2  * Copyright (C) 2013 g10 Code GmbH
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, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <assert.h>
27 #include <stdarg.h>
28
29 #include "../src/gcrypt.h"
30
31 #define PGM "t-mpi-point"
32
33 static const char *wherestr;
34 static int verbose;
35 static int error_count;
36
37 #define xmalloc(a)    gcry_xmalloc ((a))
38 #define xcalloc(a,b)  gcry_xcalloc ((a),(b))
39 #define xfree(a)      gcry_free ((a))
40 #define pass() do { ; } while (0)
41
42 static void
43 show (const char *format, ...)
44 {
45   va_list arg_ptr;
46
47   if (!verbose)
48     return;
49   fprintf (stderr, "%s: ", PGM);
50   va_start (arg_ptr, format);
51   vfprintf (stderr, format, arg_ptr);
52   va_end (arg_ptr);
53 }
54
55 static void
56 fail (const char *format, ...)
57 {
58   va_list arg_ptr;
59
60   fflush (stdout);
61   fprintf (stderr, "%s: ", PGM);
62   if (wherestr)
63     fprintf (stderr, "%s: ", wherestr);
64   va_start (arg_ptr, format);
65   vfprintf (stderr, format, arg_ptr);
66   va_end (arg_ptr);
67   error_count++;
68 }
69
70 static void
71 die (const char *format, ...)
72 {
73   va_list arg_ptr;
74
75   fflush (stdout);
76   fprintf (stderr, "%s: ", PGM);
77   if (wherestr)
78     fprintf (stderr, "%s: ", wherestr);
79   va_start (arg_ptr, format);
80   vfprintf (stderr, format, arg_ptr);
81   va_end (arg_ptr);
82   exit (1);
83 }
84
85
86 \f
87 static void
88 set_get_point (void)
89 {
90   gcry_mpi_point_t point;
91   gcry_mpi_t x, y, z;
92
93   wherestr = "set_get_point";
94   show ("checking point setting functions\n");
95
96   point = gcry_mpi_point_new (0);
97   x = gcry_mpi_set_ui (NULL, 17);
98   y = gcry_mpi_set_ui (NULL, 42);
99   z = gcry_mpi_set_ui (NULL, 11371);
100   gcry_mpi_point_get (x, y, z, point);
101   if (gcry_mpi_cmp_ui (x, 0)
102       || gcry_mpi_cmp_ui (y, 0) || gcry_mpi_cmp_ui (z, 0))
103     fail ("new point not initialized to (0,0,0)\n");
104   gcry_mpi_point_snatch_get (x, y, z, point);
105   point = NULL;
106   if (gcry_mpi_cmp_ui (x, 0)
107       || gcry_mpi_cmp_ui (y, 0) || gcry_mpi_cmp_ui (z, 0))
108     fail ("snatch_get failed\n");
109   gcry_mpi_release (x);
110   gcry_mpi_release (y);
111   gcry_mpi_release (z);
112
113   point = gcry_mpi_point_new (0);
114   x = gcry_mpi_set_ui (NULL, 17);
115   y = gcry_mpi_set_ui (NULL, 42);
116   z = gcry_mpi_set_ui (NULL, 11371);
117   gcry_mpi_point_set (point, x, y, z);
118   gcry_mpi_set_ui (x, 23);
119   gcry_mpi_set_ui (y, 24);
120   gcry_mpi_set_ui (z, 25);
121   gcry_mpi_point_get (x, y, z, point);
122   if (gcry_mpi_cmp_ui (x, 17)
123       || gcry_mpi_cmp_ui (y, 42) || gcry_mpi_cmp_ui (z, 11371))
124     fail ("point_set/point_get failed\n");
125   gcry_mpi_point_snatch_set (point, x, y, z);
126   x = gcry_mpi_new (0);
127   y = gcry_mpi_new (0);
128   z = gcry_mpi_new (0);
129   gcry_mpi_point_get (x, y, z, point);
130   if (gcry_mpi_cmp_ui (x, 17)
131       || gcry_mpi_cmp_ui (y, 42) || gcry_mpi_cmp_ui (z, 11371))
132     fail ("point_snatch_set/point_get failed\n");
133
134   gcry_mpi_point_release (point);
135   gcry_mpi_release (x);
136   gcry_mpi_release (y);
137   gcry_mpi_release (z);
138 }
139
140
141 int
142 main (int argc, char **argv)
143 {
144   int debug = 0;
145
146   if (argc > 1 && !strcmp (argv[1], "--verbose"))
147     verbose = 1;
148   else if (argc > 1 && !strcmp (argv[1], "--debug"))
149     verbose = debug = 1;
150
151   if (!gcry_check_version (GCRYPT_VERSION))
152     die ("version mismatch\n");
153
154   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
155   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
156   if (debug)
157     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);
158   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
159
160   set_get_point ();
161
162
163   show ("All tests completed. Errors: %d\n", error_count);
164   return error_count ? 1 : 0;
165 }