#!/bin/bash

# 1. generate two stage AES-CBC-256 binaries
# input files
# - m_key.bin: stage 1 AES encrption key which is provisioned to OTP Efuse
# - header_32.bin: TIFS csp_aes_ctx structure header for stage 1
# - header_1024.bin: TIFS csp_aes_ctx structure header for stage 2
#
# output files (stage 1)
# - csp_s1_ref_data.h: data input (d_key.bin) for stage 1, which is used for comparison purpose in code
# - csp_s1_dec_data.h: TIFS csp_aes_ctx structure + encrypted data
#
# output files (stage 2)
# - csp_s2_ref_data.h: data input (data_input.bin) for stage 2, which is used for comparison purpose in code
# - csp_s2_dec_data.h: TIFS csp_aes_ctx structure + encrypted data
#
# 2. refer to "optee_csp_otp_reademe.txt" on how to run the test
#

echo "generate stage 1 binaries"

# stage 2 data AES encryption key
openssl rand -out d_key.bin 32

# stage 1 IV
openssl rand -out iv_1.bin 16

# dummy AES key & tag placeholder for calling TIFS csp_aes_ctx structure
dd if=/dev/zero of=key_zero.bin bs=32 count=1
dd if=/dev/zero of=tag_zero.bin bs=16 count=1

# AES key to *.h file
xxd -i -c 16 d_key.bin > csp_s1_ref_data.h

# AES-CBC-256 encryption
# key: m_key.bin
# data to be encrypted: d_key.bin
openssl aes-256-cbc -e -nopad -iv "$(xxd -p -c 16 iv_1.bin)" -K "$(xxd -p -c 32 m_key.bin)" -in 'd_key.bin' -out 'd_key_enc.bin'
# AES-CBC-256 decryption for reference
openssl aes-256-cbc -d -nopad -iv "$(xxd -p -c 16 iv_1.bin)" -K "$(xxd -p -c 32 m_key.bin)" -in 'd_key_enc.bin' -out 'd_key_dec.bin'

# TIFS csp_aes_ctx structure + encrypted data blob
cat header_32.bin key_zero.bin iv_1.bin tag_zero.bin d_key_enc.bin > csp_s1_dec_data.bin
xxd -i -c 16 csp_s1_dec_data.bin > csp_s1_dec_data.h


echo "generate stage 2 binaries"
# stage 2 IV
openssl rand -out iv_2.bin 16

# stage 2 input data
openssl rand -out input_data.bin 1024

# AES-CBC-256 encryption
# key: d_key.bin
# data to be encrypted: input_data.bin
openssl aes-256-cbc -e -nopad -iv "$(xxd -p -c 16 iv_2.bin)" -K "$(xxd -p -c 32 d_key.bin)" -in 'input_data.bin' -out 'input_data_enc.bin'
openssl aes-256-cbc -d -nopad -iv "$(xxd -p -c 16 iv_2.bin)" -K "$(xxd -p -c 32 d_key.bin)" -in 'input_data_enc.bin' -out 'input_data_dec.bin'

# input_data.bin to *.h file
xxd -i -c 16 input_data.bin > csp_s2_ref_data.h

# TIFS csp_aes_ctx structure + encrypted data for stage 2
cat header_1024.bin key_zero.bin iv_2.bin tag_zero.bin input_data_enc.bin > csp_s2_dec_data.bin
xxd -i -c 16 csp_s2_dec_data.bin > csp_s2_dec_data.h

exit
