X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=blobdiff_plain;f=lib%2Fsilcacc%2Ftests%2Ftest_softacc_cipher2.c;fp=lib%2Fsilcacc%2Ftests%2Ftest_softacc_cipher2.c;h=416423a0cb2eac295b0b78169e2c289f84c2fb7c;hp=0000000000000000000000000000000000000000;hb=80dc2a39c614ea1376a2e19ebe2460af11c9afee;hpb=9f20f0382b6229eca740925a73f96294f6dcedc6 diff --git a/lib/silcacc/tests/test_softacc_cipher2.c b/lib/silcacc/tests/test_softacc_cipher2.c new file mode 100644 index 00000000..416423a0 --- /dev/null +++ b/lib/silcacc/tests/test_softacc_cipher2.c @@ -0,0 +1,208 @@ +/* + + test_softacc_cipher2.c + + Author: Pekka Riikonen + + Copyright (C) 2008 Pekka Riikonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ + +/* Test that the software accelerated cipher encrypts and decrypts + correctly. */ + +#include "silccrypto.h" +#include "softacc.h" + +#define ENC_LEN 799 /* enc data len */ +#define ENC_ROUND 10000 /* enc rounds */ + +SilcCipher enc_cipher, enc_acc_cipher; +SilcCipher dec_cipher, dec_acc_cipher; + +int main(int argc, char **argv) +{ + SilcBool success = FALSE; + unsigned char *data, iv[SILC_CIPHER_MAX_IV_SIZE]; + SilcUInt32 i, k; + + silc_runtime_init(); + silc_crypto_init(NULL); + + if (argc > 1 && !strcmp(argv[1], "-d")) { + silc_log_debug(TRUE); + silc_log_debug_hexdump(TRUE); + silc_log_set_debug_string("*acc*,*cipher*,*twofish*"); + } + + if (!silc_acc_init(SILC_SOFTACC, (void *)0x01, "min_threads", 2, + "max_threads", 8, NULL)) + exit(1); + + data = malloc(ENC_LEN * sizeof(*data)); + if (!data) + exit(1); + + /* Plaintext */ + for (i = 0; i < ENC_LEN; i++) + data[i] = i % 255; + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + /* IV */ + for (i = 0; i < SILC_CIPHER_MAX_IV_SIZE; i++) + iv[i] = i % 255; + + SILC_LOG_HEXDUMP(("IV"), iv, SILC_CIPHER_MAX_IV_SIZE); + + for (i = 0; silc_default_ciphers[i].name; i++) { + if (!silc_cipher_alloc(silc_default_ciphers[i].name, &enc_cipher)) { + fprintf(stderr, "Error allocating %s\n", silc_default_ciphers[i].name); + exit(1); + } + if (!silc_cipher_alloc(silc_default_ciphers[i].name, &dec_cipher)) { + fprintf(stderr, "Error allocating %s\n", silc_default_ciphers[i].name); + exit(1); + } + + enc_acc_cipher = silc_acc_cipher(SILC_SOFTACC, enc_cipher); + if (!enc_acc_cipher) + continue; + dec_acc_cipher = silc_acc_cipher(SILC_SOFTACC, dec_cipher); + if (!dec_acc_cipher) + continue; + + SILC_LOG_DEBUG(("Allocated cipher %s", silc_default_ciphers[i].name)); + + SILC_LOG_DEBUG(("Set key")); + silc_cipher_set_key(enc_acc_cipher, data, + silc_cipher_get_key_len(enc_cipher), + TRUE); + silc_cipher_set_key(dec_acc_cipher, data, + silc_cipher_get_key_len(dec_cipher), + FALSE); + + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(enc_acc_cipher, iv); + + SILC_LOG_DEBUG(("Encrypt with accelerated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_encrypt(enc_acc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(dec_cipher, iv); + + SILC_LOG_DEBUG(("Decrypt with associated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_decrypt(dec_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + /* Verify */ + SILC_LOG_DEBUG(("Verify")); + for (k = 0; k < ENC_LEN; k++) + if (data[k] != k % 255) + goto err; + SILC_LOG_DEBUG(("Ok")); + + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(enc_cipher, iv); + + SILC_LOG_DEBUG(("Encrypt with associated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_encrypt(enc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(dec_acc_cipher, iv); + + SILC_LOG_DEBUG(("Decrypt with accelerated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_decrypt(dec_acc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + /* Verify */ + SILC_LOG_DEBUG(("Verify")); + for (k = 0; k < ENC_LEN; k++) + if (data[k] != k % 255) + goto err; + SILC_LOG_DEBUG(("Ok")); + + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(enc_acc_cipher, iv); + + SILC_LOG_DEBUG(("Encrypt with accelerated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_encrypt(enc_acc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(dec_acc_cipher, iv); + + SILC_LOG_DEBUG(("Decrypt with accelerated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_decrypt(dec_acc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + /* Verify */ + SILC_LOG_DEBUG(("Verify")); + for (k = 0; k < ENC_LEN; k++) + if (data[k] != k % 255) + goto err; + SILC_LOG_DEBUG(("Ok")); + + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(enc_cipher, iv); + + SILC_LOG_DEBUG(("Encrypt with associated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_encrypt(enc_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + SILC_LOG_DEBUG(("Set IV")); + silc_cipher_set_iv(dec_cipher, iv); + + SILC_LOG_DEBUG(("Decrypt with associated cipher")); + for (k = 0; k < ENC_ROUND; k++) + silc_cipher_decrypt(dec_cipher, data, data, ENC_LEN, NULL); + SILC_LOG_HEXDUMP(("data"), data, ENC_LEN); + + /* Verify */ + SILC_LOG_DEBUG(("Verify")); + for (k = 0; k < ENC_LEN; k++) + if (data[k] != k % 255) + goto err; + SILC_LOG_DEBUG(("Ok")); + + + silc_cipher_free(enc_acc_cipher); + silc_cipher_free(enc_cipher); + silc_cipher_free(dec_acc_cipher); + silc_cipher_free(dec_cipher); + } + + silc_acc_uninit(SILC_SOFTACC); + + success = TRUE; + + err: + SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE")); + fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE"); + + silc_crypto_uninit(); + silc_runtime_uninit(); + + return !success; +}