#!/usr/bin/env sh

# SSHキー(RSA)の鍵長をチェックします。
# ======================================
#
# GitHub 上で公開されている（https://github.com/<user name>.keys で取得できる）
# 相手の RSA 公開鍵の鍵長を調べます。
# 2021年現在、1024bit以下の鍵長は安全性に懸念が生じています。
# 最低でも2048bit、できれば4096bit以上を推奨します。
#
# - 使い方の例：
#       $ ./checkkeylength.sh KEINOS
#
# - 注意：利用前にスクリプトに実行権限を与えるのを忘れないでください。
#

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

    exit 1
fi
if ! type ssh-keygen 2>/dev/null 1>/dev/null; then
    echo >&2 'ssh-keygen コマンド(openssh)がインストールされていません。'

    exit 1
fi

# ヘルプ表示
# ----------
if [ $# -lt 1 ]; then
    echo
    echo "使い方: $0 <github user>"
    echo
    echo "- <github user> : 相手の GitHub アカウント名"
    echo
    exit 1
fi

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

catURL() {
    if type curl 1>/dev/null 2>/dev/null; then
        curl --fail -s "$1"
    elif type wget 1>/dev/null 2>/dev/null; then
        wget -nv -O - "$1"
    elif type fetch 1>/dev/null 2>/dev/null; then
        fetch -q -o - "$1"
    else
        echo >&2 'データ取得に必要なコマンド(curl/wget/fetch)がインストールされていません。'
        exit 1
    fi
}

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

# trap の設定
# -----------
# スクリプト終了後一時ファイルを削除します。
# - 参考URL ： https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
trap 'rm -rf /tmp/${USERNAME}.*' 0

# 一時ファイル
# ------------
if ! RAND="$(getRandStr)"; then
    echo >&2 'OpenSSL によるランダム値の取得に失敗しました。'
    echo >&2 "エラー内容: ${RAND}"
    exit 1
fi

PATHPUBKEY="/tmp/${USERNAME}.${RAND}.pub"

# RSA 公開鍵の取得
# ----------------
# ユーザの GitHub の公開鍵一覧の１行目を取得
# - 取得先は： https://github.com/<user name>.keys
# - 参考URL ： https://qiita.com/m0r1/items/af16c41475d493ab6774
printf "%s" "${USERNAME} の GitHub 上の公開鍵を取得中 ... "

list_keys="$(catURL "https://github.com/${USERNAME}.keys")" || {
    echo >&2 "NG：公開鍵を取得できませんでした。"
    exit 1
}
if [ -z "$list_keys" ]; then
    echo >&2 "NG：公開鍵が存在しませんでした"
    exit 1
fi
echo "$list_keys" | head -n 1 >"$PATHPUBKEY" || {
    echo >&2 "NG：公開鍵を保存できませんでした。"
    exit 1
}
echo "OK"

# RSA公開鍵の鍵長を表示
# ------------------------
# - 参考URL ：
#   - https://qiita.com/ledmonster/items/b57d48981ad7a9d41042

echo "以下に${USERNAME}の鍵長情報を表示します。"
echo
ssh-keygen -l -f "$PATHPUBKEY"
echo

echo "上記の鍵長を確認してください。RSAキーでは行頭の数字（鍵長）が1024以下のものは危険です。"
echo "2048bit以上（できれば4096bit以上）のRSAキーへの作り直しを推奨します。keygenコマンドをご利用ください。"
