1313962Sallanjude#!/usr/bin/env python
2313962Sallanjude# $FreeBSD: stable/11/tests/sys/geom/class/eli/gentestvect.py 327856 2018-01-12 00:31:07Z asomers $
3313962Sallanjude
4313962Sallanjudefrom hashlib import pbkdf2_hmac
5313962Sallanjudeimport hashlib
6313962Sallanjudeimport itertools
7313962Sallanjudeimport string
8313962Sallanjude
9313962Sallanjude#From: https://stackoverflow.com/questions/14945095/how-to-escape-string-for-generated-c
10313962Sallanjudedef cstring(s, encoding='ascii'):
11313962Sallanjude	if isinstance(s, unicode):
12313962Sallanjude		s = s.encode(encoding)
13313962Sallanjude
14313962Sallanjude	result = ''
15313962Sallanjude	for c in s:
16313962Sallanjude		if not (32 <= ord(c) < 127) or c in ('\\', '"'):
17313962Sallanjude			result += '\\%03o' % ord(c)
18313962Sallanjude		else:
19313962Sallanjude			result += c
20313962Sallanjude
21313962Sallanjude	return '"' + result + '"'
22313962Sallanjude
23313962Sallanjudeintarr = lambda y: ', '.join(map(lambda x: str(ord(x)), y))
24313962Sallanjude
25313962Sallanjude_randfd = open('/dev/urandom', 'rb')
26313962Sallanjude_maketrans = string.maketrans('', '')
27313962Sallanjudedef randgen(l, delchrs=None):
28313962Sallanjude	if delchrs is None:
29313962Sallanjude		return _randfd.read(l)
30313962Sallanjude
31313962Sallanjude	s = ''
32313962Sallanjude	while len(s) < l:
33313962Sallanjude		s += string.translate(_randfd.read(l - len(s)), _maketrans,
34313962Sallanjude		    delchrs)
35313962Sallanjude	return s
36313962Sallanjude
37313962Sallanjudedef printhmacres(salt, passwd, itr, hmacout):
38313962Sallanjude	print '\t{ %s, %d, %s, %d, %s, %d },' % (cstring(salt), len(salt),
39313962Sallanjude	    cstring(passwd), itr, cstring(hmacout), len(hmacout))
40313962Sallanjude
41313962Sallanjudeif __name__ == '__main__':
42313962Sallanjude	import sys
43313962Sallanjude
44313962Sallanjude	if len(sys.argv) == 1:
45313962Sallanjude		hashfun = 'sha512'
46313962Sallanjude	else:
47313962Sallanjude		hashfun = sys.argv[1]
48313962Sallanjude
49313962Sallanjude	if hashfun not in hashlib.algorithms:
50313962Sallanjude		print 'Invalid hash function: %s' % `hashfun`
51313962Sallanjude		sys.exit(1)
52313962Sallanjude
53313962Sallanjude	print '/* Test Vectors for PBKDF2-%s */' % hashfun.upper()
54313962Sallanjude	print '\t/* salt, saltlen, passwd, itr, hmacout, hmacoutlen */'
55313962Sallanjude	for saltl in xrange(8, 64, 8):
56313962Sallanjude		for itr in itertools.chain(xrange(100, 1000, 100), xrange(1000,
57313962Sallanjude		    10000, 1000)):
58313962Sallanjude			for passlen in xrange(8, 80, 8):
59313962Sallanjude				salt = randgen(saltl)
60313962Sallanjude				passwd = randgen(passlen, '\x00')
61313962Sallanjude				hmacout = pbkdf2_hmac(hashfun, passwd, salt,
62313962Sallanjude				    itr)
63313962Sallanjude				printhmacres(salt, passwd, itr, hmacout)
64