Skip to main content

SignedChallengeResponse

Struct SignedChallengeResponse 

Source
pub struct SignedChallengeResponse {
    pub challenge_nonce: Vec<u8>,
    pub public_key: Vec<u8>,
    pub signature: Vec<u8>,
    pub timestamp: Option<Timestamp>,
    pub device_type: i32,
    pub certificates: Vec<Vec<u8>>,
    pub protocol_version: u32,
    pub capabilities: Vec<String>,
}
Expand description

Signed response to authentication challenge

Fields§

§challenge_nonce: Vec<u8>

Original challenge nonce (for correlation)

§public_key: Vec<u8>

Responder’s Ed25519 public key (32 bytes)

§signature: Vec<u8>

Ed25519 signature (64 bytes). The signed byte string depends on the negotiated protocol version (ADR-065):

Version 0 (pre-rc.21+1 peers; protocol_version absent on the wire and reads as 0 via the prost default):

signed = challenge.nonce || challenge.challenger_id || response.timestamp.seconds (u64 little-endian, 8 bytes)

Version 1 (rc.21+1+; CURRENT_PROTOCOL_VERSION at this release):

signed = challenge.nonce || challenge.challenger_id || response.timestamp.seconds (u64 little-endian, 8 bytes) || response.protocol_version (u32 little-endian, 4 bytes)

The response.timestamp.seconds value is the seconds-precision wall-clock time the responder captured at sign time, the same value carried in the timestamp field below — NOT the challenger’s Challenge.timestamp. Both signer and verifier reconstruct the byte string from response.timestamp.seconds (and, from v1 onward, response.protocol_version), so the signature verifies independent of how long the auth flow takes or whether it spans a wall-clock second boundary.

Negotiation: the responder picks negotiated = min(challenge.protocol_version, CURRENT_PROTOCOL_VERSION) sets response.protocol_version = negotiated, and uses the negotiated version’s byte construction. The verifier reads response.protocol_version to know which construction to use. A response.protocol_version value greater than the verifier’s CURRENT_PROTOCOL_VERSION surfaces as SecurityError::IncompatibleProtocolVersion, distinct from InvalidSignature. Full negotiation rules and rollout semantics: ADR-065.

§timestamp: Option<Timestamp>

Response creation timestamp. The seconds field is included verbatim in the signed-message construction above; the nanos field is informational only and is NOT covered by the signature.

§device_type: i32

Responder’s device type

§certificates: Vec<Vec<u8>>

X.509 certificate chain (DER-encoded) - optional for MVP

§protocol_version: u32

Negotiated protocol version covered by the signature (ADR-065). Set by the responder to min(challenge.protocol_version, CURRENT_PROTOCOL_VERSION). From version 1 onward this value is included in the signed byte string (u32 little-endian, 4 bytes), so a MITM cannot strip the field or change its value without invalidating the signature. A 0 here means the responder negotiated down to the pre-version-token construction (the peer didn’t advertise a version, defaulting to 0).

§capabilities: Vec<String>

Capability strings the responder advertises (ADR-065). Same v1 semantics as Challenge.capabilities — advertised-but-not-signed, available to consumers for soft- policy feature flagging.

Implementations§

Source§

impl SignedChallengeResponse

Source

pub fn device_type(&self) -> DeviceType

Returns the enum value of device_type, or the default if the field is set to an invalid enum value.

Source

pub fn set_device_type(&mut self, value: DeviceType)

Sets device_type to the provided enum value.

Trait Implementations§

Source§

impl Clone for SignedChallengeResponse

Source§

fn clone(&self) -> SignedChallengeResponse

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SignedChallengeResponse

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SignedChallengeResponse

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for SignedChallengeResponse

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Message for SignedChallengeResponse

Source§

fn encoded_len(&self) -> usize

Returns the encoded length of the message without a length delimiter.
Source§

fn clear(&mut self)

Clears the message, resetting all fields to their default.
Source§

fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message to a buffer. Read more
Source§

fn encode_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message to a newly allocated buffer.
Source§

fn encode_length_delimited( &self, buf: &mut impl BufMut, ) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message with a length-delimiter to a buffer. Read more
Source§

fn encode_length_delimited_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message with a length-delimiter to a newly allocated buffer.
Source§

fn decode(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes an instance of the message from a buffer. Read more
Source§

fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes a length-delimited instance of the message from the buffer.
Source§

fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes an instance of the message from a buffer, and merges it into self. Read more
Source§

fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes a length-delimited instance of the message from buffer, and merges it into self.
Source§

impl PartialEq for SignedChallengeResponse

Source§

fn eq(&self, other: &SignedChallengeResponse) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for SignedChallengeResponse

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for SignedChallengeResponse

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.