如何用Python从JWK生成密钥验证新西兰疫苗通行证COSE签名?
报错核心原因:
- 混淆了EC2类型和OKP类型密钥的参数常量,政府提供的JWK是EC2类型密钥,不能使用OKP前缀的参数
- 曲线参数赋值错误,之前将曲线参数赋值为密钥类型常量,未对应JWK中的P-256曲线
- 公钥参数映射错误,将x、y值赋值到了OKP类型的专属字段中
修正代码
首先导入所需常量:
from cose.keys import CoseKey from cose.keys.keytype import KtyEC2 from cose.keys.curves import P256 from cose.keys.ec2 import EC2KpX, EC2KpY, EC2KpCurve from cose.keys.keyops import VerifyOp from cose.headers import KpKid, KpKeyOps
修正后的密钥字典配置:
key_as_dict = { KpKty: KtyEC2, EC2KpCurve: P256, KpKid: kid, KpKeyOps: [VerifyOp], EC2KpX: jwk_key['x'], EC2KpY: jwk_key['y'], } govt_key = CoseKey.from_dict(key_as_dict) cose_decoded.key = govt_key print("key ready") print("签名验证结果", cose_decoded.verify_signature())
映射规则说明
政府提供的JWK和COSE密钥字典的对应关系如下:
- JWK的
kty: "EC"对应KpKty字段,取值固定为KtyEC2 - JWK的
crv: "P-256"对应EC2KpCurve字段,取值固定为P256常量 - JWK的
x字段直接对应EC2KpX,无需额外解码 - JWK的
y字段直接对应EC2KpY,无需额外解码 - 密钥ID直接赋值到
KpKid字段即可
内容的提问来源于stack exchange,提问作者hey
相关产品推荐
相关产品推荐

