#!/bin/bash

# =============================================
# 判官标准版 - 随机签名证书生成工具
# 每次运行生成不同的签名证书
# =============================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 输出目录
OUTPUT_DIR="./keystore"
mkdir -p "$OUTPUT_DIR"

# 随机字符串生成函数
generate_random_string() {
    local length=$1
    cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w $length | head -n 1
}

# 随机数字生成函数
generate_random_number() {
    local min=$1
    local max=$2
    echo $((RANDOM % (max - min + 1) + min))
}

# 随机中文公司名生成
generate_random_company() {
    local prefixes=("北京" "上海" "深圳" "广州" "杭州" "成都" "武汉" "南京" "苏州" "天津")
    local mids=("科技" "网络" "信息" "数据" "智能" "互联" "云端" "数字" "创新" "未来")
    local suffixes=("有限公司" "科技公司" "技术公司" "发展公司" "集团")
    
    local prefix=${prefixes[$RANDOM % ${#prefixes[@]}]}
    local mid=${mids[$RANDOM % ${#mids[@]}]}
    local suffix=${suffixes[$RANDOM % ${#suffixes[@]}]}
    local random_name=$(generate_random_string 4)
    
    echo "${prefix}${random_name}${mid}${suffix}"
}

# 随机部门名生成
generate_random_department() {
    local depts=("技术部" "研发中心" "产品部" "移动开发部" "安全部" "创新实验室" "APP事业部" "数字业务部")
    echo ${depts[$RANDOM % ${#depts[@]}]}
}

# 随机城市生成
generate_random_city() {
    local cities=("Beijing" "Shanghai" "Shenzhen" "Guangzhou" "Hangzhou" "Chengdu" "Wuhan" "Nanjing" "Suzhou" "Tianjin" "Chongqing" "Xian" "Qingdao" "Dalian" "Ningbo")
    echo ${cities[$RANDOM % ${#cities[@]}]}
}

# 随机省份生成
generate_random_province() {
    local provinces=("Guangdong" "Zhejiang" "Jiangsu" "Beijing" "Shanghai" "Sichuan" "Hubei" "Shandong" "Henan" "Fujian")
    echo ${provinces[$RANDOM % ${#provinces[@]}]}
}

# 生成随机证书
generate_random_keystore() {
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}  判官标准版 - 随机签名证书生成器${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
    
    # 生成随机证书信息
    local alias_name="key_$(generate_random_string 8)"
    local store_pass="$(generate_random_string 12)$(generate_random_number 100 999)"
    local key_pass="$store_pass"
    local validity=$(generate_random_number 3650 7300)  # 10-20年有效期
    
    # 随机DN信息
    local cn=$(generate_random_company)
    local ou=$(generate_random_department)
    local o=$(generate_random_company)
    local l=$(generate_random_city)
    local st=$(generate_random_province)
    local c="CN"
    
    # 生成唯一文件名
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local random_suffix=$(generate_random_string 6)
    local keystore_file="${OUTPUT_DIR}/random_${timestamp}_${random_suffix}.jks"
    
    echo -e "${CYAN}正在生成随机证书...${NC}"
    echo ""
    echo -e "${YELLOW}证书信息:${NC}"
    echo -e "  别名: ${GREEN}$alias_name${NC}"
    echo -e "  密钥库密码: ${GREEN}$store_pass${NC}"
    echo -e "  密钥密码: ${GREEN}$key_pass${NC}"
    echo -e "  有效期: ${GREEN}$validity 天${NC}"
    echo ""
    echo -e "${YELLOW}DN信息:${NC}"
    echo -e "  CN (公司名): ${GREEN}$cn${NC}"
    echo -e "  OU (部门): ${GREEN}$ou${NC}"
    echo -e "  O (组织): ${GREEN}$o${NC}"
    echo -e "  L (城市): ${GREEN}$l${NC}"
    echo -e "  ST (省份): ${GREEN}$st${NC}"
    echo -e "  C (国家): ${GREEN}$c${NC}"
    echo ""
    
    # 生成证书
    keytool -genkeypair \
        -alias "$alias_name" \
        -keyalg RSA \
        -keysize 2048 \
        -validity $validity \
        -keystore "$keystore_file" \
        -storepass "$store_pass" \
        -keypass "$key_pass" \
        -dname "CN=$cn, OU=$ou, O=$o, L=$l, ST=$st, C=$c" \
        2>/dev/null
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ 证书生成成功!${NC}"
        echo -e "  文件路径: ${CYAN}$keystore_file${NC}"
        
        # 保存证书信息到文件
        local info_file="${keystore_file%.jks}_info.txt"
        cat > "$info_file" << EOF
# 判官标准版 - 随机签名证书信息
# 生成时间: $(date '+%Y-%m-%d %H:%M:%S')

证书文件: $(basename $keystore_file)
别名(alias): $alias_name
密钥库密码(storepass): $store_pass
密钥密码(keypass): $key_pass
有效期: $validity 天

DN信息:
  CN: $cn
  OU: $ou
  O: $o
  L: $l
  ST: $st
  C: $c

使用示例:
jarsigner -keystore $(basename $keystore_file) -storepass $store_pass -keypass $key_pass your_app.apk $alias_name

apksigner签名:
java -jar apksigner.jar sign --ks $(basename $keystore_file) --ks-pass pass:$store_pass --ks-key-alias $alias_name --key-pass pass:$key_pass --out signed.apk unsigned.apk
EOF
        echo -e "  信息文件: ${CYAN}$info_file${NC}"
    else
        echo -e "${RED}✗ 证书生成失败!${NC}"
        echo -e "  请确保已安装Java JDK"
        return 1
    fi
    
    echo ""
    echo -e "${BLUE}========================================${NC}"
}

# 批量生成证书
batch_generate() {
    local count=$1
    echo -e "${BLUE}批量生成 $count 个随机证书...${NC}"
    echo ""
    
    for i in $(seq 1 $count); do
        echo -e "${YELLOW}[$i/$count] 生成第 $i 个证书${NC}"
        generate_random_keystore
        echo ""
    done
    
    echo -e "${GREEN}批量生成完成! 共生成 $count 个证书${NC}"
    echo -e "证书保存在: ${CYAN}$OUTPUT_DIR/${NC}"
}

# 主菜单
show_menu() {
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}  判官标准版 - 随机签名证书生成器${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
    echo -e "请选择操作:"
    echo -e "  ${GREEN}1.${NC} 生成单个随机证书"
    echo -e "  ${GREEN}2.${NC} 批量生成随机证书"
    echo -e "  ${GREEN}3.${NC} 查看已生成证书"
    echo -e "  ${GREEN}0.${NC} 退出"
    echo ""
    echo -n "请输入选项 [0-3]: "
}

# 主函数
main() {
    while true; do
        show_menu
        read -r option
        case $option in
            1)
                generate_random_keystore
                ;;
            2)
                echo -n "请输入要生成的证书数量: "
                read -r count
                if [[ "$count" =~ ^[0-9]+$ ]] && [ "$count" -gt 0 ]; then
                    batch_generate $count
                else
                    echo -e "${RED}无效数量${NC}"
                fi
                ;;
            3)
                echo -e "${CYAN}已生成的证书:${NC}"
                ls -la "$OUTPUT_DIR"/*.jks 2>/dev/null || echo "暂无证书"
                ;;
            0)
                echo -e "${GREEN}再见!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}无效选项${NC}"
                ;;
        esac
        echo ""
        echo -n "按回车继续..."
        read
        clear
    done
}

# 运行主函数
main
