# @file sig_2_H_msg.py
# @version 1.1.0 (2026-02-15T08:23Z)
# @author David Ireland <https://di-mgt.com.au/contact>
# @copyright 2023-26 DI Management Services Pty Ltd
# @license Apache-2.0
"""Compute H_msg from the message, public key and randomizer."""
from slh_sha256 import SHA256, MGF1_SHA256
# digest = H_Msg(R, PK.seed, PK.root, M);
# = MGF1-SHA-256(R||PK.seed||SHA-256(R||PK.seed||PK.root||M), m)
# m = SPX_DGST_BYTES = 34
R = 'bd40e6d66893f38d5c5fad99e4885329'
PKseed = 'FA495FB834DEFEA7CC96A81309479135'
PKroot = 'A67029E90668C5A58B96E60111491F3D'
msg= \
'00003F'
print("Input =", R, PKseed, PKroot, msg)
h = SHA256(R + PKseed + PKroot + msg)
print("h =", h)
# 844564e9145e5cf1c50ba721c755e7a70e893b34b045e10b4f88bbe12846b14a
h_msg = MGF1_SHA256(R + PKseed + h, 34)
print("H_msg:", h_msg)
# cafc639d5e550807f84bae9f7eb8da2077cd579fd484522072fcdcef4b8fdb03b028
# Split into mhash (25 bytes), tree address (8 bytes) and idx_leaf (1 byte)
print("Split up H_msg...")
mhash = h_msg[:50]
tree_hex = h_msg[50:66]
leaf_hex = h_msg[66:68]
print(f"mhash='{mhash}'")
print(f"tree='{tree_hex}', leaf='{leaf_hex}'")
# Decode tree address and leaf index into integers
tree_addr = int(tree_hex, 16) & 0x7fffffffffffffff # 63 bits
print("tree_addr = 0x" + format(tree_addr, f'08x'))
idx_leaf = int(leaf_hex, 16) & 0x7 # 3 bits
print(f"idx_leaf = {idx_leaf}")