wolfBoot/tools/lms/lms_siglen.sh

60 lines
1.4 KiB
Bash
Executable File

#!/bin/bash
#
# Prints the LMS signature length given 3 LMS parameters.
# This assumes the LMS parameters are the same per each level tree.
#
# References:
# - https://www.rfc-editor.org/info/rfc8554
# - https://eprint.iacr.org/2017/349.pdf
print_usage_and_exit() {
echo "usage:"
echo " ./lms_siglen.sh levels height winternitz"
echo ""
echo "options:"
echo " levels = {1..8}"
echo " height = {5, 10, 15, 20, 25}"
echo " winternitz = {1, 2, 4, 8}"
exit 1
}
if [ $# -ne 3 ]; then
print_usage_and_exit
fi
levels=$1
height=$2
winternitz=$3
if [[ $levels -lt 1 || $levels -gt 8 ]]; then
echo "error: invalid levels: $levels"; exit 1
fi
if [[ "$height" != @("5"|"10"|"15"|"20"|"25") ]]; then
echo "error: invalid height: $height"; exit 1
fi
if [[ "$winternitz" != @("1"|"2"|"4"|"8") ]]; then
echo "error: invalid winternitz: $height"; exit 1
fi
# n == 32 by definition because this LMS implementation uses SHA256.
n=32
# p = f(w). It's a function of Winternitz value.
if [[ $winternitz == 1 ]]; then
p=265
else
p=$(((265 / winternitz) + 1))
fi
# Get the signature length given parameters.
# Reference: Table 2 of Kampanakis, Fluhrer, IACR, 2017.
siglen=$((((36 * levels) + (2 * n * levels) - n - 20) + \
n * ((p * levels) + (height * levels))))
echo "levels: $levels"
echo "height: $height"
echo "winternitz: $winternitz"
echo "signature length: $siglen"