es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear una clave a partir de una clave JWK para verificar la firma COSE-1 con Python?

Estoy trabajando en un script de Python para verificar los pasaportes de vacunación de Nueva Zelanda. Me resulta difícil en el punto en el que tengo el certificado del gobierno y el mensaje COSE decodificado y necesito intentar verificar su firma:

key_as_dict = {
    KpKty: cose.keys.keytype.KtyEC2,
    # OKPKpCurve: cose.keys.curves.EllipticCurve, # este tampoco funciona
    OKPKpCurve: cose.keys.keytype.KtyEC2,
    OKPKey: kid,
    KpKeyOps: [VerifyOp],
    OKPKpD: jwk_key['x'],
    OKPKpX:jwk_key['y'],
}
govt_key = CoseKey.from_dict(key_as_dict)
cose_decoded.key = govt_key
print("key ready")
print("header", cose_decoded.verify_signature())

Mensaje de error:

cose.exceptions.CoseInvalidKey: COSE curve cannot be None

Esta es la clave JWK proporcionada por el gobierno para fines de prueba:

{ 
    "kty": "EC", 
    "crv": "P-256", 
    "x": "zRR-XGsCp12Vvbgui4DD6O6cqmhfPuXMhi1OxPl8760", 
    "y": "Iv5SU6FuW-TRYh5_GOrJlcV_gpF_GpFQhCOD8LSk3T0"
}

¿Alguien sabe cómo asignar correctamente el certificado del gobierno al diccionario de clave?

Más información:
* He subido el script completo como un gist aquí (lo siento; no soy un gran desarrollador).
* Toda la especificación para los pasaportes está públicamente disponible aquí.
* He intentado obtener la información relevante de la documentación de COSE2.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el mapeo de la clave JWK al diccionario de clave COSE. El mensaje de error sugiere que la curva COSE está configurada en “None”, lo cual no es un valor válido. Según la documentación de COSE, el parámetro OKPKpCurve debería configurarse con un identificador de curva del módulo cose.keys.curves.

    Una posible solución es agregar un mapeo para la curva P-256 en el módulo keytype.py:

    class Curves:
        ...
        P256 = "P-256"
        ...
    

    Luego, actualizar el diccionario de claves de la siguiente manera:

    from cose.keys.keytype import KtyEC2
    from cose.keys.keyops import VerifyOp
    from cose.keys.curves import P256
    from cose.keys.keyparam import EC2Params
    
    key_as_dict = {
        KpKty: KtyEC2,
        OKPKpCurve: P256,
        OKPKey: kid,
        KpKeyOps: [VerifyOp],
        EC2Params: {
            KpCurve: P256,
            KpX: jwk_key['x'],
            KpY: jwk_key['y'],
        },
    }
    
    govt_key = CoseKey.from_dict(key_as_dict)
    cose_decoded.key = govt_key
    print("clave lista")
    print("encabezado", cose_decoded.verify_signature())
    

    Aquí utilizamos el parámetro EC2Params para especificar la curva y las coordenadas de la clave directamente. También podrías intentar utilizar la clase EllipticCurve del módulo cose.keys.curves, pero no está claro en el mensaje de error qué identificador utilizar.

    Ten en cuenta que esta solución es una suposición basada en la información disponible y puede no funcionar en tu caso específico. Podrías consultar la documentación de COSE y JWK o buscar ayuda de un experto en criptografía.

Comments are closed.