webauthn_rp

WebAuthn Level 3 RP library.
git clone https://git.philomathiclife.com/repos/webauthn_rp
Log | Files | Refs | README

error.rs (5324B)


      1 extern crate alloc;
      2 #[cfg(doc)]
      3 use super::{Challenge, CollectedClientData, CredentialId};
      4 use super::{CRED_ID_MAX_LEN, CRED_ID_MIN_LEN};
      5 use alloc::string::FromUtf8Error;
      6 use core::{
      7     error::Error,
      8     fmt::{self, Display, Formatter},
      9     str::Utf8Error,
     10 };
     11 /// Error returned when a [`CredentialId`] does not have length inclusively between [`CRED_ID_MIN_LEN`] and
     12 /// [`CRED_ID_MAX_LEN`].
     13 #[derive(Clone, Copy, Debug)]
     14 pub struct CredentialIdErr;
     15 impl Display for CredentialIdErr {
     16     #[inline]
     17     fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
     18         write!(
     19             f,
     20             "CredentialId did not have length inclusively between {CRED_ID_MIN_LEN} and {CRED_ID_MAX_LEN}",
     21         )
     22     }
     23 }
     24 impl Error for CredentialIdErr {}
     25 /// Error returned from [`CollectedClientData::from_client_data_json`].
     26 #[derive(Debug)]
     27 pub enum CollectedClientDataErr {
     28     /// The `slice` had invalid length.
     29     Len,
     30     /// The `slice` did not begin with `{"type":"webauthn.`.
     31     InvalidStart,
     32     /// [`type`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-type)
     33     /// was not `"webauthn.create"` during registration or `"webauthn.get"`
     34     /// during authentication.
     35     Type,
     36     /// [`challenge`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-challenge)
     37     /// without whitespace was not the second key in the object.
     38     ChallengeKey,
     39     /// [`challenge`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-challenge)
     40     /// was not a valid base64url-encoding of [`Challenge`].
     41     Challenge,
     42     /// [`origin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-origin)
     43     /// without whitespace was not the third key in the object.
     44     OriginKey,
     45     /// [`crossOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-crossorigin)
     46     /// without whitespace was not the fourth key in the object.
     47     CrossOriginKey,
     48     /// [`crossOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-crossorigin)
     49     /// was not `true` or `false`.
     50     CrossOrigin,
     51     /// The object was not a valid JSON object.
     52     InvalidObject,
     53     /// [`origin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-origin) or
     54     /// [`topOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-toporigin) was
     55     /// not escaped correctly (i.e., a Unicode scalar value in U+0000–U+001F was not escaped or another Unicode
     56     /// scalar value, sans `"` and `\`, was escaped).
     57     InvalidEscapedString,
     58     /// [`origin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-origin) or
     59     /// [`topOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-toporigin) was
     60     /// not valid UTF-8.
     61     Utf8(Utf8Error),
     62     /// [`origin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-origin) or
     63     /// [`topOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-toporigin) was
     64     /// not valid UTF-8.
     65     Utf8Owned(FromUtf8Error),
     66     /// [`topOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-toporigin) existed
     67     /// despite [`crossOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-crossorigin)
     68     /// being `false`.
     69     TopOriginWithoutCrossOrigin,
     70     /// [`topOrigin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-toporigin) was the same value
     71     /// as [`origin`](https://www.w3.org/TR/webauthn-3/#dom-collectedclientdata-origin).
     72     TopOriginSameAsOrigin,
     73 }
     74 impl Display for CollectedClientDataErr {
     75     #[inline]
     76     fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
     77         match *self {
     78             Self::Len => f.write_str("clientDataJSON had an invalid length"),
     79             Self::InvalidStart => f.write_str(r#"clientDataJSON does not start with '{"type":"webauthn.'"#),
     80             Self::Type => f.write_str(r#"clientDataJSON 'type' did not have value '"webauthn.create"' during registration or '"webauthn.get"' during authentication"#),
     81             Self::ChallengeKey => f.write_str("clientDataJSON 'challenge' was not the second key in the object, or it had whitespace around it"),
     82             Self::Challenge => f.write_str("clientDataJSON 'challenge' was not a valid base64url encoding of 16 bytes"),
     83             Self::OriginKey => f.write_str("clientDataJSON 'origin' was not the third key in the object, or it had whitespace around it"),
     84             Self::CrossOriginKey => f.write_str("clientDataJSON 'crossOrigin' was not the fourth key in the object, or it had whitespace around it"),
     85             Self::CrossOrigin => f.write_str("clientDataJSON 'crossOrigin' was not false or true"),
     86             Self::InvalidObject => f.write_str("clientDataJSON was an invalid object"),
     87             Self::InvalidEscapedString => f.write_str("clientDataJSON 'origin' or 'topOrigin' was not escaped correctly"),
     88             Self::Utf8(err) => write!(f, "clientDataJSON 'origin' or 'topOrigin' was not valid UTF-8: {err}"),
     89             Self::Utf8Owned(ref err) => write!(f, "clientDataJSON 'origin' or 'topOrigin' was not valid UTF-8: {err}"),
     90             Self::TopOriginWithoutCrossOrigin => f.write_str("clientDataJSON 'topOrigin' existed despite 'crossOrigin' being false"),
     91             Self::TopOriginSameAsOrigin => f.write_str("clientDataJSON 'origin' and 'topOrigin' were the same"),
     92         }
     93     }
     94 }
     95 impl Error for CollectedClientDataErr {}