From 6ed686910faef2b37624d72eca336694f0e3576e Mon Sep 17 00:00:00 2001 From: nodoka Date: Wed, 21 Jan 2026 01:17:52 +0000 Subject: [PATCH] Update bootstrap: 2026-01-21 01:17:52 --- nbcrypt | 43 +++++++++++++++++++++++++++++-------------- nbmain.sh.enc | Bin 1104 -> 1088 bytes 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/nbcrypt b/nbcrypt index cd8ab34..71a77d5 100755 --- a/nbcrypt +++ b/nbcrypt @@ -3,6 +3,10 @@ set -euo pipefail # nbcrypt - SSH Agent ベースの暗号化/復号ツール # Ed25519 署名で決定的な鍵導出を行う +# +# 環境変数: NB_SIGN_VIA_SSH, NB_SSH_PORT +# DevContainer 等で Agent が使えないとき、NB_SIGN_VIA_SSH=user@host を指定すると +# ホストの ~/.ssh/id_ed25519 で署名してもらう。NB_SSH_PORT でポート指定(未設定時 22)。 SCRIPT_NAME="$(basename "$0")" KEY_SEED_MESSAGE="nbase2-secret-key-seed-v1" @@ -62,7 +66,8 @@ Text commands support stdin: echo "encrypted" | $SCRIPT_NAME dec - Requirements: - - SSH Agent with id_ed25519 key, or ~/.ssh/id_ed25519 file, or BWS_ACCESS_TOKEN + - SSH Agent with id_ed25519 key, or ~/.ssh/id_ed25519 file, or BWS_ACCESS_TOKEN, + or NB_SIGN_VIA_SSH (DevContainer: sign via host's ~/.ssh/id_ed25519; NB_SSH_PORT for port) - ssh-keygen and openssl commands must be available Examples: @@ -314,7 +319,7 @@ install_bws() { derive_key() { # Ed25519 署名から暗号鍵を導出(同じメッセージなら同じ署名で決定的) - # 優先順位: 1. SSH Agent, 2. 秘密鍵ファイル, 3. BWS (check_ssh_agent で処理) + # 優先順位: 1. SSH Agent, 2. 秘密鍵ファイル, 3. NB_SIGN_VIA_SSH, 4. BWS (check_ssh_agent で処理) local temp_message=$(mktemp) local temp_sig=$(mktemp) @@ -327,7 +332,8 @@ derive_key() { echo -n "$KEY_SEED_MESSAGE" > "$temp_message" # 1. SSH Agent から Ed25519 の公開鍵を取得を試みる - if ssh-add -L 2>/dev/null | grep "ssh-ed25519" | head -1 | awk '{print $1 " " $2}' > "$temp_pubkey" 2>/dev/null && [ -s "$temp_pubkey" ]; then + ssh-add -L 2>/dev/null | grep "ssh-ed25519" | head -1 | awk '{print $1 " " $2}' > "$temp_pubkey" 2>/dev/null + if [ -s "$temp_pubkey" ]; then # Agent から取得できた場合 echo "key1 $(cat "$temp_pubkey")" > "$temp_allowed" @@ -339,7 +345,7 @@ derive_key() { fi fi - # 2. SSH Agent がない場合、秘密鍵ファイルから直接署名を試みる + # 2. 秘密鍵ファイルから直接署名を試みる local key_file="${NB_KEY_FILE:-${HOME}/.ssh/id_ed25519}" if [ -f "$key_file" ]; then # 公開鍵を抽出 @@ -355,8 +361,17 @@ derive_key() { fi fi - # 3. どちらも失敗した場合、エラー(BWS は check_ssh_agent で処理される) - error "Could not derive key from SSH Agent or private key file. Please ensure SSH Agent is running with Ed25519 key, or set NB_KEY_FILE to a valid private key path." + # 3. ホスト SSH: NB_SIGN_VIA_SSH / NB_SSH_PORT(未設定時 nodoka@host.docker.internal:60516)で ~/.ssh/id_ed25519 に署名してもらう + if ssh -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new -p "${NB_SSH_PORT:-60516}" "${NB_SIGN_VIA_SSH:-nodoka@host.docker.internal}" 'echo -n "nbase2-secret-key-seed-v1" | ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n "nbase2"' > "$temp_sig" 2>/dev/null; then + _key=$(cat "$temp_sig" | base64 -d 2>/dev/null | sha256sum | head -c 64) + if [[ "${_key:-}" =~ ^[0-9a-f]{64}$ ]]; then + echo -n "$_key" + return 0 + fi + fi + + # 4. どれも失敗した場合、エラー(BWS は check_ssh_agent で処理される) + error "Could not derive key from SSH Agent, private key file, or host. Ensure SSH Agent has Ed25519, or set NB_KEY_FILE. Host: NB_SIGN_VIA_SSH/NB_SSH_PORT (default nodoka@host.docker.internal:60516)." } encrypt_file() { @@ -367,9 +382,9 @@ encrypt_file() { error "Input file not found: $input" fi - # 秘密鍵ファイルがある場合は check_ssh_agent をスキップ + # 秘密鍵ファイルまたは NB_SIGN_VIA_SSH がある場合は check_ssh_agent をスキップ local key_file="${NB_KEY_FILE:-${HOME}/.ssh/id_ed25519}" - if [ ! -f "$key_file" ]; then + if [ ! -f "$key_file" ] && [ -z "${NB_SIGN_VIA_SSH:-}" ]; then check_ssh_agent fi @@ -422,9 +437,9 @@ decrypt_file() { error "Ed25519 key not found in SSH Agent after BWS setup" fi else - # 秘密鍵ファイルがある場合は check_ssh_agent をスキップ + # 秘密鍵ファイルまたは NB_SIGN_VIA_SSH がある場合は check_ssh_agent をスキップ local key_file="${NB_KEY_FILE:-${HOME}/.ssh/id_ed25519}" - if [ ! -f "$key_file" ]; then + if [ ! -f "$key_file" ] && [ -z "${NB_SIGN_VIA_SSH:-}" ]; then check_ssh_agent fi fi @@ -449,9 +464,9 @@ decrypt_file() { encrypt_text() { local input_text="$1" - # 秘密鍵ファイルがある場合は check_ssh_agent をスキップ + # 秘密鍵ファイルまたは NB_SIGN_VIA_SSH がある場合は check_ssh_agent をスキップ local key_file="${NB_KEY_FILE:-${HOME}/.ssh/id_ed25519}" - if [ ! -f "$key_file" ]; then + if [ ! -f "$key_file" ] && [ -z "${NB_SIGN_VIA_SSH:-}" ]; then check_ssh_agent fi @@ -478,9 +493,9 @@ encrypt_text() { decrypt_text() { local input_text="$1" - # 秘密鍵ファイルがある場合は check_ssh_agent をスキップ + # 秘密鍵ファイルまたは NB_SIGN_VIA_SSH がある場合は check_ssh_agent をスキップ local key_file="${NB_KEY_FILE:-${HOME}/.ssh/id_ed25519}" - if [ ! -f "$key_file" ]; then + if [ ! -f "$key_file" ] && [ -z "${NB_SIGN_VIA_SSH:-}" ]; then check_ssh_agent fi diff --git a/nbmain.sh.enc b/nbmain.sh.enc index 0d42ed9c0db7c839ed0fe1b92203b79834f9f3a3..c45113194f538fc845b444f3c1fcbf78a13fcdd9 100644 GIT binary patch literal 1088 zcmV-G1i$-JVQh3|WM5y4`dqSs(zWg`UpjhwlqPVwSPqEyO0p*8a!;l4!@|(Waei$I)k!>6Gf3 zNTce6h>UC(9%sp*E^gm!$~Hx)2N{cI@y`E!(j>OoU03e=t<;WOAQR3zH=*W0?~lsv z@dZQkbFRa-BE2lM<*wVaQ%!Z`-#)A{Ha~m`mzClJNb#`=w}r1anWcB&P|0p?~9fVt_{XHHZiBQhJC#M)x&FU7lRys)el0Y5lTX^2Ig=)kc% zC7hO5*;|9iLFH3upekps-G0|%bphgtv*%y!9l@bMsM`L`X1 zXa6^ZU^YreN_7OJ`jLAlL2+!1d_-TW_1y+0R2I&-_CXY!MICl`_UOM=y{|n#h1gn5 zo)eAwtx6&^7H4d%0Ypa7rgro z{o)#)J>UtF=do6GL!xwD8znl*Z?_@PBgV?YMmVo!e1Qvz>*QMI`P@$VnGSLlE`Mq&@U9?+ZA9 z2aabmp&Msr?o~{Pu>qb@ykZF@KN;3F6qOdOrA5;*JvA!D$M#yM<*F| z4P(BG|6l+r%V(K>bye;=w3-oGpE;H@b_pd~#yu%BJpLM|uEwB+>f7*1)~}#E(O1x^ zFZyECux%jFQldxM4p&Wo2jr#Kv29_^>r%&wKuZ)O zng2UNSuobWSmLYf>UNw*6BvyzeD}l}zTu*>1;?ELq0ObVg*{Sn+1hM1C4pmMbPwd& GM+nlz)f_bd literal 1104 zcmV-W1h4y3VQh3|WM5y@&mVjtEWKL8b)&g@wJxT~<{klXj=-PCQiXScL{$k9h^zmO zR1-20=bgX&iR|mhUKfLd7>2DU03Y_T08HTZPA$-iISDpRQ$}O`JDF07aj7N$7{QU?J z(+d-2zHRU?P43hJbGJCmJ&CoW>d%R+s-=zuNa{xPY1mS~&i-XuR~k{L`N^dI4QIQA zibf`-7Da3zNkO}`z9&B}d5)s)1Jt2KrJ~-)ss3Kx^WszK6L1=#@qTU+F{UOvSk*{xS(9U0wwA>YP5@Bwp~x7BV+WXwTiPI-vq%E}@cH|E#~oe1%?F6X{erbpuA;8u|E61yI`(<-7HQ|DF3U9S z1a*N>j^6{+Ysnh?UsYGVz-$#r(3Ns8U}s0LCd}@Wk9Qy4<iE}PfoU@@)a=o!bnl54|#a%;sX-CA}}c2G+U z?w{$9G@h7CxaBB%NDG+bO!;&Qg|%k=e(HM|r=>seMor|GN*z|5CPG%em zF;NoWr)Joa$u;xlgJ#IPgw{w;gmCV8x};q=6P2FGF)|TQVgA*|7K;OFEB&KmvvkpGNK4TZO6MEq=MG%yD(91F>3a>yAq zYFdPZ>Q*&wqHOWGZkgfZVUO;+wncJ0Bmt~R0QW4lAwF%($7VVQBZieIu5Gg{Z$)$Vp0I1(lx&mWOCr{_cvY+vAzz26^@;V2wbNIhN$)tAn+s#L_;oXJur5j<9 z_Ufu`l;`}QFz)voe{XB47Tbww*V3ZRx3aT>c~L=Mz*ou zI!U!lwmn@lvnh8EP15Oi7nZde9Iq%1ywU*TCIUZ-NByrC0<;Ysjg5ZTRcW5VvVOuG WKBp77n9$DLegZC2cMq7QEq;$_l`TjB