Removed becuase we never implemented it.
[libgcrypt.git] / tests / basic.c
1 /* basic.c  -  basic regression tests
2  *      Copyright (C) 2001 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 General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (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 General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * 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 <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <stdarg.h>
25 #include "../src/gcrypt.h"
26
27 static int verbose;
28 static int error_count;
29
30 static void
31 fail ( const char *format, ... )
32 {
33     va_list arg_ptr ;
34
35     va_start( arg_ptr, format ) ;
36     vfprintf (stderr, format, arg_ptr );
37     va_end(arg_ptr);
38     error_count++;
39 }
40
41 static void
42 die ( const char *format, ... )
43 {
44     va_list arg_ptr ;
45
46     va_start( arg_ptr, format ) ;
47     vfprintf (stderr, format, arg_ptr );
48     va_end(arg_ptr);
49     exit (1);
50 }
51
52
53 static void
54 check_one_cipher (int algo, int mode)
55 {
56     GCRY_CIPHER_HD hd;
57     char key[32], plain[16], in[16], out[16];
58     int keylen;
59
60     memcpy (key, "0123456789abcdef.,;/[]{}-=ABCDEF", 32);
61     memcpy (plain, "foobar42FOOBAR17", 16);
62
63     keylen = gcry_cipher_get_algo_keylen (algo);
64     if (keylen < 40/8 || keylen > 32 ) {
65         fail ("algo %d, mode %d, keylength problem (%d)\n",
66               algo, mode, keylen );
67         return;
68     }
69
70     hd = gcry_cipher_open (algo, mode, 0);
71     if (!hd) {
72         fail ("algo %d, mode %d, grcy_open_cipher failed: %s\n",
73               algo, mode, gcry_strerror (-1) );
74         return;
75     }
76
77     
78     if (gcry_cipher_setkey (hd, key, keylen)) { 
79         fail ("algo %d, mode %d, gcry_cipher_setkey failed: %s\n",
80               algo, mode, gcry_strerror (-1) );
81         gcry_cipher_close (hd);
82         return;
83     }
84     
85     if ( gcry_cipher_encrypt (hd, out, 16, plain, 16)) { 
86         fail ("algo %d, mode %d, gcry_cipher_encrypt failed: %s\n",
87               algo, mode, gcry_strerror (-1) );
88         gcry_cipher_close (hd);
89         return;
90     }
91
92     gcry_cipher_close (hd);
93     hd = gcry_cipher_open (algo, mode, 0);
94     if (!hd) {
95         fail ("algo %d, mode %d, grcy_open_cipher failed: %s\n",
96               algo, mode, gcry_strerror (-1) );
97         return;
98     }
99
100     if (gcry_cipher_setkey (hd, key, keylen)) { 
101         fail ("algo %d, mode %d, gcry_cipher_setkey[2] failed: %s\n",
102               algo, mode, gcry_strerror (-1) );
103         gcry_cipher_close (hd);
104         return;
105     }
106     
107     if ( gcry_cipher_decrypt (hd, in, 16, out, 16)) { 
108         fail ("algo %d, mode %d, gcry_cipher_decrypt failed: %s\n",
109               algo, mode, gcry_strerror (-1) );
110         gcry_cipher_close (hd);
111         return;
112     }
113
114     gcry_cipher_close (hd);
115
116     if ( memcmp (plain, in, 16) )
117         fail ("algo %d, mode %d, encrypt-decrypt mismatch\n", algo, mode);
118 }
119
120
121 static void
122 check_ciphers (void)
123 {
124   static int algos[] = {
125     GCRY_CIPHER_3DES,
126     GCRY_CIPHER_CAST5,
127     GCRY_CIPHER_BLOWFISH,
128     GCRY_CIPHER_AES,
129     GCRY_CIPHER_AES192,
130     GCRY_CIPHER_AES256,
131     GCRY_CIPHER_TWOFISH,
132     0
133   };
134   static int algos2[] = {
135     GCRY_CIPHER_ARCFOUR,
136     0
137   };
138   int i;
139
140   for (i=0; algos[i]; i++ ) 
141     {
142       if (verbose)
143         fprintf (stderr, "checking `%s'\n", gcry_cipher_algo_name (algos[i]));
144                  
145       check_one_cipher (algos[i], GCRY_CIPHER_MODE_ECB);
146       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CFB);
147       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CBC);
148     }
149
150   for (i=0; algos2[i]; i++ ) 
151     {
152       if (verbose)
153         fprintf (stderr, "checking `%s'\n", gcry_cipher_algo_name (algos2[i]));
154                  
155       check_one_cipher (algos2[i], GCRY_CIPHER_MODE_STREAM);
156     }
157   /* we have now run all cipher's selftests */
158
159   /* TODO: add some extra encryption to test the higher level functions */
160 }
161
162
163 static void
164 check_digests ()
165 {
166     /* TODO */
167 }
168
169
170 int
171 main (int argc, char **argv)
172 {
173   if (argc > 1 && !strcmp (argv[1], "--verbose"))
174     verbose = 1;
175
176   /*gcry_control (GCRYCTL_DISABLE_INTERNAL_LOCKING, NULL, 0);*/
177   if (!gcry_check_version (GCRYPT_VERSION))
178     die ("version mismatch\n");
179   check_ciphers ();
180   check_digests ();
181   
182   return error_count? 1:0;
183 }
184
185