import hashlib
import base64
import uuid
import subprocess
import platform
import logging

def get_windows_serial_number():
    """
    获取Windows系统的唯一序列号
    """
    try:
        if platform.system() != "Windows":
            raise Exception("此功能仅支持Windows系统")
        
        # 使用WMIC获取BIOS序列号
        result = subprocess.check_output(
            'wmic bios get serialnumber', 
            shell=True, 
            stderr=subprocess.STDOUT,
            text=True
        )
        
        # 解析输出结果
        lines = result.strip().split('\n')
        for line in lines:
            if line.strip() and "SerialNumber" not in line:
                serial = line.strip()
                if serial and serial != "System Serial Number" and serial != "To be filled by O.E.M.":
                    return serial
        
        # 如果无法获取BIOS序列号，尝试获取磁盘序列号
        result = subprocess.check_output(
            'wmic diskdrive get serialnumber', 
            shell=True, 
            stderr=subprocess.STDOUT,
            text=True
        )
        
        lines = result.strip().split('\n')
        for line in lines:
            if line.strip() and "SerialNumber" not in line:
                serial = line.strip()
                if serial:
                    return serial
        
        raise Exception("无法获取系统序列号")
        
    except Exception as e:
        logging.warning(f"获取Windows序列号失败: {e}")
        # 返回一个备用标识符
        return str(uuid.getnode())

def get_mac_address():
    """
    获取MAC地址
    """
    try:
        # 获取本机的MAC地址
        mac = uuid.getnode()
        mac_str = ':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
        return mac_str
    except Exception as e:
        logging.error(f"获取MAC地址失败: {e}")
        return "00:00:00:00:00:00"

def triple_hash_sha384(data):
    """
    对数据进行三次连续的SHA384哈希计算
    """
    print(f"原始数据: {data}")
    
    # 第一次SHA384
    hash1 = hashlib.sha384(data.encode('utf-8')).hexdigest()
    print(f"第一次SHA384: {hash1}")
    
    # 第二次SHA384
    hash2 = hashlib.sha384(hash1.encode('utf-8')).hexdigest()
    print(f"第二次SHA384: {hash2}")
    
    # 第三次SHA384
    hash3 = hashlib.sha384(hash2.encode('utf-8')).hexdigest()
    print(f"第三次SHA384: {hash3}")
    
    return hash3

def triple_hash_sha256(data):
    """
    对数据进行三次连续的SHA256哈希计算
    """
    print(f"原始数据: {data}")
    
    # 第一次SHA256
    hash1 = hashlib.sha256(data.encode('utf-8')).hexdigest()
    print(f"第一次SHA256: {hash1}")
    
    # 第二次SHA256
    hash2 = hashlib.sha256(hash1.encode('utf-8')).hexdigest()
    print(f"第二次SHA256: {hash2}")
    
    # 第三次SHA256
    hash3 = hashlib.sha256(hash2.encode('utf-8')).hexdigest()
    print(f"第三次SHA256: {hash3}")
    
    return hash3

def main():
    """
    主函数
    """
    print("=" * 50)
    print("开始生成许可证文件")
    print("=" * 50)
    
    try:
        # 1. 获取Windows序列号和MAC地址
        print("\n步骤1: 获取系统信息")
        serial_number = get_windows_serial_number()
        mac_address = get_mac_address()
        
        print(f"系统序列号: {serial_number}")
        print(f"MAC地址: {mac_address}")
        
        # 2. 对序列号进行三次SHA384计算
        print("\n步骤2: 对序列号进行三次SHA384计算")
        serial_hash = triple_hash_sha384(serial_number)
        
        # 3. 对MAC地址进行三次SHA256计算
        print("\n步骤3: 对MAC地址进行三次SHA256计算")
        mac_hash = triple_hash_sha256(mac_address)
        
        # 4. 拼接两个哈希值并进行Base64编码
        print("\n步骤4: 拼接哈希值并进行Base64编码")
        combined_hash = serial_hash + mac_hash
        print(f"拼接后的哈希值: {combined_hash}")
        
        base64_encoded = base64.b64encode(combined_hash.encode('utf-8')).decode('utf-8')
        print(f"Base64编码结果: {base64_encoded}")
        
        # 5. 对Base64结果进行三次SHA384计算
        print("\n步骤5: 对Base64结果进行三次SHA384计算")
        final_hash = triple_hash_sha384(base64_encoded)
        
        # 6. 对最终哈希值进行Base64编码
        print("\n步骤6: 对最终哈希值进行Base64编码")
        final_base64 = base64.b64encode(final_hash.encode('utf-8')).decode('utf-8')
        print(f"最终Base64序列: {final_base64}")
        
        # 7. 保存到lic文件
        print("\n步骤7: 保存到文件")
        with open('license', 'w', encoding='utf-8') as f:
            f.write(final_base64)
        
        print(f"许可证文件已保存到: {os.path.abspath('lic')}")
        
        # 8. 成功日志
        print("\n" + "=" * 50)
        print("许可证生成成功!")
        print("=" * 50)
        
        # 显示文件内容预览
        print(f"生成的许可证内容 (前50字符): {final_base64[:50]}...")
        
    except Exception as e:
        print(f"\n错误: {e}")
        logging.error(f"许可证生成失败: {e}")

if __name__ == "__main__":
    # 配置日志
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    
    # 导入os模块（在需要时导入）
    import os
    
    main()