# @file for_authpath_00.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 the authpaths for the FORS trees with i=0."""
from slh_adrs import Adrs
from slh_util import fors_sk_gen
from slh_sha256 import F, H
PKseed = 'FA495FB834DEFEA7CC96A81309479135'
SKseed = 'D5213BA4BB6470F1B9EDA88CBC94E627'
a = 6
t = 2 ** a # t = 2^a
def fors_node(SKseed, i, z, PKseed, adrs, showdebug=False):
node = None
if z == 0:
adrs.setTreeHeight(0)
adrs.setTreeIndex(i)
sk = fors_sk_gen(SKseed, PKseed, adrs, showdebug)
if showdebug:
print(f"fors_node: i = {i} sk=", sk)
node = F(PKseed, adrs.toHex(True), sk)
else:
lnode = fors_node(SKseed, 2*i, z-1, PKseed, adrs)
rnode = fors_node(SKseed, 2*i + 1, z-1, PKseed, adrs)
adrs.setTreeHeight(z)
adrs.setTreeIndex(i)
node = H(PKseed, adrs.toHex(True), lnode, rnode)
if showdebug:
print(f"fors_node: ({z},{i}) {lnode}||{rnode} = {node}")
return node
def fors_authpath(SKseed, PKseed, adrs, a, idx, showdebug=False):
auth = [None] * a
for j in range(a):
s = idx // (1 << j) ^ 1
if showdebug:
print(f"j={j} s={s}")
auth[j] = fors_node(SKseed, s, j, PKseed, adrs, showdebug)
if showdebug:
print(f"auth[{j}]={auth[j]}")
return auth
# Set up ADRS object
adrs = Adrs(Adrs.FORS_TREE, layer=0)
adrs.setTreeAddress(0x7cdcef4b8fdb03b0)
adrs.setKeyPairAddress(0) # WOTS+ leaf index
print(f"ADRS={adrs.toHexSP(True)}")
# Compute the authpath for index 50 and tree_index = 0
idx = 50
tree_index = 0
auth = fors_authpath(SKseed, PKseed, adrs, a, tree_index * t + idx, True)
print("auth=", auth)
assert(auth[5] == 'c5cce74326d6181d01b74e3cd7f794a9')
# Compute tree root (use i=0 z=a)
root = fors_node(SKseed, tree_index, a, PKseed, adrs, True)
print("root =", root)
assert(root == "fb0f55d9717066cf3c666854d1e2f928")
# Compute the authpath for 2nd tree
idx = 47
tree_index = 1
auth = fors_authpath(SKseed, PKseed, adrs, a, tree_index * t + idx, True)
print("auth=", auth)
assert(auth[5] == 'b34369fa56839a0e05af5c6613e4a229')
# Compute tree root (use i=0 z=a)
root = fors_node(SKseed, tree_index, a, PKseed, adrs, True)
print("root =", root)
assert(root == "34c0d2ad1439f436a03efb94c1ce92dc")
'''
481de4ce7e26065d90ae21c965feba33 # fors_auth_path[1]
02102d7564e3b7414e1aa62271e9b4df
b42c57c44726af6fe7f3bdd486d7d578
b4b4ba8ebc1f5d7243f94d2d2d4cb55b
7f95c3020e05a6ccbe12cbdffd6466b5
b34369fa56839a0e05af5c6613e4a229
'''