# set -e
source helpers.sh

start_up

CRYPTO_PROFILE="ECC"
setup_fapi $CRYPTO_PROFILE

function cleanup {
    tss2 delete --path=/
    shut_down
}

trap cleanup EXIT

# openssl ecparam -name secp256r1 -genkey -noout -out key_priv.pem
# openssl ec -in key_priv.pem -pubout -out key_pub.pem

# -----BEGIN PUBLIC KEY-----
# MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAw+PKFksCw+ikD76l6BMeXfebcZx
# Gf8QGWT2MOy8tOfpe6m+6MUUm2GUijGPkvCTjtJPOJz//XMom+k+7OaWmA==
# -----END PUBLIC KEY-----

# -----BEGIN EC PRIVATE KEY-----
# MHcCAQEEICf0OXKKsPkEVR1jsPOKSQQJnJVimamLYwLDZwJDj7etoAoGCCqGSM49
# AwEHoUQDQgAEAw+PKFksCw+ikD76l6BMeXfebcZxGf8QGWT2MOy8tOfpe6m+6MUU
# m2GUijGPkvCTjtJPOJz//XMom+k+7OaWmA==
# -----END EC PRIVATE KEY-----


KEY_PATH_1=HS/SRK/mySignKey1
KEY_PATH_2=HS/SRK/mySignKey2
SIGN_POLICY_DATA=pol_signed.json
SIGN_POLICY_DATA_KEY_HINT=pol_signed_key_hint.json
POLICY_SIGNED=policy/policy-signed
POLICY_SIGNED_KEY_HINT=policy/policy-signed_key_hint
TEST_SIGNATURE_FILE=test_signature.file
SIGNATURE_FILE=signature.file
DIGEST_FILE=digest.file
PRIV_KEY_FILE=priv_key.file

LOG_FILE=$TEMP_DIR/log.file
touch $LOG_FILE

EMPTY_FILE=$TEMP_DIR/empty.file
BIG_FILE=$TEMP_DIR/big_file.file

# Setup Policy Signed
cat > $SIGN_POLICY_DATA_KEY_HINT <<EOF
{
    "description":"Description pol_signed",
    "policy":[
        {
            "type": "POLICYSIGNED",
            "keyPEM": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAw+PKFksCw+ikD76l6BMeXfebcZx\nGf8QGWT2MOy8tOfpe6m+6MUUm2GUijGPkvCTjtJPOJz//XMom+k+7OaWmA==\n-----END PUBLIC KEY-----",
            "keyPEMhashAlg": "SHA1",
            "publicKeyHint": "My Signature Key"
        }
    ]
}
EOF

cat > $SIGN_POLICY_DATA <<EOF
{
    "description":"Description pol_signed",
    "policy":[
        {
            "type": "POLICYSIGNED",
            "keyPEM": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAw+PKFksCw+ikD76l6BMeXfebcZx\nGf8QGWT2MOy8tOfpe6m+6MUUm2GUijGPkvCTjtJPOJz//XMom+k+7OaWmA==\n-----END PUBLIC KEY-----",
            "keyPEMhashAlg": "SHA1",
        }
    ]
}
EOF

# Write private pem key to file
cat > $PRIV_KEY_FILE <<EOF
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEICf0OXKKsPkEVR1jsPOKSQQJnJVimamLYwLDZwJDj7etoAoGCCqGSM49
AwEHoUQDQgAEAw+PKFksCw+ikD76l6BMeXfebcZxGf8QGWT2MOy8tOfpe6m+6MUU
m2GUijGPkvCTjtJPOJz//XMom+k+7OaWmA==
-----END EC PRIVATE KEY-----
EOF

echo -n 01234567890123456789 > $DIGEST_FILE

tss2 provision

tss2 import --path=$POLICY_SIGNED --importData=$SIGN_POLICY_DATA

tss2 import --path=$POLICY_SIGNED_KEY_HINT --importData=$SIGN_POLICY_DATA_KEY_HINT

tss2 createkey --path $KEY_PATH_1 --type="sign, noda" \
  --policyPath $POLICY_SIGNED --authValue ""

tss2 createkey --path $KEY_PATH_2 --type="sign, noda" \
  --policyPath $POLICY_SIGNED_KEY_HINT --authValue ""

