#!/usr/bin/env sh

# 軽量ファイルの暗号化・復号確認スクリプト (UTF-8)
# ================================================
#
# ファイルの暗号化と復号が正常にできるか確認します。相手が同じスクリプトを使った
# 場合、正常に復号できるかの確認に利用します。
#
# - 基本動作
# GitHub 上で公開されている（https://github.com/<user name>.keys で取得できる）
# あなたの RSA 公開鍵を使って暗号化されたファイルを、ロカールの秘密鍵で復号/平文
# 化を行い、元データと復号データの比較を行います。
#
# - 使い方の例：
#       $ ./check.sh KEINOS ../.ssh/id_rsa
#
# - 注意：利用前にスクリプトに実行権限を与えるのを忘れないでください。
#

# -----------------------------------------------------------------------------
#  Requirement check
# -----------------------------------------------------------------------------
if ! type openssl 2>/dev/null 1>/dev/null; then
    echo >&2 '暗号化に必要な openssl コマンドがインストールされていません。'

    exit 1
fi

PATH_DIR_BIN="$(cd "$(dirname "$0")" && pwd)"

getRandStr() {
    openssl rand -hex 16 2>&1
}

# ヘルプ表示
# ----------
if [ $# -lt 2 ]; then
    echo
    echo "使い方: ${0} <github user> <id_rsa>"
    echo
    echo "- <github user> : あなたの GitHub アカウント名"
    echo "- <id_rsa>      : GitHub で公開している公開鍵のペアとなる秘密鍵のパス"
    echo
    exit 1
fi

# コマンド引数取得
# ----------------
USERNAME="$1"
SECRETKEY="$2"

if [ ! -r "$SECRETKEY" ]; then
    echo >&2 "秘密鍵ファイル ${SECRETKEY} が見つかりません。"
    exit 1
fi
if ! RESULT="$(openssl rsa -in "${SECRETKEY}" -text 2>&1 >/dev/null)"; then
    echo >&2 "秘密鍵ファイル ${SECRETKEY} がサポートしていないフォーマットです。"
    echo >&2
    echo >&2 "Error(openssl)"
    echo >&2 "$RESULT"
    exit 1
fi

# trap の設定
# -----------
# スクリプト終了後サンプルファイルを削除します。
# - 参考URL ： https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
trap "rm -rf ./sample.*" 0

# サンプル・テキストの作成
# ------------------------
if ! SAMPLETEXT="$(getRandStr)"; then
    echo >&2 'OpenSSL によるランダム値の取得に失敗しました。'
    echo >&2 "エラー内容: ${SAMPLETEXT}"
    exit 1
fi

# サンプル・ファイル名設定
# ------------------------
FILENAME="${SAMPLETEXT}"
PATHFILE="./sample.${FILENAME}.txt"

# サンプル・ファイルの作成
# ------------------------
printf "%s" "サンプル・ファイルを作成しています ... "

if ! echo "$SAMPLETEXT" >"$PATHFILE"; then
    echo >&2 "NG：サンプル・ファイルの作成に失敗しました。"
    echo >&2 "サンプル・ファイル名： ${PATHFILE}"
    exit 1
fi
echo "OK"

# サンプル・ファイルの暗号化
# --------------------------
printf "%s" "サンプル・ファイルを暗号化しています ... "

if ! RESULT=$("$PATH_DIR_BIN"/enc "$USERNAME" "$PATHFILE" 2>&1); then
    echo >&2 "NG：サンプル・ファイルの暗号化に失敗しました。"
    echo >&2 "スクリプトの実行権限、ディレクトリの書き込み権限などを確認ください。"
    echo >&2
    echo >&2 "Error(enc):"
    echo >&2 "${RESULT}"
    exit 1
fi
echo "OK"

# サンプル・ファイルの復号
# ------------------------
printf "%s" "暗号ファイルを復号しています ... "

if ! RESULT=$("$PATH_DIR_BIN"/dec "$SECRETKEY" "${PATHFILE}.enc" "${PATHFILE}.dec" 2>&1); then
    echo >&2 "NG：暗号ファイルの復号中にエラーが発生しました。"
    echo >&2 "スクリプトの実行権限、ディレクトリの書き込み権限などを確認ください。"
    echo >&2
    echo >&2 "Error(dec):"
    echo >&2 "${RESULT}"
    exit 1
fi
echo "OK"

# サンプル・ファイルの比較
# ------------------------
printf "%s" "オリジナルと復号ファイルを比較しています ... "

if ! diff "$PATHFILE" "${PATHFILE}.dec"; then
    echo >&2 "NG：オリジナルと復号されたファイルが異なります。"
    echo >&2 "オリジナル："
    cat "${PATHFILE}" >&2
    echo >&2
    echo >&2 "復号："
    cat "${PATHFILE}.dec" >&2
    echo >&2
    exit 1
fi
echo "OK"

# サンプル・ファイルの削除
# ----------------------
printf "%s" "サンプル・ファイルの削除中 ... "

if ! (rm "$PATHFILE" && rm "${PATHFILE}.enc"); then
    echo >&2 "NG：一時ファイルの削除に失敗しました。 手動で削除してください。"
    echo >&2 "ファイル名： ${PATHFILE}"
    exit 1
fi
echo "OK"

# 終了表示
# --------
echo
echo "暗号化・復号のテストを終了しました。"
echo "✅ 問題なさそうです。"
echo
