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.
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ódulocose.keys.curves
.Una posible solución es agregar un mapeo para la curva
P-256
en el módulokeytype.py
:Luego, actualizar el diccionario de claves de la siguiente manera:
Aquí utilizamos el parámetro
EC2Params
para especificar la curva y las coordenadas de la clave directamente. También podrías intentar utilizar la claseEllipticCurve
del módulocose.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.