1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tomcrypt_test.h>
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprng_state yarrow_prng;
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstruct list results[100];
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint no_results;
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint sorter(const void *a, const void *b)
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   const struct list *A, *B;
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   A = a;
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   B = b;
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (A->avg < B->avg) return -1;
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (A->avg > B->avg) return 1;
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid tally_results(int type)
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int x;
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* qsort the results */
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   qsort(results, no_results, sizeof(struct list), &sorter);
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "\n");
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (type == 0) {
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      for (x = 0; x < no_results; x++) {
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         fprintf(stderr, "%-20s: Schedule at %6lu\n", cipher_descriptor[results[x].id].name, (unsigned long)results[x].spd1);
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else if (type == 1) {
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      for (x = 0; x < no_results; x++) {
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        printf
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ("%-20s[%3d]: Encrypt at %5lu, Decrypt at %5lu\n", cipher_descriptor[results[x].id].name, cipher_descriptor[results[x].id].ID, results[x].spd1, results[x].spd2);
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      for (x = 0; x < no_results; x++) {
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        printf
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ("%-20s: Process at %5lu\n", hash_descriptor[results[x].id].name, results[x].spd1 / 1000);
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* RDTSC from Scott Duplichan */
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectulong64 rdtsc (void)
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   {
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #if defined __GNUC__ && !defined(LTC_NO_ASM)
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #ifdef INTEL_CC
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			ulong64 a;
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			asm ( " rdtsc ":"=A"(a));
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return a;
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #elif defined(__i386__) || defined(__x86_64__)
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         ulong64 a;
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         asm __volatile__ ("rdtsc\nmovl %%eax,(%0)\nmovl %%edx,4(%0)\n"::"r"(&a):"%eax","%edx");
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return a;
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #elif defined(LTC_PPC32) || defined(TFM_PPC32)
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         unsigned long a, b;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         __asm__ __volatile__ ("mftbu %1 \nmftb %0\n":"=r"(a), "=r"(b));
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return (((ulong64)b) << 32ULL) | ((ulong64)a);
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #elif defined(__ia64__)  /* gcc-IA64 version */
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         unsigned long result;
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory");
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         while (__builtin_expect ((int) result == -1, 0))
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory");
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return result;
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #elif defined(__sparc__)
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         #if defined(__arch64__)
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           ulong64 a;
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           asm volatile("rd %%tick,%0" : "=r" (a));
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           return a;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         #else
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           register unsigned long x, y;
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           __asm__ __volatile__ ("rd %%tick, %0; clruw %0, %1; srlx %0, 32, %0" : "=r" (x), "=r" (y) : "0" (x), "1" (y));
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           return ((unsigned long long) x << 32) | y;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         #endif
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #else
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return XCLOCK();
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #endif
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* Microsoft and Intel Windows compilers */
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #elif defined _M_IX86 && !defined(LTC_NO_ASM)
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     __asm rdtsc
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #elif defined _M_AMD64 && !defined(LTC_NO_ASM)
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return __rdtsc ();
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #elif defined _M_IA64 && !defined(LTC_NO_ASM)
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     #if defined __INTEL_COMPILER
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #include <ia64intrin.h>
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     #endif
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return __getReg (3116);
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #else
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return XCLOCK();
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #endif
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic ulong64 timer, skew = 0;
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid t_start(void)
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   timer = rdtsc();
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectulong64 t_read(void)
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return rdtsc() - timer;
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid init_timer(void)
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 c1, c2, t1, t2, t3;
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long y1;
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   c1 = c2 = (ulong64)-1;
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (y1 = 0; y1 < TIMES*100; y1++) {
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      t_start();
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      t1 = t_read();
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      t3 = t_read();
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      t2 = (t_read() - t1)>>1;
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      c1 = (t1 > c1) ? t1 : c1;
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      c2 = (t2 > c2) ? t2 : c2;
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   skew = c2 - c1;
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "Clock Skew: %lu\n", (unsigned long)skew);
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid reg_algs(void)
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int err;
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIJNDAEL
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&aes_desc);
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BLOWFISH
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&blowfish_desc);
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef XTEA
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&xtea_desc);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC5
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&rc5_desc);
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC6
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&rc6_desc);
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SAFERP
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&saferp_desc);
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef TWOFISH
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&twofish_desc);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SAFER
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&safer_k64_desc);
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&safer_sk64_desc);
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&safer_k128_desc);
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&safer_sk128_desc);
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC2
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&rc2_desc);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DES
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&des_desc);
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&des3_desc);
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef CAST5
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&cast5_desc);
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef NOEKEON
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&noekeon_desc);
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SKIPJACK
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&skipjack_desc);
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef KHAZAD
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&khazad_desc);
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ANUBIS
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&anubis_desc);
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef KSEED
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&kseed_desc);
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_KASUMI
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_cipher (&kasumi_desc);
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef TIGER
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&tiger_desc);
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MD2
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&md2_desc);
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MD4
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&md4_desc);
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MD5
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&md5_desc);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SHA1
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&sha1_desc);
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SHA224
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&sha224_desc);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SHA256
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&sha256_desc);
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SHA384
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&sha384_desc);
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SHA512
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&sha512_desc);
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD128
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&rmd128_desc);
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD160
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&rmd160_desc);
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD256
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&rmd256_desc);
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD320
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&rmd320_desc);
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef WHIRLPOOL
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash (&whirlpool_desc);
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef CHC_HASH
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  register_hash(&chc_desc);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) {
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     fprintf(stderr, "chc_register error: %s\n", error_to_string(err));
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     exit(EXIT_FAILURE);
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef YARROW
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #error This demo requires Yarrow.
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectregister_prng(&yarrow_desc);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef FORTUNA
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectregister_prng(&fortuna_desc);
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC4
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectregister_prng(&rc4_desc);
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SOBER128
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectregister_prng(&sober128_desc);
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) {
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err));
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      exit(EXIT_FAILURE);
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_keysched(void)
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1;
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64 t1, c1;
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  symmetric_key skey;
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int kl;
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int    (*func) (const unsigned char *, int , int , symmetric_key *);
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char key[MAXBLOCKSIZE];
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nKey Schedule Time Trials for the Symmetric Ciphers:\n(Times are cycles per key)\n");
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; cipher_descriptor[x].name != NULL; x++) {
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1(k)   func(k, kl, 0, &skey);
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    func = cipher_descriptor[x].setup;
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    kl   = cipher_descriptor[x].min_key_length;
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = (ulong64)-1;
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < KTIMES; y1++) {
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       yarrow_read(key, kl, &yarrow_prng);
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t_start();
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       DO1(key);
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t1 = t_read();
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       c1 = (t1 > c1) ? c1 : t1;
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    t1 = c1 - skew;
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = results[no_results].avg = t1;
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results++].id = x;
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(0);
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher(void)
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1;
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64  t1, t2, c1, c2, a1, a2;
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  symmetric_ECB ecb;
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char key[MAXBLOCKSIZE], pt[4096];
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int err;
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nECB Time Trials for the Symmetric Ciphers:\n");
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  for (x = 0; cipher_descriptor[x].name != NULL; x++) {
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ecb_start(x, key, cipher_descriptor[x].min_key_length, 0, &ecb);
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* sanity check on cipher */
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = cipher_descriptor[x].test()) != CRYPT_OK) {
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err));
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       exit(EXIT_FAILURE);
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   ecb_encrypt(pt, pt, sizeof(pt), &ecb);
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a1 = c2 - c1 - skew;
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   ecb_decrypt(pt, pt, sizeof(pt), &ecb);
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a2 = c2 - c1 - skew;
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ecb_done(&ecb);
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].id = x;
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length);
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length);
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2;
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ++no_results;
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(1);
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CBC_MODE
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher2(void)
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1;
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64  t1, t2, c1, c2, a1, a2;
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  symmetric_CBC cbc;
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char key[MAXBLOCKSIZE], pt[4096];
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int err;
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nCBC Time Trials for the Symmetric Ciphers:\n");
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  for (x = 0; cipher_descriptor[x].name != NULL; x++) {
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    cbc_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, &cbc);
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* sanity check on cipher */
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = cipher_descriptor[x].test()) != CRYPT_OK) {
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err));
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       exit(EXIT_FAILURE);
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   cbc_encrypt(pt, pt, sizeof(pt), &cbc);
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a1 = c2 - c1 - skew;
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   cbc_decrypt(pt, pt, sizeof(pt), &cbc);
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a2 = c2 - c1 - skew;
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    cbc_done(&cbc);
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].id = x;
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length);
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length);
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2;
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ++no_results;
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(1);
430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher2(void) { fprintf(stderr, "NO CBC\n"); return 0; }
435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CTR_MODE
438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher3(void)
439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1;
441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64  t1, t2, c1, c2, a1, a2;
442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  symmetric_CTR ctr;
443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char key[MAXBLOCKSIZE], pt[4096];
444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int err;
445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nCTR Time Trials for the Symmetric Ciphers:\n");
447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  for (x = 0; cipher_descriptor[x].name != NULL; x++) {
449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ctr_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr);
450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* sanity check on cipher */
452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = cipher_descriptor[x].test()) != CRYPT_OK) {
453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err));
454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       exit(EXIT_FAILURE);
455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   ctr_encrypt(pt, pt, sizeof(pt), &ctr);
458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
470f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
471f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
472f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a1 = c2 - c1 - skew;
473f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
474f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
475f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
476f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   ctr_decrypt(pt, pt, sizeof(pt), &ctr);
477f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
478f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
479f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
480f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
481f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
482f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
483f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
484f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
485f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
486f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
487f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
488f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
489f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
490f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
491f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a2 = c2 - c1 - skew;
492f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ctr_done(&ctr);
493f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
494f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].id = x;
495f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length);
496f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length);
497f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2;
498f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ++no_results;
499f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
500f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
501f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
502f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
503f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
504f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(1);
505f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
506f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
507f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
508f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
509f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher3(void) { fprintf(stderr, "NO CTR\n"); return 0; }
510f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
511f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
512f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_LRW_MODE
513f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher4(void)
514f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
515f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1;
516f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64  t1, t2, c1, c2, a1, a2;
517f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  symmetric_LRW lrw;
518f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char key[MAXBLOCKSIZE], pt[4096];
519f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int err;
520f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
521f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nLRW Time Trials for the Symmetric Ciphers:\n");
522f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
523f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  for (x = 0; cipher_descriptor[x].name != NULL; x++) {
524f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (cipher_descriptor[x].block_length != 16) continue;
525f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    lrw_start(x, pt, key, cipher_descriptor[x].min_key_length, key, 0, &lrw);
526f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
527f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* sanity check on cipher */
528f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = cipher_descriptor[x].test()) != CRYPT_OK) {
529f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err));
530f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       exit(EXIT_FAILURE);
531f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
532f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
533f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   lrw_encrypt(pt, pt, sizeof(pt), &lrw);
534f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
535f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
536f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
537f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
538f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
539f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
540f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
541f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
542f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
543f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
544f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
545f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
546f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
547f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
548f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a1 = c2 - c1 - skew;
549f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
550f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
551f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
552f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   lrw_decrypt(pt, pt, sizeof(pt), &lrw);
553f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
554f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
555f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
556f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < 100; y1++) {
557f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
558f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO1;
559f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
560f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        DO2;
561f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 = t_read();
562f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 -= t1;
563f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
564f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c1 = (t1 > c1 ? c1 : t1);
565f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        c2 = (t2 > c2 ? c2 : t2);
566f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
567f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    a2 = c2 - c1 - skew;
568f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
569f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    lrw_done(&lrw);
570f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
571f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].id = x;
572f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length);
573f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length);
574f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2;
575f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ++no_results;
576f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
577f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
578f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
579f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
580f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
581f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(1);
582f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
583f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
584f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
585f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
586f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_cipher4(void) { fprintf(stderr, "NO LRW\n"); return 0; }
587f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
588f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
589f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
590f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint time_hash(void)
591f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
592f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long x, y1, len;
593f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  ulong64 t1, t2, c1, c2;
594f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  hash_state md;
595f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int    (*func)(hash_state *, const unsigned char *, unsigned long), err;
596f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned char pt[MAXBLOCKSIZE];
597f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
598f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
599f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "\n\nHASH Time Trials for:\n");
600f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  no_results = 0;
601f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  for (x = 0; hash_descriptor[x].name != NULL; x++) {
602f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
603f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* sanity check on hash */
604f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = hash_descriptor[x].test()) != CRYPT_OK) {
605f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\nERROR: Hash %s failed self-test %s\n", hash_descriptor[x].name, error_to_string(err));
606f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       exit(EXIT_FAILURE);
607f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
608f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
609f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    hash_descriptor[x].init(&md);
610f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
611f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1   func(&md,pt,len);
612f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2   DO1 DO1
613f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
614f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    func = hash_descriptor[x].process;
615f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    len  = hash_descriptor[x].blocksize;
616f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
617f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    c1 = c2 = (ulong64)-1;
618f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (y1 = 0; y1 < TIMES; y1++) {
619f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t_start();
620f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       DO1;
621f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t1 = t_read();
622f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       DO2;
623f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = t_read() - t1;
624f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       c1 = (t1 > c1) ? c1 : t1;
625f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       c2 = (t2 > c2) ? c2 : t2;
626f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
627f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    t1 = c2 - c1 - skew;
628f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    t1 = ((t1 * CONST64(1000))) / ((ulong64)hash_descriptor[x].blocksize);
629f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].id = x;
630f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    results[no_results].spd1 = results[no_results].avg = t1;
631f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    ++no_results;
632f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    fprintf(stderr, "."); fflush(stdout);
633f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
634f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
635f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
636f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tally_results(2);
637f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
638f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
639f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
640f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
641f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef MPI
642f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*#warning you need an mp_rand!!!*/
643f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
644f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MPI
645f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_mult(void)
646f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
647f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
648f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y;
649f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   void  *a, *b, *c;
650f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
651f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "Timing Multiplying:\n");
652f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_init_multi(&a,&b,&c,NULL);
653f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) {
654f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       mp_rand(&a, x);
655f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       mp_rand(&b, x);
656f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
657f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1 mp_mul(&a, &b, &c);
658f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2 DO1; DO1;
659f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
660f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = -1;
661f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < TIMES; y++) {
662f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
663f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
664f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           DO2;
665f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = (t_read() - t1)>>1;
666f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (t1 < t2) t2 = t1;
667f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
668f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2);
669f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
670f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_clear_multi(&a,&b,&c,NULL);
671f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
672f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
673f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
674f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
675f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
676f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_sqr(void)
677f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
678f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
679f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y;
680f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_int  a, b;
681f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
682f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "Timing Squaring:\n");
683f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_init_multi(&a,&b,NULL);
684f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) {
685f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       mp_rand(&a, x);
686f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
687f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1 mp_sqr(&a, &b);
688f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2 DO1; DO1;
689f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
690f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = -1;
691f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < TIMES; y++) {
692f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
693f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
694f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           DO2;
695f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = (t_read() - t1)>>1;
696f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (t1 < t2) t2 = t1;
697f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
698f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2);
699f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
700f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_clear_multi(&a,&b,NULL);
701f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
702f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
703f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
704f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
705f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
706f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_mult(void) { fprintf(stderr, "NO MULT\n"); }
707f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_sqr(void) { fprintf(stderr, "NO SQR\n"); }
708f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
709f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
710f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_prng(void)
711f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
712f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
713f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[4096];
714f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   prng_state tprng;
715f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y;
716f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int           err;
717f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
718f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "Timing PRNGs (cycles/byte output, cycles add_entropy (32 bytes) :\n");
719f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; prng_descriptor[x].name != NULL; x++) {
720f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
721f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* sanity check on prng */
722f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ((err = prng_descriptor[x].test()) != CRYPT_OK) {
723f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         fprintf(stderr, "\n\nERROR: PRNG %s failed self-test %s\n", prng_descriptor[x].name, error_to_string(err));
724f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         exit(EXIT_FAILURE);
725f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
726f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
727f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      prng_descriptor[x].start(&tprng);
728f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      zeromem(buf, 256);
729f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      prng_descriptor[x].add_entropy(buf, 256, &tprng);
730f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      prng_descriptor[x].ready(&tprng);
731f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      t2 = -1;
732f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
733f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1 if (prng_descriptor[x].read(buf, 4096, &tprng) != 4096) { fprintf(stderr, "\n\nERROR READ != 4096\n\n"); exit(EXIT_FAILURE); }
734f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2 DO1 DO1
735f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      for (y = 0; y < 10000; y++) {
736f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t_start();
737f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t1 = t_read();
738f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         DO2;
739f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t1 = (t_read() - t1)>>1;
740f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         if (t1 < t2) t2 = t1;
741f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
742f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "%20s: %5llu ", prng_descriptor[x].name, t2>>12);
743f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
744f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
745f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
746f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO1 prng_descriptor[x].start(&tprng); prng_descriptor[x].add_entropy(buf, 32, &tprng); prng_descriptor[x].ready(&tprng); prng_descriptor[x].done(&tprng);
747f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DO2 DO1 DO1
748f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      for (y = 0; y < 10000; y++) {
749f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t_start();
750f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t1 = t_read();
751f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         DO2;
752f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         t1 = (t_read() - t1)>>1;
753f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         if (t1 < t2) t2 = t1;
754f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
755f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "%5llu\n", t2);
756f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO2
757f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#undef DO1
758f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
759f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
760f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
761f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
762f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MDSA
763f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* time various DSA operations */
764f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_dsa(void)
765f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
766f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dsa_key       key;
767f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64       t1, t2;
768f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y;
769f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int           err;
770f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct {
771f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int group, modulus;
772f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} groups[] = {
773f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 20, 96  },
774f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 20, 128 },
775f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 24, 192 },
776f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 28, 256 },
777f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 32, 512 }
778f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
779f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
780f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < (sizeof(groups)/sizeof(groups[0])); x++) {
781f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
782f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 4; y++) {
783f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
784f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
785f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = dsa_make_key(&yarrow_prng, find_prng("yarrow"), groups[x].group, groups[x].modulus, &key)) != CRYPT_OK) {
786f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\ndsa_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
787f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
788f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
789f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
790f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
791f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
792f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
793f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 2;
794f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
795f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
796f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (y < 3) {
797f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              dsa_free(&key);
798f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
799f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
800f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 2;
801f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "DSA-(%lu, %lu) make_key    took %15llu cycles\n", (unsigned long)groups[x].group*8, (unsigned long)groups[x].modulus*8, t2);
802f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
803f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
804f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
805f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
806f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
807f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MRSA
808f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* time various RSA operations */
809f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_rsa(void)
810f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
811f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   rsa_key       key;
812f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64       t1, t2;
813f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[2][2048];
814f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y, z, zzz;
815f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int           err, zz, stat;
816f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
817f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 1024; x <= 2048; x += 256) {
818f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
819f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 4; y++) {
820f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
821f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
822f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = rsa_make_key(&yarrow_prng, find_prng("yarrow"), x/8, 65537, &key)) != CRYPT_OK) {
823f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nrsa_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
824f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
825f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
826f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
827f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
828f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
829f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
830f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 2;
831f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
832f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
833f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
834f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (y < 3) {
835f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              rsa_free(&key);
836f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
837f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
838f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 2;
839f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "RSA-%lu make_key    took %15llu cycles\n", x, t2);
840f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
841f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
842f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 16; y++) {
843f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
844f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
845f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           z = sizeof(buf[1]);
846f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = rsa_encrypt_key(buf[0], 32, buf[1], &z, (const unsigned char *)"testprog", 8, &yarrow_prng,
847f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      find_prng("yarrow"), find_hash("sha1"),
848f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      &key)) != CRYPT_OK) {
849f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nrsa_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
850f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
851f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
852f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
853f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
854f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
855f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 4;
856f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
857f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
858f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
859f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 4;
860f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "RSA-%lu encrypt_key took %15llu cycles\n", x, t2);
861f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
862f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
863f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 2048; y++) {
864f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
865f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
866f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           zzz = sizeof(buf[0]);
867f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = rsa_decrypt_key(buf[1], z, buf[0], &zzz, (const unsigned char *)"testprog", 8,  find_hash("sha1"),
868f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      &zz, &key)) != CRYPT_OK) {
869f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nrsa_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
870f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
871f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
872f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
873f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
874f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
875f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 11;
876f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
877f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
878f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
879f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 11;
880f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "RSA-%lu decrypt_key took %15llu cycles\n", x, t2);
881f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
882f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
883f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
884f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t_start();
885f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read();
886f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          z = sizeof(buf[1]);
887f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if ((err = rsa_sign_hash(buf[0], 20, buf[1], &z, &yarrow_prng,
888f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                   find_prng("yarrow"), find_hash("sha1"), 8, &key)) != CRYPT_OK) {
889f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nrsa_sign_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
890f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
891f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
892f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
893f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
894f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
895f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
896f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
897f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
898f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
899f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 >>= 8;
900f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        fprintf(stderr, "RSA-%lu sign_hash took   %15llu cycles\n", x, t2);
901f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
902f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
903f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 2048; y++) {
904f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t_start();
905f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read();
906f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if ((err = rsa_verify_hash(buf[1], z, buf[0], 20, find_hash("sha1"), 8, &stat, &key)) != CRYPT_OK) {
907f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nrsa_verify_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
908f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
909f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          }
910f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (stat == 0) {
911f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             fprintf(stderr, "\n\nrsa_verify_hash for RSA-%lu failed to verify signature(%lu)\n", x, y);
912f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             exit(EXIT_FAILURE);
913f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          }
914f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read() - t1;
915f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t2 += t1;
916f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
917f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 11;
918f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
919f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
920f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
921f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 >>= 11;
922f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        fprintf(stderr, "RSA-%lu verify_hash took %15llu cycles\n", x, t2);
923f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\n");
924f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rsa_free(&key);
925f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
926f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
927f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
928f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_rsa(void) { fprintf(stderr, "NO RSA\n"); }
929f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
930f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
931f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MKAT
932f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* time various KAT operations */
933f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_katja(void)
934f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
935f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   katja_key key;
936f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
937f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[2][4096];
938f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y, z, zzz;
939f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int           err, zz;
940f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
941f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 1024; x <= 2048; x += 256) {
942f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
943f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 4; y++) {
944f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
945f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
946f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = katja_make_key(&yarrow_prng, find_prng("yarrow"), x/8, &key)) != CRYPT_OK) {
947f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nkatja_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
948f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
949f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
950f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
951f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
952f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
953f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (y < 3) {
954f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              katja_free(&key);
955f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
956f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
957f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 2;
958f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "Katja-%lu make_key    took %15llu cycles\n", x, t2);
959f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
960f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
961f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 16; y++) {
962f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
963f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
964f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           z = sizeof(buf[1]);
965f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = katja_encrypt_key(buf[0], 32, buf[1], &z, "testprog", 8, &yarrow_prng,
966f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      find_prng("yarrow"), find_hash("sha1"),
967f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      &key)) != CRYPT_OK) {
968f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nkatja_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
969f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
970f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
971f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
972f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
973f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
974f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 4;
975f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "Katja-%lu encrypt_key took %15llu cycles\n", x, t2);
976f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
977f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
978f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 2048; y++) {
979f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
980f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
981f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           zzz = sizeof(buf[0]);
982f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = katja_decrypt_key(buf[1], z, buf[0], &zzz, "testprog", 8,  find_hash("sha1"),
983f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      &zz, &key)) != CRYPT_OK) {
984f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\nkatja_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
985f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
986f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
987f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
988f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
989f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
990f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 11;
991f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "Katja-%lu decrypt_key took %15llu cycles\n", x, t2);
992f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
993f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
994f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       katja_free(&key);
995f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
996f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
997f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
998f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_katja(void) { fprintf(stderr, "NO Katja\n"); }
999f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1000f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1001f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MECC
1002f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* time various ECC operations */
1003f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_ecc(void)
1004f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
1005f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ecc_key key;
1006f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
1007f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[2][256];
1008f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long i, w, x, y, z;
1009f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int           err, stat;
1010f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   static unsigned long sizes[] = {
1011f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC112
1012f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project112/8,
1013f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1014f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC128
1015f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project128/8,
1016f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1017f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC160
1018f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project160/8,
1019f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1020f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC192
1021f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project192/8,
1022f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1023f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC224
1024f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project224/8,
1025f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1026f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC256
1027f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project256/8,
1028f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1029f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC384
1030f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project384/8,
1031f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1032f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ECC521
1033f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project521/8,
1034f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1035f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project100000};
1036f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1037f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = sizes[i=0]; x < 100000; x = sizes[++i]) {
1038f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
1039f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
1040f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
1041f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
1042f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = ecc_make_key(&yarrow_prng, find_prng("yarrow"), x, &key)) != CRYPT_OK) {
1043f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\necc_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
1044f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
1045f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
1046f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
1047f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
1048f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1049f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
1050f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
1051f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
1052f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1053f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1054f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (y < 255) {
1055f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              ecc_free(&key);
1056f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
1057f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
1058f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 8;
1059f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "ECC-%lu make_key    took %15llu cycles\n", x*8, t2);
1060f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1061f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
1062f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
1063f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
1064f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
1065f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           z = sizeof(buf[1]);
1066f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = ecc_encrypt_key(buf[0], 20, buf[1], &z, &yarrow_prng, find_prng("yarrow"), find_hash("sha1"),
1067f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                      &key)) != CRYPT_OK) {
1068f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\necc_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
1069f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
1070f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
1071f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
1072f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
1073f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
1074f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
1075f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
1076f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1077f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
1078f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 8;
1079f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "ECC-%lu encrypt_key took %15llu cycles\n", x*8, t2);
1080f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1081f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
1082f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
1083f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t_start();
1084f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read();
1085f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           w = 20;
1086f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ((err = ecc_decrypt_key(buf[1], z, buf[0], &w, &key)) != CRYPT_OK) {
1087f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\necc_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
1088f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
1089f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
1090f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
1091f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
1092f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
1093f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
1094f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
1095f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1096f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
1097f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 >>= 8;
1098f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "ECC-%lu decrypt_key took %15llu cycles\n", x*8, t2);
1099f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
1101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
1102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t_start();
1103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read();
1104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          z = sizeof(buf[1]);
1105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if ((err = ecc_sign_hash(buf[0], 20, buf[1], &z, &yarrow_prng,
1106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                   find_prng("yarrow"), &key)) != CRYPT_OK) {
1107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\necc_sign_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
1108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
1109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
1110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t1 = t_read() - t1;
1111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           t2 += t1;
1112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
1113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
1114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
1115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
1117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 >>= 8;
1118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        fprintf(stderr, "ECC-%lu sign_hash took   %15llu cycles\n", x*8, t2);
1119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 = 0;
1121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 0; y < 256; y++) {
1122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t_start();
1123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read();
1124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if ((err = ecc_verify_hash(buf[1], z, buf[0], 20, &stat, &key)) != CRYPT_OK) {
1125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              fprintf(stderr, "\n\necc_verify_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK));
1126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              exit(EXIT_FAILURE);
1127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          }
1128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (stat == 0) {
1129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             fprintf(stderr, "\n\necc_verify_hash for ECC-%lu failed to verify signature(%lu)\n", x*8, y);
1130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             exit(EXIT_FAILURE);
1131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          }
1132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t1 = t_read() - t1;
1133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          t2 += t1;
1134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PROFILE
1135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       t2 <<= 8;
1136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       break;
1137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
1139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t2 >>= 8;
1140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        fprintf(stderr, "ECC-%lu verify_hash took %15llu cycles\n", x*8, t2);
1141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       fprintf(stderr, "\n\n");
1143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       ecc_free(&key);
1144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
1145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
1146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
1147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_ecc(void) { fprintf(stderr, "NO ECC\n"); }
1148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_macs_(unsigned long MAC_SIZE)
1151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
1152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char *buf, key[16], tag[16];
1153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
1154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, z;
1155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err, cipher_idx, hash_idx;
1156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "\nMAC Timings (cycles/byte on %luKB blocks):\n", MAC_SIZE);
1158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   buf = XMALLOC(MAC_SIZE*1024);
1160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (buf == NULL) {
1161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "\n\nout of heap yo\n\n");
1162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      exit(EXIT_FAILURE);
1163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cipher_idx = find_cipher("aes");
1166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   hash_idx   = find_hash("sha1");
1167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (cipher_idx == -1 || hash_idx == -1) {
1169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "Warning the MAC tests requires AES and SHA1 to operate... so sorry\n");
1170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return;
1171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   yarrow_read(buf, MAC_SIZE*1024, &yarrow_prng);
1174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   yarrow_read(key, 16, &yarrow_prng);
1175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_OMAC
1177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = omac_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) {
1183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\nomac error... %s\n", error_to_string(err));
1184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "OMAC-%s\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024));
1190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_XCBC
1193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = xcbc_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) {
1199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\nxcbc error... %s\n", error_to_string(err));
1200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "XCBC-%s\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024));
1206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_F9_MODE
1209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = f9_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) {
1215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\nF9 error... %s\n", error_to_string(err));
1216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "F9-%s\t\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024));
1222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_PMAC
1225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = pmac_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) {
1231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\npmac error... %s\n", error_to_string(err));
1232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "PMAC-AES\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef PELICAN
1241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = pelican_memory(key, 16, buf, MAC_SIZE*1024, tag)) != CRYPT_OK) {
1247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\npelican error... %s\n", error_to_string(err));
1248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "PELICAN \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_HMAC
1257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = hmac_memory(hash_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) {
1263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\n\nhmac error... %s\n", error_to_string(err));
1264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "HMAC-%s\t\t%9llu\n", hash_descriptor[hash_idx].name, t2/(ulong64)(MAC_SIZE*1024));
1270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   XFREE(buf);
1273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
1274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_macs(void)
1276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
1277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_macs_(1);
1278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_macs_(4);
1279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_macs_(32);
1280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
1281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_encmacs_(unsigned long MAC_SIZE)
1283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
1284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char *buf, IV[16], key[16], tag[16];
1285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong64 t1, t2;
1286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, z;
1287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err, cipher_idx;
1288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   symmetric_key skey;
1289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "\nENC+MAC Timings (zero byte AAD, 16 byte IV, cycles/byte on %luKB blocks):\n", MAC_SIZE);
1291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   buf = XMALLOC(MAC_SIZE*1024);
1293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (buf == NULL) {
1294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "\n\nout of heap yo\n\n");
1295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      exit(EXIT_FAILURE);
1296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cipher_idx = find_cipher("aes");
1299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   yarrow_read(buf, MAC_SIZE*1024, &yarrow_prng);
1301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   yarrow_read(key, 16, &yarrow_prng);
1302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   yarrow_read(IV, 16, &yarrow_prng);
1303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef EAX_MODE
1305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = eax_encrypt_authenticate_memory(cipher_idx, key, 16, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z)) != CRYPT_OK) {
1311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\nEAX error... %s\n", error_to_string(err));
1312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "EAX \t\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef OCB_MODE
1321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = ocb_encrypt_authenticate_memory(cipher_idx, key, 16, IV, buf, MAC_SIZE*1024, buf, tag, &z)) != CRYPT_OK) {
1327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\nOCB error... %s\n", error_to_string(err));
1328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "OCB \t\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef CCM_MODE
1337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = ccm_memory(cipher_idx, key, 16, NULL, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, CCM_ENCRYPT)) != CRYPT_OK) {
1343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\nCCM error... %s\n", error_to_string(err));
1344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "CCM (no-precomp) \t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cipher_descriptor[cipher_idx].setup(key, 16, 0, &skey);
1352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = ccm_memory(cipher_idx, key, 16, &skey, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, CCM_ENCRYPT)) != CRYPT_OK) {
1358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\nCCM error... %s\n", error_to_string(err));
1359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "CCM (precomp) \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cipher_descriptor[cipher_idx].done(&skey);
1366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef GCM_MODE
1369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 100; x++) {
1371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_memory(cipher_idx, key, 16, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, GCM_ENCRYPT)) != CRYPT_OK) {
1375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(stderr, "\nGCM error... %s\n", error_to_string(err));
1376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "GCM (no-precomp)\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   {
1384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   gcm_state gcm
1385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef GCM_TABLES_SSE2
1386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project__attribute__ ((aligned (16)))
1387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project;
1389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = gcm_init(&gcm, cipher_idx, key, 16)) != CRYPT_OK) { fprintf(stderr, "gcm_init: %s\n", error_to_string(err)); exit(EXIT_FAILURE); }
1391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t2 = -1;
1392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 10000; x++) {
1393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t_start();
1394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read();
1395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        z = 16;
1396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_reset(&gcm)) != CRYPT_OK) {
1397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err));
1398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_add_iv(&gcm, IV, 16)) != CRYPT_OK) {
1401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err));
1402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_add_aad(&gcm, NULL, 0)) != CRYPT_OK) {
1405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err));
1406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_process(&gcm, buf, MAC_SIZE*1024, buf, GCM_ENCRYPT)) != CRYPT_OK) {
1409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err));
1410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = gcm_done(&gcm, tag, &z)) != CRYPT_OK) {
1414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err));
1415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           exit(EXIT_FAILURE);
1416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
1417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        t1 = t_read() - t1;
1418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (t1 < t2) t2 = t1;
1419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fprintf(stderr, "GCM (precomp)\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024));
1421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
1422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
1424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
1426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid time_encmacs(void)
1428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
1429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_encmacs_(1);
1430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_encmacs_(4);
1431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   time_encmacs_(32);
1432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
1433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
1434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/testprof/x86_prof.c,v $ */
1435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.51 $ */
1436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/21 00:10:18 $ */
1437