OUTPUT_FILE=$TEMP_DIR/data2sign.file

expect <<EOF
    spawn sh -c "tss2 sign --keyPath=$KEY_PATH_1 --digest=$DIGEST_FILE --signature=$TEST_SIGNATURE_FILE --force 2> $LOG_FILE"
    expect "Filename for nonce output: " {
        send "$OUTPUT_FILE\r"
        expect "Filename for signature input: " {
            exec openssl dgst -sha1 -sign $PRIV_KEY_FILE -out $SIGNATURE_FILE $OUTPUT_FILE
            send "$SIGNATURE_FILE\r"
            exp_continue
        }
    }
EOF

if grep "ERROR" $LOG_FILE > /dev/null
then
  cat $LOG_FILE
  exit 1
fi

expect <<EOF
    spawn sh -c "tss2 sign --keyPath=$KEY_PATH_2 --digest=$DIGEST_FILE --signature=$TEST_SIGNATURE_FILE --force 2> $LOG_FILE"
    expect "Filename for nonce output: " {
        send "$OUTPUT_FILE\r"
        expect "Filename for signature input: " {
            exec openssl dgst -sha1 -sign $PRIV_KEY_FILE -out $SIGNATURE_FILE $OUTPUT_FILE
            send "$SIGNATURE_FILE\r"
            exp_continue
        }
    }
EOF

if grep "ERROR" $LOG_FILE > /dev/null
then
  cat $LOG_FILE
  exit 1
fi

echo "sign callback with BIG_FILE" # Expected to fail
expect <<EOF
    spawn sh -c "tss2 sign --keyPath=$KEY_PATH_1 --digest=$DIGEST_FILE --signature=$TEST_SIGNATURE_FILE --force 2> $LOG_FILE"
    expect "Filename for nonce output: " {
        send "$OUTPUT_FILE\r"
        expect "Filename for signature input: " {
            exec openssl dgst -sha1 -sign $PRIV_KEY_FILE -out $SIGNATURE_FILE $OUTPUT_FILE
            send "$BIG_FILE\r"
            set ret [wait]
            if {[lindex \$ret 2] || [lindex \$ret 3] == 0} {
                send_user "\n[lindex \$ret]\n"
                send_user "Command not failed as expected\n"
                exit 1
            }
        }
        set ret [wait]
        if {[lindex \$ret 2] || [lindex \$ret 3] == 0} {
            set file [open $LOG_FILE r]
            set log [read \$file]
            close $file
            send_user "\n[lindex \$ret]\n"
            send_user "Command has not failed as expected\n"
            exit 1
        }
    }          
EOF

if [[ "`cat $LOG_FILE`" == $SANITIZER_FILTER ]]; then
  echo "Error: AddressSanitizer triggered."
  cat $LOG_FILE
  exit 1
fi

echo "sign callback with EMPTY_FILE" # Expected to fail
expect <<EOF  
    spawn sh -c "tss2 sign --keyPath=$KEY_PATH_1 --digest=$DIGEST_FILE --signature=$TEST_SIGNATURE_FILE --force 2> $LOG_FILE"
    expect "Filename for nonce output: " {
        send "$OUTPUT_FILE\r"
        expect "Filename for signature input: " {
            exec openssl dgst -sha1 -sign $PRIV_KEY_FILE -out $SIGNATURE_FILE $OUTPUT_FILE
            send "$EMPTY_FILE\r"
            set ret [wait]
            if {[lindex \$ret 2] || [lindex \$ret 3] == 0} {
                send_user "\n[lindex \$ret]\n"
                send_user "Command has not failed as expected\n"
                exit 1
            }
        }
        set ret [wait]
        if {[lindex \$ret 2] || [lindex \$ret 3] == 0} {
            set file [open $LOG_FILE r]
            set log [read \$file]
            close $file
            send_user "\n[lindex \$ret]\n"
            send_user "Command has not failed as expected\n"
            exit 1
        }
    }          
EOF

if [[ "`cat $LOG_FILE`" == $SANITIZER_FILTER ]]; then
  echo "Error: AddressSanitizer triggered."
  cat $LOG_FILE
  exit 1
fi

exit 0