#! /bin/bash
ROOT=$(dirname "$0")
SGXTOOL=$ROOT/user/sgx-tool
SGX=$ROOT/sgx
DEVICEKEY=$ROOT/user/conf/device.key
INTELKEY=$ROOT/user/conf/intel.key
GDBPORT=-1

key_gen() {
  FILENAME=sign.key
  $SGXTOOL -k 3072 > $FILENAME
}

compile_code() {
  BASEDIR=$(dirname $1)
  SUBDIR=${BASEDIR#*/}
  BASENAME=$(basename $1)
  NAME="${BASENAME%.*}"

  cd user
  make $SUBDIR/$NAME.sgx
}

run_program() {
  $SGX $@
}

debug_program() {
  $SGX -g $GDBPORT $@
}

measure() {
  $SGXTOOL -m $1 
}

sign-intel() {
  BASEDIR=$(dirname $1)
  BASENAME=$(basename $1)
  NAME="${BASENAME%.*}"
  MEASURE=$BASEDIR/$NAME-measurement.conf
  SIG=$BASEDIR/$NAME-sig.conf
  TOKEN=$BASEDIR/$NAME-token.conf
  CONF=$BASEDIR/$NAME.conf

  touch $CONF
  measure $1 > $MEASURE

  $SGXTOOL -S $MEASURE -I > $SIG
  $SGXTOOL -s $SIG --key=$INTELKEY > $CONF
  $SGXTOOL -E $CONF >> $CONF
  rm $MEASURE $SIG 
}

sign() {
  BASEDIR=$(dirname $1)
  BASENAME=$(basename $1)
  NAME="${BASENAME%.*}"
  MEASURE=$BASEDIR/$NAME-measurement.conf
  SIG=$BASEDIR/$NAME-sig.conf
  TOKEN=$BASEDIR/$NAME-token.conf
  CONF=$BASEDIR/$NAME.conf

  touch $CONF
  measure $1 > $MEASURE

  $SGXTOOL -S $MEASURE > $SIG
  $SGXTOOL -s $SIG --key=$2 > $CONF
  $SGXTOOL -E $CONF > $TOKEN
  $SGXTOOL -M $TOKEN --key=$DEVICEKEY >> $CONF

  rm $MEASURE $SIG $TOKEN
}

case "$1" in
  -k|--key)
  key_gen
  ;;
  -c|--compile)
  compile_code $2
  ;;
  -m|--measure)
  measure $2
  ;;
  -s|--sign)
  case "$3" in
    -k|--key)
    sign $2 $4
    ;;
    -I|--intel)
    sign-intel $2
    ;;
  esac
  ;;
  -d|--debug)
  GDBPORT=$2
  shift; shift
  debug_program $@
  ;;
  *)
  run_program $@
  ;;
esac