status update, probably last commit
[rofl0r-kripto.git] / perf / block.c
blob6629cc9b990bbc79beaea76979a49292af185c76
1 /*
2 * Written in 2013 by Gregor Pintar <grpintar@gmail.com>
4 * To the extent possible under law, the author(s) have dedicated
5 * all copyright and related and neighboring rights to this software
6 * to the public domain worldwide.
7 *
8 * This software is distributed without any warranty.
10 * You should have received a copy of the CC0 Public Domain Dedication.
11 * If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
14 /* gcc -Wall -Wextra -std=c99 -pedantic perf/block.c -Iinclude lib/libkripto.a -O2 -DPERF_UNIX -D_GNU_SOURCE */
15 /* gcc -Wall -Wextra -std=c99 -pedantic perf/block.c -Iinclude lib/libkripto.a -O2 -DPERF_WINDOWS /lib/w32api/libpowrprof.a */
17 #include <stdint.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <stdlib.h>
22 #include <kripto/block.h>
24 #include <kripto/block/3way.h>
25 #include <kripto/block/anubis.h>
26 #include <kripto/block/aria.h>
27 #include <kripto/block/blowfish.h>
28 #include <kripto/block/camellia.h>
29 #include <kripto/block/cast5.h>
30 #include <kripto/block/des.h>
31 #include <kripto/block/gost.h>
32 #include <kripto/block/idea.h>
33 #include <kripto/block/khazad.h>
34 #include <kripto/block/mars.h>
35 #include <kripto/block/noekeon.h>
36 #include <kripto/block/rc2.h>
37 #include <kripto/block/rc5.h>
38 #include <kripto/block/rc5_64.h>
39 #include <kripto/block/rc6.h>
40 #include <kripto/block/rijndael128.h>
41 #include <kripto/block/rijndael256.h>
42 #include <kripto/block/safer.h>
43 #include <kripto/block/safer_sk.h>
44 #include <kripto/block/seed.h>
45 #include <kripto/block/serpent.h>
46 #include <kripto/block/simon32.h>
47 #include <kripto/block/simon64.h>
48 #include <kripto/block/simon128.h>
49 #include <kripto/block/skipjack.h>
50 #include <kripto/block/speck32.h>
51 #include <kripto/block/speck64.h>
52 #include <kripto/block/speck128.h>
53 #include <kripto/block/tea.h>
54 #include <kripto/block/threefish256.h>
55 #include <kripto/block/threefish512.h>
56 #include <kripto/block/threefish1024.h>
57 #include <kripto/block/twofish.h>
58 #include <kripto/block/xtea.h>
60 #include "perf.h"
62 #ifndef KEYSTEP
63 #define KEYSTEP 4
64 #endif
66 #define MAXBLOCK 255
67 #define MAXKEY 32
69 static void die(const char *str)
71 perror(str);
72 exit(-1);
75 int main(void)
77 kripto_block *s;
78 unsigned int n;
79 unsigned int cipher;
80 unsigned int maxkey;
81 uint8_t t[MAXBLOCK];
82 const uint8_t k[MAXKEY] =
84 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
85 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
86 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
87 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
89 perf_int cycles;
90 struct
92 const char *name;
93 const kripto_block_desc *desc;
94 } ciphers[35] =
96 {"3-Way", kripto_block_3way},
97 {"Anubis", kripto_block_anubis},
98 {"ARIA", kripto_block_aria},
99 {"Blowfish", kripto_block_blowfish},
100 {"Camellia", kripto_block_camellia},
101 {"CAST5", kripto_block_cast5},
102 {"DES", kripto_block_des},
103 {"GOST", kripto_block_gost},
104 {"IDEA", kripto_block_idea},
105 {"KHAZAD", kripto_block_khazad},
106 {"MARS", kripto_block_mars},
107 {"Noekeon", kripto_block_noekeon},
108 {"RC2", kripto_block_rc2},
109 {"RC5", kripto_block_rc5},
110 {"RC5/64", kripto_block_rc5_64},
111 {"RC6", kripto_block_rc6},
112 {"Rijndael-128", kripto_block_rijndael128},
113 {"Rijndael-256", kripto_block_rijndael256},
114 {"SAFER", kripto_block_safer},
115 {"SAFER-SK", kripto_block_safer_sk},
116 {"SEED", kripto_block_seed},
117 {"Serpent", kripto_block_serpent},
118 {"Simon32", kripto_block_simon32},
119 {"Simon64", kripto_block_simon64},
120 {"Simon128", kripto_block_simon128},
121 {"Skipjack", kripto_block_skipjack},
122 {"Speck32", kripto_block_speck32},
123 {"Speck64", kripto_block_speck64},
124 {"Speck128", kripto_block_speck128},
125 {"TEA", kripto_block_tea},
126 {"Threefish-256", kripto_block_threefish256},
127 {"Threefish-512", kripto_block_threefish512},
128 {"Threefish-1024", kripto_block_threefish1024},
129 {"Twofish", kripto_block_twofish},
130 {"XTEA", kripto_block_xtea}
133 memset(t, 0, MAXBLOCK);
135 perf_init();
137 for(cipher = 0; cipher < 35; cipher++)
139 if(!ciphers[cipher].desc) continue;
141 maxkey = kripto_block_maxkey(ciphers[cipher].desc);
142 if(maxkey > MAXKEY) maxkey = MAXKEY;
144 for(n = KEYSTEP; n <= maxkey; n += KEYSTEP)
146 s = kripto_block_create(ciphers[cipher].desc, 0, k, n);
147 if(!s) die("kripto_block_create()");
149 /* setup */
150 PERF_START
151 s = kripto_block_recreate(s, 0, k, n);
152 if(!s) die("kripto_block_recreate()");
153 PERF_STOP
155 printf("%s %u-bit setup: %lu cycles\n",
156 ciphers[cipher].name, n * 8, cycles);
158 /* encrypt */
159 PERF_START
160 kripto_block_encrypt(s, t, t);
161 PERF_STOP
163 printf("%s %u-bit encrypt: %.1f cpb\n",
164 ciphers[cipher].name, n * 8,
165 cycles / (float)kripto_block_size(ciphers[cipher].desc));
167 /* decrypt */
168 PERF_START
169 kripto_block_decrypt(s, t, t);
170 PERF_STOP
172 printf("%s %u-bit decrypt: %.1f cpb\n",
173 ciphers[cipher].name, n * 8,
174 cycles / (float)kripto_block_size(ciphers[cipher].desc));
176 kripto_block_destroy(s);
178 perf_rest();
179 fflush(stdout);
181 putchar('\n');
185 return 0;