5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2008 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 /* Test that the software accelerated cipher encrypts and decrypts
23 #include "silccrypto.h"
26 #define ENC_LEN 799 /* enc data len */
27 #define ENC_ROUND 10000 /* enc rounds */
29 SilcCipher enc_cipher, enc_acc_cipher;
30 SilcCipher dec_cipher, dec_acc_cipher;
32 int main(int argc, char **argv)
34 SilcBool success = FALSE;
35 unsigned char *data, iv[SILC_CIPHER_MAX_IV_SIZE];
39 silc_crypto_init(NULL);
41 if (argc > 1 && !strcmp(argv[1], "-d")) {
43 silc_log_debug_hexdump(TRUE);
44 silc_log_set_debug_string("*acc*,*cipher*,*twofish*");
47 if (!silc_acc_init(SILC_SOFTACC, (void *)0x01, "min_threads", 2,
48 "max_threads", 8, NULL))
51 data = malloc(ENC_LEN * sizeof(*data));
56 for (i = 0; i < ENC_LEN; i++)
58 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
61 for (i = 0; i < SILC_CIPHER_MAX_IV_SIZE; i++)
64 SILC_LOG_HEXDUMP(("IV"), iv, SILC_CIPHER_MAX_IV_SIZE);
66 for (i = 0; silc_default_ciphers[i].name; i++) {
67 if (!silc_cipher_alloc(silc_default_ciphers[i].name, &enc_cipher)) {
68 fprintf(stderr, "Error allocating %s\n", silc_default_ciphers[i].name);
71 if (!silc_cipher_alloc(silc_default_ciphers[i].name, &dec_cipher)) {
72 fprintf(stderr, "Error allocating %s\n", silc_default_ciphers[i].name);
76 enc_acc_cipher = silc_acc_cipher(SILC_SOFTACC, enc_cipher);
79 dec_acc_cipher = silc_acc_cipher(SILC_SOFTACC, dec_cipher);
83 SILC_LOG_DEBUG(("Allocated cipher %s", silc_default_ciphers[i].name));
85 SILC_LOG_DEBUG(("Set key"));
86 silc_cipher_set_key(enc_acc_cipher, data,
87 silc_cipher_get_key_len(enc_cipher),
89 silc_cipher_set_key(dec_acc_cipher, data,
90 silc_cipher_get_key_len(dec_cipher),
94 SILC_LOG_DEBUG(("Set IV"));
95 silc_cipher_set_iv(enc_acc_cipher, iv);
97 SILC_LOG_DEBUG(("Encrypt with accelerated cipher"));
98 for (k = 0; k < ENC_ROUND; k++)
99 silc_cipher_encrypt(enc_acc_cipher, data, data, ENC_LEN, NULL);
100 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
102 SILC_LOG_DEBUG(("Set IV"));
103 silc_cipher_set_iv(dec_cipher, iv);
105 SILC_LOG_DEBUG(("Decrypt with associated cipher"));
106 for (k = 0; k < ENC_ROUND; k++)
107 silc_cipher_decrypt(dec_cipher, data, data, ENC_LEN, NULL);
108 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
111 SILC_LOG_DEBUG(("Verify"));
112 for (k = 0; k < ENC_LEN; k++)
113 if (data[k] != k % 255)
115 SILC_LOG_DEBUG(("Ok"));
118 SILC_LOG_DEBUG(("Set IV"));
119 silc_cipher_set_iv(enc_cipher, iv);
121 SILC_LOG_DEBUG(("Encrypt with associated cipher"));
122 for (k = 0; k < ENC_ROUND; k++)
123 silc_cipher_encrypt(enc_cipher, data, data, ENC_LEN, NULL);
124 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
126 SILC_LOG_DEBUG(("Set IV"));
127 silc_cipher_set_iv(dec_acc_cipher, iv);
129 SILC_LOG_DEBUG(("Decrypt with accelerated cipher"));
130 for (k = 0; k < ENC_ROUND; k++)
131 silc_cipher_decrypt(dec_acc_cipher, data, data, ENC_LEN, NULL);
132 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
135 SILC_LOG_DEBUG(("Verify"));
136 for (k = 0; k < ENC_LEN; k++)
137 if (data[k] != k % 255)
139 SILC_LOG_DEBUG(("Ok"));
142 SILC_LOG_DEBUG(("Set IV"));
143 silc_cipher_set_iv(enc_acc_cipher, iv);
145 SILC_LOG_DEBUG(("Encrypt with accelerated cipher"));
146 for (k = 0; k < ENC_ROUND; k++)
147 silc_cipher_encrypt(enc_acc_cipher, data, data, ENC_LEN, NULL);
148 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
150 SILC_LOG_DEBUG(("Set IV"));
151 silc_cipher_set_iv(dec_acc_cipher, iv);
153 SILC_LOG_DEBUG(("Decrypt with accelerated cipher"));
154 for (k = 0; k < ENC_ROUND; k++)
155 silc_cipher_decrypt(dec_acc_cipher, data, data, ENC_LEN, NULL);
156 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
159 SILC_LOG_DEBUG(("Verify"));
160 for (k = 0; k < ENC_LEN; k++)
161 if (data[k] != k % 255)
163 SILC_LOG_DEBUG(("Ok"));
166 SILC_LOG_DEBUG(("Set IV"));
167 silc_cipher_set_iv(enc_cipher, iv);
169 SILC_LOG_DEBUG(("Encrypt with associated cipher"));
170 for (k = 0; k < ENC_ROUND; k++)
171 silc_cipher_encrypt(enc_cipher, data, data, ENC_LEN, NULL);
172 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
174 SILC_LOG_DEBUG(("Set IV"));
175 silc_cipher_set_iv(dec_cipher, iv);
177 SILC_LOG_DEBUG(("Decrypt with associated cipher"));
178 for (k = 0; k < ENC_ROUND; k++)
179 silc_cipher_decrypt(dec_cipher, data, data, ENC_LEN, NULL);
180 SILC_LOG_HEXDUMP(("data"), data, ENC_LEN);
183 SILC_LOG_DEBUG(("Verify"));
184 for (k = 0; k < ENC_LEN; k++)
185 if (data[k] != k % 255)
187 SILC_LOG_DEBUG(("Ok"));
190 silc_cipher_free(enc_acc_cipher);
191 silc_cipher_free(enc_cipher);
192 silc_cipher_free(dec_acc_cipher);
193 silc_cipher_free(dec_cipher);
196 silc_acc_uninit(SILC_SOFTACC);
201 SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
202 fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
204 silc_crypto_uninit();
205 silc_runtime_uninit();