我正在Rust中实现WebAuthentication密钥注册。我被指令14或registering a new credential困住了:
验证attStmt是正确的证明声明,表示 有效的证明签名,使用证明声明格式 给出了attStmt,authData和的哈希值的fmt验证程序 步骤7中计算的序列化客户端数据。
这将进一步解释为:
如果存在x5c,则表明证明类型不是 ECDAA。在这种情况下:
验证sig是对的串联有效的签名 使用证明公钥的authenticatorData和clientDataHash 在atestnCert中使用alg中指定的算法。
验证attestnCert是否符合§8.2.1包装的要求 证明书证书要求。
如果attestnCert包含OID 1.3.6.1.4.1.45724.1.1.4的扩展名 (id-fido-gen-ce-aaguid)验证此扩展程序的值 匹配authenticatorData中的aaguid。
如果成功,则返回认证类型“基本”和“认证信任” 路径x5c。
我们在第8.2.1节中进一步了解到attestnCert
必须经过der编码。因此,我使用attestnCert
板条箱将der_parser
解析为der:
let parsed = parse_der(attestn_cert).unwrap();
// Cert parses successfully as a der:
println!("Parsed attestation cert: {:?}", parsed);
然后,我使用webpki
板条箱来验证证书。按照该示例,我可以编写:
let ee_input = untrusted::Input::from(attestn_cert);
let cert = webpki::EndEntityCert::from(ee_input).unwrap();
但是,在这一点上,我被困住了。 webpki
包装箱中的所有示例均涉及验证证书链。据我了解,FIDO-U2f设备本质上是自签名的。
如何在Rust中验证WebAuthentication流返回的X.509证书?
完整代码为here