passkey-authenticator 0.6.0

A webauthn authenticator supporting passkeys.
Documentation
use passkey_crypto::{
    AvailableBackend, AvailableRng, CryptoBackend, PublicKeyT, SecretKeyT, rng::RngBackend,
};
use passkey_types::ctap2::AuthenticatorData;

#[test]
fn private_key_cose_round_trip_sanity_check() {
    let algs = AvailableBackend.enumerate_algorithms();
    for alg in algs {
        let original_private_key = AvailableBackend
            .generate_key(alg)
            .unwrap_or_else(|_| panic!("Backend does not support {:?}", alg));
        let private_cose = original_private_key.to_cose_key();
        let public_key = original_private_key.public_key();

        let auth_data = AuthenticatorData::new("future.1password.com", None, &AvailableBackend);
        let mut signature_target = auth_data.to_vec();
        signature_target.extend(AvailableRng::random_vec(32));

        let mut reconstructed_private_key =
            <AvailableBackend as CryptoBackend>::SecretKey::from_cose_key(&private_cose)
                .expect("to get a private key");

        let signature = reconstructed_private_key.sign(&signature_target);

        public_key
            .verify(&signature_target, &signature)
            .unwrap_or_else(|_| panic!("failed to verify signature for {:?}", alg));
    }
}