blob: 2e0595ce5d3377f8bff1f7ef63b10404c8335621 [file] [log] [blame]
#
# Copyright (C) 2023 Mediatek Ltd.
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
from algo import ALGO
from algo import parse_entry
import os
class ECB(ALGO):
def __init__(self, engine, dir_path):
super().__init__(engine, dir_path)
self.mode = ""
def parse(self, rsp_file):
test_suites = []
suite = {}
test = {}
algo = "ecb"
key_len = ""
with open(rsp_file, 'r') as f:
while True:
line = f.readline()
if line == '':
break
if line == '\n' or line == '\r\n':
continue
if line.startswith('#'):
if line.find('Key Length : ') != -1:
tmp = line.find('Key Length : ') + len('Key Length : ')
key_len = line[tmp : -1]
if(line.find('MCT') != -1):
self.monte_flag = True
continue
line = line.strip()
if line.startswith('['):
e = line[1:-1]
if not '=' in e:
if suite:
suite['Tests'].append(test)
test_suites.append(suite)
suite = {'mode': e, 'Tests': [], \
'Algorithm' : algo, 'keylen':key_len}
self.mode = e
test = {}
else:
key, val = parse_entry(e)
suite[key] = val
continue
if line.startswith('COUNT'):
if test:
suite['Tests'].append(test)
test = {}
continue
key, val = parse_entry(line)
if key in test:
key = key + '2'
test[key] = val
suite['Tests'].append(test)
test_suites.append(suite)
self.test_suites = test_suites
def hw_command(self, suite, test, algo):
data = ""
mode = ""
if self.mode == "ENCRYPT":
data = test['PLAINTEXT']
mode = " -e "
elif self.mode == 'DECRYPT':
data = test['CIPHERTEXT']
mode = " -d "
e = "echo -n " + "\"" + data + "\"" + " | xxd -r -p | "
o = "openssl enc " + algo + mode + " -K " + test['KEY'] + \
" -nopad -engine devcrypto"
s = " | xxd | cut -c10-50"
command = e + o + s
result = os.popen(command).read().replace(" ", "")
return result.replace("\n", "").replace(" ", "")
def sej_command(self, suite, test, algo):
data = ""
mode = ""
if self.mode == "ENCRYPT":
data = test['PLAINTEXT']
mode = "enc"
elif self.mode == 'DECRYPT':
data = test['CIPHERTEXT']
mode = "dec"
command = "crypto_test " + mode + " ecb -k " + test['KEY'] + \
" " + data
result = os.popen(command).read().replace(" ", "")
return result.replace("\n", "").replace(" ", "")
def select_algo(self, suites):
algo = "none"
if suites['keylen'] == '128':
algo = '-aes-128-ecb'
elif suites['keylen'] == '192':
algo = '-aes-192-ecb'
elif suites['keylen'] == '256':
algo = '-aes-256-ecb'
return algo
def get_expect(self, test):
if self.mode == 'ENCRYPT':
return test['CIPHERTEXT']
if self.mode == 'DECRYPT':
return test['PLAINTEXT']
def run_monte_command(self, suite, algo):
expect = ""
result = ""
count = 0
for test in suite['Tests']:
self.mode = suite['mode']
if (self.mode == 'ENCRYPT'):
mode = " -e "
data = test['PLAINTEXT']
expect = test['CIPHERTEXT']
else:
mode = " -d "
data = test['CIPHERTEXT']
expect = test['PLAINTEXT']
for i in range(1000):
if self.engine == "sw":
result = self.sw_command(suite, test, algo)
elif self.engine == "hw":
result = self.hw_command(suite, test, algo)
elif self.engine == "sej":
result = self.sej_command(suite, test, algo)
if(self.mode == 'ENCRYPT'):
data = result.replace("\n", "")
test['PLAINTEXT'] = data
elif(self.mode == 'DECRYPT'):
data = result.replace("\n", "")
test['CIPHERTEXT'] = data
if(result.replace("\n", "") == expect):
count = count + 1;
else:
return False
break
return True
def run_command(self):
result = ""
expect = ""
pass_count = 0
total = 0
for suites in self.test_suites:
count = 0
algo = self.select_algo(suites)
if(algo == "none"):
continue
for test in suites['Tests']:
if self.engine == "sw":
result = self.sw_command(suites, test, algo)
elif self.engine == "hw":
result = self.hw_command(suites, test, algo)
elif self.engine == "sej":
result = self.sej_command(suites, test, algo)
expect = self.get_expect(test)
if(result == expect):
pass_count = pass_count + 1
count = count + 1
total = total + len(suites['Tests'])
print("\t\t\ttotal case: %d, pass case: %d, rate: %f" %(total, pass_count, pass_count/total))