#!/usr/bin/env sh

# 軽量ファイルの復号スクリプト (UTF-8)
# ====================================
#
# GitHub 上で公開されている（https://github.com/<user name>.keys で取得できる）
# 自身の RSA 公開鍵を使って暗号化されたファイルを復号/平文化します。
#
# - 使い方の例：
#   以下のコマンドで復号された'himitsu.txt' が作成されます。
#       $ ./dec.sh ../.ssh/private key himitsu.txt.enc himitsu.txt
#
# - 注意：利用前にスクリプトに実行権限を与えるのを忘れないでください。
#

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

    exit 1
fi

# ヘルプ表示
# ----------
if [ $# -lt 3 ]; then
    echo
    echo "使い方: $0 <private key> <input file> <output file>"
    echo
    echo "- <private key> : GitHub で公開している公開鍵のペアとなる秘密鍵のパス"
    echo "- <input file>  : 暗号化されたファイルのパス"
    echo "- <output file> : 復号/平文化されるファイルのパス"
    echo
    exit 1
fi

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

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

if [ ! -r "$INPUTFILE" ]; then
    echo >&2 "暗号化されたファイル ${INPUTFILE} が見つかりません。"
    exit 1
fi

# テキストへ復号
# --------------
# 参考URL ： https://qiita.com/kunichiko/items/3c0b1a2915e9dacbd4c1
printf "%s" "ファイルを復号しています ... "

if ! openssl rsautl -decrypt -inkey "$SECRETKEY" -in "$INPUTFILE" -out "$OUTPUTFILE"; then
    echo >&2 "NG：復号中にエラーが発生しました。以下の内容が考えられます。"
    echo >&2 " - 暗号ファイルが渡されていない"
    echo >&2 " - 暗号化に使われた公開鍵と違うペアの秘密鍵を使っている"
    echo >&2 " - 1 ブロック以上のデータ（長すぎる暗号データ）を復号している"
    echo >&2 "[注意]:"
    echo >&2 "GitHub で公開されている公開鍵のうち 1 番上の公開鍵のペアの秘密鍵を使っているか確認してください。'check.sh'スクリプトで動作確認をおすすめします。"
    rm "$OUTPUTFILE"
    exit 1
fi
echo "OK"

# 終了表示
# --------
echo
echo "ファイルを復号しました。"
echo "復号済みファイル： ${OUTPUTFILE}"
echo
