/ src / crypto / ctaes / bench.c
bench.c
  1  #include <stdio.h>
  2  #include <math.h>
  3  #include "sys/time.h"
  4  
  5  #include "ctaes.h"
  6  
  7  static double gettimedouble(void) {
  8      struct timeval tv;
  9      gettimeofday(&tv, NULL);
 10      return tv.tv_usec * 0.000001 + tv.tv_sec;
 11  }
 12  
 13  static void print_number(double x) {
 14      double y = x;
 15      int c = 0;
 16      if (y < 0.0) {
 17          y = -y;
 18      }
 19      while (y < 100.0) {
 20          y *= 10.0;
 21          c++;
 22      }
 23      printf("%.*f", c, x);
 24  }
 25  
 26  static void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) {
 27      int i;
 28      double min = HUGE_VAL;
 29      double sum = 0.0;
 30      double max = 0.0;
 31      for (i = 0; i < count; i++) {
 32          double begin, total;
 33          if (setup != NULL) {
 34              setup(data);
 35          }
 36          begin = gettimedouble();
 37          benchmark(data);
 38          total = gettimedouble() - begin;
 39          if (teardown != NULL) {
 40              teardown(data);
 41          }
 42          if (total < min) {
 43              min = total;
 44          }
 45          if (total > max) {
 46              max = total;
 47          }
 48          sum += total;
 49      }
 50      printf("%s: min ", name);
 51      print_number(min * 1000000000.0 / iter);
 52      printf("ns / avg ");
 53      print_number((sum / count) * 1000000000.0 / iter);
 54      printf("ns / max ");
 55      print_number(max * 1000000000.0 / iter);
 56      printf("ns\n");
 57  }
 58  
 59  static void bench_AES128_init(void* data) {
 60      AES128_ctx* ctx = (AES128_ctx*)data;
 61      int i;
 62      for (i = 0; i < 50000; i++) {
 63          AES128_init(ctx, (unsigned char*)ctx);
 64      }
 65  }
 66  
 67  static void bench_AES128_encrypt_setup(void* data) {
 68      AES128_ctx* ctx = (AES128_ctx*)data;
 69      static const unsigned char key[16] = {0};
 70      AES128_init(ctx, key);
 71  }
 72  
 73  static void bench_AES128_encrypt(void* data) {
 74      const AES128_ctx* ctx = (const AES128_ctx*)data;
 75      unsigned char scratch[16] = {0};
 76      int i;
 77      for (i = 0; i < 4000000 / 16; i++) {
 78          AES128_encrypt(ctx, 1, scratch, scratch);
 79      }
 80  }
 81  
 82  static void bench_AES128_decrypt(void* data) {
 83      const AES128_ctx* ctx = (const AES128_ctx*)data;
 84      unsigned char scratch[16] = {0};
 85      int i;
 86      for (i = 0; i < 4000000 / 16; i++) {
 87          AES128_decrypt(ctx, 1, scratch, scratch);
 88      }
 89  }
 90  
 91  static void bench_AES192_init(void* data) {
 92      AES192_ctx* ctx = (AES192_ctx*)data;
 93      int i;
 94      for (i = 0; i < 50000; i++) {
 95          AES192_init(ctx, (unsigned char*)ctx);
 96      }
 97  }
 98  
 99  static void bench_AES192_encrypt_setup(void* data) {
100      AES192_ctx* ctx = (AES192_ctx*)data;
101      static const unsigned char key[16] = {0};
102      AES192_init(ctx, key);
103  }
104  
105  static void bench_AES192_encrypt(void* data) {
106      const AES192_ctx* ctx = (const AES192_ctx*)data;
107      unsigned char scratch[16] = {0};
108      int i;
109      for (i = 0; i < 4000000 / 16; i++) {
110          AES192_encrypt(ctx, 1, scratch, scratch);
111      }
112  }
113  
114  static void bench_AES192_decrypt(void* data) {
115      const AES192_ctx* ctx = (const AES192_ctx*)data;
116      unsigned char scratch[16] = {0};
117      int i;
118      for (i = 0; i < 4000000 / 16; i++) {
119          AES192_decrypt(ctx, 1, scratch, scratch);
120      }
121  }
122  
123  static void bench_AES256_init(void* data) {
124      AES256_ctx* ctx = (AES256_ctx*)data;
125      int i;
126      for (i = 0; i < 50000; i++) {
127          AES256_init(ctx, (unsigned char*)ctx);
128      }
129  }
130  
131  
132  static void bench_AES256_encrypt_setup(void* data) {
133      AES256_ctx* ctx = (AES256_ctx*)data;
134      static const unsigned char key[16] = {0};
135      AES256_init(ctx, key);
136  }
137  
138  static void bench_AES256_encrypt(void* data) {
139      const AES256_ctx* ctx = (const AES256_ctx*)data;
140      unsigned char scratch[16] = {0};
141      int i;
142      for (i = 0; i < 4000000 / 16; i++) {
143          AES256_encrypt(ctx, 1, scratch, scratch);
144      }
145  }
146  
147  static void bench_AES256_decrypt(void* data) {
148      const AES256_ctx* ctx = (const AES256_ctx*)data;
149      unsigned char scratch[16] = {0};
150      int i;
151      for (i = 0; i < 4000000 / 16; i++) {
152          AES256_decrypt(ctx, 1, scratch, scratch);
153      }
154  }
155  
156  int main(void) {
157      AES128_ctx ctx128;
158      AES192_ctx ctx192;
159      AES256_ctx ctx256;
160      run_benchmark("aes128_init", bench_AES128_init, NULL, NULL, &ctx128, 20, 50000);
161      run_benchmark("aes128_encrypt_byte", bench_AES128_encrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
162      run_benchmark("aes128_decrypt_byte", bench_AES128_decrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
163      run_benchmark("aes192_init", bench_AES192_init, NULL, NULL, &ctx192, 20, 50000);
164      run_benchmark("aes192_encrypt_byte", bench_AES192_encrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
165      run_benchmark("aes192_decrypt_byte", bench_AES192_decrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
166      run_benchmark("aes256_init", bench_AES256_init, NULL, NULL, &ctx256, 20, 50000);
167      run_benchmark("aes256_encrypt_byte", bench_AES256_encrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
168      run_benchmark("aes256_decrypt_byte", bench_AES256_decrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
169      return 0;
170  }