ctap2-proto: Add authenticator::client_pin::raw::PublicKey type for deserialization

The cosey::PublicKey type does not properly implement deserialize for
the general PublicKey type. the client_pin::raw::PublicKey type is used
as an intermediate to allow deserialization of COSE public keys in the
client_pin protocol.
main
Nick Zana 1 year ago
parent 984e43cd18
commit df78c9e303

@ -7,6 +7,9 @@ use serde::{Deserialize, Serialize};
pub mod auth_protocol; pub mod auth_protocol;
#[cfg(feature = "serde")]
mod raw;
pub type PinUvAuthParam = [u8; 16]; pub type PinUvAuthParam = [u8; 16];

@ -0,0 +1,6 @@
//! Used to make serialization and deseriazation of the request and response
//! possible in CBOR format while maintaining ergonomic enum variants for public
//! API.
mod public_key;

@ -0,0 +1,32 @@
use cosey::{EcdhEsHkdf256PublicKey, Ed25519PublicKey, P256PublicKey};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub(crate) enum PublicKey {
P256Key(P256PublicKey),
EcdhEsHkdf256Key(EcdhEsHkdf256PublicKey),
Ed25519Key(Ed25519PublicKey),
}
impl Into<cosey::PublicKey> for PublicKey {
fn into(self) -> cosey::PublicKey {
match self {
PublicKey::P256Key(key) => cosey::PublicKey::P256Key(key),
PublicKey::EcdhEsHkdf256Key(key) => cosey::PublicKey::EcdhEsHkdf256Key(key),
PublicKey::Ed25519Key(key) => cosey::PublicKey::Ed25519Key(key),
}
}
}
pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<Option<cosey::PublicKey>, D::Error>
where
D: serde::Deserializer<'de>,
{
PublicKey::deserialize(deserializer)
.map(Into::into)
.map(Some)
}
Loading…
Cancel
Save