chiark / gitweb /
.gdbinit: Delete this obsolete file.
[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 cmac pmac1
29 ccm eax gcm ocb1 ocb3
30 '''.split()
31 streamciphers = '''
32 rc4 seal
33 '''.split()
34 latindances = '''
35 salsa20 salsa20/12 salsa20/8
36 salsa20-ietf salsa20/12-ietf salsa20/8-ietf
37 xsalsa20 xsalsa20/12 xsalsa20/8
38 chacha20 chacha12 chacha8
39 chacha20-ietf chacha12-ietf chacha8-ietf
40 xchacha20 xchacha12 xchacha8
41 '''.split()
42 streamciphers += map(lambda s: s.replace('/', ''), latindances)
43 hashes = '''
44 md2 md4 md5 tiger has160
45 sha sha224 sha256 sha512/224 sha512/256 sha384 sha512
46 rmd128 rmd160 rmd256 rmd320
47 whirlpool whirlpool256
48 sha3-224 sha3-256 sha3-384 sha3-512
49 '''.split()
50 hmodes = '''
51 mgf hmac
52 '''.split()
53
54 print '/* algorithms.h [generated] */'
55 print
56
57 for i in prps:
58   print '#include <catacomb/%s.h>' % i.replace('/', '-')
59   for j in pmodes:
60     print '#include <catacomb/%s-%s.h>' % (i.replace('/', '-'), j)
61 for i in streamciphers:
62   print '#include <catacomb/%s.h>' % i.replace('/', '-')
63 print
64 for i in hashes:
65   print '#include <catacomb/%s.h>' % i.replace('/', '-')
66   for j in hmodes:
67     print '#include <catacomb/%s-%s.h>' % (i.replace('/', '-'), j)
68 print
69
70 print '#define PRPS(_) \\'
71 for i in prps:
72   print '\t_(%s, %s) \\' % (i.upper(), i)
73 print '\t/* end */'
74 print
75
76 print '#define RNGS(_) \\'
77 for i in (cross(prps, ['ofb', 'counter'])):
78   print ('\t_("%(prim)s-%(mode)s", %(primid)s_keysz, ' +
79          '%(primid)s_%(mode)srand, RNG_PLAIN, 0) \\') % \
80          {'prim': i[0], 'mode': i[1],
81           'primid': i[0].replace('-', '_').replace('/', '_')}
82 for i in (cross(hashes, 'mgf')):
83   print ('\t_("%(prim)s-%(mode)s", %(primid)s_%(mode)skeysz, ' +
84          '%(primid)s_%(mode)srand, RNG_PLAIN, 0) \\') % \
85          {'prim': i[0], 'mode': i[1],
86           'primid': i[0].replace('-', '_').replace('/', '_')}
87 print '\t_("rc4", rc4_keysz, rc4_rand, 0, 0) \\'
88 print '\t_("seal", seal_keysz, seal_rand, RNG_SEAL, 0) \\'
89 for i in latindances:
90   for r in ['salsa20', 'xsalsa20', 'chacha', 'xchacha']:
91     if i.startswith(r):
92       root = r
93       break
94   else:
95     raise ValueError, 'failed to find root name for %s' % i
96   if i.endswith('-ietf'): root += '_ietf'
97   print ('\t_("%(name)s", %(root)s_keysz, %(id)s_rand, ' +
98          'RNG_LATIN, %(ROOT)s_NONCESZ) \\') % \
99       {'name': i, 'id': i.replace('/', '').replace('-', '_'),
100        'root': root, 'ROOT': root.upper()}
101 for i in [128, 256]:
102   print ('\t_("shake%(w)d", shake%(w)d_keysz, cshake%(w)d_rand, ' +
103          'RNG_SHAKE, 0) \\') % \
104          {'w': i}
105   print ('\t_("kmac%(w)d", kmac%(w)d_keysz, kmac%(w)d_rand, ' +
106          'RNG_KMAC, 0) \\') % \
107          {'w': i}
108 print '\t/* end */'
109 print