Files
proxmox/token-lists/scripts/sign-list.sh
defiQUG cb47cce074 Complete markdown files cleanup and organization
- Organized 252 files across project
- Root directory: 187 → 2 files (98.9% reduction)
- Moved configuration guides to docs/04-configuration/
- Moved troubleshooting guides to docs/09-troubleshooting/
- Moved quick start guides to docs/01-getting-started/
- Moved reports to reports/ directory
- Archived temporary files
- Generated comprehensive reports and documentation
- Created maintenance scripts and guides

All files organized according to established standards.
2026-01-06 01:46:25 -08:00

181 lines
5.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# minisign signing script for token lists
# Signs token list files for integrity verification
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TOKEN_LISTS_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
LISTS_DIR="$TOKEN_LISTS_DIR/lists"
TOKEN_LIST_FILE="$LISTS_DIR/dbis-138.tokenlist.json"
PUBLIC_KEY_FILE="$TOKEN_LISTS_DIR/minisign.pub"
SIGNATURE_FILE="${TOKEN_LIST_FILE}.sig"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Check if minisign is available
if ! command -v minisign &> /dev/null; then
log_error "minisign is required but not installed"
log_info "Installation:"
log_info " macOS: brew install minisign"
log_info " Ubuntu/Debian: apt-get install minisign"
log_info " From source: https://github.com/jedisct1/minisign"
exit 1
fi
# Generate keypair (only if keys don't exist)
generate_keypair() {
local private_key_file="${MINISIGN_PRIVATE_KEY_FILE:-$TOKEN_LISTS_DIR/minisign.key}"
if [[ -f "$private_key_file" ]]; then
log_warn "Private key already exists: $private_key_file"
log_info "Skipping key generation"
return 0
fi
log_info "Generating minisign keypair..."
log_info "Private key will be saved to: $private_key_file"
log_info "Public key will be saved to: $PUBLIC_KEY_FILE"
log_warn "Keep the private key secure and never commit it to the repository!"
# Generate keypair (minisign will prompt for password)
if minisign -G -s "$private_key_file" -p "$PUBLIC_KEY_FILE"; then
log_success "Keypair generated successfully"
log_info ""
log_info "Next steps:"
log_info "1. Store the private key securely (e.g., password manager, secure vault)"
log_info "2. Add private key to GitHub Secrets as MINISIGN_PRIVATE_KEY"
log_info "3. Commit the public key: git add $PUBLIC_KEY_FILE"
log_info "4. Set MINISIGN_PRIVATE_KEY_FILE environment variable if using custom path"
else
log_error "Failed to generate keypair"
exit 1
fi
}
# Sign token list
sign_list() {
local private_key_file="${MINISIGN_PRIVATE_KEY_FILE:-$TOKEN_LISTS_DIR/minisign.key}"
local private_key_content="${MINISIGN_PRIVATE_KEY:-}"
if [[ ! -f "$TOKEN_LIST_FILE" ]]; then
log_error "Token list file not found: $TOKEN_LIST_FILE"
exit 1
fi
log_info "Signing token list: $TOKEN_LIST_FILE"
# Check if private key exists or is provided via environment
if [[ -n "$private_key_content" ]]; then
# Use private key from environment variable
log_info "Using private key from MINISIGN_PRIVATE_KEY environment variable"
echo "$private_key_content" | minisign -S -s /dev/stdin -m "$TOKEN_LIST_FILE" -x "$SIGNATURE_FILE" || {
log_error "Failed to sign token list"
exit 1
}
elif [[ -f "$private_key_file" ]]; then
# Use private key file
minisign -S -s "$private_key_file" -m "$TOKEN_LIST_FILE" -x "$SIGNATURE_FILE" || {
log_error "Failed to sign token list"
exit 1
}
else
log_error "Private key not found"
log_info "Provide private key via:"
log_info " 1. File: Set MINISIGN_PRIVATE_KEY_FILE environment variable"
log_info " 2. Environment: Set MINISIGN_PRIVATE_KEY environment variable"
log_info " 3. Generate new: Run '$0 --generate-key'"
exit 1
fi
log_success "Token list signed successfully"
log_info "Signature file: $SIGNATURE_FILE"
# Display signature info
if [[ -f "$SIGNATURE_FILE" ]]; then
log_info ""
log_info "Signature preview:"
head -n 2 "$SIGNATURE_FILE" | head -c 100
echo "..."
log_info ""
fi
}
# Verify signature
verify_signature() {
if [[ ! -f "$TOKEN_LIST_FILE" ]]; then
log_error "Token list file not found: $TOKEN_LIST_FILE"
exit 1
fi
if [[ ! -f "$SIGNATURE_FILE" ]]; then
log_error "Signature file not found: $SIGNATURE_FILE"
exit 1
fi
if [[ ! -f "$PUBLIC_KEY_FILE" ]]; then
log_error "Public key file not found: $PUBLIC_KEY_FILE"
log_info "Public key should be at: $PUBLIC_KEY_FILE"
exit 1
fi
log_info "Verifying signature..."
if minisign -V -p "$PUBLIC_KEY_FILE" -m "$TOKEN_LIST_FILE" -x "$SIGNATURE_FILE"; then
log_success "Signature verification passed!"
return 0
else
log_error "Signature verification failed!"
return 1
fi
}
# Main
main() {
local command="${1:-sign}"
case "$command" in
--generate-key|-g)
generate_keypair
;;
--sign|-s)
sign_list
;;
--verify|-v)
verify_signature
;;
sign)
sign_list
;;
verify)
verify_signature
;;
*)
echo "Usage: $0 [command]"
echo ""
echo "Commands:"
echo " sign, -s Sign the token list (default)"
echo " verify, -v Verify the signature"
echo " --generate-key, -g Generate a new keypair"
echo ""
echo "Environment variables:"
echo " MINISIGN_PRIVATE_KEY_FILE Path to private key file"
echo " MINISIGN_PRIVATE_KEY Private key content (for CI/CD)"
exit 1
;;
esac
}
main "${1:-sign}"