Add support for ADM64. From Werner Dittmann.
[libgcrypt.git] / tests / mpitests.c
1 /* mpitests.c  -  basic mpi tests
2  *      Copyright (C) 2001, 2002, 2003, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA. 
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdarg.h>
29
30 #include "../src/gcrypt.h"
31
32
33 static int verbose;
34 static int debug;
35
36
37 /* Set up some test patterns */
38
39 /* 48 bytes with value 1: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
40 unsigned char ones[] = {
41   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
42   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
43   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
44 };
45
46 /* 48 bytes with value 2: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
47 unsigned char twos[] = {
48   0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
49   0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
50   0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02
51 };
52
53 /* 48 bytes with value 3: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
54 unsigned char threes[] = {
55   0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
56   0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
57   0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03
58 };
59
60 /* 48 bytes with value 0x80: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
61 unsigned char eighties[] = {
62   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
63   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
64   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
65 };
66
67 /* 48 bytes with value 0xff: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
68 unsigned char manyff[] = {
69   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
70   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
71   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
72 };
73
74
75
76 static int 
77 test_add (void)
78 {
79   gcry_mpi_t one;
80   gcry_mpi_t two;
81   gcry_mpi_t ff;
82   gcry_mpi_t result;
83   unsigned char* pc;
84   
85   gcry_mpi_scan(&one, GCRYMPI_FMT_USG, ones, sizeof(ones), NULL);
86   gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
87   gcry_mpi_scan(&ff, GCRYMPI_FMT_USG, manyff, sizeof(manyff), NULL);
88   result = gcry_mpi_new(0);
89   
90   gcry_mpi_add(result, one, two);
91   gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
92   if (verbose)
93     printf("Result of one plus two:\n%s\n", pc);
94   gcry_free(pc);
95
96   gcry_mpi_add(result, ff, one);
97   gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
98   if (verbose)
99     printf("Result of ff plus one:\n%s\n", pc);
100   gcry_free(pc);
101   
102   gcry_mpi_release(one);
103   gcry_mpi_release(two);
104   gcry_mpi_release(ff);
105   gcry_mpi_release(result);
106   return 1;
107 }
108
109
110 static int 
111 test_sub (void)
112 {
113   gcry_mpi_t one;
114   gcry_mpi_t two;
115   gcry_mpi_t result;
116   unsigned char* pc;
117   
118   gcry_mpi_scan(&one, GCRYMPI_FMT_USG, ones, sizeof(ones), NULL);
119   gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
120   result = gcry_mpi_new(0);
121   gcry_mpi_sub(result, two, one);
122   
123   gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
124   if (verbose)
125     printf("Result of two minus one:\n%s\n", pc);
126   gcry_free(pc);
127   
128   gcry_mpi_release(one);
129   gcry_mpi_release(two);
130   gcry_mpi_release(result);
131   return 1;
132 }
133
134
135 static int 
136 test_mul (void)
137 {
138   gcry_mpi_t two;
139   gcry_mpi_t three;
140   gcry_mpi_t result;
141   unsigned char* pc;
142   
143   gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
144   gcry_mpi_scan(&three, GCRYMPI_FMT_USG, threes, sizeof(threes), NULL);
145   result = gcry_mpi_new(0);
146   gcry_mpi_mul(result, two, three);
147   
148   gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
149   if (verbose)
150     printf("Result of two mul three:\n%s\n", pc);
151   gcry_free(pc);
152   
153   gcry_mpi_release(two);
154   gcry_mpi_release(three);
155   gcry_mpi_release(result);
156   return 1;
157 }
158
159
160 int 
161 main (int argc, char* argv[])
162 {
163   if (argc > 1 && !strcmp (argv[1], "--verbose"))
164     verbose = 1;
165   else if (argc > 1 && !strcmp (argv[1], "--debug"))
166     verbose = debug = 1;
167
168   if (!gcry_check_version (GCRYPT_VERSION))
169     {
170       fputs ("version mismatch\n", stderr);
171       exit (1);
172     }
173   gcry_control(GCRYCTL_DISABLE_SECMEM);
174
175   test_add ();
176   test_sub ();
177   test_mul ();
178
179   return 0;
180 }
181