12a7a4b19SAlan Somers#!/usr/local/bin/python3 208fca7a5SJohn-Mark Gurney# 308fca7a5SJohn-Mark Gurney# Copyright (c) 2014 The FreeBSD Foundation 408fca7a5SJohn-Mark Gurney# Copyright 2014 John-Mark Gurney 508fca7a5SJohn-Mark Gurney# All rights reserved. 6f2a34445SEnji Cooper# Copyright 2019 Enji Cooper 708fca7a5SJohn-Mark Gurney# 808fca7a5SJohn-Mark Gurney# This software was developed by John-Mark Gurney under 908fca7a5SJohn-Mark Gurney# the sponsorship from the FreeBSD Foundation. 1008fca7a5SJohn-Mark Gurney# Redistribution and use in source and binary forms, with or without 1108fca7a5SJohn-Mark Gurney# modification, are permitted provided that the following conditions 1208fca7a5SJohn-Mark Gurney# are met: 1308fca7a5SJohn-Mark Gurney# 1. Redistributions of source code must retain the above copyright 1408fca7a5SJohn-Mark Gurney# notice, this list of conditions and the following disclaimer. 1508fca7a5SJohn-Mark Gurney# 2. Redistributions in binary form must reproduce the above copyright 1608fca7a5SJohn-Mark Gurney# notice, this list of conditions and the following disclaimer in the 1708fca7a5SJohn-Mark Gurney# documentation and/or other materials provided with the distribution. 1808fca7a5SJohn-Mark Gurney# 1908fca7a5SJohn-Mark Gurney# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2008fca7a5SJohn-Mark Gurney# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2108fca7a5SJohn-Mark Gurney# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2208fca7a5SJohn-Mark Gurney# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2308fca7a5SJohn-Mark Gurney# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2408fca7a5SJohn-Mark Gurney# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2508fca7a5SJohn-Mark Gurney# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2608fca7a5SJohn-Mark Gurney# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2708fca7a5SJohn-Mark Gurney# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2808fca7a5SJohn-Mark Gurney# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2908fca7a5SJohn-Mark Gurney# SUCH DAMAGE. 3008fca7a5SJohn-Mark Gurney# 3108fca7a5SJohn-Mark Gurney# 3208fca7a5SJohn-Mark Gurney 332a7a4b19SAlan Somers 3408fca7a5SJohn-Mark Gurneyimport array 35d99c2cecSEnji Cooperimport binascii 3608fca7a5SJohn-Mark Gurneyfrom fcntl import ioctl 3708fca7a5SJohn-Mark Gurneyimport os 381db8307bSLi-Wen Hsuimport platform 39ac65c827SEnji Cooperimport random 40*fdbd0ba7SKornel Dulębaimport re 4108fca7a5SJohn-Mark Gurneyimport signal 4208fca7a5SJohn-Mark Gurneyfrom struct import pack as _pack 438c026348SEnji Cooperimport sys 44ac65c827SEnji Cooperimport time 4508fca7a5SJohn-Mark Gurney 46d99c2cecSEnji Cooperimport dpkt 47d99c2cecSEnji Cooper 4808fca7a5SJohn-Mark Gurneyfrom cryptodevh import * 4908fca7a5SJohn-Mark Gurney 5008fca7a5SJohn-Mark Gurney__all__ = [ 'Crypto', 'MismatchError', ] 5108fca7a5SJohn-Mark Gurney 5208fca7a5SJohn-Mark Gurneyclass FindOp(dpkt.Packet): 5308fca7a5SJohn-Mark Gurney __byte_order__ = '@' 54ac65c827SEnji Cooper __hdr__ = ( 55ac65c827SEnji Cooper ('crid', 'i', 0), 5608fca7a5SJohn-Mark Gurney ('name', '32s', 0), 5708fca7a5SJohn-Mark Gurney ) 5808fca7a5SJohn-Mark Gurney 5908fca7a5SJohn-Mark Gurneyclass SessionOp(dpkt.Packet): 6008fca7a5SJohn-Mark Gurney __byte_order__ = '@' 61ac65c827SEnji Cooper __hdr__ = ( 62ac65c827SEnji Cooper ('cipher', 'I', 0), 6308fca7a5SJohn-Mark Gurney ('mac', 'I', 0), 6408fca7a5SJohn-Mark Gurney ('keylen', 'I', 0), 6508fca7a5SJohn-Mark Gurney ('key', 'P', 0), 6608fca7a5SJohn-Mark Gurney ('mackeylen', 'i', 0), 6708fca7a5SJohn-Mark Gurney ('mackey', 'P', 0), 6808fca7a5SJohn-Mark Gurney ('ses', 'I', 0), 6908fca7a5SJohn-Mark Gurney ) 7008fca7a5SJohn-Mark Gurney 7108fca7a5SJohn-Mark Gurneyclass SessionOp2(dpkt.Packet): 7208fca7a5SJohn-Mark Gurney __byte_order__ = '@' 73ac65c827SEnji Cooper __hdr__ = ( 74ac65c827SEnji Cooper ('cipher', 'I', 0), 7508fca7a5SJohn-Mark Gurney ('mac', 'I', 0), 7608fca7a5SJohn-Mark Gurney ('keylen', 'I', 0), 7708fca7a5SJohn-Mark Gurney ('key', 'P', 0), 7808fca7a5SJohn-Mark Gurney ('mackeylen', 'i', 0), 7908fca7a5SJohn-Mark Gurney ('mackey', 'P', 0), 8008fca7a5SJohn-Mark Gurney ('ses', 'I', 0), 8108fca7a5SJohn-Mark Gurney ('crid', 'i', 0), 82668770dcSJohn Baldwin ('ivlen', 'i', 0), 83668770dcSJohn Baldwin ('maclen', 'i', 0), 8408fca7a5SJohn-Mark Gurney ('pad0', 'i', 0), 8508fca7a5SJohn-Mark Gurney ('pad1', 'i', 0), 8608fca7a5SJohn-Mark Gurney ) 8708fca7a5SJohn-Mark Gurney 8808fca7a5SJohn-Mark Gurneyclass CryptOp(dpkt.Packet): 8908fca7a5SJohn-Mark Gurney __byte_order__ = '@' 90ac65c827SEnji Cooper __hdr__ = ( 91ac65c827SEnji Cooper ('ses', 'I', 0), 9208fca7a5SJohn-Mark Gurney ('op', 'H', 0), 9308fca7a5SJohn-Mark Gurney ('flags', 'H', 0), 9408fca7a5SJohn-Mark Gurney ('len', 'I', 0), 9508fca7a5SJohn-Mark Gurney ('src', 'P', 0), 9608fca7a5SJohn-Mark Gurney ('dst', 'P', 0), 9708fca7a5SJohn-Mark Gurney ('mac', 'P', 0), 9808fca7a5SJohn-Mark Gurney ('iv', 'P', 0), 9908fca7a5SJohn-Mark Gurney ) 10008fca7a5SJohn-Mark Gurney 10108fca7a5SJohn-Mark Gurneyclass CryptAEAD(dpkt.Packet): 10208fca7a5SJohn-Mark Gurney __byte_order__ = '@' 10308fca7a5SJohn-Mark Gurney __hdr__ = ( 10408fca7a5SJohn-Mark Gurney ('ses', 'I', 0), 10508fca7a5SJohn-Mark Gurney ('op', 'H', 0), 10608fca7a5SJohn-Mark Gurney ('flags', 'H', 0), 10708fca7a5SJohn-Mark Gurney ('len', 'I', 0), 10808fca7a5SJohn-Mark Gurney ('aadlen', 'I', 0), 10908fca7a5SJohn-Mark Gurney ('ivlen', 'I', 0), 11008fca7a5SJohn-Mark Gurney ('src', 'P', 0), 11108fca7a5SJohn-Mark Gurney ('dst', 'P', 0), 11208fca7a5SJohn-Mark Gurney ('aad', 'P', 0), 11308fca7a5SJohn-Mark Gurney ('tag', 'P', 0), 11408fca7a5SJohn-Mark Gurney ('iv', 'P', 0), 11508fca7a5SJohn-Mark Gurney ) 11608fca7a5SJohn-Mark Gurney 11708fca7a5SJohn-Mark Gurney# h2py.py can't handle multiarg macros 11808fca7a5SJohn-Mark GurneyCIOCGSESSION = 3224396645 11908fca7a5SJohn-Mark GurneyCIOCFSESSION = 2147771238 12008fca7a5SJohn-Mark GurneyCIOCKEY = 3230688104 12108fca7a5SJohn-Mark GurneyCIOCASYMFEAT = 1074029417 12208fca7a5SJohn-Mark GurneyCIOCKEY2 = 3230688107 12308fca7a5SJohn-Mark GurneyCIOCFINDDEV = 3223610220 1241db8307bSLi-Wen Hsuif platform.architecture()[0] == '64bit': 1251db8307bSLi-Wen Hsu CIOCGSESSION2 = 3225445226 1261db8307bSLi-Wen Hsu CIOCCRYPT = 3224396647 12708fca7a5SJohn-Mark Gurney CIOCCRYPTAEAD = 3225445229 1281db8307bSLi-Wen Hsuelse: 1291db8307bSLi-Wen Hsu CIOCGSESSION2 = 3224396650 1301db8307bSLi-Wen Hsu CIOCCRYPT = 3223085927 1311db8307bSLi-Wen Hsu CIOCCRYPTAEAD = 3223872365 13208fca7a5SJohn-Mark Gurney 133a4a23d21SJohn Baldwin_cryptodev = os.open('/dev/crypto', os.O_RDWR) 13408fca7a5SJohn-Mark Gurney 135ffbc8cc0SEnji Cooperdef str_to_ascii(val): 136ffbc8cc0SEnji Cooper if sys.version_info[0] >= 3: 137ffbc8cc0SEnji Cooper if isinstance(val, str): 138ffbc8cc0SEnji Cooper return val.encode("ascii") 139ffbc8cc0SEnji Cooper return val 140ffbc8cc0SEnji Cooper 14108fca7a5SJohn-Mark Gurneydef _findop(crid, name): 14208fca7a5SJohn-Mark Gurney fop = FindOp() 14308fca7a5SJohn-Mark Gurney fop.crid = crid 144ffbc8cc0SEnji Cooper fop.name = str_to_ascii(name) 14508fca7a5SJohn-Mark Gurney s = array.array('B', fop.pack_hdr()) 14608fca7a5SJohn-Mark Gurney ioctl(_cryptodev, CIOCFINDDEV, s, 1) 14708fca7a5SJohn-Mark Gurney fop.unpack(s) 14808fca7a5SJohn-Mark Gurney 14908fca7a5SJohn-Mark Gurney try: 150ffbc8cc0SEnji Cooper idx = fop.name.index(b'\x00') 15108fca7a5SJohn-Mark Gurney name = fop.name[:idx] 15208fca7a5SJohn-Mark Gurney except ValueError: 15308fca7a5SJohn-Mark Gurney name = fop.name 15408fca7a5SJohn-Mark Gurney 15508fca7a5SJohn-Mark Gurney return fop.crid, name 15608fca7a5SJohn-Mark Gurney 1578c026348SEnji Cooperdef array_tobytes(array_obj): 1588c026348SEnji Cooper if sys.version_info[:2] >= (3, 2): 1598c026348SEnji Cooper return array_obj.tobytes() 1608c026348SEnji Cooper return array_obj.tostring() 1618c026348SEnji Cooper 162668770dcSJohn Baldwindef empty_bytes(): 163668770dcSJohn Baldwin if sys.version_info[0] >= 3: 164668770dcSJohn Baldwin return b'' 165668770dcSJohn Baldwin return "" 166668770dcSJohn Baldwin 16708fca7a5SJohn-Mark Gurneyclass Crypto: 16808fca7a5SJohn-Mark Gurney @staticmethod 16908fca7a5SJohn-Mark Gurney def findcrid(name): 17008fca7a5SJohn-Mark Gurney return _findop(-1, name)[0] 17108fca7a5SJohn-Mark Gurney 17208fca7a5SJohn-Mark Gurney @staticmethod 17308fca7a5SJohn-Mark Gurney def getcridname(crid): 17408fca7a5SJohn-Mark Gurney return _findop(crid, '')[1] 17508fca7a5SJohn-Mark Gurney 17608fca7a5SJohn-Mark Gurney def __init__(self, cipher=0, key=None, mac=0, mackey=None, 177668770dcSJohn Baldwin crid=CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_HARDWARE, maclen=None, 178668770dcSJohn Baldwin ivlen=None): 17908fca7a5SJohn-Mark Gurney self._ses = None 180de0f7dcaSJohn Baldwin self._maclen = maclen 18108fca7a5SJohn-Mark Gurney ses = SessionOp2() 18208fca7a5SJohn-Mark Gurney ses.cipher = cipher 18308fca7a5SJohn-Mark Gurney ses.mac = mac 18408fca7a5SJohn-Mark Gurney 18508fca7a5SJohn-Mark Gurney if key is not None: 18608fca7a5SJohn-Mark Gurney ses.keylen = len(key) 18708fca7a5SJohn-Mark Gurney k = array.array('B', key) 18808fca7a5SJohn-Mark Gurney ses.key = k.buffer_info()[0] 18908fca7a5SJohn-Mark Gurney else: 19008fca7a5SJohn-Mark Gurney self.key = None 19108fca7a5SJohn-Mark Gurney 19208fca7a5SJohn-Mark Gurney if mackey is not None: 19308fca7a5SJohn-Mark Gurney ses.mackeylen = len(mackey) 19408fca7a5SJohn-Mark Gurney mk = array.array('B', mackey) 19508fca7a5SJohn-Mark Gurney ses.mackey = mk.buffer_info()[0] 19608fca7a5SJohn-Mark Gurney 19708fca7a5SJohn-Mark Gurney if not cipher and not mac: 19808fca7a5SJohn-Mark Gurney raise ValueError('one of cipher or mac MUST be specified.') 19978dd739fSJohn Baldwin ses.crid = crid 200668770dcSJohn Baldwin if ivlen: 201668770dcSJohn Baldwin ses.ivlen = ivlen 202668770dcSJohn Baldwin if maclen: 203668770dcSJohn Baldwin ses.maclen = maclen 204d86680b0SEnji Cooper #print(ses) 20508fca7a5SJohn-Mark Gurney s = array.array('B', ses.pack_hdr()) 206d86680b0SEnji Cooper #print(s) 20708fca7a5SJohn-Mark Gurney ioctl(_cryptodev, CIOCGSESSION2, s, 1) 20808fca7a5SJohn-Mark Gurney ses.unpack(s) 20908fca7a5SJohn-Mark Gurney 21008fca7a5SJohn-Mark Gurney self._ses = ses.ses 21108fca7a5SJohn-Mark Gurney 21208fca7a5SJohn-Mark Gurney def __del__(self): 21308fca7a5SJohn-Mark Gurney if self._ses is None: 21408fca7a5SJohn-Mark Gurney return 21508fca7a5SJohn-Mark Gurney 21608fca7a5SJohn-Mark Gurney try: 21708fca7a5SJohn-Mark Gurney ioctl(_cryptodev, CIOCFSESSION, _pack('I', self._ses)) 21808fca7a5SJohn-Mark Gurney except TypeError: 21908fca7a5SJohn-Mark Gurney pass 22008fca7a5SJohn-Mark Gurney self._ses = None 22108fca7a5SJohn-Mark Gurney 222668770dcSJohn Baldwin def _doop(self, op, src, iv, mac=None): 22308fca7a5SJohn-Mark Gurney cop = CryptOp() 22408fca7a5SJohn-Mark Gurney cop.ses = self._ses 22508fca7a5SJohn-Mark Gurney cop.op = op 22608fca7a5SJohn-Mark Gurney cop.flags = 0 227668770dcSJohn Baldwin if src is not None: 22808fca7a5SJohn-Mark Gurney cop.len = len(src) 22908fca7a5SJohn-Mark Gurney s = array.array('B', src) 23008fca7a5SJohn-Mark Gurney cop.src = cop.dst = s.buffer_info()[0] 231668770dcSJohn Baldwin if mac is not None: 232668770dcSJohn Baldwin assert len(mac) == self._maclen, \ 233668770dcSJohn Baldwin '%d != %d' % (len(tag), self._maclen) 23408fca7a5SJohn-Mark Gurney if self._maclen is not None: 235668770dcSJohn Baldwin if mac is None: 23608fca7a5SJohn-Mark Gurney m = array.array('B', [0] * self._maclen) 237668770dcSJohn Baldwin else: 238668770dcSJohn Baldwin m = array.array('B', mac) 23908fca7a5SJohn-Mark Gurney cop.mac = m.buffer_info()[0] 240ffbc8cc0SEnji Cooper ivbuf = array.array('B', str_to_ascii(iv)) 24108fca7a5SJohn-Mark Gurney cop.iv = ivbuf.buffer_info()[0] 24208fca7a5SJohn-Mark Gurney 243d86680b0SEnji Cooper #print('cop:', cop) 244ffbc8cc0SEnji Cooper ioctl(_cryptodev, CIOCCRYPT, bytes(cop)) 24508fca7a5SJohn-Mark Gurney 246668770dcSJohn Baldwin if src is not None: 2478c026348SEnji Cooper s = array_tobytes(s) 248668770dcSJohn Baldwin else: 249668770dcSJohn Baldwin s = empty_bytes() 25008fca7a5SJohn-Mark Gurney if self._maclen is not None: 2518c026348SEnji Cooper return s, array_tobytes(m) 25208fca7a5SJohn-Mark Gurney 25308fca7a5SJohn-Mark Gurney return s 25408fca7a5SJohn-Mark Gurney 25508fca7a5SJohn-Mark Gurney def _doaead(self, op, src, aad, iv, tag=None): 25608fca7a5SJohn-Mark Gurney caead = CryptAEAD() 25708fca7a5SJohn-Mark Gurney caead.ses = self._ses 25808fca7a5SJohn-Mark Gurney caead.op = op 25908fca7a5SJohn-Mark Gurney caead.flags = CRD_F_IV_EXPLICIT 26008fca7a5SJohn-Mark Gurney caead.flags = 0 261*fdbd0ba7SKornel Dulęba if src: 262ffbc8cc0SEnji Cooper src = str_to_ascii(src) 26308fca7a5SJohn-Mark Gurney caead.len = len(src) 26408fca7a5SJohn-Mark Gurney s = array.array('B', src) 26508fca7a5SJohn-Mark Gurney caead.src = caead.dst = s.buffer_info()[0] 266ef02523dSEnji Cooper aad = str_to_ascii(aad) 26708fca7a5SJohn-Mark Gurney caead.aadlen = len(aad) 26808fca7a5SJohn-Mark Gurney saad = array.array('B', aad) 26908fca7a5SJohn-Mark Gurney caead.aad = saad.buffer_info()[0] 27008fca7a5SJohn-Mark Gurney 27108fca7a5SJohn-Mark Gurney if self._maclen is None: 27208fca7a5SJohn-Mark Gurney raise ValueError('must have a tag length') 27308fca7a5SJohn-Mark Gurney 274ffbc8cc0SEnji Cooper tag = str_to_ascii(tag) 27508fca7a5SJohn-Mark Gurney if tag is None: 27608fca7a5SJohn-Mark Gurney tag = array.array('B', [0] * self._maclen) 27708fca7a5SJohn-Mark Gurney else: 278d86680b0SEnji Cooper assert len(tag) == self._maclen, \ 279d86680b0SEnji Cooper '%d != %d' % (len(tag), self._maclen) 28008fca7a5SJohn-Mark Gurney tag = array.array('B', tag) 28108fca7a5SJohn-Mark Gurney 28208fca7a5SJohn-Mark Gurney caead.tag = tag.buffer_info()[0] 28308fca7a5SJohn-Mark Gurney 28408fca7a5SJohn-Mark Gurney ivbuf = array.array('B', iv) 28508fca7a5SJohn-Mark Gurney caead.ivlen = len(iv) 28608fca7a5SJohn-Mark Gurney caead.iv = ivbuf.buffer_info()[0] 28708fca7a5SJohn-Mark Gurney 288ffbc8cc0SEnji Cooper ioctl(_cryptodev, CIOCCRYPTAEAD, bytes(caead)) 28908fca7a5SJohn-Mark Gurney 290*fdbd0ba7SKornel Dulęba if src: 2918c026348SEnji Cooper s = array_tobytes(s) 292668770dcSJohn Baldwin else: 293668770dcSJohn Baldwin s = empty_bytes() 29408fca7a5SJohn-Mark Gurney 2958c026348SEnji Cooper return s, array_tobytes(tag) 29608fca7a5SJohn-Mark Gurney 29708fca7a5SJohn-Mark Gurney def perftest(self, op, size, timeo=3): 298351a56b1SEnji Cooper inp = array.array('B', (random.randint(0, 255) for x in range(size))) 299ffbc8cc0SEnji Cooper inp = str_to_ascii(inp) 30008fca7a5SJohn-Mark Gurney out = array.array('B', inp) 30108fca7a5SJohn-Mark Gurney 30208fca7a5SJohn-Mark Gurney # prep ioctl 30308fca7a5SJohn-Mark Gurney cop = CryptOp() 30408fca7a5SJohn-Mark Gurney cop.ses = self._ses 30508fca7a5SJohn-Mark Gurney cop.op = op 30608fca7a5SJohn-Mark Gurney cop.flags = 0 30708fca7a5SJohn-Mark Gurney cop.len = len(inp) 30808fca7a5SJohn-Mark Gurney s = array.array('B', inp) 30908fca7a5SJohn-Mark Gurney cop.src = s.buffer_info()[0] 31008fca7a5SJohn-Mark Gurney cop.dst = out.buffer_info()[0] 31108fca7a5SJohn-Mark Gurney if self._maclen is not None: 31208fca7a5SJohn-Mark Gurney m = array.array('B', [0] * self._maclen) 31308fca7a5SJohn-Mark Gurney cop.mac = m.buffer_info()[0] 314351a56b1SEnji Cooper ivbuf = array.array('B', (random.randint(0, 255) for x in range(16))) 31508fca7a5SJohn-Mark Gurney cop.iv = ivbuf.buffer_info()[0] 31608fca7a5SJohn-Mark Gurney 31708fca7a5SJohn-Mark Gurney exit = [ False ] 31808fca7a5SJohn-Mark Gurney def alarmhandle(a, b, exit=exit): 31908fca7a5SJohn-Mark Gurney exit[0] = True 32008fca7a5SJohn-Mark Gurney 32108fca7a5SJohn-Mark Gurney oldalarm = signal.signal(signal.SIGALRM, alarmhandle) 32208fca7a5SJohn-Mark Gurney signal.alarm(timeo) 32308fca7a5SJohn-Mark Gurney 32408fca7a5SJohn-Mark Gurney start = time.time() 32508fca7a5SJohn-Mark Gurney reps = 0 326ffbc8cc0SEnji Cooper cop = bytes(cop) 32708fca7a5SJohn-Mark Gurney while not exit[0]: 328ffbc8cc0SEnji Cooper ioctl(_cryptodev, CIOCCRYPT, cop) 32908fca7a5SJohn-Mark Gurney reps += 1 33008fca7a5SJohn-Mark Gurney 33108fca7a5SJohn-Mark Gurney end = time.time() 33208fca7a5SJohn-Mark Gurney 33308fca7a5SJohn-Mark Gurney signal.signal(signal.SIGALRM, oldalarm) 33408fca7a5SJohn-Mark Gurney 335d86680b0SEnji Cooper print('time:', end - start) 336d86680b0SEnji Cooper print('perf MB/sec:', (reps * size) / (end - start) / 1024 / 1024) 33708fca7a5SJohn-Mark Gurney 33808fca7a5SJohn-Mark Gurney def encrypt(self, data, iv, aad=None): 33908fca7a5SJohn-Mark Gurney if aad is None: 34008fca7a5SJohn-Mark Gurney return self._doop(COP_ENCRYPT, data, iv) 34108fca7a5SJohn-Mark Gurney else: 34208fca7a5SJohn-Mark Gurney return self._doaead(COP_ENCRYPT, data, aad, 34308fca7a5SJohn-Mark Gurney iv) 34408fca7a5SJohn-Mark Gurney 34508fca7a5SJohn-Mark Gurney def decrypt(self, data, iv, aad=None, tag=None): 34608fca7a5SJohn-Mark Gurney if aad is None: 347668770dcSJohn Baldwin return self._doop(COP_DECRYPT, data, iv, mac=tag) 34808fca7a5SJohn-Mark Gurney else: 34908fca7a5SJohn-Mark Gurney return self._doaead(COP_DECRYPT, data, aad, 35008fca7a5SJohn-Mark Gurney iv, tag=tag) 35108fca7a5SJohn-Mark Gurney 35208fca7a5SJohn-Mark Gurneyclass MismatchError(Exception): 35308fca7a5SJohn-Mark Gurney pass 35408fca7a5SJohn-Mark Gurney 35508fca7a5SJohn-Mark Gurneyclass KATParser: 35608fca7a5SJohn-Mark Gurney def __init__(self, fname, fields): 35708fca7a5SJohn-Mark Gurney self.fields = set(fields) 35808fca7a5SJohn-Mark Gurney self._pending = None 359a60d9a98SEnji Cooper self.fname = fname 360a60d9a98SEnji Cooper self.fp = None 361*fdbd0ba7SKornel Dulęba self.field_re = re.compile(r"\[(?P<field>[^]]+)\]") 362a60d9a98SEnji Cooper 363a60d9a98SEnji Cooper def __enter__(self): 364a60d9a98SEnji Cooper self.fp = open(self.fname) 365a60d9a98SEnji Cooper return self 366a60d9a98SEnji Cooper 367a60d9a98SEnji Cooper def __exit__(self, exc_type, exc_value, exc_tb): 368a60d9a98SEnji Cooper if self.fp is not None: 369a60d9a98SEnji Cooper self.fp.close() 37008fca7a5SJohn-Mark Gurney 37108fca7a5SJohn-Mark Gurney def __iter__(self): 372a60d9a98SEnji Cooper return self 373a60d9a98SEnji Cooper 374a60d9a98SEnji Cooper def __next__(self): 37508fca7a5SJohn-Mark Gurney while True: 376*fdbd0ba7SKornel Dulęba while True: 37708fca7a5SJohn-Mark Gurney if self._pending is not None: 37808fca7a5SJohn-Mark Gurney i = self._pending 37908fca7a5SJohn-Mark Gurney self._pending = None 38008fca7a5SJohn-Mark Gurney else: 38108fca7a5SJohn-Mark Gurney i = self.fp.readline() 382*fdbd0ba7SKornel Dulęba if not i: 38308fca7a5SJohn-Mark Gurney return 38408fca7a5SJohn-Mark Gurney 385a60d9a98SEnji Cooper if not i.startswith('#') and i.strip(): 386a60d9a98SEnji Cooper break 387a60d9a98SEnji Cooper 388*fdbd0ba7SKornel Dulęba matches = self.field_re.match(i) 389*fdbd0ba7SKornel Dulęba if matches is None: 390*fdbd0ba7SKornel Dulęba raise ValueError("Unknown line: %r" % (i)) 391*fdbd0ba7SKornel Dulęba yield matches.group("field"), self.fielditer() 39208fca7a5SJohn-Mark Gurney 39308fca7a5SJohn-Mark Gurney def eatblanks(self): 39408fca7a5SJohn-Mark Gurney while True: 39508fca7a5SJohn-Mark Gurney line = self.fp.readline() 39608fca7a5SJohn-Mark Gurney if line == '': 39708fca7a5SJohn-Mark Gurney break 39808fca7a5SJohn-Mark Gurney 39908fca7a5SJohn-Mark Gurney line = line.strip() 40008fca7a5SJohn-Mark Gurney if line: 40108fca7a5SJohn-Mark Gurney break 40208fca7a5SJohn-Mark Gurney 40308fca7a5SJohn-Mark Gurney return line 40408fca7a5SJohn-Mark Gurney 40508fca7a5SJohn-Mark Gurney def fielditer(self): 40608fca7a5SJohn-Mark Gurney while True: 40708fca7a5SJohn-Mark Gurney values = {} 40808fca7a5SJohn-Mark Gurney 40908fca7a5SJohn-Mark Gurney line = self.eatblanks() 41008fca7a5SJohn-Mark Gurney if not line or line[0] == '[': 41108fca7a5SJohn-Mark Gurney self._pending = line 41208fca7a5SJohn-Mark Gurney return 41308fca7a5SJohn-Mark Gurney 41408fca7a5SJohn-Mark Gurney while True: 41508fca7a5SJohn-Mark Gurney try: 41608fca7a5SJohn-Mark Gurney f, v = line.split(' =') 41708fca7a5SJohn-Mark Gurney except: 41808fca7a5SJohn-Mark Gurney if line == 'FAIL': 41908fca7a5SJohn-Mark Gurney f, v = 'FAIL', '' 42008fca7a5SJohn-Mark Gurney else: 421d86680b0SEnji Cooper print('line:', repr(line)) 42208fca7a5SJohn-Mark Gurney raise 42308fca7a5SJohn-Mark Gurney v = v.strip() 42408fca7a5SJohn-Mark Gurney 42508fca7a5SJohn-Mark Gurney if f in values: 426d86680b0SEnji Cooper raise ValueError('already present: %r' % repr(f)) 42708fca7a5SJohn-Mark Gurney values[f] = v 42808fca7a5SJohn-Mark Gurney line = self.fp.readline().strip() 42908fca7a5SJohn-Mark Gurney if not line: 43008fca7a5SJohn-Mark Gurney break 43108fca7a5SJohn-Mark Gurney 43208fca7a5SJohn-Mark Gurney # we should have everything 43308fca7a5SJohn-Mark Gurney remain = self.fields.copy() - set(values.keys()) 43408fca7a5SJohn-Mark Gurney # XXX - special case GCM decrypt 43508fca7a5SJohn-Mark Gurney if remain and not ('FAIL' in values and 'PT' in remain): 436d86680b0SEnji Cooper raise ValueError('not all fields found: %r' % repr(remain)) 43708fca7a5SJohn-Mark Gurney 43808fca7a5SJohn-Mark Gurney yield values 43908fca7a5SJohn-Mark Gurney 440151f0ca8SJohn Baldwin# The CCM files use a bit of a different syntax that doesn't quite fit 441151f0ca8SJohn Baldwin# the generic KATParser. In particular, some keys are set globally at 442151f0ca8SJohn Baldwin# the start of the file, and some are set globally at the start of a 443151f0ca8SJohn Baldwin# section. 444151f0ca8SJohn Baldwinclass KATCCMParser: 445151f0ca8SJohn Baldwin def __init__(self, fname): 446151f0ca8SJohn Baldwin self._pending = None 447a60d9a98SEnji Cooper self.fname = fname 448a60d9a98SEnji Cooper self.fp = None 449a60d9a98SEnji Cooper 450a60d9a98SEnji Cooper def __enter__(self): 451a60d9a98SEnji Cooper self.fp = open(self.fname) 452151f0ca8SJohn Baldwin self.read_globals() 453a60d9a98SEnji Cooper return self 454a60d9a98SEnji Cooper 455a60d9a98SEnji Cooper def __exit__(self, exc_type, exc_value, exc_tb): 456a60d9a98SEnji Cooper if self.fp is not None: 457a60d9a98SEnji Cooper self.fp.close() 458151f0ca8SJohn Baldwin 459151f0ca8SJohn Baldwin def read_globals(self): 460151f0ca8SJohn Baldwin self.global_values = {} 461151f0ca8SJohn Baldwin while True: 462151f0ca8SJohn Baldwin line = self.fp.readline() 463151f0ca8SJohn Baldwin if not line: 464151f0ca8SJohn Baldwin return 465151f0ca8SJohn Baldwin if line[0] == '#' or not line.strip(): 466151f0ca8SJohn Baldwin continue 467151f0ca8SJohn Baldwin if line[0] == '[': 468151f0ca8SJohn Baldwin self._pending = line 469151f0ca8SJohn Baldwin return 470151f0ca8SJohn Baldwin 471151f0ca8SJohn Baldwin try: 472151f0ca8SJohn Baldwin f, v = line.split(' =') 473151f0ca8SJohn Baldwin except: 474151f0ca8SJohn Baldwin print('line:', repr(line)) 475151f0ca8SJohn Baldwin raise 476151f0ca8SJohn Baldwin 477151f0ca8SJohn Baldwin v = v.strip() 478151f0ca8SJohn Baldwin 479151f0ca8SJohn Baldwin if f in self.global_values: 480151f0ca8SJohn Baldwin raise ValueError('already present: %r' % repr(f)) 481151f0ca8SJohn Baldwin self.global_values[f] = v 482151f0ca8SJohn Baldwin 483151f0ca8SJohn Baldwin def read_section_values(self, kwpairs): 484151f0ca8SJohn Baldwin self.section_values = self.global_values.copy() 485151f0ca8SJohn Baldwin for pair in kwpairs.split(', '): 486151f0ca8SJohn Baldwin f, v = pair.split(' = ') 487151f0ca8SJohn Baldwin if f in self.section_values: 488151f0ca8SJohn Baldwin raise ValueError('already present: %r' % repr(f)) 489151f0ca8SJohn Baldwin self.section_values[f] = v 490151f0ca8SJohn Baldwin 491151f0ca8SJohn Baldwin while True: 492151f0ca8SJohn Baldwin line = self.fp.readline() 493151f0ca8SJohn Baldwin if not line: 494151f0ca8SJohn Baldwin return 495151f0ca8SJohn Baldwin if line[0] == '#' or not line.strip(): 496151f0ca8SJohn Baldwin continue 497151f0ca8SJohn Baldwin if line[0] == '[': 498151f0ca8SJohn Baldwin self._pending = line 499151f0ca8SJohn Baldwin return 500151f0ca8SJohn Baldwin 501151f0ca8SJohn Baldwin try: 502151f0ca8SJohn Baldwin f, v = line.split(' =') 503151f0ca8SJohn Baldwin except: 504151f0ca8SJohn Baldwin print('line:', repr(line)) 505151f0ca8SJohn Baldwin raise 506151f0ca8SJohn Baldwin 507151f0ca8SJohn Baldwin if f == 'Count': 508151f0ca8SJohn Baldwin self._pending = line 509151f0ca8SJohn Baldwin return 510151f0ca8SJohn Baldwin 511151f0ca8SJohn Baldwin v = v.strip() 512151f0ca8SJohn Baldwin 513151f0ca8SJohn Baldwin if f in self.section_values: 514151f0ca8SJohn Baldwin raise ValueError('already present: %r' % repr(f)) 515151f0ca8SJohn Baldwin self.section_values[f] = v 516151f0ca8SJohn Baldwin 517151f0ca8SJohn Baldwin def __iter__(self): 518a60d9a98SEnji Cooper return self 519a60d9a98SEnji Cooper 520a60d9a98SEnji Cooper def __next__(self): 521151f0ca8SJohn Baldwin while True: 522151f0ca8SJohn Baldwin if self._pending: 523151f0ca8SJohn Baldwin line = self._pending 524151f0ca8SJohn Baldwin self._pending = None 525151f0ca8SJohn Baldwin else: 526151f0ca8SJohn Baldwin line = self.fp.readline() 527151f0ca8SJohn Baldwin if not line: 528151f0ca8SJohn Baldwin return 529151f0ca8SJohn Baldwin 530151f0ca8SJohn Baldwin if (line and line[0] == '#') or not line.strip(): 531151f0ca8SJohn Baldwin continue 532151f0ca8SJohn Baldwin 533151f0ca8SJohn Baldwin if line[0] == '[': 534151f0ca8SJohn Baldwin section = line[1:].split(']', 1)[0] 535151f0ca8SJohn Baldwin self.read_section_values(section) 536151f0ca8SJohn Baldwin continue 537151f0ca8SJohn Baldwin 538151f0ca8SJohn Baldwin values = self.section_values.copy() 539151f0ca8SJohn Baldwin 540151f0ca8SJohn Baldwin while True: 541151f0ca8SJohn Baldwin try: 542151f0ca8SJohn Baldwin f, v = line.split(' =') 543151f0ca8SJohn Baldwin except: 544151f0ca8SJohn Baldwin print('line:', repr(line)) 545151f0ca8SJohn Baldwin raise 546151f0ca8SJohn Baldwin v = v.strip() 547151f0ca8SJohn Baldwin 548151f0ca8SJohn Baldwin if f in values: 549151f0ca8SJohn Baldwin raise ValueError('already present: %r' % repr(f)) 550151f0ca8SJohn Baldwin values[f] = v 551151f0ca8SJohn Baldwin line = self.fp.readline().strip() 552151f0ca8SJohn Baldwin if not line: 553151f0ca8SJohn Baldwin break 554151f0ca8SJohn Baldwin 555151f0ca8SJohn Baldwin yield values 556151f0ca8SJohn Baldwin 55708fca7a5SJohn-Mark Gurneydef _spdechex(s): 558d99c2cecSEnji Cooper return binascii.hexlify(''.join(s.split())) 55908fca7a5SJohn-Mark Gurney 560a60d9a98SEnji Cooperif sys.version_info[0] < 3: 561a60d9a98SEnji Cooper KATCCMParser.next = KATCCMParser.__next__ 562a60d9a98SEnji Cooper KATParser.next = KATParser.__next__ 563a60d9a98SEnji Cooper 56408fca7a5SJohn-Mark Gurneyif __name__ == '__main__': 56508fca7a5SJohn-Mark Gurney if True: 56608fca7a5SJohn-Mark Gurney try: 56708fca7a5SJohn-Mark Gurney crid = Crypto.findcrid('aesni0') 568d86680b0SEnji Cooper print('aesni:', crid) 56908fca7a5SJohn-Mark Gurney except IOError: 570d86680b0SEnji Cooper print('aesni0 not found') 57108fca7a5SJohn-Mark Gurney 572351a56b1SEnji Cooper for i in range(10): 57308fca7a5SJohn-Mark Gurney try: 57408fca7a5SJohn-Mark Gurney name = Crypto.getcridname(i) 575d86680b0SEnji Cooper print('%2d: %r' % (i, repr(name))) 57608fca7a5SJohn-Mark Gurney except IOError: 57708fca7a5SJohn-Mark Gurney pass 57808fca7a5SJohn-Mark Gurney elif False: 579a60d9a98SEnji Cooper columns = [ 'COUNT', 'DataUnitLen', 'Key', 'DataUnitSeqNumber', 'PT', 'CT' ] 580a60d9a98SEnji Cooper fname = '/usr/home/jmg/aesni.testing/format tweak value input - data unit seq no/XTSGenAES128.rsp' 581a60d9a98SEnji Cooper with KATParser(fname, columns) as kp: 58208fca7a5SJohn-Mark Gurney for mode, ni in kp: 583d86680b0SEnji Cooper print(i, ni) 58408fca7a5SJohn-Mark Gurney for j in ni: 585d86680b0SEnji Cooper print(j) 58608fca7a5SJohn-Mark Gurney elif False: 58708fca7a5SJohn-Mark Gurney key = _spdechex('c939cc13397c1d37de6ae0e1cb7c423c') 58808fca7a5SJohn-Mark Gurney iv = _spdechex('00000000000000000000000000000001') 58908fca7a5SJohn-Mark Gurney pt = _spdechex('ab3cabed693a32946055524052afe3c9cb49664f09fc8b7da824d924006b7496353b8c1657c5dec564d8f38d7432e1de35aae9d95590e66278d4acce883e51abaf94977fcd3679660109a92bf7b2973ccd547f065ec6cee4cb4a72a5e9f45e615d920d76cb34cba482467b3e21422a7242e7d931330c0fbf465c3a3a46fae943029fd899626dda542750a1eee253df323c6ef1573f1c8c156613e2ea0a6cdbf2ae9701020be2d6a83ecb7f3f9d8e') 59008fca7a5SJohn-Mark Gurney #pt = _spdechex('00000000000000000000000000000000') 59108fca7a5SJohn-Mark Gurney ct = _spdechex('f42c33853ecc5ce2949865fdb83de3bff1089e9360c94f830baebfaff72836ab5236f77212f1e7396c8c54ac73d81986375a6e9e299cfeca5ba051ed25e8d1affa5beaf6c1d2b45e90802408f2ced21663497e906de5f29341e5e52ddfea5363d628b3eb7806835e17bae051b3a6da3f8e2941fe44384eac17a9d298d2c331ca8320c775b5d53263a5e905059d891b21dede2d8110fd427c7bd5a9a274ddb47b1945ee79522203b6e297d0e399ef') 59208fca7a5SJohn-Mark Gurney 59308fca7a5SJohn-Mark Gurney c = Crypto(CRYPTO_AES_ICM, key) 59408fca7a5SJohn-Mark Gurney enc = c.encrypt(pt, iv) 59508fca7a5SJohn-Mark Gurney 596d99c2cecSEnji Cooper print('enc:', binascii.hexlify(enc)) 597d99c2cecSEnji Cooper print(' ct:', binascii.hexlify(ct)) 59808fca7a5SJohn-Mark Gurney 59908fca7a5SJohn-Mark Gurney assert ct == enc 60008fca7a5SJohn-Mark Gurney 60108fca7a5SJohn-Mark Gurney dec = c.decrypt(ct, iv) 60208fca7a5SJohn-Mark Gurney 603d99c2cecSEnji Cooper print('dec:', binascii.hexlify(dec)) 604d99c2cecSEnji Cooper print(' pt:', binascii.hexlify(pt)) 60508fca7a5SJohn-Mark Gurney 60608fca7a5SJohn-Mark Gurney assert pt == dec 60708fca7a5SJohn-Mark Gurney elif False: 60808fca7a5SJohn-Mark Gurney key = _spdechex('c939cc13397c1d37de6ae0e1cb7c423c') 60908fca7a5SJohn-Mark Gurney iv = _spdechex('00000000000000000000000000000001') 61008fca7a5SJohn-Mark Gurney pt = _spdechex('ab3cabed693a32946055524052afe3c9cb49664f09fc8b7da824d924006b7496353b8c1657c5dec564d8f38d7432e1de35aae9d95590e66278d4acce883e51abaf94977fcd3679660109a92bf7b2973ccd547f065ec6cee4cb4a72a5e9f45e615d920d76cb34cba482467b3e21422a7242e7d931330c0fbf465c3a3a46fae943029fd899626dda542750a1eee253df323c6ef1573f1c8c156613e2ea0a6cdbf2ae9701020be2d6a83ecb7f3f9d8e0a3f') 61108fca7a5SJohn-Mark Gurney #pt = _spdechex('00000000000000000000000000000000') 61208fca7a5SJohn-Mark Gurney ct = _spdechex('f42c33853ecc5ce2949865fdb83de3bff1089e9360c94f830baebfaff72836ab5236f77212f1e7396c8c54ac73d81986375a6e9e299cfeca5ba051ed25e8d1affa5beaf6c1d2b45e90802408f2ced21663497e906de5f29341e5e52ddfea5363d628b3eb7806835e17bae051b3a6da3f8e2941fe44384eac17a9d298d2c331ca8320c775b5d53263a5e905059d891b21dede2d8110fd427c7bd5a9a274ddb47b1945ee79522203b6e297d0e399ef3768') 61308fca7a5SJohn-Mark Gurney 61408fca7a5SJohn-Mark Gurney c = Crypto(CRYPTO_AES_ICM, key) 61508fca7a5SJohn-Mark Gurney enc = c.encrypt(pt, iv) 61608fca7a5SJohn-Mark Gurney 617d99c2cecSEnji Cooper print('enc:', binascii.hexlify(enc)) 618d99c2cecSEnji Cooper print(' ct:', binascii.hexlify(ct)) 61908fca7a5SJohn-Mark Gurney 62008fca7a5SJohn-Mark Gurney assert ct == enc 62108fca7a5SJohn-Mark Gurney 62208fca7a5SJohn-Mark Gurney dec = c.decrypt(ct, iv) 62308fca7a5SJohn-Mark Gurney 624d99c2cecSEnji Cooper print('dec:', binascii.hexlify(dec)) 625d99c2cecSEnji Cooper print(' pt:', binascii.hexlify(pt)) 62608fca7a5SJohn-Mark Gurney 62708fca7a5SJohn-Mark Gurney assert pt == dec 62808fca7a5SJohn-Mark Gurney elif False: 62908fca7a5SJohn-Mark Gurney key = _spdechex('c939cc13397c1d37de6ae0e1cb7c423c') 63008fca7a5SJohn-Mark Gurney iv = _spdechex('6eba2716ec0bd6fa5cdef5e6d3a795bc') 63108fca7a5SJohn-Mark Gurney pt = _spdechex('ab3cabed693a32946055524052afe3c9cb49664f09fc8b7da824d924006b7496353b8c1657c5dec564d8f38d7432e1de35aae9d95590e66278d4acce883e51abaf94977fcd3679660109a92bf7b2973ccd547f065ec6cee4cb4a72a5e9f45e615d920d76cb34cba482467b3e21422a7242e7d931330c0fbf465c3a3a46fae943029fd899626dda542750a1eee253df323c6ef1573f1c8c156613e2ea0a6cdbf2ae9701020be2d6a83ecb7f3f9d8e0a3f') 63208fca7a5SJohn-Mark Gurney ct = _spdechex('f1f81f12e72e992dbdc304032705dc75dc3e4180eff8ee4819906af6aee876d5b00b7c36d282a445ce3620327be481e8e53a8e5a8e5ca9abfeb2281be88d12ffa8f46d958d8224738c1f7eea48bda03edbf9adeb900985f4fa25648b406d13a886c25e70cfdecdde0ad0f2991420eb48a61c64fd797237cf2798c2675b9bb744360b0a3f329ac53bbceb4e3e7456e6514f1a9d2f06c236c31d0f080b79c15dce1096357416602520daa098b17d1af427') 63308fca7a5SJohn-Mark Gurney c = Crypto(CRYPTO_AES_CBC, key) 63408fca7a5SJohn-Mark Gurney 63508fca7a5SJohn-Mark Gurney enc = c.encrypt(pt, iv) 63608fca7a5SJohn-Mark Gurney 637d99c2cecSEnji Cooper print('enc:', binascii.hexlify(enc)) 638d99c2cecSEnji Cooper print(' ct:', binascii.hexlify(ct)) 63908fca7a5SJohn-Mark Gurney 64008fca7a5SJohn-Mark Gurney assert ct == enc 64108fca7a5SJohn-Mark Gurney 64208fca7a5SJohn-Mark Gurney dec = c.decrypt(ct, iv) 64308fca7a5SJohn-Mark Gurney 644d99c2cecSEnji Cooper print('dec:', binascii.hexlify(dec)) 645d99c2cecSEnji Cooper print(' pt:', binascii.hexlify(pt)) 64608fca7a5SJohn-Mark Gurney 64708fca7a5SJohn-Mark Gurney assert pt == dec 64808fca7a5SJohn-Mark Gurney elif False: 64908fca7a5SJohn-Mark Gurney key = _spdechex('c939cc13397c1d37de6ae0e1cb7c423c') 65008fca7a5SJohn-Mark Gurney iv = _spdechex('b3d8cc017cbb89b39e0f67e2') 65108fca7a5SJohn-Mark Gurney pt = _spdechex('c3b3c41f113a31b73d9a5cd4321030') 65208fca7a5SJohn-Mark Gurney aad = _spdechex('24825602bd12a984e0092d3e448eda5f') 65308fca7a5SJohn-Mark Gurney ct = _spdechex('93fe7d9e9bfd10348a5606e5cafa7354') 65408fca7a5SJohn-Mark Gurney ct = _spdechex('93fe7d9e9bfd10348a5606e5cafa73') 65508fca7a5SJohn-Mark Gurney tag = _spdechex('0032a1dc85f1c9786925a2e71d8272dd') 65608fca7a5SJohn-Mark Gurney tag = _spdechex('8d11a0929cb3fbe1fef01a4a38d5f8ea') 65708fca7a5SJohn-Mark Gurney 658c0341432SJohn Baldwin c = Crypto(CRYPTO_AES_NIST_GCM_16, key) 65908fca7a5SJohn-Mark Gurney 66008fca7a5SJohn-Mark Gurney enc, enctag = c.encrypt(pt, iv, aad=aad) 66108fca7a5SJohn-Mark Gurney 662d99c2cecSEnji Cooper print('enc:', binascii.hexlify(enc)) 663d99c2cecSEnji Cooper print(' ct:', binascii.hexlify(ct)) 66408fca7a5SJohn-Mark Gurney 66508fca7a5SJohn-Mark Gurney assert enc == ct 66608fca7a5SJohn-Mark Gurney 667d99c2cecSEnji Cooper print('etg:', binascii.hexlify(enctag)) 668d99c2cecSEnji Cooper print('tag:', binascii.hexlify(tag)) 66908fca7a5SJohn-Mark Gurney assert enctag == tag 67008fca7a5SJohn-Mark Gurney 67108fca7a5SJohn-Mark Gurney # Make sure we get EBADMSG 67208fca7a5SJohn-Mark Gurney #enctag = enctag[:-1] + 'a' 67308fca7a5SJohn-Mark Gurney dec, dectag = c.decrypt(ct, iv, aad=aad, tag=enctag) 67408fca7a5SJohn-Mark Gurney 675d99c2cecSEnji Cooper print('dec:', binascii.hexlify(dec)) 676d99c2cecSEnji Cooper print(' pt:', binascii.hexlify(pt)) 67708fca7a5SJohn-Mark Gurney 67808fca7a5SJohn-Mark Gurney assert dec == pt 67908fca7a5SJohn-Mark Gurney 680d99c2cecSEnji Cooper print('dtg:', binascii.hexlify(dectag)) 681d99c2cecSEnji Cooper print('tag:', binascii.hexlify(tag)) 68208fca7a5SJohn-Mark Gurney 68308fca7a5SJohn-Mark Gurney assert dectag == tag 68408fca7a5SJohn-Mark Gurney elif False: 68508fca7a5SJohn-Mark Gurney key = _spdechex('c939cc13397c1d37de6ae0e1cb7c423c') 68608fca7a5SJohn-Mark Gurney iv = _spdechex('b3d8cc017cbb89b39e0f67e2') 68708fca7a5SJohn-Mark Gurney key = key + iv[:4] 68808fca7a5SJohn-Mark Gurney iv = iv[4:] 68908fca7a5SJohn-Mark Gurney pt = _spdechex('c3b3c41f113a31b73d9a5cd432103069') 69008fca7a5SJohn-Mark Gurney aad = _spdechex('24825602bd12a984e0092d3e448eda5f') 69108fca7a5SJohn-Mark Gurney ct = _spdechex('93fe7d9e9bfd10348a5606e5cafa7354') 69208fca7a5SJohn-Mark Gurney tag = _spdechex('0032a1dc85f1c9786925a2e71d8272dd') 69308fca7a5SJohn-Mark Gurney 694c0341432SJohn Baldwin c = Crypto(CRYPTO_AES_GCM_16, key) 69508fca7a5SJohn-Mark Gurney 69608fca7a5SJohn-Mark Gurney enc, enctag = c.encrypt(pt, iv, aad=aad) 69708fca7a5SJohn-Mark Gurney 698d99c2cecSEnji Cooper print('enc:', binascii.hexlify(enc)) 699d99c2cecSEnji Cooper print(' ct:', binascii.hexlify(ct)) 70008fca7a5SJohn-Mark Gurney 70108fca7a5SJohn-Mark Gurney assert enc == ct 70208fca7a5SJohn-Mark Gurney 703d99c2cecSEnji Cooper print('etg:', binascii.hexlify(enctag)) 704d99c2cecSEnji Cooper print('tag:', binascii.hexlify(tag)) 70508fca7a5SJohn-Mark Gurney assert enctag == tag 70608fca7a5SJohn-Mark Gurney elif False: 707351a56b1SEnji Cooper for i in range(100000): 708d99c2cecSEnji Cooper c = Crypto(CRYPTO_AES_XTS, binascii.unhexlify('1bbfeadf539daedcae33ced497343f3ca1f2474ad932b903997d44707db41382')) 709d99c2cecSEnji Cooper data = binascii.unhexlify('52a42bca4e9425a25bbc8c8bf6129dec') 710d99c2cecSEnji Cooper ct = binascii.unhexlify('517e602becd066b65fa4f4f56ddfe240') 71108fca7a5SJohn-Mark Gurney iv = _pack('QQ', 71, 0) 71208fca7a5SJohn-Mark Gurney 71308fca7a5SJohn-Mark Gurney enc = c.encrypt(data, iv) 71408fca7a5SJohn-Mark Gurney assert enc == ct 71508fca7a5SJohn-Mark Gurney elif True: 716d99c2cecSEnji Cooper c = Crypto(CRYPTO_AES_XTS, binascii.unhexlify('1bbfeadf539daedcae33ced497343f3ca1f2474ad932b903997d44707db41382')) 717d99c2cecSEnji Cooper data = binascii.unhexlify('52a42bca4e9425a25bbc8c8bf6129dec') 718d99c2cecSEnji Cooper ct = binascii.unhexlify('517e602becd066b65fa4f4f56ddfe240') 71908fca7a5SJohn-Mark Gurney iv = _pack('QQ', 71, 0) 72008fca7a5SJohn-Mark Gurney 72108fca7a5SJohn-Mark Gurney enc = c.encrypt(data, iv) 72208fca7a5SJohn-Mark Gurney assert enc == ct 72308fca7a5SJohn-Mark Gurney 72408fca7a5SJohn-Mark Gurney dec = c.decrypt(enc, iv) 72508fca7a5SJohn-Mark Gurney assert dec == data 72608fca7a5SJohn-Mark Gurney 72708fca7a5SJohn-Mark Gurney #c.perftest(COP_ENCRYPT, 192*1024, reps=30000) 72808fca7a5SJohn-Mark Gurney 72908fca7a5SJohn-Mark Gurney else: 730d99c2cecSEnji Cooper key = binascii.unhexlify('1bbfeadf539daedcae33ced497343f3ca1f2474ad932b903997d44707db41382') 731d86680b0SEnji Cooper print('XTS %d testing:' % (len(key) * 8)) 73208fca7a5SJohn-Mark Gurney c = Crypto(CRYPTO_AES_XTS, key) 73308fca7a5SJohn-Mark Gurney for i in [ 8192, 192*1024]: 734d86680b0SEnji Cooper print('block size: %d' % i) 73508fca7a5SJohn-Mark Gurney c.perftest(COP_ENCRYPT, i) 73608fca7a5SJohn-Mark Gurney c.perftest(COP_DECRYPT, i) 737