#!/bin/sh
# 20181119
# Jan Mojzis
# Public domain.

set -e

dn=`dirname "$0"`
dir=`readlink -e "${dn}"`

#change directory to $AUTOPKGTEST_TMP
cd "${AUTOPKGTEST_TMP}"

PATH="/usr/sbin:/sbin:${PATH}"
export PATH

#generate public and secret keys
keys=`curvedns-keygen`
pk=`echo "${keys}" | grep '^Hex public key:.' | sed 's/^Hex public key:.//'`
CURVEDNS_PRIVATE_KEY=`echo "${keys}" | grep '^Hex secret key:.' | sed 's/^Hex secret key:.//'`
export CURVEDNS_PRIVATE_KEY

FAKEDNSPORT=10053
CURVEDNSPORT=11053
query='www.testszone.SOMEWHERE'

#run fakednsserver.py
${dir}/fakednsserver.py 127.0.0.1 "${FAKEDNSPORT}" >fakednsserver.log 2>&1 &
pid=$!

rm -f nonces.txt *.log

(
  echo '0 [01234567]'
  echo '1 [89abcdef]'

  echo '00 [0123]'
  echo '01 [4567]'
  echo '10 [89ab]'
  echo '11 [cdef]'

  echo '000 [01]'
  echo '001 [23]'
  echo '010 [45]'
  echo '011 [67]'
  echo '100 [89]'
  echo '101 [ab]'
  echo '110 [cd]'
  echo '111 [ef]'

  echo '0000 0'
  echo '1111 f'

  echo '00000000 00'
  echo '11111111 ff'

  echo '000000000000 000'
  echo '111111111111 fff'

  echo '0000000000000000 0000'
  echo '1111111111111111 ffff'

  # uncomment line below and test must fail
  # echo "000000000000 001"
) | (

  while read noncestart exp; do

    env \
    UID=`id -u` \
    GID=`id -g` \
    CURVEDNS_DEBUG=5 \
    CURVEDNS_NONCE_SEPARATION_BITS="${noncestart}" \
    CURVEDNS_PRIVATE_KEY="${CURVEDNS_PRIVATE_KEY}" \
    curvedns 127.0.0.1 "${CURVEDNSPORT}" 127.0.0.1 "${FAKEDNSPORT}" 2>curvedns.log &
    cpid=$!

    cleanup() {
      ex=$?
      #kill fakednsserver.py
      kill -TERM "${pid}" 1>/dev/null 2>/dev/null || :
      kill -KILL "${pid}" 1>/dev/null 2>/dev/null || :
      #kill curvedns
      kill -TERM "${cpid}" 1>/dev/null 2>/dev/null || :
      kill -KILL "${cpid}" 1>/dev/null 2>/dev/null || :
      rm -f *.log
      exit "${ex}"
    }
    trap "cleanup" EXIT TERM INT

    sleep 1

    for i in `seq 1 10`; do
      dq -vv -s -a -k "${pk}" -p "${CURVEDNSPORT}" a "${query}" 127.0.0.1 >dq.log 2>&1 || :
      rettm=`grep '^dq: debug: DNSCurve nonce: ' dq.log | grep -v '000000000000000000000000$' | head -1 | cut -d ' ' -f5 | cut -b 25-40`
      ret=`grep '^dq: debug: DNSCurve nonce: ' dq.log | grep -v '000000000000000000000000$' | head -1 | cut -d ' ' -f5 | cut -b 41- | grep "^${exp}"`
      if [ x"${ret}" = x ]; then
        (
          echo "nonce separation test failed for nonce_separation_bits ${noncestart} and regular_expression ${exp}:"
          echo "curvedns.log:"
          cat curvedns.log
          echo
          echo "dq.log:"
          cat dq.log
          echo
        ) >&2
        exit 1
      else
        echo "${rettm} ${ret}: ${noncestart} ${exp}" >>nonces.txt
      fi
    done || exit 1

    kill -TERM "${cpid}" 1>/dev/null 2>/dev/null || :
    kill -KILL "${cpid}" 1>/dev/null 2>/dev/null || :
    sleep 1

  done || exit 1
) || exit 1

echo "nonce separation test works !" >&2
echo "nonce_timestamp_part nonce_random_or_nonce_separation_part: nonce_separation_bits: regular_expressions" >&2
cat nonces.txt >&2
rm -f nonces.txt
exit 0
