Added cipher acceleration to SILC Accelerator. Added cipher softacc.
[crypto.git] / lib / silcacc / tests / test_softacc_cipher2.c
diff --git a/lib/silcacc/tests/test_softacc_cipher2.c b/lib/silcacc/tests/test_softacc_cipher2.c
new file mode 100644 (file)
index 0000000..416423a
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+
+  test_softacc_cipher2.c
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  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;
+}