Generate precomputed tables as sources in `precomps/'.
[u/mdw/catacomb] / symm / Makefile.am
1 ### -*-makefile-*-
2 ###
3 ### Build script for symmetric cryptography
4 ###
5 ### (c) 2013 Straylight/Edgeware
6 ###
7
8 ###----- Licensing notice ---------------------------------------------------
9 ###
10 ### This file is part of Catacomb.
11 ###
12 ### Catacomb is free software; you can redistribute it and/or modify
13 ### it under the terms of the GNU Library General Public License as
14 ### published by the Free Software Foundation; either version 2 of the
15 ### License, or (at your option) any later version.
16 ###
17 ### Catacomb is distributed in the hope that it will be useful,
18 ### but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ### GNU Library General Public License for more details.
21 ###
22 ### You should have received a copy of the GNU Library General Public
23 ### License along with Catacomb; if not, write to the Free
24 ### Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 ### MA 02111-1307, USA.
26
27 include $(top_srcdir)/vars.am
28
29 noinst_LTLIBRARIES = libsymm.la
30 libsymm_la_SOURCES =
31 nodist_libsymm_la_SOURCES =
32
33 TEST_LIBS = libsymm.la
34
35 VPATH += $(srcdir)/modes
36
37 ###--------------------------------------------------------------------------
38 ### Autogenerated lists.
39
40 ## Fancy template substitutions.
41 multigen = $(PYTHON) $(srcdir)/multigen
42 EXTRA_DIST += multigen
43
44 ## The heart of this is an enormous cross-product of crypto primitives and
45 ## the corresponding modes of operation. Rather than write it out longhand,
46 ## we generate it using `multigen'. Unfortunately, this needs to be done
47 ## at the Automake level, which causes some interesting bootstrapping
48 ## problems.
49 include modes.am
50
51 EXTRA_DIST += modes.am.in modes.am
52 MAINTAINERCLEANFILES += $(srcdir)/modes.am
53
54 ## Generate the lists.
55 $(srcdir)/modes.am: modes.am.in
56 $(AM_V_GEN)$(multigen) -g $(srcdir)/modes.am.in $(srcdir)/modes.am \
57 blkc="$(BLKCS)" \
58 blkcmode="$(BLKCMODES)" \
59 blkcciphermode="$(BLKCCIPHERMODES)" \
60 hash="$(HASHES)" \
61 hashmode="$(HASHMODES)" \
62 hashciphermode="$(HASHCIPHERMODES)" \
63 hashmacmode="$(HASHMACMODES)"
64
65 ## Initialize lists of known classes.
66 ALL_CIPHERS = $(CIPHER_MODES)
67 ALL_HASHES = $(HASHES)
68 ALL_MACS = $(MAC_MODES)
69
70 ###--------------------------------------------------------------------------
71 ### Block ciphers.
72
73 BLKCS =
74 BLKCMODES =
75
76 BLKCCIPHERMODES =
77 BLKCMODES += $(BLKCCIPHERMODES)
78
79 ## A tool for translating the AES-contest test vectors into a form our test
80 ## rigs understand.
81 EXTRA_DIST += aes-trans
82
83 ## Block cipher utility macros, mainly used in mode implementations.
84 pkginclude_HEADERS += blkc.h
85
86 ## Source code and headers for the block ciphers.
87 libsymm_la_SOURCES += $(BLKC_C)
88 pkginclude_HEADERS += $(BLKC_H)
89
90 ## Schneier's `Blowfish' block cipher.
91 BLKCS += blowfish
92 libsymm_la_SOURCES += $(precomp)/blowfish-tab.c
93 PRECOMPS += $(precomp)/blowfish-tab.c
94 PRECOMP_PROGS += blowfish-mktab
95 blowfish_mktab_CPPFLAGS = $(AM_CPPFLAGS) -DQUIET
96 if !CROSS_COMPILING
97 $(precomp)/blowfish-tab.c:
98 $(AM_V_at)$(MKDIR_P) $(precomp)
99 $(AM_V_at)$(MAKE) blowfish-mktab$e
100 $(AM_V_GEN)./blowfish-mktab >$(precomp)/blowfish-tab.c.new && \
101 mv $(precomp)/blowfish-tab.c.new $(precomp)/blowfish-tab.c
102 endif
103
104 ## Adams and Tavares' `CAST' block ciphers.
105 BLKCS += cast128 cast256
106 libsymm_la_SOURCES += cast-s.c cast-sk.c cast-base.h
107 cast256.$t: t/cast256
108 EXTRA_DIST += t/cast256.aes
109 MAINTAINERCLEANFILES += $(srcdir)/t/cast256
110 t/cast256: t/cast256.aes
111 $(AM_V_GEN)$(srcdir)/aes-trans CAST256 \
112 <$(srcdir)/t/cast256.aes \
113 >$(srcdir)/t/cast256.new && \
114 mv $(srcdir)/t/cast256.new $(srcdir)/t/cast256
115
116 ## IBM's `DES' block cipher, by Feistel, Coppersmith, and others.
117 BLKCS += des des3
118 libsymm_la_SOURCES += des-base.h $(precomp)/des-tab.c
119 PRECOMPS += $(precomp)/des-tab.c
120 PRECOMP_PROGS += des-mktab
121 if !CROSS_COMPILING
122 $(precomp)/des-tab.c:
123 $(AM_V_at)$(MKDIR_P) $(precomp)
124 $(AM_V_at)$(MAKE) des-mktab$e
125 $(AM_V_GEN)./des-mktab >$(precomp)/des-tab.c.new && \
126 mv $(precomp)/des-tab.c.new $(precomp)/des-tab.c
127 endif
128
129 ## Rivest's `DESX' variant, with pre- and post-whitening.
130 BLKCS += desx
131 libsymm_la_SOURCES += desx-tab.c
132
133 ## Lai and Massey's IDEA.
134 BLKCS += idea
135
136 ## IBM's `MARS' block cipher.
137 BLKCS += mars
138 libsymm_la_SOURCES += $(precomp)/mars-tab.c
139 PRECOMPS += $(precomp)/mars-tab.c
140 PRECOMP_PROGS += mars-mktab
141 if !CROSS_COMPILING
142 $(precomp)/mars-tab.c:
143 $(AM_V_at)$(MKDIR_P) $(precomp)
144 $(AM_V_at)$(MAKE) mars-mktab$e
145 $(AM_V_GEN)./mars-mktab >$(precomp)/mars-tab.c.new && \
146 mv $(precomp)/mars-tab.c.new $(precomp)/mars-tab.c
147 endif
148 mars.$t: t/mars
149 EXTRA_DIST += t/mars.aes
150 MAINTAINERCLEANFILES += $(srcdir)/t/mars
151 t/mars: t/mars.aes
152 $(AM_V_GEN)$(srcdir)/aes-trans Mars \
153 <$(srcdir)/t/mars.aes \
154 >$(srcdir)/t/mars.new && \
155 mv $(srcdir)/t/mars.new $(srcdir)/t/mars
156
157 ## Daemen, Peeters, Van Assche and Rijmen's `Noekeon'.
158 BLKCS += noekeon
159
160 ## Rivest's `RC2' block cipher.
161 BLKCS += rc2
162 libsymm_la_SOURCES += rc2-tab.c
163
164 ## Rivest's `RC5'.
165 BLKCS += rc5
166
167 ## Daemen and Rijmen's `Rijndael' block cipher, selected as AES.
168 BLKCS += rijndael rijndael192 rijndael256
169 libsymm_la_SOURCES += rijndael-base.h rijndael-base.c
170 libsymm_la_SOURCES += $(precomp)/rijndael-tab.c
171 PRECOMPS += $(precomp)/rijndael-tab.c
172 PRECOMP_PROGS += rijndael-mktab
173 if !CROSS_COMPILING
174 $(precomp)/rijndael-tab.c:
175 $(AM_V_at)$(MKDIR_P) $(precomp)
176 $(AM_V_at)$(MAKE) rijndael-mktab$e
177 $(AM_V_GEN)./rijndael-mktab >$(precomp)/rijndael-tab.c.new && \
178 mv $(precomp)/rijndael-tab.c.new $(precomp)/rijndael-tab.c
179 endif
180 rijndael.$t: t/rijndael
181 EXTRA_DIST += t/rijndael.aes
182 MAINTAINERCLEANFILES += $(srcdir)/t/rijndael
183 t/rijndael: t/rijndael.aes
184 $(AM_V_GEN)$(srcdir)/aes-trans Rijndael \
185 <$(srcdir)/t/rijndael.aes \
186 >$(srcdir)/t/rijndael.new && \
187 mv $(srcdir)/t/rijndael.new $(srcdir)/t/rijndael
188
189 ## Massey's `SAFER' block ciphers.
190 BLKCS += safer safersk
191 libsymm_la_SOURCES += $(precomp)/safer-tab.c
192 PRECOMPS += $(precomp)/safer-tab.c
193 PRECOMP_PROGS += safer-mktab
194 if !CROSS_COMPILING
195 $(precomp)/safer-tab.c:
196 $(AM_V_at)$(MKDIR_P) $(precomp)
197 $(AM_V_at)$(MAKE) safer-mktab$e
198 $(AM_V_GEN)./safer-mktab >$(precomp)/safer-tab.c.new && \
199 mv $(precomp)/safer-tab.c.new $(precomp)/safer-tab.c
200 endif
201
202 ## Anderson, Biham and Knudsen's `Serpent' block cipher.
203 BLKCS += serpent
204 libsymm_la_SOURCES += serpent-sbox.h
205 check_PROGRAMS += serpent-check
206 TESTS += serpent-check
207 serpent.$t: t/serpent
208 EXTRA_DIST += t/serpent.aes
209 MAINTAINERCLEANFILES += $(srcdir)/t/serpent
210 t/serpent: t/serpent.aes
211 $(AM_V_GEN)$(srcdir)/aes-trans Serpent -v rev=1 \
212 <$(srcdir)/t/serpent.aes \
213 >$(srcdir)/t/serpent.new && \
214 mv $(srcdir)/t/serpent.new $(srcdir)/t/serpent
215
216 ## The National Security Agency's `Skipjack' block cipher. You don't want to
217 ## use this.
218 BLKCS += skipjack
219 libsymm_la_SOURCES += skipjack-tab.c
220
221 ## Daemen and Rijmen's `Square' block cipher.
222 BLKCS += square
223 libsymm_la_SOURCES += $(precomp)/square-tab.c
224 PRECOMPS += $(precomp)/square-tab.c
225 PRECOMP_PROGS += square-mktab
226 if !CROSS_COMPILING
227 $(precomp)/square-tab.c:
228 $(AM_V_at)$(MKDIR_P) $(precomp)
229 $(AM_V_at)$(MAKE) square-mktab$e
230 $(AM_V_GEN)./square-mktab >$(precomp)/square-tab.c.new && \
231 mv $(precomp)/square-tab.c.new $(precomp)/square-tab.c
232 endif
233
234 ## Wheeler and Needham's `TEA' and `XTEA' block ciphers.
235 BLKCS += tea xtea
236
237 ## Schneier, Kelsey, Whiting, Wagner, Hall and Ferguson's `Twofish' block
238 ## cipher.
239 BLKCS += twofish
240 libsymm_la_SOURCES += $(precomp)/twofish-tab.c
241 PRECOMPS += $(precomp)/twofish-tab.c
242 PRECOMP_PROGS += twofish-mktab
243 if !CROSS_COMPILING
244 $(precomp)/twofish-tab.c:
245 $(AM_V_at)$(MKDIR_P) $(precomp)
246 $(AM_V_at)$(MAKE) twofish-mktab$e
247 $(AM_V_GEN)./twofish-mktab >$(precomp)/twofish-tab.c.new && \
248 mv $(precomp)/twofish-tab.c.new $(precomp)/twofish-tab.c
249 endif
250 twofish.$t: t/twofish
251 EXTRA_DIST += t/twofish.aes
252 MAINTAINERCLEANFILES += $(srcdir)/t/twofish
253 t/twofish: t/twofish.aes
254 $(AM_V_GEN)$(srcdir)/aes-trans Twofish \
255 <$(srcdir)/t/twofish.aes \
256 >$(srcdir)/t/twofish.new && \
257 mv $(srcdir)/t/twofish.new $(srcdir)/t/twofish
258
259 ## The old NIST modes for DES.
260 BLKCCIPHERMODES += cbc cfb ecb ofb
261
262 ## Counter mode.
263 BLKCCIPHERMODES += counter
264
265 ###--------------------------------------------------------------------------
266 ### Hash functions.
267
268 HASHES =
269 HASHMODES =
270
271 HASHCIPHERMODES =
272 HASHMODES += $(HASHCIPHERMODES)
273
274 HASHMACMODES =
275 HASHMODES += $(HASHMACMODES)
276
277 ## Common definitions for hash functions.
278 pkginclude_HEADERS += hash.h
279
280 ## Source code and headers for the hash functions.
281 libsymm_la_SOURCES += $(HASH_C)
282 pkginclude_HEADERS += $(HASH_H)
283
284 ## Lim and KISA's `HAS-160', recommended for use with KCDSA.
285 HASHES += has160
286
287 ## Rivest's `MD' series of hash functions
288 HASHES += md2 md4 md5
289 libsymm_la_SOURCES += md2-tab.c
290
291 ## Dobbertin, Bosselaers and Preneel's `RIPEMD' suite.
292 HASHES += rmd128 rmd160 rmd256 rmd320
293
294 ## The National Security Agency's `SHA-1' hash function.
295 HASHES += sha
296
297 ## The National Security Agency's `SHA-2' suite.
298 HASHES += sha224 sha256
299 HASHES += sha384 sha512
300
301 ## Anderson and Biham's `Tiger' hash function.
302 HASHES += tiger
303 libsymm_la_SOURCES += tiger-base.h $(precomp)/tiger-tab.c
304 PRECOMPS += $(precomp)/tiger-tab.c
305 PRECOMP_PROGS += tiger-mktab
306 if !CROSS_COMPILING
307 $(precomp)/tiger-tab.c:
308 $(AM_V_at)$(MKDIR_P) $(precomp)
309 $(AM_V_at)$(MAKE) tiger-mktab$e
310 $(AM_V_GEN)./tiger-mktab >$(precomp)/tiger-tab.c.new && \
311 mv $(precomp)/tiger-tab.c.new $(precomp)/tiger-tab.c
312 endif
313
314 ## Barreto and Rijmen's `Whirlpool' hash function.
315 HASHES += whirlpool whirlpool256
316 libsymm_la_SOURCES += $(precomp)/whirlpool-tab.c
317 PRECOMPS += $(precomp)/whirlpool-tab.c
318 PRECOMP_PROGS += whirlpool-mktab
319 if !CROSS_COMPILING
320 $(precomp)/whirlpool-tab.c:
321 $(AM_V_at)$(MKDIR_P) $(precomp)
322 $(AM_V_at)$(MAKE) whirlpool-mktab$e
323 $(AM_V_GEN)./whirlpool-mktab >$(precomp)/whirlpool-tab.c.new && \
324 mv $(precomp)/whirlpool-tab.c.new $(precomp)/whirlpool-tab.c
325 endif
326
327 ## Bellare, Canetti and Krawczyk's `HMAC' mode for message authentication.
328 HASHMACMODES += hmac
329
330 ## MGF1, used in OAEP and PSS.
331 HASHCIPHERMODES += mgf
332
333 ###--------------------------------------------------------------------------
334 ### Other symmetric primitives.
335
336 ## The CRC32 algorithm, which is useful, but has no worthwhile security.
337 pkginclude_HEADERS += crc32.h
338 libsymm_la_SOURCES += crc32.c
339 ALL_HASHES += crc32=gcrc32
340
341 ## Rivest's `RC4' stream cipher.
342 pkginclude_HEADERS += rc4.h
343 libsymm_la_SOURCES += rc4.c
344 TESTS += rc4.$t
345 EXTRA_DIST += t/rc4
346 ALL_CIPHERS += rc4
347
348 ## Coppersmith and Rogaway's `SEAL' pseudorandom function.
349 pkginclude_HEADERS += seal.h
350 libsymm_la_SOURCES += seal.c
351 TESTS += seal.$t
352 EXTRA_DIST += t/seal
353 ALL_CIPHERS += seal
354
355 ###--------------------------------------------------------------------------
356 ### Autogenerated mode implementations.
357
358 ## The master stamp file, indicating that we generated all of the sources.
359 EXTRA_DIST += mode.h.in mode.c.in
360 EXTRA_DIST += modes/gen-stamp
361 MAINTAINERCLEANFILES += modes/gen-stamp
362 modes/gen-stamp:
363 $(AM_V_at)$(MKDIR_P) $(srcdir)/modes
364 $(AM_V_GEN)$(multigen) -g $(srcdir)/mode.c.in \
365 $(srcdir)/modes/@base-@mode.c \
366 base="$(BLKCS)" mode="$(BLKCMODES)"
367 $(AM_V_at)$(multigen) -g $(srcdir)/mode.h.in \
368 $(srcdir)/modes/@base-@mode.h \
369 base="$(BLKCS)" mode="$(BLKCMODES)"
370 $(AM_V_at)$(multigen) -g $(srcdir)/mode.c.in \
371 $(srcdir)/modes/@base-@mode.c \
372 base="$(HASHES)" mode="$(HASHMODES)"
373 $(AM_V_at)$(multigen) -g $(srcdir)/mode.h.in \
374 $(srcdir)/modes/@base-@mode.h \
375 base="$(HASHES)" mode="$(HASHMODES)"
376 $(AM_V_at)touch $(srcdir)/modes/gen-stamp
377
378 ## The individual mode interfaces and implementations.
379 pkginclude_HEADERS += $(MODE_H)
380
381 ## Generated implementations.
382 BUILT_SOURCES += $(GENMODES_C)
383 EXTRA_DIST += $(GENMODES_C)
384 MAINTAINERCLEANFILES += $(GENMODES_C)
385 nodist_libsymm_la_SOURCES += $(GENMODES_C)
386 $(GENMODES_C): modes/gen-stamp
387
388 ## Generated interfaces.
389 BUILT_SOURCES += $(GENMODES_H)
390 EXTRA_DIST += $(GENMODES_H)
391 MAINTAINERCLEANFILES += $(GENMODES_H)
392 nodist_pkginclude_HEADERS += $(GENMODES_H)
393 $(GENMODES_H): modes/gen-stamp
394
395 ###--------------------------------------------------------------------------
396 ### Tables of classes for encryption, hashing, and message authentication.
397
398 ## The skeleton for the class tables.
399 EXTRA_DIST += gthingtab.c.in
400
401 ## Table of cipher classes.
402 pkginclude_HEADERS += gcipher.h
403 CLEANFILES += gciphertab.c
404 nodist_libsymm_la_SOURCES += gciphertab.c
405 gciphertab.c: gthingtab.c.in
406 $(AM_V_GEN)$(multigen) -g $(srcdir)/gthingtab.c.in gciphertab.c \
407 what=gcipher cls=gccipher thing="$(ALL_CIPHERS)"
408
409 ## Table of hash classes.
410 pkginclude_HEADERS += ghash.h ghash-def.h
411 CLEANFILES += ghashtab.c
412 nodist_libsymm_la_SOURCES += ghashtab.c
413 ghashtab.c: gthingtab.c.in
414 $(AM_V_GEN)$(multigen) -g $(srcdir)/gthingtab.c.in ghashtab.c \
415 what=ghash cls=gchash thing="$(ALL_HASHES)"
416
417 ## Table of MAC classes.
418 pkginclude_HEADERS += gmac.h
419 CLEANFILES += gmactab.c
420 nodist_libsymm_la_SOURCES += gmactab.c
421 gmactab.c: gthingtab.c.in
422 $(AM_V_GEN)$(multigen) -g $(srcdir)/gthingtab.c.in gmactab.c \
423 what=gmac cls=gcmac thing="$(ALL_MACS)"
424
425 ###--------------------------------------------------------------------------
426 ### Testing.
427
428 ## Run the test programs.
429 TESTS += $(SYMM_TESTS)
430 EXTRA_DIST += $(SYMM_TEST_FILES)
431
432 ## A piece of sample text for round-trip testing encryption modes.
433 EXTRA_DIST += daftstory.h
434
435 ## Clean the debris from the `modes' subdirectory.
436 CLEANFILES += modes/*.to modes/*.$t
437
438 ###----- That's all, folks --------------------------------------------------