import gnupg import json import pyodbc import argparse # Función para obtener conexión a MSSQL def obtener_conexion(): return pyodbc.connect( 'DRIVER={ODBC Driver 18 for SQL Server};' 'SERVER=140.82.58.83,14338;' 'DATABASE=licencias;' 'UID=sa;' 'PWD=hG0eT6P9CDXQmbVQ3S4IHPX5drBMVxog;' 'TrustServerCertificate=yes' ) def leer_descifrar_y_validar_licencia(archivo_licencia, ambiente_esperado): # Inicializar GPG gpg = gnupg.GPG() try: # Leer el archivo cifrado with open(archivo_licencia, 'rb') as f: contenido_cifrado = f.read() # Descifrar los datos usando la clave privada de la YubiKey descifrado = gpg.decrypt(contenido_cifrado, passphrase='172999') if not descifrado.ok: print(f"Error al descifrar los datos: {descifrado.status}") return print("Licencia descifrada correctamente.") # Verificar la firma de los datos verificacion = gpg.verify(descifrado.data) if verificacion.valid: print("La firma de la licencia es válida.") else: print("La firma de la licencia no es válida.") print(f"Detalles de la verificación de la firma: {verificacion.stderr}") return # Extraer los datos JSON de la parte firmada datos_firmados = descifrado.data.decode('utf-8') # Buscar el comienzo del JSON real (después de los encabezados PGP) json_inicio = datos_firmados.find("{") json_final = datos_firmados.rfind("}") if json_inicio == -1 or json_final == -1: print("No se pudo encontrar el bloque JSON en los datos firmados.") return # Extraer el bloque JSON datos_licencia_json = datos_firmados[json_inicio:json_final + 1] # Convertir el JSON a un diccionario de Python datos_licencia = json.loads(datos_licencia_json) print("Datos de la licencia:") print(datos_licencia) # Verificar los datos contra la base de datos if verificar_datos_contra_bd(datos_licencia): print("La licencia es válida y coincide con los datos en la base de datos.") # Verificar el tipo de ambiente if datos_licencia.get('environment') == ambiente_esperado: print(f"La licencia es válida para el ambiente '{ambiente_esperado}'.") else: print(f"La licencia no es válida para el ambiente '{ambiente_esperado}'. Encontrado: {datos_licencia.get('environment')}") else: print("La licencia no coincide con los datos almacenados en la base de datos.") except Exception as e: print(f"Error al leer, descifrar y validar la licencia: {str(e)}") def verificar_datos_contra_bd(datos_licencia): try: # Conectar a la base de datos MSSQL conn = obtener_conexion() cursor = conn.cursor() # Consultar los datos de la licencia en la base de datos cursor.execute(''' SELECT * FROM licencias WHERE software = ? AND version = ? AND license_key = ? AND expiry_date = ? AND licensed_to = ? AND environment = ? ''', ( datos_licencia['software'], datos_licencia['version'], datos_licencia['license_key'], datos_licencia['expiry_date'], datos_licencia['licensed_to'], datos_licencia['environment'] )) # Obtener el resultado de la consulta resultado = cursor.fetchone() conn.close() # Verificar si se encontraron coincidencias return resultado is not None except pyodbc.Error as e: print(f"Error al verificar la licencia en la base de datos: {str(e)}") return False # Configuración del analizador de argumentos parser = argparse.ArgumentParser(description='Leer, descifrar y validar una licencia.') parser.add_argument('archivo_licencia', type=str, help='Ruta del archivo de licencia cifrado') parser.add_argument('ambiente', type=str, choices=['QA', 'Production'], help='Ambiente esperado de la licencia') # Parsear los argumentos args = parser.parse_args() # Llamar a la función para leer, descifrar y validar la licencia leer_descifrar_y_validar_licencia(args.archivo_licencia, args.ambiente)