pub struct PasswordOwnerSetup {
pub envelope: Option<PasswordOwnerEnvelopeV1>,
pub auth_salt: Vec<u8>,
pub auth_verifier_public_key: Vec<u8>,
pub auth_memory_kib: u32,
pub auth_iterations: u32,
pub auth_parallelism: u32,
pub auth_kdf_id: u32,
pub format_version: u32,
pub auth_verifier_possession_signature: Vec<u8>,
}Expand description
Public authentication metadata, stored separately from the encrypted seed. Client input is UTF8(NFC(password)), preserving case and all spaces. Client guidance is 15+ Unicode characters and at most 1024 UTF-8 bytes; the server cannot enforce strength without seeing the password. The independent inputs are UTF8(“heddle-password-auth-v1”) || 0x00 || UTF8(NFC(password)) with auth_salt, and UTF8(“heddle-owner-wrap-v1”) || 0x00 || UTF8(NFC(password)) with wrap_salt. Both use the recorded Argon2id costs and 32-byte output. Only the Ed25519 public key derived from auth_seed crosses the network. Discard unknown fields, including nested envelope fields, and persist only the canonical re-encoding of known fields (<= 4608 bytes). The verifier and owner keys MUST be canonical, decompressible, and non-small-order. Ed25519 signatures use strict verification: canonical R and S, non-small-order points, and the standard group equation. Rust uses verify_strict; WebCrypto callers MUST precheck these conditions before its verify operation.
Fields§
§envelope: Option<PasswordOwnerEnvelopeV1>Required; <= 4096 encoded bytes.
auth_salt: Vec<u8>Exactly 16 bytes, different from wrap_salt.
auth_verifier_public_key: Vec<u8>Exactly 32-byte Ed25519 public key, never an auth seed.
auth_memory_kib: u32Exactly 65536 in v1.
auth_iterations: u32Exactly 3 in v1.
auth_parallelism: u32Exactly 4 in v1.
auth_kdf_id: u32Exactly 1 = Argon2id in v1.
format_version: u32Exactly 1 in v1.
auth_verifier_possession_signature: Vec<u8>Future cost policies use a monotone floor, never below the pinned v1 minimum. Existing envelopes remain readable at their recorded costs. At signup, Ed25519 signs SHA-256(“heddle-password-verifier-possession-v1” || RegistrationChallenge.challenge[32]); on PUT it signs the setup- authorization digest. The server verifies this with auth_verifier_public_key before persisting; the signature is excluded from setup_sha256 to avoid a circular transcript.
Exactly 64 bytes.
Trait Implementations§
Source§impl Clone for PasswordOwnerSetup
impl Clone for PasswordOwnerSetup
Source§fn clone(&self) -> PasswordOwnerSetup
fn clone(&self) -> PasswordOwnerSetup
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PasswordOwnerSetup
impl Debug for PasswordOwnerSetup
Source§impl Default for PasswordOwnerSetup
impl Default for PasswordOwnerSetup
Source§fn default() -> PasswordOwnerSetup
fn default() -> PasswordOwnerSetup
impl Eq for PasswordOwnerSetup
Source§impl Hash for PasswordOwnerSetup
impl Hash for PasswordOwnerSetup
Source§impl Message for PasswordOwnerSetup
impl Message for PasswordOwnerSetup
Source§fn encoded_len(&self) -> usize
fn encoded_len(&self) -> usize
Source§fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self. Read moreSource§fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self.Source§impl PartialEq for PasswordOwnerSetup
impl PartialEq for PasswordOwnerSetup
impl StructuralPartialEq for PasswordOwnerSetup
Auto Trait Implementations§
impl Freeze for PasswordOwnerSetup
impl RefUnwindSafe for PasswordOwnerSetup
impl Send for PasswordOwnerSetup
impl Sync for PasswordOwnerSetup
impl Unpin for PasswordOwnerSetup
impl UnsafeUnpin for PasswordOwnerSetup
impl UnwindSafe for PasswordOwnerSetup
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more