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