chiark / gitweb /
catacomb-python.h: Don't inhibit 64-bit type detection any more.
[catacomb-python] / algorithms.py
1 ## -*-python-*-
2
3 def cross(*seq):
4   if not len(seq):
5     return [(),]
6   x = seq[0]
7   if type(x) is not tuple and type(x) is not list:
8     x = x,
9   r = []
10   for i in x:
11     for j in cross(*seq[1:]):
12       r.append((i,) + j)
13   return r
14
15 prps = '''
16 des desx des3 mars
17 idea safer safersk
18 blowfish twofish
19 tea xtea
20 rc2 rc5
21 skipjack
22 cast128 cast256
23 square rijndael rijndael192 rijndael256
24 serpent noekeon
25 '''.split()
26 pmodes = '''
27 ecb cbc cfb ofb counter
28 '''.split()
29 streamciphers = '''
30 rc4 seal
31 '''.split()
32 latindances = '''
33 salsa20 salsa20/12 salsa20/8 xsalsa20 xsalsa20/12 xsalsa20/8
34 chacha20 chacha12 chacha8 xchacha20 xchacha12 xchacha8
35 '''.split()
36 streamciphers += map(lambda s: s.translate(None, '/'), latindances)
37 hashes = '''
38 md2 md4 md5 tiger has160
39 sha sha224 sha256 sha384 sha512
40 rmd128 rmd160 rmd256 rmd320
41 whirlpool whirlpool256
42 '''.split()
43 hmodes = '''
44 mgf hmac
45 '''.split()
46
47 print '/* algorithms.h [generated] */'
48 print
49
50 for i in prps:
51   print '#include <catacomb/%s.h>' % i
52   for j in pmodes:
53     print '#include <catacomb/%s-%s.h>' % (i, j)
54 for i in streamciphers:
55   print '#include <catacomb/%s.h>' % i
56 print
57 for i in hashes:
58   print '#include <catacomb/%s.h>' % i
59   for j in hmodes:
60     print '#include <catacomb/%s-%s.h>' % (i, j)
61 print
62
63 print '#define PRPS(_) \\'
64 for i in prps:
65   print '\t_(%s, %s) \\' % (i.upper(), i)
66 print '\t/* end */'
67 print
68
69 print '#define RNGS(_) \\'
70 for i in (cross(prps, ['ofb', 'counter'])):
71   print ('\t_("%(prim)s-%(mode)s", %(prim)s_keysz, ' +
72          '%(prim)s_%(mode)srand, 0, 0) \\') % \
73          {'prim': i[0], 'mode': i[1]}
74 for i in (cross(hashes, 'mgf')):
75   print ('\t_("%(prim)s-%(mode)s", %(prim)s_%(mode)skeysz, ' +
76          '%(prim)s_%(mode)srand, 0, 0) \\') % \
77          {'prim': i[0], 'mode': i[1]}
78 print '\t_("rc4", rc4_keysz, rc4_rand, 0, 0) \\'
79 print '\t_("seal", seal_keysz, seal_rand, RNGF_INT, 0) \\'
80 for i in latindances:
81   for r in ['salsa20', 'xsalsa20', 'chacha', 'xchacha']:
82     if i.startswith(r):
83       root = r
84       break
85   else:
86     raise ValueError, 'failed to find root name for %s' % i
87   print ('\t_("%(name)s", %(root)s_keysz, %(id)s_rand, ' +
88          'RNGF_NONCE, %(ROOT)s_NONCESZ) \\') % \
89       {'name': i, 'id': i.translate(None, '/'),
90        'root': root, 'ROOT': root.upper()}
91 print '\t/* end */'
92 print