diff --git a/crates/fido-common/src/credential/public_key.rs b/crates/fido-common/src/credential/public_key.rs
index 06f73f8..75b2699 100644
--- a/crates/fido-common/src/credential/public_key.rs
+++ b/crates/fido-common/src/credential/public_key.rs
@@ -33,6 +33,7 @@ pub(crate) mod algorithm {
/// > This dictionary is used to supply additional parameters when
/// > creating a new credential.
+#[cfg_eval]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Parameters {
@@ -79,9 +80,12 @@ pub struct Descriptor {
/// > account to which the new public key credential will be associated at
/// > the RP.
/// Due to deprecation, the `icon` URL is omitted. See .
-#[derive(Debug)]
+#[cfg_eval]
+#[derive(Debug, Clone)]
#[cfg_attr(
feature = "serde",
+ serde_as,
+ skip_serializing_none,
derive(Serialize, Deserialize),
serde(rename_all = "camelCase")
)]
@@ -97,6 +101,8 @@ pub struct UserEntity {
//
// WebAuthn says that "The user handle MUST NOT be empty." To maximimize compatibility, the
// definition from the CTAP specs is used.
+ // Bounds: [0, 64] bytes
+ #[cfg_attr(feature = "serde", serde_as(as = "Bytes"))]
pub id: Vec,
/// > a human-palatable identifier for a user account. It is intended
/// > only for display, i.e., aiding the user in determining the