[lc_ctrl] Add cSHAKE128 token hashing to the LC scripts Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv index 71d4438..c97f2cc 100644 --- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
@@ -262,10 +262,10 @@ 128'h1C8BE2FF12790AE2E6D6A68151CBD084 }; parameter lc_token_t AllZeroTokenHashed = { - 128'h0 + 128'h8D05B96D5FD2C1D5F15FCFAE5B305238 }; parameter lc_token_t RndCnstRawUnlockTokenHashed = { - 128'h1C8BE2FF12790AE2E6D6A68151CBD084 + 128'h14150A19925EFAC7CAB0921065A33FEE }; endpackage : lc_ctrl_state_pkg
diff --git a/util/design/lib/LcStEnc.py b/util/design/lib/LcStEnc.py index 1f80151..ddbecd6 100644 --- a/util/design/lib/LcStEnc.py +++ b/util/design/lib/LcStEnc.py
@@ -7,6 +7,7 @@ import logging as log import random from collections import OrderedDict +from Crypto.Hash import cSHAKE128 from lib.common import (check_int, ecc_encode, get_hd, hd_histogram, is_valid_codeword, random_or_hexvalue, scatter_bits) @@ -181,14 +182,24 @@ '''Validates and hashes the tokens''' config.setdefault('token_size', 128) config['token_size'] = check_int(config['token_size']) + # This needs to be byte aligned + if config['token_size'] % 8: + raise ValueError('Size of token {} must be byte aligned' + .format(token['name'])) + + num_bytes = config['token_size'] // 8 hashed_tokens = [] for token in config['tokens']: random_or_hexvalue(token, 'value', config['token_size']) hashed_token = OrderedDict() hashed_token['name'] = token['name'] + 'Hashed' - # TODO: plug in PRESENT-based hashing algo or KMAC - hashed_token['value'] = token['value'] + data = token['value'].to_bytes(num_bytes, byteorder='big') + # Custom string chosen for life cycle KMAC App interface + custom = 'LC_CTRL'.encode('UTF-8') + hashobj = cSHAKE128.new(data=data, custom=custom) + hashed_token['value'] = int.from_bytes(hashobj.read(num_bytes), + byteorder='big') hashed_tokens.append(hashed_token) config['tokens'] += hashed_tokens