/* 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; }