diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5678a6e..3e599d6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,10 +13,12 @@ jobs: fail-fast: false matrix: backend_feature: - - --features ristretto255-voprf - - - --features curve25519,ristretto255-voprf + - --features ristretto255 - --features curve25519 + - --features ecdsa + - --features ed25519 + - --features ristretto255,curve25519,ecdsa,ed25519 frontend_feature: - - --features argon2 @@ -69,10 +71,12 @@ jobs: # 32-bit x86 - i686-unknown-linux-gnu backend_feature: - - --features ristretto255-voprf - - - curve25519,ristretto255-voprf - - curve25519 + - --features ristretto255 + - --features curve25519 + - --features ecdsa + - --features ed25519 + - --features ristretto255,curve25519,ecdsa,ed25519 steps: - uses: actions/checkout@main - uses: hecrj/setup-rust-action@v2 @@ -140,10 +144,12 @@ jobs: # for any no_std target - thumbv6m-none-eabi backend_feature: - - ristretto255-voprf - - - curve25519,ristretto255-voprf + - ristretto255 - curve25519 + - ecdsa + - ed25519 + - ristretto255,curve25519,ecdsa,ed25519 frontend_feature: - argon2 - serde @@ -160,10 +166,8 @@ jobs: fail-fast: false matrix: backend_feature: - - --features ristretto255-voprf + - --features ristretto255 - - - --features curve25519,ristretto255-voprf - - --features curve25519 steps: - name: Checkout sources uses: actions/checkout@main @@ -200,7 +204,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: clippy - args: --all-targets --features argon2,std,curve25519 -- -D warnings + args: --all-targets --features argon2,std,curve25519,ecdsa,ed25519 -- -D warnings - name: Run cargo doc uses: actions-rs/cargo@v1 @@ -208,7 +212,7 @@ jobs: RUSTDOCFLAGS: -D warnings with: command: doc - args: --no-deps --document-private-items --features argon2,std,curve25519 + args: --no-deps --document-private-items --features argon2,std,curve25519,ecdsa,ed25519 format: name: cargo fmt diff --git a/Cargo.toml b/Cargo.toml index 9b349ed..b100fa9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ authors = ["Kevin Lewi ", "François Garillot "] categories = ["no-std"] description = "An implementation of the OPAQUE password-authenticated key exchange protocol" edition = "2021" +exclude = ["/src/tests/"] keywords = ["cryptography", "crypto", "opaque", "passwords", "authentication"] license = "Apache-2.0 OR MIT" name = "opaque-ke" @@ -14,12 +15,15 @@ version = "3.0.0" [features] argon2 = ["dep:argon2"] curve25519 = ["dep:curve25519-dalek"] -default = ["ristretto255-voprf", "serde"] -ristretto255 = ["dep:curve25519-dalek", "voprf/ristretto255"] -ristretto255-voprf = ["ristretto255", "voprf/ristretto255-ciphersuite"] +default = ["ristretto255", "serde"] +ecdsa = ["dep:ecdsa", "dep:rfc6979"] +ed25519 = ["dep:curve25519-dalek", "dep:ed25519-dalek"] +ristretto255 = ["dep:curve25519-dalek", "voprf/ristretto255-ciphersuite"] serde = [ "dep:serde", "curve25519-dalek?/serde", + "ecdsa?/serde", + "ed25519-dalek?/serde", "generic-array/serde", "voprf/serde", "zeroize/serde", @@ -33,14 +37,23 @@ argon2 = { version = "0.5", default-features = false, features = [ curve25519-dalek = { version = "4", default-features = false, features = [ "zeroize", ], optional = true } -derive-where = { version = "1.3", features = ["zeroize-on-drop"] } +derive-where = { version = "1.4", features = ["zeroize-on-drop"] } digest = "0.10" displaydoc = { version = "0.2", default-features = false } +ecdsa = { version = "0.16", default-features = false, features = [ + "arithmetic", + "hazmat", +], optional = true } +ed25519-dalek = { version = "2", default-features = false, features = [ + "digest", + "hazmat", +], optional = true } elliptic-curve = { version = "0.13", features = ["hash2curve", "sec1"] } generic-array = "0.14" hkdf = "0.12" hmac = "0.12" rand = { version = "0.8", default-features = false } +rfc6979 = { version = "0.4", optional = true } serde = { version = "1", default-features = false, features = [ "derive", ], optional = true } @@ -60,6 +73,7 @@ cryptoki = "0.9" elliptic-curve = { version = "0.13", features = ["alloc", "pkcs8"] } hex = "0.4" p256 = { version = "0.13", default-features = false, features = [ + "ecdsa", "hash2curve", "pkcs8", "voprf", @@ -74,9 +88,11 @@ p521 = { version = "0.13.3", default-features = false, features = [ "pkcs8", "voprf", ] } +paste = "1" proptest = "1" rand = "0.8" regex = "1" +sha2 = { version = "0.10", default-features = false } thiserror = "2" # MSRV rustyline = "15" diff --git a/benches/opaque.rs b/benches/opaque.rs index 47789e8..f693521 100644 --- a/benches/opaque.rs +++ b/benches/opaque.rs @@ -23,16 +23,14 @@ struct Default; #[cfg(feature = "ristretto255")] impl CipherSuite for Default { type OprfCs = opaque_ke::Ristretto255; - type KeGroup = opaque_ke::Ristretto255; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = opaque_ke::ksf::Identity; } #[cfg(not(feature = "ristretto255"))] impl CipherSuite for Default { type OprfCs = p256::NistP256; - type KeGroup = p256::NistP256; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = opaque_ke::ksf::Identity; } @@ -187,7 +185,7 @@ fn server_login_start_real(c: &mut Criterion) { Some(password_file.clone()), client_login_start_result.clone().message, username, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); }) @@ -209,7 +207,7 @@ fn server_login_start_fake(c: &mut Criterion) { None, client_login_start_result.clone().message, username, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); }) @@ -246,7 +244,7 @@ fn client_login_finish(c: &mut Criterion) { Some(password_file), client_login_start_result.clone().message, username, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); @@ -256,6 +254,7 @@ fn client_login_finish(c: &mut Criterion) { .clone() .state .finish( + &mut rng, password, server_login_start.clone().message, ClientLoginFinishParameters::default(), @@ -295,12 +294,13 @@ fn server_login_finish(c: &mut Criterion) { Some(password_file), client_login_start_result.clone().message, username, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); let client_login_finish_result = client_login_start_result .state .finish( + &mut rng, password, server_login_start_result.clone().message, ClientLoginFinishParameters::default(), @@ -312,7 +312,10 @@ fn server_login_finish(c: &mut Criterion) { server_login_start_result .clone() .state - .finish(client_login_finish_result.clone().message) + .finish( + client_login_finish_result.clone().message, + ServerLoginParameters::default(), + ) .unwrap(); }) }); diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 0000000..7edc619 --- /dev/null +++ b/clippy.toml @@ -0,0 +1 @@ +doc-valid-idents = ["HashEdDSA", "PureEdDSA", ".."] diff --git a/examples/digital_locker.rs b/examples/digital_locker.rs index d595df3..173ed51 100644 --- a/examples/digital_locker.rs +++ b/examples/digital_locker.rs @@ -38,7 +38,7 @@ use opaque_ke::{ ClientLogin, ClientLoginFinishParameters, ClientRegistration, ClientRegistrationFinishParameters, CredentialFinalization, CredentialRequest, CredentialResponse, RegistrationRequest, RegistrationResponse, RegistrationUpload, ServerLogin, - ServerLoginStartParameters, ServerRegistration, ServerRegistrationLen, ServerSetup, + ServerLoginParameters, ServerRegistration, ServerRegistrationLen, ServerSetup, }; use rustyline::error::ReadlineError; use rustyline::history::DefaultHistory; @@ -52,16 +52,14 @@ struct DefaultCipherSuite; #[cfg(feature = "ristretto255")] impl CipherSuite for DefaultCipherSuite { type OprfCs = opaque_ke::Ristretto255; - type KeGroup = opaque_ke::Ristretto255; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = opaque_ke::ksf::Identity; } #[cfg(not(feature = "ristretto255"))] impl CipherSuite for DefaultCipherSuite { type OprfCs = p256::NistP256; - type KeGroup = p256::NistP256; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = opaque_ke::ksf::Identity; } @@ -172,7 +170,7 @@ fn open_locker( Some(password_file), CredentialRequest::deserialize(&credential_request_bytes).unwrap(), &locker_id.to_be_bytes(), - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); let credential_response_bytes = server_login_start_result.message.serialize(); @@ -180,6 +178,7 @@ fn open_locker( // Server sends credential_response_bytes to client let result = client_login_start_result.state.finish( + &mut client_rng, password.as_bytes(), CredentialResponse::deserialize(&credential_response_bytes).unwrap(), ClientLoginFinishParameters::default(), @@ -196,7 +195,10 @@ fn open_locker( let server_login_finish_result = server_login_start_result .state - .finish(CredentialFinalization::deserialize(&credential_finalization_bytes).unwrap()) + .finish( + CredentialFinalization::deserialize(&credential_finalization_bytes).unwrap(), + ServerLoginParameters::default(), + ) .unwrap(); // Server sends locker contents, encrypted under the session key, to the client diff --git a/examples/simple_login.rs b/examples/simple_login.rs index d6ed467..7f31b17 100644 --- a/examples/simple_login.rs +++ b/examples/simple_login.rs @@ -33,7 +33,7 @@ use opaque_ke::{ ClientLogin, ClientLoginFinishParameters, ClientRegistration, ClientRegistrationFinishParameters, CredentialFinalization, CredentialRequest, CredentialResponse, RegistrationRequest, RegistrationResponse, RegistrationUpload, ServerLogin, - ServerLoginStartParameters, ServerRegistration, ServerRegistrationLen, ServerSetup, + ServerLoginParameters, ServerRegistration, ServerRegistrationLen, ServerSetup, }; use rustyline::error::ReadlineError; use rustyline::history::DefaultHistory; @@ -47,8 +47,7 @@ struct DefaultCipherSuite; #[cfg(feature = "ristretto255")] impl CipherSuite for DefaultCipherSuite { type OprfCs = opaque_ke::Ristretto255; - type KeGroup = opaque_ke::Ristretto255; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = Argon2<'static>; } @@ -56,8 +55,7 @@ impl CipherSuite for DefaultCipherSuite { #[cfg(not(feature = "ristretto255"))] impl CipherSuite for DefaultCipherSuite { type OprfCs = p256::NistP256; - type KeGroup = p256::NistP256; - type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; + type KeyExchange = opaque_ke::TripleDh; type Ksf = Argon2<'static>; } @@ -128,7 +126,7 @@ fn account_login( Some(password_file), CredentialRequest::deserialize(&credential_request_bytes).unwrap(), username.as_bytes(), - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); let credential_response_bytes = server_login_start_result.message.serialize(); @@ -136,6 +134,7 @@ fn account_login( // Server sends credential_response_bytes to client let result = client_login_start_result.state.finish( + &mut client_rng, password.as_bytes(), CredentialResponse::deserialize(&credential_response_bytes).unwrap(), ClientLoginFinishParameters::default(), @@ -152,7 +151,10 @@ fn account_login( let server_login_finish_result = server_login_start_result .state - .finish(CredentialFinalization::deserialize(&credential_finalization_bytes).unwrap()) + .finish( + CredentialFinalization::deserialize(&credential_finalization_bytes).unwrap(), + ServerLoginParameters::default(), + ) .unwrap(); client_login_finish_result.session_key == server_login_finish_result.session_key diff --git a/src/ciphersuite.rs b/src/ciphersuite.rs index 5ea8787..c6699f3 100644 --- a/src/ciphersuite.rs +++ b/src/ciphersuite.rs @@ -9,14 +9,18 @@ //! Defines the [`CipherSuite`] trait to specify the underlying primitives for //! OPAQUE -use digest::core_api::{BlockSizeUser, CoreProxy}; -use digest::OutputSizeUser; -use generic_array::typenum::{IsLess, IsLessOrEqual, Le, NonZero, U256}; +use core::ops::Add; -use crate::hash::{Hash, ProxyHash}; -use crate::key_exchange::group::KeGroup; +use digest::core_api::{BlockSizeUser, CoreProxy}; +use generic_array::typenum::{IsLess, Le, NonZero, Sum, U256}; +use generic_array::ArrayLength; + +use crate::envelope::NonceLen; +use crate::hash::{Hash, OutputSize, ProxyHash}; +use crate::key_exchange::group::Group; use crate::key_exchange::traits::KeyExchange; use crate::ksf::Ksf; +use crate::opaque::MaskedResponseLen; /// Configures the underlying primitives used in OPAQUE /// * `OprfCs`: A VOPRF ciphersuite, see [`voprf::CipherSuite`]. @@ -26,22 +30,26 @@ use crate::ksf::Ksf; /// * `Ksf`: A key stretching function, typically used for password hashing pub trait CipherSuite where - as OutputSizeUser>::OutputSize: - IsLess + IsLessOrEqual< as BlockSizeUser>::BlockSize>, OprfHash: Hash, as CoreProxy>::Core: ProxyHash, < as CoreProxy>::Core as BlockSizeUser>::BlockSize: IsLess, Le<< as CoreProxy>::Core as BlockSizeUser>::BlockSize, U256>: NonZero, + // Envelope: Nonce + Hash + // MaskedResponse: (Nonce + Hash) + KePk + OutputSize>: Add, + Sum>, NonceLen>: + ArrayLength + Add< as Group>::PkLen>, + MaskedResponseLen: ArrayLength, { /// A VOPRF ciphersuite, see [`voprf::CipherSuite`]. type OprfCs: voprf::CipherSuite; - /// A `Group` used for the `KeyExchange`. - type KeGroup: 'static + KeGroup; /// A key exchange protocol - type KeyExchange: KeyExchange, Self::KeGroup>; + type KeyExchange: KeyExchange; /// A key stretching function, typically used for password hashing type Ksf: Ksf; } pub(crate) type OprfGroup = ::Group; pub(crate) type OprfHash = ::Hash; +pub(crate) type KeGroup = ::Group; +pub(crate) type KeHash = ::Hash; diff --git a/src/envelope.rs b/src/envelope.rs index b117b20..cbd1c23 100644 --- a/src/envelope.rs +++ b/src/envelope.rs @@ -7,26 +7,25 @@ // licenses. use core::convert::TryFrom; -use core::ops::Add; use derive_where::derive_where; use digest::Output; use generic_array::sequence::Concat; -use generic_array::typenum::{Sum, Unsigned, U2, U32}; -use generic_array::{ArrayLength, GenericArray}; +use generic_array::typenum::{Sum, U32}; +use generic_array::GenericArray; use hkdf::Hkdf; use hmac::{Hmac, Mac}; use rand::{CryptoRng, RngCore}; use zeroize::{Zeroize, ZeroizeOnDrop}; -use crate::ciphersuite::{CipherSuite, OprfHash}; -use crate::errors::utils::check_slice_size; +use crate::ciphersuite::{CipherSuite, KeGroup, OprfHash}; use crate::errors::{InternalError, ProtocolError}; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; -use crate::keypair::{KeyPair, PrivateKey, PrivateKeySerialization, PublicKey}; -use crate::opaque::{bytestrings_from_identifiers, Identifiers}; -use crate::serialization::{Input, MacExt}; +use crate::key_exchange::group::Group; +use crate::key_exchange::traits::SerializedIdentifiers; +use crate::keypair::{KeyPair, PrivateKey, PublicKey}; +use crate::opaque::Identifiers; +use crate::serialization::{GenericArrayExt, SliceExt, UpdateExt}; // Constant string used as salt for HKDF computation const STR_AUTH_KEY: [u8; 7] = *b"AuthKey"; @@ -82,10 +81,9 @@ pub(crate) struct Envelope { // which is technically unrelated to the envelope's encrypted and authenticated // contents. pub(crate) struct OpenedEnvelope<'a, CS: CipherSuite> { - pub(crate) client_static_keypair: KeyPair, + pub(crate) client_static_keypair: KeyPair>, pub(crate) export_key: Output>, - pub(crate) id_u: Input<'a, U2, ::PkLen>, - pub(crate) id_s: Input<'a, U2, ::PkLen>, + pub(crate) identifiers: SerializedIdentifiers<'a, KeGroup>, } pub(crate) struct OpenedInnerEnvelope { @@ -97,23 +95,23 @@ type SealRawResult = (Envelope, Output>); #[cfg(test)] type SealRawResult = (Envelope, Output>, Output>); #[cfg(not(test))] -type SealResult = (Envelope, PublicKey, Output>); +type SealResult = (Envelope, PublicKey>, Output>); #[cfg(test)] type SealResult = ( Envelope, - PublicKey, + PublicKey>, Output>, Output>, ); -pub(crate) type EnvelopeLen = Sum>>; +pub(crate) type EnvelopeLen = Sum>, NonceLen>; impl Envelope { #[allow(clippy::type_complexity)] pub(crate) fn seal( rng: &mut R, randomized_pwd_hasher: Hkdf>, - server_s_pk: &PublicKey, + server_s_pk: &PublicKey>, ids: Identifiers, ) -> Result, ProtocolError> { let mut nonce = GenericArray::default(); @@ -125,12 +123,16 @@ impl Envelope { ); let server_s_pk_bytes = server_s_pk.serialize(); - let (id_u, id_s) = bytestrings_from_identifiers::( + let identifiers = SerializedIdentifiers::>::from_identifiers( ids, client_s_pk.serialize(), server_s_pk_bytes.clone(), )?; - let aad = construct_aad(id_u.iter(), id_s.iter(), &server_s_pk_bytes); + let aad = construct_aad( + identifiers.client.iter(), + identifiers.server.iter(), + &server_s_pk_bytes, + ); let result = Self::seal_raw(randomized_pwd_hasher, nonce, aad, mode)?; Ok(( @@ -183,7 +185,7 @@ impl Envelope { pub(crate) fn open<'a>( &self, randomized_pwd_hasher: Hkdf>, - server_s_pk: PublicKey, + server_s_pk: PublicKey>, optional_ids: Identifiers<'a>, ) -> Result, ProtocolError> { let client_static_keypair = match self.mode { @@ -196,20 +198,23 @@ impl Envelope { }; let server_s_pk_bytes = server_s_pk.serialize(); - let (id_u, id_s) = bytestrings_from_identifiers::( + let identifiers = SerializedIdentifiers::>::from_identifiers( optional_ids, client_static_keypair.public().serialize(), server_s_pk_bytes.clone(), )?; - let aad = construct_aad(id_u.iter(), id_s.iter(), &server_s_pk_bytes); + let aad = construct_aad( + identifiers.client.iter(), + identifiers.server.iter(), + &server_s_pk_bytes, + ); let opened = self.open_raw(randomized_pwd_hasher, aad)?; Ok(OpenedEnvelope { client_static_keypair, export_key: opened.export_key, - id_u, - id_s, + identifiers, }) } @@ -249,45 +254,22 @@ impl Envelope { } } - fn hmac_key_size() -> usize { - OutputSize::>::USIZE - } - + #[cfg(test)] pub(crate) fn len() -> usize { + use generic_array::typenum::Unsigned; + OutputSize::>::USIZE + NonceLen::USIZE } - pub(crate) fn serialize(&self) -> GenericArray> - where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, - { - self.nonce.concat(self.hmac.clone()) + pub(crate) fn serialize(&self) -> GenericArray> { + self.nonce.concat_ext(&self.hmac) } - pub(crate) fn deserialize(bytes: &[u8]) -> Result { - let mode = InnerEnvelopeMode::Internal; // Better way to hard-code this? - - if bytes.len() < NonceLen::USIZE { - return Err(ProtocolError::SerializationError); - } - let nonce = GenericArray::clone_from_slice(&bytes[..NonceLen::USIZE]); - - let remainder = match mode { - InnerEnvelopeMode::Zero => { - return Err(InternalError::IncompatibleEnvelopeModeError.into()) - } - InnerEnvelopeMode::Internal => &bytes[NonceLen::USIZE..], - }; - - let hmac_key_size = Self::hmac_key_size(); - let hmac = check_slice_size(remainder, hmac_key_size, "hmac_key_size")?; - + pub(crate) fn deserialize_take(bytes: &mut &[u8]) -> Result { Ok(Self { - mode, - nonce, - hmac: GenericArray::clone_from_slice(hmac), + mode: InnerEnvelopeMode::Internal, + nonce: bytes.take_array("nonce")?, + hmac: bytes.take_array("hmac")?, }) } } @@ -297,33 +279,28 @@ impl Envelope { fn build_inner_envelope_internal( randomized_pwd_hasher: Hkdf>, nonce: GenericArray, -) -> Result, ProtocolError> { - let mut keypair_seed = GenericArray::<_, ::SkLen>::default(); +) -> Result>, ProtocolError> { + let mut keypair_seed = GenericArray::<_, as Group>::SkLen>::default(); randomized_pwd_hasher .expand(&nonce.concat(STR_PRIVATE_KEY.into()), &mut keypair_seed) .map_err(|_| InternalError::HkdfError)?; - let client_static_keypair = - PrivateKey::::deserialize_key_pair(&CS::KeGroup::serialize_sk( - CS::KeGroup::derive_auth_keypair::(keypair_seed)?, - ))?; + let client_s_sk = PrivateKey::new(KeGroup::::derive_scalar(keypair_seed)?); - Ok(client_static_keypair.public().clone()) + Ok(client_s_sk.public_key()) } fn recover_keys_internal( randomized_pwd_hasher: Hkdf>, nonce: GenericArray, -) -> Result, ProtocolError> { - let mut keypair_seed = GenericArray::<_, ::SkLen>::default(); +) -> Result>, ProtocolError> { + let mut keypair_seed = GenericArray::<_, as Group>::SkLen>::default(); randomized_pwd_hasher .expand(&nonce.concat(STR_PRIVATE_KEY.into()), &mut keypair_seed) .map_err(|_| InternalError::HkdfError)?; - let client_static_keypair = - PrivateKey::::deserialize_key_pair(&CS::KeGroup::serialize_sk( - CS::KeGroup::derive_auth_keypair::(keypair_seed)?, - ))?; + let client_s_sk = PrivateKey::new(KeGroup::::derive_scalar(keypair_seed)?); + let client_s_pk = client_s_sk.public_key(); - Ok(client_static_keypair) + Ok(KeyPair::new(client_s_sk, client_s_pk)) } fn construct_aad<'a>( @@ -333,3 +310,24 @@ fn construct_aad<'a>( ) -> impl Iterator { [server_s_pk].into_iter().chain(id_s).chain(id_u) } + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for Envelope { + fn assert_zeroized(&self) { + let Self { mode, nonce, hmac } = self; + + assert_eq!(mode, &InnerEnvelopeMode::Zero); + + for byte in nonce.iter().chain(hmac) { + assert_eq!(byte, &0); + } + } +} diff --git a/src/errors.rs b/src/errors.rs index 4c3e125..971eba9 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -96,9 +96,6 @@ pub enum ProtocolError { /** This error occurs when the client detects that the server has reflected the OPRF value (beta == alpha) */ ReflectedValueError, - /** Identity group element was encountered during deserialization, which is - invalid */ - IdentityGroupElementError, /// Custom [`SecretKey`](crate::keypair::PrivateKeySerialization) error type Custom(T), } @@ -122,7 +119,6 @@ impl Debug for ProtocolError { .field("actual_len", actual_len) .finish(), Self::ReflectedValueError => f.debug_tuple("ReflectedValueError").finish(), - Self::IdentityGroupElementError => f.debug_tuple("IdentityGroupElementError").finish(), Self::Custom(custom) => f.debug_tuple("Custom").field(custom).finish(), } } @@ -164,41 +160,6 @@ impl ProtocolError { actual_len, }, Self::ReflectedValueError => ProtocolError::ReflectedValueError, - Self::IdentityGroupElementError => ProtocolError::IdentityGroupElementError, } } } - -pub(crate) mod utils { - use super::*; - - pub fn check_slice_size<'a>( - slice: &'a [u8], - expected_len: usize, - arg_name: &'static str, - ) -> Result<&'a [u8], ProtocolError> { - if slice.len() != expected_len { - return Err(ProtocolError::SizeError { - name: arg_name, - len: expected_len, - actual_len: slice.len(), - }); - } - Ok(slice) - } - - pub fn check_slice_size_atleast<'a>( - slice: &'a [u8], - expected_len: usize, - arg_name: &'static str, - ) -> Result<&'a [u8], ProtocolError> { - if slice.len() < expected_len { - return Err(ProtocolError::SizeError { - name: arg_name, - len: expected_len, - actual_len: slice.len(), - }); - } - Ok(slice) - } -} diff --git a/src/hash.rs b/src/hash.rs index 2c51e77..753b659 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -13,7 +13,7 @@ use digest::core_api::{BlockSizeUser, BufferKindUser, CoreProxy, FixedOutputCore use digest::{FixedOutputReset, HashMarker, OutputSizeUser}; use generic_array::typenum::{IsLess, Le, NonZero, U256}; -pub(crate) type OutputSize = <::Core as OutputSizeUser>::OutputSize; +pub(crate) type OutputSize = <::Core as OutputSizeUser>::OutputSize; /// Trait to simplify requirements for [`Hash`]. pub trait ProxyHash: diff --git a/src/key_exchange/group/curve25519.rs b/src/key_exchange/group/curve25519.rs index 97221a8..6b2b138 100644 --- a/src/key_exchange/group/curve25519.rs +++ b/src/key_exchange/group/curve25519.rs @@ -8,26 +8,25 @@ //! Key Exchange group implementation for Curve25519 +pub use curve25519_dalek; use curve25519_dalek::montgomery::MontgomeryPoint; use curve25519_dalek::scalar; use curve25519_dalek::traits::Identity; -use digest::core_api::BlockSizeUser; -use digest::{FixedOutput, HashMarker, OutputSizeUser}; -use generic_array::typenum::{IsLess, IsLessOrEqual, U256, U32}; +use generic_array::typenum::U32; use generic_array::GenericArray; use rand::{CryptoRng, RngCore}; -use subtle::ConstantTimeEq; use zeroize::Zeroize; -use super::KeGroup; +use super::Group; use crate::errors::{InternalError, ProtocolError}; -use crate::key_exchange::tripledh::DiffieHellman; +use crate::key_exchange::shared::DiffieHellman; +use crate::serialization::SliceExt; /// Implementation for Curve25519. pub struct Curve25519; /// The implementation of such a subgroup for Curve25519 -impl KeGroup for Curve25519 { +impl Group for Curve25519 { type Pk = MontgomeryPoint; type PkLen = U32; type Sk = Scalar; @@ -37,50 +36,28 @@ impl KeGroup for Curve25519 { pk.to_bytes().into() } - fn deserialize_pk(bytes: &[u8]) -> Result { + fn deserialize_take_pk(bytes: &mut &[u8]) -> Result { bytes - .try_into() + .take_array::("public key") .ok() - .map(MontgomeryPoint) + .map(|array| MontgomeryPoint(array.into())) .filter(|pk| pk != &MontgomeryPoint::identity()) .ok_or(ProtocolError::SerializationError) } fn random_sk(rng: &mut R) -> Self::Sk { - loop { - // Sample 32 random bytes and then clamp, as described in https://cr.yp.to/ecdh.html - let mut scalar_bytes = [0u8; 32]; - rng.fill_bytes(&mut scalar_bytes); - let scalar = scalar::clamp_integer(scalar_bytes); + // Sample 32 random bytes and then clamp, as described in https://cr.yp.to/ecdh.html + let mut scalar_bytes = [0u8; 32]; + rng.fill_bytes(&mut scalar_bytes); + let scalar = scalar::clamp_integer(scalar_bytes); - if scalar != curve25519_dalek::Scalar::ZERO.to_bytes() { - break Scalar(scalar); - } - } + Scalar(scalar) } - fn hash_to_scalar<'a, H>(_input: &[&[u8]], _dst: &[&[u8]]) -> Result - where - H: BlockSizeUser + Default + FixedOutput + HashMarker, - H::OutputSize: IsLess + IsLessOrEqual, - { - unimplemented!() - } - - fn derive_auth_keypair( - seed: GenericArray, - ) -> Result - where - ::OutputSize: - IsLess + IsLessOrEqual<::BlockSize>, - { + fn derive_scalar(seed: GenericArray) -> Result { Ok(Scalar(scalar::clamp_integer(seed.into()))) } - fn is_zero_scalar(scalar: Self::Sk) -> subtle::Choice { - scalar.0.ct_eq(&curve25519_dalek::Scalar::ZERO.to_bytes()) - } - fn public_key(sk: Self::Sk) -> Self::Pk { MontgomeryPoint::mul_base_clamped(sk.0) } @@ -89,22 +66,21 @@ impl KeGroup for Curve25519 { sk.0.into() } - fn deserialize_sk(bytes: &[u8]) -> Result { + fn deserialize_take_sk(bytes: &mut &[u8]) -> Result { bytes - .try_into() + .take_array::("secret key") .ok() .and_then(|bytes| { - let scalar = scalar::clamp_integer(bytes); - (scalar == bytes).then_some(scalar) + let scalar = scalar::clamp_integer(bytes.into()); + (scalar == *bytes).then_some(scalar) }) - .filter(|scalar| scalar != &curve25519_dalek::Scalar::ZERO.to_bytes()) .map(Scalar) .ok_or(ProtocolError::SerializationError) } } /// Curve25519 scalar. -#[derive(Clone, Copy, Zeroize)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Zeroize)] pub struct Scalar([u8; 32]); impl DiffieHellman for Scalar { @@ -112,3 +88,36 @@ impl DiffieHellman for Scalar { Curve25519::serialize_pk(pk.mul_clamped(self.0)) } } + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for MontgomeryPoint { + fn assert_zeroized(&self) { + assert_eq!(*self, MontgomeryPoint::default()); + } +} + +#[cfg(test)] +impl AssertZeroized for Scalar { + fn assert_zeroized(&self) { + assert_eq!(*self, Scalar(<_>::default())); + } +} + +#[test] +fn non_zero_scalar() { + use std::vec; + + use crate::tests::mock_rng::CycleRng; + + let mut rng = CycleRng::new(vec![0]); + let sk = Curve25519::random_sk(&mut rng); + assert_ne!(sk.0, curve25519_dalek::Scalar::ZERO.to_bytes()); +} diff --git a/src/key_exchange/group/ed25519.rs b/src/key_exchange/group/ed25519.rs new file mode 100644 index 0000000..f0fa9e6 --- /dev/null +++ b/src/key_exchange/group/ed25519.rs @@ -0,0 +1,459 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +//! Key Exchange group implementation for Ed25519 + +use core::iter; + +use curve25519_dalek::edwards::CompressedEdwardsY; +use curve25519_dalek::traits::IsIdentity; +use curve25519_dalek::{EdwardsPoint, Scalar}; +use digest::Digest; +pub use ed25519_dalek; +use ed25519_dalek::hazmat::ExpandedSecretKey; +use ed25519_dalek::{SecretKey, Sha512}; +use generic_array::sequence::Concat; +use generic_array::typenum::{U32, U64}; +use generic_array::GenericArray; +use rand::{CryptoRng, RngCore}; +use zeroize::Zeroize; + +use super::Group; +use crate::ciphersuite::CipherSuite; +use crate::errors::{InternalError, ProtocolError}; +use crate::key_exchange::sigma_i::hash_eddsa::implementation::HashEddsaImpl; +use crate::key_exchange::sigma_i::pure_eddsa::implementation::PureEddsaImpl; +pub use crate::key_exchange::sigma_i::shared::PreHash; +use crate::key_exchange::sigma_i::{CachedMessage, Message, MessageBuilder}; +use crate::serialization::{SliceExt, UpdateExt}; + +/// Implementation for Ed25519. +pub struct Ed25519; + +impl Group for Ed25519 { + type Pk = VerifyingKey; + type PkLen = U32; + type Sk = SigningKey; + type SkLen = U32; + + fn serialize_pk(pk: Self::Pk) -> GenericArray { + pk.compressed.0.into() + } + + fn deserialize_take_pk(bytes: &mut &[u8]) -> Result { + let compressed = bytes + .take_array("public key") + .map(|bytes| CompressedEdwardsY(bytes.into()))?; + + if let Some(point) = compressed.decompress().filter(|point| !point.is_identity()) { + Ok(VerifyingKey { point, compressed }) + } else { + Err(ProtocolError::SerializationError) + } + } + + fn random_sk(rng: &mut R) -> Self::Sk { + let mut sk = <[u8; 32]>::default(); + rng.fill_bytes(&mut sk); + + SigningKey::from_bytes(sk) + } + + fn derive_scalar(seed: GenericArray) -> Result { + Ok(SigningKey::from_bytes(seed.into())) + } + + fn public_key(sk: Self::Sk) -> Self::Pk { + sk.verifying_key + } + + fn serialize_sk(sk: Self::Sk) -> GenericArray { + sk.sk.into() + } + + fn deserialize_take_sk(bytes: &mut &[u8]) -> Result { + Ok(SigningKey::from_bytes( + bytes.take_array("secret key")?.into(), + )) + } +} + +/// Ed25519 verifying key. +// `ed25519_dalek::VerifyingKey` doesn't implement `Zeroize`. +// TODO: remove after https://github.com/dalek-cryptography/curve25519-dalek/pull/747. +// Required for manual implementation of EdDSA. +// TODO: remove after https://github.com/dalek-cryptography/curve25519-dalek/pull/556. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Zeroize)] +pub struct VerifyingKey { + point: EdwardsPoint, + compressed: CompressedEdwardsY, +} + +/// Ed25519 siging key. +// We store the `ExpandedSecret` in memory to avoid computing it on demand and then discarding it +// again. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Zeroize)] +pub struct SigningKey { + // `ed25519_dalek::SigningKey` doesn't implement `Zeroize`. See + // https://github.com/dalek-cryptography/curve25519-dalek/pull/747 + // Required for manual implementation of EdDSA. + // TODO: remove after https://github.com/dalek-cryptography/curve25519-dalek/pull/556. + sk: SecretKey, + verifying_key: VerifyingKey, + // `ed25519_dalek::ExpandedSecret` doesn't implement traits we need. See + // TODO: remove after https://github.com/dalek-cryptography/curve25519-dalek/pull/748 and + // https://github.com/dalek-cryptography/curve25519-dalek/pull/747. + scalar: Scalar, + hash_prefix: [u8; 32], +} + +impl SigningKey { + fn from_bytes(sk: [u8; 32]) -> Self { + let ExpandedSecretKey { + scalar, + hash_prefix, + } = ExpandedSecretKey::from(&sk); + let point = EdwardsPoint::mul_base(&scalar); + let verifying_key = VerifyingKey { + point, + compressed: point.compress(), + }; + + SigningKey { + sk, + verifying_key, + scalar, + hash_prefix, + } + } +} + +impl PureEddsaImpl for Ed25519 { + type Signature = Signature; + type SignatureLen = U64; + + fn sign( + sk: &Self::Sk, + message: &Message, + ) -> (Self::Signature, CachedMessage) { + (sign(sk, false, message.sign_message()), message.to_cached()) + } + + /// Validates that the signature was created by signing the given message + /// with the corresponding private key. + fn verify( + pk: &Self::Pk, + message_builder: MessageBuilder<'_, CS>, + state: CachedMessage, + signature: &Self::Signature, + ) -> Result<(), ProtocolError> { + verify( + pk, + false, + message_builder.build::(state).verify_message(), + signature, + ) + } + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { + Signature::deserialize_take(bytes) + } + + fn serialize_signature(signature: &Self::Signature) -> GenericArray { + signature.serialize() + } +} + +impl HashEddsaImpl for Ed25519 { + type Signature = Signature; + type SignatureLen = U64; + type VerifyState = PreHash; + + fn sign( + sk: &Self::Sk, + message: &Message, + ) -> (Self::Signature, Self::VerifyState) { + let hash = message.hash::(); + + ( + sign(sk, true, iter::once(hash.sign.finalize().as_slice())), + PreHash(hash.verify.finalize()), + ) + } + + /// Validates that the signature was created by signing the given message + /// with the corresponding private key. + fn verify( + pk: &Self::Pk, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError> { + verify(pk, true, iter::once(state.0.as_slice()), signature) + } + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { + Signature::deserialize_take(bytes) + } + + fn serialize_signature(signature: &Self::Signature) -> GenericArray { + signature.serialize() + } +} + +// This contains a manual implementation of EdDSA because `ed25519-dalek` +// doesn't support message streaming. See +// TODO: remove after https://github.com/dalek-cryptography/curve25519-dalek/pull/556. +fn sign<'a>( + sk: &SigningKey, + pre_hash: bool, + message: impl Clone + Iterator, +) -> Signature { + let mut h = Sha512::new(); + + if pre_hash { + h.update(b"SigEd25519 no Ed25519 collisions"); + h.update([1]); // Ed25519ph + h.update([0]); + } + + h.update(sk.hash_prefix); + h.update_iter(message.clone()); + + let r = Scalar::from_hash(h); + #[allow(non_snake_case)] + let R = EdwardsPoint::mul_base(&r).compress(); + + h = Sha512::new(); + + if pre_hash { + h.update(b"SigEd25519 no Ed25519 collisions"); + h.update([1]); // Ed25519ph + h.update([0]); + } + + h.update(R.as_bytes()); + h.update(sk.verifying_key.compressed.0); + h.update_iter(message); + + let k = Scalar::from_hash(h); + let s: Scalar = (k * sk.scalar) + r; + + Signature { R, s } +} + +fn verify<'a>( + pk: &VerifyingKey, + pre_hash: bool, + message: impl Iterator, + signature: &Signature, +) -> Result<(), ProtocolError> { + let mut h = Sha512::new(); + + if pre_hash { + h.update(b"SigEd25519 no Ed25519 collisions"); + h.update([1]); // Ed25519ph + h.update([0]); + } + + h.update(signature.R.as_bytes()); + h.update(pk.compressed.as_bytes()); + h.update_iter(message); + let k = Scalar::from_hash(h); + + #[allow(non_snake_case)] + let minus_A: EdwardsPoint = -pk.point; + #[allow(non_snake_case)] + let expected_R = + EdwardsPoint::vartime_double_scalar_mul_basepoint(&k, &(minus_A), &signature.s).compress(); + + if expected_R == signature.R { + Ok(()) + } else { + Err(ProtocolError::InvalidLoginError) + } +} + +/// Ed25519 Signature. +// `ed25519_dalek::Signature` doesn't implement validation with Serde de/serialization. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[allow(non_snake_case)] +pub struct Signature { + R: CompressedEdwardsY, + s: Scalar, +} + +impl Signature { + /// Expects the `R` and `s` components of a Ed25519 signature with no added + /// framing. + pub fn from_slice(mut bytes: &[u8]) -> Result { + Self::deserialize_take(&mut bytes) + } + + fn deserialize_take(bytes: &mut &[u8]) -> Result { + #[allow(non_snake_case)] + let R = CompressedEdwardsY(bytes.take_array("signature R")?.into()); + + let s = Scalar::from_canonical_bytes(bytes.take_array("signature s")?.into()) + .into_option() + .ok_or(ProtocolError::SerializationError)?; + + Ok(Self { R, s }) + } + + fn serialize(&self) -> GenericArray { + GenericArray::from(self.R.0).concat(GenericArray::from(self.s.to_bytes())) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::Deserialize<'de> for Signature { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::Error; + + Signature::deserialize_take( + &mut (GenericArray::<_, U64>::deserialize(deserializer)?.as_slice()), + ) + .map_err(D::Error::custom) + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for Signature { + fn serialize(&self, serializer: SK) -> Result + where + SK: serde::Serializer, + { + self.serialize().serialize(serializer) + } +} + +impl Zeroize for Signature { + fn zeroize(&mut self) { + self.R.0 = [0; 32]; + self.s = Scalar::default(); + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for VerifyingKey { + fn assert_zeroized(&self) { + use curve25519_dalek::traits::Identity; + + let Self { point, compressed } = self; + + assert_eq!(point, &EdwardsPoint::identity()); + assert_eq!(compressed, &EdwardsPoint::identity().compress()); + } +} + +#[cfg(test)] +impl AssertZeroized for SigningKey { + fn assert_zeroized(&self) { + let Self { + sk, + verifying_key, + scalar, + hash_prefix, + } = self; + + verifying_key.assert_zeroized(); + + for byte in sk.iter().chain(scalar.to_bytes().iter()).chain(hash_prefix) { + assert_eq!(byte, &0); + } + } +} + +#[cfg(test)] +mod test { + use std::iter; + + use ed25519_dalek::{Signer, SigningKey, Verifier, VerifyingKey}; + use rand::rngs::OsRng; + + use super::*; + + #[test] + fn pure_eddsa() { + let mut message = [0; 1024]; + OsRng.fill_bytes(&mut message); + + let mut sk = SecretKey::default(); + OsRng.fill_bytes(&mut sk); + let signing_key = SigningKey::from_bytes(&sk); + + let signature = signing_key.sign(&message); + + let custom_sk = Ed25519::deserialize_take_sk(&mut sk.as_slice()).unwrap(); + let custom_signature = sign(&custom_sk, false, iter::once(message.as_slice())); + + assert_eq!( + signature.to_bytes(), + custom_signature.serialize().as_slice() + ); + + let verifying_key = VerifyingKey::from(&signing_key); + verifying_key.verify(&message, &signature).unwrap(); + + let custom_pk = Ed25519::public_key(custom_sk); + verify( + &custom_pk, + false, + iter::once(message.as_slice()), + &custom_signature, + ) + .unwrap(); + } + + #[test] + fn hash_eddsa() { + let mut message = [0; 1024]; + OsRng.fill_bytes(&mut message); + let message = Sha512::new_with_prefix(message); + let pre_hash = message.clone().finalize(); + + let mut sk = SecretKey::default(); + OsRng.fill_bytes(&mut sk); + let signing_key = SigningKey::from_bytes(&sk); + + let signature = signing_key.sign_prehashed(message.clone(), None).unwrap(); + + let custom_sk = Ed25519::deserialize_take_sk(&mut sk.as_slice()).unwrap(); + let custom_signature = sign(&custom_sk, true, iter::once(pre_hash.as_slice())); + + assert_eq!( + signature.to_bytes(), + custom_signature.serialize().as_slice() + ); + + let verifying_key = VerifyingKey::from(&signing_key); + verifying_key + .verify_prehashed(message, None, &signature) + .unwrap(); + + let custom_pk = Ed25519::public_key(custom_sk); + verify( + &custom_pk, + true, + iter::once(pre_hash.as_slice()), + &custom_signature, + ) + .unwrap(); + } +} diff --git a/src/key_exchange/group/elliptic_curve.rs b/src/key_exchange/group/elliptic_curve.rs index 36f5c6e..8d39699 100644 --- a/src/key_exchange/group/elliptic_curve.rs +++ b/src/key_exchange/group/elliptic_curve.rs @@ -6,101 +6,157 @@ // of this source tree. You may select, at your option, one of the above-listed // licenses. -use digest::core_api::BlockSizeUser; -use digest::{FixedOutput, HashMarker}; -use elliptic_curve::group::cofactor::CofactorGroup; -use elliptic_curve::hash2curve::{ExpandMsgXmd, FromOkm, GroupDigest}; -use elliptic_curve::sec1::{FromEncodedPoint, ModulusSize, ToEncodedPoint}; +//! Implementation for EC curves via [`elliptic_curve`] traits. + +use core::fmt::{self, Debug, Formatter}; + +use derive_where::derive_where; +use elliptic_curve::group::GroupEncoding; +use elliptic_curve::ops::MulByGenerator; +use elliptic_curve::sec1::{ModulusSize, ToEncodedPoint}; use elliptic_curve::{ - AffinePoint, Field, FieldBytesSize, Group, ProjectivePoint, PublicKey, Scalar, SecretKey, + point, CurveArithmetic, FieldBytesSize, Group as _, NonZeroScalar, ProjectivePoint, Scalar, + SecretKey, }; -use generic_array::typenum::{IsLess, IsLessOrEqual, U256}; use generic_array::GenericArray; use rand::{CryptoRng, RngCore}; +use voprf::Mode; +use zeroize::Zeroize; -use super::KeGroup; +use super::{Group, STR_OPAQUE_DERIVE_AUTH_KEY_PAIR}; use crate::errors::{InternalError, ProtocolError}; -use crate::key_exchange::tripledh::DiffieHellman; +use crate::key_exchange::shared::DiffieHellman; +use crate::serialization::SliceExt; -impl KeGroup for G +impl Group for G where - G: GroupDigest, + Self: CurveArithmetic + voprf::CipherSuite + voprf::Group>, FieldBytesSize: ModulusSize, - AffinePoint: FromEncodedPoint + ToEncodedPoint, - ProjectivePoint: CofactorGroup + ToEncodedPoint, - Scalar: FromOkm, + ProjectivePoint: GroupEncoding< + Repr = GenericArray as ModulusSize>::CompressedPointSize>, + > + ToEncodedPoint, { - type Pk = ProjectivePoint; + type Pk = NonIdentity; type PkLen = as ModulusSize>::CompressedPointSize; - type Sk = Scalar; + type Sk = NonZeroScalar; type SkLen = FieldBytesSize; fn serialize_pk(pk: Self::Pk) -> GenericArray { - GenericArray::clone_from_slice(pk.to_encoded_point(true).as_bytes()) + GenericArray::clone_from_slice(pk.0.to_encoded_point(true).as_bytes()) } - fn deserialize_pk(bytes: &[u8]) -> Result { - PublicKey::::from_sec1_bytes(bytes) - .map(|public_key| public_key.to_projective()) - .map_err(|_| ProtocolError::SerializationError) + fn deserialize_take_pk(bytes: &mut &[u8]) -> Result { + point::NonIdentity::>::from_bytes(&bytes.take_array("public key")?) + .into_option() + .map(NonIdentity) + .ok_or(ProtocolError::SerializationError) } fn random_sk(rng: &mut R) -> Self::Sk { - *SecretKey::::random(rng).to_nonzero_scalar() + SecretKey::::random(rng).to_nonzero_scalar() } - // Implements the `HashToScalar()` function from - // - fn hash_to_scalar(input: &[&[u8]], dst: &[&[u8]]) -> Result - where - H: BlockSizeUser + Default + FixedOutput + HashMarker, - H::OutputSize: IsLess + IsLessOrEqual, - { - Self::hash_to_scalar::>(input, dst) - .map_err(|_| InternalError::HashToScalar) - .and_then(|scalar| { - if bool::from(scalar.is_zero()) { - Err(InternalError::HashToScalar) - } else { - Ok(scalar) - } + fn derive_scalar(seed: GenericArray) -> Result { + voprf::derive_key::(&seed, &STR_OPAQUE_DERIVE_AUTH_KEY_PAIR, Mode::Oprf) + .map(|scalar| { + NonZeroScalar::new(scalar).expect("`voprf::derive_key()` returned a zero scalar") }) + .map_err(InternalError::from) } fn public_key(sk: Self::Sk) -> Self::Pk { - ProjectivePoint::::generator() * sk - } - - fn is_zero_scalar(scalar: Self::Sk) -> subtle::Choice { - scalar.is_zero() + // Non-panicking version in https://github.com/RustCrypto/traits/pull/1833. + NonIdentity( + point::NonIdentity::new(ProjectivePoint::::mul_by_generator(&*sk)) + .expect("multiplying with a non-zero scalar can never yield the identity element"), + ) } fn serialize_sk(sk: Self::Sk) -> GenericArray { sk.into() } - fn deserialize_sk(bytes: &[u8]) -> Result { - SecretKey::::from_slice(bytes) - .map(|secret_key| *secret_key.to_nonzero_scalar()) + fn deserialize_take_sk(bytes: &mut &[u8]) -> Result { + SecretKey::::from_bytes(&bytes.take_array("secret key")?) + .map(|secret_key| secret_key.to_nonzero_scalar()) .map_err(|_| ProtocolError::SerializationError) } } -impl DiffieHellman for Scalar +/// Wrapper around [`NonIdentity`](point::NonIdentity) to implement [`Zeroize`]. +// TODO: remove after https://github.com/RustCrypto/traits/pull/1832. +#[derive_where(Clone, Copy)] +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound( + deserialize = "point::NonIdentity>: serde::Deserialize<'de>", + serialize = "point::NonIdentity>: serde::Serialize" + )) +)] +pub struct NonIdentity(pub point::NonIdentity>); + +impl Debug for NonIdentity { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_tuple("NonIdentity") + .field(&self.0.to_point()) + .finish() + } +} + +impl PartialEq for NonIdentity { + fn eq(&self, other: &Self) -> bool { + self.0.to_point().eq(&other.0.to_point()) + } +} + +impl Eq for NonIdentity {} + +impl Zeroize for NonIdentity { + fn zeroize(&mut self) { + self.0 = point::NonIdentity::new(ProjectivePoint::::generator()).unwrap(); + } +} + +impl DiffieHellman for NonZeroScalar where - G: GroupDigest, + G: CurveArithmetic + voprf::CipherSuite + voprf::Group>, FieldBytesSize: ModulusSize, - AffinePoint: FromEncodedPoint + ToEncodedPoint, - ProjectivePoint: CofactorGroup + ToEncodedPoint, - Scalar: FromOkm, + ProjectivePoint: GroupEncoding< + Repr = GenericArray as ModulusSize>::CompressedPointSize>, + > + ToEncodedPoint, { fn diffie_hellman( self, - pk: ProjectivePoint, + pk: NonIdentity, ) -> GenericArray as ModulusSize>::CompressedPointSize> { - GenericArray::clone_from_slice((pk * self).to_encoded_point(true).as_bytes()) + GenericArray::clone_from_slice((pk.0 * self).to_encoded_point(true).as_bytes()) + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for NonIdentity { + fn assert_zeroized(&self) { + assert_eq!(self.0.to_point(), ProjectivePoint::::generator()); + } +} + +#[cfg(test)] +impl AssertZeroized for NonZeroScalar { + fn assert_zeroized(&self) { + use elliptic_curve::Field; + + assert_eq!(**self, Scalar::::ONE); } } diff --git a/src/key_exchange/group/mod.rs b/src/key_exchange/group/mod.rs index e665aea..7477b57 100644 --- a/src/key_exchange/group/mod.rs +++ b/src/key_exchange/group/mod.rs @@ -6,18 +6,16 @@ // of this source tree. You may select, at your option, one of the above-listed // licenses. -//! Includes the [`KeGroup`] trait and definitions for the key exchange groups +//! Includes the [`Group`] trait and definitions for the key exchange groups #[cfg(feature = "curve25519")] pub mod curve25519; -mod elliptic_curve; +#[cfg(feature = "ed25519")] +pub mod ed25519; +pub mod elliptic_curve; #[cfg(feature = "ristretto255")] pub mod ristretto255; -use digest::core_api::BlockSizeUser; -use digest::{FixedOutput, HashMarker, OutputSizeUser}; -use generic_array::sequence::Concat; -use generic_array::typenum::{IsLess, IsLessOrEqual, U256}; use generic_array::{ArrayLength, GenericArray}; use rand::{CryptoRng, RngCore}; use zeroize::Zeroize; @@ -27,7 +25,7 @@ use crate::errors::{InternalError, ProtocolError}; const STR_OPAQUE_DERIVE_AUTH_KEY_PAIR: [u8; 33] = *b"OPAQUE-DeriveDiffieHellmanKeyPair"; /// A group representation for use in the key exchange -pub trait KeGroup { +pub trait Group { /// Public key type Pk: Copy + Zeroize; /// Length of the public key @@ -41,65 +39,15 @@ pub trait KeGroup { fn serialize_pk(pk: Self::Pk) -> GenericArray; /// Return a public key from its fixed-length bytes representation - fn deserialize_pk(bytes: &[u8]) -> Result; + /// + /// The deserialized bytes must be taken from `bytes`. + fn deserialize_take_pk(bytes: &mut &[u8]) -> Result; /// Generate a random secret key fn random_sk(rng: &mut R) -> Self::Sk; - /// Hashes a slice of pseudo-random bytes to a scalar - /// - /// # Errors - /// [`InternalError::HashToScalar`] if the `input` is empty or longer then - /// [`u16::MAX`]. - fn hash_to_scalar(input: &[&[u8]], dst: &[&[u8]]) -> Result - where - H: BlockSizeUser + Default + FixedOutput + HashMarker, - H::OutputSize: IsLess + IsLessOrEqual; - - /// Corresponds to the `DeriveAuthKeyPair()` function defined in - /// - /// - /// Note that we cannot call the voprf crate directly since we need to - /// ensure that the [`KeGroup`] is used for the - /// [`hash_to_scalar`](Self::hash_to_scalar) operation (as opposed to - /// the [`OprfGroup`](voprf::Group)). - fn derive_auth_keypair( - seed: GenericArray, - ) -> Result - where - ::OutputSize: - IsLess + IsLessOrEqual<::BlockSize>, - { - let info = &STR_OPAQUE_DERIVE_AUTH_KEY_PAIR; - let dst_1 = GenericArray::from(STR_DERIVE_KEYPAIR) - .concat(STR_OPRF.into()) - .concat([voprf::Mode::Oprf.to_u8()].into()) - .concat([b'-'].into()); - let dst_2 = CS::ID.as_bytes(); - - let info_len = i2osp_2(info.len()) - .map_err(|_| InternalError::OprfError(voprf::Error::DeriveKeyPair))?; - - for counter in 0_u8..=u8::MAX { - // deriveInput = seed || I2OSP(len(info), 2) || info - // skS = G.HashToScalar(deriveInput || I2OSP(counter, 1), DST = "DeriveKeyPair" - // || contextString) - let sk_s = Self::hash_to_scalar::( - &[&seed, &info_len, info, &counter.to_be_bytes()], - &[&dst_1, dst_2], - ) - .map_err(|_| InternalError::OprfError(voprf::Error::DeriveKeyPair))?; - - if !bool::from(Self::is_zero_scalar(sk_s)) { - return Ok(sk_s); - } - } - - Err(InternalError::OprfError(voprf::Error::DeriveKeyPair)) - } - - /// Returns `true` if the scalar is zero. - fn is_zero_scalar(scalar: Self::Sk) -> subtle::Choice; + /// Deterministically derive a [`Self::Sk`] from `seed`. + fn derive_scalar(seed: GenericArray) -> Result; /// Return a public key from its secret key fn public_key(sk: Self::Sk) -> Self::Pk; @@ -108,17 +56,7 @@ pub trait KeGroup { fn serialize_sk(sk: Self::Sk) -> GenericArray; /// Return a public key from its fixed-length bytes representation - fn deserialize_sk(bytes: &[u8]) -> Result; -} - -// Helper functions used to compute DeriveAuthKeyPair() (taken from the voprf -// crate) - -const STR_OPRF: [u8; 7] = *b"OPRFV1-"; -const STR_DERIVE_KEYPAIR: [u8; 13] = *b"DeriveKeyPair"; - -fn i2osp_2(input: usize) -> Result<[u8; 2], InternalError> { - u16::try_from(input) - .map(|input| input.to_be_bytes()) - .map_err(|_| InternalError::OprfInternalError(voprf::InternalError::I2osp)) + /// + /// The deserialized bytes must be taken from `bytes`. + fn deserialize_take_sk(bytes: &mut &[u8]) -> Result; } diff --git a/src/key_exchange/group/ristretto255.rs b/src/key_exchange/group/ristretto255.rs index 55a4367..311906b 100644 --- a/src/key_exchange/group/ristretto255.rs +++ b/src/key_exchange/group/ristretto255.rs @@ -8,6 +8,7 @@ //! Key Exchange group implementation for ristretto255 +pub use curve25519_dalek; use curve25519_dalek::constants::RISTRETTO_BASEPOINT_POINT; use curve25519_dalek::ristretto::{CompressedRistretto, RistrettoPoint}; use curve25519_dalek::scalar::Scalar; @@ -17,19 +18,19 @@ use digest::{FixedOutput, HashMarker}; use generic_array::typenum::{IsLess, IsLessOrEqual, U256, U32}; use generic_array::GenericArray; use rand::{CryptoRng, RngCore}; -use subtle::ConstantTimeEq; -use voprf::Group; +use voprf::Mode; -use super::KeGroup; +use super::{Group, STR_OPAQUE_DERIVE_AUTH_KEY_PAIR}; use crate::errors::{InternalError, ProtocolError}; -use crate::key_exchange::tripledh::DiffieHellman; +use crate::key_exchange::shared::DiffieHellman; +use crate::serialization::SliceExt; /// Implementation for Ristretto255. // This is necessary because Rust lacks specialization, otherwise we could // implement `KeGroup` for `voprf::Ristretto255`. pub struct Ristretto255; -impl KeGroup for Ristretto255 { +impl Group for Ristretto255 { type Pk = RistrettoPoint; type PkLen = U32; type Sk = Scalar; @@ -39,8 +40,8 @@ impl KeGroup for Ristretto255 { pk.compress().to_bytes().into() } - fn deserialize_pk(bytes: &[u8]) -> Result { - CompressedRistretto::from_slice(bytes) + fn deserialize_take_pk(bytes: &mut &[u8]) -> Result { + CompressedRistretto::from_slice(&bytes.take_array::("public key")?) .map_err(|_| ProtocolError::SerializationError)? .decompress() .filter(|point| point != &RistrettoPoint::identity()) @@ -49,21 +50,7 @@ impl KeGroup for Ristretto255 { fn random_sk(rng: &mut R) -> Self::Sk { loop { - let scalar = { - #[cfg(not(test))] - { - Scalar::random(rng) - } - - // Tests need an exact conversion from bytes to scalar, sampling only 32 bytes - // from rng - #[cfg(test)] - { - let mut scalar_bytes = [0u8; 32]; - rng.fill_bytes(&mut scalar_bytes); - Scalar::from_bytes_mod_order(scalar_bytes) - } - }; + let scalar = Scalar::random(rng); if scalar != Scalar::ZERO { break scalar; @@ -71,19 +58,9 @@ impl KeGroup for Ristretto255 { } } - // Implements the `HashToScalar()` function from - // - fn hash_to_scalar<'a, H>(input: &[&[u8]], dst: &[&[u8]]) -> Result - where - H: BlockSizeUser + Default + FixedOutput + HashMarker, - H::OutputSize: IsLess + IsLessOrEqual, - { - ::hash_to_scalar::(input, dst) - .map_err(InternalError::OprfInternalError) - } - - fn is_zero_scalar(scalar: Self::Sk) -> subtle::Choice { - scalar.ct_eq(&Scalar::ZERO) + fn derive_scalar(seed: GenericArray) -> Result { + voprf::derive_key::(&seed, &STR_OPAQUE_DERIVE_AUTH_KEY_PAIR, Mode::Oprf) + .map_err(InternalError::from) } fn public_key(sk: Self::Sk) -> Self::Pk { @@ -94,17 +71,16 @@ impl KeGroup for Ristretto255 { sk.to_bytes().into() } - fn deserialize_sk(bytes: &[u8]) -> Result { + fn deserialize_take_sk(bytes: &mut &[u8]) -> Result { bytes - .try_into() + .take_array::("secret key") .ok() - .and_then(|bytes| Scalar::from_canonical_bytes(bytes).into()) + .and_then(|bytes| Scalar::from_canonical_bytes(bytes.into()).into()) .filter(|scalar| scalar != &Scalar::ZERO) .ok_or(ProtocolError::SerializationError) } } -#[cfg(feature = "ristretto255-voprf")] impl voprf::CipherSuite for Ristretto255 { const ID: &'static str = voprf::Ristretto255::ID; @@ -113,14 +89,14 @@ impl voprf::CipherSuite for Ristretto255 { type Hash = ::Hash; } -impl Group for Ristretto255 { - type Elem = ::Elem; +impl voprf::Group for Ristretto255 { + type Elem = ::Elem; - type ElemLen = ::ElemLen; + type ElemLen = ::ElemLen; - type Scalar = ::Scalar; + type Scalar = ::Scalar; - type ScalarLen = ::ScalarLen; + type ScalarLen = ::ScalarLen; fn hash_to_curve( input: &[&[u8]], @@ -130,7 +106,7 @@ impl Group for Ristretto255 { H: BlockSizeUser + Default + FixedOutput + HashMarker, H::OutputSize: IsLess + IsLessOrEqual, { - ::hash_to_curve::(input, dst) + ::hash_to_curve::(input, dst) } fn hash_to_scalar( @@ -141,43 +117,43 @@ impl Group for Ristretto255 { H: BlockSizeUser + Default + FixedOutput + HashMarker, H::OutputSize: IsLess + IsLessOrEqual, { - ::hash_to_scalar::(input, dst) + ::hash_to_scalar::(input, dst) } fn base_elem() -> Self::Elem { - ::base_elem() + ::base_elem() } fn identity_elem() -> Self::Elem { - ::identity_elem() + ::identity_elem() } fn serialize_elem(elem: Self::Elem) -> GenericArray { - ::serialize_elem(elem) + ::serialize_elem(elem) } fn deserialize_elem(element_bits: &[u8]) -> voprf::Result { - ::deserialize_elem(element_bits) + ::deserialize_elem(element_bits) } fn random_scalar(rng: &mut R) -> Self::Scalar { - ::random_scalar(rng) + ::random_scalar(rng) } fn invert_scalar(scalar: Self::Scalar) -> Self::Scalar { - ::invert_scalar(scalar) + ::invert_scalar(scalar) } fn is_zero_scalar(scalar: Self::Scalar) -> subtle::Choice { - ::is_zero_scalar(scalar) + ::is_zero_scalar(scalar) } fn serialize_scalar(scalar: Self::Scalar) -> GenericArray { - ::serialize_scalar(scalar) + ::serialize_scalar(scalar) } fn deserialize_scalar(scalar_bits: &[u8]) -> voprf::Result { - ::deserialize_scalar(scalar_bits) + ::deserialize_scalar(scalar_bits) } } @@ -186,3 +162,25 @@ impl DiffieHellman for Scalar { Ristretto255::serialize_pk(pk * self) } } + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for RistrettoPoint { + fn assert_zeroized(&self) { + assert_eq!(*self, RistrettoPoint::default()); + } +} + +#[cfg(test)] +impl AssertZeroized for Scalar { + fn assert_zeroized(&self) { + assert_eq!(*self, Scalar::default()); + } +} diff --git a/src/key_exchange/mod.rs b/src/key_exchange/mod.rs index afbdb11..5cd3eb9 100644 --- a/src/key_exchange/mod.rs +++ b/src/key_exchange/mod.rs @@ -10,5 +10,9 @@ //! OPAQUE pub mod group; +pub(crate) mod shared; +pub mod sigma_i; pub(crate) mod traits; pub mod tripledh; + +pub use crate::key_exchange::traits::KeyExchange; diff --git a/src/key_exchange/shared.rs b/src/key_exchange/shared.rs new file mode 100644 index 0000000..ed1dd26 --- /dev/null +++ b/src/key_exchange/shared.rs @@ -0,0 +1,391 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +use core::ops::Add; + +use derive_where::derive_where; +use digest::core_api::BlockSizeUser; +use digest::{Digest, Output, OutputSizeUser, Update}; +use generic_array::sequence::Concat; +use generic_array::typenum::{IsLess, Le, NonZero, Sum, Unsigned, U1, U2, U256, U32}; +use generic_array::{ArrayLength, GenericArray}; +use hkdf::{Hkdf, HkdfExtract}; +use rand::{CryptoRng, RngCore}; + +use crate::ciphersuite::{CipherSuite, KeGroup, KeHash}; +use crate::errors::{InternalError, ProtocolError}; +use crate::hash::{Hash, OutputSize, ProxyHash}; +use crate::key_exchange::group::Group; +use crate::key_exchange::traits::{ + CredentialRequestParts, CredentialResponseParts, Deserialize, Serialize, SerializedContext, + SerializedIdentifiers, +}; +use crate::keypair::{KeyPair, PrivateKey, PublicKey}; +use crate::serialization::{i2osp, SliceExt, UpdateExt}; + +/////////////// +// Constants // +// ========= // +/////////////// + +pub(crate) type NonceLen = U32; +pub(super) static STR_CONTEXT: &[u8] = b"OPAQUEv1-"; +static STR_CLIENT_MAC: &[u8] = b"ClientMAC"; +static STR_HANDSHAKE_SECRET: &[u8] = b"HandshakeSecret"; +static STR_SERVER_MAC: &[u8] = b"ServerMAC"; +static STR_SESSION_KEY: &[u8] = b"SessionKey"; +static STR_OPAQUE: &[u8] = b"OPAQUE-"; + +//////////////////////////// +// High-level API Structs // +// ====================== // +//////////////////////////// + +/// Trait required by [`Group::Sk`] to be compatible with +/// [`TripleDh`](crate::TripleDh) and [`SigmaI`](crate::SigmaI). +pub trait DiffieHellman { + /// Diffie-Hellman key exchange. + fn diffie_hellman(self, pk: G::Pk) -> GenericArray; +} + +/// The client state produced after the first key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; G::Sk)] +pub struct Ke1State { + pub(super) client_e_sk: PrivateKey, + pub(super) client_nonce: GenericArray, +} + +/// The first key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; G::Pk)] +pub struct Ke1Message { + pub(super) client_nonce: GenericArray, + pub(super) client_e_pk: PublicKey, +} + +///////////////////////// +// Convenience Structs // +//==================== // +///////////////////////// + +// Consists of a session key, followed by two mac keys: (session_key, km2, km3) +pub(super) struct DerivedKeys { + pub(super) session_key: Output, + pub(super) km2: Output, + pub(super) km3: Output, + #[cfg(test)] + pub(super) handshake_secret: Output, +} + +//////////////////////////////////////////////// +// Helper functions and Trait Implementations // +// ========================================== // +//////////////////////////////////////////////// + +// Helper functions + +pub(super) fn generate_ke1( + rng: &mut R, +) -> Result<(Ke1State, Ke1Message), ProtocolError> { + let client_e_kp = KeyPair::::derive_random(rng); + let client_nonce = generate_nonce::(rng); + + let ke1_message = Ke1Message { + client_nonce, + client_e_pk: client_e_kp.public().clone(), + }; + + Ok(( + Ke1State { + client_e_sk: client_e_kp.private().clone(), + client_nonce, + }, + ke1_message, + )) +} + +// Generate a random nonce up to NonceLen::USIZE bytes. +pub(super) fn generate_nonce(rng: &mut R) -> GenericArray { + let mut nonce_bytes = GenericArray::default(); + rng.fill_bytes(&mut nonce_bytes); + nonce_bytes +} + +pub(super) fn transcript( + context: &SerializedContext<'_>, + identifiers: &SerializedIdentifiers<'_, KeGroup>, + credential_request: &CredentialRequestParts, + ke1_message: &Ke1MessageIter, + credential_response: &CredentialResponseParts, + server_nonce: GenericArray, + server_e_pk: &GenericArray, +) -> KeHash { + KeHash::::new() + .chain_iter(context.iter()) + .chain_iter(identifiers.client.iter()) + .chain_iter(credential_request.iter()) + .chain_iter(ke1_message.iter()) + .chain_iter(identifiers.server.iter()) + .chain_iter(credential_response.iter()) + .chain(server_nonce) + .chain(server_e_pk) +} + +// Internal function which takes computed shared secrets, along with some +// auxiliary metadata, to produce the session key and two MAC keys +pub(super) fn derive_keys<'a, H: Hash>( + ikms: impl Iterator, + hashed_derivation_transcript: &[u8], +) -> Result, ProtocolError> +where + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + let mut hkdf = HkdfExtract::::new(None); + + for ikm in ikms { + hkdf.input_ikm(ikm); + } + + let (_, extracted_ikm) = hkdf.finalize(); + let handshake_secret = derive_secrets::( + &extracted_ikm, + STR_HANDSHAKE_SECRET, + hashed_derivation_transcript, + )?; + let session_key = derive_secrets::( + &extracted_ikm, + STR_SESSION_KEY, + hashed_derivation_transcript, + )?; + + let km2 = hkdf_expand_label::(&handshake_secret, STR_SERVER_MAC, b"")?; + let km3 = hkdf_expand_label::(&handshake_secret, STR_CLIENT_MAC, b"")?; + + Ok(DerivedKeys { + session_key, + km2, + km3, + #[cfg(test)] + handshake_secret, + }) +} + +fn hkdf_expand_label( + secret: &[u8], + label: &[u8], + context: &[u8], +) -> Result, ProtocolError> +where + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + let h = Hkdf::::from_prk(secret).map_err(|_| InternalError::HkdfError)?; + hkdf_expand_label_extracted(&h, label, context) +} + +fn hkdf_expand_label_extracted( + hkdf: &Hkdf, + label: &[u8], + context: &[u8], +) -> Result, ProtocolError> +where + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + let mut okm = GenericArray::default(); + + let length = i2osp::(OutputSize::::USIZE)?; + let label_length = i2osp::(STR_OPAQUE.len() + label.len())?; + let context_len = i2osp::(context.len())?; + + let hkdf_label = [ + length.as_slice(), + &label_length, + STR_OPAQUE, + label, + &context_len, + context, + ]; + + hkdf.expand_multi_info(&hkdf_label, &mut okm) + .map_err(|_| InternalError::HkdfError)?; + Ok(okm) +} + +fn derive_secrets( + hkdf: &Hkdf, + label: &[u8], + hashed_derivation_transcript: &[u8], +) -> Result, ProtocolError> +where + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + hkdf_expand_label_extracted::(hkdf, label, hashed_derivation_transcript) +} + +// Serialization and deserialization implementations + +impl Deserialize for Ke1State { + fn deserialize_take(bytes: &mut &[u8]) -> Result { + Ok(Self { + client_e_sk: PrivateKey::deserialize_take(bytes)?, + client_nonce: bytes.take_array("client nonce")?, + }) + } +} + +impl Serialize for Ke1State +where + // Ke1State: KeSk + Nonce + G::SkLen: Add, + Sum: ArrayLength, +{ + type Len = Sum; + + fn serialize(&self) -> GenericArray { + self.client_e_sk.serialize().concat(self.client_nonce) + } +} + +impl Deserialize for Ke1Message { + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + client_nonce: input.take_array("client nonce")?, + client_e_pk: PublicKey::deserialize_take(input)?, + }) + } +} + +impl Serialize for Ke1Message +where + // Ke1Message: Nonce + KePk + NonceLen: Add, + Sum: ArrayLength, +{ + type Len = Sum; + + fn serialize(&self) -> GenericArray { + self.client_nonce.concat(self.client_e_pk.serialize()) + } +} + +impl Ke1Message { + pub(crate) fn to_iter(&self) -> Ke1MessageIter { + Ke1MessageIter { + client_nonce: self.client_nonce, + client_e_pk: self.client_e_pk.serialize(), + } + } +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Zeroize)] +pub(crate) struct Ke1MessageIter { + client_nonce: GenericArray, + client_e_pk: GenericArray, +} + +pub(crate) type Ke1MessageIterLen = Sum; + +impl Ke1MessageIter { + pub(crate) fn iter(&self) -> impl Clone + Iterator { + [self.client_nonce.as_slice(), self.client_e_pk.as_slice()].into_iter() + } + + pub(crate) fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Ke1MessageIter { + client_nonce: input.take_array("client nonce")?, + client_e_pk: input.take_array("client ephemeral public key")?, + }) + } +} + +impl Ke1MessageIter +where + NonceLen: Add, + Ke1MessageIterLen: ArrayLength, +{ + pub(crate) fn serialize(&self) -> GenericArray> { + self.client_nonce.concat(self.client_e_pk.clone()) + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for Ke1State +where + G::Sk: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { + client_e_sk, + client_nonce, + } = self; + + client_e_sk.assert_zeroized(); + assert_eq!(client_nonce, &GenericArray::default()); + } +} + +#[cfg(test)] +impl AssertZeroized for Ke1Message +where + G::Pk: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { + client_nonce, + client_e_pk, + } = self; + + assert_eq!(client_nonce, &GenericArray::default()); + client_e_pk.assert_zeroized(); + } +} + +#[cfg(test)] +impl AssertZeroized for Ke1MessageIter { + fn assert_zeroized(&self) { + let Self { + client_nonce, + client_e_pk, + } = self; + + for byte in client_nonce.iter().chain(client_e_pk) { + assert_eq!(byte, &0); + } + } +} diff --git a/src/key_exchange/sigma_i/ecdsa.rs b/src/key_exchange/sigma_i/ecdsa.rs new file mode 100644 index 0000000..c9edd8c --- /dev/null +++ b/src/key_exchange/sigma_i/ecdsa.rs @@ -0,0 +1,192 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +//! ECDSA implementation for [`elliptic_curve`] [`Group`] implementations to +//! support [`SigmaI`](crate::SigmaI). + +use core::marker::PhantomData; + +use derive_where::derive_where; +use digest::core_api::BlockSizeUser; +use digest::{FixedOutputReset, HashMarker}; +use ecdsa::{hazmat, PrimeCurve, SignatureSize}; +use elliptic_curve::{ + CurveArithmetic, Field, FieldBytes, FieldBytesEncoding, FieldBytesSize, NonZeroScalar, + PrimeField, Scalar, +}; +use generic_array::{ArrayLength, GenericArray}; +use rand::{CryptoRng, RngCore}; +use zeroize::Zeroize; + +use super::{Message, MessageBuilder, SignatureProtocol}; +use crate::ciphersuite::CipherSuite; +use crate::errors::ProtocolError; +use crate::key_exchange::group::elliptic_curve::NonIdentity; +use crate::key_exchange::group::Group; +pub use crate::key_exchange::sigma_i::shared::PreHash; +use crate::serialization::SliceExt; + +/// ECDSA for [`SigmaI`](crate::SigmaI). +/// +/// The ["verification state"](Self::VerifyState) is the pre-hash for the +/// message to be verified. +pub struct Ecdsa(PhantomData<(G, H)>); + +impl SignatureProtocol for Ecdsa +where + G: CurveArithmetic + Group, Pk = NonIdentity> + PrimeCurve, + SignatureSize: ArrayLength, + H: Clone + + Default + + BlockSizeUser + + FixedOutputReset> + + HashMarker, +{ + type Group = G; + type Signature = Signature; + type SignatureLen = SignatureSize; + type VerifyState = PreHash; + + // We use a manual implementation of `RandomizedPrehashSigner` to use the same + // hash for the message as for generating `k`. See + // https://github.com/RustCrypto/signatures/issues/949. + fn sign<'a, R: CryptoRng + RngCore, CS: CipherSuite, KE: Group>( + sk: &::Sk, + rng: &mut R, + message: &Message, + ) -> (Self::Signature, Self::VerifyState) { + let hash = message.hash::(); + + ( + Signature(sign::<_, G, H>(sk, rng, &hash.sign.finalize_fixed())), + PreHash(hash.verify.finalize_fixed()), + ) + } + + fn verify( + pk: &::Pk, + _: MessageBuilder<'_, CS>, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError> { + verify(pk, &state.0, &signature.0) + } + + fn serialize_signature(signature: &Self::Signature) -> GenericArray { + signature.0.to_bytes() + } + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { + ecdsa::Signature::from_bytes(&bytes.take_array("signature")?) + .map(Signature) + .map_err(|_| ProtocolError::SerializationError) + } +} + +fn sign(sk: &NonZeroScalar, rng: &mut R, pre_hash: &[u8]) -> ecdsa::Signature +where + R: CryptoRng + RngCore, + C: CurveArithmetic + PrimeCurve, + SignatureSize: ArrayLength, + H: Default + BlockSizeUser + FixedOutputReset> + HashMarker, +{ + let repr = sk.to_repr(); + let order = C::ORDER.encode_field_bytes(); + let z = + hazmat::bits2field::(pre_hash).expect("hash output can not be shorter than a scalar"); + + // This can only fail if the computed `r` or `s` are zero, in which case we just + // retry with a new `k`. See https://github.com/RustCrypto/signatures/pull/951. + loop { + let mut ad = FieldBytes::::default(); + rng.fill_bytes(&mut ad); + + let k = + Scalar::::from_repr(rfc6979::generate_k::(&repr, &order, &z, &ad)).unwrap(); + + if let Ok((signature, _)) = hazmat::sign_prehashed::(sk, k, &z) { + break signature; + } + } +} + +fn verify( + pk: &NonIdentity, + pre_hash: &[u8], + signature: &ecdsa::Signature, +) -> Result<(), ProtocolError> +where + C: CurveArithmetic + PrimeCurve, + SignatureSize: ArrayLength, +{ + let z = + hazmat::bits2field::(pre_hash).expect("hash output can not be shorter than a scalar"); + hazmat::verify_prehashed(&pk.0.to_point(), &z, signature) + .map_err(|_| ProtocolError::InvalidLoginError) +} + +/// Wrapper around [`ecdsa::Signature`] to implement [`Zeroize`]. +// TODO: remove after https://github.com/RustCrypto/signatures/pull/948. +#[derive_where(Clone, Debug, Eq, PartialEq)] +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +pub struct Signature(pub ecdsa::Signature) +where + SignatureSize: ArrayLength; + +impl Zeroize for Signature +where + SignatureSize: ArrayLength, +{ + fn zeroize(&mut self) { + self.0 = ecdsa::Signature::from_scalars( + Into::>::into(Scalar::::ONE), + Into::>::into(Scalar::::ONE), + ) + .expect("failed to create `Signature` with non-zero `Scalar`s"); + } +} + +#[test] +fn ecdsa() { + use std::vec; + + use digest::Digest; + use p256::ecdsa::signature::{DigestVerifier, RandomizedDigestSigner}; + use p256::ecdsa::{Signature, SigningKey, VerifyingKey}; + use p256::{NistP256, PublicKey}; + use rand::rngs::OsRng; + use sha2::Sha256; + + use crate::tests::mock_rng::CycleRng; + + let mut rng = CycleRng::new(vec![1; 32]); + + let mut message = [0; 1024]; + OsRng.fill_bytes(&mut message); + let hash = Sha256::new_with_prefix(message); + + let sk = NistP256::random_sk(&mut OsRng); + let signing_key = SigningKey::from(sk); + + let signature: Signature = signing_key.sign_digest_with_rng(&mut rng, hash.clone()); + let custom_signature = sign::<_, _, Sha256>(&sk, &mut rng, &hash.clone().finalize()); + + assert_eq!(signature, custom_signature); + + let pk = NistP256::public_key(sk); + let verifying_key = VerifyingKey::from(PublicKey::from(pk.0)); + + verifying_key + .verify_digest(hash.clone(), &signature) + .unwrap(); + verify(&pk, &hash.finalize(), &custom_signature).unwrap(); +} diff --git a/src/key_exchange/sigma_i/hash_eddsa.rs b/src/key_exchange/sigma_i/hash_eddsa.rs new file mode 100644 index 0000000..5fcb234 --- /dev/null +++ b/src/key_exchange/sigma_i/hash_eddsa.rs @@ -0,0 +1,88 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +//! HashEdDSA implementation for [`SigmaI`](crate::SigmaI). Currently only +//! supports [`Ed25519`](crate::Ed25519). + +use core::marker::PhantomData; + +use generic_array::GenericArray; +use rand::{CryptoRng, RngCore}; +use zeroize::Zeroize; + +use self::implementation::HashEddsaImpl; +use super::{Message, MessageBuilder, SignatureProtocol}; +use crate::ciphersuite::CipherSuite; +use crate::errors::ProtocolError; +use crate::key_exchange::group::Group; + +/// HashEdDSA for [`SigmaI`](crate::SigmaI). +/// +/// The ["verification state"](Self::VerifyState) is the pre-hash for the +/// message to be verified. +pub struct HashEddsa(PhantomData); + +impl SignatureProtocol for HashEddsa { + type Group = G; + type Signature = G::Signature; + type SignatureLen = G::SignatureLen; + type VerifyState = G::VerifyState; + + fn sign<'a, R: CryptoRng + RngCore, CS: CipherSuite, KE: Group>( + sk: &::Sk, + _: &mut R, + message: &Message, + ) -> (Self::Signature, Self::VerifyState) { + G::sign(sk, message) + } + + fn verify( + pk: &::Pk, + _: MessageBuilder<'_, CS>, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError> { + G::verify(pk, state, signature) + } + + fn serialize_signature(signature: &Self::Signature) -> GenericArray { + G::serialize_signature(signature) + } + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { + G::deserialize_take_signature(bytes) + } +} + +pub(in super::super) mod implementation { + use generic_array::ArrayLength; + + use super::*; + + pub trait HashEddsaImpl: Group { + type Signature: Clone + Zeroize; + type SignatureLen: ArrayLength; + type VerifyState: Clone + Zeroize; + + fn sign( + sk: &Self::Sk, + message: &Message, + ) -> (Self::Signature, Self::VerifyState); + + fn verify( + pk: &Self::Pk, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError>; + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result; + + fn serialize_signature(signature: &Self::Signature) + -> GenericArray; + } +} diff --git a/src/key_exchange/sigma_i/message.rs b/src/key_exchange/sigma_i/message.rs new file mode 100644 index 0000000..b4b4122 --- /dev/null +++ b/src/key_exchange/sigma_i/message.rs @@ -0,0 +1,296 @@ +use core::ops::Add; + +use derive_where::derive_where; +use digest::{FixedOutput, Output, Update}; +use generic_array::sequence::Concat; +use generic_array::typenum::Sum; +use generic_array::{ArrayLength, GenericArray}; +use zeroize::{Zeroize, ZeroizeOnDrop}; + +use crate::ciphersuite::{CipherSuite, KeGroup, KeHash, OprfGroup}; +use crate::errors::ProtocolError; +use crate::hash::OutputSize; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::{Ke1MessageIter, Ke1MessageIterLen, NonceLen}; +use crate::key_exchange::traits::{ + CredentialRequestParts, CredentialRequestPartsLen, CredentialResponseParts, + CredentialResponsePartsLen, Deserialize, Serialize, SerializedContext, SerializedIdentifier, + SerializedIdentifiers, +}; +use crate::opaque::MaskedResponseLen; +use crate::serialization::{SliceExt, UpdateExt}; + +/// This holds the message to be signed and the message to be verified. +/// +/// If your signature protocol requires pre-hashes, you can call [`hash()`]. +/// +/// If you require the actual message, call [`sign_message()`]. To get the +/// message to verify, call [`to_cached()`] to create a [`CachedMessage`] and +/// save it in [`SignatureProtocol::VerifyState`], which you can then use in +/// [`SignatureProtocol::verify()`] with [`MessageBuilder`] to create +/// [`VerifyMessage`]. +/// +/// [`hash()`]: super::Message::hash +/// [`sign_message()`]: super::Message::sign_message +/// [`to_cached()`]: super::Message::to_cached +/// [`SignatureProtocol::sign()`]: super::SignatureProtocol::sign +/// [`SignatureProtocol::verify()`]: super::SignatureProtocol::verify +/// [`SignatureProtocol::VerifyState`]: super::SignatureProtocol::VerifyState +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound(deserialize = "'de: 'a", serialize = "")) +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, ZeroizeOnDrop)] +pub struct Message<'a, CS: CipherSuite, KE: Group> { + pub(super) role: Role, + pub(super) context: SerializedContext<'a>, + pub(super) identifiers: SerializedIdentifiers<'a, KeGroup>, + pub(super) cache: CachedMessage, +} + +/// This holds the message to be verified. +/// +/// Create it by using [`MessageBuilder::build()`] with [`CachedMessage`]. +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound(deserialize = "'de: 'a", serialize = "")) +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, ZeroizeOnDrop)] +pub struct VerifyMessage<'a, CS: CipherSuite, KE: Group> { + role: Role, + context: SerializedContext<'a>, + identifier: SerializedIdentifier<'a, KeGroup>, + pub(super) cache: CachedMessage, +} + +/// Used to build [`VerifyMessage`]. It is only available in +/// [`SignatureProtocol::verify()`]. +/// +/// [`SignatureProtocol::verify()`]: super::SignatureProtocol::verify +#[derive(Debug, Eq, Hash, PartialEq, ZeroizeOnDrop)] +pub struct MessageBuilder<'a, CS: CipherSuite> { + pub(super) role: Role, + pub(super) context: SerializedContext<'a>, + pub(super) identifier: SerializedIdentifier<'a, KeGroup>, +} + +/// Created by [`Message::to_cached()`]. This is used to save the message to be +/// verified in [`SignatureProtocol::VerifyState`]. +/// +/// Use [`MessageBuilder::build()`] to create [`VerifyMessage`] in +/// [`SignatureProtocol::verify()`]. +/// +/// [`SignatureProtocol::verify()`]: super::SignatureProtocol::verify +/// [`SignatureProtocol::VerifyState`]: super::SignatureProtocol::VerifyState +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize, ZeroizeOnDrop)] +pub struct CachedMessage { + pub(super) credential_request: CredentialRequestParts, + pub(super) ke1_message: Ke1MessageIter, + pub(super) credential_response: CredentialResponseParts, + pub(super) server_nonce: GenericArray, + pub(super) server_e_pk: GenericArray, + pub(super) server_mac: Output>, +} + +impl Message<'_, CS, KE> { + /// Returns the message to be signed. + pub fn sign_message(&self) -> impl Clone + Iterator { + self.context.iter().chain(self.post_message(Stage::Sign)) + } + + /// Returns the hash of both messages. + pub fn hash(&self) -> HashOutput { + let mut context = KEH::default(); + context.update_iter(self.context.iter()); + + let sign = context.clone().chain_iter(self.post_message(Stage::Sign)); + let verify = context.chain_iter(self.post_message(Stage::Verify)); + + HashOutput { sign, verify } + } + + fn post_message(&self, stage: Stage) -> impl Clone + Iterator { + let transcript = match (self.role, stage) { + (Role::Server, Stage::Sign) => Role::Server, + (Role::Server, Stage::Verify) => Role::Client, + (Role::Client, Stage::Sign) => Role::Client, + (Role::Client, Stage::Verify) => Role::Server, + }; + let identifier = match transcript { + Role::Server => &self.identifiers.server, + Role::Client => &self.identifiers.client, + }; + + self.cache.post_message(transcript, identifier) + } + + /// Create a [`CachedMessage`], which can be saved in + /// [`SignatureProtocol::VerifyState`] and create a [`VerifyMessage`] with + /// [`MessageBuilder::build()`]. + /// + /// [`SignatureProtocol::VerifyState`]: super::SignatureProtocol::VerifyState + pub fn to_cached(&self) -> CachedMessage { + self.cache.clone() + } +} + +impl VerifyMessage<'_, CS, KE> { + /// Returns the message to be verified. + pub fn verify_message(&self) -> impl Clone + Iterator { + let transcript = match self.role { + Role::Server => Role::Client, + Role::Client => Role::Server, + }; + + self.context + .iter() + .chain(self.cache.post_message(transcript, &self.identifier)) + } +} + +impl CachedMessage { + fn post_message<'a>( + &'a self, + transcript: Role, + identifier: &'a SerializedIdentifier<'_, KeGroup>, + ) -> impl Clone + Iterator { + Some(identifier.iter()) + .filter(|_| matches!(transcript, Role::Client)) + .into_iter() + .flatten() + .chain(self.credential_request.iter()) + .chain(self.ke1_message.iter()) + .chain( + Some(identifier.iter()) + .filter(|_| matches!(transcript, Role::Server)) + .into_iter() + .flatten(), + ) + .chain(self.credential_response.iter()) + .chain([self.server_nonce.as_slice(), &self.server_e_pk]) + .chain(Some(self.server_mac.as_slice()).filter(|_| matches!(transcript, Role::Client))) + } +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Zeroize)] +pub(super) enum Role { + Server, + Client, +} + +enum Stage { + Sign, + Verify, +} + +/// Returned by [`Message::hash()`] containing the hash of the message to be +/// signed and the message to be verified. +pub struct HashOutput { + /// The hash of the message to be signed. + pub sign: H, + /// The hash of the message to be verified. + pub verify: H, +} + +impl<'a, CS: CipherSuite> MessageBuilder<'a, CS> { + /// Creates a [`VerifyMessage`]. [`CachedMessage`] can be created by + /// [`Message::to_cached()`] and stored in + /// [`SignatureProtocol::VerifyState`]. + /// + /// [`SignatureProtocol::VerifyState`]: super::SignatureProtocol::VerifyState + pub fn build(self, cache: CachedMessage) -> VerifyMessage<'a, CS, KE> { + VerifyMessage { + role: self.role, + context: self.context.clone(), + identifier: self.identifier.clone(), + cache, + } + } +} + +impl Deserialize for CachedMessage { + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + credential_request: CredentialRequestParts::deserialize_take(input)?, + ke1_message: Ke1MessageIter::deserialize_take(input)?, + credential_response: CredentialResponseParts::deserialize_take(input)?, + server_nonce: input.take_array("server nonce")?, + server_e_pk: input.take_array("serialized server ephemeral key")?, + server_mac: input.take_array("server mac")?, + }) + } +} + +/// Length of [`CachedMessage`]. +type CachedMessageLen = Sum< + Sum< + Sum< + Sum< + Sum, Ke1MessageIterLen>, + CredentialResponsePartsLen, + >, + NonceLen, + >, + KE::PkLen, + >, + OutputSize>, +>; + +impl Serialize for CachedMessage +where + CredentialRequestPartsLen: ArrayLength + Add>, + Sum, Ke1MessageIterLen>: + ArrayLength + Add>, + Sum, Ke1MessageIterLen>, CredentialResponsePartsLen>: + ArrayLength + Add, + Sum< + Sum< + Sum, Ke1MessageIterLen>, + CredentialResponsePartsLen, + >, + NonceLen, + >: ArrayLength + Add, + Sum< + Sum< + Sum< + Sum, Ke1MessageIterLen>, + CredentialResponsePartsLen, + >, + NonceLen, + >, + KE::PkLen, + >: ArrayLength + Add>>, + CachedMessageLen: ArrayLength, + // Ke1MessageIter + NonceLen: Add, + Ke1MessageIterLen: ArrayLength, + // CredentialResponseParts + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, + CredentialResponsePartsLen: ArrayLength, +{ + type Len = CachedMessageLen; + + fn serialize(&self) -> GenericArray { + self.credential_request + .serialize() + .concat(self.ke1_message.serialize()) + .concat(self.credential_response.serialize()) + .concat(self.server_nonce) + .concat(self.server_e_pk.clone()) + .concat(self.server_mac.clone()) + } +} diff --git a/src/key_exchange/sigma_i/mod.rs b/src/key_exchange/sigma_i/mod.rs new file mode 100644 index 0000000..ca29d8d --- /dev/null +++ b/src/key_exchange/sigma_i/mod.rs @@ -0,0 +1,645 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +//! An implementation of the SIGMA-I key exchange protocol +//! +//! ⚠️ **Warning**: This implementation has not been audited. Use at your own +//! risk! + +#[cfg(feature = "ecdsa")] +pub mod ecdsa; +pub mod hash_eddsa; +mod message; +pub mod pure_eddsa; +pub(super) mod shared; + +use core::iter; +use core::marker::PhantomData; +use core::ops::Add; + +use derive_where::derive_where; +use digest::core_api::BlockSizeUser; +use digest::{Digest, Mac, Output, OutputSizeUser}; +use generic_array::sequence::Concat; +use generic_array::typenum::{IsLess, Le, NonZero, Sum, U256}; +use generic_array::{ArrayLength, GenericArray}; +use hmac::Hmac; +use rand::{CryptoRng, RngCore}; +use subtle::{ConstantTimeEq, CtOption}; +use zeroize::Zeroize; + +use self::message::Role; +pub use self::message::{CachedMessage, HashOutput, Message, MessageBuilder, VerifyMessage}; +use crate::ciphersuite::{CipherSuite, KeGroup, KeHash}; +use crate::envelope::NonceLen; +use crate::errors::{InternalError, ProtocolError}; +use crate::hash::{Hash, OutputSize, ProxyHash}; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::{derive_keys, generate_ke1, generate_nonce, transcript}; +pub use crate::key_exchange::shared::{DiffieHellman, Ke1Message, Ke1State}; +use crate::key_exchange::traits::{ + CredentialRequestParts, CredentialResponseParts, Deserialize, GenerateKe2Result, + GenerateKe3Result, KeyExchange, Sealed, Serialize, SerializedContext, SerializedIdentifier, + SerializedIdentifiers, +}; +use crate::keypair::{KeyPair, PrivateKey, PublicKey}; +use crate::opaque::Identifiers; +use crate::serialization::{SliceExt, UpdateExt}; + +/// The SIGMA-I key exchange implementation +/// +/// `SIG` determines the algorithm used for the signature. `KE` determines the +/// algorithm used for establishing the shared secret. `KEH` determines the hash +/// used for the key exchange. +/// +/// # Remote Key +/// +/// [`ServerLoginBuilder::data()`](crate::ServerLoginBuilder::data()) will +/// return [`Message`]. +/// +/// [`ServerLoginBuilder::build()`](crate::ServerLoginBuilder::build()) expects +/// a signature from signing the [message](Message::sign_message) with the +/// servers private key, and a ["verification +/// state"](SignatureProtocol::VerifyState). +/// +/// To understand what kind of "verification state" is expected here exactly, +/// refer to the documentation of your chosen [`SignatureProtocol`] `SIG`. E.g. +/// [`Ecdsa`](ecdsa::Ecdsa), [`PureEddsa`](pure_eddsa::PureEddsa) or +/// [`HashEddsa`](hash_eddsa::HashEddsa). +pub struct SigmaI(PhantomData<(SIG, KE, KEH)>); + +/// Trait to implement for `SIG` used in [`SigmaI`]. +/// +/// The [`sign()`] and [`verify()`] methods do not function independent of each +/// other. [`sign()`] is always called first and receives a [Message] containing +/// the message for both signing and verifying. A ["verification +/// state"](Self::VerifyState) is created by [`sign()`] and then passed onto +/// [`verify()`]. +/// +/// The most straightforward implementation would simply store the message for +/// verifying in [`VerifyState`](Self::VerifyState). However, protocols that +/// allow for pre-hashing don't need to store the whole message and can +/// preemptively hash the verification message and only store that instead, +/// getting rid of the much larger message. +/// +/// [`sign()`]: Self::sign +/// [`verify()`]: Self::verify +pub trait SignatureProtocol { + /// The [`Group`] used to generate and derive keys. + type Group: Group; + /// The signature. + type Signature: Clone + Zeroize; + /// Length of a serialized [`Signature`](Self::Signature). + type SignatureLen: ArrayLength; + /// The state required to run the verification. This is used to cache the + /// pre-hash for curves that support that, otherwise the [`Message`] to + /// verify is stored via [`CachedMessage`]. + type VerifyState: Clone + Zeroize; + + /// Returns a signature from the given message signed by the given private + /// key. + /// + /// [`Message`] contains both signature messages for signing and + /// verification. If you need it again during verification, consider + /// using [`CachedMessage`]. + /// + /// The returned [`VerifyState`](Self::VerifyState) will be passed to + /// [`verify()`](Self::verify) and must contain the necessary + /// information to verify the incoming signature. + fn sign( + sk: &::Sk, + rng: &mut R, + message: &Message, + ) -> (Self::Signature, Self::VerifyState); + + /// Validates that the signature was created by signing the message with the + /// corresponding private key. + /// + /// The [`MessageBuilder`] can be used with [`CachedMessage`] to create + /// [`VerifyMessage`] which contains the message of the given `signature`. + /// + /// The `state` is created by [`sign()`](Self::sign()). + fn verify( + pk: &::Pk, + message_builder: MessageBuilder<'_, CS>, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError>; + + /// Serialize [`Signature`](Self::Signature) into a fixed-sized byte array. + fn serialize_signature(signature: &Self::Signature) -> GenericArray; + + /// Deserialize [`Signature`](Self::Signature) from the given `bytes`. + /// + /// The deserialized bytes must be taken from `bytes`. + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result; +} + +/// Builder for the second key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound(deserialize = "'de: 'a", serialize = "")) +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, PartialEq; PublicKey>, PublicKey)] +pub struct Ke2Builder<'a, CS: CipherSuite, KE: Group> { + transcript: Message<'a, CS, KE>, + server_nonce: GenericArray, + client_s_pk: PublicKey>, + server_e_pk: PublicKey, + expected_mac: Output>, + session_key: Output>, + #[cfg(test)] + km3: Output>, + #[cfg(test)] + handshake_secret: Output>, +} + +/// The server state produced after the second key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound( + deserialize = "SIG::VerifyState: serde::Deserialize<'de>", + serialize = "SIG::VerifyState: serde::Serialize" + )) +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, PartialEq; ::Pk, SIG::VerifyState)] +pub struct Ke2State { + client_s_pk: PublicKey, + session_key: Output>, + verify_state: SIG::VerifyState, + expected_mac: Output>, +} + +/// The second key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound( + deserialize = "SIG::Signature: serde::Deserialize<'de>", + serialize = "SIG::Signature: serde::Serialize" + )) +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KE::Pk, SIG::Signature)] +pub struct Ke2Message +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + server_nonce: GenericArray, + server_e_pk: PublicKey, + signature: SIG::Signature, + mac: Output, +} + +/// The third key exchange message +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound( + deserialize = "SIG::Signature: serde::Deserialize<'de>", + serialize = "SIG::Signature: serde::Serialize" + )) +)] +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; SIG::Signature)] +pub struct Ke3Message { + signature: SIG::Signature, + mac: Output, +} + +impl KeyExchange for SigmaI +where + KE::Sk: DiffieHellman, + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + type Group = SIG::Group; + type Hash = KEH; + + type KE1State = Ke1State; + type KE1Message = Ke1Message; + type KE2Builder<'a, CS: CipherSuite> = Ke2Builder<'a, CS, KE>; + type KE2BuilderData<'a, CS: 'static + CipherSuite> = &'a Message<'a, CS, KE>; + type KE2BuilderInput = (SIG::Signature, SIG::VerifyState); + type KE2State = Ke2State; + type KE2Message = Ke2Message; + type KE3Message = Ke3Message; + + fn generate_ke1( + rng: &mut R, + ) -> Result<(Self::KE1State, Self::KE1Message), ProtocolError> { + generate_ke1(rng) + } + + fn ke2_builder<'a, CS: CipherSuite, R: RngCore + CryptoRng>( + rng: &mut R, + credential_request: CredentialRequestParts, + ke1_message: Self::KE1Message, + credential_response: CredentialResponseParts, + client_s_pk: PublicKey, + identifiers: SerializedIdentifiers<'a, KeGroup>, + context: SerializedContext<'a>, + ) -> Result, ProtocolError> { + let server_e = KeyPair::::derive_random(rng); + let server_nonce = generate_nonce::(rng); + + let ke1_message_iter = ke1_message.to_iter(); + let server_e_pk = server_e.public().serialize(); + + let transcript_hasher = transcript( + &context, + &identifiers, + &credential_request, + &ke1_message_iter, + &credential_response, + server_nonce, + &server_e_pk, + ); + + let shared_secret = server_e + .private() + .ke_diffie_hellman(&ke1_message.client_e_pk); + + let derived_keys = derive_keys::( + iter::once(shared_secret.as_slice()), + &transcript_hasher.finalize(), + )?; + + let mut server_mac = + Hmac::::new_from_slice(&derived_keys.km2).map_err(|_| InternalError::HmacError)?; + server_mac.update_iter(identifiers.server.iter()); + let server_mac = server_mac.finalize().into_bytes(); + + let mut client_mac = + Hmac::::new_from_slice(&derived_keys.km3).map_err(|_| InternalError::HmacError)?; + client_mac.update_iter(identifiers.client.iter()); + let client_mac = client_mac.finalize().into_bytes(); + + let message = Message { + role: Role::Server, + context, + identifiers, + cache: CachedMessage { + credential_request, + ke1_message: ke1_message_iter, + credential_response, + server_nonce, + server_e_pk, + server_mac, + }, + }; + + Ok(Ke2Builder { + transcript: message, + server_nonce, + client_s_pk, + server_e_pk: server_e.public().clone(), + expected_mac: client_mac, + session_key: derived_keys.session_key, + #[cfg(test)] + km3: derived_keys.km3, + #[cfg(test)] + handshake_secret: derived_keys.handshake_secret, + }) + } + + fn ke2_builder_data<'a, CS: 'static + CipherSuite>( + builder: &'a Self::KE2Builder<'_, CS>, + ) -> Self::KE2BuilderData<'a, CS> { + &builder.transcript + } + + fn generate_ke2_input, R: CryptoRng + RngCore>( + builder: &Self::KE2Builder<'_, CS>, + rng: &mut R, + server_s_sk: &PrivateKey, + ) -> Self::KE2BuilderInput { + server_s_sk.sign::<_, CS, SIG, KE>(rng, &builder.transcript) + } + + fn build_ke2>( + builder: Self::KE2Builder<'_, CS>, + input: Self::KE2BuilderInput, + ) -> Result, ProtocolError> { + Ok(( + Ke2State { + client_s_pk: builder.client_s_pk.clone(), + session_key: builder.session_key.clone(), + verify_state: input.1, + expected_mac: builder.expected_mac.clone(), + }, + Ke2Message { + server_nonce: builder.server_nonce, + server_e_pk: builder.server_e_pk.clone(), + signature: input.0, + mac: builder.transcript.cache.server_mac.clone(), + }, + #[cfg(test)] + builder.handshake_secret.clone(), + #[cfg(test)] + builder.km3.clone(), + )) + } + + fn generate_ke3, R: CryptoRng + RngCore>( + rng: &mut R, + credential_request: CredentialRequestParts, + ke1_message: Self::KE1Message, + credential_response: CredentialResponseParts, + ke2_message: Self::KE2Message, + ke1_state: &Self::KE1State, + server_s_pk: PublicKey, + client_s_sk: PrivateKey, + identifiers: SerializedIdentifiers<'_, KeGroup>, + context: SerializedContext<'_>, + ) -> Result, ProtocolError> { + let ke1_message_iter = ke1_message.to_iter(); + let server_e_pk = ke2_message.server_e_pk.serialize(); + + let transcript_hasher = transcript( + &context, + &identifiers, + &credential_request, + &ke1_message_iter, + &credential_response, + ke2_message.server_nonce, + &server_e_pk, + ); + + let shared_secret = ke1_state + .client_e_sk + .ke_diffie_hellman(&ke2_message.server_e_pk); + + let derived_keys = derive_keys::( + iter::once(shared_secret.as_slice()), + &transcript_hasher.finalize(), + )?; + + let mut server_mac = + Hmac::::new_from_slice(&derived_keys.km2).map_err(|_| InternalError::HmacError)?; + server_mac.update_iter(identifiers.server.iter()); + let server_mac = server_mac.finalize().into_bytes(); + + bool::from(server_mac.ct_eq(&ke2_message.mac)) + .then_some(()) + .ok_or(ProtocolError::InvalidLoginError)?; + + let mut client_mac = + Hmac::::new_from_slice(&derived_keys.km3).map_err(|_| InternalError::HmacError)?; + client_mac.update_iter(identifiers.client.iter()); + let client_mac = client_mac.finalize().into_bytes(); + + let message = Message { + role: Role::Client, + context: context.clone(), + identifiers: identifiers.clone(), + cache: CachedMessage { + credential_request, + ke1_message: ke1_message_iter, + credential_response, + server_nonce: ke2_message.server_nonce, + server_e_pk, + server_mac, + }, + }; + + let (signature, state) = client_s_sk.sign::<_, CS, SIG, KE>(rng, &message); + + server_s_pk.verify::( + MessageBuilder { + role: Role::Client, + context, + identifier: identifiers.server, + }, + state, + &ke2_message.signature, + )?; + + Ok(( + derived_keys.session_key, + Ke3Message { + signature, + mac: client_mac, + }, + #[cfg(test)] + derived_keys.handshake_secret, + #[cfg(test)] + derived_keys.km3, + )) + } + + fn finish_ke>( + ke3_message: Self::KE3Message, + ke2_state: &Self::KE2State, + identifiers: Identifiers<'_>, + context: SerializedContext<'_>, + ) -> Result, ProtocolError> { + ke2_state.client_s_pk.verify::( + MessageBuilder { + role: Role::Server, + context, + identifier: SerializedIdentifier::from_identifier( + identifiers.client, + ke2_state.client_s_pk.serialize(), + )?, + }, + ke2_state.verify_state.clone(), + &ke3_message.signature, + )?; + + CtOption::new( + ke2_state.session_key.clone(), + ke2_state.expected_mac.ct_eq(&ke3_message.mac), + ) + .into_option() + .ok_or(ProtocolError::InvalidLoginError) + } +} + +impl Sealed for SigmaI +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ +} + +impl Deserialize for Ke2State +where + SIG::VerifyState: Deserialize, +{ + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + client_s_pk: PublicKey::deserialize_take(input)?, + session_key: input.take_array("session key")?, + verify_state: SIG::VerifyState::deserialize_take(input)?, + expected_mac: input.take_array("expected mac")?, + }) + } +} + +type Ke2StateLen = Sum< + Sum::PkLen, OutputSize>>, VerifyStateLen>, + OutputSize>, +>; + +type VerifyStateLen = as Serialize>::Len; + +impl Serialize for Ke2State +where + SIG::VerifyState: Serialize, + // Ke2State: ((SigPk + Hash) + VerifyState) + Hash + ::PkLen: Add>>, + Sum<::PkLen, OutputSize>>: + ArrayLength + Add>, + Sum::PkLen, OutputSize>>, VerifyStateLen>: + ArrayLength + Add>>, + Ke2StateLen: ArrayLength, +{ + type Len = Ke2StateLen; + + fn serialize(&self) -> GenericArray { + self.client_s_pk + .serialize() + .concat(self.session_key.clone()) + .concat(self.verify_state.serialize()) + .concat(self.expected_mac.clone()) + } +} + +impl Deserialize for Ke2Message +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + server_nonce: input.take_array("server nonce")?, + server_e_pk: PublicKey::deserialize_take(input)?, + signature: SIG::deserialize_take_signature(input)?, + mac: input.take_array("mac")?, + }) + } +} + +impl Serialize for Ke2Message +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, + // Ke2Message: ((Nonce + KePk) + Signature) + Hash + NonceLen: Add, + Sum: ArrayLength + Add, + Sum, SIG::SignatureLen>: ArrayLength + Add>, + Sum, SIG::SignatureLen>, OutputSize>: ArrayLength, +{ + type Len = Sum, SIG::SignatureLen>, OutputSize>; + + fn serialize(&self) -> GenericArray { + self.server_nonce + .concat(self.server_e_pk.serialize()) + .concat(SIG::serialize_signature(&self.signature)) + .concat(self.mac.clone()) + } +} + +impl Deserialize for Ke3Message +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + signature: SIG::deserialize_take_signature(input)?, + mac: input.take_array("mac")?, + }) + } +} + +impl Serialize for Ke3Message +where + KEH::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, + // Ke2Message: Signature + Hash + SIG::SignatureLen: Add>, + Sum>: ArrayLength, +{ + type Len = Sum>; + + fn serialize(&self) -> GenericArray { + SIG::serialize_signature(&self.signature).concat(self.mac.clone()) + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::key_exchange::shared::Ke1MessageIter; +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for CachedMessage +where + Ke1MessageIter: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { + credential_request, + ke1_message, + credential_response, + server_nonce, + server_e_pk, + server_mac, + } = self; + + credential_request.assert_zeroized(); + ke1_message.assert_zeroized(); + credential_response.assert_zeroized(); + + for byte in server_nonce.iter().chain(server_e_pk).chain(server_mac) { + assert_eq!(byte, &0); + } + } +} + +#[cfg(test)] +impl AssertZeroized for Ke2State +where + ::Pk: AssertZeroized, + SIG::VerifyState: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { + client_s_pk, + session_key, + verify_state, + expected_mac, + } = self; + + client_s_pk.assert_zeroized(); + verify_state.assert_zeroized(); + + for byte in session_key.iter().chain(expected_mac) { + assert_eq!(byte, &0); + } + } +} diff --git a/src/key_exchange/sigma_i/pure_eddsa.rs b/src/key_exchange/sigma_i/pure_eddsa.rs new file mode 100644 index 0000000..a62191a --- /dev/null +++ b/src/key_exchange/sigma_i/pure_eddsa.rs @@ -0,0 +1,89 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +//! PureEdDSA implementation for [`SigmaI`](crate::SigmaI). Currently only +//! supports [`Ed25519`](crate::Ed25519). + +use core::marker::PhantomData; + +use generic_array::GenericArray; +use rand::{CryptoRng, RngCore}; +use zeroize::Zeroize; + +use self::implementation::PureEddsaImpl; +use super::{Message, MessageBuilder, SignatureProtocol}; +use crate::ciphersuite::CipherSuite; +use crate::errors::ProtocolError; +use crate::key_exchange::group::Group; +use crate::key_exchange::sigma_i::CachedMessage; + +/// PureEdDSA for [`SigmaI`](crate::SigmaI). +/// +/// The ["verification state"](Self::VerifyState) is a [`CachedMessage`], +/// created by calling [`Message::to_cached()`]. +pub struct PureEddsa(PhantomData); + +impl SignatureProtocol for PureEddsa { + type Group = G; + type Signature = G::Signature; + type SignatureLen = G::SignatureLen; + type VerifyState = CachedMessage; + + fn sign<'a, R: CryptoRng + RngCore, CS: CipherSuite, KE: Group>( + sk: &G::Sk, + _: &mut R, + message: &Message, + ) -> (Self::Signature, Self::VerifyState) { + G::sign(sk, message) + } + + fn verify( + pk: &G::Pk, + message_builder: MessageBuilder<'_, CS>, + state: Self::VerifyState, + signature: &Self::Signature, + ) -> Result<(), ProtocolError> { + G::verify(pk, message_builder, state, signature) + } + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { + G::deserialize_take_signature(bytes) + } + + fn serialize_signature(signature: &Self::Signature) -> GenericArray { + G::serialize_signature(signature) + } +} + +pub(in super::super) mod implementation { + use generic_array::ArrayLength; + + use super::*; + + pub trait PureEddsaImpl: Group { + type Signature: Clone + Zeroize; + type SignatureLen: ArrayLength; + + fn sign( + sk: &Self::Sk, + message: &Message, + ) -> (Self::Signature, CachedMessage); + + fn verify( + pk: &Self::Pk, + message_builder: MessageBuilder<'_, CS>, + state: CachedMessage, + signature: &Self::Signature, + ) -> Result<(), ProtocolError>; + + fn deserialize_take_signature(bytes: &mut &[u8]) -> Result; + + fn serialize_signature(signature: &Self::Signature) + -> GenericArray; + } +} diff --git a/src/key_exchange/sigma_i/shared.rs b/src/key_exchange/sigma_i/shared.rs new file mode 100644 index 0000000..e576dd4 --- /dev/null +++ b/src/key_exchange/sigma_i/shared.rs @@ -0,0 +1,54 @@ +// Copyright (c) Meta Platforms, Inc. and affiliates. +// +// This source code is dual-licensed under either the MIT license found in the +// LICENSE-MIT file in the root directory of this source tree or the Apache +// License, Version 2.0 found in the LICENSE-APACHE file in the root directory +// of this source tree. You may select, at your option, one of the above-listed +// licenses. + +use derive_where::derive_where; +use digest::{Output, OutputSizeUser}; +use generic_array::{ArrayLength, GenericArray}; + +use crate::errors::ProtocolError; +use crate::key_exchange::traits::{Deserialize, Serialize}; +use crate::serialization::SliceExt; + +/// Pre-hash of the message to be verified. +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +#[derive_where(Copy; >::ArrayType)] +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +pub struct PreHash(pub Output); + +impl Deserialize for PreHash { + fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self(input.take_array("pre-hash")?)) + } +} + +impl Serialize for PreHash { + type Len = H::OutputSize; + + fn serialize(&self) -> GenericArray { + self.0.clone() + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for PreHash { + fn assert_zeroized(&self) { + assert_eq!(self.0, GenericArray::default()); + } +} diff --git a/src/key_exchange/traits.rs b/src/key_exchange/traits.rs index f886756..d36a2f5 100644 --- a/src/key_exchange/traits.rs +++ b/src/key_exchange/traits.rs @@ -6,83 +6,322 @@ // of this source tree. You may select, at your option, one of the above-listed // licenses. -use digest::core_api::BlockSizeUser; +use core::iter; +use core::ops::Add; + +use derive_where::derive_where; +use digest::core_api::{BlockSizeUser, CoreProxy}; use digest::Output; -use generic_array::typenum::{IsLess, Le, NonZero, U256}; +use generic_array::sequence::Concat; +use generic_array::typenum::{IsLess, Le, NonZero, Sum, U2, U256}; use generic_array::{ArrayLength, GenericArray}; use rand::{CryptoRng, RngCore}; -use zeroize::ZeroizeOnDrop; +use voprf::{BlindedElement, EvaluationElement}; +use zeroize::{Zeroize, ZeroizeOnDrop}; -use crate::ciphersuite::{CipherSuite, OprfHash}; +#[cfg(test)] +use crate::ciphersuite::KeHash; +use crate::ciphersuite::{CipherSuite, OprfGroup}; use crate::errors::ProtocolError; use crate::hash::{Hash, ProxyHash}; -use crate::key_exchange::group::KeGroup; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::{NonceLen, STR_CONTEXT}; use crate::keypair::{PrivateKey, PublicKey}; +use crate::opaque::{Identifiers, MaskedResponse, MaskedResponseLen}; +use crate::serialization::{i2osp, SliceExt}; -pub trait KeyExchange +/// The key exchange trait. This is only exposed so users can use it in generics +/// and qualified bounds. +#[allow(private_bounds)] +pub trait KeyExchange: Sealed where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + ::Core: ProxyHash, + <::Core as BlockSizeUser>::BlockSize: IsLess, + Le<<::Core as BlockSizeUser>::BlockSize, U256>: NonZero, { - type KE1State: Deserialize + Serialize + ZeroizeOnDrop + Clone; - type KE2State: Deserialize + Serialize + ZeroizeOnDrop + Clone; - type KE1Message: Deserialize + Serialize + ZeroizeOnDrop + Clone; - type KE2Builder: ZeroizeOnDrop + Clone; - type KE2BuilderData<'a>; - type KE2BuilderInput; - type KE2Message: Deserialize + Serialize + ZeroizeOnDrop + Clone; - type KE3Message: Deserialize + Serialize + ZeroizeOnDrop + Clone; + /// The group used for the key exchange. + type Group: Group; + /// The has used for the key exchange. + type Hash: Hash; - fn generate_ke1( + #[doc(hidden)] + type KE1State: ZeroizeOnDrop + Clone; + #[doc(hidden)] + type KE2State: ZeroizeOnDrop + Clone; + #[doc(hidden)] + type KE1Message: ZeroizeOnDrop + Clone; + #[doc(hidden)] + type KE2Builder<'a, CS: CipherSuite>: ZeroizeOnDrop + Clone; + #[doc(hidden)] + type KE2BuilderData<'a, CS: 'static + CipherSuite>; + #[doc(hidden)] + type KE2BuilderInput; + #[doc(hidden)] + type KE2Message: ZeroizeOnDrop + Clone; + #[doc(hidden)] + type KE3Message: ZeroizeOnDrop + Clone; + + #[doc(hidden)] + fn generate_ke1( rng: &mut R, ) -> Result<(Self::KE1State, Self::KE1Message), ProtocolError>; - #[allow(clippy::too_many_arguments)] - fn ke2_builder<'a, 'b, 'c, 'd, OprfCs: voprf::CipherSuite, R: RngCore + CryptoRng>( + #[doc(hidden)] + fn ke2_builder<'a, CS: CipherSuite, R: RngCore + CryptoRng>( rng: &mut R, - serialized_credential_request: impl Iterator, - serialized_credential_response: impl Iterator, + credential_request: CredentialRequestParts, ke1_message: Self::KE1Message, - client_s_pk: PublicKey, - id_u: impl Iterator, - id_s: impl Iterator, - context: &[u8], - ) -> Result; + credential_response: CredentialResponseParts, + client_s_pk: PublicKey, + identifiers: SerializedIdentifiers<'a, Self::Group>, + context: SerializedContext<'a>, + ) -> Result, ProtocolError>; - fn ke2_builder_data(builder: &Self::KE2Builder) -> Self::KE2BuilderData<'_>; + #[doc(hidden)] + fn ke2_builder_data<'a, CS: CipherSuite>( + builder: &'a Self::KE2Builder<'_, CS>, + ) -> Self::KE2BuilderData<'a, CS>; - fn generate_ke2_input( - builder: &Self::KE2Builder, - server_s_sk: &PrivateKey, - ) -> Self::KE2BuilderInput; + #[doc(hidden)] + fn generate_ke2_input, R: CryptoRng + RngCore>( + builder: &Self::KE2Builder<'_, CS>, + rng: &mut R, + server_s_sk: &PrivateKey, + ) -> Self::KE2BuilderInput; - fn build_ke2( - builder: Self::KE2Builder, - input: Self::KE2BuilderInput, - ) -> Result, ProtocolError>; + #[doc(hidden)] + fn build_ke2>( + builder: Self::KE2Builder<'_, CS>, + input: Self::KE2BuilderInput, + ) -> Result, ProtocolError>; + #[doc(hidden)] #[allow(clippy::too_many_arguments)] - fn generate_ke3<'a, 'b, 'c, 'd>( - l2_component: impl Iterator, + fn generate_ke3, R: CryptoRng + RngCore>( + rng: &mut R, + credential_request: CredentialRequestParts, + ke1_message: Self::KE1Message, + credential_response: CredentialResponseParts, ke2_message: Self::KE2Message, ke1_state: &Self::KE1State, - serialized_credential_request: impl Iterator, - server_s_pk: PublicKey, - client_s_sk: PrivateKey, - id_u: impl Iterator, - id_s: impl Iterator, - context: &[u8], - ) -> Result, ProtocolError>; + server_s_pk: PublicKey, + client_s_sk: PrivateKey, + identifiers: SerializedIdentifiers<'_, Self::Group>, + context: SerializedContext<'_>, + ) -> Result, ProtocolError>; - fn finish_ke( + #[doc(hidden)] + fn finish_ke>( ke3_message: Self::KE3Message, - ke2_state: &Self::KE2State, - ) -> Result, ProtocolError>; + ke2_state: &Self::KE2State, + identifiers: Identifiers<'_>, + context: SerializedContext<'_>, + ) -> Result, ProtocolError>; +} + +pub(super) trait Sealed {} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Zeroize)] +pub struct CredentialRequestParts( + GenericArray as voprf::Group>::ElemLen>, +); + +impl CredentialRequestParts { + pub(crate) fn new(blinded_element: &BlindedElement) -> Self { + Self(blinded_element.serialize()) + } + + pub fn iter(&self) -> impl Clone + Iterator { + iter::once(self.0.as_slice()) + } + + pub fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self(input.take_array("blinded element")?)) + } +} + +pub type CredentialRequestPartsLen = as voprf::Group>::ElemLen; + +impl Serialize for CredentialRequestParts { + type Len = CredentialRequestPartsLen; + + fn serialize(&self) -> GenericArray { + self.0.clone() + } +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +pub struct CredentialResponseParts { + evaluation_element: GenericArray as voprf::Group>::ElemLen>, + masking_nonce: GenericArray, + masked_response: MaskedResponse, +} + +impl CredentialResponseParts { + pub(crate) fn new( + evaluation_element: &EvaluationElement, + masking_nonce: GenericArray, + masked_response: MaskedResponse, + ) -> Self { + Self { + evaluation_element: evaluation_element.serialize(), + masking_nonce, + masked_response, + } + } + + pub fn iter(&self) -> impl Clone + Iterator { + [self.evaluation_element.as_slice(), &self.masking_nonce] + .into_iter() + .chain(self.masked_response.iter()) + } + + pub fn deserialize_take(input: &mut &[u8]) -> Result { + Ok(Self { + evaluation_element: input.take_array("evaluation element")?, + masking_nonce: input.take_array("masking nonce")?, + masked_response: MaskedResponse::deserialize_take(input)?, + }) + } +} + +pub type CredentialResponsePartsLen = + Sum as voprf::Group>::ElemLen, NonceLen>, MaskedResponseLen>; + +impl Serialize for CredentialResponseParts +where + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, + CredentialResponsePartsLen: ArrayLength, +{ + type Len = CredentialResponsePartsLen; + + fn serialize(&self) -> GenericArray { + self.evaluation_element + .clone() + .concat(self.masking_nonce) + .concat(self.masked_response.serialize()) + } +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +pub struct SerializedContext<'a> { + length: GenericArray, + #[zeroize(skip)] + context: &'a [u8], +} + +impl<'a> SerializedContext<'a> { + pub(crate) fn from(context: Option<&'a [u8]>) -> Result { + let context = context.unwrap_or(&[]); + + Ok(Self { + length: i2osp::(context.len())?, + context, + }) + } + + pub fn iter(&self) -> impl Clone + Iterator { + iter::once(STR_CONTEXT).chain([self.length.as_slice(), self.context]) + } +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound(deserialize = "'de: 'a", serialize = "")) +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +pub struct SerializedIdentifiers<'a, G: Group> { + pub client: SerializedIdentifier<'a, G>, + pub server: SerializedIdentifier<'a, G>, +} + +/// Computes `I2OSP(len(input), max_bytes) || input` and helps hold output +/// without allocation. +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound(deserialize = "'de: 'a", serialize = "")) +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +pub struct SerializedIdentifier<'a, G: Group> { + length: GenericArray, + identifier: Identifier<'a, G>, +} + +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, Zeroize)] +enum Identifier<'a, G: Group> { + Owned(GenericArray), + #[derive_where(skip_inner(Zeroize))] + Borrowed(&'a [u8]), +} + +impl<'a, G: Group> SerializedIdentifiers<'a, G> { + pub(crate) fn from_identifiers( + ids: Identifiers<'a>, + client_s_pk: GenericArray, + server_s_pk: GenericArray, + ) -> Result { + let client = SerializedIdentifier::from_identifier(ids.client, client_s_pk)?; + let server = SerializedIdentifier::from_identifier(ids.server, server_s_pk)?; + + Ok(Self { client, server }) + } +} + +impl<'a, G: Group> SerializedIdentifier<'a, G> { + pub fn from_identifier( + id: Option<&'a [u8]>, + s_pk: GenericArray, + ) -> Result { + if let Some(id) = id { + Ok(SerializedIdentifier { + length: i2osp::(id.len())?, + identifier: Identifier::Borrowed(id), + }) + } else { + Ok(SerializedIdentifier { + length: i2osp::(s_pk.len())?, + identifier: Identifier::Owned(s_pk), + }) + } + } + + pub(crate) fn iter(&self) -> impl Clone + Iterator { + // Some magic to make it output the same type in all branches. + [self.length.as_slice()] + .into_iter() + .chain(match &self.identifier { + Identifier::Owned(bytes) => [bytes.as_slice()], + Identifier::Borrowed(bytes) => [*bytes], + }) + } } pub trait Deserialize: Sized { - fn deserialize(input: &[u8]) -> Result; + fn deserialize_take(input: &mut &[u8]) -> Result; } pub trait Serialize { @@ -92,34 +331,72 @@ pub trait Serialize { } #[cfg(not(test))] -pub type GenerateKe2Result = ( - >::KE2State, - >::KE2Message, +pub type GenerateKe2Result = ( + ::KE2State, + ::KE2Message, ); #[cfg(test)] -pub type GenerateKe2Result = ( - >::KE2State, - >::KE2Message, - Output, - Output, +pub type GenerateKe2Result = ( + ::KE2State, + ::KE2Message, + Output>, + Output>, ); #[cfg(not(test))] -pub type GenerateKe3Result = (Output, >::KE3Message); +pub type GenerateKe3Result = (Output, K::KE3Message); #[cfg(test)] -pub type GenerateKe3Result = ( - Output, - >::KE3Message, - Output, - Output, +pub type GenerateKe3Result = ( + Output, + K::KE3Message, + Output, + Output, ); pub type Ke1StateLen = - <, CS::KeGroup>>::KE1State as Serialize>::Len; + <::KE1State as Serialize>::Len; pub type Ke1MessageLen = - <, CS::KeGroup>>::KE1Message as Serialize>::Len; + <::KE1Message as Serialize>::Len; pub type Ke2StateLen = - <, CS::KeGroup>>::KE2State as Serialize>::Len; + <::KE2State as Serialize>::Len; pub type Ke2MessageLen = - <, CS::KeGroup>>::KE2Message as Serialize>::Len; + <::KE2Message as Serialize>::Len; pub type Ke3MessageLen = - <, CS::KeGroup>>::KE3Message as Serialize>::Len; + <::KE3Message as Serialize>::Len; + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for CredentialRequestParts { + fn assert_zeroized(&self) { + let Self(blinded_element) = self; + + for byte in blinded_element.iter() { + assert_eq!(byte, &0); + } + } +} + +#[cfg(test)] +impl AssertZeroized for CredentialResponseParts { + fn assert_zeroized(&self) { + let Self { + evaluation_element, + masking_nonce, + masked_response, + } = self; + + for byte in evaluation_element + .iter() + .chain(masking_nonce) + .chain(masked_response.iter().flatten()) + { + assert_eq!(byte, &0); + } + } +} diff --git a/src/key_exchange/tripledh.rs b/src/key_exchange/tripledh.rs index 26fdae2..9624d7b 100644 --- a/src/key_exchange/tripledh.rs +++ b/src/key_exchange/tripledh.rs @@ -7,42 +7,34 @@ // licenses. //! An implementation of the Triple Diffie-Hellman key exchange protocol -use core::convert::TryFrom; + +use core::marker::PhantomData; use core::ops::Add; use derive_where::derive_where; use digest::core_api::BlockSizeUser; -use digest::{Digest, Output}; +use digest::{Digest, Mac, Output, OutputSizeUser}; use generic_array::sequence::Concat; -use generic_array::typenum::{IsLess, Le, NonZero, Sum, Unsigned, U1, U2, U256, U32}; +use generic_array::typenum::{IsLess, Le, NonZero, Sum, U256}; use generic_array::{ArrayLength, GenericArray}; -use hkdf::{Hkdf, HkdfExtract}; -use hmac::{Hmac, Mac}; +use hmac::Hmac; use rand::{CryptoRng, RngCore}; +use subtle::{ConstantTimeEq, CtOption}; use zeroize::{Zeroize, ZeroizeOnDrop}; -use crate::errors::utils::{check_slice_size, check_slice_size_atleast}; +use crate::ciphersuite::{CipherSuite, KeGroup}; use crate::errors::{InternalError, ProtocolError}; use crate::hash::{Hash, OutputSize, ProxyHash}; -use crate::key_exchange::group::KeGroup; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::{self, NonceLen}; +pub use crate::key_exchange::shared::{DiffieHellman, Ke1Message, Ke1State}; use crate::key_exchange::traits::{ - Deserialize, GenerateKe2Result, GenerateKe3Result, KeyExchange, Serialize, + CredentialRequestParts, CredentialResponseParts, Deserialize, GenerateKe2Result, + GenerateKe3Result, KeyExchange, Sealed, Serialize, SerializedContext, SerializedIdentifiers, }; use crate::keypair::{KeyPair, PrivateKey, PublicKey}; -use crate::serialization::{Input, UpdateExt}; - -/////////////// -// Constants // -// ========= // -/////////////// - -pub(crate) type NonceLen = U32; -static STR_CONTEXT: &[u8] = b"OPAQUEv1-"; -static STR_CLIENT_MAC: &[u8] = b"ClientMAC"; -static STR_HANDSHAKE_SECRET: &[u8] = b"HandshakeSecret"; -static STR_SERVER_MAC: &[u8] = b"ServerMAC"; -static STR_SESSION_KEY: &[u8] = b"SessionKey"; -static STR_OPAQUE: &[u8] = b"OPAQUE-"; +use crate::opaque::Identifiers; +use crate::serialization::SliceExt; //////////////////////////// // High-level API Structs // @@ -55,36 +47,11 @@ static STR_OPAQUE: &[u8] = b"OPAQUE-"; /// /// [`ServerLoginBuilder::data()`](crate::ServerLoginBuilder::data()) will /// return the client's ephemeral public key. +/// /// [`ServerLoginBuilder::build()`](crate::ServerLoginBuilder::build()) expects -/// a shared secret computed through Diffie-Hellman from the server's private -/// key and the given public key. -pub struct TripleDh; - -/// The client state produced after the first key exchange message -#[cfg_attr( - feature = "serde", - derive(serde::Deserialize, serde::Serialize), - serde(bound = "") -)] -#[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Sk)] -pub struct Ke1State { - client_e_sk: PrivateKey, - client_nonce: GenericArray, -} - -/// The first key exchange message -#[cfg_attr( - feature = "serde", - derive(serde::Deserialize, serde::Serialize), - serde(bound = "") -)] -#[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Pk)] -pub struct Ke1Message { - pub(crate) client_nonce: GenericArray, - pub(crate) client_e_pk: PublicKey, -} +/// a shared secret computed through Diffie-Hellman from the servers private key +/// and the given public key. +pub struct TripleDh(PhantomData<(G, H)>); /// The server state produced after the second key exchange message #[cfg_attr( @@ -93,15 +60,9 @@ pub struct Ke1Message { serde(bound = "") )] #[derive_where(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, ZeroizeOnDrop)] -pub struct Ke2State -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - km3: Output, - hashed_transcript: Output, - session_key: Output, +pub struct Ke2State { + session_key: Output, + expected_mac: Output, } /// Builder for the second key exchange message @@ -109,24 +70,24 @@ where feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = "D: serde::Deserialize<'de>, PublicKey: serde::Deserialize<'de>", - serialize = "D: serde::Serialize, PublicKey: serde::Serialize", + deserialize = "H: serde::Deserialize<'de>, PublicKey: serde::Deserialize<'de>", + serialize = "H: serde::Serialize, PublicKey: serde::Serialize", )) )] #[derive_where(Clone)] -#[derive_where(Debug, Eq, Hash, PartialEq; D, PublicKey)] -pub struct Ke2Builder +#[derive_where(Debug, Eq, Hash, PartialEq; H, PublicKey)] +pub struct Ke2Builder where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { server_nonce: GenericArray, - transcript_hasher: D, - client_e_pk: PublicKey, - server_e_pk: PublicKey, - shared_secret_1: GenericArray, - shared_secret_3: GenericArray, + transcript_hasher: H, + client_e_pk: PublicKey, + server_e_pk: PublicKey, + shared_secret_1: GenericArray, + shared_secret_3: GenericArray, } /// The second key exchange message @@ -136,16 +97,16 @@ where serde(bound = "") )] #[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Pk)] -pub struct Ke2Message +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; G::Pk)] +pub struct Ke2Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { server_nonce: GenericArray, - server_e_pk: PublicKey, - mac: Output, + server_e_pk: PublicKey, + mac: Output, } /// The third key exchange message @@ -155,19 +116,13 @@ where serde(bound = "") )] #[derive_where(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, ZeroizeOnDrop)] -pub struct Ke3Message +pub struct Ke3Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - mac: Output, -} - -/// Trait required by [`KeGroup::Sk`] to be compatible with [`TripleDh`]. -pub trait DiffieHellman { - /// Diffie-Hellman key exchange. - fn diffie_hellman(self, pk: KG::Pk) -> GenericArray; + mac: Output, } //////////////////////////////// @@ -175,78 +130,55 @@ pub trait DiffieHellman { // ========================== // //////////////////////////////// -impl KeyExchange for TripleDh +impl KeyExchange for TripleDh where - KG::Sk: DiffieHellman, - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, - // Ke1State: KeSk + Nonce - KG::SkLen: Add, - Sum: ArrayLength, - // Ke1Message: Nonce + KePk - NonceLen: Add, - Sum: ArrayLength, - // Ke2State: (Hash + Hash) + Hash - OutputSize: Add>, - Sum, OutputSize>: ArrayLength + Add>, - Sum, OutputSize>, OutputSize>: ArrayLength, - // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add, - Sum: ArrayLength + Add>, - Sum, OutputSize>: ArrayLength, + G::Sk: DiffieHellman, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - type KE1State = Ke1State; - type KE2State = Ke2State; - type KE1Message = Ke1Message; - type KE2Builder = Ke2Builder; - type KE2BuilderData<'a> = &'a PublicKey; - type KE2BuilderInput = GenericArray; - type KE2Message = Ke2Message; - type KE3Message = Ke3Message; + type Group = G; + type Hash = H; - fn generate_ke1( + type KE1State = Ke1State; + type KE2State = Ke2State; + type KE1Message = Ke1Message; + type KE2Builder<'a, CS: CipherSuite> = Ke2Builder; + type KE2BuilderData<'a, CS: 'static + CipherSuite> = &'a PublicKey; + type KE2BuilderInput = GenericArray; + type KE2Message = Ke2Message; + type KE3Message = Ke3Message; + + fn generate_ke1( rng: &mut R, ) -> Result<(Self::KE1State, Self::KE1Message), ProtocolError> { - let client_e_kp = KeyPair::::generate_random::(rng); - let client_nonce = generate_nonce::(rng); - - let ke1_message = Ke1Message { - client_nonce, - client_e_pk: client_e_kp.public().clone(), - }; - - Ok(( - Ke1State { - client_e_sk: client_e_kp.private().clone(), - client_nonce, - }, - ke1_message, - )) + shared::generate_ke1(rng) } - fn ke2_builder<'a, 'b, 'c, 'd, OprfCs: voprf::CipherSuite, R: RngCore + CryptoRng>( + fn ke2_builder<'a, CS: CipherSuite, R: RngCore + CryptoRng>( rng: &mut R, - serialized_credential_request: impl Iterator, - serialized_credential_response: impl Iterator, + credential_request: CredentialRequestParts, ke1_message: Self::KE1Message, - client_s_pk: PublicKey, - id_u: impl Iterator, - id_s: impl Iterator, - context: &[u8], - ) -> Result { - let server_e = KeyPair::::generate_random::(rng); - let server_nonce = generate_nonce::(rng); + credential_response: CredentialResponseParts, + client_s_pk: PublicKey, + identifiers: SerializedIdentifiers<'_, KeGroup>, + context: SerializedContext<'a>, + ) -> Result, ProtocolError> { + let server_e = KeyPair::::derive_random(rng); + let server_nonce = shared::generate_nonce::(rng); - let transcript_hasher = D::new() - .chain(STR_CONTEXT) - .chain_iter(Input::::from(context)?.iter()) - .chain_iter(id_u.into_iter()) - .chain_iter(serialized_credential_request) - .chain_iter(id_s.into_iter()) - .chain_iter(serialized_credential_response) - .chain(server_nonce) - .chain(server_e.public().serialize()); + let ke1_message_iter = ke1_message.to_iter(); + let server_e_pk = server_e.public().serialize(); + + let transcript_hasher = shared::transcript( + &context, + &identifiers, + &credential_request, + &ke1_message_iter, + &credential_response, + server_nonce, + &server_e_pk, + ); let shared_secret_1 = server_e .private() @@ -263,40 +195,55 @@ where }) } - fn ke2_builder_data(builder: &Self::KE2Builder) -> Self::KE2BuilderData<'_> { + fn ke2_builder_data<'a, CS: 'static + CipherSuite>( + builder: &'a Self::KE2Builder<'_, CS>, + ) -> Self::KE2BuilderData<'a, CS> { &builder.client_e_pk } - fn generate_ke2_input( - builder: &Self::KE2Builder, - server_s_sk: &PrivateKey, - ) -> Self::KE2BuilderInput { + fn generate_ke2_input, R: CryptoRng + RngCore>( + builder: &Self::KE2Builder<'_, CS>, + _: &mut R, + server_s_sk: &PrivateKey, + ) -> Self::KE2BuilderInput { server_s_sk.ke_diffie_hellman(&builder.client_e_pk) } - fn build_ke2( - mut builder: Self::KE2Builder, - shared_secret_2: Self::KE2BuilderInput, - ) -> Result, ProtocolError> { - let result = derive_3dh_keys::( - builder.shared_secret_1.clone(), - shared_secret_2, - builder.shared_secret_3.clone(), + fn build_ke2>( + mut builder: Self::KE2Builder<'_, CS>, + shared_secret_2: Self::KE2BuilderInput, + ) -> Result, ProtocolError> { + let derived_keys = shared::derive_keys::( + [ + builder.shared_secret_1.as_slice(), + &shared_secret_2, + &builder.shared_secret_3, + ] + .into_iter(), &builder.transcript_hasher.clone().finalize(), )?; let mut mac_hasher = - Hmac::::new_from_slice(&result.1).map_err(|_| InternalError::HmacError)?; - mac_hasher.update(&builder.transcript_hasher.clone().finalize()); + Hmac::::new_from_slice(&derived_keys.km2).map_err(|_| InternalError::HmacError)?; + Mac::update( + &mut mac_hasher, + &builder.transcript_hasher.clone().finalize(), + ); let mac = mac_hasher.finalize().into_bytes(); - Digest::update(&mut builder.transcript_hasher, &mac); + builder.transcript_hasher.update(&mac); + let mut mac_hasher = + Hmac::::new_from_slice(&derived_keys.km3).map_err(|_| InternalError::HmacError)?; + Mac::update( + &mut mac_hasher, + &builder.transcript_hasher.clone().finalize(), + ); + let expected_mac = mac_hasher.finalize().into_bytes(); Ok(( Ke2State { - km3: result.2, - hashed_transcript: builder.transcript_hasher.clone().finalize(), - session_key: result.0, + session_key: derived_keys.session_key, + expected_mac, }, Ke2Message { server_nonce: builder.server_nonce, @@ -304,383 +251,195 @@ where mac, }, #[cfg(test)] - result.3, + derived_keys.handshake_secret, #[cfg(test)] - result.1, + derived_keys.km2, )) } - #[allow(clippy::type_complexity)] - fn generate_ke3<'a, 'b, 'c, 'd>( - l2_component: impl Iterator, + fn generate_ke3, R: CryptoRng + RngCore>( + _: &mut R, + credential_request: CredentialRequestParts, + ke1_message: Self::KE1Message, + credential_response: CredentialResponseParts, ke2_message: Self::KE2Message, ke1_state: &Self::KE1State, - serialized_credential_request: impl Iterator, - server_s_pk: PublicKey, - client_s_sk: PrivateKey, - id_u: impl Iterator, - id_s: impl Iterator, - context: &[u8], - ) -> Result, ProtocolError> { - let mut transcript_hasher = D::new() - .chain(STR_CONTEXT) - .chain_iter(Input::::from(context)?.iter()) - .chain_iter(id_u) - .chain_iter(serialized_credential_request) - .chain_iter(id_s) - .chain_iter(l2_component) - .chain(ke2_message.to_bytes_without_mac()); + server_s_pk: PublicKey, + client_s_sk: PrivateKey, + identifiers: SerializedIdentifiers<'_, KeGroup>, + context: SerializedContext<'_>, + ) -> Result, ProtocolError> { + let mut transcript_hasher = shared::transcript( + &context, + &identifiers, + &credential_request, + &ke1_message.to_iter(), + &credential_response, + ke2_message.server_nonce, + &ke2_message.server_e_pk.serialize(), + ); - let result = derive_3dh_keys::( - ke1_state - .client_e_sk - .ke_diffie_hellman(&ke2_message.server_e_pk), - ke1_state.client_e_sk.ke_diffie_hellman(&server_s_pk), - client_s_sk.ke_diffie_hellman(&ke2_message.server_e_pk), + let shared_secret_1 = ke1_state + .client_e_sk + .ke_diffie_hellman(&ke2_message.server_e_pk); + let shared_secret_2 = ke1_state.client_e_sk.ke_diffie_hellman(&server_s_pk); + let shared_secret_3 = client_s_sk.ke_diffie_hellman(&ke2_message.server_e_pk); + + let derived_keys = shared::derive_keys::( + [ + shared_secret_1.as_slice(), + &shared_secret_2, + &shared_secret_3, + ] + .into_iter(), &transcript_hasher.clone().finalize(), )?; let mut server_mac = - Hmac::::new_from_slice(&result.1).map_err(|_| InternalError::HmacError)?; - server_mac.update(&transcript_hasher.clone().finalize()); + Hmac::::new_from_slice(&derived_keys.km2).map_err(|_| InternalError::HmacError)?; + Mac::update(&mut server_mac, &transcript_hasher.clone().finalize()); server_mac .verify(&ke2_message.mac) .map_err(|_| ProtocolError::InvalidLoginError)?; - Digest::update(&mut transcript_hasher, &ke2_message.mac); + transcript_hasher.update(&ke2_message.mac); let mut client_mac = - Hmac::::new_from_slice(&result.2).map_err(|_| InternalError::HmacError)?; - client_mac.update(&transcript_hasher.finalize()); + Hmac::::new_from_slice(&derived_keys.km3).map_err(|_| InternalError::HmacError)?; + Mac::update(&mut client_mac, &transcript_hasher.finalize()); Ok(( - result.0, + derived_keys.session_key, Ke3Message { mac: client_mac.finalize().into_bytes(), }, #[cfg(test)] - result.3, + derived_keys.handshake_secret, #[cfg(test)] - result.2, + derived_keys.km3, )) } - fn finish_ke( + fn finish_ke( ke3_message: Self::KE3Message, - ke2_state: &Self::KE2State, - ) -> Result, ProtocolError> { - let mut client_mac = - Hmac::::new_from_slice(&ke2_state.km3).map_err(|_| InternalError::HmacError)?; - client_mac.update(&ke2_state.hashed_transcript); - - client_mac - .verify(&ke3_message.mac) - .map_err(|_| ProtocolError::InvalidLoginError)?; - - Ok(ke2_state.session_key.clone()) + ke2_state: &Self::KE2State, + _: Identifiers<'_>, + _: SerializedContext<'_>, + ) -> Result, ProtocolError> { + CtOption::new( + ke2_state.session_key.clone(), + ke2_state.expected_mac.ct_eq(&ke3_message.mac), + ) + .into_option() + .ok_or(ProtocolError::InvalidLoginError) } } -///////////////////////// -// Convenience Structs // -//==================== // -///////////////////////// - -// Consists of a session key, followed by two mac keys: (session_key, km2, km3) -#[cfg(not(test))] -type TripleDhDerivationResult = (Output, Output, Output); -#[cfg(test)] -type TripleDhDerivationResult = (Output, Output, Output, Output); +impl Sealed for TripleDh +where + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, +{ +} //////////////////////////////////////////////// -// Helper functions and Trait Implementations // +// Trait Implementations // // ========================================== // //////////////////////////////////////////////// -// Helper functions - -// Internal function which takes the public and private components of the client -// and server keypairs, along with some auxiliary metadata, to produce the -// session key and two MAC keys -fn derive_3dh_keys( - shared_secret_1: GenericArray, - shared_secret_2: GenericArray, - shared_secret_3: GenericArray, - hashed_derivation_transcript: &[u8], -) -> Result, ProtocolError> +impl Deserialize for Ke2State where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - let mut hkdf = HkdfExtract::::new(None); - - hkdf.input_ikm(&shared_secret_1); - hkdf.input_ikm(&shared_secret_2); - hkdf.input_ikm(&shared_secret_3); - - let (_, extracted_ikm) = hkdf.finalize(); - let handshake_secret = derive_secrets::( - &extracted_ikm, - STR_HANDSHAKE_SECRET, - hashed_derivation_transcript, - )?; - let session_key = derive_secrets::( - &extracted_ikm, - STR_SESSION_KEY, - hashed_derivation_transcript, - )?; - - let km2 = hkdf_expand_label::(&handshake_secret, STR_SERVER_MAC, b"")?; - let km3 = hkdf_expand_label::(&handshake_secret, STR_CLIENT_MAC, b"")?; - - Ok(( - session_key, - km2, - km3, - #[cfg(test)] - handshake_secret, - )) -} - -fn hkdf_expand_label( - secret: &[u8], - label: &[u8], - context: &[u8], -) -> Result, ProtocolError> -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - let h = Hkdf::::from_prk(secret).map_err(|_| InternalError::HkdfError)?; - hkdf_expand_label_extracted(&h, label, context) -} - -fn hkdf_expand_label_extracted( - hkdf: &Hkdf, - label: &[u8], - context: &[u8], -) -> Result, ProtocolError> -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - let mut okm = GenericArray::default(); - - let length_u16: u16 = - u16::try_from(OutputSize::::USIZE).map_err(|_| ProtocolError::SerializationError)?; - let label = Input::::from_label(STR_OPAQUE, label)?; - let label = label.to_array_3(); - let context = Input::::from(context)?; - let context = context.to_array_2(); - - let hkdf_label = [ - &length_u16.to_be_bytes(), - label[0], - label[1], - label[2], - context[0], - context[1], - ]; - - hkdf.expand_multi_info(&hkdf_label, &mut okm) - .map_err(|_| InternalError::HkdfError)?; - Ok(okm) -} - -fn derive_secrets( - hkdf: &Hkdf, - label: &[u8], - hashed_derivation_transcript: &[u8], -) -> Result, ProtocolError> -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - hkdf_expand_label_extracted::(hkdf, label, hashed_derivation_transcript) -} - -// Generate a random nonce up to NonceLen::USIZE bytes. -fn generate_nonce(rng: &mut R) -> GenericArray { - let mut nonce_bytes = GenericArray::default(); - rng.fill_bytes(&mut nonce_bytes); - nonce_bytes -} - -// Serialization and deserialization implementations - -impl Deserialize for Ke1State { - fn deserialize(bytes: &[u8]) -> Result { - let key_len = KG::SkLen::USIZE; - - let nonce_len = NonceLen::USIZE; - let checked_bytes = check_slice_size_atleast(bytes, key_len + nonce_len, "ke1_state")?; - + fn deserialize_take(input: &mut &[u8]) -> Result { Ok(Self { - client_e_sk: PrivateKey::deserialize(&checked_bytes[..key_len])?, - client_nonce: GenericArray::clone_from_slice( - &checked_bytes[key_len..key_len + nonce_len], - ), + session_key: input.take_array("session key")?, + expected_mac: input.take_array("expected mac")?, }) } } -impl Serialize for Ke1State +impl Serialize for Ke2State where - // Ke1State: KeSk + Nonce - KG::SkLen: Add, - Sum: ArrayLength, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, + // Ke2State: Hash + Hash + OutputSize: Add>, + Sum, OutputSize>: ArrayLength, { - type Len = Sum; + type Len = Sum, OutputSize>; fn serialize(&self) -> GenericArray { - self.client_e_sk.serialize().concat(self.client_nonce) + self.session_key.clone().concat(self.expected_mac.clone()) } } -impl Deserialize for Ke1Message { - fn deserialize(ke1_message_bytes: &[u8]) -> Result { - let nonce_len = NonceLen::USIZE; - let checked_nonce = check_slice_size( - ke1_message_bytes, - nonce_len + ::PkLen::USIZE, - "ke1_message nonce", - )?; - - Ok(Self { - client_nonce: GenericArray::clone_from_slice(&checked_nonce[..nonce_len]), - client_e_pk: PublicKey::deserialize(&checked_nonce[nonce_len..])?, - }) - } -} - -impl Serialize for Ke1Message +impl Drop for Ke2Builder where - // Ke1Message: Nonce + KePk - NonceLen: Add, - Sum: ArrayLength, -{ - type Len = Sum; - - fn serialize(&self) -> GenericArray { - self.client_nonce.concat(self.client_e_pk.serialize()) - } -} - -impl Deserialize for Ke2State -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - fn deserialize(input: &[u8]) -> Result { - let hash_len = OutputSize::::USIZE; - let checked_bytes = check_slice_size(input, 3 * hash_len, "ke2_state")?; - - Ok(Self { - km3: GenericArray::clone_from_slice(&checked_bytes[..hash_len]), - hashed_transcript: GenericArray::clone_from_slice( - &checked_bytes[hash_len..2 * hash_len], - ), - session_key: GenericArray::clone_from_slice(&checked_bytes[2 * hash_len..3 * hash_len]), - }) - } -} - -impl Serialize for Ke2State -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, - // Ke2State: (Hash + Hash) + Hash - OutputSize: Add>, - Sum, OutputSize>: ArrayLength + Add>, - Sum, OutputSize>, OutputSize>: ArrayLength, -{ - type Len = Sum, OutputSize>, OutputSize>; - - fn serialize(&self) -> GenericArray { - self.km3 - .clone() - .concat(self.hashed_transcript.clone()) - .concat(self.session_key.clone()) - } -} - -impl Drop for Ke2Builder -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { fn drop(&mut self) { struct AssertZeroizeOnDrop<'a, T: ZeroizeOnDrop>(#[allow(unused)] &'a T); - self.server_nonce.zeroize(); - self.transcript_hasher.reset(); - let _ = AssertZeroizeOnDrop(&self.client_e_pk); - let _ = AssertZeroizeOnDrop(&self.server_e_pk); - self.shared_secret_1.zeroize(); - self.shared_secret_3.zeroize(); + let Self { + server_nonce, + transcript_hasher, + client_e_pk, + server_e_pk, + shared_secret_1, + shared_secret_3, + } = self; + + server_nonce.zeroize(); + transcript_hasher.reset(); + let _ = AssertZeroizeOnDrop(client_e_pk); + let _ = AssertZeroizeOnDrop(server_e_pk); + shared_secret_1.zeroize(); + shared_secret_3.zeroize(); } } -impl ZeroizeOnDrop for Ke2Builder +impl ZeroizeOnDrop for Ke2Builder where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { } -impl Deserialize for Ke2Message +impl Deserialize for Ke2Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - fn deserialize(input: &[u8]) -> Result { - let key_len = ::PkLen::USIZE; - let nonce_len = NonceLen::USIZE; - let checked_nonce = check_slice_size_atleast(input, nonce_len, "ke2_message nonce")?; - - let unchecked_server_e_pk = check_slice_size_atleast( - &checked_nonce[nonce_len..], - key_len, - "ke2_message server_e_pk", - )?; - let checked_mac = check_slice_size( - &unchecked_server_e_pk[key_len..], - OutputSize::::USIZE, - "ke1_message mac", - )?; - - // Check the public key bytes - let server_e_pk = PublicKey::deserialize(&unchecked_server_e_pk[..key_len])?; - + fn deserialize_take(input: &mut &[u8]) -> Result { Ok(Self { - server_nonce: GenericArray::clone_from_slice(&checked_nonce[..nonce_len]), - server_e_pk, - mac: GenericArray::clone_from_slice(checked_mac), + server_nonce: input.take_array("server nonce")?, + server_e_pk: PublicKey::deserialize_take(input)?, + mac: input.take_array("mac")?, }) } } -impl Serialize for Ke2Message +impl Serialize for Ke2Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add, - Sum: ArrayLength + Add>, - Sum, OutputSize>: ArrayLength, + NonceLen: Add, + Sum: ArrayLength + Add>, + Sum, OutputSize>: ArrayLength, { - type Len = Sum, OutputSize>; + type Len = Sum, OutputSize>; fn serialize(&self) -> GenericArray { self.server_nonce @@ -689,43 +448,50 @@ where } } -impl Ke2Message +impl Deserialize for Ke3Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, - NonceLen: Add, - Sum: ArrayLength, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - fn to_bytes_without_mac(&self) -> GenericArray> { - self.server_nonce.concat(self.server_e_pk.serialize()) - } -} - -impl Deserialize for Ke3Message -where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, -{ - fn deserialize(bytes: &[u8]) -> Result { - let checked_bytes = check_slice_size(bytes, OutputSize::::USIZE, "ke3_message")?; - + fn deserialize_take(bytes: &mut &[u8]) -> Result { Ok(Self { - mac: GenericArray::clone_from_slice(checked_bytes), + mac: bytes.take_array("mac")?, }) } } -impl Serialize for Ke3Message +impl Serialize for Ke3Message where - D::Core: ProxyHash, - ::BlockSize: IsLess, - Le<::BlockSize, U256>: NonZero, + H::Core: ProxyHash, + ::BlockSize: IsLess, + Le<::BlockSize, U256>: NonZero, { - type Len = OutputSize; + type Len = OutputSize; fn serialize(&self) -> GenericArray { self.mac.clone() } } + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for Ke2State { + fn assert_zeroized(&self) { + let Self { + session_key, + expected_mac, + } = self; + + for byte in session_key.iter().chain(expected_mac) { + assert_eq!(byte, &0); + } + } +} diff --git a/src/keypair.rs b/src/keypair.rs index e9362f9..db7fdfe 100644 --- a/src/keypair.rs +++ b/src/keypair.rs @@ -11,12 +11,16 @@ #![allow(unsafe_code)] use derive_where::derive_where; +use digest::{Output, OutputSizeUser}; use generic_array::{ArrayLength, GenericArray}; use rand::{CryptoRng, RngCore}; +use crate::ciphersuite::CipherSuite; use crate::errors::ProtocolError; -use crate::key_exchange::group::KeGroup; -use crate::key_exchange::tripledh::DiffieHellman; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::DiffieHellman; +use crate::key_exchange::sigma_i::{Message, MessageBuilder, SignatureProtocol}; +use crate::serialization::SliceExt; /// A Keypair trait with public-private verification #[cfg_attr( @@ -28,20 +32,24 @@ use crate::key_exchange::tripledh::DiffieHellman; )) )] #[derive_where(Clone)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Pk, SK)] -pub struct KeyPair> { - pk: PublicKey, +#[derive_where(Eq, Hash, Ord, PartialEq, PartialOrd; G::Pk, SK)] +// `NonZeroScalar` doesn't implement `Debug`. +// TODO: remove after `elliptic-curve` bump to v0.14. +#[cfg_attr(not(test), derive_where(Debug; G::Pk, SK))] +#[cfg_attr(test, derive_where(Debug), derive_where(skip_inner(Debug)))] +pub struct KeyPair> { + pk: PublicKey, sk: SK, } -impl KeyPair { +impl KeyPair { /// Creates a new [`KeyPair`] from the given keys. - pub fn new(sk: SK, pk: PublicKey) -> Self { + pub fn new(sk: SK, pk: PublicKey) -> Self { Self { pk, sk } } /// The public key component - pub fn public(&self) -> &PublicKey { + pub fn public(&self) -> &PublicKey { &self.pk } @@ -51,15 +59,22 @@ impl KeyPair { } } -impl KeyPair { +impl KeyPair { + pub(crate) fn random(rng: &mut R) -> Self { + let sk = G::random_sk(rng); + let pk = G::public_key(sk); + Self { + pk: PublicKey(pk), + sk: PrivateKey(sk), + } + } + /// Generating a random key pair given a cryptographic rng - pub(crate) fn generate_random( - rng: &mut R, - ) -> Self { - let mut scalar_bytes = GenericArray::<_, ::SkLen>::default(); + pub(crate) fn derive_random(rng: &mut R) -> Self { + let mut scalar_bytes = GenericArray::<_, ::SkLen>::default(); rng.fill_bytes(&mut scalar_bytes); - let sk = KG::derive_auth_keypair::(scalar_bytes).unwrap(); - let pk = KG::public_key(sk); + let sk = G::derive_scalar(scalar_bytes).unwrap(); + let pk = G::public_key(sk); Self { pk: PublicKey(pk), sk: PrivateKey(sk), @@ -67,16 +82,237 @@ impl KeyPair { } } -#[cfg(test)] -impl KeyPair +/// Wrapper around a Key to enforce that it's a private one. +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; G::Sk)] +pub struct PrivateKey(G::Sk); + +impl PrivateKey { + pub(crate) fn new(key: G::Sk) -> Self { + Self(key) + } + + /// Returns public key from private key + pub fn public_key(&self) -> PublicKey { + PublicKey(G::public_key(self.0)) + } + + pub(crate) fn serialize(&self) -> GenericArray { + G::serialize_sk(self.0) + } + + /// Creates a [`PrivateKey`] from the given bytes. + pub fn deserialize(mut input: &[u8]) -> Result { + Self::deserialize_take(&mut input) + } + + pub(crate) fn deserialize_take(input: &mut &[u8]) -> Result { + G::deserialize_take_sk(input).map(Self) + } +} + +impl PrivateKey where - KG::Pk: std::fmt::Debug, - KG::Sk: std::fmt::Debug, + G::Sk: DiffieHellman, { - /// Test-only strategy returning a proptest Strategy based on - /// [`Self::generate_random`] - fn uniform_keypair_strategy() -> proptest::prelude::BoxedStrategy + /// Diffie-Hellman key exchange implementation + pub(crate) fn ke_diffie_hellman(&self, pk: &PublicKey) -> GenericArray { + self.0.diffie_hellman(pk.0) + } +} + +impl PrivateKey { + /// Private-key signing implementation + pub(crate) fn sign< + R: CryptoRng + RngCore, + CS: CipherSuite, + SIG: SignatureProtocol, + KE: Group, + >( + &self, + rng: &mut R, + message: &Message, + ) -> (SIG::Signature, SIG::VerifyState) { + SIG::sign(&self.0, rng, message) + } +} + +/// A trait to facilitate +/// [`ServerSetup::de/serialize`](crate::ServerSetup::serialize). +pub trait PrivateKeySerialization: Clone { + /// Custom error type that can be passed down to `ProtocolError::Custom` + type Error; + /// Serialization size in bytes. + type Len: ArrayLength; + + /// Serialization into bytes + fn serialize_key_pair(key_pair: &KeyPair) -> GenericArray; + + /// Deserialization from bytes + fn deserialize_take_key_pair( + input: &mut &[u8], + ) -> Result, ProtocolError>; +} + +impl PrivateKeySerialization for PrivateKey { + type Error = core::convert::Infallible; + type Len = G::SkLen; + + fn serialize_key_pair(key_pair: &KeyPair) -> GenericArray { + key_pair.private().serialize() + } + + fn deserialize_take_key_pair(input: &mut &[u8]) -> Result, ProtocolError> { + let sk = PrivateKey::deserialize_take(input)?; + let pk = sk.public_key(); + + Ok(KeyPair::new(sk, pk)) + } +} + +#[cfg(feature = "serde")] +impl<'de, G: Group> serde::Deserialize<'de> for PrivateKey { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, { + use serde::de::Error; + + G::deserialize_take_sk( + &mut (GenericArray::<_, G::SkLen>::deserialize(deserializer)?.as_slice()), + ) + .map(Self) + .map_err(D::Error::custom) + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for PrivateKey { + fn serialize(&self, serializer: SK) -> Result + where + SK: serde::Serializer, + { + G::serialize_sk(self.0).serialize(serializer) + } +} + +/// Wrapper around a Key to enforce that it's a public one. +#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; G::Pk)] +pub struct PublicKey(G::Pk); + +impl PublicKey { + /// Convert from bytes + pub fn deserialize(mut key_bytes: &[u8]) -> Result { + Self::deserialize_take(&mut key_bytes) + } + + pub(crate) fn deserialize_take(key_bytes: &mut &[u8]) -> Result { + G::deserialize_take_pk(key_bytes).map(Self) + } + + /// Convert to bytes + pub fn serialize(&self) -> GenericArray { + G::serialize_pk(self.0) + } + + /// Returns the inner [`Group::Pk`]. + pub fn to_group_type(&self) -> G::Pk { + self.0 + } +} + +impl PublicKey { + /// Public-key verifying implementation + pub(crate) fn verify, KE: Group>( + &self, + message_builder: MessageBuilder<'_, CS>, + state: SIG::VerifyState, + signature: &SIG::Signature, + ) -> Result<(), ProtocolError> { + SIG::verify(&self.0, message_builder, state, signature) + } +} + +#[cfg(feature = "serde")] +impl<'de, G: Group> serde::Deserialize<'de> for PublicKey { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::Error; + + G::deserialize_take_pk( + &mut (GenericArray::<_, G::PkLen>::deserialize(deserializer)?.as_slice()), + ) + .map(Self) + .map_err(D::Error::custom) + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for PublicKey { + fn serialize(&self, serializer: SK) -> Result + where + SK: serde::Serializer, + { + G::serialize_pk(self.0).serialize(serializer) + } +} + +/// Default OPRF seed container. +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize, serde::Serialize), + serde(bound = "") +)] +#[derive_where(Clone, Debug, Eq, Hash, PartialEq, ZeroizeOnDrop)] +pub struct OprfSeed(pub(crate) Output); + +/// A trait to facilitate +/// [`ServerSetup::de/serialize`](crate::ServerSetup::serialize). +/// +/// Will be called with `E` being [`PrivateKeySerialization::Error`]. +pub trait OprfSeedSerialization: Sized { + /// Serialization size in bytes. + type Len: ArrayLength; + + /// Serialization into bytes + fn serialize(&self) -> GenericArray; + + /// Deserialization from bytes + fn deserialize_take(input: &mut &[u8]) -> Result>; +} + +impl OprfSeedSerialization for OprfSeed { + type Len = H::OutputSize; + + fn serialize(&self) -> GenericArray { + self.0.clone() + } + + fn deserialize_take(input: &mut &[u8]) -> Result> { + Ok(Self( + input + .take_array("OPRF seed") + .map_err(ProtocolError::into_custom)?, + )) + } +} + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl KeyPair { + /// Test-only strategy returning a proptest Strategy based on + /// [`Self::derive_random`] + fn uniform_keypair_strategy() -> proptest::prelude::BoxedStrategy { use proptest::prelude::*; use rand::rngs::StdRng; use rand::SeedableRng; @@ -86,158 +322,61 @@ where any::<[u8; 32]>() .prop_filter_map("valid random keypair", |seed| { let mut rng = StdRng::from_seed(seed); - Some(Self::generate_random::(&mut rng)) + Some(Self::derive_random(&mut rng)) }) .no_shrink() .boxed() } } -/// Wrapper around a Key to enforce that it's a private one. -#[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Sk)] -pub struct PrivateKey(KG::Sk); - -impl PrivateKey { - /// Returns public key from private key - pub fn public_key(&self) -> PublicKey { - PublicKey(KG::public_key(self.0)) - } - - pub(crate) fn serialize(&self) -> GenericArray { - KG::serialize_sk(self.0) - } - - /// Creates a [`PrivateKey`] from the given bytes. - pub fn deserialize(input: &[u8]) -> Result { - KG::deserialize_sk(input).map(Self) - } -} - -impl PrivateKey +#[cfg(test)] +impl AssertZeroized for PublicKey where - KG::Sk: DiffieHellman, + G::Pk: AssertZeroized, { - /// Diffie-Hellman key exchange implementation - pub(crate) fn ke_diffie_hellman(&self, pk: &PublicKey) -> GenericArray { - self.0.diffie_hellman(pk.0) + fn assert_zeroized(&self) { + self.0.assert_zeroized(); } } -/// A trait to facilitate -/// [`ServerSetup::de/serialize`](crate::ServerSetup::serialize). -pub trait PrivateKeySerialization: Clone { - /// Custom error type that can be passed down to `ProtocolError::Custom` - type Error; - /// Serialization size in bytes. - type Len: ArrayLength; - - /// Serialization into bytes - fn serialize_key_pair(key_pair: &KeyPair) -> GenericArray; - - /// Deserialization from bytes - fn deserialize_key_pair(input: &[u8]) -> Result, ProtocolError>; -} - -impl PrivateKeySerialization for PrivateKey { - type Error = core::convert::Infallible; - type Len = KG::SkLen; - - fn serialize_key_pair(key_pair: &KeyPair) -> GenericArray { - key_pair.private().serialize() - } - - fn deserialize_key_pair(input: &[u8]) -> Result, ProtocolError> { - let sk = PrivateKey::deserialize(input)?; - let pk = sk.public_key(); - - Ok(KeyPair::new(sk, pk)) - } -} - -#[cfg(feature = "serde")] -impl<'de, KG: KeGroup> serde::Deserialize<'de> for PrivateKey { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - use serde::de::Error; - - KG::deserialize_sk(&GenericArray::<_, KG::SkLen>::deserialize(deserializer)?) - .map(Self) - .map_err(D::Error::custom) - } -} - -#[cfg(feature = "serde")] -impl serde::Serialize for PrivateKey { - fn serialize(&self, serializer: SK) -> Result - where - SK: serde::Serializer, - { - KG::serialize_sk(self.0).serialize(serializer) - } -} - -/// Wrapper around a Key to enforce that it's a public one. -#[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; KG::Pk)] -pub struct PublicKey(KG::Pk); - -impl PublicKey { - /// Convert from bytes - pub fn deserialize(key_bytes: &[u8]) -> Result { - KG::deserialize_pk(key_bytes).map(Self) - } - - /// Convert to bytes - pub fn serialize(&self) -> GenericArray { - KG::serialize_pk(self.0) - } - - /// Returns the inner [`KeGroup::Pk`]. - pub fn to_group_type(&self) -> KG::Pk { - self.0 - } -} - -#[cfg(feature = "serde")] -impl<'de, KG: KeGroup> serde::Deserialize<'de> for PublicKey { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - use serde::de::Error; - - KG::deserialize_pk(&GenericArray::<_, KG::PkLen>::deserialize(deserializer)?) - .map(Self) - .map_err(D::Error::custom) - } -} - -#[cfg(feature = "serde")] -impl serde::Serialize for PublicKey { - fn serialize(&self, serializer: SK) -> Result - where - SK: serde::Serializer, - { - KG::serialize_pk(self.0).serialize(serializer) +#[cfg(test)] +impl AssertZeroized for PrivateKey +where + G::Sk: AssertZeroized, +{ + fn assert_zeroized(&self) { + self.0.assert_zeroized(); } } #[cfg(test)] mod tests { + use core::ptr; + + use hkdf::Hkdf; use rand::rngs::OsRng; use super::*; - use crate::util; + use crate::ciphersuite::{KeGroup, OprfHash}; + use crate::serialization::AssertZeroized; + use crate::{ + CipherSuite, ClientLogin, ClientLoginFinishParameters, ClientLoginFinishResult, + ClientLoginStartResult, ClientRegistration, ClientRegistrationFinishParameters, + ClientRegistrationFinishResult, ClientRegistrationStartResult, ServerLogin, + ServerLoginParameters, ServerLoginStartResult, ServerRegistration, + ServerRegistrationStartResult, ServerSetup, + }; #[test] fn test_zeroize_key() { - fn inner() { + fn inner() + where + G::Sk: AssertZeroized, + { let mut rng = OsRng; let mut key = PrivateKey::(G::random_sk(&mut rng)); - util::test_zeroize_on_drop(&mut key); + unsafe { ptr::drop_in_place(&mut key) }; + key.0.assert_zeroized(); } #[cfg(feature = "ristretto255")] @@ -245,6 +384,10 @@ mod tests { inner::<::p256::NistP256>(); inner::<::p384::NistP384>(); inner::<::p521::NistP521>(); + #[cfg(feature = "curve25519")] + inner::(); + #[cfg(feature = "ed25519")] + inner::(); } macro_rules! test { @@ -258,15 +401,15 @@ mod tests { proptest! { #[test] - fn pub_from_priv(kp in KeyPair::<$point>::uniform_keypair_strategy::<$point>()) { + fn pub_from_priv(kp in KeyPair::<$point>::uniform_keypair_strategy()) { let pk = kp.public(); let sk = kp.private(); prop_assert_eq!(&sk.public_key(), pk); } #[test] - fn dh(kp1 in KeyPair::<$point>::uniform_keypair_strategy::<$point>(), - kp2 in KeyPair::<$point>::uniform_keypair_strategy::<$point>()) { + fn dh(kp1 in KeyPair::<$point>::uniform_keypair_strategy(), + kp2 in KeyPair::<$point>::uniform_keypair_strategy()) { let dh1 = kp2.private().ke_diffie_hellman(&kp1.public()); let dh2 = kp1.private().ke_diffie_hellman(kp2.public()); @@ -275,10 +418,10 @@ mod tests { } #[test] - fn private_key_slice(kp in KeyPair::<$point>::uniform_keypair_strategy::<$point>()) { + fn private_key_slice(kp in KeyPair::<$point>::uniform_keypair_strategy()) { let sk_bytes = kp.private().serialize().to_vec(); - let kp2 = PrivateKey::<$point>::deserialize_key_pair(&sk_bytes)?; + let kp2 = PrivateKey::<$point>::deserialize_take_key_pair(&mut (sk_bytes.as_slice()))?; let kp2_private_bytes = kp2.private().serialize().to_vec(); prop_assert_eq!(sk_bytes, kp2_private_bytes); @@ -294,41 +437,31 @@ mod tests { test!(p384, ::p384::NistP384); test!(p521, ::p521::NistP521); + struct Default; + + impl CipherSuite for Default { + #[cfg(feature = "ristretto255")] + type OprfCs = crate::Ristretto255; + #[cfg(not(feature = "ristretto255"))] + type OprfCs = ::p256::NistP256; + #[cfg(feature = "ristretto255")] + type KeyExchange = crate::TripleDh; + #[cfg(not(feature = "ristretto255"))] + type KeyExchange = crate::TripleDh<::p256::NistP256, sha2::Sha256>; + type Ksf = crate::ksf::Identity; + } + + #[derive(Clone)] + struct RemoteSeed(Output); + + #[derive(Clone)] + struct RemoteKey(PrivateKey>); + + const PASSWORD: &str = "password"; + #[test] fn remote_key() { - use rand::rngs::OsRng; - - use crate::{ - CipherSuite, ClientLogin, ClientLoginFinishParameters, ClientLoginFinishResult, - ClientLoginStartResult, ClientRegistration, ClientRegistrationFinishParameters, - ClientRegistrationFinishResult, ClientRegistrationStartResult, ServerLogin, - ServerLoginStartParameters, ServerLoginStartResult, ServerRegistration, - ServerRegistrationStartResult, ServerSetup, - }; - - struct Default; - - impl CipherSuite for Default { - #[cfg(feature = "ristretto255")] - type OprfCs = crate::Ristretto255; - #[cfg(not(feature = "ristretto255"))] - type OprfCs = ::p256::NistP256; - #[cfg(feature = "ristretto255")] - type KeGroup = crate::Ristretto255; - #[cfg(not(feature = "ristretto255"))] - type KeGroup = ::p256::NistP256; - type KeyExchange = crate::key_exchange::tripledh::TripleDh; - type Ksf = crate::ksf::Identity; - } - - type KeCurve = ::KeGroup; - - #[derive(Clone)] - struct RemoteKey(PrivateKey); - - const PASSWORD: &str = "password"; - - let sk = PrivateKey(KeCurve::random_sk(&mut OsRng)); + let sk = PrivateKey(KeGroup::::random_sk(&mut OsRng)); let pk = sk.public_key(); let sk = RemoteKey(sk); let keypair = KeyPair::new(sk, pk); @@ -362,7 +495,7 @@ mod tests { Some(file), message, &[], - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); let shared_secret = builder.private_key().0.ke_diffie_hellman(builder.data()); @@ -373,11 +506,88 @@ mod tests { } = builder.build(shared_secret).unwrap(); let ClientLoginFinishResult { message, .. } = client .finish( + &mut OsRng, PASSWORD.as_bytes(), message, ClientLoginFinishParameters::default(), ) .unwrap(); - server.finish(message).unwrap(); + server + .finish(message, ServerLoginParameters::default()) + .unwrap(); + } + + #[test] + fn remote_seed() { + let mut oprf_seed = RemoteSeed::>(GenericArray::default()); + OsRng.fill_bytes(&mut oprf_seed.0); + + let sk = PrivateKey(KeGroup::::random_sk(&mut OsRng)); + let pk = sk.public_key(); + let sk = RemoteKey(sk); + let keypair = KeyPair::new(sk, pk); + + let server_setup = ServerSetup::::new_with_key_pair_and_seed( + &mut OsRng, keypair, oprf_seed, + ); + + let ClientRegistrationStartResult { + message, + state: client, + } = ClientRegistration::::start(&mut OsRng, PASSWORD.as_bytes()).unwrap(); + let km = server_setup.key_material_info(&[]); + let mut ikm = GenericArray::default(); + Hkdf::>::from_prk(&km.ikm.0) + .unwrap() + .expand_multi_info(&km.info, &mut ikm) + .unwrap(); + let ServerRegistrationStartResult { message, .. } = + ServerRegistration::start_with_key_material(&server_setup, ikm, message).unwrap(); + let ClientRegistrationFinishResult { message, .. } = client + .finish( + &mut OsRng, + PASSWORD.as_bytes(), + message, + ClientRegistrationFinishParameters::default(), + ) + .unwrap(); + let file = ServerRegistration::finish(message); + + let ClientLoginStartResult { + message, + state: client, + } = ClientLogin::::start(&mut OsRng, PASSWORD.as_bytes()).unwrap(); + let km = server_setup.key_material_info(&[]); + let mut ikm = GenericArray::default(); + Hkdf::>::from_prk(&km.ikm.0) + .unwrap() + .expand_multi_info(&km.info, &mut ikm) + .unwrap(); + let builder = ServerLogin::builder_with_key_material( + &mut OsRng, + &server_setup, + ikm, + Some(file), + message, + ServerLoginParameters::default(), + ) + .unwrap(); + let shared_secret = builder.private_key().0.ke_diffie_hellman(builder.data()); + let ServerLoginStartResult { + message, + state: server, + .. + } = builder.build(shared_secret).unwrap(); + let ClientLoginFinishResult { message, .. } = client + .finish( + &mut OsRng, + PASSWORD.as_bytes(), + message, + ClientLoginFinishParameters::default(), + ) + .unwrap(); + server + .finish(message, ServerLoginParameters::default()) + .unwrap(); } } diff --git a/src/lib.rs b/src/lib.rs index f9e7ec0..0667ca5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,11 +32,12 @@ //! We will use the following choices in this example: //! ```ignore //! use opaque_ke::CipherSuite; +//! //! struct Default; +//! //! impl CipherSuite for Default { //! type OprfCs = opaque_ke::Ristretto255; -//! type KeGroup = opaque_ke::Ristretto255; -//! type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! type KeyExchange = opaque_ke::TripleDh; //! type Ksf = opaque_ke::ksf::Identity; //! } //! ``` @@ -60,19 +61,18 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! use rand::rngs::OsRng; //! use rand::RngCore; +//! //! let mut rng = OsRng; //! let server_setup = ServerSetup::::new(&mut rng); //! # Ok::<(), ProtocolError>(()) @@ -117,20 +117,19 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! use opaque_ke::ClientRegistration; //! use rand::rngs::OsRng; //! use rand::RngCore; +//! //! let mut client_rng = OsRng; //! let client_registration_start_result = //! ClientRegistration::::start(&mut client_rng, b"password")?; @@ -156,15 +155,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -174,6 +171,7 @@ //! # b"password", //! # )?; //! use opaque_ke::ServerRegistration; +//! //! # let mut server_rng = OsRng; //! # let server_setup = ServerSetup::::new(&mut server_rng); //! let server_registration_start_result = ServerRegistration::::start( @@ -196,7 +194,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ServerSetup, +//! # ClientRegistration, ServerRegistration, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -204,15 +202,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -224,6 +220,8 @@ //! # let mut server_rng = OsRng; //! # let server_setup = ServerSetup::::new(&mut server_rng); //! # let server_registration_start_result = ServerRegistration::::start(&server_setup, client_registration_start_result.message, b"alice@example.com")?; +//! use opaque_ke::ClientRegistrationFinishParameters; +//! //! let client_registration_finish_result = client_registration_start_result.state.finish( //! &mut client_rng, //! b"password", @@ -252,15 +250,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -305,19 +301,18 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; //! use opaque_ke::ClientLogin; +//! //! let mut client_rng = OsRng; //! let client_login_start_result = ClientLogin::::start(&mut client_rng, b"password")?; //! # Ok::<(), ProtocolError>(()) @@ -342,15 +337,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -368,7 +361,8 @@ //! # &mut client_rng, //! # b"password", //! # )?; -//! use opaque_ke::{ServerLogin, ServerLoginStartParameters}; +//! use opaque_ke::{ServerLogin, ServerLoginParameters}; +//! //! let password_file = ServerRegistration::::deserialize(&password_file_bytes)?; //! let mut server_rng = OsRng; //! let server_login_start_result = ServerLogin::start( @@ -377,7 +371,7 @@ //! Some(password_file), //! client_login_start_result.message, //! b"alice@example.com", -//! ServerLoginStartParameters::default(), +//! ServerLoginParameters::default(), //! )?; //! # Ok::<(), ProtocolError>(()) //! ``` @@ -405,7 +399,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginStartParameters, CredentialFinalization, ServerSetup, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -413,15 +407,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -444,8 +436,11 @@ //! # &password_file_bytes, //! # )?; //! # let server_login_start_result = -//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginStartParameters::default())?; +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters::default())?; +//! use opaque_ke::ClientLoginFinishParameters; +//! //! let client_login_finish_result = client_login_start_result.state.finish( +//! &mut client_rng, //! b"password", //! server_login_start_result.message, //! ClientLoginFinishParameters::default(), @@ -461,7 +456,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginStartParameters, CredentialFinalization, ServerSetup, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -469,15 +464,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -500,14 +493,16 @@ //! # &password_file_bytes, //! # )?; //! # let server_login_start_result = -//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginStartParameters::default())?; +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters::default())?; //! # let client_login_finish_result = client_login_start_result.state.finish( +//! # &mut client_rng, //! # b"password", //! # server_login_start_result.message, //! # ClientLoginFinishParameters::default(), //! # )?; //! let server_login_finish_result = server_login_start_result.state.finish( //! client_login_finish_result.message, +//! ServerLoginParameters::default(), //! )?; //! //! assert_eq!( @@ -558,7 +553,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginStartParameters, CredentialFinalization, ServerSetup, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -566,15 +561,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -604,10 +597,11 @@ //! # &password_file_bytes, //! # )?; //! # let server_login_start_result = -//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginStartParameters::default())?; +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters::default())?; //! //! // And then later, during login... //! let client_login_finish_result = client_login_start_result.state.finish( +//! &mut client_rng, //! b"password", //! server_login_start_result.message, //! ClientLoginFinishParameters::default(), @@ -656,7 +650,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginStartParameters, CredentialFinalization, ServerSetup, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -664,15 +658,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -701,10 +693,11 @@ //! # &password_file_bytes, //! # )?; //! # let server_login_start_result = -//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginStartParameters::default())?; +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters::default())?; //! //! // And then later, during login... //! let client_login_finish_result = client_login_start_result.state.finish( +//! &mut client_rng, //! b"password", //! server_login_start_result.message, //! ClientLoginFinishParameters::default(), @@ -745,15 +738,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -780,8 +771,8 @@ //! # Ok::<(), ProtocolError>(()) //! ``` //! -//! The same identifiers must also be supplied using -//! [`ServerLoginStartParameters`] in [Server Login Start](#server-login-start): +//! The same identifiers must also be supplied using [`ServerLoginParameters`] +//! in [Server Login Start](#server-login-start): //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, @@ -793,15 +784,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -819,7 +808,7 @@ //! # &mut client_rng, //! # b"password", //! # )?; -//! # use opaque_ke::{ServerLogin, ServerLoginStartParameters}; +//! # use opaque_ke::{ServerLogin, ServerLoginParameters}; //! # let password_file = ServerRegistration::::deserialize(&password_file_bytes)?; //! # let mut server_rng = OsRng; //! let server_login_start_result = ServerLogin::start( @@ -828,7 +817,7 @@ //! Some(password_file), //! client_login_start_result.message, //! b"alice@example.com", -//! ServerLoginStartParameters { +//! ServerLoginParameters { //! context: None, //! identifiers: Identifiers { //! client: Some(b"Alice_the_Cryptographer"), @@ -844,7 +833,7 @@ //! ``` //! # use opaque_ke::{ //! # errors::ProtocolError, -//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, Identifiers, ServerLogin, ServerLoginStartParameters, CredentialFinalization, ServerSetup, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, Identifiers, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, //! # ksf::Identity, //! # }; //! # use opaque_ke::CipherSuite; @@ -852,15 +841,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # use rand::{rngs::OsRng, RngCore}; @@ -883,8 +870,9 @@ //! # &password_file_bytes, //! # )?; //! # let server_login_start_result = -//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginStartParameters { context: None, identifiers: Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") } })?; +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters { context: None, identifiers: Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") } })?; //! let client_login_finish_result = client_login_start_result.state.finish( +//! &mut client_rng, //! b"password", //! server_login_start_result.message, //! ClientLoginFinishParameters::new( @@ -899,6 +887,62 @@ //! //! # Ok::<(), ProtocolError>(()) //! ``` +//! and in [`ServerLoginParameters`] in [Server Login +//! Finish](#server-login-finish): +//! ``` +//! # use opaque_ke::{ +//! # errors::ProtocolError, +//! # ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, ClientLogin, ClientLoginFinishParameters, Identifiers, ServerLogin, ServerLoginParameters, CredentialFinalization, ServerSetup, +//! # ksf::Identity, +//! # }; +//! # use opaque_ke::CipherSuite; +//! # struct Default; +//! # #[cfg(feature = "ristretto255")] +//! # impl CipherSuite for Default { +//! # type OprfCs = opaque_ke::Ristretto255; +//! # type KeyExchange = opaque_ke::TripleDh; +//! # type Ksf = opaque_ke::ksf::Identity; +//! # } +//! # #[cfg(not(feature = "ristretto255"))] +//! # impl CipherSuite for Default { +//! # type OprfCs = p256::NistP256; +//! # type KeyExchange = opaque_ke::TripleDh; +//! # type Ksf = opaque_ke::ksf::Identity; +//! # } +//! # use rand::{rngs::OsRng, RngCore}; +//! # let mut client_rng = OsRng; +//! # let client_registration_start_result = ClientRegistration::::start( +//! # &mut client_rng, +//! # b"password", +//! # )?; +//! # let mut server_rng = OsRng; +//! # let server_setup = ServerSetup::::new(&mut server_rng); +//! # let server_registration_start_result = ServerRegistration::::start(&server_setup, client_registration_start_result.message, b"alice@example.com")?; +//! # let client_registration_finish_result = client_registration_start_result.state.finish(&mut client_rng, b"password", server_registration_start_result.message, ClientRegistrationFinishParameters::new(Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") }, None))?; +//! # let password_file_bytes = ServerRegistration::::finish(client_registration_finish_result.message).serialize(); +//! # let client_login_start_result = ClientLogin::::start( +//! # &mut client_rng, +//! # b"password", +//! # )?; +//! # let password_file = +//! # ServerRegistration::::deserialize( +//! # &password_file_bytes, +//! # )?; +//! # let server_login_start_result = +//! # ServerLogin::start(&mut server_rng, &server_setup, Some(password_file), client_login_start_result.message, b"alice@example.com", ServerLoginParameters { context: None, identifiers: Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") } })?; +//! # let client_login_finish_result = client_login_start_result.state.finish( +//! # &mut client_rng, +//! # b"password", +//! # server_login_start_result.message, +//! # ClientLoginFinishParameters::new(None, Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") }, None), +//! # )?; +//! let server_login_finish_result = server_login_start_result.state.finish( +//! client_login_finish_result.message, +//! ServerLoginParameters { context: None, identifiers: Identifiers { client: Some(b"Alice_the_Cryptographer"), server: Some(b"Facebook") } }, +//! )?; +//! +//! # Ok::<(), ProtocolError>(()) +//! ``` //! Failing to supply the same pair of custom identifiers in any of the three //! steps above will result in an error in attempting to complete the protocol! //! @@ -912,16 +956,12 @@ //! complete, so as to bind the integrity of application-specific data or //! configuration parameters to the security of the key exchange. During the //! login phase, the client and server can specify this context using: -//! - The second login message, where the server can populate -//! [`ServerLoginStartParameters`], and -//! - The third login message, where the client can populate -//! [`ClientLoginFinishParameters`]. -//! -//! For both of these messages, the `WithContextAndIdentifiers` variant can be -//! used to specify these fields in addition to [custom -//! identifiers](#custom-identifiers), with the ordering of the fields as -//! `WithContextAndIdentifiers(context, -//! Identifiers::ClientAndServerIdentifiers(username, server_name))`. +//! - In [Server Login Start](#server-login-start), where the server can +//! populate [`ServerLoginParameters::context`]. +//! - In [Client Login Finish](#client-login-finish), where the client can +//! populate [`ClientLoginFinishParameters::context`]. +//! - In [Server Login Finish](#server-login-finish), where the server can +//! populate [`ServerLoginParameters::context`]. //! //! ## Dummy Server Login //! @@ -940,59 +980,59 @@ //! exposing the bytes of the private key to this library. //! ``` //! # use generic_array::{GenericArray, typenum::U0}; -//! # use opaque_ke::{CipherSuite, ClientLogin, ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, errors::ProtocolError, keypair::PrivateKey, key_exchange::{group::KeGroup as OKeGroup, tripledh::DiffieHellman}}; +//! # use opaque_ke::{CipherSuite, ClientLogin, ClientRegistration, ClientRegistrationFinishParameters, ServerRegistration, keypair::{PrivateKey, PublicKey}, key_exchange::{KeyExchange, group::Group, tripledh::DiffieHellman}}; //! # use rand::rngs::OsRng; +//! # type Ristretto255 = <::KeyExchange as KeyExchange>::Group; //! # struct Default; //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for Default { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for Default { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = opaque_ke::ksf::Identity; //! # } -//! # type KeGroup = ::KeGroup; //! # #[derive(Debug, thiserror::Error)] //! # #[error("test error")] //! # struct YourRemoteKeyError; //! # #[derive(Clone)] -//! # struct YourRemoteKey(::Sk); +//! # struct YourRemoteKey(::Sk); //! # impl YourRemoteKey { -//! # fn diffie_hellman(&self, pk: &PublicKey) -> Result::PkLen>, YourRemoteKeyError> { -//! # Ok(<::Sk as DiffieHellman>::diffie_hellman(self.0, KeGroup::deserialize_pk(&pk.serialize()).unwrap())) +//! # fn diffie_hellman(&self, pk: &PublicKey) -> Result::PkLen>, YourRemoteKeyError> { +//! # Ok(<::Sk as DiffieHellman>::diffie_hellman(self.0, pk.to_group_type())) //! # } //! # } -//! use opaque_ke::{ServerLogin, ServerLoginStartParameters, ServerSetup}; -//! use opaque_ke::keypair::{KeyPair, PrivateKeySerialization, PublicKey}; +//! use opaque_ke::{ServerLogin, ServerLoginParameters, ServerSetup}; +//! use opaque_ke::keypair::{KeyPair, PrivateKeySerialization}; +//! use opaque_ke::errors::ProtocolError; //! //! // Implement if you intend to use `ServerSetup::de/serialize` instead of `serde`. -//! impl PrivateKeySerialization for YourRemoteKey { +//! impl PrivateKeySerialization for YourRemoteKey { //! type Error = YourRemoteKeyError; //! type Len = U0; //! -//! fn serialize_key_pair(_: &KeyPair) -> GenericArray { +//! fn serialize_key_pair(_: &KeyPair) -> GenericArray { //! unimplemented!() //! } //! -//! fn deserialize_key_pair(input: &[u8]) -> Result, ProtocolError> { +//! fn deserialize_take_key_pair(input: &mut &[u8]) -> Result, ProtocolError> { //! unimplemented!() //! } //! } //! -//! # let sk = KeGroup::random_sk(&mut OsRng); -//! # let pk = KeGroup::public_key(sk); -//! # let pk = KeGroup::serialize_pk(pk); +//! # let sk = Ristretto255::random_sk(&mut OsRng); +//! # let pk = Ristretto255::public_key(sk); +//! # let pk = Ristretto255::serialize_pk(pk); //! # let public_key = PublicKey::deserialize(&pk).unwrap(); //! # let remote_key = YourRemoteKey(sk); //! # let mut server_rng = OsRng; //! let keypair = KeyPair::new(remote_key, public_key); //! let server_setup = ServerSetup::::new_with_key_pair(&mut server_rng, keypair); +//! //! # let client_registration_start_result = ClientRegistration::::start( //! # &mut OsRng, //! # b"password", @@ -1004,17 +1044,152 @@ //! # &mut OsRng, //! # b"password", //! # )?; -//! let password_file = ServerRegistration::::deserialize(&password_file_bytes)?; +//! # let password_file = ServerRegistration::::deserialize(&password_file_bytes)?; +//! // Use `ServerLogin::builder()` instead of `ServerLogin::start()`. //! let server_login_builder = ServerLogin::builder( //! &mut server_rng, //! &server_setup, //! Some(password_file), //! client_login_start_result.message, //! b"alice@example.com", -//! ServerLoginStartParameters::default(), +//! ServerLoginParameters::default(), //! )?; +//! +//! // Run Diffie-Hellman on your remote key. //! let client_e_public_key = server_login_builder.data(); //! let shared_secret = server_login_builder.private_key().diffie_hellman(&client_e_public_key)?; +//! +//! // Use the shared secret to build `ServerLogin`. +//! let server_login_start_result = server_login_builder.build(shared_secret)?; +//! # Ok::<(), anyhow::Error>(()) +//! ``` +//! +//! ## Remote OPRF Seeds +//! +//! In addition, the OPRF seed can be stored in an external location as well, by +//! using [`ServerRegistration::start_with_key_material()`] and +//! [`ServerLogin::builder_with_key_material()`] in combination with +//! [`ServerSetup::key_material_info()`]. +//! ``` +//! # use digest::Output; +//! # use generic_array::{GenericArray, typenum::U0}; +//! # use hkdf::Hkdf; +//! # use opaque_ke::{CipherSuite, ClientLogin, ClientRegistration, ClientRegistrationFinishParameters, keypair::{PrivateKey, PublicKey}, key_exchange::{KeyExchange, group::Group, tripledh::DiffieHellman}}; +//! # use rand::rngs::OsRng; +//! # use rand::RngCore; +//! # type Ristretto255 = <::KeyExchange as KeyExchange>::Group; +//! # type Hash = <::KeyExchange as KeyExchange>::Hash; +//! # type OprfGroup = <::OprfCs as voprf::CipherSuite>::Group; +//! # struct Default; +//! # #[cfg(feature = "ristretto255")] +//! # impl CipherSuite for Default { +//! # type OprfCs = opaque_ke::Ristretto255; +//! # type KeyExchange = opaque_ke::TripleDh; +//! # type Ksf = opaque_ke::ksf::Identity; +//! # } +//! # #[cfg(not(feature = "ristretto255"))] +//! # impl CipherSuite for Default { +//! # type OprfCs = p256::NistP256; +//! # type KeyExchange = opaque_ke::TripleDh; +//! # type Ksf = opaque_ke::ksf::Identity; +//! # } +//! # #[derive(Debug, thiserror::Error)] +//! # #[error("test error")] +//! # struct YourRemoteSecretsError; +//! # #[derive(Clone)] +//! # struct YourRemoteSeed(Output); +//! # impl YourRemoteSeed { +//! # fn hkdf(&self, info: &[&[u8]]) -> GenericArray::ScalarLen> { +//! # let mut ikm = GenericArray::default(); +//! # Hkdf::::from_prk(&self.0) +//! # .unwrap() +//! # .expand_multi_info(info, &mut ikm) +//! # .unwrap(); +//! # ikm +//! # } +//! # } +//! # #[derive(Clone)] +//! # struct YourRemoteKey(::Sk); +//! # impl YourRemoteKey { +//! # fn diffie_hellman(&self, pk: &PublicKey) -> Result::PkLen>, YourRemoteSecretsError> { +//! # Ok(<::Sk as DiffieHellman>::diffie_hellman(self.0, pk.to_group_type())) +//! # } +//! # } +//! use opaque_ke::{ServerLogin, ServerLoginParameters, ServerRegistration, ServerSetup}; +//! use opaque_ke::keypair::{KeyPair, OprfSeedSerialization}; +//! use opaque_ke::errors::ProtocolError; +//! +//! // Implement if you intend to use `ServerSetup::de/serialize` instead of `serde`. +//! impl OprfSeedSerialization for YourRemoteSeed { +//! type Len = U0; +//! +//! fn serialize(&self) -> GenericArray { +//! unimplemented!() +//! } +//! +//! fn deserialize_take(input: &mut &[u8]) -> Result> { +//! unimplemented!() +//! } +//! } +//! +//! # let mut oprf_seed = YourRemoteSeed(GenericArray::default()); +//! # OsRng.fill_bytes(&mut oprf_seed.0); +//! # let sk = Ristretto255::random_sk(&mut OsRng); +//! # let pk = Ristretto255::public_key(sk); +//! # let pk = Ristretto255::serialize_pk(pk); +//! # let public_key = PublicKey::deserialize(&pk).unwrap(); +//! # let remote_key = YourRemoteKey(sk); +//! # let mut server_rng = OsRng; +//! let keypair = KeyPair::new(remote_key, public_key); +//! let server_setup = ServerSetup::::new_with_key_pair_and_seed(&mut server_rng, keypair, oprf_seed); +//! +//! // Incoming registration ... +//! # let client_registration_start_result = ClientRegistration::::start( +//! # &mut OsRng, +//! # b"password", +//! # )?; +//! +//! // Run HKDF on your remote OPRF seed. +//! let info = server_setup.key_material_info(b"alice@example.com"); +//! let key_material = info.ikm.hkdf(&info.info); +//! +//! // Use `ServerRegistration::start_with_key_material()` instead of `ServerRegistration::start()`. +//! let server_registration_start_result = ServerRegistration::::start_with_key_material( +//! &server_setup, +//! key_material, +//! client_registration_start_result.message, +//! )?; +//! +//! // Finish registration ... +//! # let client_registration_finish_result = client_registration_start_result.state.finish(&mut OsRng, b"password", server_registration_start_result.message, ClientRegistrationFinishParameters::default())?; +//! +//! // Incoming login ... +//! # let password_file_bytes = ServerRegistration::::finish(client_registration_finish_result.message).serialize(); +//! # let client_login_start_result = ClientLogin::::start( +//! # &mut OsRng, +//! # b"password", +//! # )?; +//! # let password_file = ServerRegistration::::deserialize(&password_file_bytes)?; +//! +//! // Run HKDF on your remote OPRF seed. +//! let info = server_setup.key_material_info(b"alice@example.com"); +//! let key_material = info.ikm.hkdf(&info.info); +//! +//! // Use `ServerLogin::builder_with_key_material()` instead of `ServerLogin::start()`. +//! let server_login_builder = ServerLogin::builder_with_key_material( +//! &mut server_rng, +//! &server_setup, +//! key_material, +//! Some(password_file), +//! client_login_start_result.message, +//! ServerLoginParameters::default(), +//! )?; +//! +//! // Run Diffie-Hellman on your remote key. +//! let client_e_public_key = server_login_builder.data(); +//! let shared_secret = server_login_builder.private_key().diffie_hellman(&client_e_public_key)?; +//! +//! // Use the shared secret to build `ServerLogin`. //! let server_login_start_result = server_login_builder.build(shared_secret)?; //! # Ok::<(), anyhow::Error>(()) //! ``` @@ -1028,11 +1203,13 @@ //! can be used. //! ``` //! # use generic_array::GenericArray; +//! use opaque_ke::ksf::Ksf; +//! //! #[derive(Default)] //! struct CustomKsf(scrypt::Params); //! //! // The Ksf trait must be implemented to be used in the ciphersuite. -//! impl opaque_ke::ksf::Ksf for CustomKsf { +//! impl Ksf for CustomKsf { //! fn hash>( //! &self, //! input: GenericArray, @@ -1064,15 +1241,13 @@ //! # #[cfg(feature = "ristretto255")] //! # impl CipherSuite for DefaultCipherSuite { //! # type OprfCs = opaque_ke::Ristretto255; -//! # type KeGroup = opaque_ke::Ristretto255; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = argon2::Argon2<'static>; //! # } //! # #[cfg(not(feature = "ristretto255"))] //! # impl CipherSuite for DefaultCipherSuite { //! # type OprfCs = p256::NistP256; -//! # type KeGroup = p256::NistP256; -//! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDh; +//! # type KeyExchange = opaque_ke::TripleDh; //! # type Ksf = argon2::Argon2<'static>; //! # } //! # @@ -1126,7 +1301,7 @@ //! more computationally intensive the `Ksf` function is, the more resistant //! the server's password file records will be against offline dictionary and precomputation //! attacks; see [the OPAQUE paper](https://eprint.iacr.org/2018/163.pdf) for -//! more details. +//! more details. The `argon2` feature requires [`alloc`]. //! //! - The `serde` feature, enabled by default, provides convenience functions for serializing and deserializing with [serde](https://serde.rs/). //! @@ -1137,15 +1312,14 @@ //! - The `curve25519` feature enables Curve25519 as a `KeGroup`. To select a //! specific backend see the [curve25519-dalek] documentation. //! -//! - The `p256` feature enables the use of [`p256::NistP256`] as a `KeGroup` -//! and a `OprfCs` for `CipherSuite`. +//! - The `ecdsa` feature enables using [`elliptic_curve`]s with [`Ecdsa`] for +//! [`SigmaI`]s signature algorithm. //! -//! - The `bench` feature is used only for running performance benchmarks for -//! this implementation. +//! - The `ed25519` feature enables using [`Ed25519`]s with [`PureEddsa`] and +//! [`HashEddsa`] for [`SigmaI`]s signature algorithm. //! -//! [curve25519-dalek]: -//! (https://docs.rs/curve25519-dalek/4.0.0-pre.5/curve25519_dalek/index.html#backends) -//! [`p256::NistP256`]: https://docs.rs/p256/latest/p256/struct.NistP256.html +//! [`alloc`]: https://doc.rust-lang.org/alloc +//! [curve25519-dalek]: https://docs.rs/curve25519-dalek/4/curve25519_dalek/index.html#backends #![no_std] #![cfg_attr(docsrs, feature(doc_auto_cfg))] @@ -1169,7 +1343,6 @@ pub mod ksf; mod messages; mod opaque; mod serialization; -mod util; #[cfg(test)] mod tests; @@ -1181,8 +1354,16 @@ pub use rand; #[cfg(feature = "curve25519")] pub use crate::key_exchange::group::curve25519::Curve25519; +#[cfg(feature = "ed25519")] +pub use crate::key_exchange::group::ed25519::Ed25519; #[cfg(feature = "ristretto255")] pub use crate::key_exchange::group::ristretto255::Ristretto255; +#[cfg(feature = "ecdsa")] +pub use crate::key_exchange::sigma_i::ecdsa::Ecdsa; +pub use crate::key_exchange::sigma_i::hash_eddsa::HashEddsa; +pub use crate::key_exchange::sigma_i::pure_eddsa::PureEddsa; +pub use crate::key_exchange::sigma_i::SigmaI; +pub use crate::key_exchange::tripledh::TripleDh; pub use crate::messages::{ CredentialFinalization, CredentialFinalizationLen, CredentialRequest, CredentialRequestLen, CredentialResponse, CredentialResponseLen, RegistrationRequest, RegistrationRequestLen, @@ -1193,6 +1374,6 @@ pub use crate::opaque::{ ClientLogin, ClientLoginFinishParameters, ClientLoginFinishResult, ClientLoginStartResult, ClientRegistration, ClientRegistrationFinishParameters, ClientRegistrationFinishResult, ClientRegistrationStartResult, Identifiers, KeyMaterialInfo, ServerLogin, - ServerLoginFinishResult, ServerLoginStartParameters, ServerLoginStartResult, - ServerRegistration, ServerRegistrationLen, ServerRegistrationStartResult, ServerSetup, + ServerLoginFinishResult, ServerLoginParameters, ServerLoginStartResult, ServerRegistration, + ServerRegistrationLen, ServerRegistrationStartResult, ServerSetup, }; diff --git a/src/messages.rs b/src/messages.rs index 160a321..41f9d33 100644 --- a/src/messages.rs +++ b/src/messages.rs @@ -16,24 +16,24 @@ use generic_array::sequence::Concat; use generic_array::typenum::{Sum, Unsigned}; use generic_array::{ArrayLength, GenericArray}; use rand::{CryptoRng, RngCore}; -use subtle::ConstantTimeEq; -use voprf::Group; +use voprf::{BlindedElement, BlindedElementLen, EvaluationElement, EvaluationElementLen}; use zeroize::Zeroizing; -use crate::ciphersuite::{CipherSuite, OprfGroup, OprfHash}; +use crate::ciphersuite::{CipherSuite, KeGroup, OprfGroup, OprfHash}; use crate::envelope::{Envelope, EnvelopeLen}; -use crate::errors::utils::{check_slice_size, check_slice_size_atleast}; use crate::errors::ProtocolError; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::NonceLen; use crate::key_exchange::traits::{ - Deserialize, Ke1MessageLen, Ke2MessageLen, Ke3MessageLen, KeyExchange, Serialize, + CredentialRequestParts, CredentialResponseParts, Deserialize, Ke1MessageLen, Ke2MessageLen, + Ke3MessageLen, KeyExchange, Serialize, }; -use crate::key_exchange::tripledh::NonceLen; use crate::keypair::PublicKey; use crate::opaque::{ MaskedResponse, MaskedResponseLen, ServerLogin, ServerLoginStartResult, ServerSetup, }; +use crate::serialization::SliceExt; //////////////////////////// // High-level API Structs // @@ -61,12 +61,12 @@ pub struct RegistrationRequest { serde(bound = "") )] #[derive_where(Clone)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; voprf::EvaluationElement, ::Pk)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; voprf::EvaluationElement, as Group>::Pk)] pub struct RegistrationResponse { /// The server's oprf output pub(crate) evaluation_element: voprf::EvaluationElement, /// Server's static public key - pub(crate) server_s_pk: PublicKey, + pub(crate) server_s_pk: PublicKey>, } /// The final message from the client, containing sealed cryptographic @@ -77,7 +77,7 @@ pub struct RegistrationResponse { serde(bound = "") )] #[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; ::Pk)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; as Group>::Pk)] pub struct RegistrationUpload { /// The "envelope" generated by the user, containing sealed cryptographic /// identifiers @@ -85,7 +85,7 @@ pub struct RegistrationUpload { /// The masking key used to mask the envelope pub(crate) masking_key: Output>, /// The user's public key - pub(crate) client_s_pk: PublicKey, + pub(crate) client_s_pk: PublicKey>, } /// The message sent by the user to the server, to initiate registration @@ -93,21 +93,19 @@ pub struct RegistrationUpload { feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = ", CS::KeGroup>>::KE1Message: \ - serde::Deserialize<'de>", - serialize = ", CS::KeGroup>>::KE1Message: \ - serde::Serialize" + deserialize = "::KE1Message: serde::Deserialize<'de>", + serialize = "::KE1Message: serde::Serialize" )) )] #[derive_where(Clone, ZeroizeOnDrop)] #[derive_where( Debug, Eq, Hash, PartialEq; voprf::BlindedElement, - , CS::KeGroup>>::KE1Message, + ::KE1Message, )] pub struct CredentialRequest { pub(crate) blinded_element: voprf::BlindedElement, - pub(crate) ke1_message: , CS::KeGroup>>::KE1Message, + pub(crate) ke1_message: ::KE1Message, } /// Builder for [`ServerLogin`](crate::ServerLogin) when using remote keys. @@ -115,37 +113,36 @@ pub struct CredentialRequest { feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = "SK: serde::Deserialize<'de>, , \ - CS::KeGroup>>::KE2Builder: serde::Deserialize<'de>", - serialize = "SK: serde::Serialize, , \ - CS::KeGroup>>::KE2Builder: serde::Serialize" + deserialize = "SK: serde::Deserialize<'de>, ::KE2Builder<'a, CS>: serde::Deserialize<'de>", + serialize = "SK: serde::Serialize, ::KE2Builder<'a, CS>: \ + serde::Serialize" )) )] #[derive_where(Clone)] #[derive_where( Debug, Eq, PartialEq; + as Group>::Pk, SK, voprf::EvaluationElement, - , CS::KeGroup>>::KE2Builder, + ::KE2Builder<'a, CS>, )] -pub struct ServerLoginBuilder { +pub struct ServerLoginBuilder<'a, CS: CipherSuite, SK: Clone> { pub(crate) server_s_sk: SK, pub(crate) evaluation_element: voprf::EvaluationElement, pub(crate) masking_nonce: Zeroizing>, pub(crate) masked_response: MaskedResponse, #[cfg(test)] - pub(crate) oprf_key: Zeroizing as Group>::ScalarLen>>, - pub(crate) ke2_builder: , CS::KeGroup>>::KE2Builder, + pub(crate) oprf_key: Zeroizing as voprf::Group>::ScalarLen>>, + pub(crate) ke2_builder: ::KE2Builder<'a, CS>, } -impl ServerLoginBuilder { +impl ServerLoginBuilder<'_, CS, SK> { /// The returned data here has to be processed and the result given as an /// input to [`ServerLoginBuilder::build()`]. To understand what kind of /// output is expected here and how to process it, refer to the /// documentation of your chosen [`CipherSuite::KeyExchange`]. - pub fn data( - &self, - ) -> , CS::KeGroup>>::KE2BuilderData<'_> { + pub fn data(&self) -> ::KE2BuilderData<'_, CS> { CS::KeyExchange::ke2_builder_data(&self.ke2_builder) } @@ -161,7 +158,7 @@ impl ServerLoginBuilder { /// See [`ServerLogin::start()`] for the regular path. pub fn build( self, - input: , CS::KeGroup>>::KE2BuilderInput, + input: ::KE2BuilderInput, ) -> Result, ProtocolError> { ServerLogin::build(self, input) } @@ -173,24 +170,22 @@ impl ServerLoginBuilder { feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = ", CS::KeGroup>>::KE2Message: \ - serde::Deserialize<'de>", - serialize = ", CS::KeGroup>>::KE2Message: \ - serde::Serialize" + deserialize = "::KE2Message: serde::Deserialize<'de>", + serialize = "::KE2Message: serde::Serialize" )) )] #[derive_where(Clone)] #[derive_where( Debug, Eq, Hash, PartialEq; voprf::EvaluationElement, - , CS::KeGroup>>::KE2Message, + ::KE2Message, )] pub struct CredentialResponse { /// the server's oprf output pub(crate) evaluation_element: voprf::EvaluationElement, pub(crate) masking_nonce: GenericArray, pub(crate) masked_response: MaskedResponse, - pub(crate) ke2_message: , CS::KeGroup>>::KE2Message, + pub(crate) ke2_message: ::KE2Message, } /// The answer sent by the client to the server, upon reception of the sealed @@ -199,19 +194,17 @@ pub struct CredentialResponse { feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = ", CS::KeGroup>>::KE3Message: \ - serde::Deserialize<'de>", - serialize = ", CS::KeGroup>>::KE3Message: \ - serde::Serialize" + deserialize = "::KE3Message: serde::Deserialize<'de>", + serialize = "::KE3Message: serde::Serialize" )) )] #[derive_where(Clone)] #[derive_where( Debug, Eq, Hash, PartialEq; - , CS::KeGroup>>::KE3Message, + ::KE3Message, )] pub struct CredentialFinalization { - pub(crate) ke3_message: , CS::KeGroup>>::KE3Message, + pub(crate) ke3_message: ::KE3Message, } //////////////////////////////// @@ -220,18 +213,18 @@ pub struct CredentialFinalization { //////////////////////////////// /// Length of [`RegistrationRequest`] in bytes for serialization. -pub type RegistrationRequestLen = as Group>::ElemLen; +pub type RegistrationRequestLen = as voprf::Group>::ElemLen; impl RegistrationRequest { /// Only used for testing purposes #[cfg(test)] - pub fn get_blinded_element_for_testing(&self) -> voprf::BlindedElement { + pub(crate) fn get_blinded_element_for_testing(&self) -> voprf::BlindedElement { self.blinded_element.clone() } /// Serialization into bytes pub fn serialize(&self) -> GenericArray> { - as Group>::serialize_elem(self.blinded_element.value()) + as voprf::Group>::serialize_elem(self.blinded_element.value()) } /// Deserialization from bytes @@ -244,40 +237,38 @@ impl RegistrationRequest { /// Length of [`RegistrationResponse`] in bytes for serialization. pub type RegistrationResponseLen = - Sum< as Group>::ElemLen, ::PkLen>; + Sum< as voprf::Group>::ElemLen, as Group>::PkLen>; impl RegistrationResponse { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where // RegistrationResponse: KgPk + KePk - as Group>::ElemLen: Add<::PkLen>, + as voprf::Group>::ElemLen: Add< as Group>::PkLen>, RegistrationResponseLen: ArrayLength, { - as Group>::serialize_elem(self.evaluation_element.value()) + as voprf::Group>::serialize_elem(self.evaluation_element.value()) .concat(self.server_s_pk.serialize()) } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let elem_len = as Group>::ElemLen::USIZE; - let key_len = ::PkLen::USIZE; - let checked_slice = - check_slice_size(input, elem_len + key_len, "registration_response_bytes")?; - - // Ensure that public key is valid - let server_s_pk = PublicKey::deserialize(&checked_slice[elem_len..])?; + pub fn deserialize(mut input: &[u8]) -> Result { + let evaluation_element = EvaluationElement::deserialize(input)?; + input = &input[EvaluationElementLen::::USIZE..]; Ok(Self { - evaluation_element: voprf::EvaluationElement::deserialize(&checked_slice[..elem_len])?, - server_s_pk, + evaluation_element, + server_s_pk: PublicKey::deserialize_take(&mut input)?, }) } #[cfg(test)] /// Only used for tests, where we can set the beta value to test for the /// reflection error case - pub fn set_evaluation_element_for_testing(&self, beta: as Group>::Elem) -> Self { + pub(crate) fn set_evaluation_element_for_testing( + &self, + beta: as voprf::Group>::Elem, + ) -> Self { Self { evaluation_element: voprf::EvaluationElement::from_value_unchecked(beta), server_s_pk: self.server_s_pk.clone(), @@ -287,18 +278,15 @@ impl RegistrationResponse { /// Length of [`RegistrationUpload`] in bytes for serialization. pub type RegistrationUploadLen = - Sum::PkLen, OutputSize>>, EnvelopeLen>; + Sum as Group>::PkLen, OutputSize>>, EnvelopeLen>; impl RegistrationUpload { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, { @@ -309,18 +297,11 @@ impl RegistrationUpload { } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let key_len = ::PkLen::USIZE; - let hash_len = OutputSize::>::USIZE; - let checked_slice = - check_slice_size_atleast(input, key_len + hash_len, "registration_upload_bytes")?; - let envelope = Envelope::::deserialize(&checked_slice[key_len + hash_len..])?; + pub fn deserialize(mut input: &[u8]) -> Result { Ok(Self { - envelope, - masking_key: GenericArray::clone_from_slice( - &checked_slice[key_len..key_len + hash_len], - ), - client_s_pk: PublicKey::deserialize(&checked_slice[..key_len])?, + client_s_pk: PublicKey::deserialize_take(&mut input)?, + masking_key: input.take_array("masking key")?, + envelope: Envelope::deserialize_take(&mut input)?, }) } @@ -342,57 +323,49 @@ impl RegistrationUpload { /// Length of [`CredentialRequest`] in bytes for serialization. pub type CredentialRequestLen = - Sum< as Group>::ElemLen, Ke1MessageLen>; + Sum< as voprf::Group>::ElemLen, Ke1MessageLen>; impl CredentialRequest { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where + ::KE1Message: Serialize, // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, { - as Group>::serialize_elem(self.blinded_element.value()) + as voprf::Group>::serialize_elem(self.blinded_element.value()) .concat(self.ke1_message.serialize()) } - pub(crate) fn serialize_iter<'a>( - blinded_element: &'a GenericArray as Group>::ElemLen>, - ke1_message: &'a GenericArray>, - ) -> impl Iterator { - [blinded_element.as_slice(), ke1_message].into_iter() + /// Deserialization from bytes + pub fn deserialize(mut input: &[u8]) -> Result + where + ::KE1Message: Deserialize, + { + Self::deserialize_take(&mut input) } - /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let elem_len = as Group>::ElemLen::USIZE; - - let checked_slice = check_slice_size_atleast(input, elem_len, "login_first_message_bytes")?; - - // Check that the message is actually containing an element of the correct - // subgroup - let blinded_element = - voprf::BlindedElement::::deserialize(&checked_slice[..elem_len])?; - - // Throw an error if the identity group element is encountered - if bool::from( as Group>::identity_elem().ct_eq(&blinded_element.value())) { - return Err(ProtocolError::IdentityGroupElementError); - } - - let ke1_message = - , CS::KeGroup>>::KE1Message::deserialize( - &checked_slice[elem_len..], - )?; + pub(crate) fn deserialize_take(input: &mut &[u8]) -> Result + where + ::KE1Message: Deserialize, + { + let blinded_element = BlindedElement::deserialize(input)?; + *input = &input[BlindedElementLen::::USIZE..]; Ok(Self { blinded_element, - ke1_message, + ke1_message: ::KE1Message::deserialize_take(input)?, }) } + pub(crate) fn to_parts(&self) -> CredentialRequestParts { + CredentialRequestParts::new(&self.blinded_element) + } + /// Only used for testing purposes #[cfg(test)] - pub fn get_blinded_element_for_testing(&self) -> voprf::BlindedElement { + pub(crate) fn get_blinded_element_for_testing(&self) -> voprf::BlindedElement { self.blinded_element.clone() } } @@ -402,90 +375,61 @@ pub type CredentialResponseLen = Sum, Ke2MessageLen>; pub(crate) type CredentialResponseWithoutKeLen = - Sum as Group>::ElemLen, NonceLen>, MaskedResponseLen>; + Sum as voprf::Group>::ElemLen, NonceLen>, MaskedResponseLen>; impl CredentialResponse { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where + ::KE2Message: Serialize, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { - as Group>::serialize_elem(self.evaluation_element.value()) + as voprf::Group>::serialize_elem(self.evaluation_element.value()) .concat(self.masking_nonce) .concat(self.masked_response.serialize()) .concat(self.ke2_message.serialize()) } - pub(crate) fn serialize_without_ke<'a>( - beta: &'a GenericArray as Group>::ElemLen>, - masking_nonce: &'a GenericArray, - masked_response: &'a MaskedResponse, - ) -> impl Iterator { - [beta.as_slice(), masking_nonce.as_slice()] - .into_iter() - .chain(masked_response.iter()) - } - /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let elem_len = as Group>::ElemLen::USIZE; - let key_len = ::PkLen::USIZE; - let nonce_len = NonceLen::USIZE; - let envelope_len = Envelope::::len(); - let masked_response_len = key_len + envelope_len; - let ke2_message_len = Ke2MessageLen::::USIZE; - - let checked_slice = check_slice_size_atleast( - input, - elem_len + nonce_len + masked_response_len + ke2_message_len, - "credential_response_bytes", - )?; - - // Check that the message is actually containing an element of the correct - // subgroup - let beta_bytes = &checked_slice[..elem_len]; - let evaluation_element = voprf::EvaluationElement::::deserialize(beta_bytes)?; - - // Throw an error if the identity group element is encountered - if bool::from( as Group>::identity_elem().ct_eq(&evaluation_element.value())) - { - return Err(ProtocolError::IdentityGroupElementError); - } - - let masking_nonce = - GenericArray::clone_from_slice(&checked_slice[elem_len..elem_len + nonce_len]); - let masked_response = MaskedResponse::deserialize( - &checked_slice[elem_len + nonce_len..elem_len + nonce_len + masked_response_len], - ); - let ke2_message = - , CS::KeGroup>>::KE2Message::deserialize( - &checked_slice[elem_len + nonce_len + masked_response_len..], - )?; + pub fn deserialize(mut input: &[u8]) -> Result + where + ::KE2Message: Deserialize, + { + let evaluation_element = EvaluationElement::deserialize(input)?; + input = &input[voprf::EvaluationElementLen::::USIZE..]; Ok(Self { evaluation_element, - masking_nonce, - masked_response, - ke2_message, + masking_nonce: input.take_array("masking nonce")?, + masked_response: MaskedResponse::deserialize_take(&mut input)?, + ke2_message: ::KE2Message::deserialize_take( + &mut input, + )?, }) } + pub(crate) fn to_parts(&self) -> CredentialResponseParts { + CredentialResponseParts::new( + &self.evaluation_element, + self.masking_nonce, + self.masked_response.clone(), + ) + } + #[cfg(test)] /// Only used for tests, where we can set the beta value to test for the /// reflection error case - pub fn set_evaluation_element_for_testing(&self, beta: as Group>::Elem) -> Self { + pub(crate) fn set_evaluation_element_for_testing( + &self, + beta: as voprf::Group>::Elem, + ) -> Self { Self { evaluation_element: voprf::EvaluationElement::from_value_unchecked(beta), masking_nonce: self.masking_nonce, @@ -500,16 +444,22 @@ pub type CredentialFinalizationLen = Ke3MessageLen; impl CredentialFinalization { /// Serialization into bytes - pub fn serialize(&self) -> GenericArray> { + pub fn serialize(&self) -> GenericArray> + where + ::KE3Message: Serialize, + { self.ke3_message.serialize() } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let ke3_message = - , CS::KeGroup>>::KE3Message::deserialize( - input, - )?; - Ok(Self { ke3_message }) + pub fn deserialize(mut input: &[u8]) -> Result + where + ::KE3Message: Deserialize, + { + Ok(Self { + ke3_message: ::KE3Message::deserialize_take( + &mut input, + )?, + }) } } diff --git a/src/opaque.rs b/src/opaque.rs index ab357da..e1768c2 100644 --- a/src/opaque.rs +++ b/src/opaque.rs @@ -11,30 +11,32 @@ use core::ops::{Add, Deref}; use derive_where::derive_where; -use digest::{Output, OutputSizeUser}; +use digest::Output; use generic_array::sequence::Concat; -use generic_array::typenum::{Sum, Unsigned, U2}; +use generic_array::typenum::{Sum, Unsigned}; use generic_array::{ArrayLength, GenericArray}; use hkdf::{Hkdf, HkdfExtract}; use rand::{CryptoRng, RngCore}; use subtle::{Choice, ConstantTimeEq, CtOption}; -use voprf::Group; +use voprf::{BlindedElement, Group as _, OprfClient, OprfClientLen}; use zeroize::Zeroizing; -use crate::ciphersuite::{CipherSuite, OprfGroup, OprfHash}; +use crate::ciphersuite::{CipherSuite, KeGroup, KeHash, OprfGroup, OprfHash}; use crate::envelope::{Envelope, EnvelopeLen}; -use crate::errors::utils::check_slice_size; use crate::errors::{InternalError, ProtocolError}; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::NonceLen; use crate::key_exchange::traits::{ - Deserialize, Ke1MessageLen, Ke1StateLen, Ke2StateLen, KeyExchange, Serialize, + CredentialResponseParts, Deserialize, Ke1MessageLen, Ke1StateLen, Ke2StateLen, KeyExchange, + Serialize, SerializedContext, SerializedIdentifiers, +}; +use crate::keypair::{ + KeyPair, OprfSeed, OprfSeedSerialization, PrivateKey, PrivateKeySerialization, PublicKey, }; -use crate::key_exchange::tripledh::NonceLen; -use crate::keypair::{KeyPair, PrivateKey, PrivateKeySerialization, PublicKey}; use crate::ksf::Ksf; use crate::messages::{CredentialRequestLen, RegistrationUploadLen}; -use crate::serialization::Input; +use crate::serialization::{GenericArrayExt, SliceExt}; use crate::{ CredentialFinalization, CredentialRequest, CredentialResponse, RegistrationRequest, RegistrationResponse, RegistrationUpload, ServerLoginBuilder, @@ -65,15 +67,15 @@ const STR_OPAQUE_DERIVE_KEY_PAIR: &[u8; 20] = b"OPAQUE-DeriveKeyPair"; )) )] #[derive_where(Clone)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; ::Pk, ::Sk, SK, OS)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; as Group>::Pk, as Group>::Sk, SK, OS)] pub struct ServerSetup< CS: CipherSuite, - SK: Clone = PrivateKey<::KeGroup>, - OS: Clone = Zeroizing>>, + SK: Clone = PrivateKey>, + OS: Clone = OprfSeed>, > { oprf_seed: OS, - keypair: KeyPair, - pub(crate) fake_keypair: KeyPair, + keypair: KeyPair, SK>, + pub(crate) fake_keypair: KeyPair>, } /// The state elements the client holds to register itself @@ -100,7 +102,7 @@ pub struct ClientRegistration { serde(bound = "") )] #[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; ::Pk)] +#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; as Group>::Pk)] pub struct ServerRegistration(pub(crate) RegistrationUpload); /// The state elements the client holds to perform a login @@ -108,24 +110,22 @@ pub struct ServerRegistration(pub(crate) RegistrationUpload feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = ", CS::KeGroup>>::KE1Message: \ - serde::Deserialize<'de>, , \ - CS::KeGroup>>::KE1State: serde::Deserialize<'de>", - serialize = ", CS::KeGroup>>::KE1Message: \ - serde::Serialize, , \ - CS::KeGroup>>::KE1State: serde::Serialize" + deserialize = "::KE1Message: serde::Deserialize<'de>, \ + ::KE1State: serde::Deserialize<'de>", + serialize = "::KE1Message: serde::Serialize, \ + ::KE1State: serde::Serialize" )) )] #[derive_where(Clone, ZeroizeOnDrop)] #[derive_where( Debug, Eq, Hash, PartialEq; voprf::OprfClient, - , CS::KeGroup>>::KE1State, + ::KE1State, CredentialRequest, )] pub struct ClientLogin { pub(crate) oprf_client: voprf::OprfClient, - pub(crate) ke1_state: , CS::KeGroup>>::KE1State, + pub(crate) ke1_state: ::KE1State, pub(crate) credential_request: CredentialRequest, } @@ -134,19 +134,14 @@ pub struct ClientLogin { feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound( - deserialize = ", CS::KeGroup>>::KE2State: \ - serde::Deserialize<'de>", - serialize = ", CS::KeGroup>>::KE2State: \ - serde::Serialize" + deserialize = "::KE2State: serde::Deserialize<'de>", + serialize = "::KE2State: serde::Serialize" )) )] #[derive_where(Clone, ZeroizeOnDrop)] -#[derive_where( - Debug, Eq, Hash, PartialEq; - , CS::KeGroup>>::KE2State, -)] +#[derive_where(Debug, Eq, Hash, PartialEq; ::KE2State)] pub struct ServerLogin { - ke2_state: , CS::KeGroup>>::KE2State, + ke2_state: ::KE2State, } //////////////////////////////// @@ -157,10 +152,10 @@ pub struct ServerLogin { // Server Setup // ============ -impl ServerSetup> { +impl ServerSetup>> { /// Generate a new instance of server setup pub fn new(rng: &mut R) -> Self { - let keypair = KeyPair::generate_random::(rng); + let keypair = KeyPair::random(rng); Self::new_with_key_pair(rng, keypair) } } @@ -168,9 +163,9 @@ impl ServerSetup> { /// Length of [`ServerSetup`] in bytes for serialization. pub type ServerSetupLen< CS: CipherSuite, - SK: PrivateKeySerialization, + SK: PrivateKeySerialization>, OS: OprfSeedSerialization, SK::Error>, -> = Sum, ::SkLen>; +> = Sum, as Group>::SkLen>; impl ServerSetup { /// Create [`ServerSetup`] with the given keypair and OPRF seed. @@ -180,13 +175,13 @@ impl ServerSetup { /// [`ServerSetup::deserialize`] for this purpose. pub fn new_with_key_pair_and_seed( rng: &mut R, - keypair: KeyPair, + keypair: KeyPair, SK>, oprf_seed: OS, ) -> Self { Self { oprf_seed, keypair, - fake_keypair: KeyPair::::generate_random::(rng), + fake_keypair: KeyPair::>::random(rng), } } @@ -206,11 +201,11 @@ impl ServerSetup { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where - SK: PrivateKeySerialization, + SK: PrivateKeySerialization>, OS: OprfSeedSerialization, SK::Error>, // ServerSetup: Hash + KeSk + KeSk OS::Len: Add, - Sum: ArrayLength + Add<::SkLen>, + Sum: ArrayLength + Add< as Group>::SkLen>, ServerSetupLen: ArrayLength, { self.oprf_seed @@ -220,26 +215,21 @@ impl ServerSetup { } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result> + pub fn deserialize(mut input: &[u8]) -> Result> where - SK: PrivateKeySerialization, + SK: PrivateKeySerialization>, OS: OprfSeedSerialization, SK::Error>, { - let seed_len = OS::Len::USIZE; - let key_len = ::SkLen::USIZE; - let checked_slice = check_slice_size(input, seed_len + key_len + key_len, "server_setup") - .map_err(ProtocolError::into_custom)?; - Ok(Self { - oprf_seed: OS::deserialize(&checked_slice[..seed_len])?, - keypair: SK::deserialize_key_pair(&checked_slice[seed_len..seed_len + key_len])?, - fake_keypair: PrivateKey::deserialize_key_pair(&checked_slice[seed_len + key_len..]) + oprf_seed: OS::deserialize_take(&mut input)?, + keypair: SK::deserialize_take_key_pair(&mut input)?, + fake_keypair: PrivateKey::deserialize_take_key_pair(&mut input) .map_err(ProtocolError::into_custom)?, }) } /// Returns the keypair - pub fn keypair(&self) -> &KeyPair { + pub fn keypair(&self) -> &KeyPair, SK> { &self.keypair } } @@ -252,44 +242,12 @@ impl ServerSetup { /// [`ServerSetup::deserialize`] for this purpose. pub fn new_with_key_pair( rng: &mut R, - keypair: KeyPair, + keypair: KeyPair, SK>, ) -> Self { let mut oprf_seed = GenericArray::default(); rng.fill_bytes(&mut oprf_seed); - Self { - oprf_seed: Zeroizing::new(oprf_seed), - keypair, - fake_keypair: KeyPair::::generate_random::(rng), - } - } -} - -/// A trait to facilitate -/// [`ServerSetup::de/serialize`](crate::ServerSetup::serialize). -pub trait OprfSeedSerialization: Sized { - /// Serialization size in bytes. - type Len: ArrayLength; - - /// Serialization into bytes - fn serialize(&self) -> GenericArray; - - /// Deserialization from bytes - fn deserialize(input: &[u8]) -> Result>; -} - -impl OprfSeedSerialization for Zeroizing> { - type Len = H::OutputSize; - - fn serialize(&self) -> GenericArray { - self.deref().clone() - } - - fn deserialize(input: &[u8]) -> Result> { - check_slice_size(input, H::OutputSize::USIZE, "oprf_seed") - .map_err(ProtocolError::into_custom)?; - - Ok(Zeroizing::new(GenericArray::clone_from_slice(input))) + Self::new_with_key_pair_and_seed(rng, keypair, OprfSeed(oprf_seed)) } } @@ -297,9 +255,9 @@ impl OprfSeedSerialization for Zeroizing> /// [`ServerRegistration::start_with_key_material()`] and /// [`ServerLogin::builder_with_key_material()`]. /// -/// Use an HKDF, with the input key material [`ikm`](Self::ikm), expand -/// operation with [`info`](Self::info) with an output length -/// of [`CS::OprfCs::ScalarLen`](Group::ScalarLen). +/// Use a HKDF, with the input key material [`ikm`](Self::ikm), expand operation +/// with [`info`](Self::info) with an output length +/// of [`CS::OprfCs::ScalarLen`](voprf::Group::ScalarLen). pub struct KeyMaterialInfo<'ci, OS: Clone> { /// Input key material for the HKDF. pub ikm: OS, @@ -311,14 +269,14 @@ pub struct KeyMaterialInfo<'ci, OS: Clone> { // ============ pub(crate) type ClientRegistrationLen = - Sum< as Group>::ScalarLen, as Group>::ElemLen>; + Sum< as voprf::Group>::ScalarLen, as voprf::Group>::ElemLen>; impl ClientRegistration { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where // ClientRegistration: KgSk + KgPk - as Group>::ScalarLen: Add< as Group>::ElemLen>, + as voprf::Group>::ScalarLen: Add< as voprf::Group>::ElemLen>, ClientRegistrationLen: ArrayLength, { self.oprf_client @@ -327,28 +285,18 @@ impl ClientRegistration { } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let client_len = as Group>::ScalarLen::USIZE; - let element_len = as Group>::ElemLen::USIZE; - let checked_slice = - check_slice_size(input, client_len + element_len, "client_registration")?; + pub fn deserialize(mut input: &[u8]) -> Result { + let oprf_client = OprfClient::deserialize(input)?; + input = &input[OprfClientLen::::USIZE..]; + + let blinded_element = BlindedElement::deserialize(input)?; Ok(Self { - oprf_client: voprf::OprfClient::deserialize(&checked_slice[..client_len])?, - blinded_element: voprf::BlindedElement::deserialize(&checked_slice[client_len..])?, + oprf_client, + blinded_element, }) } - /// Only used for testing zeroize - #[cfg(test)] - pub(crate) fn to_vec(&self) -> std::vec::Vec { - [ - self.oprf_client.serialize().to_vec(), - self.blinded_element.serialize().to_vec(), - ] - .concat() - } - /// Returns an initial "blinded" request to send to the server, as well as a /// [`ClientRegistration`] pub fn start( @@ -433,12 +381,9 @@ impl ServerRegistration { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload @@ -457,7 +402,7 @@ impl ServerRegistration { /// See [`ServerRegistration::start()`] for the regular path. pub fn start_with_key_material( server_setup: &ServerSetup, - key_material: GenericArray as Group>::ScalarLen>, + key_material: GenericArray as voprf::Group>::ScalarLen>, message: RegistrationRequest, ) -> Result, ProtocolError> { let oprf_key = oprf_key_from_key_material::(key_material)?; @@ -486,7 +431,7 @@ impl ServerRegistration { ikm: oprf_seed, info, } = server_setup.key_material_info(credential_identifier); - let key_material = oprf_key_material::(&oprf_seed, &info)?; + let key_material = oprf_key_material::(&oprf_seed.0, &info)?; Self::start_with_key_material(server_setup, key_material, message) } @@ -510,18 +455,20 @@ impl ServerRegistration { // ===== pub(crate) type ClientLoginLen = - Sum as Group>::ScalarLen, CredentialRequestLen>, Ke1StateLen>; + Sum as voprf::Group>::ScalarLen, CredentialRequestLen>, Ke1StateLen>; impl ClientLogin { /// Serialization into bytes pub fn serialize(&self) -> GenericArray> where // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + ::KE1Message: Serialize, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, // ClientLogin: KgSk + CredentialRequest + Ke1State - as Group>::ScalarLen: Add>, - Sum< as Group>::ScalarLen, CredentialRequestLen>: + as voprf::Group>::ScalarLen: Add>, + ::KE1State: Serialize, + Sum< as voprf::Group>::ScalarLen, CredentialRequestLen>: ArrayLength + Add>, ClientLoginLen: ArrayLength, { @@ -532,23 +479,18 @@ impl ClientLogin { } /// Deserialization from bytes - pub fn deserialize(input: &[u8]) -> Result { - let client_len = as Group>::ScalarLen::USIZE; - let request_len = as Group>::ElemLen::USIZE + Ke1MessageLen::::USIZE; - let state_len = Ke1StateLen::::USIZE; - let checked_slice = - check_slice_size(input, client_len + request_len + state_len, "client_login")?; + pub fn deserialize(mut input: &[u8]) -> Result + where + ::KE1Message: Deserialize + Serialize, + ::KE1State: Deserialize + Serialize, + { + let oprf_client = OprfClient::deserialize(input)?; + input = &input[OprfClientLen::::USIZE..]; - let ke1_state = - , CS::KeGroup>>::KE1State::deserialize( - &checked_slice[client_len + request_len..], - )?; Ok(Self { - oprf_client: voprf::OprfClient::deserialize(&checked_slice[..client_len])?, - credential_request: CredentialRequest::deserialize( - &checked_slice[client_len..client_len + request_len], - )?, - ke1_state, + oprf_client, + credential_request: CredentialRequest::deserialize_take(&mut input)?, + ke1_state: ::KE1State::deserialize_take(&mut input)?, }) } } @@ -561,7 +503,7 @@ impl ClientLogin { password: &[u8], ) -> Result, ProtocolError> { let blind_result = blind::(rng, password)?; - let (ke1_state, ke1_message) = CS::KeyExchange::generate_ke1::(rng)?; + let (ke1_state, ke1_message) = CS::KeyExchange::generate_ke1(rng)?; let credential_request = CredentialRequest { blinded_element: blind_result.message, @@ -580,19 +522,13 @@ impl ClientLogin { /// "Unblinds" the server's answer and returns the opened assets from the /// server - pub fn finish( + pub fn finish( self, + rng: &mut R, password: &[u8], credential_response: CredentialResponse, params: ClientLoginFinishParameters, - ) -> Result, ProtocolError> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { + ) -> Result, ProtocolError> { // Check if beta value from server is equal to alpha value from client if self .credential_request @@ -639,29 +575,19 @@ impl ClientLogin { err => err, })?; - let beta = OprfGroup::::serialize_elem(credential_response.evaluation_element.value()); - let credential_response_component = CredentialResponse::::serialize_without_ke( - &beta, - &credential_response.masking_nonce, - &credential_response.masked_response, - ); - - let blinded_element = - OprfGroup::::serialize_elem(self.credential_request.blinded_element.value()); - let ke1_message = self.credential_request.ke1_message.serialize(); - let serialized_credential_request = - CredentialRequest::::serialize_iter(&blinded_element, &ke1_message); + let context = SerializedContext::from(params.context)?; let result = CS::KeyExchange::generate_ke3( - credential_response_component, + rng, + self.credential_request.to_parts(), + self.credential_request.ke1_message.clone(), + credential_response.to_parts(), credential_response.ke2_message, &self.ke1_state, - serialized_credential_request, server_s_pk.clone(), opened_envelope.client_static_keypair.private().clone(), - opened_envelope.id_u.iter(), - opened_envelope.id_s.iter(), - params.context.unwrap_or(&[]), + opened_envelope.identifiers, + context, )?; Ok(ClientLoginFinishResult { @@ -683,16 +609,22 @@ impl ClientLogin { impl ServerLogin { /// Serialization into bytes - pub fn serialize(&self) -> GenericArray> { + pub fn serialize(&self) -> GenericArray> + where + ::KE2State: Serialize, + { self.ke2_state.serialize() } /// Deserialization from bytes - pub fn deserialize(bytes: &[u8]) -> Result { + pub fn deserialize(mut bytes: &[u8]) -> Result + where + ::KE2State: Deserialize, + { Ok(Self { ke2_state: - , CS::KeGroup>>::KE2State::deserialize( - bytes, + <::KE2State as Deserialize>::deserialize_take( + &mut bytes, )?, }) } @@ -703,24 +635,17 @@ impl ServerLogin { /// /// See [`ServerLogin::start()`] for the regular path. Or /// [`ServerLogin::builder()`] with just a remote private key. - pub fn builder_with_key_material( + pub fn builder_with_key_material<'a, R: RngCore + CryptoRng, SK: Clone, OS: Clone>( rng: &mut R, server_setup: &ServerSetup, - key_material: GenericArray as Group>::ScalarLen>, + key_material: GenericArray as voprf::Group>::ScalarLen>, password_file: Option>, credential_request: CredentialRequest, - ServerLoginStartParameters { + ServerLoginParameters { context, identifiers, - }: ServerLoginStartParameters, - ) -> Result, ProtocolError> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { + }: ServerLoginParameters<'a, 'a>, + ) -> Result, ProtocolError> { let record = CtOption::new( ServerRegistration::dummy(rng, server_setup), Choice::from(password_file.is_none() as u8), @@ -729,7 +654,7 @@ impl ServerLogin { .unwrap_or_else(|| password_file.unwrap()); let client_s_pk = record.0.client_s_pk.clone(); - let context = context.unwrap_or(&[]); + let context = SerializedContext::from(context)?; let server_s_pk = server_setup.keypair.public(); let mut masking_nonce = GenericArray::<_, NonceLen>::default(); @@ -742,34 +667,31 @@ impl ServerLogin { &record.0.envelope, )?; - let (id_u, id_s) = bytestrings_from_identifiers::( + let serialized_client_s_pk = client_s_pk.serialize(); + let serialized_server_s_pk = server_s_pk.serialize(); + let identifiers = SerializedIdentifiers::>::from_identifiers( identifiers, - client_s_pk.serialize(), - server_s_pk.serialize(), + serialized_client_s_pk.clone(), + serialized_server_s_pk.clone(), )?; - let blinded_element = - OprfGroup::::serialize_elem(credential_request.blinded_element.value()); - let ke1_message = credential_request.ke1_message.serialize(); - let credential_request_bytes = - CredentialRequest::::serialize_iter(&blinded_element, &ke1_message); - let oprf_key = oprf_key_from_key_material::(key_material)?; let server = voprf::OprfServer::new_with_key(&oprf_key).map_err(ProtocolError::from)?; let evaluation_element = server.blind_evaluate(&credential_request.blinded_element); - let beta = OprfGroup::::serialize_elem(evaluation_element.value()); - let credential_response_component = - CredentialResponse::::serialize_without_ke(&beta, &masking_nonce, &masked_response); + let credential_response = CredentialResponseParts::new( + &evaluation_element, + masking_nonce, + masked_response.clone(), + ); - let ke2_builder = CS::KeyExchange::ke2_builder::( + let ke2_builder = CS::KeyExchange::ke2_builder( rng, - credential_request_bytes, - credential_response_component, + credential_request.to_parts(), credential_request.ke1_message.clone(), + credential_response, client_s_pk, - id_u.iter(), - id_s.iter(), + identifiers, context, )?; @@ -787,26 +709,19 @@ impl ServerLogin { /// Create a [`ServerLoginBuilder`] to use with a remote private key. /// /// See [`ServerLogin::start()`] for the regular path. - pub fn builder( + pub fn builder<'a, R: RngCore + CryptoRng, SK: Clone>( rng: &mut R, server_setup: &ServerSetup, password_file: Option>, credential_request: CredentialRequest, credential_identifier: &[u8], - params: ServerLoginStartParameters, - ) -> Result, ProtocolError> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { + params: ServerLoginParameters<'a, 'a>, + ) -> Result, ProtocolError> { let KeyMaterialInfo { ikm: oprf_seed, info, } = server_setup.key_material_info(credential_identifier); - let key_material = oprf_key_material::(&oprf_seed, &info)?; + let key_material = oprf_key_material::(&oprf_seed.0, &info)?; Self::builder_with_key_material( rng, @@ -820,7 +735,7 @@ impl ServerLogin { pub(crate) fn build( builder: ServerLoginBuilder, - input: , CS::KeGroup>>::KE2BuilderInput, + input: ::KE2BuilderInput, ) -> Result, ProtocolError> { let result = CS::KeyExchange::build_ke2(builder.ke2_builder.clone(), input)?; @@ -853,15 +768,8 @@ impl ServerLogin { password_file: Option>, credential_request: CredentialRequest, credential_identifier: &[u8], - parameters: ServerLoginStartParameters, - ) -> Result, ProtocolError> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { + parameters: ServerLoginParameters, + ) -> Result, ProtocolError> { let builder = Self::builder( rng, server_setup, @@ -872,6 +780,7 @@ impl ServerLogin { )?; let input = CS::KeyExchange::generate_ke2_input( &builder.ke2_builder, + rng, server_setup.keypair.private(), ); @@ -883,10 +792,15 @@ impl ServerLogin { pub fn finish( self, message: CredentialFinalization, + parameters: ServerLoginParameters, ) -> Result, ProtocolError> { - let session_key = , CS::KeGroup>>::finish_ke( + let context = SerializedContext::from(parameters.context)?; + + let session_key = ::finish_ke( message.ke3_message, &self.ke2_state, + parameters.identifiers, + context, )?; Ok(ServerLoginFinishResult { @@ -945,7 +859,7 @@ pub struct ClientRegistrationFinishResult { /// The export key output by client registration pub export_key: Output>, /// The server's static public key - pub server_s_pk: PublicKey, + pub server_s_pk: PublicKey>, /// Instance of the ClientRegistration, only used in tests for checking /// zeroize #[cfg(test)] @@ -966,7 +880,7 @@ pub struct ServerRegistrationStartResult { pub message: RegistrationResponse, /// OPRF key, only used in tests #[cfg(test)] - pub oprf_key: GenericArray as Group>::ScalarLen>, + pub oprf_key: GenericArray as voprf::Group>::ScalarLen>, } /// Contains the fields that are returned by a client login start @@ -1011,20 +925,20 @@ pub struct ClientLoginFinishResult { /// The message to send to the server to complete the protocol pub message: CredentialFinalization, /// The session key - pub session_key: Output>, + pub session_key: Output>, /// The client-side export key pub export_key: Output>, /// The server's static public key - pub server_s_pk: PublicKey, + pub server_s_pk: PublicKey>, /// Instance of the ClientLogin, only used in tests for checking zeroize #[cfg(test)] pub state: ClientLogin, /// Handshake secret, only used in tests #[cfg(test)] - pub handshake_secret: Output>, + pub handshake_secret: Output>, /// Client MAC key, only used in tests #[cfg(test)] - pub client_mac_key: Output>, + pub client_mac_key: Output>, } /// Contains the fields that are returned by a server login finish @@ -1033,16 +947,16 @@ pub struct ClientLoginFinishResult { #[cfg_attr(test, derive_where(Debug; ServerLogin))] pub struct ServerLoginFinishResult { /// The session key between client and server - pub session_key: Output>, + pub session_key: Output>, /// Instance of the ClientRegistration, only used in tests for checking /// zeroize #[cfg(test)] pub state: ServerLogin, } -/// Optional parameters for server login start +/// Optional parameters for server login start and finish #[derive(Clone, Debug, Default)] -pub struct ServerLoginStartParameters<'c, 'i> { +pub struct ServerLoginParameters<'c, 'i> { /// Specifying a context field that the client must agree on pub context: Option<&'c [u8]>, /// Specifying a user identifier and server identifier that will be matched @@ -1054,9 +968,10 @@ pub struct ServerLoginStartParameters<'c, 'i> { #[derive_where(Clone)] #[derive_where( Debug; + as Group>::Pk, voprf::EvaluationElement, - , CS::KeGroup>>::KE2Message, - , CS::KeGroup>>::KE2State, + ::KE2Message, + ::KE2State, )] pub struct ServerLoginStartResult { /// The message to send back to the client @@ -1065,13 +980,13 @@ pub struct ServerLoginStartResult { pub state: ServerLogin, /// Handshake secret, only used in tests #[cfg(test)] - pub handshake_secret: Output>, + pub handshake_secret: Output>, /// Server MAC key, only used in tests #[cfg(test)] - pub server_mac_key: Output>, + pub server_mac_key: Output>, /// OPRF key, only used in tests #[cfg(test)] - pub oprf_key: GenericArray as Group>::ScalarLen>, + pub oprf_key: GenericArray as voprf::Group>::ScalarLen>, } //////////////////////////////////////////////// @@ -1105,8 +1020,8 @@ fn get_password_derived_key( fn oprf_key_material( oprf_seed: &Output>, info: &[&[u8]], -) -> Result as Group>::ScalarLen>, InternalError> { - let mut ikm = GenericArray::<_, as Group>::ScalarLen>::default(); +) -> Result as voprf::Group>::ScalarLen>, InternalError> { + let mut ikm = GenericArray::<_, as voprf::Group>::ScalarLen>::default(); Hkdf::>::from_prk(oprf_seed) .ok() .and_then(|hkdf| hkdf.expand_multi_info(info, &mut ikm).ok()) @@ -1116,8 +1031,8 @@ fn oprf_key_material( } fn oprf_key_from_key_material( - input: GenericArray as Group>::ScalarLen>, -) -> Result as Group>::ScalarLen>, InternalError> { + input: GenericArray as voprf::Group>::ScalarLen>, +) -> Result as voprf::Group>::ScalarLen>, InternalError> { Ok(OprfGroup::::serialize_scalar(voprf::derive_key::< CS::OprfCs, >( @@ -1132,42 +1047,31 @@ fn oprf_key_from_key_material( derive(serde::Deserialize, serde::Serialize), serde(bound = "") )] -#[derive_where(Clone, ZeroizeOnDrop)] +#[derive_where(Clone, Zeroize)] #[derive_where(Debug, Eq, Hash, PartialEq)] pub(crate) struct MaskedResponse { pub(crate) nonce: GenericArray, pub(crate) hash: Output>, - pub(crate) pk: GenericArray::PkLen>, + pub(crate) pk: GenericArray as Group>::PkLen>, } pub(crate) type MaskedResponseLen = - Sum>>, ::PkLen>; + Sum>, NonceLen>, as Group>::PkLen>; impl MaskedResponse { - pub(crate) fn serialize(&self) -> GenericArray> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { - self.nonce.concat(self.hash.clone()).concat(self.pk.clone()) + pub(crate) fn serialize(&self) -> GenericArray> { + self.nonce.concat_ext(&self.hash).concat(self.pk.clone()) } - pub(crate) fn deserialize(bytes: &[u8]) -> Self { - let nonce = NonceLen::USIZE; - let hash = nonce + OutputSize::>::USIZE; - let pk = hash + ::PkLen::USIZE; - - Self { - nonce: GenericArray::clone_from_slice(&bytes[..nonce]), - hash: GenericArray::clone_from_slice(&bytes[nonce..hash]), - pk: GenericArray::clone_from_slice(&bytes[hash..pk]), - } + pub(crate) fn deserialize_take(bytes: &mut &[u8]) -> Result { + Ok(Self { + nonce: bytes.take_array("masked nonce")?, + hash: bytes.take_array("masked hash")?, + pk: bytes.take_array("masked public key")?, + }) } - pub(crate) fn iter(&self) -> impl Iterator { + pub(crate) fn iter(&self) -> impl Clone + Iterator { [self.nonce.as_slice(), &self.hash, &self.pk].into_iter() } } @@ -1175,15 +1079,9 @@ impl MaskedResponse { fn mask_response( masking_key: &[u8], masking_nonce: &[u8], - server_s_pk: &PublicKey, + server_s_pk: &PublicKey>, envelope: &Envelope, -) -> Result, ProtocolError> -where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, -{ +) -> Result, ProtocolError> { let mut xor_pad = GenericArray::<_, MaskedResponseLen>::default(); Hkdf::>::from_prk(masking_key) @@ -1201,20 +1099,14 @@ where *x1 ^= x2 } - Ok(MaskedResponse::deserialize(&xor_pad)) + MaskedResponse::deserialize_take(&mut (xor_pad.as_slice())) } fn unmask_response( masking_key: &[u8], masking_nonce: &[u8], masked_response: &MaskedResponse, -) -> Result<(PublicKey, Envelope), ProtocolError> -where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, -{ +) -> Result<(PublicKey>, Envelope), ProtocolError> { let mut xor_pad = GenericArray::<_, MaskedResponseLen>::default(); Hkdf::>::from_prk(masking_key) @@ -1226,34 +1118,14 @@ where *x1 ^= x2 } - let key_len = ::PkLen::USIZE; - let server_s_pk = PublicKey::deserialize(&xor_pad[..key_len]) - .map_err(|_| ProtocolError::SerializationError)?; - let envelope = Envelope::deserialize(&xor_pad[key_len..])?; + let mut xor_pad = xor_pad.as_slice(); + let server_s_pk = + PublicKey::deserialize_take(&mut xor_pad).map_err(|_| ProtocolError::SerializationError)?; + let envelope = Envelope::deserialize_take(&mut xor_pad)?; Ok((server_s_pk, envelope)) } -#[allow(clippy::type_complexity)] -pub(crate) fn bytestrings_from_identifiers( - ids: Identifiers, - client_s_pk: GenericArray, - server_s_pk: GenericArray, -) -> Result<(Input, Input), ProtocolError> { - let client_identity = if let Some(client) = ids.client { - Input::::from(client)? - } else { - Input::::from_owned(client_s_pk)? - }; - let server_identity = if let Some(server) = ids.server { - Input::::from(server)? - } else { - Input::::from_owned(server_s_pk)? - }; - - Ok((client_identity, server_identity)) -} - /// Internal function for computing the blind result by calling the voprf /// library. Note that for tests, we use the deterministic blinding in order to /// be able to set the blinding factor directly from the passed-in rng. @@ -1266,10 +1138,11 @@ fn blind( #[cfg(test)] let result = { - let mut blind_bytes = GenericArray::<_, as Group>::ScalarLen>::default(); + let mut blind_bytes = + GenericArray::<_, as voprf::Group>::ScalarLen>::default(); let blind = loop { rng.fill_bytes(&mut blind_bytes); - if let Ok(scalar) = as Group>::deserialize_scalar(&blind_bytes) { + if let Ok(scalar) = as voprf::Group>::deserialize_scalar(&blind_bytes) { break scalar; } }; @@ -1278,3 +1151,91 @@ fn blind( Ok(result) } + +////////////////////////// +// Test Implementations // +//===================== // +////////////////////////// + +#[cfg(test)] +use crate::serialization::AssertZeroized; + +#[cfg(test)] +impl AssertZeroized for ClientRegistration { + fn assert_zeroized(&self) { + let Self { + oprf_client, + blinded_element, + } = self; + + for byte in oprf_client + .serialize() + .iter() + .chain(&blinded_element.serialize()) + { + assert_eq!(byte, &0); + } + } +} + +#[cfg(test)] +impl AssertZeroized for ServerRegistration +where + as Group>::Pk: AssertZeroized, +{ + fn assert_zeroized(&self) { + let RegistrationUpload { + envelope, + masking_key, + client_s_pk, + } = &self.0; + + envelope.assert_zeroized(); + + assert_eq!(masking_key, &GenericArray::default()); + client_s_pk.assert_zeroized(); + } +} + +#[cfg(test)] +impl AssertZeroized for ClientLogin +where + ::KE1State: AssertZeroized, + ::KE1Message: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { + ke1_state, + credential_request, + oprf_client, + } = self; + let CredentialRequest { + blinded_element, + ke1_message, + } = credential_request; + + ke1_state.assert_zeroized(); + ke1_message.assert_zeroized(); + + for byte in oprf_client + .serialize() + .iter() + .chain(&blinded_element.serialize()) + { + assert_eq!(byte, &0); + } + } +} + +#[cfg(test)] +impl AssertZeroized for ServerLogin +where + PublicKey>: AssertZeroized, + ::KE2State: AssertZeroized, +{ + fn assert_zeroized(&self) { + let Self { ke2_state } = self; + + ke2_state.assert_zeroized(); + } +} diff --git a/src/serialization/mod.rs b/src/serialization/mod.rs index 0752ecc..bae5ba8 100644 --- a/src/serialization/mod.rs +++ b/src/serialization/mod.rs @@ -6,12 +6,12 @@ // of this source tree. You may select, at your option, one of the above-listed // licenses. -use core::marker::PhantomData; +use core::ops::Add; use digest::Update; -use generic_array::typenum::{U0, U2}; +use generic_array::sequence::Concat; +use generic_array::typenum::Sum; use generic_array::{ArrayLength, GenericArray}; -use hmac::Mac; use crate::errors::ProtocolError; @@ -44,93 +44,19 @@ pub(crate) fn os2ip(input: &[u8]) -> Result { Ok(usize::from_be_bytes(output_array)) } -/// Computes `I2OSP(len(input), max_bytes) || input` and helps hold output -/// without allocation. -pub(crate) struct Input<'a, L1: ArrayLength, L2: ArrayLength = U0, L3: ArrayLength = U0> -{ - octet: GenericArray, - input: InnerInput<'a, L2, L3>, -} - -enum InnerInput<'a, L1: ArrayLength, L2: ArrayLength> { - Owned(GenericArray), - Borrowed(&'a [u8]), - Label(([&'a [u8]; 2], PhantomData)), -} - -impl<'a, L1: ArrayLength, L2: ArrayLength, L3: ArrayLength> Input<'a, L1, L2, L3> { - // Variation of `serialize` that takes a borrowed `input - pub(crate) fn from(input: &'a [u8]) -> Result, ProtocolError> { - Ok(Input { - octet: i2osp::(input.len())?, - input: InnerInput::Borrowed(input), - }) - } - - // Variation of `serialize` that takes an owned `input` - pub(crate) fn from_owned( - input: GenericArray, - ) -> Result, ProtocolError> { - Ok(Input { - octet: i2osp::(input.len())?, - input: InnerInput::Owned(input), - }) - } - - // Variation of `serialize` that takes a label - pub(crate) fn from_label( - opaque: &'a [u8], - label: &'a [u8], - ) -> Result, ProtocolError> { - Ok(Input { - octet: i2osp::(opaque.len() + label.len())?, - input: InnerInput::Label(([opaque, label], PhantomData)), - }) - } - - pub(crate) fn iter(&self) -> impl Iterator { - // Some magic to make it output the same type in all branches. - [self.octet.as_slice()] - .into_iter() - .chain(match &self.input { - InnerInput::Owned(bytes) => [bytes.as_slice()], - InnerInput::Borrowed(bytes) => [*bytes], - InnerInput::Label((iter, _)) => [iter[0]], - }) - .chain(if let InnerInput::Label((iter, _)) = &self.input { - Some(iter[1]) - } else { - None - }) - } -} - -impl, L2: ArrayLength> Input<'_, L1, L2, U0> { - pub(crate) fn to_array_2(&self) -> [&[u8]; 2] { - let input = match &self.input { - InnerInput::Borrowed(value) => value, - InnerInput::Owned(value) => value.as_slice(), - _ => unreachable!("unexpected `Serialize` constructed with wrong generics"), - }; - - [self.octet.as_slice(), input] - } -} - -impl, L2: ArrayLength> Input<'_, L1, L2, U2> { - pub(crate) fn to_array_3(&self) -> [&[u8]; 3] { - match self.input { - InnerInput::Label((label, _)) => [self.octet.as_slice(), label[0], label[1]], - _ => unreachable!("unexpected `Serialize` constructed with wrong generics"), - } - } -} - pub(crate) trait UpdateExt { + fn update_iter<'a>(&mut self, iter: impl Iterator); + fn chain_iter<'a>(self, iter: impl Iterator) -> Self; } impl UpdateExt for T { + fn update_iter<'a>(&mut self, iter: impl Iterator) { + for bytes in iter { + self.update(bytes); + } + } + fn chain_iter<'a>(self, iter: impl Iterator) -> Self { let mut self_ = self; @@ -142,18 +68,62 @@ impl UpdateExt for T { } } -pub(crate) trait MacExt { - fn update_iter<'a>(&mut self, iter: impl Iterator); +pub(crate) trait SliceExt { + fn take_array>( + self: &mut &Self, + name: &'static str, + ) -> Result, ProtocolError>; } -impl MacExt for T { - fn update_iter<'a>(&mut self, iter: impl Iterator) { - for bytes in iter { - self.update(bytes); +impl SliceExt for [u8] { + fn take_array>( + self: &mut &Self, + name: &'static str, + ) -> Result, ProtocolError> { + if L::USIZE > self.len() { + return Err(ProtocolError::SizeError { + name, + len: L::USIZE, + actual_len: self.len(), + }); } + + let (front, back) = self.split_at(L::USIZE); + *self = back; + Ok(GenericArray::clone_from_slice(front)) } } +pub(crate) trait GenericArrayExt> { + type Output: ArrayLength; + + /// This allows us to concat two [`GenericArray`]s but with `where` bounds + /// `Other + Self`. Because sometimes `Self + Other` doesn't imply the + /// bounds and we have to add them to every call. + fn concat_ext(&self, rest: &GenericArray) -> GenericArray; +} + +impl, O: ArrayLength> GenericArrayExt for GenericArray +where + O: Add, + Sum: ArrayLength, +{ + type Output = Sum; + + fn concat_ext(&self, other: &GenericArray) -> GenericArray { + let mut output = GenericArray::::default().concat(GenericArray::::default()); + output[..L::USIZE].copy_from_slice(self); + output[L::USIZE..].copy_from_slice(other); + + output + } +} + +#[cfg(test)] +pub(crate) trait AssertZeroized { + fn assert_zeroized(&self); +} + #[cfg(test)] mod tests; diff --git a/src/serialization/tests.rs b/src/serialization/tests.rs index fc3e068..6b422a1 100644 --- a/src/serialization/tests.rs +++ b/src/serialization/tests.rs @@ -17,17 +17,17 @@ use proptest::collection::vec; use proptest::prelude::*; use rand::rngs::OsRng; use rand::RngCore; -use voprf::Group; +use voprf::Group as _; -use crate::ciphersuite::{CipherSuite, OprfGroup, OprfHash}; +use crate::ciphersuite::{CipherSuite, KeGroup, OprfGroup, OprfHash}; use crate::envelope::{Envelope, EnvelopeLen, InnerEnvelopeMode}; use crate::errors::*; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::NonceLen; use crate::key_exchange::traits::{ Deserialize, Ke1MessageLen, Ke1StateLen, Ke2MessageLen, KeyExchange, Serialize, }; -use crate::key_exchange::tripledh::{NonceLen, TripleDh}; use crate::keypair::KeyPair; use crate::messages::CredentialResponseWithoutKeLen; use crate::opaque::{ClientLoginLen, ClientRegistrationLen, MaskedResponseLen}; @@ -35,47 +35,101 @@ use crate::serialization::{i2osp, os2ip}; use crate::*; #[cfg(feature = "ristretto255")] -struct Ristretto255; +struct TripleDhRistretto255; #[cfg(feature = "ristretto255")] -impl CipherSuite for Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; +impl CipherSuite for TripleDhRistretto255 { + type OprfCs = Ristretto255; + type KeyExchange = TripleDh; type Ksf = crate::ksf::Identity; } -struct P256; +#[cfg(all(feature = "ristretto255", feature = "curve25519"))] +struct TripleDhCurve25519; -impl CipherSuite for P256 { +#[cfg(all(feature = "ristretto255", feature = "curve25519"))] +impl CipherSuite for TripleDhCurve25519 { + type OprfCs = Ristretto255; + type KeyExchange = TripleDh; + type Ksf = crate::ksf::Identity; +} + +struct TripleDhP256; + +impl CipherSuite for TripleDhP256 { type OprfCs = ::p256::NistP256; - type KeGroup = ::p256::NistP256; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh<::p256::NistP256, sha2::Sha256>; type Ksf = crate::ksf::Identity; } -struct P384; +struct TripleDhP384; -impl CipherSuite for P384 { +impl CipherSuite for TripleDhP384 { type OprfCs = ::p384::NistP384; - type KeGroup = ::p384::NistP384; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh<::p384::NistP384, sha2::Sha384>; type Ksf = crate::ksf::Identity; } -struct P521; +struct TripleDhP521; -impl CipherSuite for P521 { +impl CipherSuite for TripleDhP521 { type OprfCs = ::p521::NistP521; - type KeGroup = ::p521::NistP521; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh<::p521::NistP521, sha2::Sha512>; type Ksf = crate::ksf::Identity; } -fn random_point() -> ::Pk { +#[cfg(feature = "ecdsa")] +struct SigmaIP256; + +#[cfg(feature = "ecdsa")] +impl CipherSuite for SigmaIP256 { + type OprfCs = ::p256::NistP256; + type KeyExchange = + SigmaI, ::p256::NistP256, sha2::Sha256>; + type Ksf = crate::ksf::Identity; +} + +#[cfg(feature = "ecdsa")] +struct SigmaIP384; + +#[cfg(feature = "ecdsa")] +impl CipherSuite for SigmaIP384 { + type OprfCs = ::p384::NistP384; + type KeyExchange = + SigmaI, ::p384::NistP384, sha2::Sha384>; + type Ksf = crate::ksf::Identity; +} + +#[cfg(all(feature = "ristretto255", feature = "ed25519",))] +struct SigmaIEd25519; + +#[cfg(all(feature = "ristretto255", feature = "ed25519",))] +impl CipherSuite for SigmaIEd25519 { + type OprfCs = Ristretto255; + type KeyExchange = SigmaI, Ristretto255, sha2::Sha512>; + type Ksf = crate::ksf::Identity; +} + +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +struct SigmaIEd25519Ph; + +#[cfg(all(feature = "ristretto255", feature = "ed25519",))] +impl CipherSuite for SigmaIEd25519Ph { + type OprfCs = Ristretto255; + type KeyExchange = SigmaI, Ristretto255, sha2::Sha512>; + type Ksf = crate::ksf::Identity; +} + +fn random_point() -> as Group>::Pk { let mut rng = OsRng; - let sk = CS::KeGroup::random_sk(&mut rng); - CS::KeGroup::public_key(sk) + let sk = KeGroup::::random_sk(&mut rng); + KeGroup::::public_key(sk) +} + +fn random_element() -> as voprf::Group>::Elem { + let mut rng = OsRng; + let scalar = OprfGroup::::random_scalar(&mut rng); + OprfGroup::::base_elem() * &scalar } #[test] @@ -83,7 +137,7 @@ fn client_registration_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where // ClientRegistration: KgSk + KgPk - as Group>::ScalarLen: Add< as Group>::ElemLen>, + as voprf::Group>::ScalarLen: Add< as voprf::Group>::ElemLen>, ClientRegistrationLen: ArrayLength, { let pw = b"hunter2"; @@ -106,10 +160,20 @@ fn client_registration_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; Ok(()) } @@ -118,12 +182,9 @@ fn client_registration_roundtrip() -> Result<(), ProtocolError> { fn server_registration_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload @@ -142,7 +203,7 @@ fn server_registration_roundtrip() -> Result<(), ProtocolError> { // length-MAC_SIZE hmac mock_envelope_bytes.extend_from_slice(&Output::>::default()); - let mock_client_kp = KeyPair::::generate_random::(&mut rng); + let mock_client_kp = KeyPair::>::derive_random(&mut rng); // serialization order: oprf_key, public key, envelope let mut bytes = Vec::::new(); bytes.extend_from_slice(&mock_client_kp.public().serialize()); @@ -155,10 +216,20 @@ fn server_registration_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; Ok(()) } @@ -166,11 +237,11 @@ fn server_registration_roundtrip() -> Result<(), ProtocolError> { #[test] fn registration_request_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> { - let pt = random_point::(); - let pt_bytes = CS::KeGroup::serialize_pk(pt); + let elem = random_element::(); + let elem_bytes = OprfGroup::::serialize_elem(elem); let mut input = Vec::new(); - input.extend_from_slice(&pt_bytes); + input.extend_from_slice(&elem_bytes); let r1 = RegistrationRequest::::deserialize(&input)?; let r1_bytes = r1.serialize(); @@ -191,10 +262,20 @@ fn registration_request_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; Ok(()) } @@ -204,13 +285,13 @@ fn registration_response_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where // RegistrationResponse: KgPk + KePk - as Group>::ElemLen: Add<::PkLen>, + as voprf::Group>::ElemLen: Add< as Group>::PkLen>, RegistrationResponseLen: ArrayLength, { - let pt = random_point::(); - let beta_bytes = CS::KeGroup::serialize_pk(pt); + let elem = random_element::(); + let beta_bytes = OprfGroup::::serialize_elem(elem); let mut rng = OsRng; - let skp = KeyPair::::generate_random::(&mut rng); + let skp = KeyPair::>::derive_random(&mut rng); let pubkey_bytes = skp.public().serialize(); let mut input = Vec::new(); @@ -238,10 +319,20 @@ fn registration_response_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; Ok(()) } @@ -250,17 +341,14 @@ fn registration_response_roundtrip() -> Result<(), ProtocolError> { fn registration_upload_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, { let mut rng = OsRng; - let skp = KeyPair::::generate_random::(&mut rng); + let skp = KeyPair::>::derive_random(&mut rng); let pubkey_bytes = skp.public().serialize(); let mut key = [0u8; 32]; @@ -295,27 +383,38 @@ fn registration_upload_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(feature = "ecdsa")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "ed25519"))] + inner::()?; Ok(()) } #[test] -fn credential_request_roundtrip() -> Result<(), ProtocolError> { +fn triple_dh_credential_request_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where + ::KE1Message: Deserialize + Serialize, // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, { let mut rng = OsRng; - let alpha = random_point::(); - let alpha_bytes = CS::KeGroup::serialize_pk(alpha); + let alpha = random_element::(); + let alpha_bytes = OprfGroup::::serialize_elem(alpha); - let client_e_kp = KeyPair::::generate_random::(&mut rng); + let client_e_kp = KeyPair::>::derive_random(&mut rng); let mut client_nonce = [0u8; NonceLen::USIZE]; rng.fill_bytes(&mut client_nonce); @@ -348,34 +447,33 @@ fn credential_request_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn credential_response_roundtrip() -> Result<(), ProtocolError> { +fn triple_dh_credential_response_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where + ::KE2Message: Deserialize, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { - let pt = random_point::(); - let pt_bytes = CS::KeGroup::serialize_pk(pt); + let elem = random_element::(); + let elem_bytes = OprfGroup::::serialize_elem(elem); let mut rng = OsRng; @@ -383,10 +481,10 @@ fn credential_response_roundtrip() -> Result<(), ProtocolError> { rng.fill_bytes(&mut masking_nonce); let mut masked_response = - vec![0u8; as Group>::ElemLen::USIZE + Envelope::::len()]; + vec![0u8; as voprf::Group>::ElemLen::USIZE + Envelope::::len()]; rng.fill_bytes(&mut masked_response); - let server_e_kp = KeyPair::::generate_random::(&mut rng); + let server_e_kp = KeyPair::>::derive_random(&mut rng); let mut mac = Output::>::default(); rng.fill_bytes(&mut mac); let mut server_nonce = [0u8; NonceLen::USIZE]; @@ -399,6 +497,94 @@ fn credential_response_roundtrip() -> Result<(), ProtocolError> { ] .concat(); + let mut input = Vec::new(); + input.extend_from_slice(&elem_bytes); + input.extend_from_slice(&masking_nonce); + input.extend_from_slice(&masked_response); + input.extend_from_slice(&ke2m); + + let l2 = CredentialResponse::::deserialize(&input).unwrap(); + let l2_bytes = l2.serialize(); + assert_eq!(input, *l2_bytes); + + // Assert that identity group element is rejected + let identity = OprfGroup::::identity_elem(); + let identity_bytes = OprfGroup::::serialize_elem(identity).to_vec(); + + assert!(matches!( + CredentialResponse::::deserialize( + &[ + identity_bytes, + masking_nonce.to_vec(), + masked_response, + ke2m.to_vec() + ] + .concat() + ), + Err(ProtocolError::LibraryError(InternalError::OprfError( + voprf::Error::Deserialization, + ))) + )); + + Ok(()) + } + + #[cfg(feature = "ristretto255")] + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + + Ok(()) +} + +#[test] +#[cfg(feature = "ecdsa")] +fn sigma_i_ecdsa_credential_response_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE2Message: Deserialize, + // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, + CredentialResponseWithoutKeLen: ArrayLength, + // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, + CredentialResponseWithoutKeLen: Add>, + CredentialResponseLen: ArrayLength, + { + let pt = random_point::(); + let pt_bytes = KeGroup::::serialize_pk(pt); + + let mut rng = OsRng; + + let mut masking_nonce = [0u8; 32]; + rng.fill_bytes(&mut masking_nonce); + + let mut masked_response = + vec![0u8; as voprf::Group>::ElemLen::USIZE + Envelope::::len()]; + rng.fill_bytes(&mut masked_response); + + let server_e_kp = KeyPair::>::derive_random(&mut rng); + let r = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let s = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let mut mac = Output::>::default(); + rng.fill_bytes(&mut mac); + let mut server_nonce = [0u8; NonceLen::USIZE]; + rng.fill_bytes(&mut server_nonce); + + let ke2m: Vec = [ + server_nonce.as_ref(), + server_e_kp.public().serialize().as_ref(), + &r, + &s, + &mac, + ] + .concat(); + let mut input = Vec::new(); input.extend_from_slice(&pt_bytes); input.extend_from_slice(&masking_nonce); @@ -431,18 +617,18 @@ fn credential_response_roundtrip() -> Result<(), ProtocolError> { Ok(()) } - #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn credential_finalization_roundtrip() -> Result<(), ProtocolError> { - fn inner() -> Result<(), ProtocolError> { +fn triple_dh_credential_finalization_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE3Message: Deserialize + Serialize, + { let mut rng = OsRng; let mut mac = Output::>::default(); rng.fill_bytes(&mut mac); @@ -457,31 +643,70 @@ fn credential_finalization_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn client_login_roundtrip() -> Result<(), ProtocolError> { +#[cfg(feature = "ecdsa")] +fn sigma_i_ecdsa_credential_finalization_roundtrip() -> Result<(), ProtocolError> { fn inner() -> Result<(), ProtocolError> where + ::KE3Message: Deserialize + Serialize, + { + let mut rng = OsRng; + + let r = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let s = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + + let mut mac = Output::>::default(); + rng.fill_bytes(&mut mac); + + let mut input = Vec::new(); + input.extend_from_slice(&r); + input.extend_from_slice(&s); + input.extend_from_slice(&mac); + + let l3 = CredentialFinalization::::deserialize(&input)?; + let l3_bytes = l3.serialize(); + assert_eq!(input.as_slice(), l3_bytes.as_slice()); + + Ok(()) + } + + inner::()?; + inner::()?; + + Ok(()) +} + +#[test] +fn triple_dh_client_login_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE1Message: Deserialize, + ::KE1State: Deserialize, // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + ::KE1Message: Serialize, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, // ClientLogin: KgSk + CredentialRequest + Ke1State - as Group>::ScalarLen: Add>, - Sum< as Group>::ScalarLen, CredentialRequestLen>: + as voprf::Group>::ScalarLen: Add>, + ::KE1State: Serialize, + Sum< as voprf::Group>::ScalarLen, CredentialRequestLen>: ArrayLength + Add>, ClientLoginLen: ArrayLength, { let pw = b"hunter2"; let mut rng = OsRng; - let client_e_kp = KeyPair::::generate_random::(&mut rng); + let client_e_kp = KeyPair::>::derive_random(&mut rng); let mut client_nonce = [0; NonceLen::USIZE]; rng.fill_bytes(&mut client_nonce); @@ -495,14 +720,14 @@ fn client_login_roundtrip() -> Result<(), ProtocolError> { let credential_request = CredentialRequest:: { blinded_element: blind_result.message, - ke1_message: - , CS::KeGroup>>::KE1Message::deserialize( - &[ - client_nonce.as_ref(), - client_e_kp.public().serialize().as_ref(), - ] - .concat(), - )?, + ke1_message: ::KE1Message::deserialize_take( + &mut ([ + client_nonce.as_ref(), + client_e_kp.public().serialize().as_ref(), + ] + .concat() + .as_slice()), + )?, }; let bytes: Vec = blind_result @@ -520,20 +745,25 @@ fn client_login_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn ke1_message_roundtrip() -> Result<(), ProtocolError> { - fn inner() -> Result<(), ProtocolError> { +fn triple_dh_ke1_message_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE1Message: Deserialize + Serialize, + { let mut rng = OsRng; - let client_e_kp = KeyPair::::generate_random::(&mut rng); + let client_e_kp = KeyPair::>::derive_random(&mut rng); let mut client_nonce = vec![0u8; NonceLen::USIZE]; rng.fill_bytes(&mut client_nonce); @@ -543,9 +773,7 @@ fn ke1_message_roundtrip() -> Result<(), ProtocolError> { ] .concat(); let reg = - , CS::KeGroup>>::KE1Message::deserialize( - &ke1m, - )?; + ::KE1Message::deserialize_take(&mut (ke1m.as_slice()))?; let reg_bytes = reg.serialize(); assert_eq!(*reg_bytes, ke1m); @@ -553,20 +781,25 @@ fn ke1_message_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn ke2_message_roundtrip() -> Result<(), ProtocolError> { - fn inner() -> Result<(), ProtocolError> { +fn triple_dh_ke2_message_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE2Message: Deserialize + Serialize, + { let mut rng = OsRng; - let server_e_kp = KeyPair::::generate_random::(&mut rng); + let server_e_kp = KeyPair::>::derive_random(&mut rng); let mut mac = Output::>::default(); rng.fill_bytes(&mut mac); let mut server_nonce = vec![0u8; NonceLen::USIZE]; @@ -580,9 +813,7 @@ fn ke2_message_roundtrip() -> Result<(), ProtocolError> { .concat(); let reg = - , CS::KeGroup>>::KE2Message::deserialize( - &ke2m, - )?; + ::KE2Message::deserialize_take(&mut (ke2m.as_slice()))?; let reg_bytes = reg.serialize(); assert_eq!(*reg_bytes, ke2m); @@ -590,17 +821,62 @@ fn ke2_message_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; Ok(()) } #[test] -fn ke3_message_roundtrip() -> Result<(), ProtocolError> { - fn inner() -> Result<(), ProtocolError> { +#[cfg(feature = "ecdsa")] +fn sigma_i_ecdsa_ke2_message_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE2Message: Deserialize + Serialize, + { + let mut rng = OsRng; + + let server_e_kp = KeyPair::>::derive_random(&mut rng); + let mut mac = Output::>::default(); + rng.fill_bytes(&mut mac); + let mut server_nonce = vec![0u8; NonceLen::USIZE]; + rng.fill_bytes(&mut server_nonce); + let r = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let s = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + + let ke2m: Vec = [ + server_nonce.as_slice(), + server_e_kp.public().serialize().as_ref(), + &r, + &s, + &mac, + ] + .concat(); + + let reg = + ::KE2Message::deserialize_take(&mut (ke2m.as_slice()))?; + let reg_bytes = reg.serialize(); + assert_eq!(*reg_bytes, ke2m); + + Ok(()) + } + + inner::()?; + inner::()?; + + Ok(()) +} + +#[test] +fn triple_dh_ke3_message_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE3Message: Deserialize + Serialize, + { let mut rng = OsRng; let mut mac = Output::>::default(); rng.fill_bytes(&mut mac); @@ -608,9 +884,7 @@ fn ke3_message_roundtrip() -> Result<(), ProtocolError> { let ke3m: Vec = [mac].concat(); let reg = - , CS::KeGroup>>::KE3Message::deserialize( - &ke3m, - )?; + ::KE3Message::deserialize_take(&mut (ke3m.as_slice()))?; let reg_bytes = reg.serialize(); assert_eq!(*reg_bytes, ke3m); @@ -618,10 +892,41 @@ fn ke3_message_roundtrip() -> Result<(), ProtocolError> { } #[cfg(feature = "ristretto255")] - inner::()?; - inner::()?; - inner::()?; - inner::()?; + inner::()?; + #[cfg(all(feature = "ristretto255", feature = "curve25519"))] + inner::()?; + inner::()?; + inner::()?; + inner::()?; + + Ok(()) +} + +#[test] +#[cfg(feature = "ecdsa")] +fn sigma_i_ecdsa_ke3_message_roundtrip() -> Result<(), ProtocolError> { + fn inner() -> Result<(), ProtocolError> + where + ::KE3Message: Deserialize + Serialize, + { + let mut rng = OsRng; + let r = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let s = KeGroup::::serialize_sk(KeGroup::::random_sk(&mut rng)); + let mut mac = Output::>::default(); + rng.fill_bytes(&mut mac); + + let ke3m: Vec = [mac.as_slice(), &r, &s].concat(); + + let reg = + ::KE3Message::deserialize_take(&mut (ke3m.as_slice()))?; + let reg_bytes = reg.serialize(); + assert_eq!(*reg_bytes, ke3m); + + Ok(()) + } + + inner::()?; + inner::()?; Ok(()) } @@ -672,7 +977,7 @@ macro_rules! test { #[test] fn test_nocrash_credential_request(bytes in vec(any::(), 0..500)) { - let _ = CredentialRequest::<$CS>::deserialize(&bytes).map_or(true, |_| true); + let _ = CredentialRequest::<$CS>::deserialize(&mut (bytes.as_slice())).map_or(true, |_| true); } #[test] @@ -710,7 +1015,17 @@ macro_rules! test { } #[cfg(feature = "ristretto255")] -test!(ristretto255, Ristretto255); -test!(p256, P256); -test!(p384, P384); -test!(p521, P521); +test!(triple_dh_ristretto255, TripleDhRistretto255); +#[cfg(all(feature = "ristretto255", feature = "curve25519"))] +test!(triple_dh_curve25519, TripleDhCurve25519); +test!(triple_dh_p256, TripleDhP256); +test!(triple_dh_p384, TripleDhP384); +test!(triple_dh_p521, TripleDhP521); +#[cfg(feature = "ecdsa")] +test!(sigma_i_p256, SigmaIP256); +#[cfg(feature = "ecdsa")] +test!(sigma_i_p384, SigmaIP384); +#[cfg(all(feature = "ristretto255", feature = "ed25519",))] +test!(sigma_i_ed25519, SigmaIEd25519); +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +test!(sigma_i_ed25519_ph, SigmaIEd25519Ph); diff --git a/src/tests/full_test.rs b/src/tests/full_test.rs index e07a8bb..d58a319 100644 --- a/src/tests/full_test.rs +++ b/src/tests/full_test.rs @@ -15,232 +15,177 @@ use std::{format, println, ptr, vec}; use digest::Output; use generic_array::typenum::{Sum, Unsigned}; -use generic_array::ArrayLength; +use generic_array::{ArrayLength, GenericArray}; use rand::rngs::OsRng; use serde_json::Value; use subtle::ConstantTimeEq; -use voprf::Group; +use voprf::Group as _; -use crate::ciphersuite::{CipherSuite, OprfGroup, OprfHash}; +use crate::ciphersuite::{CipherSuite, KeGroup, OprfGroup, OprfHash}; use crate::envelope::EnvelopeLen; use crate::errors::*; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; -use crate::key_exchange::traits::{Ke1MessageLen, Ke1StateLen, Ke2MessageLen}; -use crate::key_exchange::tripledh::{DiffieHellman, NonceLen, TripleDh}; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::NonceLen; +use crate::key_exchange::traits::{ + Deserialize, Ke1MessageLen, Ke1StateLen, Ke2MessageLen, KeyExchange, Serialize, +}; use crate::ksf::Identity; use crate::messages::{ CredentialRequestLen, CredentialResponseLen, CredentialResponseWithoutKeLen, RegistrationResponseLen, RegistrationUploadLen, }; use crate::opaque::*; +use crate::serialization::AssertZeroized; use crate::tests::mock_rng::CycleRng; use crate::*; // Tests // ===== -#[cfg(feature = "ristretto255")] -struct Ristretto255; +macro_rules! ciphersuite_types { + ($(#[$attr:meta])* $name:ident, $oprf:ty, $ke:ty, $par:tt) => { + $(#[$attr])* + struct $name; -#[cfg(feature = "ristretto255")] -impl CipherSuite for Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; - type Ksf = Identity; + $(#[$attr])* + impl CipherSuite for $name { + type OprfCs = $oprf; + type KeyExchange = $ke; + type Ksf = Identity; + } + }; } -#[cfg(feature = "ristretto255")] -struct Ristretto255P256; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for Ristretto255P256 { - type OprfCs = p256::NistP256; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; - type Ksf = Identity; +macro_rules! generate { + ($(#[$attr:meta])* $name:ident, $oprf:ty, $ke:ty, ($output:ident)) => { + paste::paste! { + $(#[$attr])* + { + let parameters = generate_parameters::<$name>()?; + $( + $output.push_str(&format!("#[{}]\n", stringify!($attr))); + )* + $output.push_str(&format!( + "pub static {}: &str = r#\"\n{}\"#;\n", + stringify!([]), + stringify_test_vectors(¶meters) + )); + } + } + }; } -#[cfg(feature = "ristretto255")] -struct Ristretto255P384; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for Ristretto255P384 { - type OprfCs = p384::NistP384; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; - type Ksf = Identity; +macro_rules! run_all { + ($(#[$attr:meta])* $name:ident, $oprf:ty, $ke:ty, ($fn:ident $(, $par:expr)*)) => { + paste::paste! { + $(#[$attr])* + $fn::<$name>(super::full_test_vectors::[] $(, $par)*)?; + } + }; } -#[cfg(feature = "ristretto255")] -struct Ristretto255P521; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for Ristretto255P521 { - type OprfCs = p521::NistP521; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; - type Ksf = Identity; +macro_rules! oprf_ciphersuites { + ($macro:ident!$par:tt => [$($(#[$ke_attr:meta])* [$ke_name:ident, $ke:ty$(,)?]),+$(,)?]) => { + $( + oprf_ciphersuites!( + $macro!$par => + $(#[$ke_attr])* [$ke_name, $ke], + [ + #[cfg(feature = "ristretto255")] [ + Ristretto255, crate::Ristretto255, + ], + [P256, p256::NistP256], + [P384, p384::NistP384], + [P521, p521::NistP521], + ], + ); + )+ + }; + ( + $macro:ident!$par:tt => + #[$ke_attr_1:meta] #[$ke_attr_2:meta] [$ke_name:ident, $ke:ty], + [$($(#[$oprf_attr:meta])? [$oprf_name:ident, $oprf:ty$(,)?]),+$(,)?], + ) => { + paste::paste! { + $($macro!(#[$ke_attr_1] #[$ke_attr_2] $(#[$oprf_attr])? [<$oprf_name $ke_name>], $oprf, $ke, $par);)+ + } + }; + ( + $macro:ident!$par:tt => + #[$ke_attr:meta] [$ke_name:ident, $ke:ty], + [$($(#[$oprf_attr:meta])? [$oprf_name:ident, $oprf:ty$(,)?]),+$(,)?], + ) => { + paste::paste! { + $($macro!(#[$ke_attr] $(#[$oprf_attr])? [<$oprf_name $ke_name>], $oprf, $ke, $par);)+ + } + }; + ( + $macro:ident!$par:tt => + [$ke_name:ident, $ke:ty], + [$($(#[$oprf_attr:meta])? [$oprf_name:ident, $oprf:ty$(,)?]),+$(,)?], + ) => { + paste::paste! { + $($macro!($(#[$oprf_attr])? [<$oprf_name $ke_name>], $oprf, $ke, $par);)+ + } + } } -struct P256; - -impl CipherSuite for P256 { - type OprfCs = p256::NistP256; - type KeGroup = p256::NistP256; - type KeyExchange = TripleDh; - type Ksf = Identity; +macro_rules! triple_dh_ciphersuites { + ($macro:ident!$par:tt) => { + oprf_ciphersuites!( + $macro!$par => [ + #[cfg(feature = "ristretto255")] [ + TripleDhRistretto255, TripleDh, + ], + [TripleDhP256, TripleDh], + [TripleDhP384, TripleDh], + [TripleDhP521, TripleDh], + #[cfg(feature = "curve25519")] [ + TripleDhCurve25519, TripleDh, + ], + ] + ); + }; } -struct P256P384; - -impl CipherSuite for P256P384 { - type OprfCs = p384::NistP384; - type KeGroup = p256::NistP256; - type KeyExchange = TripleDh; - type Ksf = Identity; +macro_rules! sigma_i_ciphersuites { + ($macro:ident!$par:tt) => { + sigma_i_ciphersuites!( + $macro!$par => [ + #[cfg(feature = "ecdsa")] [P256, Ecdsa], + #[cfg(feature = "ecdsa")] [P384, Ecdsa], + #[cfg(feature = "ed25519")] [Ed25519, PureEddsa], + #[cfg(feature = "ed25519")] [Ed25519Ph, HashEddsa], + ], + ); + }; + ( + $macro:ident!$par:tt => + [$($(#[$sig_attr:meta])? [$sig_name:ident, $sig:ty]),+$(,)?], + ) => { + paste::paste! { + $( + oprf_ciphersuites!( + $macro!$par => [ + $(#[$sig_attr])? #[cfg(feature = "ristretto255")] [ + [], SigmaI<$sig, crate::Ristretto255, sha2::Sha512>, + ], + $(#[$sig_attr])? [[], SigmaI<$sig, p256::NistP256, sha2::Sha256>], + $(#[$sig_attr])? [[], SigmaI<$sig, p384::NistP384, sha2::Sha384>], + $(#[$sig_attr])? [[], SigmaI<$sig, p521::NistP521, sha2::Sha512>], + $(#[$sig_attr])? #[cfg(feature = "curve25519")] [ + [], SigmaI<$sig, crate::Curve25519, sha2::Sha512>, + ], + ] + ); + )+ + } + }; } -struct P256P521; - -impl CipherSuite for P256P521 { - type OprfCs = p521::NistP521; - type KeGroup = p256::NistP256; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "ristretto255")] -struct P256Ristretto255; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for P256Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = p256::NistP256; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P384; - -impl CipherSuite for P384 { - type OprfCs = p384::NistP384; - type KeGroup = p384::NistP384; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P384P256; - -impl CipherSuite for P384P256 { - type OprfCs = p256::NistP256; - type KeGroup = p384::NistP384; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P384P521; - -impl CipherSuite for P384P521 { - type OprfCs = p521::NistP521; - type KeGroup = p384::NistP384; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "ristretto255")] -struct P384Ristretto255; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for P384Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = p384::NistP384; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P521; - -impl CipherSuite for P521 { - type OprfCs = p521::NistP521; - type KeGroup = p521::NistP521; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P521P256; - -impl CipherSuite for P521P256 { - type OprfCs = p256::NistP256; - type KeGroup = p521::NistP521; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -struct P521P384; - -impl CipherSuite for P521P384 { - type OprfCs = p384::NistP384; - type KeGroup = p521::NistP521; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "ristretto255")] -struct P521Ristretto255; - -#[cfg(feature = "ristretto255")] -impl CipherSuite for P521Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = p521::NistP521; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(all(feature = "curve25519", feature = "ristretto255"))] -struct Curve25519Ristretto255; - -#[cfg(all(feature = "curve25519", feature = "ristretto255"))] -impl CipherSuite for Curve25519Ristretto255 { - type OprfCs = crate::Ristretto255; - type KeGroup = crate::Curve25519; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "curve25519")] -struct Curve25519P256; - -#[cfg(feature = "curve25519")] -impl CipherSuite for Curve25519P256 { - type OprfCs = p256::NistP256; - type KeGroup = crate::Curve25519; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "curve25519")] -struct Curve25519P384; - -#[cfg(feature = "curve25519")] -impl CipherSuite for Curve25519P384 { - type OprfCs = p384::NistP384; - type KeGroup = crate::Curve25519; - type KeyExchange = TripleDh; - type Ksf = Identity; -} - -#[cfg(feature = "curve25519")] -struct Curve25519P521; - -#[cfg(feature = "curve25519")] -impl CipherSuite for Curve25519P521 { - type OprfCs = p521::NistP521; - type KeGroup = crate::Curve25519; - type KeyExchange = TripleDh; - type Ksf = Identity; -} +triple_dh_ciphersuites!(ciphersuite_types!()); +sigma_i_ciphersuites!(ciphersuite_types!()); pub struct TestVectorParameters { pub client_s_pk: Vec, @@ -263,6 +208,8 @@ pub struct TestVectorParameters { pub envelope_nonce: Vec, pub client_nonce: Vec, pub server_nonce: Vec, + pub server_sig_rng: Vec, + pub client_sig_rng: Vec, pub context: Vec, pub registration_request: Vec, pub registration_response: Vec, @@ -281,44 +228,6 @@ pub struct TestVectorParameters { static STR_PASSWORD: &str = "password"; static STR_CREDENTIAL_IDENTIFIER: &str = "credential_identifier"; -macro_rules! run_all { - ($name:ident $(, $par:expr)*) => { - use super::full_test_vectors; - - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_RISTRETTO255 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_RISTRETTO255_P256 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_RISTRETTO255_P384 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_RISTRETTO255_P521 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P256 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P256_P384 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P256_P521 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_P256_RISTRETTO255 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P384 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P384_P256 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P384_P521 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_P384_RISTRETTO255 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P521 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P521_P256 $(, $par)*)?; - $name::(full_test_vectors::TEST_VECTOR_P521_P384 $(, $par)*)?; - #[cfg(feature = "ristretto255")] - $name::(full_test_vectors::TEST_VECTOR_P521_RISTRETTO255 $(, $par)*)?; - #[cfg(feature = "curve25519")] - $name::(full_test_vectors::TEST_VECTOR_CURVE25519_P256 $(, $par)*)?; - #[cfg(feature = "curve25519")] - $name::(full_test_vectors::TEST_VECTOR_CURVE25519_P384 $(, $par)*)?; - #[cfg(feature = "curve25519")] - $name::(full_test_vectors::TEST_VECTOR_CURVE25519_P521 $(, $par)*)?; - #[cfg(all(feature = "curve25519", feature = "ristretto255"))] - $name::(full_test_vectors::TEST_VECTOR_CURVE25519_RISTRETTO255 $(, $par)*)?; - }; -} - fn decode(values: &Value, key: &str) -> Option> { values[key].as_str().and_then(|s| hex::decode(s).ok()) } @@ -345,6 +254,8 @@ fn populate_test_vectors(values: &Value) -> TestVectorParameters { envelope_nonce: decode(values, "envelope_nonce").unwrap(), client_nonce: decode(values, "client_nonce").unwrap(), server_nonce: decode(values, "server_nonce").unwrap(), + server_sig_rng: decode(values, "server_sig_rng").unwrap(), + client_sig_rng: decode(values, "client_sig_rng").unwrap(), context: decode(values, "context").unwrap(), registration_request: decode(values, "registration_request").unwrap(), registration_response: decode(values, "registration_response").unwrap(), @@ -474,6 +385,20 @@ fn stringify_test_vectors(p: &TestVectorParameters) -> String { ) .as_str(), ); + s.push_str( + format!( + " \"server_sig_rng\": \"{}\",\n", + hex::encode(&p.server_sig_rng) + ) + .as_str(), + ); + s.push_str( + format!( + " \"client_sig_rng\": \"{}\",\n", + hex::encode(&p.client_sig_rng) + ) + .as_str(), + ); s.push_str(format!(" \"context\": \"{}\",\n", hex::encode(&p.context)).as_str()); s.push_str( format!( @@ -553,45 +478,37 @@ fn stringify_test_vectors(p: &TestVectorParameters) -> String { fn generate_parameters() -> Result where + ::KE2State: Serialize, + ::KE3Message: Serialize, // ClientRegistration: KgSk + KgPk - as Group>::ScalarLen: Add< as Group>::ElemLen>, + as voprf::Group>::ScalarLen: Add< as voprf::Group>::ElemLen>, ClientRegistrationLen: ArrayLength, // RegistrationResponse: KgPk + KePk - as Group>::ElemLen: Add<::PkLen>, + as voprf::Group>::ElemLen: Add< as Group>::PkLen>, RegistrationResponseLen: ArrayLength, - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload - // Ke1Message: Nonce + KePk - NonceLen: Add<::PkLen>, - Ke1MessageLen: ArrayLength, // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + ::KE1Message: Serialize, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, // ClientLogin: KgSk + CredentialRequest + Ke1State - as Group>::ScalarLen: Add>, - Sum< as Group>::ScalarLen, CredentialRequestLen>: + as voprf::Group>::ScalarLen: Add>, + ::KE1State: Serialize, + Sum< as voprf::Group>::ScalarLen, CredentialRequestLen>: ArrayLength + Add>, ClientLoginLen: ArrayLength, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: ArrayLength + Add>, + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, - // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add<::PkLen>, - Sum::PkLen>: ArrayLength + Add>>, - Ke2MessageLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { @@ -602,11 +519,11 @@ where let mut rng = OsRng; // Inputs - let server_s_kp = KeyPair::::generate_random::(&mut rng); - let server_e_kp = KeyPair::::generate_random::(&mut rng); - let client_s_kp = KeyPair::::generate_random::(&mut rng); - let client_e_kp = KeyPair::::generate_random::(&mut rng); - let fake_kp = KeyPair::::generate_random::(&mut rng); + let server_s_kp = KeyPair::>::derive_random(&mut rng); + let server_e_kp = KeyPair::>::derive_random(&mut rng); + let client_s_kp = KeyPair::>::derive_random(&mut rng); + let client_e_kp = KeyPair::>::derive_random(&mut rng); + let fake_kp = KeyPair::>::derive_random(&mut rng); let credential_identifier = b"credIdentifier"; let id_u = b"idU"; let id_s = b"idS"; @@ -624,6 +541,10 @@ where rng.fill_bytes(&mut client_nonce); let mut server_nonce = [0u8; NonceLen::USIZE]; rng.fill_bytes(&mut server_nonce); + let mut server_sig_rng = GenericArray:: as Group>::SkLen>::default(); + rng.fill_bytes(&mut server_sig_rng); + let mut client_sig_rng = GenericArray:: as Group>::SkLen>::default(); + rng.fill_bytes(&mut client_sig_rng); let fake_sk: Vec = fake_kp.private().serialize().to_vec(); let server_setup = ServerSetup::::deserialize( @@ -636,7 +557,7 @@ where ) .unwrap(); - let blinding_factor = as Group>::random_scalar(&mut rng); + let blinding_factor = as voprf::Group>::random_scalar(&mut rng); let blinding_factor_bytes = OprfGroup::::serialize_scalar(blinding_factor); let mut blinding_factor_registration_rng = CycleRng::new(blinding_factor_bytes.to_vec()); @@ -706,6 +627,7 @@ where masking_nonce.to_vec(), server_e_kp.private().serialize().to_vec(), server_nonce.to_vec(), + server_sig_rng.to_vec(), ] .concat(), ); @@ -715,7 +637,7 @@ where Some(password_file), client_login_start_result.message, credential_identifier, - ServerLoginStartParameters { + ServerLoginParameters { context: Some(context), identifiers: Identifiers { client: Some(id_u), @@ -730,6 +652,7 @@ where let client_login_finish_result = client_login_start_result .state .finish( + &mut CycleRng::new(client_sig_rng.to_vec()), password, server_login_start_result.message, ClientLoginFinishParameters::new( @@ -765,6 +688,8 @@ where envelope_nonce: envelope_nonce.to_vec(), client_nonce: client_nonce.to_vec(), server_nonce: server_nonce.to_vec(), + server_sig_rng: server_sig_rng.to_vec(), + client_sig_rng: client_sig_rng.to_vec(), context: context.to_vec(), registration_request: registration_request_bytes.to_vec(), registration_response: registration_response_bytes.to_vec(), @@ -797,158 +722,14 @@ fn generate_test_vectors() -> Result<(), ProtocolError> { // licenses.\n\ //\n\ // To regenerate these test vectors, run:\n\ - // FULL_TEST_VECTORS_FILE=src/tests/full_test_vectors.rs cargo test --features ristretto255,curve25519 -- generate_test_vectors\n\ + // FULL_TEST_VECTORS_FILE=src/tests/full_test_vectors.rs cargo test --features curve25519,ecdsa,ed25519 -- generate_test_vectors\n\ + \n\ + #![allow(clippy::duplicated_attributes)]\n\ \n", ); - #[cfg(feature = "ristretto255")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_RISTRETTO255: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_RISTRETTO255_P256: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_RISTRETTO255_P384: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_RISTRETTO255_P521: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - } - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P256: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P256_P384: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P256_P521: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - #[cfg(feature = "ristretto255")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_P256_RISTRETTO255: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - } - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P384: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P384_P256: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P384_P521: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - #[cfg(feature = "ristretto255")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_P384_RISTRETTO255: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - } - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P521: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P521_P256: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str(&format!( - "pub static TEST_VECTOR_P521_P384: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - #[cfg(feature = "ristretto255")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"ristretto255\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_P521_RISTRETTO255: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - } - - #[cfg(feature = "curve25519")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"curve25519\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_CURVE25519_P256: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"curve25519\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_CURVE25519_P384: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - let parameters = generate_parameters::()?; - output.push_str("#[cfg(feature = \"curve25519\")]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_CURVE25519_P521: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - - #[cfg(feature = "ristretto255")] - { - let parameters = generate_parameters::()?; - output.push_str("#[cfg(all(feature = \"curve25519\", feature = \"ristretto255\"))]\n"); - output.push_str(&format!( - "pub static TEST_VECTOR_CURVE25519_RISTRETTO255: &str = r#\"\n{}\"#;\n", - stringify_test_vectors(¶meters) - )); - } - } + triple_dh_ciphersuites!(generate!(output)); + sigma_i_ciphersuites!(generate!(output)); if let Ok(path) = std::env::var("FULL_TEST_VECTORS_FILE") { std::fs::write(path, output).unwrap(); @@ -964,7 +745,7 @@ fn test_registration_request() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where // ClientRegistration: KgSk + KgPk - as Group>::ScalarLen: Add< as Group>::ElemLen>, + as voprf::Group>::ScalarLen: Add< as voprf::Group>::ElemLen>, ClientRegistrationLen: ArrayLength, { let parameters = populate_test_vectors(&serde_json::from_str(test_vector).unwrap()); @@ -982,7 +763,8 @@ fn test_registration_request() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1013,7 +795,8 @@ fn test_serialization() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1023,7 +806,7 @@ fn test_registration_response() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where // RegistrationResponse: KgPk + KePk - as Group>::ElemLen: Add<::PkLen>, + as voprf::Group>::ElemLen: Add< as Group>::PkLen>, RegistrationResponseLen: ArrayLength, { let parameters = populate_test_vectors( @@ -1051,7 +834,8 @@ fn test_registration_response() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1060,12 +844,9 @@ fn test_registration_response() -> Result<(), ProtocolError> { fn test_registration_upload() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, { @@ -1102,7 +883,8 @@ fn test_registration_upload() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1111,12 +893,9 @@ fn test_registration_upload() -> Result<(), ProtocolError> { fn test_password_file() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload @@ -1134,7 +913,8 @@ fn test_password_file() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1144,11 +924,13 @@ fn test_credential_request() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + ::KE1Message: Serialize, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, // ClientLogin: KgSk + CredentialRequest + Ke1State - as Group>::ScalarLen: Add>, - Sum< as Group>::ScalarLen, CredentialRequestLen>: + as voprf::Group>::ScalarLen: Add>, + ::KE1State: Serialize, + Sum< as voprf::Group>::ScalarLen, CredentialRequestLen>: ArrayLength + Add>, ClientLoginLen: ArrayLength, { @@ -1174,7 +956,8 @@ fn test_credential_request() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1183,17 +966,15 @@ fn test_credential_request() -> Result<(), ProtocolError> { fn test_credential_response() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + ::KE1Message: Deserialize, + ::KE2State: Serialize, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { @@ -1214,6 +995,7 @@ fn test_credential_response() -> Result<(), ProtocolError> { parameters.masking_nonce, parameters.server_e_sk, parameters.server_nonce, + parameters.server_sig_rng, ] .concat(), ); @@ -1223,7 +1005,7 @@ fn test_credential_response() -> Result<(), ProtocolError> { Some(ServerRegistration::deserialize(¶meters.password_file)?), CredentialRequest::::deserialize(¶meters.credential_request)?, ¶meters.credential_identifier, - ServerLoginStartParameters { + ServerLoginParameters { context: Some(¶meters.context), identifiers: Identifiers { client: Some(¶meters.id_u), @@ -1242,7 +1024,8 @@ fn test_credential_response() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1251,16 +1034,16 @@ fn test_credential_response() -> Result<(), ProtocolError> { fn test_credential_finalization() -> Result<(), ProtocolError> { fn inner(test_vector: &str) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + ::KE1Message: Deserialize + Serialize, + ::KE1State: Deserialize + Serialize, + ::KE2Message: Deserialize + Serialize, + ::KE3Message: Serialize, { let parameters = populate_test_vectors(&serde_json::from_str(test_vector).unwrap()); let client_login_finish_result = ClientLogin::::deserialize(¶meters.client_login_state)?.finish( + &mut CycleRng::new(parameters.client_sig_rng), ¶meters.password, CredentialResponse::::deserialize(¶meters.credential_response)?, ClientLoginFinishParameters::new( @@ -1293,20 +1076,32 @@ fn test_credential_finalization() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } #[test] fn test_server_login_finish() -> Result<(), ProtocolError> { - fn inner(test_vector: &str) -> Result<(), ProtocolError> { + fn inner(test_vector: &str) -> Result<(), ProtocolError> + where + ::KE2State: Deserialize, + ::KE3Message: Deserialize, + { let parameters = populate_test_vectors(&serde_json::from_str(test_vector).unwrap()); let server_login_result = ServerLogin::::deserialize(¶meters.server_login_state)? - .finish(CredentialFinalization::deserialize( - ¶meters.credential_finalization, - )?)?; + .finish( + CredentialFinalization::deserialize(¶meters.credential_finalization)?, + ServerLoginParameters { + context: Some(¶meters.context), + identifiers: Identifiers { + client: Some(¶meters.id_u), + server: Some(¶meters.id_s), + }, + }, + )?; assert_eq!( hex::encode(parameters.session_key), @@ -1316,7 +1111,8 @@ fn test_server_login_finish() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1325,13 +1121,7 @@ fn test_complete_flow( _test_vector: &str, registration_password: &[u8], login_password: &[u8], -) -> Result<(), ProtocolError> -where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, -{ +) -> Result<(), ProtocolError> { let credential_identifier = b"credentialIdentifier"; let mut client_rng = OsRng; let mut server_rng = OsRng; @@ -1357,10 +1147,11 @@ where Some(p_file), client_login_start_result.message, credential_identifier, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), )?; let client_login_result = client_login_start_result.state.finish( + &mut client_rng, login_password, server_login_start_result.message, ClientLoginFinishParameters::default(), @@ -1368,9 +1159,10 @@ where if hex::encode(registration_password) == hex::encode(login_password) { let client_login_finish_result = client_login_result?; - let server_login_finish_result = server_login_start_result - .state - .finish(client_login_finish_result.message)?; + let server_login_finish_result = server_login_start_result.state.finish( + client_login_finish_result.message, + ServerLoginParameters::default(), + )?; assert_eq!( hex::encode(&server_login_finish_result.session_key), @@ -1392,13 +1184,31 @@ where #[test] fn test_complete_flow_success() -> Result<(), ProtocolError> { - run_all!(test_complete_flow, b"good password", b"good password"); + triple_dh_ciphersuites!(run_all!( + test_complete_flow, + b"good password", + b"good password" + )); + sigma_i_ciphersuites!(run_all!( + test_complete_flow, + b"good password", + b"good password" + )); Ok(()) } #[test] fn test_complete_flow_fail() -> Result<(), ProtocolError> { - run_all!(test_complete_flow, b"good password", b"bad password"); + triple_dh_ciphersuites!(run_all!( + test_complete_flow, + b"good password", + b"bad password" + )); + sigma_i_ciphersuites!(run_all!( + test_complete_flow, + b"good password", + b"bad password" + )); Ok(()) } @@ -1413,14 +1223,13 @@ fn test_zeroize_client_registration_start() -> Result<(), ProtocolError> { let mut state = client_registration_start_result.state; unsafe { ptr::drop_in_place(&mut state) }; - for byte in state.to_vec() { - assert_eq!(byte, 0); - } + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1447,14 +1256,13 @@ fn test_zeroize_client_registration_finish() -> Result<(), ProtocolError> { let mut state = client_registration_finish_result.state; unsafe { ptr::drop_in_place(&mut state) }; - for byte in state.to_vec() { - assert_eq!(byte, 0); - } + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1463,12 +1271,10 @@ fn test_zeroize_client_registration_finish() -> Result<(), ProtocolError> { fn test_zeroize_server_registration_finish() -> Result<(), ProtocolError> { fn inner(_test_vector: &str) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, + as Group>::Pk: AssertZeroized, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload @@ -1492,61 +1298,38 @@ fn test_zeroize_server_registration_finish() -> Result<(), ProtocolError> { let p_file = ServerRegistration::finish(client_registration_finish_result.message); let mut state = p_file; - util::drop_manually(&mut state); - util::test_zeroized(&mut state.0.envelope.mode); - util::test_zeroized(&mut state.0.masking_key); + unsafe { ptr::drop_in_place(&mut state) }; + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } #[test] fn test_zeroize_client_login_start() -> Result<(), ProtocolError> { - fn inner>( - _test_vector: &str, - ) -> Result<(), ProtocolError> + fn inner(_test_vector: &str) -> Result<(), ProtocolError> where - ::Sk: DiffieHellman, - // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add::PkLen>>, - CredentialRequestLen: ArrayLength, - // Ke1State: KeSk + Nonce - ::SkLen: Add, - Sum<::SkLen, NonceLen>: ArrayLength, - // Ke1Message: Nonce + KePk - NonceLen: Add<::PkLen>, - Sum::PkLen>: ArrayLength, - // Ke2State: (Hash + Hash) + Hash - OutputSize>: Add>>, - Sum>, OutputSize>>: - ArrayLength + Add>>, - Sum>, OutputSize>>, OutputSize>>: - ArrayLength, - // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add<::PkLen>, - Sum::PkLen>: - ArrayLength + Add>>, - Sum::PkLen>, OutputSize>>: - ArrayLength, + ::KE1State: AssertZeroized, + ::KE1Message: AssertZeroized, { let mut client_rng = OsRng; let client_login_start_result = ClientLogin::::start(&mut client_rng, STR_PASSWORD.as_bytes())?; let mut state = client_login_start_result.state; - util::drop_manually(&mut state); - util::test_zeroized(&mut state.oprf_client); - util::test_zeroized(&mut state.ke1_state); - util::test_zeroized(&mut state.credential_request.ke1_message.client_nonce); + unsafe { ptr::drop_in_place(&mut state) }; + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1555,11 +1338,8 @@ fn test_zeroize_client_login_start() -> Result<(), ProtocolError> { fn test_zeroize_server_login_start() -> Result<(), ProtocolError> { fn inner(_test_vector: &str) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + as Group>::Pk: AssertZeroized, + ::KE2State: Serialize + AssertZeroized, { let mut client_rng = OsRng; let mut server_rng = OsRng; @@ -1586,56 +1366,28 @@ fn test_zeroize_server_login_start() -> Result<(), ProtocolError> { Some(p_file), client_login_start_result.message, STR_CREDENTIAL_IDENTIFIER.as_bytes(), - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), )?; let mut state = server_login_start_result.state; unsafe { ptr::drop_in_place(&mut state) }; - for byte in state.serialize() { - assert_eq!(byte, 0); - } + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } #[test] fn test_zeroize_client_login_finish() -> Result<(), ProtocolError> { - fn inner>( - _test_vector: &str, - ) -> Result<(), ProtocolError> + fn inner(_test_vector: &str) -> Result<(), ProtocolError> where - ::Sk: DiffieHellman, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add::PkLen>>, - CredentialRequestLen: ArrayLength, - // Ke1State: KeSk + Nonce - ::SkLen: Add, - Sum<::SkLen, NonceLen>: ArrayLength, - // Ke1Message: Nonce + KePk - NonceLen: Add<::PkLen>, - Sum::PkLen>: ArrayLength, - // Ke2State: (Hash + Hash) + Hash - OutputSize>: Add>>, - Sum>, OutputSize>>: - ArrayLength + Add>>, - Sum>, OutputSize>>, OutputSize>>: - ArrayLength, - // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add<::PkLen>, - Sum::PkLen>: - ArrayLength + Add>>, - Sum::PkLen>, OutputSize>>: - ArrayLength, + ::KE1State: AssertZeroized, + ::KE1Message: AssertZeroized, { let mut client_rng = OsRng; let mut server_rng = OsRng; @@ -1662,24 +1414,24 @@ fn test_zeroize_client_login_finish() -> Result<(), ProtocolError> { Some(p_file), client_login_start_result.message, STR_CREDENTIAL_IDENTIFIER.as_bytes(), - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), )?; let client_login_finish_result = client_login_start_result.state.finish( + &mut client_rng, STR_PASSWORD.as_bytes(), server_login_start_result.message, ClientLoginFinishParameters::default(), )?; let mut state = client_login_finish_result.state; - util::drop_manually(&mut state); - util::test_zeroized(&mut state.oprf_client); - util::test_zeroized(&mut state.ke1_state); - util::test_zeroized(&mut state.credential_request.ke1_message.client_nonce); + unsafe { ptr::drop_in_place(&mut state) }; + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1688,11 +1440,8 @@ fn test_zeroize_client_login_finish() -> Result<(), ProtocolError> { fn test_zeroize_server_login_finish() -> Result<(), ProtocolError> { fn inner(_test_vector: &str) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + as Group>::Pk: AssertZeroized, + ::KE2State: Serialize + AssertZeroized, { let mut client_rng = OsRng; let mut server_rng = OsRng; @@ -1719,27 +1468,28 @@ fn test_zeroize_server_login_finish() -> Result<(), ProtocolError> { Some(p_file), client_login_start_result.message, STR_CREDENTIAL_IDENTIFIER.as_bytes(), - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), )?; let client_login_finish_result = client_login_start_result.state.finish( + &mut client_rng, STR_PASSWORD.as_bytes(), server_login_start_result.message, ClientLoginFinishParameters::default(), )?; - let server_login_finish_result = server_login_start_result - .state - .finish(client_login_finish_result.message)?; + let server_login_finish_result = server_login_start_result.state.finish( + client_login_finish_result.message, + ServerLoginParameters::default(), + )?; let mut state = server_login_finish_result.state; unsafe { ptr::drop_in_place(&mut state) }; - for byte in state.serialize() { - assert_eq!(byte, 0); - } + state.assert_zeroized(); Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1778,7 +1528,8 @@ fn test_scalar_always_nonzero() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } @@ -1822,21 +1573,15 @@ fn test_reflected_value_error_registration() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } #[test] fn test_reflected_value_error_login() -> Result<(), ProtocolError> { - fn inner(_test_vector: &str) -> Result<(), ProtocolError> - where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: - ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - { + fn inner(_test_vector: &str) -> Result<(), ProtocolError> { let credential_identifier = b"credentialIdentifier"; let password = b"password"; let mut client_rng = OsRng; @@ -1867,7 +1612,7 @@ fn test_reflected_value_error_login() -> Result<(), ProtocolError> { Some(p_file), client_login_start_result.message, credential_identifier, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), )?; let reflected_credential_response = server_login_start_result @@ -1875,6 +1620,7 @@ fn test_reflected_value_error_login() -> Result<(), ProtocolError> { .set_evaluation_element_for_testing(alpha); let client_login_result = client_login_start_result.state.finish( + &mut client_rng, password, reflected_credential_response, ClientLoginFinishParameters::default(), @@ -1887,7 +1633,8 @@ fn test_reflected_value_error_login() -> Result<(), ProtocolError> { Ok(()) } - run_all!(inner); + triple_dh_ciphersuites!(run_all!(inner)); + sigma_i_ciphersuites!(run_all!(inner)); Ok(()) } diff --git a/src/tests/full_test_vectors.rs b/src/tests/full_test_vectors.rs index b9aaa63..2ccf6e0 100644 --- a/src/tests/full_test_vectors.rs +++ b/src/tests/full_test_vectors.rs @@ -7,756 +7,4052 @@ // licenses. // // To regenerate these test vectors, run: -// FULL_TEST_VECTORS_FILE=src/tests/full_test_vectors.rs cargo test --features ristretto255,curve25519 -- generate_test_vectors +// FULL_TEST_VECTORS_FILE=src/tests/full_test_vectors.rs cargo test --features curve25519,ecdsa,ed25519 -- generate_test_vectors + +#![allow(clippy::duplicated_attributes)] #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_RISTRETTO255: &str = r#" +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_TRIPLE_DH_RISTRETTO255: &str = r#" { - "client_s_pk": "6e42118c8b676a84eeabfbe62eb5978dee0b062ddfac77afb9967a12316bed2a", - "client_s_sk": "b12f9bc96c92633e1c6607862a7fa6d71f0dba618bcadba9feab5147d7508507", - "client_e_pk": "0672100b2f046b964b6dcaf7b8b79c304b4ab5aede41d3e2a4c2515e2f121c08", - "client_e_sk": "dd6b5c2eca889038094cf44a6b351bbb6e64bf69a57170426d20d98f7df8a504", - "server_s_pk": "b24533c490462c297ffb9f0655ef24c181d6b160292357ded06d316de57f2153", - "server_s_sk": "b961df21fa3e8120c779c70e146f71bac28f28de448d7db87fdf93cdb54cd105", - "server_e_pk": "3071af4dd3334be697b71209ad9b80faf83d1c1d2beba290c8ecfee4df20b532", - "server_e_sk": "5eb442d005375a9d0a2dc113abd2feb56704ea846ceeb01704edb456ce234e09", - "fake_sk": "d6b40480bf0d5c3108e55e4aaf615b61495d2efb3a731c9d38dd609565ff6602", + "client_s_pk": "e4d35f6b0b7ecd1100c19ea63317ee67e70ef81a46ec9e3513c23315b9ac827b", + "client_s_sk": "fc19612f6af182480b481eb82e0cd98cb6a254d36286686f538eb3c31ea4c106", + "client_e_pk": "96e9b521165a06fe58619eddffdf546af491818a66b01e88c0e1af2443c7085f", + "client_e_sk": "710e2b2514dc800c0ad8cb25eac022a16250906b5f9bea5de3e85b47cf82360e", + "server_s_pk": "6ceb71c400f8016b9ece313b0a43e15c40ca75f994d0d0c53ed2ea462559be4d", + "server_s_sk": "9c905a856c237adc6d77da2f708d9bd53aafd618ad95b3c2f0dd83963b07a308", + "server_e_pk": "704fd82eac99a9299047c836b372e8a53dbaddec3de9e13adc84204f700fd66a", + "server_e_sk": "d3f2cbc2f081e6c55e8678d91617dd15ce30a376bc53f492b151070e61cae30e", + "fake_sk": "c64c656339ca0d88eb28d53efb9d64801178b8230496b0d6301191ad89ebba08", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "ead8af7e8db58f1681fa7c055229f1f420241043b5d54769629f1aae3ad06b09", - "oprf_seed": "2d45a64e11c49d106b19d49e6fcfabcb85c118782ab8875c9d2aa857cccf6dd592f5cdb41e95962774a68a156af7be74431faf4bfef607818dfecb61a670b2fc", - "dummy_masking_key": "b292a67b305bd622a03281c8ba281446d52086b92cd14637a43402abf439c1d33376111fa68a7760ba7dfb766b511927faaac10c143081a74539112bc0b78517", - "masking_nonce": "8f6d17704f64d72278cf5445c5b54e549c1a5c12482898f35af5538b03716a54e6dba2a95c3cc639e14ce3ef7b3c800bdd753541382db7f233ea3d279843d191", - "envelope_nonce": "5926f0c796b20768fbe27c60e7bc58017b3b1336bd434bae4c773923aede6f91", - "client_nonce": "393366b97dafe45e53565fd94be7136533fe2c129366ddf9fd07d49a9f07be84", - "server_nonce": "40f7b3cd8d35b5cbe94a2f6ff085a323b412a9d91cb77eae9188108c9e8f91e0", + "blinding_factor": "bbdb72201c73826adea3059d4144a1f90cb387986c20752035f9f931c42d930b", + "oprf_seed": "730d79c3946e5e531e59a82d4738833706596d7d8fb519138bfe7b27ea90bf34bd2c3c44951dcee6eaf2ea648cdf5d51d746e477af131a14cd7005a66b9f690d", + "dummy_masking_key": "37cf01fab6c27b59e260075f3df3d880c0c2b0ff9f1d1c3d96956d22842ee987688ef12e8fb7ffc8133fe4268e70cb86711bfb2b125861937605edac25878975", + "masking_nonce": "f1b75756cfb3b3e7819c77086c1c80e6617519af55d4b9ddd7df559a695ef99d6fec5405b4eb8ff86000a48d5263ebc795cf3b3611dacf90f55a64dbfd000518", + "envelope_nonce": "a820f3d62c83f8bd5c2ba02bd9c8e05f1cb81c1ba11cf376f3686a6ee16de318", + "client_nonce": "658907cb736274e864c2f9d4dd35f0a391a482f4e8561f94c665bab8c20832cf", + "server_nonce": "75d10288b67ff11a1aca08ae268e70bca589c091a60b0dc15fa53aefb033df7c", + "server_sig_rng": "4c847dea74bd30eaea1ec9cfeb6ff811cc15716cb48ab0fe0148db49d1d87d4b", + "client_sig_rng": "a052cb6dea5a4279ff78165b9aaf94708b30288556be541a32245b8e320bf029", "context": "636f6e74657874", - "registration_request": "32fdf40b3c5d9c8955dde38f4b57555ab3fc020bcc66e9e7ccc8f6fb4a965275", - "registration_response": "a44657cf51697469832dd79d4de07289d71c656f70b2de32e9589f6f74f58e20b24533c490462c297ffb9f0655ef24c181d6b160292357ded06d316de57f2153", - "registration_upload": "c0c9f18d43737ac563a0725a3f794347bf84c950f44b78811fcfee1139cd141017d3d706cc14bcf5e0cfcd6274ae76b30e22e5ce21c0677edf74e7599b51ff39b224dd36069c74259f7beeba0a818346f71d17c493126778412f263da291c2c6b12f9bc96c92633e1c6607862a7fa6d71f0dba618bcadba9feab5147d75085072e4e4b8c8e0212f050ce88333b0541340bb7c68dd8453a02e76e56070a900b63b179c9281de62dd851a26d724a3185196af1bc1b5532654ea87f9d8b72c7166d", - "credential_request": "32fdf40b3c5d9c8955dde38f4b57555ab3fc020bcc66e9e7ccc8f6fb4a965275393366b97dafe45e53565fd94be7136533fe2c129366ddf9fd07d49a9f07be84aafe5b2704373a562d964b13af5d2366fcffcc05d4c4ae1337069abaaee22939", - "credential_response": "a44657cf51697469832dd79d4de07289d71c656f70b2de32e9589f6f74f58e208f6d17704f64d72278cf5445c5b54e549c1a5c12482898f35af5538b03716a54899a31a613277730e1e1d3977e30cdf540797a2f14e0371fa8dac0a769428603bc0c9f6b120a9615087fa8504eb4722204b7c68b43a788aab00f415940d31a1b9873197c43c6a5fc7aecf712fc1eeaa48d25bbadc40213ed649eb0c73a3938e8e7bdab7d6d760126965b61c0f3087b0939d15f4ab80909116b7086dfeaefb5285eb442d005375a9d0a2dc113abd2feb56704ea846ceeb01704edb456ce234e09949edb9d25cdd38f8aff3c51465db8f9b35a63017ab8de2ea5914f9c6a086c0a996578593ec629e1a89c98ab0c04d46d82f2e49e36d857509ecb466ac1648ff32675cf26c3a2d5ef5a72c7e5ed8b8240a16d67979ac2efad1350fed4f26e3366", - "credential_finalization": "f90d74d8bf99de320447419c3cb135cb30ba5f171fc52ebc8dc91cabaca88b1642e0a244311185d82c4c9f997d5805abab17ddc1f4cd1e11c43a0b12cb4b0a72", - "client_registration_state": "ead8af7e8db58f1681fa7c055229f1f420241043b5d54769629f1aae3ad06b0932fdf40b3c5d9c8955dde38f4b57555ab3fc020bcc66e9e7ccc8f6fb4a965275", - "client_login_state": "ead8af7e8db58f1681fa7c055229f1f420241043b5d54769629f1aae3ad06b0932fdf40b3c5d9c8955dde38f4b57555ab3fc020bcc66e9e7ccc8f6fb4a965275393366b97dafe45e53565fd94be7136533fe2c129366ddf9fd07d49a9f07be84aafe5b2704373a562d964b13af5d2366fcffcc05d4c4ae1337069abaaee22939149c1aed334976be7224701756b56b914c69c2e33d7545ff22f7aea61953ae0e393366b97dafe45e53565fd94be7136533fe2c129366ddf9fd07d49a9f07be84", - "server_login_state": "bcb2e5b8aadca9178f55ea89b70318dbe545802de7367a2f5d554ceec1bb63274ca472b2a45bebf16a9e3e568a225d88217d5a993994245e8d6ada61630a26930c0f22341f25923e1076a1c6477014745cd0cb1662fd5a6711271bf21798ce3eefe7767e51d15b6d754a03cd2118c77a32ebd5b78773f8da9bce405373cd0d0f505bc6c283054a45215c314c42ad97246a5f23687b7a9882beaa575d1f831e50352e0615179836e22a86c500d91cac12f6fdc1dd76ad740759214d51a36f39f1", - "password_file": "c0c9f18d43737ac563a0725a3f794347bf84c950f44b78811fcfee1139cd141017d3d706cc14bcf5e0cfcd6274ae76b30e22e5ce21c0677edf74e7599b51ff39b224dd36069c74259f7beeba0a818346f71d17c493126778412f263da291c2c6b12f9bc96c92633e1c6607862a7fa6d71f0dba618bcadba9feab5147d75085072e4e4b8c8e0212f050ce88333b0541340bb7c68dd8453a02e76e56070a900b63b179c9281de62dd851a26d724a3185196af1bc1b5532654ea87f9d8b72c7166d", - "export_key": "3c733c576593da4015f2821106ac089b2a38e2a8dea145a8d42b2b8da2d1f8eccb79329ba2e0dce995ea1bbe7cdd43042d437b089799f05d71e0eb20e4d42c71", - "session_key": "505bc6c283054a45215c314c42ad97246a5f23687b7a9882beaa575d1f831e50352e0615179836e22a86c500d91cac12f6fdc1dd76ad740759214d51a36f39f1" + "registration_request": "82c6c42fcf5e70010849905102788f14ebea5f2f3a9b6be044ea41d5d91cea55", + "registration_response": "52521af32ac078167e301a2c0433078ee5ccea498b59000c593566bb9c94bc4b6ceb71c400f8016b9ece313b0a43e15c40ca75f994d0d0c53ed2ea462559be4d", + "registration_upload": "120dae95271c4670c307d32c64fa776bf30f958d6d331a44f8ae0923ae4011395f63f670f01a7f8dfeb2f87a4e7354665ae9c3b7f3d22cfea6d0083262680fcc3639073621a8db0a1e53a2c29072ee9a6ba3fa499c02198d43e716326f49c98bfc19612f6af182480b481eb82e0cd98cb6a254d36286686f538eb3c31ea4c1069baa9132d5dafe22ee2fe1fac8a774863ecd9b9c40d68c28c457ece2eb3b6f8eaf4763707cc3bc9fcedbdc66cf1e30f9fa65ad51b7190add31584a98f41d0331", + "credential_request": "82c6c42fcf5e70010849905102788f14ebea5f2f3a9b6be044ea41d5d91cea55658907cb736274e864c2f9d4dd35f0a391a482f4e8561f94c665bab8c20832cf70b59c65098d39e21a4ebd0afdae2e5b8a0687e35bf92575eef13b4f5b89b42a", + "credential_response": "52521af32ac078167e301a2c0433078ee5ccea498b59000c593566bb9c94bc4bf1b75756cfb3b3e7819c77086c1c80e6617519af55d4b9ddd7df559a695ef99d010204dc01acd2224d199a0e17eac4876157807bf9df393252103b07c0229a13232ffea0167ddfd9a350e714019e6fe0f4c2dba7128a41d9e3bbc8381f5e09447b5e413471dd24e2dae0899c5a1d82ecc4d4af0251b8605990edf6dc0c70b7b16562bbd8cff6106275a4df5c320e8b5084a26349d51864f4b2157b3a9e1f7f67d3f2cbc2f081e6c55e8678d91617dd15ce30a376bc53f492b151070e61cae30eb068b721a88af0deb1a69176b71c6a0dde5343bc84caab79c3ec961858cbab486c4feb50814daa33c5d9567079375d9089d87270501ea98d3891381d6f4df4a76e1c4ad97b9d7fdd7a9ce5932785041013c9cc7b9a67fac54c00a6c88c79ea4c", + "credential_finalization": "1c8526c7a28899773af5f9c12a572127a8c4eb5363f26f7d6be6586cb89b0901502c4630d6a25d4236762527ed12dcb0ee7b5a0de3ef635d33b27ad7b2ece1a5", + "client_registration_state": "bbdb72201c73826adea3059d4144a1f90cb387986c20752035f9f931c42d930b82c6c42fcf5e70010849905102788f14ebea5f2f3a9b6be044ea41d5d91cea55", + "client_login_state": "bbdb72201c73826adea3059d4144a1f90cb387986c20752035f9f931c42d930b82c6c42fcf5e70010849905102788f14ebea5f2f3a9b6be044ea41d5d91cea55658907cb736274e864c2f9d4dd35f0a391a482f4e8561f94c665bab8c20832cf70b59c65098d39e21a4ebd0afdae2e5b8a0687e35bf92575eef13b4f5b89b42aa3b613e6cd1c606f072c89c8dfba65edaf7ce7a0192a983aff0cc2f1c6de0907658907cb736274e864c2f9d4dd35f0a391a482f4e8561f94c665bab8c20832cf", + "server_login_state": "4655141357a2b562a91528115efd5100cb13f53be71bc1ef066951d29be66dabb430c76f4d1b4fad01a4f4544b8fbb9192d09dd1897ec6915924aee5c16994721c8526c7a28899773af5f9c12a572127a8c4eb5363f26f7d6be6586cb89b0901502c4630d6a25d4236762527ed12dcb0ee7b5a0de3ef635d33b27ad7b2ece1a5", + "password_file": "120dae95271c4670c307d32c64fa776bf30f958d6d331a44f8ae0923ae4011395f63f670f01a7f8dfeb2f87a4e7354665ae9c3b7f3d22cfea6d0083262680fcc3639073621a8db0a1e53a2c29072ee9a6ba3fa499c02198d43e716326f49c98bfc19612f6af182480b481eb82e0cd98cb6a254d36286686f538eb3c31ea4c1069baa9132d5dafe22ee2fe1fac8a774863ecd9b9c40d68c28c457ece2eb3b6f8eaf4763707cc3bc9fcedbdc66cf1e30f9fa65ad51b7190add31584a98f41d0331", + "export_key": "78b4182ffa51840d9a0aa3b2aa7d2c72655f49f57eff975472475d20a61bc066c6e23aa16c013e31224bb1b050cd58f24bc6fe5c0ee8816461f682774135e152", + "session_key": "4655141357a2b562a91528115efd5100cb13f53be71bc1ef066951d29be66dabb430c76f4d1b4fad01a4f4544b8fbb9192d09dd1897ec6915924aee5c1699472" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_RISTRETTO255_P256: &str = r#" +pub static TEST_VECTOR_P256_TRIPLE_DH_RISTRETTO255: &str = r#" { - "client_s_pk": "28b29c1e252dc2d62ced004dc5bd5fe055deba35eb37696d873ba01f22f78143", - "client_s_sk": "7fe6ec73edeacd83ec0d4c04747f242edc640192293750d2a07472ab98fedb0e", - "client_e_pk": "58fc49c160a754a2c3e126fe688a43c61a6a8f9fb2d0b8cfb79e7deb5665f34f", - "client_e_sk": "0be44dc9a6cbb5650c41e6670e085cd6ca727176865053f12dd926a4920a1c0f", - "server_s_pk": "7eb807f835c6e7c8d24119d939d649b4d3fccf4cc2e84377489f104e2387d279", - "server_s_sk": "857bed179cda936b30dd07c222efad2b8148f8b671dd9cfea68d3e40996aee09", - "server_e_pk": "b0e42d7bd20cd55b8df33de0ee3fb4d965fdb8762d56ed9d7546d4314f1dcb27", - "server_e_sk": "0232e765eac41fec02268880a6576464db1ca31149b6494283115694a655cf04", - "fake_sk": "54a74f2b6ce3cdbd1df17150204170e11591232313e5663215f01e5c945a8a01", + "client_s_pk": "c0028eb702faa5808d2f514900a56d817123811b502350ace452e612425a8648", + "client_s_sk": "e130b1cb018a93421c3f1d554059aae0d9e8792e26b346a57118adc660a1c705", + "client_e_pk": "ee8f068bc3f523829e36b1b9cd892d9456fe82309d3f918662dcbbe9c09cc240", + "client_e_sk": "3f40870a8fc54c88b336e282b08dfb2cc3d31f40ace91d0293a97cc2cd7b2b02", + "server_s_pk": "f8b9f03da3a99ae79bb48a51cee6712bb1f72fd2ab1407617720bf0cacbf3a31", + "server_s_sk": "07f9a3852cb6dbeff30bd60ee7c5a58c92c718f070ab1460043f3813c18d500b", + "server_e_pk": "e230d4e76c73ed249d061808a32276e69e0c0ecbdc81b476e6dd19dea0b29409", + "server_e_sk": "3743303b29e61dcb92746b708564ed9f523d57ff46d22cbec417ff49e1f77309", + "fake_sk": "d4dda2609a121555d635a8f7f465800378a3b43e8d4a165dc9e6bb27a1b56009", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "21044f2a8a6a8ede8dcdd6679b5a9f0ae4f3e59a5e4f56ba4bf825eb78e8483f", - "oprf_seed": "987d4e907dd96f836578c9b012d019f4227876da4ef673a3f0e3d0d70047b0b7", - "dummy_masking_key": "5f8f95260e002975ca42e94c9e876fec6015c7db38b1960f4af0f5c498a007b2", - "masking_nonce": "54c181383fcd12f0eebe0dcdd244d09e0fda47c23e3062f65c0401a17ae0c9b13da615028a28a65c287f485d3c232b2d7383799ebeafa7d778034328c295199a", - "envelope_nonce": "580991cf016168bc24c5cb984f20d6ab7175a6a1042bb8a678ea3919c855ac57", - "client_nonce": "c3b964071ba763fbd1152b7dc6130ad38b72621deb21836a35a760ea3b83f14e", - "server_nonce": "b948bcf5eaee37e1d28ac6cf31cde413eddcdc5d25c755870aba8886cb95264d", + "blinding_factor": "a1e798f4af046ceac9ac2f3f88ec04fd743d4162e240ebe95201d4d3319745d1", + "oprf_seed": "b0e9fb974c13bf5eadd4c355efdbe680e1a711f7b2ab9d20aae56f497c24f5aa", + "dummy_masking_key": "ced8d42cbbe7a7a66e0eabb3b280296d8d27796eaf240e24b6bebe1d902b7e77", + "masking_nonce": "0d9c07369019bac2a7725aa4d011e4efa166c405e9d654193a6e1f099e4201e41b5770c6f6b53edd9e26751410c4bb33b515ec8a8fb4fde28478597269fedae0", + "envelope_nonce": "dcac3d7323d07878f03720ec3d4bf55d6e9151bbc3898d11b7e9db751733e444", + "client_nonce": "d31765c67453ec47b38b277e2eda3a0b22911c088fac937438babf13199989f4", + "server_nonce": "a61f7f2ed829a32aea1b82bcc00b524ac319b6b61228288129481cc005b6332d", + "server_sig_rng": "60347e2beb7dfa3794b6b3f2c6bb15c44c32b34dbcfc0425142b1019d64ec418", + "client_sig_rng": "15881511f30b7e5533890bc8933a26943ab90d241131d0331b0c08c9c5b98ee3", "context": "636f6e74657874", - "registration_request": "028079cd0d19958719929f99388fc9093d39e8c75c438b9deb7aaf05ab3aab1369", - "registration_response": "03e9bd932b44b19eae56cbbdaec155512c76f008d844c2c644051c6db8f8b88d407eb807f835c6e7c8d24119d939d649b4d3fccf4cc2e84377489f104e2387d279", - "registration_upload": "4244ebcb3dcef8c1d25c991a31621f5ff39acf45a39731eee094b908fecbcb46fd9f0179ec72a2d2e496cb3f3d833340d15fcff542dba9ba1d04cd05202688957fe6ec73edeacd83ec0d4c04747f242edc640192293750d2a07472ab98fedb0ee2a2336fae503ceb1ddd5166735c9450efc213a358bbf9559c72d28071be6cd8", - "credential_request": "028079cd0d19958719929f99388fc9093d39e8c75c438b9deb7aaf05ab3aab1369c3b964071ba763fbd1152b7dc6130ad38b72621deb21836a35a760ea3b83f14e6a37ada7f34ec8aa6b2d297ab75cb9bf6d00f66e6d281eafc774228dad64c841", - "credential_response": "03e9bd932b44b19eae56cbbdaec155512c76f008d844c2c644051c6db8f8b88d4054c181383fcd12f0eebe0dcdd244d09e0fda47c23e3062f65c0401a17ae0c9b1416a6f852931600b40a430cb704dd079bb6aa2c7b4e9b0a9aa427d07e0bb0c216feb83e8791b029074227a00443abda6566b2c340f15490bc971a92307895312944c44c9b8d6200325bed09df7c14fefd6acf2ce044139533888969257f5d9130232e765eac41fec02268880a6576464db1ca31149b6494283115694a655cf04e04ba65cd4d20e8f32387c169b8896eb370d75be04c601ad474819e0befa13030f610c52ef68f48e8ece592d10257d21f9f1e3bddbfc48fcfab57429258d9f07", - "credential_finalization": "7cfc48bcabbe9515b30d97593122e3b4b3e792682f452d476f448a8b7195486f", - "client_registration_state": "21044f2a8a6a8ede8dcdd6679b5a9f0ae4f3e59a5e4f56ba4bf825eb78e8483f028079cd0d19958719929f99388fc9093d39e8c75c438b9deb7aaf05ab3aab1369", - "client_login_state": "21044f2a8a6a8ede8dcdd6679b5a9f0ae4f3e59a5e4f56ba4bf825eb78e8483f028079cd0d19958719929f99388fc9093d39e8c75c438b9deb7aaf05ab3aab1369c3b964071ba763fbd1152b7dc6130ad38b72621deb21836a35a760ea3b83f14e6a37ada7f34ec8aa6b2d297ab75cb9bf6d00f66e6d281eafc774228dad64c84168087941a5459755b82343f20612be903810ee7d0b2895048f1f45998e54cc03c3b964071ba763fbd1152b7dc6130ad38b72621deb21836a35a760ea3b83f14e", - "server_login_state": "9be2def16646a59b14daeba2f9cad59d4ac532582b8763683b662424a72f603376f7c0f3b0cc8badc1140dff6215049f12ed04a1cb20aac3206282bb88ae14ba3263d27b07684997706da7173a3d9c8096fd23826b6eaf55f14953dc9d93be53", - "password_file": "4244ebcb3dcef8c1d25c991a31621f5ff39acf45a39731eee094b908fecbcb46fd9f0179ec72a2d2e496cb3f3d833340d15fcff542dba9ba1d04cd05202688957fe6ec73edeacd83ec0d4c04747f242edc640192293750d2a07472ab98fedb0ee2a2336fae503ceb1ddd5166735c9450efc213a358bbf9559c72d28071be6cd8", - "export_key": "b5cbe986b9900d7340b4c2c13204975bc49283eef76e61c39e1382c1bc74a9f5", - "session_key": "3263d27b07684997706da7173a3d9c8096fd23826b6eaf55f14953dc9d93be53" + "registration_request": "03c8ed74451c10029fa5f2600772a6cd026d284f82cfa98ea5415d7853b8d82d0b", + "registration_response": "0331a4cf7b7c5db552ad19c5d7edf54509defbc9ecbe7c65b9ca0c065bb7bae11cf8b9f03da3a99ae79bb48a51cee6712bb1f72fd2ab1407617720bf0cacbf3a31", + "registration_upload": "8cdee25d097ed9c99ae2e10bef69a03234405a6f7cc1d7342b164035fad3db4aa6bba294c728635c8a82313b02bed162eefb2a2ed25146b0c2e9ec312460dacbe130b1cb018a93421c3f1d554059aae0d9e8792e26b346a57118adc660a1c705d34f25320c423de0a70dc01a6693f3daa0b3b8bbb36799511f0873ba765aac62", + "credential_request": "03c8ed74451c10029fa5f2600772a6cd026d284f82cfa98ea5415d7853b8d82d0bd31765c67453ec47b38b277e2eda3a0b22911c088fac937438babf13199989f4506f98f5baf6608d30cf55a6d56117f120ca6f33b03fa6e9a6bba4791d39ae03", + "credential_response": "0331a4cf7b7c5db552ad19c5d7edf54509defbc9ecbe7c65b9ca0c065bb7bae11c0d9c07369019bac2a7725aa4d011e4efa166c405e9d654193a6e1f099e4201e4eb515533f8d8bf0473586d2faf7eca367cc19bbc00e0274bc44180dedb7788a58d0ecee0ee6b62454c1aaff7681978a284e19c971b0a6915bcd527271337f957102ff0d1f8609d0876b00f704f7cc49a2bb369ce925d052db3fd0d85d1e2dccf3743303b29e61dcb92746b708564ed9f523d57ff46d22cbec417ff49e1f77309b6c9229e623040bb3a34db01acfcdb57ef7c503f0ad32ad580e212bbb0142762dfa6b2f8ce148ecbaa7a81e68fd8dfea9c069bb31d970e6140da162988f7f0b4437e1c2405554b2646a47501c7027136cc505f63ae00547b96991afe571a9e6e", + "credential_finalization": "57309e2021ad4888f23c0b43204b26ef02174efa40173cb2ace35b92ccc9cfbb6fcb0873786b42ccf497be443e73ec3a211b5109a31991eda43b282505abb18c", + "client_registration_state": "a1e798f4af046ceac9ac2f3f88ec04fd743d4162e240ebe95201d4d3319745d103c8ed74451c10029fa5f2600772a6cd026d284f82cfa98ea5415d7853b8d82d0b", + "client_login_state": "a1e798f4af046ceac9ac2f3f88ec04fd743d4162e240ebe95201d4d3319745d103c8ed74451c10029fa5f2600772a6cd026d284f82cfa98ea5415d7853b8d82d0bd31765c67453ec47b38b277e2eda3a0b22911c088fac937438babf13199989f4506f98f5baf6608d30cf55a6d56117f120ca6f33b03fa6e9a6bba4791d39ae037c2c9613ee5001363ff24edce5ef38b37487a807349b53121da8a15dfebd0c09d31765c67453ec47b38b277e2eda3a0b22911c088fac937438babf13199989f4", + "server_login_state": "e5fc4c0bf1fd85f1c9e57f4972091dbd70c63d7430df85d5fd5116a1a2904b0bd62e351009575de687d1a8f577b4da87ee107487e89a5fcf19b92d6b9b5aefd257309e2021ad4888f23c0b43204b26ef02174efa40173cb2ace35b92ccc9cfbb6fcb0873786b42ccf497be443e73ec3a211b5109a31991eda43b282505abb18c", + "password_file": "8cdee25d097ed9c99ae2e10bef69a03234405a6f7cc1d7342b164035fad3db4aa6bba294c728635c8a82313b02bed162eefb2a2ed25146b0c2e9ec312460dacbe130b1cb018a93421c3f1d554059aae0d9e8792e26b346a57118adc660a1c705d34f25320c423de0a70dc01a6693f3daa0b3b8bbb36799511f0873ba765aac62", + "export_key": "f68f55640b882a59e9cb39fdc528231b92c445e2e660d6d638f8a1ab10623566", + "session_key": "e5fc4c0bf1fd85f1c9e57f4972091dbd70c63d7430df85d5fd5116a1a2904b0bd62e351009575de687d1a8f577b4da87ee107487e89a5fcf19b92d6b9b5aefd2" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_RISTRETTO255_P384: &str = r#" +pub static TEST_VECTOR_P384_TRIPLE_DH_RISTRETTO255: &str = r#" { - "client_s_pk": "8490e3ad88ad0b7b5605e46244ced1832bcd8509447b5a2dbcc920265b165a76", - "client_s_sk": "9edbf6e025bcdd9a0c8a08188fd0c383fd52cf62163a814227aee297a96cec0d", - "client_e_pk": "84d76ab287f5b815f815c21d69a9ca877ab5be5a88a065ccfb2ca1f3ff333024", - "client_e_sk": "26ec31df9f12c5ca9fc0ad71cb2bb4b6a98cafc07c95b7fdb68747a294110b02", - "server_s_pk": "841f9721731210bdeaecc5da3ff198079a2c3cec01933b2397c157a3d1400c1b", - "server_s_sk": "89c2981e8dcf7c5254a7b9bfcc525a80ec9469cf9589abcc61f50406b926fd09", - "server_e_pk": "7a442e58fc0ed2e7a582b3e687fdaab87d29c14a224386ca79dd0f69084dc27b", - "server_e_sk": "266b2aee7ad0a7b9ccbf22d3a81708ce2378efab33e18a6e926f7548e7f1270f", - "fake_sk": "4b4ecb85c2806093c68a984155d72837b9f563a3a32921745263905e2c216306", + "client_s_pk": "68bbfb895b96f29bf166b8fcb1b5a65cb2d6d3b2d77ac76e8e314cb480fc8273", + "client_s_sk": "534080c2057ec57614ca8fa00845f92d6ee0365b7ad58038771285414e2d4c04", + "client_e_pk": "6e75fe5c723bc8795f148d022a2b13c508ddc244d11410fea86ecd6c83426f61", + "client_e_sk": "ac6c3e026aedb8966c36dd4300628c6cf791008fcb342ad7559cdd9cf6e7fc0a", + "server_s_pk": "f6e186d53a993a1e9b5a7ab800e5ca40613c9dd079539f8d1eb4adb45290ce0d", + "server_s_sk": "7653a8937d3c098353ec9970b75cfcbb9019678788152de527b30267161e340c", + "server_e_pk": "424ab0b47265f835f2ac10ae14df67dcad75a588f375eebfe0a25a385bf1a56e", + "server_e_sk": "b8faee12ccdad26a4b6ad49988cd13f5fd4c25e50a46c6d0f76960171db96709", + "fake_sk": "01a31abc1ac5ef5b9a723677ea80281cfc9288ac1eeb0e53eace1424bdcd7100", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "455a31999c703a7e1f02c547b221efd8de43b3752d33f8a99dec8d940927a8fbd7cc177b3f7de0ed126ab14592658b43", - "oprf_seed": "1e3fd2e998491c49fbe78cb3354530e5651cddfd1e739dc4e82d69075878bbeb8090b8afc36a15d44ad50a78edab8448", - "dummy_masking_key": "caf8a11d20a287668e8e07ab370519e0b674b477ec2e4e98161b8e3fb97d8c139d3343007b3089c14e3d439adae40070", - "masking_nonce": "1be3ba59fa3b2abd9fbf6345800816f3875b78393f3f23cbc24147e50a7b96b8459f47b8cc735ecacfb49c279a452eda8a76e7bf273329a55a2577dfa2110863", - "envelope_nonce": "761ad4d91288defb12655dcf5c07ae909e551896c5f4329f4890e034c2c7577c", - "client_nonce": "259bffc38098904591dcccb05a627484eb319cf7bdc89f51daef43d6048628bb", - "server_nonce": "ef8b48f441e0e4a3b830485d93d69ae6b98d4cfe1263c5c2129e8fc2a72161b9", + "blinding_factor": "94a88fbaf92f4544a6d730da7cab9841fbca9505f798528c5b2f197f8472480190affa02542c770f892a427062520c0b", + "oprf_seed": "32e8e820c90d9237fede49785d32cd4272831d8c9ceacf133f224dc5861923db344cd16a789dfa8046fa0537b1c3b319", + "dummy_masking_key": "eb713f25b4c0f6f432cd2e29808473b93609d3d5bb65ec3484b751ba9a0ab34d0a8f9d3960ff819302b6c01e43022f29", + "masking_nonce": "d6b202587cb782158c431b1d75e9044ab31542c72999d568114b8855930e4607ac0210ce31954cdf46663cb341b37b7f2fe656d82e842fe97654fa12b74840d7", + "envelope_nonce": "5f656d415949b579a58cc2e40178838c59f1301d3e920cbd0b949f6015a3dc87", + "client_nonce": "33d8715e90b58a8617715372ca0fcaba505097a3c727d0c5af8a5a0ae461b4ca", + "server_nonce": "f23dd5964a7143d6504743f1b472a1ea45d5295bef8c2b72067b5405d6934bea", + "server_sig_rng": "c3cd67e102904836ffe69252d9305d6938a2b432e38b5d5cb87e0d1f6a4a5f88", + "client_sig_rng": "4446535d3ce4dfc93dcbc08926160ebe63e6523e7f19c48a0114599099609285", "context": "636f6e74657874", - "registration_request": "03af79e2fcb6f8756c037622fe1ff229f75318b3d1ef443a1ca5e0dfe3be2ae8defd14bbcfd7ecdb213aa709ad2967e161", - "registration_response": "038f430270db4470a54cd807de0aa8b2b70746ac85d54ba968234f065f838f1f20d57a4ff1e373b35976093af425e4ecfd841f9721731210bdeaecc5da3ff198079a2c3cec01933b2397c157a3d1400c1b", - "registration_upload": "ce4056acf09dda5d527d61fdc1f20cbcb56a6144e5b8230943db9c4361822e680f5da3aa2d7f1ac6a06259d18d3833cb4d04a8a52b9616fed14e540c67e8032217ffdf91f9ce04162aab6da8f8826fb09edbf6e025bcdd9a0c8a08188fd0c383fd52cf62163a814227aee297a96cec0d620b37aa66ea69094b5d056ef8b93224fffac1b69792d217f2e9a5752089120b8749abdd3a81c7c6251af39eec9ea40a", - "credential_request": "03af79e2fcb6f8756c037622fe1ff229f75318b3d1ef443a1ca5e0dfe3be2ae8defd14bbcfd7ecdb213aa709ad2967e161259bffc38098904591dcccb05a627484eb319cf7bdc89f51daef43d6048628bb8a83a2f87a960ef26770568a8eeb9effe21abcc42ebf23d3dd720a120960545d", - "credential_response": "038f430270db4470a54cd807de0aa8b2b70746ac85d54ba968234f065f838f1f20d57a4ff1e373b35976093af425e4ecfd1be3ba59fa3b2abd9fbf6345800816f3875b78393f3f23cbc24147e50a7b96b8f54010fe0fea2d2dccc8c43da56f8688100b5b372ed6f64e6cfdb7debf8fa2d6ac3e63cf438287e146151d2cbe3727837db6cff0a17cad565532ca346dff355e653d8776da0a74c5a5b02dfd4af9dd56232df7d6c8a61e6d3458b342c2f32f141e57acbebb0f5df3f2b25532b6b529fe266b2aee7ad0a7b9ccbf22d3a81708ce2378efab33e18a6e926f7548e7f1270fd09430feba6a75050b7a2c564279da9669c60d4572b211041b61707a2b1ecc5c68f7e482e34ae086957a3cbd57c9668753f542ef62aca1f74a54ae42caf956cb32f5e20dc767e4ab6264f87a1bb7a338", - "credential_finalization": "0b920cce6632b0857d46f206025e676f0695080d8cc1d5644d326d95c6a2d0e2fccc2a900ab7109fe03fd21de67f4153", - "client_registration_state": "455a31999c703a7e1f02c547b221efd8de43b3752d33f8a99dec8d940927a8fbd7cc177b3f7de0ed126ab14592658b4303af79e2fcb6f8756c037622fe1ff229f75318b3d1ef443a1ca5e0dfe3be2ae8defd14bbcfd7ecdb213aa709ad2967e161", - "client_login_state": "455a31999c703a7e1f02c547b221efd8de43b3752d33f8a99dec8d940927a8fbd7cc177b3f7de0ed126ab14592658b4303af79e2fcb6f8756c037622fe1ff229f75318b3d1ef443a1ca5e0dfe3be2ae8defd14bbcfd7ecdb213aa709ad2967e161259bffc38098904591dcccb05a627484eb319cf7bdc89f51daef43d6048628bb8a83a2f87a960ef26770568a8eeb9effe21abcc42ebf23d3dd720a120960545d1966328ae1dfb77272acfbe3aaa8aaf02f31378dfd8a53d756d6bdba5e13520f259bffc38098904591dcccb05a627484eb319cf7bdc89f51daef43d6048628bb", - "server_login_state": "21567ecbbdf6764b5f36f2bb9e8046f1bfa6d4c3db11cb26f6b3e29b7a3ca6965f076b72bdf6db08eddb30220fb721d169c8e5f1cc980668bb88bddb3004ab8c9e3388f6bc58ed3feaeb3172b45f4dea11ab897428993fdbf2fbf663adc490f1463ce9676bfb577b7ce9ac1eb25110a3017bdc944c64f82353a34148748619f8d68e413aa2a6c036b3c994389ff46ed2", - "password_file": "ce4056acf09dda5d527d61fdc1f20cbcb56a6144e5b8230943db9c4361822e680f5da3aa2d7f1ac6a06259d18d3833cb4d04a8a52b9616fed14e540c67e8032217ffdf91f9ce04162aab6da8f8826fb09edbf6e025bcdd9a0c8a08188fd0c383fd52cf62163a814227aee297a96cec0d620b37aa66ea69094b5d056ef8b93224fffac1b69792d217f2e9a5752089120b8749abdd3a81c7c6251af39eec9ea40a", - "export_key": "270ee69239092ee0cff59586530661e2b5fbd0c317def8ba3e7eb9c9010c1db65bc0b06f70f22638ca444dc71c59be12", - "session_key": "463ce9676bfb577b7ce9ac1eb25110a3017bdc944c64f82353a34148748619f8d68e413aa2a6c036b3c994389ff46ed2" + "registration_request": "03dba75ea5a2d7098184eb9d893d1ae700c6a1bb503bc428f31f6a7f7287f1e935cb6455f496cf1a99defb9dda9dccee72", + "registration_response": "02ce9845a29c0aeaaad662918b63206c82804c02a7c6c89e42de9267e335c9e575c432b34d9cd329264f2d8e58eba9f2edf6e186d53a993a1e9b5a7ab800e5ca40613c9dd079539f8d1eb4adb45290ce0d", + "registration_upload": "5e8a618435332e57f13db566352fa529ced0c51806541decc05c1a2bd0b83849076ccb5b086ccddd99ec9a0f6ed7a9915745b4528f1e82a45804dbbce6dd9e5bea90a4850f46b799846c233b097729ca534080c2057ec57614ca8fa00845f92d6ee0365b7ad58038771285414e2d4c0475dbe0074a10493e326a5cc8e8f021d7fd59150b8b04d9ad03e9fb532ddb4e0b4d52b92662fd97c2521c60999347c42f", + "credential_request": "03dba75ea5a2d7098184eb9d893d1ae700c6a1bb503bc428f31f6a7f7287f1e935cb6455f496cf1a99defb9dda9dccee7233d8715e90b58a8617715372ca0fcaba505097a3c727d0c5af8a5a0ae461b4cac0208fae944238c99b99168f31aa8989967e76d2233bea13b878f74e63aa253a", + "credential_response": "02ce9845a29c0aeaaad662918b63206c82804c02a7c6c89e42de9267e335c9e575c432b34d9cd329264f2d8e58eba9f2edd6b202587cb782158c431b1d75e9044ab31542c72999d568114b8855930e46074c604c9697ca3f5b4b7cbdebdc6a96c3486951e60a98161698799e356f9e6ab7fe86d125f16f9c22326fb34c9f64f1f3ad9ebf325c91deb343752c97fe2eb21ae26b933e5e3b698754d83ca475f2b329cfa3292586df4bfa8e5c74e1799c949ad58d3a4e8aed0f272742c926c459d400b8faee12ccdad26a4b6ad49988cd13f5fd4c25e50a46c6d0f76960171db96709103fd7edace4f45cf7b9b16ef3a1c2c1654eb4fea684d3272e16562efe204b0d553e24a3efd1337f60d5b5c6a04176e4dd603f1689de40e7c8a2ef66c6cbee67075a1e63a42712289ac51dff6ff5d39db6b71eca6d5d52364929f444388e403b", + "credential_finalization": "777865e615cda6f21195dcdf3eb851d49fb92e352c39909f4a2ab7d72c5f8f975c07a07192a04009ae3e1780e7dd208b93416a64b506dba034993a1103bf0542", + "client_registration_state": "94a88fbaf92f4544a6d730da7cab9841fbca9505f798528c5b2f197f8472480190affa02542c770f892a427062520c0b03dba75ea5a2d7098184eb9d893d1ae700c6a1bb503bc428f31f6a7f7287f1e935cb6455f496cf1a99defb9dda9dccee72", + "client_login_state": "94a88fbaf92f4544a6d730da7cab9841fbca9505f798528c5b2f197f8472480190affa02542c770f892a427062520c0b03dba75ea5a2d7098184eb9d893d1ae700c6a1bb503bc428f31f6a7f7287f1e935cb6455f496cf1a99defb9dda9dccee7233d8715e90b58a8617715372ca0fcaba505097a3c727d0c5af8a5a0ae461b4cac0208fae944238c99b99168f31aa8989967e76d2233bea13b878f74e63aa253a4a17eb07e1f63e17fda30b4126d6c68e34407a2a858d9da1182435c7b535b70033d8715e90b58a8617715372ca0fcaba505097a3c727d0c5af8a5a0ae461b4ca", + "server_login_state": "564beff3c3154fb778e4f401bcbe438db7b4e8c37d5e9930519e40d1045004021e805cfdb67e9123236ebb37a5cd9d5dfe621e7b8cadd8a59393ff940638e4aa777865e615cda6f21195dcdf3eb851d49fb92e352c39909f4a2ab7d72c5f8f975c07a07192a04009ae3e1780e7dd208b93416a64b506dba034993a1103bf0542", + "password_file": "5e8a618435332e57f13db566352fa529ced0c51806541decc05c1a2bd0b83849076ccb5b086ccddd99ec9a0f6ed7a9915745b4528f1e82a45804dbbce6dd9e5bea90a4850f46b799846c233b097729ca534080c2057ec57614ca8fa00845f92d6ee0365b7ad58038771285414e2d4c0475dbe0074a10493e326a5cc8e8f021d7fd59150b8b04d9ad03e9fb532ddb4e0b4d52b92662fd97c2521c60999347c42f", + "export_key": "9e8ba133bd91c2ee1b2eb8a2dad67b7154af90a1e56647f16e0b319aebca3998445a3371b2f5e097c976778a718bc1f2", + "session_key": "564beff3c3154fb778e4f401bcbe438db7b4e8c37d5e9930519e40d1045004021e805cfdb67e9123236ebb37a5cd9d5dfe621e7b8cadd8a59393ff940638e4aa" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_RISTRETTO255_P521: &str = r#" +pub static TEST_VECTOR_P521_TRIPLE_DH_RISTRETTO255: &str = r#" { - "client_s_pk": "72cd7e14d3783cb5be0fc6ad4fc6b017d5241121440d1dcb182e02375a657d1c", - "client_s_sk": "e36d535c93751a225f376b6a8a4eadfb345e0691c6bcf90e75d1449dcdb58103", - "client_e_pk": "661eb1759eef9e4e441ac26b6bfcedec9f26eef5059ee933f9f14b50b8009b2a", - "client_e_sk": "9dbea61c1274a0f503e2ca99e453fb66cfcd36cf25a71134ad8771448d5fa000", - "server_s_pk": "b468c7f23efc6312a44962b8f595b8e6ad66056eb3b1e6fa2b2a3435153f514a", - "server_s_sk": "3e8f978166b13a5576ce3cd55477770c7f9b53d8235c08bfe1f4496318d07f01", - "server_e_pk": "ee27cb2e60a9baf1525fe07cb45e4cc8f85ac6880165953728bd8574a7726a45", - "server_e_sk": "7f7429afc86b1218ce14b7c3f3049a8930880ad05529ecba79dca703bcdff404", - "fake_sk": "618e6dcfcefbfe46904badd626455a2d359cf3150c93e1278e6c8d374ecf6b04", + "client_s_pk": "aa57cf0406d5de8e5b0d0778be3d11a6502d07e379bdfa9b4ba7fac0da17037c", + "client_s_sk": "a6ddf4da61041826933a4c52cfd3f9135c6fe3ef6407ef738e41c985edddd008", + "client_e_pk": "344ee3cf97158e2850b8bcc942ee5c0ba4b7744310c90a516bebad6957995b61", + "client_e_sk": "d596d12e3e589656b9f6b88d0a7af1dd86273498b54227830343761f1134e006", + "server_s_pk": "16ff2eb8c3d147443d13558988da5b3db49da6e1652cab747d71b215ef4ccc28", + "server_s_sk": "0284f717c8bf56fa24108da99afb441a272a13e2df1e860d7aa752e03a72ad0a", + "server_e_pk": "5cfa072dd19b25d0b27265497a6923f378849b945dd55f15b90af13ec1c93c1b", + "server_e_sk": "600521bc8f109f3a8baf45e8d3954c221be5961ef8e879b25d0fcd803db0b100", + "fake_sk": "0a3c1999096f17cf56de91d3222d731cd8ed38d2e6a64473847a7a86fd9b1c03", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "0145abf45813e7b7a52ccfa38361213a0660f0049a1f486a3aa6221d8e6b6ac5bae4fd5dcc2351e4f771166a5af50f72870a491cabdcbfcd662d08b9f60a7412283a", - "oprf_seed": "898ad6cd5a90ff655408fa09f975ef442acc695167c5117396b3974d2447399011b785078a0b0301559a373e30da13388edec46b9a853449bcf4e558a83bcdfb", - "dummy_masking_key": "e2a98190f8728930806c55ed56aebc188ca12eb86c9ff6987a4349a055db29b1e3f2ab6a9422e0d45ac49c56f28164b5bd742051efec49cf12c408692c0c5093", - "masking_nonce": "115f2434fbb59f16a2c8242c6abf10e0861791a5b21cf5c759f4ed7d59c5722b54b93c40af9f034614735cc508419c55dc736d77ba7a149cf686743d31750b6d", - "envelope_nonce": "e06470400a5e27caabaa864562be6836f78807a9b7c662b230a9fbcefb356e62", - "client_nonce": "6a2019b73e52d0c1b1c1d21d1d05d3146ab3eff61659908f1ec3eec2b0c67417", - "server_nonce": "c761050cea816a8078ce8f470a9944516ac83fdff23561744ceb48aefedb65c1", + "blinding_factor": "004fae43832df215523a15ec30387c4a332cc78f96d09e834443c729332732d8cc6d9eee379d2d24fbaf926577313d143d35693d2deae4dbff7ccd505283758bb06b", + "oprf_seed": "d4ae2b0868ab7b00cd93d7836d24085b3801bfebbd315d0a8409167a6549e2e0d1afb652c73dd2401646c23569388ddd344d539955331af0c83ac8ae57fabb67", + "dummy_masking_key": "6775f48ef1b8b2aa49f207da0ee8485715177a1c3f0d67b32fad61c25144730c49b1d55aac7dc529447cb80ffae7935a99b0f2c455ad68ee443c9914dfaa1efa", + "masking_nonce": "f205f56ab01b02f66f83ed01beea5f5f9039b41e721b1552e7039e265c342474847f730ac5895b3533c4905980fe0b53693ca03692ba2ca77cea6ca0daf70e76", + "envelope_nonce": "4e74bb4b5868faf51aac4f5ca442b06f457ead6f250117292410ecde5513f4a3", + "client_nonce": "12d55514be7aa3b660a80bcb754d4d29f6ba13f8a7e8a98807dcaac72e188f90", + "server_nonce": "9195b6a3d793997edd1553f20a2914e2651a5f4f5709c4dc13e943b5c79f5780", + "server_sig_rng": "91994ce57de8f45c42dbf7b2a8ff4c04f9f89445c1a3b6e16996d511f9ebe5c5", + "client_sig_rng": "af24e214418138d1114c53559da5a194942428b6a4b24cbfe806657bf7efbbad", "context": "636f6e74657874", - "registration_request": "0300efe0c2052ed6245b5724006dffccaa2753e62b0a207c8d6441fd0e35ebd2dae51db9c892ca699e05f934189c8c3dc4eb7eb028c0bec9228195c4bb98be76b66e7d", - "registration_response": "030194964461c89ea21c7272c02018b6a3a8240becff65e81b0dd6c20f72d4083810684ff0b3c2929b54ce23cb6ef10b27771e1462fcba4397cc0518501d70c2eccaf3b468c7f23efc6312a44962b8f595b8e6ad66056eb3b1e6fa2b2a3435153f514a", - "registration_upload": "5eab12669b4329e85381b8100f45acd3b21bf13468c32c2cacdb120c7e5fdc1f6455ab63a994cf6109ac19df6136375fc6192def66b1db826b00df9efa389b771831c08099e5e2cb60a3d9704f552421d8976c82217eaa6ff47dac99b2c621ade36d535c93751a225f376b6a8a4eadfb345e0691c6bcf90e75d1449dcdb58103d14884e1eac0684e7d4fd1ff611dab313c1af21177f8a48509783a1f0ca51b720e5ae2b1a9b21155f8336bef4ffa2233a09de41891f28c39bbfcd852c61c7103", - "credential_request": "0300efe0c2052ed6245b5724006dffccaa2753e62b0a207c8d6441fd0e35ebd2dae51db9c892ca699e05f934189c8c3dc4eb7eb028c0bec9228195c4bb98be76b66e7d6a2019b73e52d0c1b1c1d21d1d05d3146ab3eff61659908f1ec3eec2b0c6741740e65570ed8be4bc723870ce2b5310b37408949818fc3225ae9788f08426f634", - "credential_response": "030194964461c89ea21c7272c02018b6a3a8240becff65e81b0dd6c20f72d4083810684ff0b3c2929b54ce23cb6ef10b27771e1462fcba4397cc0518501d70c2eccaf3115f2434fbb59f16a2c8242c6abf10e0861791a5b21cf5c759f4ed7d59c5722b3a1bb18b826ddd66bcd421df23d2f0a597986f2c5a489d3574e5b557dd63d63fa45dbb834444c7e18c92ca2a4e1adb12f2473f417e9f544cb64c63636e9ced99b1b8757fc8e970e65b79d3007255315098c3a82aa592c7b89760f2719351191f5cf2fb60f3801afa9083980c1bedb4c680a1c6e202755929b3dd86726692cd967f7429afc86b1218ce14b7c3f3049a8930880ad05529ecba79dca703bcdff4041078f0e311b4d86be146057b6c491c934f8c84a5c42aa51b2069287ab022f848071bf43899ad98a8b9594d60715dcab303dedeba7d12db2ffc78c3e35e23fcc1e543adc42f24bc0e4075cd727dc7ac2bf2e8faa057e82ce8c074580066a5308c", - "credential_finalization": "bca3a503eea3021adee2972d6f8604cb93e35f49f4c282afe766df0c2ccc1ca67d03123e903e710542a608bd35892fdd5a6f0d37907d155c830127ad968c6f1c", - "client_registration_state": "0145abf45813e7b7a52ccfa38361213a0660f0049a1f486a3aa6221d8e6b6ac5bae4fd5dcc2351e4f771166a5af50f72870a491cabdcbfcd662d08b9f60a7412283a0300efe0c2052ed6245b5724006dffccaa2753e62b0a207c8d6441fd0e35ebd2dae51db9c892ca699e05f934189c8c3dc4eb7eb028c0bec9228195c4bb98be76b66e7d", - "client_login_state": "0145abf45813e7b7a52ccfa38361213a0660f0049a1f486a3aa6221d8e6b6ac5bae4fd5dcc2351e4f771166a5af50f72870a491cabdcbfcd662d08b9f60a7412283a0300efe0c2052ed6245b5724006dffccaa2753e62b0a207c8d6441fd0e35ebd2dae51db9c892ca699e05f934189c8c3dc4eb7eb028c0bec9228195c4bb98be76b66e7d6a2019b73e52d0c1b1c1d21d1d05d3146ab3eff61659908f1ec3eec2b0c6741740e65570ed8be4bc723870ce2b5310b37408949818fc3225ae9788f08426f63448d6f3675c185a769ca4c4173c28ae0184815c7edf2654e10d1f09b5b16f450b6a2019b73e52d0c1b1c1d21d1d05d3146ab3eff61659908f1ec3eec2b0c67417", - "server_login_state": "79660127f20909d65338dcd20d64bd9c93185b81cbdb116d429bc3262f8b08422a653a4cc29d3acf32f4d492becb07e3fffab80387eeb3803f5faa805bc241250a10bcdbb992a6f9f500afb66342eaf5a3d6907e9db5e4f0432bcd1bd2e068239200d96582847212ed2581ac0adfd942bebf630217cbac0038c3f9da5d1a035ab121e198eaa193710b7284cbdec9d39ef3fe58447a7e91c95b150491a93fd399e1997df5930c009a5f44471f0d4b8931273f8100e27ed2c08c94ddd9b32ff2b0", - "password_file": "5eab12669b4329e85381b8100f45acd3b21bf13468c32c2cacdb120c7e5fdc1f6455ab63a994cf6109ac19df6136375fc6192def66b1db826b00df9efa389b771831c08099e5e2cb60a3d9704f552421d8976c82217eaa6ff47dac99b2c621ade36d535c93751a225f376b6a8a4eadfb345e0691c6bcf90e75d1449dcdb58103d14884e1eac0684e7d4fd1ff611dab313c1af21177f8a48509783a1f0ca51b720e5ae2b1a9b21155f8336bef4ffa2233a09de41891f28c39bbfcd852c61c7103", - "export_key": "fac759dfcdf4de3263d082e175e75a10366b6124d51704ebd22282aec0e79ba77042fcaebbebbd4c7e3043cc5776844adc86b9569c24ce77ab55ea6f352d54dc", - "session_key": "b121e198eaa193710b7284cbdec9d39ef3fe58447a7e91c95b150491a93fd399e1997df5930c009a5f44471f0d4b8931273f8100e27ed2c08c94ddd9b32ff2b0" -} -"#; -pub static TEST_VECTOR_P256: &str = r#" -{ - "client_s_pk": "03e1c2150c2b1faa3ebec9d31c5034de56e785865534b1a2119bf69d2a777b78a4", - "client_s_sk": "77557f8f65e411a16a7f81ef130058212f7691501cb91a0816c4db86e4190af7", - "client_e_pk": "030c8ffd0536713112106bc3e9c798562f693828dae9053cbc10c04cebbaaead52", - "client_e_sk": "e8d4a9356551468e9697ba0167a377a335063acd40b08a0d1438fce6eb17d1f5", - "server_s_pk": "022cb65a03de94e69aea19cfd5a5c344d95304a7dc2edb6020d99b4cf4a85d5d88", - "server_s_sk": "d5feeb1ccabbc4c5c83b23c742a99c6daed7496f6b97f9dc04f03a55d55b8edf", - "server_e_pk": "03e9d81cf039447bb38be1a6d653168af50017b338c1c8d08f47597c1dfdb9b5a1", - "server_e_sk": "6fdc1885b37673ca1af28c36cb53a2006dc303ed9a69aa6e53e04695f03e7e4b", - "fake_sk": "13f797a4a287325054f2c7d55d0bbc012e3c58cd4ee16583cf30a6ad040d52e1", - "credential_identifier": "637265644964656e746966696572", - "id_u": "696455", - "id_s": "696453", - "password": "70617373776f7264", - "blinding_factor": "9d0b4b3186ddc545c3b21e4c2956fba47361d79c98d4cbfa5c04209dea2ae7f8", - "oprf_seed": "bb5f5c969c99a7f3e38b24554e1de54f795bcfa0764b605e81f046736946447d", - "dummy_masking_key": "f69488c15424f40017e7e8d1a434e755c051888f26f06da50c900e0284f22a98", - "masking_nonce": "2081b40f321bdecb8d08cd5682de91ecf443e4d3b4b72dfae0aab66396f6875651cd3f590b139962006d9ce65fbbfa33c143b8f1304f317c7d6ac5c737aae0c5", - "envelope_nonce": "541558c8559c3c87c9a368cf36b199ca3d439225a5f79f366ca79fa77511d777", - "client_nonce": "59f9de16e76e762aeffc4ea2c6df000f75a1d73851fa27e513fb7d29f8e7d7ad", - "server_nonce": "f718bcab85eaa8c537ba0101e4bbbdc850df8bc73082e6acc56edb9c59c2e934", - "context": "636f6e74657874", - "registration_request": "021893404cbc5519650b0466571f1bfc0b4191404e1afdaa2fc3243872e3c759d7", - "registration_response": "02baa5c091bb0883cf9293eafad2a8d323a7dd306520a5bdf105c560e54e6d161e022cb65a03de94e69aea19cfd5a5c344d95304a7dc2edb6020d99b4cf4a85d5d88", - "registration_upload": "036cc5713f3e7a372d36f253c099083ba5a7e2d3deb94c464a89ff37e7f4d1b8c46dee9eae7eb2b201472d852c90bf8e3d3f36df424f84bafe7558d46c224d437877557f8f65e411a16a7f81ef130058212f7691501cb91a0816c4db86e4190af75840fa1930411589917f68573b65185d53cfe960de8e8dc9dc42abedfa76a58b", - "credential_request": "021893404cbc5519650b0466571f1bfc0b4191404e1afdaa2fc3243872e3c759d759f9de16e76e762aeffc4ea2c6df000f75a1d73851fa27e513fb7d29f8e7d7ad03415d253ebe586cb48e99671e378889f45d5ec1d7a85f2d3fd1d73509697b4002", - "credential_response": "02baa5c091bb0883cf9293eafad2a8d323a7dd306520a5bdf105c560e54e6d161e2081b40f321bdecb8d08cd5682de91ecf443e4d3b4b72dfae0aab66396f6875619c8ffe33c4e0fc1723f564a0d8a1516ee083bd2120a5557ff01d90284f90fe7d0cc7c0337db02ba1f5f5de03f7b45da0fb576238cf5b014b675a1c9d3d6d17100be5fece35824446743f57cf36c986f0c284577038125745e7b1db7546c26cb8f6fdc1885b37673ca1af28c36cb53a2006dc303ed9a69aa6e53e04695f03e7e4b02b1df107ee2810120a07fe8b70ae71ff5c5a401b4b8bf2d9131ac8f857d3358a47e8a61d49a05b8833712237012a7f9e48d7cf7f6a2fbacb76aa125bc089465bb", - "credential_finalization": "1f9a8e88a4e403c1efec42aa3d25a8712a69a7a4d8e882239f34234bd56c369d", - "client_registration_state": "9d0b4b3186ddc545c3b21e4c2956fba47361d79c98d4cbfa5c04209dea2ae7f8021893404cbc5519650b0466571f1bfc0b4191404e1afdaa2fc3243872e3c759d7", - "client_login_state": "9d0b4b3186ddc545c3b21e4c2956fba47361d79c98d4cbfa5c04209dea2ae7f8021893404cbc5519650b0466571f1bfc0b4191404e1afdaa2fc3243872e3c759d759f9de16e76e762aeffc4ea2c6df000f75a1d73851fa27e513fb7d29f8e7d7ad03415d253ebe586cb48e99671e378889f45d5ec1d7a85f2d3fd1d73509697b40024f542e65e389a9a000e9c6f202b0a7fb2201c0b715b9028335c5d906c3c03e9859f9de16e76e762aeffc4ea2c6df000f75a1d73851fa27e513fb7d29f8e7d7ad", - "server_login_state": "1ce6b8f7e65975f6e1a319c68822bee3df77f7f2a66189fddee5c9324a497fd289aa03f714af9d54b622b37e299ee12cd1516941f7f7658fca3ce8e314a1186e589879eaac24aea7a41235b93c9662b76bb47069b13669cdc99038cbcdba81db", - "password_file": "036cc5713f3e7a372d36f253c099083ba5a7e2d3deb94c464a89ff37e7f4d1b8c46dee9eae7eb2b201472d852c90bf8e3d3f36df424f84bafe7558d46c224d437877557f8f65e411a16a7f81ef130058212f7691501cb91a0816c4db86e4190af75840fa1930411589917f68573b65185d53cfe960de8e8dc9dc42abedfa76a58b", - "export_key": "10c02e5549022b40ce1298c28b523c7facc7c4bd24dfd80a8d5612f5982f3a05", - "session_key": "589879eaac24aea7a41235b93c9662b76bb47069b13669cdc99038cbcdba81db" -} -"#; -pub static TEST_VECTOR_P256_P384: &str = r#" -{ - "client_s_pk": "027e7c148e4503d0f485fffaa68c109624911f2763320cb4e678a065d1ee816152", - "client_s_sk": "0a8e468d95c875331f7bce38773c58c16e57fb4d2dcbb529f8b188311a518f13", - "client_e_pk": "03bc1ec705a6aafc5a83ae6b7dbf5cc71dd874bba74a469ebc4e877e1c247f99f3", - "client_e_sk": "b5db18d113d9e2af184886304092e59c4883f6803365b4f960a854ca21289ced", - "server_s_pk": "03ea414c4771ad244a72c80d29a4384312b4030b7fad12394630f94509924c2f5e", - "server_s_sk": "cd866a2ea1f6293cf25471ec0e6a76f6d6fd68822b94beeb5774bc852d9b06ba", - "server_e_pk": "023305135e3baa9468f504aca21d5a7adc79555a39b8111f93d8fa6a3e9772ff17", - "server_e_sk": "3675e89977b99b1ad73c3fe6b13379b5fbc3415548c80572abb623f1de494784", - "fake_sk": "09ac950c973c5d9486928a78e9a685710bf64fe9edb4daacdb69b0144fd9d242", - "credential_identifier": "637265644964656e746966696572", - "id_u": "696455", - "id_s": "696453", - "password": "70617373776f7264", - "blinding_factor": "4ab34b6394a9b6889636ec70a211d18bd5d18e66b1ced0fe88faa9a058d311a00d8fed4a0c78c0c79e8589e0d1f11241", - "oprf_seed": "823bb82ee33e8e56a6e1592870c10a303e3626fece7b5db371d54fc3142d5620f88d5d760398abc6bc867019a95b4983", - "dummy_masking_key": "0f5f91f988199cec2c71e91a171432a485474125530e9b6e96a5e7f5f64f14fe5823b39557e22dcec390a741417fc403", - "masking_nonce": "fa56b5f6abd17e220d6a5007051514cefb87eb1a441abdaf13b20c3441142de5ebfa8bf0eaeb4bf5fce7b58683faf5571570491f4ecfa76a9a53dc33bc3fc018", - "envelope_nonce": "d3480dc3f2c701be7544b1beeb9a4d6ad87c8543607e1aaa97c6d572d2f530fb", - "client_nonce": "df7e8d3d5f703553ccdeced829420166658ea89b86720c729eb21ff36eb7bedf", - "server_nonce": "2774ad471ad0879d810825badbe89c25cb19a93b79dbcfb483b26b225ba2b146", - "context": "636f6e74657874", - "registration_request": "03ce35657b8aead3196dd424ab0373a90fa3ec35204b2c39fd68db2c9b60256a027fe7d1c7520016e66d04c5f8adf7e7f4", - "registration_response": "0359a0949f9f25b10d11327ea1c16b1bfde6662c6902f09d828103cb8de17e6d3ed752ac7a28111ad429502da1e69cfa7b03ea414c4771ad244a72c80d29a4384312b4030b7fad12394630f94509924c2f5e", - "registration_upload": "02269392f05accb3e7a4a6e5c8b306fc37f7988dc718eb321810a5149f1cbaad66fd121fba1fe9c32ec17a8f98c383bf1709eea4cce729b370834d2196e62134f5931ec0152979dce87adee7bcd2fbafe10a8e468d95c875331f7bce38773c58c16e57fb4d2dcbb529f8b188311a518f13593017ccf8733292c6298e0fb783ce1f2646133f89c73460172509cdf270b9139a4c4717e4accae3dac4f8506b697d37", - "credential_request": "03ce35657b8aead3196dd424ab0373a90fa3ec35204b2c39fd68db2c9b60256a027fe7d1c7520016e66d04c5f8adf7e7f4df7e8d3d5f703553ccdeced829420166658ea89b86720c729eb21ff36eb7bedf0391ce7d33b115266ec72bdb6c41ae09864f9e5d2c9d7ff39ffbc9a3c9fd0ebc99", - "credential_response": "0359a0949f9f25b10d11327ea1c16b1bfde6662c6902f09d828103cb8de17e6d3ed752ac7a28111ad429502da1e69cfa7bfa56b5f6abd17e220d6a5007051514cefb87eb1a441abdaf13b20c3441142de50682e83922d72bcea507f4d0d66b2b55473e9fb9e4d6b2006520aff3617903e34a236481a3865008d77c9cd0acd0dc093225e3a048b18dd902606e3a7842f5c4cec66feaf2e75ae312c4f9aeb0f0bdba13a5a8089364ee1eb0e15ba9ea93e2a32b34776c26695f4663703788f02fd1137b3675e89977b99b1ad73c3fe6b13379b5fbc3415548c80572abb623f1de49478402be797971685661bfc0fd59b519af190a790558db3fa5f6fa8837354b8c55a6f24ae8e9cb81aa6d3981a971d4b28f8d69e0184a10ddf1859357b45475569b21d69c4175d0a9634dfccb959a4faef19228", - "credential_finalization": "cb7bbda3a438fbe8ea6aa39cb4dc9e85420ffc661fa2f16721b7c3d4777d1a6d21db1979009ccb6fa2bdb93d419529d7", - "client_registration_state": "4ab34b6394a9b6889636ec70a211d18bd5d18e66b1ced0fe88faa9a058d311a00d8fed4a0c78c0c79e8589e0d1f1124103ce35657b8aead3196dd424ab0373a90fa3ec35204b2c39fd68db2c9b60256a027fe7d1c7520016e66d04c5f8adf7e7f4", - "client_login_state": "4ab34b6394a9b6889636ec70a211d18bd5d18e66b1ced0fe88faa9a058d311a00d8fed4a0c78c0c79e8589e0d1f1124103ce35657b8aead3196dd424ab0373a90fa3ec35204b2c39fd68db2c9b60256a027fe7d1c7520016e66d04c5f8adf7e7f4df7e8d3d5f703553ccdeced829420166658ea89b86720c729eb21ff36eb7bedf0391ce7d33b115266ec72bdb6c41ae09864f9e5d2c9d7ff39ffbc9a3c9fd0ebc992a6352f87df50e5678e38efc35865458af811939da7030effb112221cdfb8174df7e8d3d5f703553ccdeced829420166658ea89b86720c729eb21ff36eb7bedf", - "server_login_state": "121a402f82ea2e53bdc383158155ef5b6bf3ea5129578e76ea39b569f030f173481f0b0eff16ad9adda1b60b03154dd76aaf7d8ca18abc50b775b3672e966f5c1bbf4dee41378e99b84d9cfdcf0fb1652204f9e77d1a48b5a97e26436868cc56dd0bc18b0c17ce77773f5e2e06220be6c732589ba899a03629886fe467d0e0e27f1e3e80698f7058e15e5d64f5dc4961", - "password_file": "02269392f05accb3e7a4a6e5c8b306fc37f7988dc718eb321810a5149f1cbaad66fd121fba1fe9c32ec17a8f98c383bf1709eea4cce729b370834d2196e62134f5931ec0152979dce87adee7bcd2fbafe10a8e468d95c875331f7bce38773c58c16e57fb4d2dcbb529f8b188311a518f13593017ccf8733292c6298e0fb783ce1f2646133f89c73460172509cdf270b9139a4c4717e4accae3dac4f8506b697d37", - "export_key": "2f5fd57eeebf8d3514c93733a4584326747ea8d751724f93421c8ce9a56815ecb1fb3ad6aa74b731b3d102501f311c24", - "session_key": "dd0bc18b0c17ce77773f5e2e06220be6c732589ba899a03629886fe467d0e0e27f1e3e80698f7058e15e5d64f5dc4961" -} -"#; -pub static TEST_VECTOR_P256_P521: &str = r#" -{ - "client_s_pk": "02e1239790fd56c54aa5927720e0a36e85aaa614537fda9001dd5b5e79dd2c807b", - "client_s_sk": "136643e4e9b6f15a6f475fd9f94bca195ea7b4f53e7349dbc1bfbf086d1a255c", - "client_e_pk": "036ff7f2f9d53152f7f824e70e6bdb4efcade1a860ea7b80432e32945e60b48208", - "client_e_sk": "e97f18b9bd74024708ddaafea1f7d484d62c536ce1326c0fdb1930ca46f1eb51", - "server_s_pk": "03ccdccdc2c4d3e181cdf3b28fc8ee1d4a62a5e8825f82dec65c8e26e4fb1aaa01", - "server_s_sk": "4ae9fb13d4b4272174210ac40f790c6a39df26270daaf94098c7fe7fa45e1d7c", - "server_e_pk": "02369bc9abc587b44ba7225f1c637cee356b2e88289422451537c5048137eb419d", - "server_e_sk": "21a0f3e05c8cf83a7eaf9dceeb09a574f9862eeec316f4a1123929882a57817d", - "fake_sk": "d63687b03795727d50ced130494d3b76904a53ce39edb956288c09ad11e3365b", - "credential_identifier": "637265644964656e746966696572", - "id_u": "696455", - "id_s": "696453", - "password": "70617373776f7264", - "blinding_factor": "00fe0f52e3c857773be186ff5468029a3cd6760e6544d7e44d9908fa80ef5c7bfe40cb9fd4272494c551357f3b6e416d3c739d38769e34f8a860baee8ec77c2e13f6", - "oprf_seed": "01b902ae3389f7f0c69397fc7229e998fde7f7265af511bb3001390d5f45cd6098d4c3396dc771fbc564efd60056be4752627678eb8ca81fe163f981b98abe2b", - "dummy_masking_key": "51b28845f26c1be6cb75514319f4e87714d8849a4b720f2d73fe4b3a84abcb50b996f7b45d824147f54d0a7e49b2a0b0184875c5aeed2750d32ae0bdef1876ef", - "masking_nonce": "6cbcf9c8f3843eeae9f060c191b986ce213fc88c2df6a54fb565368dc4e4c02384270441c81ea430e84af7d4f5af46066ecf4be9543b0e823a1b5187c6f2a99c", - "envelope_nonce": "e028b61be5227a249787f8609f314f065821ee3fe119d4b3c20ec834d95305c2", - "client_nonce": "7f529c24bdcb379eea7a09acbbe0a6beb2201204ce603c48a1feaf20b2ba5a52", - "server_nonce": "4cbf4c845bb375732d44542070c422d813e146a8cf6e76905794212eb7cb9181", - "context": "636f6e74657874", - "registration_request": "0201b7e56539a111fe421c38b9bddb06c547c0da3451cd61e7acb41e29c89fab55772d42e89912c4bc1d19154b6a885e2b0a184278578e164e4bbcf5491f4f45117def", - "registration_response": "02016afb6f4c5abafcc3a3f615d005a5f043dffa0dc5b9e43692fc866c2a4822a54b6956da0aa23cd83d4ce37a4fee321345f65415c30bdc97354bb896c703f2a7b90a03ccdccdc2c4d3e181cdf3b28fc8ee1d4a62a5e8825f82dec65c8e26e4fb1aaa01", - "registration_upload": "024205451f6021ad522b59575be864819480fcc05d3d33e6a1db1594634d7904118e5af3142cc1d70cd7921b580a7dd416d0995e777df0ab6dbea3feffaca1052c61558041f21a5cb37ca96be86a76b1a42c34512bca6ff6b9b67805a35a76c05c136643e4e9b6f15a6f475fd9f94bca195ea7b4f53e7349dbc1bfbf086d1a255c0b16ad4fefe5b0c39c3446bf7721c9e899fc8d483949952abb74f63df9898bf68c69369016f911f03fadce2db44316e7e57733be2cc6e6a1f424d76250221122", - "credential_request": "0201b7e56539a111fe421c38b9bddb06c547c0da3451cd61e7acb41e29c89fab55772d42e89912c4bc1d19154b6a885e2b0a184278578e164e4bbcf5491f4f45117def7f529c24bdcb379eea7a09acbbe0a6beb2201204ce603c48a1feaf20b2ba5a5202101b3abe2f64b87050a825d5c74e055fb1dbabbaeb9ad33d0d303fef520ba02e", - "credential_response": "02016afb6f4c5abafcc3a3f615d005a5f043dffa0dc5b9e43692fc866c2a4822a54b6956da0aa23cd83d4ce37a4fee321345f65415c30bdc97354bb896c703f2a7b90a6cbcf9c8f3843eeae9f060c191b986ce213fc88c2df6a54fb565368dc4e4c0236da568e6e6a78fb341c6b0c66d474f7042dbfad1dde1d304e66e2c21f8acea4f7c5030e8cb55ee895df1d60de2299636caa7a7324dd95b88aa99ce2bafdab5f1b812ac971bc0354e4458a7c53161c6570a10be846163b52747c9102b4189cc4ebe5b09190fe4baec24fda86e5dd864dfc71d71b36c972a52ad3240bf32024592b721a0f3e05c8cf83a7eaf9dceeb09a574f9862eeec316f4a1123929882a57817d03c5fb0d259abaf3afb197740060feb548bbad5df2a4b1c02a24e6eaf07037e83df52f919597f5063df89ae86072bb6c4b84bf91e8678b9953dca58ce7eff36d0f0b16fcc13462449ba3f16e246991284af0a351aee4958d88fb76374125cd3d35", - "credential_finalization": "047259ef1b03569bbd8904bd4da1e4fd2c820dd48e1f4b7240055f21b02d0348710e47a73d49cd2731c94ec2d384ecd05998296c6f505ba7169c538a02faf5bc", - "client_registration_state": "00fe0f52e3c857773be186ff5468029a3cd6760e6544d7e44d9908fa80ef5c7bfe40cb9fd4272494c551357f3b6e416d3c739d38769e34f8a860baee8ec77c2e13f60201b7e56539a111fe421c38b9bddb06c547c0da3451cd61e7acb41e29c89fab55772d42e89912c4bc1d19154b6a885e2b0a184278578e164e4bbcf5491f4f45117def", - "client_login_state": "00fe0f52e3c857773be186ff5468029a3cd6760e6544d7e44d9908fa80ef5c7bfe40cb9fd4272494c551357f3b6e416d3c739d38769e34f8a860baee8ec77c2e13f60201b7e56539a111fe421c38b9bddb06c547c0da3451cd61e7acb41e29c89fab55772d42e89912c4bc1d19154b6a885e2b0a184278578e164e4bbcf5491f4f45117def7f529c24bdcb379eea7a09acbbe0a6beb2201204ce603c48a1feaf20b2ba5a5202101b3abe2f64b87050a825d5c74e055fb1dbabbaeb9ad33d0d303fef520ba02e6d93d7798f3d6c7e1cb9682a756c6e6afbec66798cb13d693ac811d71ad21eec7f529c24bdcb379eea7a09acbbe0a6beb2201204ce603c48a1feaf20b2ba5a52", - "server_login_state": "77c392bc83df527f45f17ec76463b8871206c6e882f693fc78b79a8ef3392a25be7f5650ef263729dece8f3d2c8f60c083f7b4697246496cf7f0dd145932b4205053a55d0f8d7247dc99d2b24f0f36c7baa48d569fb24ccfba9ddb8ef1dd450f9c87e5ce8daef3cd1a803046d8a47179fe5f6f84973f0dcc744d4922df0b829428e54f941fd77bb2e38592ddce904ad7c8cdb3f0bbc95b997d272d728985f03c384cbe816133560937a53889b55ecfafbc2a0b9be640764cebda2b4adc16666e", - "password_file": "024205451f6021ad522b59575be864819480fcc05d3d33e6a1db1594634d7904118e5af3142cc1d70cd7921b580a7dd416d0995e777df0ab6dbea3feffaca1052c61558041f21a5cb37ca96be86a76b1a42c34512bca6ff6b9b67805a35a76c05c136643e4e9b6f15a6f475fd9f94bca195ea7b4f53e7349dbc1bfbf086d1a255c0b16ad4fefe5b0c39c3446bf7721c9e899fc8d483949952abb74f63df9898bf68c69369016f911f03fadce2db44316e7e57733be2cc6e6a1f424d76250221122", - "export_key": "ecfae87c58974d746d15249ee0288e850a727eb938841fd52eb6d8b05926166a03c9dd003754ced5404eac2997e1338fc83b52377deb7adb5c5c03ef4dbaabf8", - "session_key": "28e54f941fd77bb2e38592ddce904ad7c8cdb3f0bbc95b997d272d728985f03c384cbe816133560937a53889b55ecfafbc2a0b9be640764cebda2b4adc16666e" + "registration_request": "0201cc2cba7541b279b6febf1eba2936f582c1727c6c50beccf02bdd57b7c55b8ba3b85d35f80c940b03735165cf238c3bf342638c9d191c80d624fc9eac410abdb418", + "registration_response": "0201015e629e095ac6373cb5c949b08e0b9f4116c831c7b92128c8f3a3d575a4b5f1c6e1289ebaa72789f40524ca3b371c1450694a0a164b5d36a9ee9f79f6df14782716ff2eb8c3d147443d13558988da5b3db49da6e1652cab747d71b215ef4ccc28", + "registration_upload": "34d958798133c45a35b8fd748874efd43b7244ec1ecc215e64bd9a31b082506f41e8c8859ab04b22578fa1c89da216fdc28313d1a243e443dc9d85f803c2570b128e0f90896ce645db05fe2ed9d4214f6d2b0ec357c988e7ba9cbf1543135d62a6ddf4da61041826933a4c52cfd3f9135c6fe3ef6407ef738e41c985edddd00853370e5939ac84c0371310997cf2b5dd2b3bb1d848e9b81bada262a3df398aaab83bf6889654a444d3f75c8b8fbccf6b660a4edbd65e54b22ac9379556d43865", + "credential_request": "0201cc2cba7541b279b6febf1eba2936f582c1727c6c50beccf02bdd57b7c55b8ba3b85d35f80c940b03735165cf238c3bf342638c9d191c80d624fc9eac410abdb41812d55514be7aa3b660a80bcb754d4d29f6ba13f8a7e8a98807dcaac72e188f9042a12a7f41575a941b7f64bfcb2bfbea8addebb39dc749d87ef80e44d4967669", + "credential_response": "0201015e629e095ac6373cb5c949b08e0b9f4116c831c7b92128c8f3a3d575a4b5f1c6e1289ebaa72789f40524ca3b371c1450694a0a164b5d36a9ee9f79f6df147827f205f56ab01b02f66f83ed01beea5f5f9039b41e721b1552e7039e265c342474905c83ee2ae4c35ad24c07eb4f81b2efc974b899b1b9c4bad0dc3c5a8f353676ea61bff44c78e71e77b6d648437945a847f02ebf114ff70bf384670387fede5f43636d864db9e5bd9aab21ccda3ce0768ab76ae3a7da18c5565d331cde49fd46030a0fa0dcfc4fb3db4a825c5fcfe755fddee6418aa9b103fa14f5824ead4089600521bc8f109f3a8baf45e8d3954c221be5961ef8e879b25d0fcd803db0b1005cfcc2e4cf539cab478510c0d9dade8efb8c631901b25e2ff2e1bb33a57e516ac6295fb5a4b36d35616422d9226f0edc81386c1fdf128632c9cecc6d79ab3a68f65c1d2bcb6b792daf5ccd75ceb2fcfa4cf342269451c91e759af4eca83641af", + "credential_finalization": "48d195d1821284011ae8b3d27b96271dc87479d78091f98110f7c522198a674e745b9cdc9b31186675b5ec5ce6186dfe8a2043b5a7afc4527e2811b55ea79ab4", + "client_registration_state": "004fae43832df215523a15ec30387c4a332cc78f96d09e834443c729332732d8cc6d9eee379d2d24fbaf926577313d143d35693d2deae4dbff7ccd505283758bb06b0201cc2cba7541b279b6febf1eba2936f582c1727c6c50beccf02bdd57b7c55b8ba3b85d35f80c940b03735165cf238c3bf342638c9d191c80d624fc9eac410abdb418", + "client_login_state": "004fae43832df215523a15ec30387c4a332cc78f96d09e834443c729332732d8cc6d9eee379d2d24fbaf926577313d143d35693d2deae4dbff7ccd505283758bb06b0201cc2cba7541b279b6febf1eba2936f582c1727c6c50beccf02bdd57b7c55b8ba3b85d35f80c940b03735165cf238c3bf342638c9d191c80d624fc9eac410abdb41812d55514be7aa3b660a80bcb754d4d29f6ba13f8a7e8a98807dcaac72e188f9042a12a7f41575a941b7f64bfcb2bfbea8addebb39dc749d87ef80e44d49676694f3ced637f192fe900a3939bed1cc71bee2107bf9e4f8761120965381de4120e12d55514be7aa3b660a80bcb754d4d29f6ba13f8a7e8a98807dcaac72e188f90", + "server_login_state": "8b00fcf52ae9b178e8b9474bf29b762b1f8f94e165566cd35547901ec7da4975e70646d56e0b7ee65b86d7a2137cba4c3048a0fd08b629e8294a2cf1d2b815ca48d195d1821284011ae8b3d27b96271dc87479d78091f98110f7c522198a674e745b9cdc9b31186675b5ec5ce6186dfe8a2043b5a7afc4527e2811b55ea79ab4", + "password_file": "34d958798133c45a35b8fd748874efd43b7244ec1ecc215e64bd9a31b082506f41e8c8859ab04b22578fa1c89da216fdc28313d1a243e443dc9d85f803c2570b128e0f90896ce645db05fe2ed9d4214f6d2b0ec357c988e7ba9cbf1543135d62a6ddf4da61041826933a4c52cfd3f9135c6fe3ef6407ef738e41c985edddd00853370e5939ac84c0371310997cf2b5dd2b3bb1d848e9b81bada262a3df398aaab83bf6889654a444d3f75c8b8fbccf6b660a4edbd65e54b22ac9379556d43865", + "export_key": "d667a1569192616aba06e4628a06253f9543543cc608ea1e78b77351d26f38a88835dec96692c1c88ede590d7c161f3a7956647129f5c1dfb97cdb975b0c1696", + "session_key": "8b00fcf52ae9b178e8b9474bf29b762b1f8f94e165566cd35547901ec7da4975e70646d56e0b7ee65b86d7a2137cba4c3048a0fd08b629e8294a2cf1d2b815ca" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_P256_RISTRETTO255: &str = r#" +pub static TEST_VECTOR_RISTRETTO255_TRIPLE_DH_P256: &str = r#" { - "client_s_pk": "03026ea0944d1df39e8407c0a964432d0239db8ccd319689a832dad506c5ced6ca", - "client_s_sk": "234cc3cbca7be9169032255bba62bc57917590385425633d6ddc88b8936a832c", - "client_e_pk": "03c2629ba0c743a60a2fe02045cd32147d6c801b64ad8841a3e6fcb455a79e38fc", - "client_e_sk": "92f18faedf7646ee7f7129613eac2bb9b248062d48291096170f0cfd8709f921", - "server_s_pk": "02a6f5ff8d9a7535a74335552276691eb792ab4adc3278a7ecafeba13e42958ce3", - "server_s_sk": "71474622ce9ad98bd641f77aa61f79749ddc1b8d7b76a101227755fe9180c34f", - "server_e_pk": "035275aa294bc97809831a74037817b4a15e8df06188c40ebc107ab97b33577303", - "server_e_sk": "4add792f2080d5924313a8bd9cb217733d79194fe95b620992439caabb1137b9", - "fake_sk": "3d367ef8beff5d2b8beb8c6600ec13e516a060c5ace65860ddea0e5138ad226d", + "client_s_pk": "026790859385a7a831c85ec6f8387a4ff4de3e854470f0f14702de5bf255dde94b", + "client_s_sk": "f3c68be94b7aeadd092fc9ba49c1a4701af89bf0573da4f58de9e6a07e7e5577", + "client_e_pk": "02016e55aa5fe24c7457821a577e458ba2be8632ac8f105b15aa11a9ca251e9840", + "client_e_sk": "80b950c15fa6cf1147ae49fd4007b312a800e6bf9e61f945e763d4d183b6033a", + "server_s_pk": "03b115d433a3a91c9b2cc6af18dfbdfaac6fe178c21270fc4187186e206e996d4b", + "server_s_sk": "1b7fd8889ec31faa18e38a3d100607ee1815c372425f29846c431c044c6b36c9", + "server_e_pk": "02472da64481637248aa87124097ed3d2d0096c7a10f716c69a071fca3ce92fb73", + "server_e_sk": "2bd4ceea51cc345ba662dda09eb2e5885bcf4f0c3d94f7384348be5c4c194f2a", + "fake_sk": "3c39400282403dd845bcab3ce24de1986b5803f04e985d6adaa67884aa3aeebe", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "d0f02b4980dbda31b873ff30f2ee7403db9848c5da52422f86ad4901ddcc630c", - "oprf_seed": "09512ea525c218df4689ca389b77768afcabd15b46a2e4788db5086c2baf901aec0e5b91aca6e4192311c335c1dd11ed6a400e8c40db917f0ee2260418d070e2", - "dummy_masking_key": "6f917f2aaf77109ec60fa50a8d19e228c75a1d1a00cf3e4d70e5d986b47a168a6f0ee8c7d1a46483ed79d01a56e02eaf2771aeb5d76b7acce019e9ed52a3362e", - "masking_nonce": "01ea7ba530b518404175d12a3e5004055c4b4072f08b46b8df8e36069e208c610cd92478711561a6771ed2a274cef1d51f8570f356e38d4ae9486f9a0d8c6bf6", - "envelope_nonce": "a3d566093e5d8e6995678e696f76828021f08b432e0a4a686906b0cd7b6322b7", - "client_nonce": "9da97c1d08cf6dd0754ff9dc95bb4b4e598458e0da3cad3d4f17476eb6192876", - "server_nonce": "14dabeb290ae68d5acf1aaae05b6e4d9b5eecfb3ffe4fa1dfbf678777536f91d", + "blinding_factor": "4063b04313dba791d3fba47183dfe4317f50d943698a5464211aae8d27a29c03", + "oprf_seed": "14794f75b2a55e2688f233a308340efd48e3f8c9c66f00bf5ed1e348c3d939916e21c3967d667a22778c35b7cd52198879b7ae2a88a8571c5849cdd533e4fb5f", + "dummy_masking_key": "0047b9913d29605b116cc4bdd593b1592a50ef331a39f58b9cd260d191e26e9236f7d919093a1bd1cf8b306b1b388b4c802ecc05426a02126d46a6a0abc051ad", + "masking_nonce": "bbd0ad8bb995d18a0eca7bb16d200f19f41c964799f5ad1dc0a320b6a9c668e48808a3905d6f5c572a034a877f3a614e06fd340ca1cd601d307536bbc6f6756c", + "envelope_nonce": "c8be89bc8986352050cd87667ec4a5f7574b45c9f7e213a2f527c7400fb4e952", + "client_nonce": "3dc3e2407670893a64b349fae6465f23b1f8e1e1cefbd3a23f9bbc598c6deb92", + "server_nonce": "7f8bb37440b1d2c52047696e403862c09c5bc49be204a6528e70d26d2d043d5d", + "server_sig_rng": "de63e3b94fb6adcbdc3ee5a9b6f621a846e23888ea89d9bccee4c5974c345544", + "client_sig_rng": "b0642bc83ea8f5c1388348cdea66f3747ca89bacba127d2bb6dfb3de1d4b4a83", "context": "636f6e74657874", - "registration_request": "78c38705f5c390c5923127abfd8105ff80a1f4817797332c20ed4137e6282776", - "registration_response": "68591d75dd861bf57c078116172e62281e0a47401a885405315275cd3774552b02a6f5ff8d9a7535a74335552276691eb792ab4adc3278a7ecafeba13e42958ce3", - "registration_upload": "034272b8ac9b1add342edfd8cf430628ae27e62f71a86ea4caa3628b185c2c448f175d44f521ed20844fd14172969ed5b58caee202cd9e8cfa080be804ffe17659f80a8bcabec10b7508f59560d403be81ba87707c98676bcbb4d8717a61a9db80234cc3cbca7be9169032255bba62bc57917590385425633d6ddc88b8936a832c1f2cf53f061bf6ed1c790af085083482c4a9eeffbea0df87958929f6d12bf776e947931e970ee336b2a1a6301c66c03ea4fb65eced5282b0ffe5e1b2fefc95bf", - "credential_request": "78c38705f5c390c5923127abfd8105ff80a1f4817797332c20ed4137e62827769da97c1d08cf6dd0754ff9dc95bb4b4e598458e0da3cad3d4f17476eb61928760270848593f31d568aa99b21fc65bac62cff5bf741986e8a465606ae347212b742", - "credential_response": "68591d75dd861bf57c078116172e62281e0a47401a885405315275cd3774552b01ea7ba530b518404175d12a3e5004055c4b4072f08b46b8df8e36069e208c61c5ac49d288560cb68365a9544e57d3e497744ce48c63c856a3659d8264cbdfaa60518d0fd4292c660d5a308f0f188f8722e5d99047e45751fcd0b07f5652a2bd0318e81db7907242bc8be3633924e35c4590edff3806b1c9e48174120cd239305c1da98c856196040e59cf58f0b39f2fd33b467e0d9494b7f55387ba3beb36ad844add792f2080d5924313a8bd9cb217733d79194fe95b620992439caabb1137b903708d89b1bcf2e1b5af89a14b199f7eae1f36aff5282351ddaff0da85f792f0adb5d30c60ce9d02542c15cdbaf66f5e67eb44218a09df09a520b6842b29847e2b95df8fb4443c02e32bea547911e80e37013e88955387f3e3346042e750ef9cb8", - "credential_finalization": "be607998bf06e4ba479913158b90b8f45b4f8cd67b75cd92d851383efc8a0f115a9ef503cb7ebc3a0ea5984a8fe8bf9615adc42aebc62b9d360f79ef1b058f5a", - "client_registration_state": "d0f02b4980dbda31b873ff30f2ee7403db9848c5da52422f86ad4901ddcc630c78c38705f5c390c5923127abfd8105ff80a1f4817797332c20ed4137e6282776", - "client_login_state": "d0f02b4980dbda31b873ff30f2ee7403db9848c5da52422f86ad4901ddcc630c78c38705f5c390c5923127abfd8105ff80a1f4817797332c20ed4137e62827769da97c1d08cf6dd0754ff9dc95bb4b4e598458e0da3cad3d4f17476eb61928760270848593f31d568aa99b21fc65bac62cff5bf741986e8a465606ae347212b742b3c675b9ae89bee93fc3ad954ee7465eadd9a63bea622e4f8582d24b5ee044cc9da97c1d08cf6dd0754ff9dc95bb4b4e598458e0da3cad3d4f17476eb6192876", - "server_login_state": "71adb8c16a88570afef5ef650e1470847b2822429e72c160a76f74c622e47cb2326f793e0cff77204d6d36c6957b68134f3bb09e82715bc49e0c48e161aad0312bbf6f24a0e88d9b471b6d1a7bddbc54488b30bb72f90e0b7bee22ac966f94dfd86f186ef30c883e32d6449d439395ad1648166fc2f69e97e0b3215fe528449166da921d91e48960b1e298008334cf47b3a2cbb5fd903b6582bad10a7feeebb29d115286e66f326b841e3bc9f106297349f7ce92bca5fbf71966ce294712ce71", - "password_file": "034272b8ac9b1add342edfd8cf430628ae27e62f71a86ea4caa3628b185c2c448f175d44f521ed20844fd14172969ed5b58caee202cd9e8cfa080be804ffe17659f80a8bcabec10b7508f59560d403be81ba87707c98676bcbb4d8717a61a9db80234cc3cbca7be9169032255bba62bc57917590385425633d6ddc88b8936a832c1f2cf53f061bf6ed1c790af085083482c4a9eeffbea0df87958929f6d12bf776e947931e970ee336b2a1a6301c66c03ea4fb65eced5282b0ffe5e1b2fefc95bf", - "export_key": "fb62bd6e4d06407f7a67329d159d2686d36290378a2692171b172fc7527ee1ba78dd91da03c5894abb8a5a1f3b196f53f35802ea4e94822a6a6ffcb33f8ea30f", - "session_key": "66da921d91e48960b1e298008334cf47b3a2cbb5fd903b6582bad10a7feeebb29d115286e66f326b841e3bc9f106297349f7ce92bca5fbf71966ce294712ce71" + "registration_request": "acc2c9379130bc719bb98a86eee456a519c8c8f8484adf6ac57226140c7ceb49", + "registration_response": "48de5d6885172774ad9252a7288cc151927ad5d641d43da64dc01afe66bb181b03b115d433a3a91c9b2cc6af18dfbdfaac6fe178c21270fc4187186e206e996d4b", + "registration_upload": "02564cf5ab381f4f70f49b6b17f09b3ec706b367aecc1a577a473e1f34021867704c8af815c7d6e0f18eddc91d8e056c0c1c1970bc5b757fce7f791dd5012d143b710b8c6e127380d2d3410147b00e2360050ad91cdfbf711d180590015759c230f3c68be94b7aeadd092fc9ba49c1a4701af89bf0573da4f58de9e6a07e7e5577b466bef2e072ccced7f8bb6675a67a9121fc61f75d51a81c0ec18801f27a4eb28aa7cd39c688b4d7ba5b803c58f838cc38c2dbcdb0b1bb2c5c13e1a137bc2b77", + "credential_request": "acc2c9379130bc719bb98a86eee456a519c8c8f8484adf6ac57226140c7ceb493dc3e2407670893a64b349fae6465f23b1f8e1e1cefbd3a23f9bbc598c6deb920289ea492ef37cb9369a0c1665cdfebbcf23e76af4c6d8e5f1a18d9fbf430b6fc9", + "credential_response": "48de5d6885172774ad9252a7288cc151927ad5d641d43da64dc01afe66bb181bbbd0ad8bb995d18a0eca7bb16d200f19f41c964799f5ad1dc0a320b6a9c668e40264578661dfb99ea22fd6fcf6dbe8ba0f5fdd2338c1ce0e0a42762c6dcd8762bb114294bddccd090f3bfce6ac53ae46c85ce826fa27a48489bcdc53098b66dc70ca4603a003995ad8b97f6c5c8d73ead1b900de319275dbd7e4b74469e2d9089c8911695fb8c919c85983b7ea507e2fbfa2460a924419194130b052a7d398925c2bd4ceea51cc345ba662dda09eb2e5885bcf4f0c3d94f7384348be5c4c194f2a02956cb3b738cc7639c6be58f2bf847e2e6b4f7cac8a64f9a185db16619a6c7187893af79f5045d7ed6cae1cd2beb662caece013e547ad26daa26d905794df5c42", + "credential_finalization": "fa159298c114db818a60fc91053ca096c2fe7e5c14ae043e185d9a79ec6e12ef", + "client_registration_state": "4063b04313dba791d3fba47183dfe4317f50d943698a5464211aae8d27a29c03acc2c9379130bc719bb98a86eee456a519c8c8f8484adf6ac57226140c7ceb49", + "client_login_state": "4063b04313dba791d3fba47183dfe4317f50d943698a5464211aae8d27a29c03acc2c9379130bc719bb98a86eee456a519c8c8f8484adf6ac57226140c7ceb493dc3e2407670893a64b349fae6465f23b1f8e1e1cefbd3a23f9bbc598c6deb920289ea492ef37cb9369a0c1665cdfebbcf23e76af4c6d8e5f1a18d9fbf430b6fc976d7b544b5e7e1545a24944c90ad470659844edff060ca9eb8b88cf2dfaf63483dc3e2407670893a64b349fae6465f23b1f8e1e1cefbd3a23f9bbc598c6deb92", + "server_login_state": "42344b036d941303ae8b7c9ddd8b169bf22ffe9950616394b445fb32f319940dfa159298c114db818a60fc91053ca096c2fe7e5c14ae043e185d9a79ec6e12ef", + "password_file": "02564cf5ab381f4f70f49b6b17f09b3ec706b367aecc1a577a473e1f34021867704c8af815c7d6e0f18eddc91d8e056c0c1c1970bc5b757fce7f791dd5012d143b710b8c6e127380d2d3410147b00e2360050ad91cdfbf711d180590015759c230f3c68be94b7aeadd092fc9ba49c1a4701af89bf0573da4f58de9e6a07e7e5577b466bef2e072ccced7f8bb6675a67a9121fc61f75d51a81c0ec18801f27a4eb28aa7cd39c688b4d7ba5b803c58f838cc38c2dbcdb0b1bb2c5c13e1a137bc2b77", + "export_key": "abd974ca4b24dada7d3ea0ff4c39aee4b7467a9c4feb27fbf7491b9a47133e7e413196f681e58d0be7ec13e75cede797f242bcadf9004bcc8e2cc0aadd1f7911", + "session_key": "42344b036d941303ae8b7c9ddd8b169bf22ffe9950616394b445fb32f319940d" } "#; -pub static TEST_VECTOR_P384: &str = r#" +pub static TEST_VECTOR_P256_TRIPLE_DH_P256: &str = r#" { - "client_s_pk": "03ab4da61ecb2ab640a1859ac7f0361a101dd4708b34b17fa1040707bf9cf6d28a4eeb0e8203c2e064e75940a7bbc5c3ab", - "client_s_sk": "d87c3d890620389c8d810521c95e0d8d22fc24b17ac71a98e21c8765c1d2ae65d92cfc3e808c4052b084aa2ef8ea1021", - "client_e_pk": "02e435015405d992e89806ba157f7f6fb69fef40f9026edaf4d135b8fb1b17e531ec249ea8df3e674f63c38f1c20a8002f", - "client_e_sk": "d5e99267e0a99eed1d5fc24f0cfc23885c8539d2c7daf2c1ada0e1ad1e7e48c6e464638fb2598514ffdad37d83505fd4", - "server_s_pk": "024812bf936119a2e9c7a97a847b6466b894888ff75ba52e138158cd6f2f56a53c5e9ad32cd2a3fd28c81016a34fe5f703", - "server_s_sk": "80aaa41946da2e78fecfcab0f16ea617109aac8ed372cc7c4c69613ec6a4a1dfbbe79003d8d3898139e4196abbe78242", - "server_e_pk": "02023ad0bc83f49d976100d61d5f580c0d731d557188d5e23cd7bab443c035be39cab493751226daf2a26ccebd19314e6e", - "server_e_sk": "263a07205494b5ee012e47690a67838c94931280bfc0225c5b8d7923e6282d3014d485c0265d99ff0a96500dba808b33", - "fake_sk": "5497c7114f05fcea5b06b85b57da869804f65243ecf0451b8b1eb65188e7e7d6a3436da50f5a1227b97641732d2086dd", + "client_s_pk": "031656927a69dc65efc07b874c1f7fce536a525a659e788febd556a7fc4b4ca486", + "client_s_sk": "09aebf81e91c4d5f90bc2db7abd35f6fe176476afa7b50e5ca56a1f35f779e9b", + "client_e_pk": "02b083b4089586991747488f17eac4ce7d51a354b986a01eb77f95bb6c5d803004", + "client_e_sk": "e3d10a8c004654e5a0c168b39157d0591b287171483d6c8c5a1419dc1505e8ed", + "server_s_pk": "022fb11ea0d198a49adfba6c42c2812166130f5945195618bacaef6801cac31f5c", + "server_s_sk": "b3fe3b05817c22bd6bea3424a244f2e35e6fbc7d5dde33a014c52a1fab4ab9a9", + "server_e_pk": "02f892accf644dd418c149e64adbce375fd762113cb202b2d34e72fefa95880b32", + "server_e_sk": "74c5f1b0fe50756c65fb03e81eb141d13ba36b920418d7d38d3ba0b4eb2378ad", + "fake_sk": "93324e5c00cb05939db6f362c27d810a8df87933c520417de52807c068d9f6e2", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "43697fa48b9e5cee29bc7002d724d417b80cbde4c514a8f8a5427f4d297c65cf29e13284a9cecb912d54b0830660c25b", - "oprf_seed": "d7519e3df38e73fdcc4e44c97ce740893cc3e57af3b7a8ad79f26f1bad359e552c732fdbd2910d263e94c47654b4a971", - "dummy_masking_key": "85652ea32639014b273b90aae69b853f06af18f44915d2ba7f1fb9baf29b9196c311b3adc266bbbedd01b88df4de951e", - "masking_nonce": "18d84cc13b442388fe3d8d27564fb7c75a7094e0a47808b50059be3c5e6e52dddd8112f69a34e224e3def0d900020f6892337a1cf40c686dde6999d85b4f96ad", - "envelope_nonce": "7a56ceac4ea355c5311856ec9a2b00cd4971e42eaa36bfc5c131043b2281e85e", - "client_nonce": "2f073a3cc7d38525b176b6417803f37f768979183fd54989636a3d2d10b9a061", - "server_nonce": "49508abc62deb5550e6470af1252238541281707c393af631f31abceab6fa824", + "blinding_factor": "5477f3a0ba93a5d30cad0d8ff17d3faef403bbe12a5fa284552a4a0dadbc9be9", + "oprf_seed": "4c28c302530ff5e19ba0b3c4140262a415c6600512027d79eea858b4675d4eae", + "dummy_masking_key": "9477a78acfe931317328eb10110891c7724734c96efe730b67ba599e61058ac8", + "masking_nonce": "069794dcaf2fe0ca23a886e6cfcfff8fe4f9ba5441c18d8943276a5797f124bb9cab668b54c50cbc262f838141f7bbe787ff0fc1dd844d8396bb49891baf1ad1", + "envelope_nonce": "ca494b399bde26a59d59b53c5902164b13d552ae3eaeb1b028044fe6a3f67a5a", + "client_nonce": "dafa9f1c933a52ab0c5439ce76965184f782ae241f1ebaf5ae67d2391147e2aa", + "server_nonce": "fa31c0b6de2edbfd1667157a2abfdc55ed903b1a0b50a55a3dbee35f1cd87eaa", + "server_sig_rng": "b606142870bb679aa0f94fddea867d0ca0bde56bf035203ebb00e7e928fb5377", + "client_sig_rng": "8a3177d7dfd0c200dc7e257f2536026facc25595192c39975081d593f152cc68", "context": "636f6e74657874", - "registration_request": "02dcf6506b0243002f39786e697542f9621c2b6655a11ebab93c08f31d49ed2decaed0e20f5389840abc650407a04eb725", - "registration_response": "02a8ed901d179c8886667941c2f40a6192190ae32fc6cd4cda6daa5429496b916165c4c5e05574fac6b36f1623a1cdd4c6024812bf936119a2e9c7a97a847b6466b894888ff75ba52e138158cd6f2f56a53c5e9ad32cd2a3fd28c81016a34fe5f703", - "registration_upload": "02d68f8b5f6bad01aa7a168212ca6cebda40ba3facaa170062aaa3bfe17baa577c54b27f228a5ccb0a586ff2c3e60f4ff74124dd2bc1bcc92893e5c86de2d48249130ff09eaf3d12946ae621fa19810a9db39b21bf3da721f7e898d09b5c910c57d87c3d890620389c8d810521c95e0d8d22fc24b17ac71a98e21c8765c1d2ae65d1cb6bcd34bf044d670bc195102fcc8cef0d0a5eae3e2e8fc9084f5318121c5521309b6071de07945f5ef96624b179de", - "credential_request": "02dcf6506b0243002f39786e697542f9621c2b6655a11ebab93c08f31d49ed2decaed0e20f5389840abc650407a04eb7252f073a3cc7d38525b176b6417803f37f768979183fd54989636a3d2d10b9a0610271a8a79953ff376aca1c32382f845b95a2ecd2dd01dd6a04b455dec0b2f4ec24a830ad30326e7d8ecd288a1a60708627", - "credential_response": "02a8ed901d179c8886667941c2f40a6192190ae32fc6cd4cda6daa5429496b916165c4c5e05574fac6b36f1623a1cdd4c618d84cc13b442388fe3d8d27564fb7c75a7094e0a47808b50059be3c5e6e52dd863dc0be39f8e9cf8c00d1c9e2c95860a5ebd091eafcee55d4a42106c498e6221b7b7bcb7ca07ee24b2b3e85ec3445cd54471f1f28738af34d2243d3a12bb3d0a9470448b3210f36d178c43be81a7a06005005c425b43891bdd82d6212136c2c12d7be36cdd2c9bb6f32edc7ca9d91ef7d306d4647835647d8a2266dfae28a9a9594931280bfc0225c5b8d7923e6282d3014d485c0265d99ff0a96500dba808b33031585f56d7908cd2e2b39fa4353e77f4350e1a2f34994fcba3b1f9092249f407512e2dd86eeac13ae7faf440d2500806af73825086bcde8150ce56e37ceac3946514e18d18c09cc6af819bb2fc734ed973bcb95fd4c11c593d2f5d860303a2189", - "credential_finalization": "0935bd4f81e63ea91e49185eae49d1278ab3aec233686eb8416c2a6971978c5999e0a8e11c4b29cd26cef0afa6e24f33", - "client_registration_state": "43697fa48b9e5cee29bc7002d724d417b80cbde4c514a8f8a5427f4d297c65cf29e13284a9cecb912d54b0830660c25b02dcf6506b0243002f39786e697542f9621c2b6655a11ebab93c08f31d49ed2decaed0e20f5389840abc650407a04eb725", - "client_login_state": "43697fa48b9e5cee29bc7002d724d417b80cbde4c514a8f8a5427f4d297c65cf29e13284a9cecb912d54b0830660c25b02dcf6506b0243002f39786e697542f9621c2b6655a11ebab93c08f31d49ed2decaed0e20f5389840abc650407a04eb7252f073a3cc7d38525b176b6417803f37f768979183fd54989636a3d2d10b9a0610271a8a79953ff376aca1c32382f845b95a2ecd2dd01dd6a04b455dec0b2f4ec24a830ad30326e7d8ecd288a1a6070862776666badc42165cb7630625cbb8966264f9c8549f4d014fec1476590da1977c583bdcad60e2e009c2134125f9f7a5f8f2f073a3cc7d38525b176b6417803f37f768979183fd54989636a3d2d10b9a061", - "server_login_state": "8dae4c0f8fe145a43083792c864e2b85a81cd89583061029473177e7171b64060aa7488d631e597a08c228e63e8738062eeb986bb483294a365b63cd3548dad7c7f8f6af6f603c098f482bc401209db4ae8c67dc5727826e1a9be0ca51c1c80a5aab3824dad48090412aa81a6ec133fab21fde1cdf1e5b650c14f5e270f3ea397eca064f021aa3f8e73f2d709d306bb7", - "password_file": "02d68f8b5f6bad01aa7a168212ca6cebda40ba3facaa170062aaa3bfe17baa577c54b27f228a5ccb0a586ff2c3e60f4ff74124dd2bc1bcc92893e5c86de2d48249130ff09eaf3d12946ae621fa19810a9db39b21bf3da721f7e898d09b5c910c57d87c3d890620389c8d810521c95e0d8d22fc24b17ac71a98e21c8765c1d2ae65d1cb6bcd34bf044d670bc195102fcc8cef0d0a5eae3e2e8fc9084f5318121c5521309b6071de07945f5ef96624b179de", - "export_key": "c8632199ef2465c65b260aabde94953ad449a0cc03b5934228638a02a997139d8caa7aaba61ec659511ad6c93694c14c", - "session_key": "5aab3824dad48090412aa81a6ec133fab21fde1cdf1e5b650c14f5e270f3ea397eca064f021aa3f8e73f2d709d306bb7" + "registration_request": "036e303595925ec48d432ab43a39147323683cd092968951f309fffab1adfec25d", + "registration_response": "02631d6454a6fc0e381a9af9dc0197c5ed02b2db12e42ad348dbd8088e1221c576022fb11ea0d198a49adfba6c42c2812166130f5945195618bacaef6801cac31f5c", + "registration_upload": "02046fdf133c1c59ee4b246729602fd163857e321914ecc80e797ebe4c04bc68acd6119146b0e8555eabca233f1ab7bb6ca4d5bb23d61fb70e6ad61d2edebab8c809aebf81e91c4d5f90bc2db7abd35f6fe176476afa7b50e5ca56a1f35f779e9b335ece8825a40af808181b1da2028ce1408b51fe7d86c4b23ee458e2a96d1eeb", + "credential_request": "036e303595925ec48d432ab43a39147323683cd092968951f309fffab1adfec25ddafa9f1c933a52ab0c5439ce76965184f782ae241f1ebaf5ae67d2391147e2aa031e141f97e09cef6f25bcc88ff21aa86ddfa35198f389cdf56c8ce9c9a56c0352", + "credential_response": "02631d6454a6fc0e381a9af9dc0197c5ed02b2db12e42ad348dbd8088e1221c576069794dcaf2fe0ca23a886e6cfcfff8fe4f9ba5441c18d8943276a5797f124bbc211456c9e9795b410e8b6a4cecc97b68236f08952b092eaabedd4bc8750a848ce4a6d375544cae1eaa8193a52c260891d0fe060c1343aeff6b5690c9c59529a5b72c75424d8d2e42474b38c4782210c441e094f816921123682116b5fef9c709f74c5f1b0fe50756c65fb03e81eb141d13ba36b920418d7d38d3ba0b4eb2378ad02f47b24914f240b5b85c8602a2c993dc86f462404b9e72f1985648fe8eedf0b22a14f14e368aba0484a2944987b84e2e0f244c456b66b9daf470101a747978347", + "credential_finalization": "f56bdab1c808d153d2b983cbd96cf0391b5467623c541cb158d39dae6802d8de", + "client_registration_state": "5477f3a0ba93a5d30cad0d8ff17d3faef403bbe12a5fa284552a4a0dadbc9be9036e303595925ec48d432ab43a39147323683cd092968951f309fffab1adfec25d", + "client_login_state": "5477f3a0ba93a5d30cad0d8ff17d3faef403bbe12a5fa284552a4a0dadbc9be9036e303595925ec48d432ab43a39147323683cd092968951f309fffab1adfec25ddafa9f1c933a52ab0c5439ce76965184f782ae241f1ebaf5ae67d2391147e2aa031e141f97e09cef6f25bcc88ff21aa86ddfa35198f389cdf56c8ce9c9a56c03524803ce7e25361b2693f45e8e0d892dfd13e4c9f62169ce0fac2d0c841f04209ddafa9f1c933a52ab0c5439ce76965184f782ae241f1ebaf5ae67d2391147e2aa", + "server_login_state": "d3539b9565b9cb308566ef40a4db212cc149a560bbb55d270ba3497a0be6c0b1f56bdab1c808d153d2b983cbd96cf0391b5467623c541cb158d39dae6802d8de", + "password_file": "02046fdf133c1c59ee4b246729602fd163857e321914ecc80e797ebe4c04bc68acd6119146b0e8555eabca233f1ab7bb6ca4d5bb23d61fb70e6ad61d2edebab8c809aebf81e91c4d5f90bc2db7abd35f6fe176476afa7b50e5ca56a1f35f779e9b335ece8825a40af808181b1da2028ce1408b51fe7d86c4b23ee458e2a96d1eeb", + "export_key": "d0bf0258a1da4c73b5c5ff6cabd36ef593e69cc7f733c7d18b26f7baa70eb838", + "session_key": "d3539b9565b9cb308566ef40a4db212cc149a560bbb55d270ba3497a0be6c0b1" } "#; -pub static TEST_VECTOR_P384_P256: &str = r#" +pub static TEST_VECTOR_P384_TRIPLE_DH_P256: &str = r#" { - "client_s_pk": "02a8a6b6943d0a456ac1c1bc8c94fe4f23fa8ce1de125b68b6a1e89861ba81c6d36b46ad9b92748abf9363329df027ef8e", - "client_s_sk": "90488025ded1d42b7c8fbf5bbc9cc026378da7bc3e34cf1fb8f5f7a7190270466ce7cc218c7ad4b80131fe03bdf7e54c", - "client_e_pk": "0211f71f4fb53153b69b282351b5f49693d91e093b3450353d2b4d595604a3c2e54d6d3589d5951f40b59553432422f713", - "client_e_sk": "82dad2b241cc64502469f1569b663f74f3dad580f7ed23dcebe30aca8521ec011c01d8f890d890f90fc71652040639fe", - "server_s_pk": "0368d8e133ec6f268b47bce4018af1429d7dd7c1e81bca0113e555f3c9a815683b9caa81e24bd81da4a2f94b3ce825f757", - "server_s_sk": "57932e6af989dc6c1828c915d416e2d42fbf1abee5c728716dfeaa215e8dddd9b08a18dd826afa7c54ca1bc5c226312f", - "server_e_pk": "030bf981f272c7ee952eff6233c106dd89dedc99659bc4975dc2382bd6a187ce5dd0494fcd49c0eceeb0014257db13c982", - "server_e_sk": "8ea266b34f4f703c622177be723b725ecc83db61f6f8a57f6a12da1d053557dbb0da8ba4951cd3569a0ef6c9a6d08aed", - "fake_sk": "67efa7a0ce33ac09398c0137d39bb1bd3696819da807d977b145f2a9d7a39cb826041a5eb078b77752649276f9365b04", + "client_s_pk": "03825ed10de6ab37ec6e699aaf0339fb315f6d65d8929a3b7edad922bd2144b076", + "client_s_sk": "e79e6fe78447cacb66c22a563dd6931869dbc605ee51a48e034502bace8405a7", + "client_e_pk": "0239237fe053f051d869c47c8d13a264acb1921b8282a7913d08dccc10fab2da64", + "client_e_sk": "2ce4058c2797b37b825d58d6614f1260ea48ecb6aabcdb58859edf94439eff0d", + "server_s_pk": "02e8319ac499664a0b96f7186df55c8a8b0a7e188bd050e503abd938b407772776", + "server_s_sk": "09fc303d5760f9af61f1fe54f809253e4b960336ba1c22ab708caf0e9bc93cb0", + "server_e_pk": "0344a04a7f08def134d0c5d19ea89f7c91b2b433bc6e171c7b980bd145e2e88b19", + "server_e_sk": "b089f22db455be371a5ec556c3be392c32f4cbb7f1f409fdbf6a9205ffba1325", + "fake_sk": "e053b7cc2fca8eab790de834f6af503963265d2d12f0d08b6a64aedaba57c671", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "51a8aa810d245e7b7253b0f284e69cbc7afbb289425c4936583b5d928b722e21", - "oprf_seed": "e2c3d43d0ca1f8131c25a3913393838152e942702d2a9c37c1d0386ca7c16262", - "dummy_masking_key": "d6e225b10e46583340c3627e197cddafb9e0e52cfd0d2697b068f00cca3bf1a2", - "masking_nonce": "8f6edb19d9aea3d7c78dc16a166d8484e70608c27ad8c58118ab7ea97b68db60e5c5ef56c6735a5225a4b0acb782177fe51da87c80f18ee5da2163b45f741b2f", - "envelope_nonce": "e8a45b38fb7fc77b5f023c93b62f0223d396b950ba6ff0ac7f931b079bf9668a", - "client_nonce": "e01102ca269908abd38a5963929555ba771dda4881cf0f75c5ec5d70aec4dc4d", - "server_nonce": "5a4700c00c9878d6d55e6c8945c56aed04b16ef7928906b5f4be981f967fb413", + "blinding_factor": "b0789edafa85135409045cffd1b63891bf7ae5e8bf561f44725948ba94ec49053840bd59d4ec52afd3cccdfa2ff57dc8", + "oprf_seed": "3201b557fd414c137307b4596c9d24f313bd62b845ce8998b32e4388eb84efa22bc2dfd0093a2b88419a692fc78ef4a2", + "dummy_masking_key": "bbb3c747c630714c0d3b6340854f5b1dd4008febe0c3fd2928ba315b360ba2ad143784dbec98e2590a9debf7ea83b7d6", + "masking_nonce": "3c9efbc32ff861df7ea597e51bbdbe7c844690ce55f02216199af84c7f2c11d9b869c4d010760995506e386b3f7f855abb92f63e940775d513f67b9b23d0b487", + "envelope_nonce": "2a83e36cac45f1303a3ed6bf2cefe61cca4d736e320722ed25dcf96db9cbc7b6", + "client_nonce": "8a3ce300fc0438ec720e0ccbecf2efc1746ef62347c725dad0037f7a0e838425", + "server_nonce": "7955e37a8ae5c459472cb49da5c03fa4871c2485fce961b377507ce529a80928", + "server_sig_rng": "b9b79b17fd65b9dc59295e64a67eb7b828230e1579c302f2610beef94a8bfaa2", + "client_sig_rng": "a38d929cb318e7675c24200281c13c1af54eee06d5d09f74a288e5b05b529b21", "context": "636f6e74657874", - "registration_request": "03236cb12e56612ed03bb9a2a4e8e6c2854e555da1c4ae96d2021c232f32b07ee3", - "registration_response": "0319a4a81ecf016508cec55dc3dc2c68ded1b7aad8ca2a95ca97896b407926c30e0368d8e133ec6f268b47bce4018af1429d7dd7c1e81bca0113e555f3c9a815683b9caa81e24bd81da4a2f94b3ce825f757", - "registration_upload": "0218015cba7e8024fbbb0ff5131ac1ceb4ff90409d340709397c39fcd7b4a04c7883d58e59bd8aa8f593e537ecf8fd6e42323eac852ab568f7dc3e3255ed6ac56b2da23ffbf75e9608f5e923dc5a73975b90488025ded1d42b7c8fbf5bbc9cc026378da7bc3e34cf1fb8f5f7a719027046402e53aa9dcc05a426ec904a266943e2d4453ffece8f6728519c60cc0f1e8519", - "credential_request": "03236cb12e56612ed03bb9a2a4e8e6c2854e555da1c4ae96d2021c232f32b07ee3e01102ca269908abd38a5963929555ba771dda4881cf0f75c5ec5d70aec4dc4d03450531e868e2ccca82d5c7e2705dfddbfe03335cf6b419148c9277e195fe8f3de305a48f8e890122056c2041c8fdcc77", - "credential_response": "0319a4a81ecf016508cec55dc3dc2c68ded1b7aad8ca2a95ca97896b407926c30e8f6edb19d9aea3d7c78dc16a166d8484e70608c27ad8c58118ab7ea97b68db609f5de805206f98010c50ee1c9eaafe1c77cea85399d13094eb59fa7cbcd932eddddf3b5719a22a599dddb5749b023aced9d20941788c232c18c939cceb706c3a0026b007a5d8cab980b3b18cbafec7a3bcea84077e62777cbe4e7a930bda62f0f60d66fced6400c1c43b85b8967b93f11acc83db61f6f8a57f6a12da1d053557dbb0da8ba4951cd3569a0ef6c9a6d08aed0349b2124c1c3d3179bd50a238173925b0b7132b13481cfe72260ca647f3a3ed6957d5254ef26e43db16428c8bcc78c4d128366f1da31718913afc64cf8a74d49105d87592623fbc570be0f13a2b4a6c89", - "credential_finalization": "e71e0bbf0e5ff0d3f24f03636e3035e2532093852e4510a3f40125e895200562", - "client_registration_state": "51a8aa810d245e7b7253b0f284e69cbc7afbb289425c4936583b5d928b722e2103236cb12e56612ed03bb9a2a4e8e6c2854e555da1c4ae96d2021c232f32b07ee3", - "client_login_state": "51a8aa810d245e7b7253b0f284e69cbc7afbb289425c4936583b5d928b722e2103236cb12e56612ed03bb9a2a4e8e6c2854e555da1c4ae96d2021c232f32b07ee3e01102ca269908abd38a5963929555ba771dda4881cf0f75c5ec5d70aec4dc4d03450531e868e2ccca82d5c7e2705dfddbfe03335cf6b419148c9277e195fe8f3de305a48f8e890122056c2041c8fdcc7762d5f50f701c9cac795adc3d76605fa50f16be26ae3413620910b8ecf7a8c63f6afc0fc82791b253fefe42829b73e236e01102ca269908abd38a5963929555ba771dda4881cf0f75c5ec5d70aec4dc4d", - "server_login_state": "539f688deb0f89ee2df8ffcd58a164b8874acfde8b7ba21dfd3a2ab5a16055ac59698560a65095bba653f19c486e0ad4f0234d6e74a569fa463e8c237f5e874a69e44c326f38ebfc43eee9f13426cf1f91da8ca41b69361bbf3018ac1e38d12b", - "password_file": "0218015cba7e8024fbbb0ff5131ac1ceb4ff90409d340709397c39fcd7b4a04c7883d58e59bd8aa8f593e537ecf8fd6e42323eac852ab568f7dc3e3255ed6ac56b2da23ffbf75e9608f5e923dc5a73975b90488025ded1d42b7c8fbf5bbc9cc026378da7bc3e34cf1fb8f5f7a719027046402e53aa9dcc05a426ec904a266943e2d4453ffece8f6728519c60cc0f1e8519", - "export_key": "9b8d2ec1b6728526ccb56ed617f641aad3d552c6754f57fa8ec15a7c879148d6", - "session_key": "69e44c326f38ebfc43eee9f13426cf1f91da8ca41b69361bbf3018ac1e38d12b" + "registration_request": "0359eeae6a759e5f96fd4c7515592890c3586257115e7301196d909d87eb37989f8e3960b8834d8765a93ac730c00814c0", + "registration_response": "0302136748c86dad43050a08d983d91e6c73d01572d2981f6875a0c964b7a0bfb8a9537007e9192ed6bfbd9afe1492f8fd02e8319ac499664a0b96f7186df55c8a8b0a7e188bd050e503abd938b407772776", + "registration_upload": "037b67d4ab69778d1705c2161361b5dd79c1c729564e0763bb8ba569f438485e950d31c4aaaf76f657d430eab5d2be5f7256d244a19d5347d25ac2d56f811bf96878f63eb2184f4819ab0f2ec60fdc2036e79e6fe78447cacb66c22a563dd6931869dbc605ee51a48e034502bace8405a724ffa40302972a9177c7cc36c75b5f6f9e46149d0bb0d38f27e1709f318da544a171d1b57f59a238a966c4ab379761d0", + "credential_request": "0359eeae6a759e5f96fd4c7515592890c3586257115e7301196d909d87eb37989f8e3960b8834d8765a93ac730c00814c08a3ce300fc0438ec720e0ccbecf2efc1746ef62347c725dad0037f7a0e838425034fc6d10bd50c9957ff8ea338be2c7496c36ab591e64385e20e47bc42f750f33f", + "credential_response": "0302136748c86dad43050a08d983d91e6c73d01572d2981f6875a0c964b7a0bfb8a9537007e9192ed6bfbd9afe1492f8fd3c9efbc32ff861df7ea597e51bbdbe7c844690ce55f02216199af84c7f2c11d9331cdc6733d1e800d99cea7768a43b05ff0aba820935b4732e87781420ef065b488c6c86474e44e5bd6a3daabcfc3c75a4400d95ab7dede9df3925f074d3e22cfeadc0599dd09d5bb19400b66fccf2be932ddc8f260ce377e6b5266f73a1d3a0fcdffc03a038d98d2078aa6d3e270906deb089f22db455be371a5ec556c3be392c32f4cbb7f1f409fdbf6a9205ffba132503cc2486955893a915a9c0ad138d4b1339acc9f9fe52c64e303cc332b474a9ec51ee9a4b0e753831b442d1c70b05cf78697337e4a8ffda7c86baeeb4fa72c96980", + "credential_finalization": "f096dc9acb1ab46988fa8dfffb78bade3d6b2040cbf882f1797aaf23a135817b", + "client_registration_state": "b0789edafa85135409045cffd1b63891bf7ae5e8bf561f44725948ba94ec49053840bd59d4ec52afd3cccdfa2ff57dc80359eeae6a759e5f96fd4c7515592890c3586257115e7301196d909d87eb37989f8e3960b8834d8765a93ac730c00814c0", + "client_login_state": "b0789edafa85135409045cffd1b63891bf7ae5e8bf561f44725948ba94ec49053840bd59d4ec52afd3cccdfa2ff57dc80359eeae6a759e5f96fd4c7515592890c3586257115e7301196d909d87eb37989f8e3960b8834d8765a93ac730c00814c08a3ce300fc0438ec720e0ccbecf2efc1746ef62347c725dad0037f7a0e838425034fc6d10bd50c9957ff8ea338be2c7496c36ab591e64385e20e47bc42f750f33f5eb696e99d6158c980518d43f94bab9270e23e6dd769b4daf44dfb33f06334a28a3ce300fc0438ec720e0ccbecf2efc1746ef62347c725dad0037f7a0e838425", + "server_login_state": "aaa366eb7c8149f377b17aa7afeefa830814d91df42c57976d99c163a6c6cc89f096dc9acb1ab46988fa8dfffb78bade3d6b2040cbf882f1797aaf23a135817b", + "password_file": "037b67d4ab69778d1705c2161361b5dd79c1c729564e0763bb8ba569f438485e950d31c4aaaf76f657d430eab5d2be5f7256d244a19d5347d25ac2d56f811bf96878f63eb2184f4819ab0f2ec60fdc2036e79e6fe78447cacb66c22a563dd6931869dbc605ee51a48e034502bace8405a724ffa40302972a9177c7cc36c75b5f6f9e46149d0bb0d38f27e1709f318da544a171d1b57f59a238a966c4ab379761d0", + "export_key": "170f2f297911b17d41b03f67b3b12cc699c7a01f38b1b7868256e69090165f59af76b5fca7d8d254b4d0dcfdabd3aa92", + "session_key": "aaa366eb7c8149f377b17aa7afeefa830814d91df42c57976d99c163a6c6cc89" } "#; -pub static TEST_VECTOR_P384_P521: &str = r#" +pub static TEST_VECTOR_P521_TRIPLE_DH_P256: &str = r#" { - "client_s_pk": "0228073bae009cd94a7ad18bd018d4b847ed9fa0fbb2ebb78e7a71983b5ec39e0bee79d2dbe0f8dd470454aea0454fb875", - "client_s_sk": "f319ccef7a3a3e3ec554c6b73fb8cc767f2bba2b8823f8020139bd4f99fe60a37281b35924392092c7d45f0a09ba7633", - "client_e_pk": "0325e9fe7951e0631bae12f2ff5632cb1c7ea73f269c668b819f5bc872a667d55160b93b3123965ccefbe6399851af0f91", - "client_e_sk": "d697c1a2f0286183fda6b8208d225649f15864efe040e1bec70d78e88136be68a683a0bad7b730241d050004f1f965d5", - "server_s_pk": "02a882c0e751b94678121a864223e93e27552301597b67b0116c16e3d7c31e560ee978fbd31e08353515f080a81c63d4e9", - "server_s_sk": "cb1dea52ab072b15d886709097528b8dbbe224e996dd64652572fef89fcdddbf0ba4cbefb03bce69ef0867b755113f0d", - "server_e_pk": "035aeb85e869bc94a9de1daa020a7413cf46f267d082dd0868a0ff72700ce360305e1fd33f1c8419c14c0fd419961b09eb", - "server_e_sk": "d579635b825e309f8302a3b79b84dd2295562189715b600864a62fbe1f87fe69e3ad6b5e9ffbfcfdef545c2f97983cc0", - "fake_sk": "ab7582fb0b017dc385f9054e55258f651ea37d4a0a08fbbc669a0891872bc0407be70537e78a2ea4e79ed9f8e03ef757", + "client_s_pk": "03c358bb24c2ee7982c60b0aea3af4ee1c703695c304f21bc500c4c595d3f76d65", + "client_s_sk": "800d2f917852590a498c8ecb3e2d49bf93dafd4dcab0b0ff1a2d495877d3b354", + "client_e_pk": "03fcc69fe8267ac508498fe7f6f1581a081c078fc88170fe076e9a7d53b7297b8a", + "client_e_sk": "4ba254f050f653e0986f5b652d0586e361d46563906dc9a53983499de84260bc", + "server_s_pk": "03a4f3b07ff80058a0865534175cf834b0a57894046f2e72d4fdf192959f7b140c", + "server_s_sk": "7a452f25d0fd3aa5c887413bcac9635decde717ff550a0cbfff6c46d440709ad", + "server_e_pk": "02faa45168bb9cffb55b2f6c8f70c3bea1363aefa90ee35be60ce2e4c908464471", + "server_e_sk": "15e128fcbbe4196aa61ad6e94fcfa035912467c9da131cfcf6ab350fba1ba742", + "fake_sk": "6ca593f0d7f0c89c83843938318f2a367b004447a2437ee916f3d0ea5dff120a", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "0093c7a404305776be407239a2a2a23718f83bf5f2b33d97de6bbf68630d69c2907acf28e5b4ccaa9114cdf2bb9ac15f36c5ec708bddbdec4b900d85322407e4eed1", - "oprf_seed": "78ad17ff46d28fa330fd7b5f169cef6c42faa9df52e1d910d338d5c417f95eeaa5fce26666e7bd3983ba00753aa99f984e3bd89cce659698d7fae073547c38f3", - "dummy_masking_key": "8cb498f4ef2e208d3be95fecc3adec26625f7c3381f04cbb859d3f4106200631401cc9d0683f79c4b3824f37559f733052cc709414213cf63273dfd66ab6b444", - "masking_nonce": "cf95901f9e08d4264bbe3912b86a095c82026633ba12e54428b654420cecb74f34bb08b2b96756426ef0046b2daa4e597a983b7771ca47555e366af2a198f61d", - "envelope_nonce": "86bf6f1fdf6ebfd3f01a31fa5da5e498fd987011865b9942ce4bde42c3e11927", - "client_nonce": "7aed4d92821195cf073637d69835764fa731261ae0033ed00dc048526a17572e", - "server_nonce": "5b35bbb27152b8c7c6a6384b77eca312528731d0bae2f4001d3f109bb4e6a3b8", + "blinding_factor": "01298ada17a6399aba987f640bf0070a62f26d81401dfebd24d54a81b6b725e8a420a856074a58b90d0155f20f9b1b29235834d478f11fe28b24448080a4893f9468", + "oprf_seed": "3d6beb78e9d491137ce5e970b46a6c5cdc8d44c97c7ea9bd4060c8c9582d3c8c5e059f55e1a706aa94e445e096dd358162aa6c54879e1def59f8b1035d4ac8c6", + "dummy_masking_key": "9dfd5bb906da24df28ca26f8d5a95524aa88bfff99b9f13918e3aa7c08d98e26b98dadc0c94caf964b3d68c671e9f61c272fe3bc01ce252e71e07c8a92179945", + "masking_nonce": "7cffdeabafe1245171057a8f5e046d007187b6975ae715d088fe926310a0f22ecf0e0be87e2a6a933559028cbb03dbcf83c3fe4c5fe338497b9db69db41c7518", + "envelope_nonce": "a7b69199b3a13657c01f1b808e67d3a0d40301223f53a092a96d23e154063f8a", + "client_nonce": "e711cb88f467260a55493f24d1adae193d6418e2e5e00c50350dcdbdcdaaedad", + "server_nonce": "edf42ad5f65cd26c76c9cddde9edec36c9284950d613a96d3d80af90ae6e2a76", + "server_sig_rng": "e203972ee7b3eb6578b83bd75ace4b24eb90b96b5cee43195e3662381cfb96e7", + "client_sig_rng": "21a27bf97b9b441dcb5074d7799f85935cc48c2dccb4b4350f4de45545933c84", "context": "636f6e74657874", - "registration_request": "020119f2352a85c93c578175892de451abc1ba49f9f24f4b02c42f5058050dfe98d9041b90cbe546b14b438c98615110af9d0baa62761d2fb9df587b3f930fe20320f2", - "registration_response": "0201e83214165f7644285728f82303fd8ace21556351469a748a815e468958525da38e3fac768d3e3d5403de4ef4a84bfda6132877cb4bd56410f4b6469238c196c2c102a882c0e751b94678121a864223e93e27552301597b67b0116c16e3d7c31e560ee978fbd31e08353515f080a81c63d4e9", - "registration_upload": "024e3d336c45fd019b9c0cd0f353bd080fa5921e9d6f6c53177be2c3f9b4695c63d2b40655432a56c18aa97a15f81586459a7900ab34f941c773f6392ab81e11a9e80b15378378d6a36774e27624eb9b574c40df42554707b9cf8111fdee49daa44413142a897db87074b363a295910ef9f319ccef7a3a3e3ec554c6b73fb8cc767f2bba2b8823f8020139bd4f99fe60a3900fbb614d76178479db876a6c991b30b35752fde9a24dbe56cd285e394b7531ff0bfc58a7446b0234907abec8f177c5b3508676375c271c929603c4ffe33487", - "credential_request": "020119f2352a85c93c578175892de451abc1ba49f9f24f4b02c42f5058050dfe98d9041b90cbe546b14b438c98615110af9d0baa62761d2fb9df587b3f930fe20320f27aed4d92821195cf073637d69835764fa731261ae0033ed00dc048526a17572e0262d03af0b6f5ce018a3cab69cd41abf497b8c43afc10a36d15f414bf1a3bea0d43aa65f05173e22c88e9fc5aaf90778b", - "credential_response": "0201e83214165f7644285728f82303fd8ace21556351469a748a815e468958525da38e3fac768d3e3d5403de4ef4a84bfda6132877cb4bd56410f4b6469238c196c2c1cf95901f9e08d4264bbe3912b86a095c82026633ba12e54428b654420cecb74fb3ebe8d85823dbe3a37667c55dc1390a3e4ea763760ea628737a56f88804ba1388abd962f50de5c46b0a4960e63a9439323439b2af23c10f1b8f63c87e028546b76faa67b3cc8e7715b53853e58f84bcb9d4660e27518395150924dba7f7aa81b66bb4be541b4dc617f85138a44910a59c38121d161073b7abde68cddc2a4ec29e335a06a5c021b9550e4cb19061dbd29495562189715b600864a62fbe1f87fe69e3ad6b5e9ffbfcfdef545c2f97983cc0032f81fe2e18cd50043ce936e3b71aae068ed5b80d717b757ad3cdfae9025d4cea64c7d7be96973d5aaebcfc5921de848595d13873ae3a631685a14db9253c1535940472745f91014b250953596cbcbfbdd3b1c71cb508336e6cf87124a8d091dcf69b9ff1c29f9022a414225d70e5069b", - "credential_finalization": "b744f5c8019becdf0ef0ba4534285257bc3995b98be2baf2514ef3536bec72e82f7ea55799093f1c45ae3443e24f89ca04f30705764e693f920b6a95bd62f4ae", - "client_registration_state": "0093c7a404305776be407239a2a2a23718f83bf5f2b33d97de6bbf68630d69c2907acf28e5b4ccaa9114cdf2bb9ac15f36c5ec708bddbdec4b900d85322407e4eed1020119f2352a85c93c578175892de451abc1ba49f9f24f4b02c42f5058050dfe98d9041b90cbe546b14b438c98615110af9d0baa62761d2fb9df587b3f930fe20320f2", - "client_login_state": "0093c7a404305776be407239a2a2a23718f83bf5f2b33d97de6bbf68630d69c2907acf28e5b4ccaa9114cdf2bb9ac15f36c5ec708bddbdec4b900d85322407e4eed1020119f2352a85c93c578175892de451abc1ba49f9f24f4b02c42f5058050dfe98d9041b90cbe546b14b438c98615110af9d0baa62761d2fb9df587b3f930fe20320f27aed4d92821195cf073637d69835764fa731261ae0033ed00dc048526a17572e0262d03af0b6f5ce018a3cab69cd41abf497b8c43afc10a36d15f414bf1a3bea0d43aa65f05173e22c88e9fc5aaf90778b56ce07d5c9b0d55b791acd4ee1492e1989d49b9c98cfd0190124a7eb82772372121b2603a64fe3de9d4da68bdb88ed547aed4d92821195cf073637d69835764fa731261ae0033ed00dc048526a17572e", - "server_login_state": "a24cc266103cf6eb5904bc53728072e2a1b22ddda94324f30c197b8ad0ba569f962dfbc3f094fe9d97d0ceaeac44abda2b8b6c0f7f58406688c23bfd1c2d5ab0bb4ddc9131753c5c748690ff5000f974ef2d29b41043069cce4dddbedd463fc0044374e9f95150865279ab54742c4fcd2bfde8f784453cc1657fa538bf9b286a20e87de4fd423a9a000cb636e833436260f6cefb167d6f4280a4fafd78c87047ebd9036bf15392a669306e879baa4d90847a411294115eb57f5ac0a8a83854cd", - "password_file": "024e3d336c45fd019b9c0cd0f353bd080fa5921e9d6f6c53177be2c3f9b4695c63d2b40655432a56c18aa97a15f81586459a7900ab34f941c773f6392ab81e11a9e80b15378378d6a36774e27624eb9b574c40df42554707b9cf8111fdee49daa44413142a897db87074b363a295910ef9f319ccef7a3a3e3ec554c6b73fb8cc767f2bba2b8823f8020139bd4f99fe60a3900fbb614d76178479db876a6c991b30b35752fde9a24dbe56cd285e394b7531ff0bfc58a7446b0234907abec8f177c5b3508676375c271c929603c4ffe33487", - "export_key": "7dda4f0870aed149ae99537e64b32dad352fef362653c0116c656e68ebda5e4692ea05311776274bb9768cba79744cb2773f9c56156d982fe4d4354ff54221c6", - "session_key": "20e87de4fd423a9a000cb636e833436260f6cefb167d6f4280a4fafd78c87047ebd9036bf15392a669306e879baa4d90847a411294115eb57f5ac0a8a83854cd" + "registration_request": "0301049bed2fa094ca7f2c26662ac7074b4f2564484db15deda77d96529763d20bf72131d4636ddd9df0dc7e290553d23ef4fc9604ed0db908dd365726129343c308e3", + "registration_response": "03016c3f1ebf7d6c496f77fd4cefc75381f7e08211c86e0a224b30ee988155b21d916433500e7e7adc60268726f5ea50de0407473c7e5c6afeaad45d95d5417791eb4b03a4f3b07ff80058a0865534175cf834b0a57894046f2e72d4fdf192959f7b140c", + "registration_upload": "03b8266e26c331b77d6eb9ae7432b902b947dde2c61efd57da69c78d3bb4669aa0c74361310b4faab9bdcfe4442b217c63c4c73171f14464ace2f536192868e710535b47673dc5de03017272ac5010ecc30421c243991d50ecf6739d5776a99647800d2f917852590a498c8ecb3e2d49bf93dafd4dcab0b0ff1a2d495877d3b354c755aea46f3839238d2111c45335fdb93b1628bfdb69c255a8459a7dd499960d02903e2f5417acdd746bb123a45b6a5f541a28a4b54faf4b6202da7e9f3dd565", + "credential_request": "0301049bed2fa094ca7f2c26662ac7074b4f2564484db15deda77d96529763d20bf72131d4636ddd9df0dc7e290553d23ef4fc9604ed0db908dd365726129343c308e3e711cb88f467260a55493f24d1adae193d6418e2e5e00c50350dcdbdcdaaedad032dc446df416ec7b100222808ec74c4a367b4921ffdacd5654264cf1ad25efef6", + "credential_response": "03016c3f1ebf7d6c496f77fd4cefc75381f7e08211c86e0a224b30ee988155b21d916433500e7e7adc60268726f5ea50de0407473c7e5c6afeaad45d95d5417791eb4b7cffdeabafe1245171057a8f5e046d007187b6975ae715d088fe926310a0f22e5e6a68790da7f3626a423df385afad942005e9fbba4eb74d40df90d2afa3fcdd8550a7962193cbb6270d3b0883081cad8768ab09e7bff78980583746587ad6b576a10f8e4990a91dbb8564c540e6dde2b8241ccdc48dca3fff75f12f783c6b5f25aed07d4fcbd7fa03b0ba05fdf2d06cc77c9601f199db644d06ca32d0799e75d415e128fcbbe4196aa61ad6e94fcfa035912467c9da131cfcf6ab350fba1ba74202c663e8c1ded8fb76a316ca253f6fae826c9f54fc84f3ee96094b988e01769bd8876624badff088fc36de447bb5c0d196039866496bddb28c3e2f00aa18f4d085", + "credential_finalization": "ab19e73a6958128b4bc74fbdf4cdac44e74b9a9b55061106bdffe8575770cf5e", + "client_registration_state": "01298ada17a6399aba987f640bf0070a62f26d81401dfebd24d54a81b6b725e8a420a856074a58b90d0155f20f9b1b29235834d478f11fe28b24448080a4893f94680301049bed2fa094ca7f2c26662ac7074b4f2564484db15deda77d96529763d20bf72131d4636ddd9df0dc7e290553d23ef4fc9604ed0db908dd365726129343c308e3", + "client_login_state": "01298ada17a6399aba987f640bf0070a62f26d81401dfebd24d54a81b6b725e8a420a856074a58b90d0155f20f9b1b29235834d478f11fe28b24448080a4893f94680301049bed2fa094ca7f2c26662ac7074b4f2564484db15deda77d96529763d20bf72131d4636ddd9df0dc7e290553d23ef4fc9604ed0db908dd365726129343c308e3e711cb88f467260a55493f24d1adae193d6418e2e5e00c50350dcdbdcdaaedad032dc446df416ec7b100222808ec74c4a367b4921ffdacd5654264cf1ad25efef623cff46453ad0aa1da138468ddf61102940867c2d69528ea1bf8e44ebc16785ce711cb88f467260a55493f24d1adae193d6418e2e5e00c50350dcdbdcdaaedad", + "server_login_state": "5ed81186b6318f389aa7356246b4764c3b2b495763227f3e2326a3f6764d866eab19e73a6958128b4bc74fbdf4cdac44e74b9a9b55061106bdffe8575770cf5e", + "password_file": "03b8266e26c331b77d6eb9ae7432b902b947dde2c61efd57da69c78d3bb4669aa0c74361310b4faab9bdcfe4442b217c63c4c73171f14464ace2f536192868e710535b47673dc5de03017272ac5010ecc30421c243991d50ecf6739d5776a99647800d2f917852590a498c8ecb3e2d49bf93dafd4dcab0b0ff1a2d495877d3b354c755aea46f3839238d2111c45335fdb93b1628bfdb69c255a8459a7dd499960d02903e2f5417acdd746bb123a45b6a5f541a28a4b54faf4b6202da7e9f3dd565", + "export_key": "8b5c7847065f6f56cc1ae793ab32cfa7fe48419017ead3f44e0e42c46f5d15ef70fe47151140fc8c2a27c15dec4f6b31cfc45a5ccce5965249bf80b71edd6a3e", + "session_key": "5ed81186b6318f389aa7356246b4764c3b2b495763227f3e2326a3f6764d866e" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_P384_RISTRETTO255: &str = r#" +pub static TEST_VECTOR_RISTRETTO255_TRIPLE_DH_P384: &str = r#" { - "client_s_pk": "02d3f6ffc865ce8fc99a83deece69039c26a7d0f798c0d847e5c8ede1d90acd16ac04f660897fef75b3d87c295eda63833", - "client_s_sk": "6721a1cce5eae2173c5f8720521ab51f48e17c4675236621be42b43dbbd19c4547f1a46eeb32f24a76aa1135be8dc1c5", - "client_e_pk": "03883197b820531f4a991022e03c9c03f0deb51489194f2466893ee902ca667eed7b265f2b865cd5b1a76078356e3dd411", - "client_e_sk": "914675743edbdbc1c885de7ab365550d05b72c81f8abbcaf3f87ff8592275c6957f6ad1af09ff292777fb716ff090d0d", - "server_s_pk": "0230a95c113a9645ad92a90aeae61569873c3fe35d9a3ff9550cac845a12163c4df710b484f96f9fcf4d9171352d1c7cbe", - "server_s_sk": "264620656d79f33c6effa9e89159a42d18d332797ac5492fa9dd492b0869203921b5c133a379f49c761cbc44025f5e1a", - "server_e_pk": "0340086563e641bbca9595e30960318eca30f85c1a9424db88ebc87fabae3b1a3eb30170e5abcb1653a3d59f37432d64b4", - "server_e_sk": "e99b544516a254dfff1903ce0374db37e4e874d736c5e5e1d945c5eb06ff952177cd5e2af6f71963d13535cc711935d1", - "fake_sk": "8d8971c07bccb37ea6903180beb982fce99ce6b65a6bace8a28ebb28649a2eb693561e57073d30c2a1e6dfcc3582b7b1", + "client_s_pk": "03c0b239e6f214d4bc2d5150aa034ad09d80cf6c39879b5e107d2b67eda0b3fbc5b6a15723385a6845e24e22568538a275", + "client_s_sk": "40de03c72cdd95191d62448a8976b875a4fe9bb0757488a251d221ad4c1d151e298077d30a81a6216124e2dbbe0b3671", + "client_e_pk": "03708fc6804134276c0129a1486f7038f4b643d75b36a9a749e83da013d1f455ced6c3bfb15b15a91d020f12a11a4c2eb7", + "client_e_sk": "e41ca61ba96a3c40879d0db9f8608ea7d8554634bfbcc3febb6526a2bf3e0dedb077f206271fc91f4366396db559d236", + "server_s_pk": "02f8736faf4d96a89295b46dec137ca7ff37989a898d351605629d183fddcf1515cbaee87f02bf7cb5213e1cfe7917cf6e", + "server_s_sk": "b6639cb21b76c4dfe4112b5f30272d5bb82cc6cc598ff47e72241c9e8387259f492434ffccf2aa9b6388ae72e7fbcfd9", + "server_e_pk": "02782db83787a922451a14569d9bcc0b1319d00e82d5c9a2ed320c29dc1391e81914fd1ff3e2aef2ecc0c3090a3e16b1f1", + "server_e_sk": "50f524bb293bc8114e2eddd2c12fdd47ea571cac9e91fc487ac404470754d0cda09bf07b96acbcf922edfec74e6f855f", + "fake_sk": "276e82b642e60185e683fed1bf4243e3e12ff4c54e8fabc893ccf3dfd0f58191d8f88ee2794ba6599356a8df873075c7", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "3606c32dba45bedb83870cc30f6f67117265f1e7605070eebc76fa4cd17e7b0c", - "oprf_seed": "e41bd029e1b755870293b3fcf81b2fc4577c33fa0a194511a66d0d525e9a2a0e36fe54936b32767ba188d687b316b2979c7b759de839e86347871ff78230eb1a", - "dummy_masking_key": "002cfce36af5b5aee52037e162e57b0e680904c0db5bd423351bd0aa7cdfd8e70ed51f2cfb3f2256c47ebb6843763f9aca5ed954253e8e00fcbfdded1c5b3d6e", - "masking_nonce": "c06b25a24e4ed25f8fc8208a86a52781392e0f6b3c52f7d004eacd7f30f870d3177528b4b340593ea8e3762b7e4800dd3fd51b279a62fb4507d76706a34b4a4c", - "envelope_nonce": "f7d32680c7f939beda441d9be0c28c6c967da0c6a0060bbf930472b2a4854df9", - "client_nonce": "583b10fe28d9f253122e79e6d2d064f51d41f99d8f3a6afd576beff7677112a6", - "server_nonce": "e7047f299782d593142dee4b01b3b52904d792fa1429ad1b6bcc4931614ad5ba", + "blinding_factor": "aec098ba4b0b5ec57a159000ec5e9e3ca3a73db9d6d5abd2512d9a420c7a2a05", + "oprf_seed": "80ff58022f00715334641396b8e04bca49ee3846aa13b2939da25a037c625b0346e1e0bc663452781e8df03e06979cf73b43d28d498554790c713d4f989187d9", + "dummy_masking_key": "6fd0942a696ce048f9905354a3b18dde9a9bb546e25b00c02982f68dd67008f9e6ea38f68003748f7336380bc0980e410f1e6fc466db697cd10c458c45f8121a", + "masking_nonce": "fdbeabc40c623fc9776d995861a2dbf714c362f065806e1f55438883d5bd40664b71218ae520830e7b0d068f5740258993a3170316447d87ca585ac2d5fc0790", + "envelope_nonce": "2f81257fa7f9c9a093ea94f62ba2b08a1e75df416ed72bf902d79e53a109ff76", + "client_nonce": "552658538e238c6332643200e7c4f63890be92555432e2456e1278aafb969668", + "server_nonce": "f45b051cca1320c5b2d9569b34f0b14458dec148cad8ca8d88ba16d8902ceeea", + "server_sig_rng": "ff90984f158f586944cd6efbca440dea6959c4a6a4143d7cf9f5281049a0521d5869834810c421d400af1ca06d7ee483", + "client_sig_rng": "bb0db4ecccd4ee8b85107b093b0c8257476f28289c27eac144d20cf52694d597e3d4fc4da45ac914cd8bc4f54d4e2d82", "context": "636f6e74657874", - "registration_request": "3660a767b0a80439e3fc218a791b1cdb3fc83af3a736fa5a72c8d067a476d201", - "registration_response": "c49d2f3b3836b2e4faf61c4ee73879ebdebd9999fea01c8938506aadd32fb5000230a95c113a9645ad92a90aeae61569873c3fe35d9a3ff9550cac845a12163c4df710b484f96f9fcf4d9171352d1c7cbe", - "registration_upload": "03687105afca5a8e846fdfa88943c8a617b51014e442c64d7fd0274c8a96ebe6453f3aaf0fc3b8ac14d97c3c316a23ee25cafb63168b7a55f24e3c0db3bd5edc2d8ee7a040ad91165a3690e5949c84ad822c293155db2e02a521b0d3bab918bf53b14e46c5e5973c9cb24d358d19ae5f6b6721a1cce5eae2173c5f8720521ab51f48e17c4675236621be42b43dbbd19c45715bd81b84e6322136aca9d299593a1c23c5434cdb72ccff3dcd826f3fc54b39bbbee9f9885ce7e9ed7fa2e2cbe6f24c8d08b4650df57e542a50a8d379c092ce", - "credential_request": "3660a767b0a80439e3fc218a791b1cdb3fc83af3a736fa5a72c8d067a476d201583b10fe28d9f253122e79e6d2d064f51d41f99d8f3a6afd576beff7677112a6037dfa36a7dbc7cd5b0a295bec6e488b40d888d740780d7d3a1a43fe8aed365775d15d93877b76fdac0675264136f5f55d", - "credential_response": "c49d2f3b3836b2e4faf61c4ee73879ebdebd9999fea01c8938506aadd32fb500c06b25a24e4ed25f8fc8208a86a52781392e0f6b3c52f7d004eacd7f30f870d3181f596e23139a69afd384530db83b27f925e80a527b3dcb118b1253ce95404f773fdcd80d680b866c3a1dc13aa7c727ac837c69a46f700edb87b954dcfb360e3fb4f9b4fafe28ef39e09cb75fed420061555376a1b23baf3d3272a97fe2396f197c6cc92e22124bbf4c11e898458d9be20963e0e694451d1ea84e5fd88527b8a3c427efabaae0b0199df99de67c6c0f25e4e874d736c5e5e1d945c5eb06ff952177cd5e2af6f71963d13535cc711935d102ad2874ff1eb63893bb3da9d332a2ae42d091191ce07f1375c9f045efd46ab81a8a425d2b73feb15787d32c52c94769e1575780816d85ad8078d61ecfc1f8ed86881c7b543ccb29adacb2ad2a849e8e6d37296608f7e68c679a8e484516f1a060252fc06169e8829e02849014ca669747", - "credential_finalization": "f9d2bd2fa0f37b21bd82e636f9c6f622f10ba57213bbb92561daec976ea2f9136bd4378a33e01df80b3d97bea32e3ea212c7c366c0487379f98aef17271cf19e", - "client_registration_state": "3606c32dba45bedb83870cc30f6f67117265f1e7605070eebc76fa4cd17e7b0c3660a767b0a80439e3fc218a791b1cdb3fc83af3a736fa5a72c8d067a476d201", - "client_login_state": "3606c32dba45bedb83870cc30f6f67117265f1e7605070eebc76fa4cd17e7b0c3660a767b0a80439e3fc218a791b1cdb3fc83af3a736fa5a72c8d067a476d201583b10fe28d9f253122e79e6d2d064f51d41f99d8f3a6afd576beff7677112a6037dfa36a7dbc7cd5b0a295bec6e488b40d888d740780d7d3a1a43fe8aed365775d15d93877b76fdac0675264136f5f55d08fc0b17a991513890aecefcc49653408122d70126d366a2a3b64afc2133b78c0d75eda058188053c0b706cdce33fb40583b10fe28d9f253122e79e6d2d064f51d41f99d8f3a6afd576beff7677112a6", - "server_login_state": "49404b3db35a55b931aa562f1959dc28145760ac29ea665d4d14a21b5f49cee74376cf534ee60628fe01894cd8163994cd3b52e391836eed71c9441b2ac4e8a3eb22e0fbaa05b879914c0bb182a4b1b234325eea7259c32c89ca3999ce222c96c582eb1a8dbfc12518b6bda42773ae615bfc55261df70253760661773193d3b040e042cf88ee6247ec55ab68d0dc187228b3d979ed98143b457257fc5c80a2cf870080b2bfcad39a4db3dc1b0b1d7b13d83997643174df1d0f589ad996695973", - "password_file": "03687105afca5a8e846fdfa88943c8a617b51014e442c64d7fd0274c8a96ebe6453f3aaf0fc3b8ac14d97c3c316a23ee25cafb63168b7a55f24e3c0db3bd5edc2d8ee7a040ad91165a3690e5949c84ad822c293155db2e02a521b0d3bab918bf53b14e46c5e5973c9cb24d358d19ae5f6b6721a1cce5eae2173c5f8720521ab51f48e17c4675236621be42b43dbbd19c45715bd81b84e6322136aca9d299593a1c23c5434cdb72ccff3dcd826f3fc54b39bbbee9f9885ce7e9ed7fa2e2cbe6f24c8d08b4650df57e542a50a8d379c092ce", - "export_key": "241cf5d53dc6914268b001a4c690d11a45bb314a63415ebfae7f915a723de84d6e7d5067e3609cb811c442373976017de3671de2fbe45f7ed843cb7b5d09dd83", - "session_key": "40e042cf88ee6247ec55ab68d0dc187228b3d979ed98143b457257fc5c80a2cf870080b2bfcad39a4db3dc1b0b1d7b13d83997643174df1d0f589ad996695973" + "registration_request": "d2b70aec0651ae35836b6c68a343aaa6eab7716f3a66de5f0db5c69397721127", + "registration_response": "d2d8d97a26725841a98492a6957009a567aed5e3ce3de86f4783d25409d5710f02f8736faf4d96a89295b46dec137ca7ff37989a898d351605629d183fddcf1515cbaee87f02bf7cb5213e1cfe7917cf6e", + "registration_upload": "0312f89bba537036cc22b4b6712e4d7d62fab53758efde16d7ebaa12984e71b409b1e5a2bddef6f6f63315fceafdde39cf3b425fdee7d18a4a0accda34bb8ee46bcfd93cd0d1b07d7c0f1583cfc9d5889ae545d0a81082adde9612010e8ce924221618c627e8385563c309da6d88985f9340de03c72cdd95191d62448a8976b875a4fe9bb0757488a251d221ad4c1d151ec427fa4b5368ff932f47941ce793c653881a15c760857c37a1d9f70043e2ec297dd25be89f091665ff7942e614afad06c4948fda42dc58c9145ff372236e03a9", + "credential_request": "d2b70aec0651ae35836b6c68a343aaa6eab7716f3a66de5f0db5c69397721127552658538e238c6332643200e7c4f63890be92555432e2456e1278aafb969668025f6524c733a37167fa04bc3f2d3152fe825cfecb74a899e9837d67cdfa0a0953e19c36f637760a1e15809452d6512634", + "credential_response": "d2d8d97a26725841a98492a6957009a567aed5e3ce3de86f4783d25409d5710ffdbeabc40c623fc9776d995861a2dbf714c362f065806e1f55438883d5bd40666c40bfc1afcc1426269f81daf296394cb7afcca5b513883d2d3ca9802ecfcae2366c223ff352a0d87612ec0951f98f4f01877a0dfa51ef243baa5a382941946daa6df20b25c419bdf4b013c82ec22afa78ec8eb458f5a8fbf7e494e3f3b97fe52e3963e443df6ac7e80021e2524aeb925f6a72b69b63db2a8ae7ff816dfca917454b8c798d34742b83ebad2807f1ebf97dea571cac9e91fc487ac404470754d0cda09bf07b96acbcf922edfec74e6f855f02afc6bc244e4da7f45e3ff96c6cf60e06cf3fba93668fe29a01dc3a33c0b5f7257924b764f27408ae45852877fe37b569503b57ce25d13551076769c1bebfb89a24d50619950f7abb9619feb1bdab2674c2aea86f1f35b7c3004060e60085cd31", + "credential_finalization": "478c69d8c5467785f66d9cd3d2041bc2e4bed334cd4977c5f1d43831237316618be7b7a10ba437d8adcd26b0fb0feb58", + "client_registration_state": "aec098ba4b0b5ec57a159000ec5e9e3ca3a73db9d6d5abd2512d9a420c7a2a05d2b70aec0651ae35836b6c68a343aaa6eab7716f3a66de5f0db5c69397721127", + "client_login_state": "aec098ba4b0b5ec57a159000ec5e9e3ca3a73db9d6d5abd2512d9a420c7a2a05d2b70aec0651ae35836b6c68a343aaa6eab7716f3a66de5f0db5c69397721127552658538e238c6332643200e7c4f63890be92555432e2456e1278aafb969668025f6524c733a37167fa04bc3f2d3152fe825cfecb74a899e9837d67cdfa0a0953e19c36f637760a1e15809452d6512634cafcfe8f26bf3108a88e39b5e7a1692269cf33b9b471c37a3a50c8c7d124386458ccbd10b610a7d523c0b8ade2ee9afc552658538e238c6332643200e7c4f63890be92555432e2456e1278aafb969668", + "server_login_state": "79ca6e69b62a3f6d0e9f98d9518eeb83b79fb2cfe7f792468d63bd9760388d2f6a92b1f7bc87f9650847ed43b501d62f478c69d8c5467785f66d9cd3d2041bc2e4bed334cd4977c5f1d43831237316618be7b7a10ba437d8adcd26b0fb0feb58", + "password_file": "0312f89bba537036cc22b4b6712e4d7d62fab53758efde16d7ebaa12984e71b409b1e5a2bddef6f6f63315fceafdde39cf3b425fdee7d18a4a0accda34bb8ee46bcfd93cd0d1b07d7c0f1583cfc9d5889ae545d0a81082adde9612010e8ce924221618c627e8385563c309da6d88985f9340de03c72cdd95191d62448a8976b875a4fe9bb0757488a251d221ad4c1d151ec427fa4b5368ff932f47941ce793c653881a15c760857c37a1d9f70043e2ec297dd25be89f091665ff7942e614afad06c4948fda42dc58c9145ff372236e03a9", + "export_key": "9d35987128d18ccffa8d29b993bfaf0912982da92684ca56b7668ee52467f8298462e7271cc5da150a368b553a6a43285948f28f166d9b6380d04f31851cca8a", + "session_key": "79ca6e69b62a3f6d0e9f98d9518eeb83b79fb2cfe7f792468d63bd9760388d2f6a92b1f7bc87f9650847ed43b501d62f" } "#; -pub static TEST_VECTOR_P521: &str = r#" +pub static TEST_VECTOR_P256_TRIPLE_DH_P384: &str = r#" { - "client_s_pk": "0300af21e59ac75fe8a3cdd9e518fb3d14ccfb321e6a3df5e825d85e67e4a31c67a759eda3d65cc1e5726e164d96ceb0d9db1595cb324aa25197fd552371fc279c6b59", - "client_s_sk": "006c22273b602cce15d9a38ddca79406e60ce67b5f3edb40c801e6a50913b138e495a45c763684d953e7d0617820555e1760dca59df40a51e073f9242ca48bed92f9", - "client_e_pk": "0200367b2d249664f682cbafe06dccfbc07e1581ba5a8991cc54ddae232a9e5ec67eacb3578134277e5289a5747fb64937195671f9f2c7ebb12c84a34122aa773a8bed", - "client_e_sk": "002076c142004e4f66de4f95def577465e2273b89201cdd92aba2bd573be01772f3d5e6224d6738907a86a336cfbe377401a01d4307bce07aa19fd3dec2988018271", - "server_s_pk": "0200479b9d4a7de5ad02481eba8e059a859961092b7acac20a6b9bfce5c59400b1774da257029dd7c809c68e22dfdbd070c39618c63a2f8ac63f900eb0afdb9d29ce12", - "server_s_sk": "015d9a7820b4fd18b911bd46a10c699e843a65c2a638b0ee7f06285cfdcae399929f505ab5ee6a286b0c8f21f71261da41b2bd2fb111df890d055f9ac2fb76577c1b", - "server_e_pk": "030091eaffa380fb5cea4b961bc8da630ba911f073e9259976761a125c2790ae72d1e6e2f94d42390df33b4b66b311cdb7897f1f9d776714d5e80cd1b2a8b49db1004d", - "server_e_sk": "0144654cbd03d5d762e4dc10dd1e5f22e66754d8eeeb4f1b803fda07984e38993a2e26507b93a0ae8e49245b8c0dcbb54441b39b24ec10527d177e0e97d615c31b3b", - "fake_sk": "01e057b3aa5f331b8defe1b72a3a6532456db1aee5f7d4aa44413c935b3dfc85d478eced6da1fb3322ac4536cc399f1e323229fbf0903b5424ef93ca7ba99660f794", + "client_s_pk": "03f52ffad7bf8721864946b7030a13b7e057c3c7be7c63d8b2dc260025e57776beb3792465180fad5f470ced88cf0f2e40", + "client_s_sk": "49b4e1b10a7516745c6efec743332281da58a7bd974e11780e7ae1b1eaa0f117f6b393411511bc647d68068004768e84", + "client_e_pk": "0275f019b23a955343417753dfdfdea09b05dce70bec253ecaecc6586c489302178ae31c48d8fb618c3d0d67052522415e", + "client_e_sk": "309c069354813dc003792d66e13cef75e664aa90cd0f68c7189e79f2280612dfd5ab71c2b54d5871ff74d1afb7e1cd52", + "server_s_pk": "037a395ae5ce70a3965ce48cee217b3ff75f03a78095da87a39749e165cca6c2d2ef66dce51708cb31c1f5394f73b3c941", + "server_s_sk": "6f408fc6fe3da4b8c56c2937387fc8f922b660dfd8c5268db9946402508c725f08901b0b0a8cd3169ff28d77a2321d30", + "server_e_pk": "03984be33c0fbff763d0f136af58f0ca6eead2d1d3ab559836bc27d5c040caf90b5f56fe7e4112012c5b4cbf33f6dd7ed6", + "server_e_sk": "80bab8155dc9fc4984bf86abda5f8e028064e54acd49dfcbd8a66db21117d5f5d0bd9886e0138fd0d420e34a3bd0e5b3", + "fake_sk": "fc4c1e2a22fb6b27719b4a0248642a3271cd9e25807776849a138e7eda7202233cc5b67cc6d700bd52c73b9edb87455b", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "0191c1965ccfe1e21b41279a6ee97bbfd37ee4048b25457d7efb67543ffe61cd5b8feee6cda744855f0b5ed9ba17e80935a9ac0dc87e0a519fccd8f62de9d74c4ace", - "oprf_seed": "c3f25132908dbae4910cf40e5a97c8661c3f28cb59703304aad16a6f95e689ef352c9af66c87c6c9fdd28a2549343964f3e0b743d366c1aec2a75c03e87d334b", - "dummy_masking_key": "9fe8b56f17758bd77d377be3d26c2eb761948a38772202ae411773bbe704780748888fb77defaa2dd769ec1a4d2a88ed90dd3dbc1cbba648588d5a8ecac2c3a9", - "masking_nonce": "2417ebc590265af67e9f267baa162f9a6296090eb50a847c8b86c29347dd4188862bc4c2d73c6ff2182b6a396f028c2ebee45c6d77d0debb10891062f6400ae0", - "envelope_nonce": "0314eb6da1c066ae1e4bee7e79560d6b34e29ded3b2b8922905c9a2b55784f70", - "client_nonce": "197918bda4450876edb6aba38b1d715f6c9e9d27d7e06ad0d4894143632d52b7", - "server_nonce": "4b4ed9d8689b28f901257386fe2022a742b1d4b623ceb4f8bb94a9b2a37143f9", + "blinding_factor": "889a1bb54fe232fa5e24002f2f0d646bbf56130e0edb019d7a26628940be515f", + "oprf_seed": "8b36ca212e09753b0321c17a2235620b7fe438c65ac0b1938a0525d25455d7e4", + "dummy_masking_key": "0a4f97040b0c4856f1d899bbf20d3a8f10a5bcdf7977bf5542e5573e4a42134c", + "masking_nonce": "8ef86906724475db40abf85e00d4facda63349f9556aa1c48f430e738a7a56ae1346c21368524f994b7f7f11721ee4586fb15030f6ffb7a92eadbe4d628d1314", + "envelope_nonce": "14999983ca632a61d8477f377e5e446363dcf153252e564b8818d0d4345682ac", + "client_nonce": "9dc974a73ab3bd8246cb14035476c093466bb0fbf29eeec997d15089d6c32c14", + "server_nonce": "036c037e3053c90cff2a6281ba99800a9ceba5a3d8ec5e87aa58c03a1990713e", + "server_sig_rng": "869c26c80566448dd565fc739e7afdc41c81212cd630f8d34048756f31f57d66c1fcc016f37b6c55c49a5d940a10ee71", + "client_sig_rng": "c7db0c2625b2ba33235423cdfc8f9bef3d20ef4dd28f22c1f5ebd17053155d6da2e1a3ae788d1e601dd0fc69721d2b48", "context": "636f6e74657874", - "registration_request": "020016541ccbbf02f88091db450b396662e313b47d743507f797461551a259676a81378df03a51f35d8738378eaca381a3754f5c206a2fa059b58187e2250eb79388b3", - "registration_response": "02004de7185a07189948f1b22baf400a47413c479afaa3166d804daa4171429a222d277adf9a478caf0de3817ab35dc2a00d1430d3451e24f64ca4f0dd1390399ee83e0200479b9d4a7de5ad02481eba8e059a859961092b7acac20a6b9bfce5c59400b1774da257029dd7c809c68e22dfdbd070c39618c63a2f8ac63f900eb0afdb9d29ce12", - "registration_upload": "0300c20d63f824001afed7d4b216e115c3b49a6ae90c21c71d75f109d073521ae3c92605359026ff8f32392939c18f1a2f914f7ffc2d54c39412f300d0fabd57faa20800f28959ad2f4fa80b664cd1d9f8702496ccb41b10a60bc484c3fcc77c8616bd27cc5d385adb51056c72bcc7d44f6ef35001b4037688ca18f61240bd626cc1f4006c22273b602cce15d9a38ddca79406e60ce67b5f3edb40c801e6a50913b13842b08614c7c734f4010b229c1594c716f2a829dc1febddb1ac18586dc38b3fc99cfa1aeb6e6233715e9ae9872d967d54eb631a7443a7d81573ce6ebcc381532b", - "credential_request": "020016541ccbbf02f88091db450b396662e313b47d743507f797461551a259676a81378df03a51f35d8738378eaca381a3754f5c206a2fa059b58187e2250eb79388b3197918bda4450876edb6aba38b1d715f6c9e9d27d7e06ad0d4894143632d52b70301dc72a4726bfa3ebd9e4027ee2518ba52377b29c25d0945a639bef307b4561620b33af4cf1dc32acc1150619fbde2ef368c5750583dda150ea6dcb2cfdeb12e6a7a", - "credential_response": "02004de7185a07189948f1b22baf400a47413c479afaa3166d804daa4171429a222d277adf9a478caf0de3817ab35dc2a00d1430d3451e24f64ca4f0dd1390399ee83e2417ebc590265af67e9f267baa162f9a6296090eb50a847c8b86c29347dd4188e770eb33689d6abcf525cf73c621c533cf738749eda4e8f6a7eb86a4e2fc48bfee8b63029fdd247cda6ac4a562f1a3b00deb16d27b4af7e0d6f5c3c20c8719fdfb93b8e534ee7b5294f75b5477fda439166579035fc890ac1a0e0c569d9293d7e2bdd995c9c646df5ba59b2b3389b848ab82c6c74526f927a56057769ce4f29be385b1852ad8d56e19a022f960f7cfacb8996ed75100451c6c090ff5af8bc0e140df3826507b93a0ae8e49245b8c0dcbb54441b39b24ec10527d177e0e97d615c31b3b020106f5326c6dab93616623f71163b824f27509ff70fbcd4a2b9453d25a4acf2313800e404ce2c1fa4b12baa687a9c5e38365f1f4bc6c7564ae5b6988c1eee5f02d92d5a1de1a7af1da7bfefff0730f07737748e0be8780d29c91ffcbf077159a13d37cf06594e48db5d62faeee3a4717ed722248008e976ab33d9798ef9e468b2501", - "credential_finalization": "4b51d316a9e863c201ce818558818ebecafcfc6ac416ec3fe9a2519c0243d77e4d83d46ce3bea5c08668416222cb164b893d9d67fd30efef579627bd36229fef", - "client_registration_state": "0191c1965ccfe1e21b41279a6ee97bbfd37ee4048b25457d7efb67543ffe61cd5b8feee6cda744855f0b5ed9ba17e80935a9ac0dc87e0a519fccd8f62de9d74c4ace020016541ccbbf02f88091db450b396662e313b47d743507f797461551a259676a81378df03a51f35d8738378eaca381a3754f5c206a2fa059b58187e2250eb79388b3", - "client_login_state": "0191c1965ccfe1e21b41279a6ee97bbfd37ee4048b25457d7efb67543ffe61cd5b8feee6cda744855f0b5ed9ba17e80935a9ac0dc87e0a519fccd8f62de9d74c4ace020016541ccbbf02f88091db450b396662e313b47d743507f797461551a259676a81378df03a51f35d8738378eaca381a3754f5c206a2fa059b58187e2250eb79388b3197918bda4450876edb6aba38b1d715f6c9e9d27d7e06ad0d4894143632d52b70301dc72a4726bfa3ebd9e4027ee2518ba52377b29c25d0945a639bef307b4561620b33af4cf1dc32acc1150619fbde2ef368c5750583dda150ea6dcb2cfdeb12e6a7a00119cdb0fece822169dc4ec734f344d7177d5212bd1e09b3e107786726a8469db33a953e91bd1e73e97a11900e1440fe4ace11756e32d73d1841594f79143a3dc30197918bda4450876edb6aba38b1d715f6c9e9d27d7e06ad0d4894143632d52b7", - "server_login_state": "40d3b65d73134953c0a792956a78ff9a66031eeb4647e8ea42701e19e95ce6a1f378f1ced5e7f65a7a8575336f5f5c54554f27cd01fd0f38700a63ae0042a760143d488406639f85a0f0fc623116a783750a4ba237fc55082427e1bdb72d3d67789769953c8b4aa2def45e461cc62b7a10494c13ae997b4237b774af3098f2c01361bafa180965dcb5afd9c54d764b400e5802de30403e51ab5ab05e7412b16b7dedea596653c63737374a774f19b39e9fe6fa64558c1db9b1dbe158ffb7d1b2", - "password_file": "0300c20d63f824001afed7d4b216e115c3b49a6ae90c21c71d75f109d073521ae3c92605359026ff8f32392939c18f1a2f914f7ffc2d54c39412f300d0fabd57faa20800f28959ad2f4fa80b664cd1d9f8702496ccb41b10a60bc484c3fcc77c8616bd27cc5d385adb51056c72bcc7d44f6ef35001b4037688ca18f61240bd626cc1f4006c22273b602cce15d9a38ddca79406e60ce67b5f3edb40c801e6a50913b13842b08614c7c734f4010b229c1594c716f2a829dc1febddb1ac18586dc38b3fc99cfa1aeb6e6233715e9ae9872d967d54eb631a7443a7d81573ce6ebcc381532b", - "export_key": "8bc7d608b1a4f0633a26640005af89f07ce290d30275f7ddc109d542a6da38a90f6c2298f8b7e616b6029473ce1ad245cda8773e79b557f0c5ddd4dcb0729236", - "session_key": "1361bafa180965dcb5afd9c54d764b400e5802de30403e51ab5ab05e7412b16b7dedea596653c63737374a774f19b39e9fe6fa64558c1db9b1dbe158ffb7d1b2" + "registration_request": "026a63df370a69b08570a7a9a0b0def7c1526238410f2f914ee7f097ee32a4f3d0", + "registration_response": "03a15a0a3a8b0bc1ee135ed23acc1bbcde12aeadb0980dc06ecdce8b31c4c38cd8037a395ae5ce70a3965ce48cee217b3ff75f03a78095da87a39749e165cca6c2d2ef66dce51708cb31c1f5394f73b3c941", + "registration_upload": "028fa9ed28330291226b3f9a614da0fa1fcc1c6da5f7a96e5ce0ea9735a8b027eede7ef4ca53cea0f573ef63f1b2bf97c558df590ab497fc1bcc7a0c41f1898d6c1543b26cb254aff352a6c06862956cca49b4e1b10a7516745c6efec743332281da58a7bd974e11780e7ae1b1eaa0f117c16de5d83581805d0f3f7c88926e6a3af26540b7af72a797ab50fced64b40ad8", + "credential_request": "026a63df370a69b08570a7a9a0b0def7c1526238410f2f914ee7f097ee32a4f3d09dc974a73ab3bd8246cb14035476c093466bb0fbf29eeec997d15089d6c32c140246cf38264c8a7506cbc4549ff5b4a22efe7338adf8d15efb1fba17fc715f1c0f147c2b3484dfef2a3f349c111bdb8b63", + "credential_response": "03a15a0a3a8b0bc1ee135ed23acc1bbcde12aeadb0980dc06ecdce8b31c4c38cd88ef86906724475db40abf85e00d4facda63349f9556aa1c48f430e738a7a56ae4284725c0b04233150c9231b908d0d8bd3d5aa7458b5aa6b1e199bea891b7f7592cd75e3c890d32d84e19c9c43a192596c49a523482f277abf86e9aeaa6f30445a49a1e173dc42f155cb08122c8a36ff07dd914d0cc0f78581df5c2ba071ea603bc4b407c1c911eccb16c476bd463cf68c8064e54acd49dfcbd8a66db21117d5f5d0bd9886e0138fd0d420e34a3bd0e5b303e4129f6917e2363642833d248406fd12e3d8a4ec856c6437d92fc628e3b6f493d10949162d537c76c22936bd6314fe250a56339af3838771b5252e0ce9d37be9f50aa86292df0f8b8a8fa708c0a43169f7d4726ce1d00a748b0aba1f3476992a", + "credential_finalization": "bef1f80406becd8f0588869adb003946b765c420148369f3c7f3f12141c796e52d97c0d822b8b45d11cafb44121cd701", + "client_registration_state": "889a1bb54fe232fa5e24002f2f0d646bbf56130e0edb019d7a26628940be515f026a63df370a69b08570a7a9a0b0def7c1526238410f2f914ee7f097ee32a4f3d0", + "client_login_state": "889a1bb54fe232fa5e24002f2f0d646bbf56130e0edb019d7a26628940be515f026a63df370a69b08570a7a9a0b0def7c1526238410f2f914ee7f097ee32a4f3d09dc974a73ab3bd8246cb14035476c093466bb0fbf29eeec997d15089d6c32c140246cf38264c8a7506cbc4549ff5b4a22efe7338adf8d15efb1fba17fc715f1c0f147c2b3484dfef2a3f349c111bdb8b63dfd90e3f43a6936ef963d81549a3e6868882d9119f6d50e544de74c5174f09495ccc95c2c90d68aaf015bfa31b66143f9dc974a73ab3bd8246cb14035476c093466bb0fbf29eeec997d15089d6c32c14", + "server_login_state": "ac917884ad6a62caee89f04195633fe75408803e8f912b92d702a18fff0fb697940177d30d77e852bdbca585e96633aebef1f80406becd8f0588869adb003946b765c420148369f3c7f3f12141c796e52d97c0d822b8b45d11cafb44121cd701", + "password_file": "028fa9ed28330291226b3f9a614da0fa1fcc1c6da5f7a96e5ce0ea9735a8b027eede7ef4ca53cea0f573ef63f1b2bf97c558df590ab497fc1bcc7a0c41f1898d6c1543b26cb254aff352a6c06862956cca49b4e1b10a7516745c6efec743332281da58a7bd974e11780e7ae1b1eaa0f117c16de5d83581805d0f3f7c88926e6a3af26540b7af72a797ab50fced64b40ad8", + "export_key": "cf2694aa0175ff13a8cf84712d560395bc974ee8eaf3ce3a79c2c9453040c15a", + "session_key": "ac917884ad6a62caee89f04195633fe75408803e8f912b92d702a18fff0fb697940177d30d77e852bdbca585e96633ae" } "#; -pub static TEST_VECTOR_P521_P256: &str = r#" +pub static TEST_VECTOR_P384_TRIPLE_DH_P384: &str = r#" { - "client_s_pk": "0200b6ab8a7a4cbde5721cd6409f070e99fcc5ad960ba54b9deb17f143ac911f4dade3e03af26ed8f35eac5c6a7d21b232e30260537c6b0a7f8ad8476fa565374431d5", - "client_s_sk": "019dc5fc89de2fc3659855faeef42edec94a21c03a142eb0ef56fe40eac471688602f3d778f4a9d167368fbf0db996cef28a58ac75fa9264cea5c62e7ad61e48c463", - "client_e_pk": "0200b3ec715fbe3981c9bbf543065f18411412ce9aaa5d8d75dbd92e9bf0a41794a6254c72668d3278aa27d43c0e27997ce167bc74eb572c392f1d96ee28a7c886fef6", - "client_e_sk": "017bd3fa3670b9062a811f1ed77741e6d036c631fbd155a6a711b6455e7e26e00981c9bba8aa49df7b036a5a4800604554bbf9924d7d2be57521fd255d4444d10e62", - "server_s_pk": "03018791b45fcce3175fc075d0bfb6f88518e33a268127dadead7d696a44504f4329b2a1ddae0bb7c4e6093f54f19aff94a9d7ca5b74d2546693993bf9009a17de36b5", - "server_s_sk": "00d3632429d3ed4c2c2e7d485dfb266a06896595e531dd31b484f1dff1f91f12eb48e7375540c82f619966dc73c016888696ae6b8bc0ba19e08506cac179460bbfc1", - "server_e_pk": "030064268c3abba0f17eda1a5d85df019878861758ce7137c67e79884cb2c1ee352f5eee0ad8cc38f453d7c5bd6100703c0efd11c8090a5e9907b4d5e31639e612bbaa", - "server_e_sk": "0027425c4f603f8858886fad67d57161baf86fa123f3cdc9435a92f9a4eaee8655470d53b89ac5732e206db669ed10a7317186ec348a30ecae7b99b4816fc5272729", - "fake_sk": "01037de92f2f3e8e3603c8b5aa24a05c7e1683daac08210f07c85e95ded374f0b65e5ce5ba7d41c174540bff460dba5eee9a729f5c60ce3a6f11c7124e9407c62637", + "client_s_pk": "039dd599be50f67a8bec26c8f95ab7423519c0332078da88aeb0064e6d2d32381852d335e447e960ee7639fedd56a5f8e9", + "client_s_sk": "641af20d3b3865c3eb08a9cae0496008423c20057067f8a5ad202d57d667437854eb9ee8120a1e6e4a8e232b387b759b", + "client_e_pk": "031548c7bdb8445a0892d8176142dd5789331cfe522a84aada86c7a88f66a26536354f0164eef61662ff2d28c69e28eff3", + "client_e_sk": "8054afd6b62d2f291dd30fe9008812c2f0d3b4a69aaa64940dc252510ef3955dfd08a611d1fbec816461a8a7c60a9970", + "server_s_pk": "028881d773ced8ab77e46f7cd71d064d27603a76c50203f5bd67d3030a511e40d7ba7034d6f4c6470f35a8bf0c8bfc16a8", + "server_s_sk": "d827e467a0e781bd406ff7aa7854f1b0e5c680b5217c6e51efeaec14d206f374acbd9713f0f394a80f70ebb661f6c976", + "server_e_pk": "0324e69317404cef88701584125e229fefde36d4a4067905b7beadeb23185564662e743d95d759c40fb9c600f307026def", + "server_e_sk": "eb06e214d8e953b7fca7459a48929ce90393da891353b3fa44540339f9bd4c4960386410dc09e647730e6674a2181465", + "fake_sk": "367132f84d43b393e9972686d2b499abbbed2364433ca8e480b9db8f185b6d05d8dd7a6cf912f11317bec84adb642ef4", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "f624918de5c8533c22ee62286dcbc1d8c164625cc99087f0afbdfc42784883ec", - "oprf_seed": "5816010f6d4a0e28c0a8e0551033135f05ea967bff5d87f6b06c89c68a455afa", - "dummy_masking_key": "45193b60706de760863cfdaaab4da6f12a32e2bd1deade043ecbb5593ada7cc6", - "masking_nonce": "d2aaaafb563d56cf1961bae49dfad4aa0be38622b1fceccd5aa6e45b598c2fd0714c5152484598afa97667eedc4409b8afd3c59b71213560015eb477a805f66e", - "envelope_nonce": "6181271bf4e50037f6dd7021b8811f6967f4129f46bf9bd444e5bb5f43144dbd", - "client_nonce": "f0726d4c7d6c2566ea9ef225b2144122a8e08e45d789150959d886124e5d74af", - "server_nonce": "539c281d5948ec01d133fbb64fd9c8d75ea52a2ef1369b2d24925d9d7d198636", + "blinding_factor": "73a045d8eadf0a489307ab7f6f5017e6b30093d85ebcb9b415fcd5f0fa76e85e28c23bcbf0ece258230021f4a43a3d00", + "oprf_seed": "a7a5c703659672369313279ff9fc859ca062ec3c4659796221e2104c26c27786d55bfaa51a959090ed8f6c7a80a31495", + "dummy_masking_key": "c278edeec50c9a64cb6bf3396364c3b5fdef0ef214c3f1cb98a2f91668426a096cdc8560e570fdec59f3e21cfda2af66", + "masking_nonce": "ce6418319ff042439a0174c59e74d3aaed30ec0ae66ed71358775cfa421b6b85ee30643b81f2fb6f4540e0ad0ea602ef0f64c0495bd5e408b0ec896e009b68c4", + "envelope_nonce": "38e902b571e69aa4b64351d7801300242f51db4656431b7116fcb524f787bdd3", + "client_nonce": "0b33cd9828f2811030f67b5427c8884f9ccc2333b0206d803a877f89979d9665", + "server_nonce": "e54a065eebc4ba594f0a47c55b783ca4f1dbfc99730f25aa1fed8a172de6055b", + "server_sig_rng": "6113f1aa8521a9449960d1e405f4b8e978afedd5a95fef3e128574d683f8571072acb47e77287c620f91c4c4377cdb6c", + "client_sig_rng": "1f25fc16e4bdc3d6960a7fe204be53c012be18292fffa4c45213a16bb8461b51670cf5033027a5686322112a279003f5", "context": "636f6e74657874", - "registration_request": "0205758ca61c0150bde4d13d5d9cfe862e276846bcadb01e67ef3ce13f4c0d6eaf", - "registration_response": "0333c1209f43d789de0f60dd59005648b692bcd63effb917d584c62f0674dfdab203018791b45fcce3175fc075d0bfb6f88518e33a268127dadead7d696a44504f4329b2a1ddae0bb7c4e6093f54f19aff94a9d7ca5b74d2546693993bf9009a17de36b5", - "registration_upload": "02018fdce5999ab9f3b3ff47d9ea035f6d300c50aa48b5e97bf2355d277d23db3711d0b42c0500ec34ee161e39a972d8a960e59341ae77dd1a5daf3d82c24ad0c80c3068a592f5ae11de4ae33cb0e579dab52052cbfa0c091aeccc4a8b2788c8ca3800019dc5fc89de2fc3659855faeef42edec94a21c03a142eb0ef56fe40eac47168633610dfd6bb18f568dc38b084ae5ec91ff8f89bb54af24a446a0e041a56f4da", - "credential_request": "0205758ca61c0150bde4d13d5d9cfe862e276846bcadb01e67ef3ce13f4c0d6eaff0726d4c7d6c2566ea9ef225b2144122a8e08e45d789150959d886124e5d74af0300325c1187c27623d48ced597d210e427b14988d73dad654625db272cc3da1f1e5ba920221d0fa776779e8e50c727cc68ae02a97ecc8ddb0e407f07b6bc72bdb2f57", - "credential_response": "0333c1209f43d789de0f60dd59005648b692bcd63effb917d584c62f0674dfdab2d2aaaafb563d56cf1961bae49dfad4aa0be38622b1fceccd5aa6e45b598c2fd00de852df9f7e7df88b1b9f32620b77d8d31393fda1c6bd6d4b7153dbbb872a3f160dd20f10fe86aa9e2a0839fe185aff274da48f1fcc54c27b6e414dede0fbb0c06e34d3fc9a3dfa081b18686d2a1ca221f260d52de72f57e8eef7871fb4c864cbacf972de34a8e2422cd2e2f5b13a4f8e06f9f69b74a94cac6184fc8e097e505166610d53b89ac5732e206db669ed10a7317186ec348a30ecae7b99b4816fc52727290200c92bb531ee4434764d28aac6c037a6f7791c1195c5b8af3a1b228201848c2a5eb463dd2e993e5abcf9e293e24b2cfbe7ae27b6b12bdb1569ce589462fc2538ab69546e8a4a81cabe25cd74d973c68b93eca99c71b2a32038f04453ca942006fe1e", - "credential_finalization": "fc70e01a4e445c15f307824b28b36d515d3becf450887e7fc5d6f5e50df40b20", - "client_registration_state": "f624918de5c8533c22ee62286dcbc1d8c164625cc99087f0afbdfc42784883ec0205758ca61c0150bde4d13d5d9cfe862e276846bcadb01e67ef3ce13f4c0d6eaf", - "client_login_state": "f624918de5c8533c22ee62286dcbc1d8c164625cc99087f0afbdfc42784883ec0205758ca61c0150bde4d13d5d9cfe862e276846bcadb01e67ef3ce13f4c0d6eaff0726d4c7d6c2566ea9ef225b2144122a8e08e45d789150959d886124e5d74af0300325c1187c27623d48ced597d210e427b14988d73dad654625db272cc3da1f1e5ba920221d0fa776779e8e50c727cc68ae02a97ecc8ddb0e407f07b6bc72bdb2f570065d6f72f8bc99647c384bd2d299682085e1a601d4f3349e3c3afa7178f089d69c8354fdce422e55dd04a95a4447cb197f41200a0437e7700195aa4d75ea238cb57f0726d4c7d6c2566ea9ef225b2144122a8e08e45d789150959d886124e5d74af", - "server_login_state": "02ea4b9954fbf24ac340eb48dce51352985dc53e2df2271762720507c3c1fe9924271c52b2e3e1e96a56a1cd013c4fd6bb1428b7e21beb94a6c3257e6f83953ce801f9ef3212b103641aaf97ac301e50720bec013b5ae9025c865ba9ca58a999", - "password_file": "02018fdce5999ab9f3b3ff47d9ea035f6d300c50aa48b5e97bf2355d277d23db3711d0b42c0500ec34ee161e39a972d8a960e59341ae77dd1a5daf3d82c24ad0c80c3068a592f5ae11de4ae33cb0e579dab52052cbfa0c091aeccc4a8b2788c8ca3800019dc5fc89de2fc3659855faeef42edec94a21c03a142eb0ef56fe40eac47168633610dfd6bb18f568dc38b084ae5ec91ff8f89bb54af24a446a0e041a56f4da", - "export_key": "e168e37fbff4c1faef2056bdbeaa6108ea0e77c9674dff96d2ed812ac85b41fd", - "session_key": "e801f9ef3212b103641aaf97ac301e50720bec013b5ae9025c865ba9ca58a999" + "registration_request": "02dae093d60c759c210494f4230d3475b94edd88e17e2a6ecb8d76ce24f8148d5a0f96afed77a6c125a2f9beb5a34a2968", + "registration_response": "02f3632560ae196e161bd9395e1ee39223173abd2611b44ec657590872549afb96344ed14438758e467cb7a5f1f9801e03028881d773ced8ab77e46f7cd71d064d27603a76c50203f5bd67d3030a511e40d7ba7034d6f4c6470f35a8bf0c8bfc16a8", + "registration_upload": "03f7f368a3e251a7e1b768c9ee2f3c6d97ec151da723c0174536e6c0a1d4d539492cb6a2977c32ec542c632c9283b9698017b4fe91a90d8bca9733f3a6ee508fdfd87bbf54f39c8831618d775c9f926886401f4f2cb1879ee9b9a0f38e5570e7ca641af20d3b3865c3eb08a9cae0496008423c20057067f8a5ad202d57d6674378b79100caa7e8bcbeeefd9faa98268055199ad8fe5846f6d2bdf690eddaa334d9c6237a54ce575499cb1f425b972527ac", + "credential_request": "02dae093d60c759c210494f4230d3475b94edd88e17e2a6ecb8d76ce24f8148d5a0f96afed77a6c125a2f9beb5a34a29680b33cd9828f2811030f67b5427c8884f9ccc2333b0206d803a877f89979d9665038f1a7dce370e5b0186bd3fe0a2b24e9b37e2e26b7b15b60a3cf7ff98d0d216cb4bcdc7958f8116d95c5f58df39078b97", + "credential_response": "02f3632560ae196e161bd9395e1ee39223173abd2611b44ec657590872549afb96344ed14438758e467cb7a5f1f9801e03ce6418319ff042439a0174c59e74d3aaed30ec0ae66ed71358775cfa421b6b850958d51947611f97ea11ee5a74529696097ff0c566015800e7d5419e5f873fb8dbb54f73e423302a5f4a049f0ce348307c5a627c88ab4dd9b7351696205461df99a8983c1ad75119678007bfbca067b8fd670aa1484768283565c4d58f5bc862abc1c806d7b1ce5144b1932ecb2ddb1efb5b4496c8d67093ceceaabcc36a7674f60393da891353b3fa44540339f9bd4c4960386410dc09e647730e6674a218146503c56657e23fce77627daee84072de00a9f5eb71d939afe51893eeb4059a651ecf9b17228c1e22b51e12e7905a0bbbb7e7fbe9b4a59e2dfb294b889182e890fbf927fcf6903a5e32f9da42c4e204a1f09239a1c260e2007c54336cfa86184f9599", + "credential_finalization": "138fb9632c581561d06f850075070fc644fdf18ff9f6c75554863cb856dd7ff42c9a948be264ae6dea062754a70569f9", + "client_registration_state": "73a045d8eadf0a489307ab7f6f5017e6b30093d85ebcb9b415fcd5f0fa76e85e28c23bcbf0ece258230021f4a43a3d0002dae093d60c759c210494f4230d3475b94edd88e17e2a6ecb8d76ce24f8148d5a0f96afed77a6c125a2f9beb5a34a2968", + "client_login_state": "73a045d8eadf0a489307ab7f6f5017e6b30093d85ebcb9b415fcd5f0fa76e85e28c23bcbf0ece258230021f4a43a3d0002dae093d60c759c210494f4230d3475b94edd88e17e2a6ecb8d76ce24f8148d5a0f96afed77a6c125a2f9beb5a34a29680b33cd9828f2811030f67b5427c8884f9ccc2333b0206d803a877f89979d9665038f1a7dce370e5b0186bd3fe0a2b24e9b37e2e26b7b15b60a3cf7ff98d0d216cb4bcdc7958f8116d95c5f58df39078b97dfc6e6b59ea123bfbb70d6078c3640d0c67294ed7d804dd0f972c04d8a9d765187fc46c8faf947c2fb2fd361e38855d10b33cd9828f2811030f67b5427c8884f9ccc2333b0206d803a877f89979d9665", + "server_login_state": "d779bb0deae72ecc173223223b6c2e7ee82e96b8978fdfaaad399a1693d3392810d09cb2472a23017a61e27dae0ba36b138fb9632c581561d06f850075070fc644fdf18ff9f6c75554863cb856dd7ff42c9a948be264ae6dea062754a70569f9", + "password_file": "03f7f368a3e251a7e1b768c9ee2f3c6d97ec151da723c0174536e6c0a1d4d539492cb6a2977c32ec542c632c9283b9698017b4fe91a90d8bca9733f3a6ee508fdfd87bbf54f39c8831618d775c9f926886401f4f2cb1879ee9b9a0f38e5570e7ca641af20d3b3865c3eb08a9cae0496008423c20057067f8a5ad202d57d6674378b79100caa7e8bcbeeefd9faa98268055199ad8fe5846f6d2bdf690eddaa334d9c6237a54ce575499cb1f425b972527ac", + "export_key": "02d14530e4210d7d74c9746aecd7cc183f3b6864d7f2a7a0220c6336099e1cab4683e4c96dbe5c5b5ff3b99913d80e87", + "session_key": "d779bb0deae72ecc173223223b6c2e7ee82e96b8978fdfaaad399a1693d3392810d09cb2472a23017a61e27dae0ba36b" } "#; -pub static TEST_VECTOR_P521_P384: &str = r#" +pub static TEST_VECTOR_P521_TRIPLE_DH_P384: &str = r#" { - "client_s_pk": "03011204e07344d2c6e85c11202bb913b9aeb3e502aa6712f2d1748b057dd2f00968062b7933209c4bb42bddd53d1796ba9324bdf18d9a713fb80de4a82059197789ea", - "client_s_sk": "015087c6de4c68797c87ef5b687f9828caa75d3bb2b2bf236b674da1d2b86138b32a542bc6758f7c8d0251cea2713c60c436b9753cea027f7acfbd254aa995fdc3f0", - "client_e_pk": "0300324c128e2ba7542ba6a67eb8598fbdb14a84ab36a0e721839555cc4156a923c0151c1bd4383ec92e100a8544eac29d600c8dad07c32691cdca9cc11eefc319c785", - "client_e_sk": "01f32e7310025f8cf4c5c12a884053ea2a0592af6367c04e65bea6d6e6e2491cd94f9b917ab086cbcd403262b7dd52fa8173597eb55698ce0d1ecbfad5f4b723fed5", - "server_s_pk": "030151c079f62bcd921a7a124cee0423980d839ac71e16e563cf1f51f9e0426b3a340954792c81df7d0e687a2c17bdfb1ea39a383dc1a198df3f3b8ec944f6339d1bbf", - "server_s_sk": "003e9d0bd0b29d5cfd09df3d7240c0f74e6dc92137ab6bcbe3ecc44b01d7d1eae432d49052892e5233b9d1b63c2f288ba7dcbd8431dc3896a707ce158e86b3afbedd", - "server_e_pk": "03016bfb0e6c67978b459f43a84cb0b328c2ebaf5b05a81dd012d895b53be62d172a4647ade1c84650e61fa48fee2a7ff868b2b5f68ae5517e26d3fdef26e6c41ffc6f", - "server_e_sk": "000cb89ca82a0130dd5710fe1e2c5bc98a9744536fcb7ca8a60771e463c09588fbf65b913a86e4ec5c2258532fda2fbdb58596a6c31d0d319ab1539abf388428af0c", - "fake_sk": "00bd1a732294cc3f3c7b11e908bbe3740c939552817e8835fe1cbabdb8ff34e72e73bf4fc816670f11cbbbf80597d5c0412505fa0ec0b38bc41b2543fd9167dac440", + "client_s_pk": "036f3f09deb743f91f7358d3cb31250f5e51674bbfdcfb8b42936bc47dadc2fa7154c8a219a48deca52011bcfd4a084ae1", + "client_s_sk": "da995e32d41704afd49bfc6a294e7b00e4a97d3796cbe869ee130af30d7822cf9860d3323f63ae5b1041e12f76749ffd", + "client_e_pk": "020ccd1f68e821ecc8a6edec0e27bb813eed07c9fd2a9c0cb5b34a8bf421551ebe4bef39c1efb3c134713f02b76193fedf", + "client_e_sk": "734f02b15a0239045a4bdf5583bc4866b1299bea9d95b6eea2b451a22ee499e2b6419e2f9f1a4569bcebe3f2744a6dc2", + "server_s_pk": "0336d19844898d01bc4815d94a6fb8a2f36d74fe255c07e4e6e2f871180e04b285b2b0ff5357586426411cc60ea90c5181", + "server_s_sk": "686ab553bdf738827590d3bfb96557a8cb292d394dff0de0ee86fe1d14745f6969c78882f0ab8c46ade2c4bab08bfb54", + "server_e_pk": "03af79b8d0eea693de3bfbfdcb0997435c0fd0c2717b0bcbe8d3d54ad672ce070483b5d17f889ce39af3ecd93ec4cbb29f", + "server_e_sk": "dee7d57a6e88dcef03b2252da68657eb1a7a6a471a0fc8f49f0230656e708205d1ba3c012432fdf81e8b98ab994ebd91", + "fake_sk": "8e3a2206a2d66aa5a882bd204bc7229633846dea123b5ade21605872f26b3c72dd88c4f8da2c553c6a7d9bef4ed17c6c", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "21279ced1019aa7a5b2cde2d4baebe9ece6444ccdb1f757cb0730331557938473502d90a79bf48a5920fb1e0a63acffa", - "oprf_seed": "391c6798b07608442589c18a037ee26f50a3f65bc1ccafb0a6354f69536d193c1bd09d5d1d353e06443bfe5625036643", - "dummy_masking_key": "f17d7ac20502e7a135044228df5d714eaa2df656b2e81dcf87baa5f26cd307f9e12b067e753d9997be344ffe4db4f61c", - "masking_nonce": "b44151d83fe019d608f54c015064583b1b2015cfcdd8ddbba54e20e1187a1e1868497a4e27796775afc3930ccfcabaf8665aa3e397de6d4612477a6a47433090", - "envelope_nonce": "6e8546c8c36f9406553aed576c09503c12afc218ff66f84145806bb34bded6b1", - "client_nonce": "5fc3314b0f80ad8ecda2b0798f0534dc092054ac8eee8e5969fd6f3f616f1bda", - "server_nonce": "be546056cb5d46b9d8fba7dd91f2d257699430d366f437900ca420e438c7762f", + "blinding_factor": "01bd0e099637846e3962ce02271e45b365134b27b578d2662003afc7b58184f12fbf8459be76ad4bcaf084d15ebfcd1f720cb61b3b70ef3c7d896b59cb3e59c40169", + "oprf_seed": "130783dbb54dcb7c7e8973da86e51baf241172e4799e4bb22bf3b0377afa28650720a857582ad1502b81d040279f16c4c74b108fbf973421166360a5424e723f", + "dummy_masking_key": "0c169ff8a8cfe4bd7ec34d713753cffd46e6f114220de9b6ee36c2979df2c64c232f4a34b19e000d752c049dbc6e1c65cb0100823528bc207f7e6c6da9c2c7f0", + "masking_nonce": "b6d3efc61fbc25ea2337c813587d0586d7eb3cbe94892aa1c4d8095651d3dd853ca02bf18d6862624c01ca1acb734dada357cf871a9913d49adbb1a1d97431aa", + "envelope_nonce": "e4b93e5cd05bcff0fa759f3e0bdfedb5463d205c2194aa3d1791f0e6072481cc", + "client_nonce": "ed2349fae14a1cfb12e4e1ca04587b543febb593cfbaf56a4055070b9dceab0c", + "server_nonce": "78e6ac93c9f98c617ced218ef6e94d9ef1ac42395dd9664804e3fd1e492a78b2", + "server_sig_rng": "072d174d3df75ea624598d7cc6b52234a568a22a2796d3bbfe3bf4ddcfcf4d3689cfe804cd7cbfb017269aeb1854d240", + "client_sig_rng": "fad5c9f1132f927faebf7d824e07ca8391c7e1f5e5190028cc1c826912df601b9f3382cfe7c22b0d6928d3c9adc3e2bc", "context": "636f6e74657874", - "registration_request": "023512cdb3a9e6ef783945155befd793b0275e3c5bb10543004fb53460656202355073bf0486852daeac0a1b977d4a04dc", - "registration_response": "0344217ca10158f1fb5222265f684f88a042052a008a54ee81f5ab3f83fd9fa9d6af4438bfb3e7222dbc867137afd0b384030151c079f62bcd921a7a124cee0423980d839ac71e16e563cf1f51f9e0426b3a340954792c81df7d0e687a2c17bdfb1ea39a383dc1a198df3f3b8ec944f6339d1bbf", - "registration_upload": "03012e9d0bc9c83ac0e8ffae5e4b86c3552b95efe7a513a7473f13c74ef2561979112666820cd0cb50b101fcb9f5dec97281931de9c4af8bfb860ab5e02aedb7126e43ebdf457565a59e7bdbfa97ef00abb7c36e311b1c40ff7e5c3c15aa41338a18e83d715e5365fe6fdc10f37a021390b675015087c6de4c68797c87ef5b687f9828caa75d3bb2b2bf236b674da1d2b86138426943f65f0a58910f49376a9f59d91ba668c60ba4c8e2b698899d139ed1b73fa601b2da036362fee9f5a71d4f6c4532", - "credential_request": "023512cdb3a9e6ef783945155befd793b0275e3c5bb10543004fb53460656202355073bf0486852daeac0a1b977d4a04dc5fc3314b0f80ad8ecda2b0798f0534dc092054ac8eee8e5969fd6f3f616f1bda0200043eecd263799eaed8a7acbc8a825345752428c9f2426bfd55fa6f81b9636289b1000ecf9ffa1d68b0f8d3f0f6f4448e190baaa039f9555fafbe1c9b7d2117276c", - "credential_response": "0344217ca10158f1fb5222265f684f88a042052a008a54ee81f5ab3f83fd9fa9d6af4438bfb3e7222dbc867137afd0b384b44151d83fe019d608f54c015064583b1b2015cfcdd8ddbba54e20e1187a1e1835445d0d3458b400e7c44509a9788c9f6d5a09f857ca9cafd8d0f36a27c3f441a4883d629f2f0e2df88941d6d6528e47ea61678fd1f1f424ad5849a1e562b79c9c475729f7950e66c2b4d0aae5a4f6659a0727214f4455960c9edafc566f7b3bcbe8d0b772419b589d92e0cefa9038623aa9a07494f825b67c4e71ad06d4885f59b4e99ef179acd4d3b1db35bbda87ee5dd9055b913a86e4ec5c2258532fda2fbdb58596a6c31d0d319ab1539abf388428af0c03009c5c355ed003dedcc510a99c2b64d25fd413b534a3802c9a9fc5819aaef034abd207107c1f6140089240b57aa8d8263e04abed5f05e3e281be90946df79055c29825217d90dca2d1ab0f7dd083b48c7ca8989e296b73576eae9327255591ba6de0c2fcb46c0ec03618cc9bc4c78d1fa8df", - "credential_finalization": "d604757b412b84ccad4f29a3e58e1ea10f554183e40051a319604e4ab7e7252f6f3d55e9f814d399f410a226105026f7", - "client_registration_state": "21279ced1019aa7a5b2cde2d4baebe9ece6444ccdb1f757cb0730331557938473502d90a79bf48a5920fb1e0a63acffa023512cdb3a9e6ef783945155befd793b0275e3c5bb10543004fb53460656202355073bf0486852daeac0a1b977d4a04dc", - "client_login_state": "21279ced1019aa7a5b2cde2d4baebe9ece6444ccdb1f757cb0730331557938473502d90a79bf48a5920fb1e0a63acffa023512cdb3a9e6ef783945155befd793b0275e3c5bb10543004fb53460656202355073bf0486852daeac0a1b977d4a04dc5fc3314b0f80ad8ecda2b0798f0534dc092054ac8eee8e5969fd6f3f616f1bda0200043eecd263799eaed8a7acbc8a825345752428c9f2426bfd55fa6f81b9636289b1000ecf9ffa1d68b0f8d3f0f6f4448e190baaa039f9555fafbe1c9b7d2117276c018dd0fec9473f9df0c49e2eb5fecf1167fc7fb30e8fcb4d3ad86001a2c17275d6d67d01bc026691a693a7df2fb02c4fa54106eddd00a57de88bdb49044049aa35155fc3314b0f80ad8ecda2b0798f0534dc092054ac8eee8e5969fd6f3f616f1bda", - "server_login_state": "af3fb7cbb4d000114988252e2a797eac6c378cde2f6f8d48ed8bfa920d06da32ab3dd378e77b3f6c8635099ad2aa78332dfdfab087c2718f7c52a543e7b1e7592be1a7a76f9bcfdbe71100760481bf62bb00a3ca3354fe18cbed9508e5c69eb711e025a882381ce85916f15fa6ca02b06dae2a992bc5d7d905bd30844bbff77ab324c58faaf02941cc8c3bc630202bb7", - "password_file": "03012e9d0bc9c83ac0e8ffae5e4b86c3552b95efe7a513a7473f13c74ef2561979112666820cd0cb50b101fcb9f5dec97281931de9c4af8bfb860ab5e02aedb7126e43ebdf457565a59e7bdbfa97ef00abb7c36e311b1c40ff7e5c3c15aa41338a18e83d715e5365fe6fdc10f37a021390b675015087c6de4c68797c87ef5b687f9828caa75d3bb2b2bf236b674da1d2b86138426943f65f0a58910f49376a9f59d91ba668c60ba4c8e2b698899d139ed1b73fa601b2da036362fee9f5a71d4f6c4532", - "export_key": "71a0a9fd0bdd47f16e6f1ea00c3bcf34c427815514f15213f45994c27f512a9e737c86d3afeb41e06077a53de7b32331", - "session_key": "11e025a882381ce85916f15fa6ca02b06dae2a992bc5d7d905bd30844bbff77ab324c58faaf02941cc8c3bc630202bb7" + "registration_request": "03016d20d85de0cac74558264631158f1b3ae97aca0da2a65f32d9ba0e14d35922d5ef8cac7ae6bef39aaa53920fe2e0108e7f54aaaa10a4c57fda15c2f093c1162384", + "registration_response": "02018c1c6b340c598e25733f73d6ed782f950dae13e72994087312ae48ba3a9edf744be10222efbb326935aa0dc85e90db4153ca26358f1747c9593d63c5db13c58f480336d19844898d01bc4815d94a6fb8a2f36d74fe255c07e4e6e2f871180e04b285b2b0ff5357586426411cc60ea90c5181", + "registration_upload": "03a75b6663c58a54832a99b900c9d956d15ff49185df7a694d5304077dc9581576f1b7c98cfe05dd7504a50690836bd6519bf61b17d1fce9883e5c2f2a0df1db96f50acf088d86056b23590cd0dc60ad0c91533d31256c28f4e9c3965aa85a8f23a20505b409fd807376a961cfdee95b7dda995e32d41704afd49bfc6a294e7b00e4a97d3796cbe869ee130af30d7822cfff8fc9fa45c9316e0e4cb1e4829fecbb5f1341766cf9de6fb52328a9bbb174b2f211668ebe583076d16817d6a7d7ff9ef42878a6cce0b7f43d2ebb907a40fc2e", + "credential_request": "03016d20d85de0cac74558264631158f1b3ae97aca0da2a65f32d9ba0e14d35922d5ef8cac7ae6bef39aaa53920fe2e0108e7f54aaaa10a4c57fda15c2f093c1162384ed2349fae14a1cfb12e4e1ca04587b543febb593cfbaf56a4055070b9dceab0c03390365e0816eee9e5247581436e80e390a653446ab3a5661a0b56a1d2f4f328807500242eef0ea4e910500f66cbc5902", + "credential_response": "02018c1c6b340c598e25733f73d6ed782f950dae13e72994087312ae48ba3a9edf744be10222efbb326935aa0dc85e90db4153ca26358f1747c9593d63c5db13c58f48b6d3efc61fbc25ea2337c813587d0586d7eb3cbe94892aa1c4d8095651d3dd8560ab5787dc722f4fa10ef4e9cf5bc691a9bd95849396c7f106de4fbff2869e104d67a1685bddbb37686fc3776d8f814d811880a92c4b81c76a52e3e5105a6d9e905936f25c55d88baed5241270b8b78e62c24fbed5e1330b1badd0b51de331af4856cc09b28a6239eb7ba68af799d12e4fe1e959ab320880ae1a3e3d6a6acd6aa373ade95008ad31978b7e291bef5da4c81a7a6a471a0fc8f49f0230656e708205d1ba3c012432fdf81e8b98ab994ebd9102cbed197ec07b3f5b186369dc84a756481bf00ab0349d344ffd5fc6ca7670a140aa250e03ff0846b881340cd3e9555f04d03ed2c155cf9aefd91e6142b38f8fece140fdc9fcfb41e1a0002c4976d68d30ef1a271442bd479cb0af078053b1a183", + "credential_finalization": "c4f9b87774a2a2b2b0aa02e46e09448248fbd354b3be9c482d3e4a683d260c14e8c692b5841eda7cf8ed2ffa3db26000", + "client_registration_state": "01bd0e099637846e3962ce02271e45b365134b27b578d2662003afc7b58184f12fbf8459be76ad4bcaf084d15ebfcd1f720cb61b3b70ef3c7d896b59cb3e59c4016903016d20d85de0cac74558264631158f1b3ae97aca0da2a65f32d9ba0e14d35922d5ef8cac7ae6bef39aaa53920fe2e0108e7f54aaaa10a4c57fda15c2f093c1162384", + "client_login_state": "01bd0e099637846e3962ce02271e45b365134b27b578d2662003afc7b58184f12fbf8459be76ad4bcaf084d15ebfcd1f720cb61b3b70ef3c7d896b59cb3e59c4016903016d20d85de0cac74558264631158f1b3ae97aca0da2a65f32d9ba0e14d35922d5ef8cac7ae6bef39aaa53920fe2e0108e7f54aaaa10a4c57fda15c2f093c1162384ed2349fae14a1cfb12e4e1ca04587b543febb593cfbaf56a4055070b9dceab0c03390365e0816eee9e5247581436e80e390a653446ab3a5661a0b56a1d2f4f328807500242eef0ea4e910500f66cbc5902b8dea5426af8d8c40fc1d3e4ed1182a3ebec7dc0b6e4d9be0ce0acddab102de334ecf6929c69f51ae543a55ee547eb94ed2349fae14a1cfb12e4e1ca04587b543febb593cfbaf56a4055070b9dceab0c", + "server_login_state": "bb89e0400473071109b0dca869a254818f6230b0d28f4fa9b67ab7d2bcad6faa1675d73e81816cb68d7e22c6e4a9af17c4f9b87774a2a2b2b0aa02e46e09448248fbd354b3be9c482d3e4a683d260c14e8c692b5841eda7cf8ed2ffa3db26000", + "password_file": "03a75b6663c58a54832a99b900c9d956d15ff49185df7a694d5304077dc9581576f1b7c98cfe05dd7504a50690836bd6519bf61b17d1fce9883e5c2f2a0df1db96f50acf088d86056b23590cd0dc60ad0c91533d31256c28f4e9c3965aa85a8f23a20505b409fd807376a961cfdee95b7dda995e32d41704afd49bfc6a294e7b00e4a97d3796cbe869ee130af30d7822cfff8fc9fa45c9316e0e4cb1e4829fecbb5f1341766cf9de6fb52328a9bbb174b2f211668ebe583076d16817d6a7d7ff9ef42878a6cce0b7f43d2ebb907a40fc2e", + "export_key": "6df9f947348754f6fc9e481f20c13f61b9f59aebf7ecd7acc92e6e8992e7e0bde0e3036fff9dde77dee0beb14d37f703decfdb59ffcbb506a0e497831a3b8d30", + "session_key": "bb89e0400473071109b0dca869a254818f6230b0d28f4fa9b67ab7d2bcad6faa1675d73e81816cb68d7e22c6e4a9af17" } "#; #[cfg(feature = "ristretto255")] -pub static TEST_VECTOR_P521_RISTRETTO255: &str = r#" +pub static TEST_VECTOR_RISTRETTO255_TRIPLE_DH_P521: &str = r#" { - "client_s_pk": "030116069f9dbfdf2e0351d260e176679e4837d34224a08b38c87e5515e7e62888a14d70b7362d4e9ccfe80311bc1d64f63efe3911b7fa0f3c90a1de93e6ca328d0052", - "client_s_sk": "00ebc2232bd33ec799cf8f02128ab251a0cce8a714e8d371a132eccb773a811b6763f3c9e019d7aaf84022677cf763eb8499b5c7c1e2bbe14cc09573908035c95b21", - "client_e_pk": "0301c23b81c085ea7af13c34ead60835c2520a3ef44cca8dbea55b769f88c6133a2c2f4d51dcd25b739978fdf61767606ecac50cb815f9b9060e54717abe27901b855f", - "client_e_sk": "016bc15ea52635ae39f6c5a24e8f6abe3fed49abdeb28acf9cd209bd68a0371801745baeedcff6accc2efbe14869d2e7b1b8e06242a6c013c32e35dcffd447798845", - "server_s_pk": "02014f8d6c8a9910fc140cc693a7a49a9bd24cf897a979927ee8d4486fc6755289c4063ebf40808c453faa9257687cf60552a465456aad08c6cb1fa316c2ec866fa19b", - "server_s_sk": "01e7bee74e11b977606c888089de2639c8f4c5eeb63b9e369c7e810cee9943e3a451ef7236288803f1900de0d3249e1d77a3e14e204e9b805f708201535e37a262eb", - "server_e_pk": "0201979e6e5c4a0cd19f472e0bced2e8ba46cc9e18cb8821fd7745446214a82902eebcfafbb3328a2575ef5bc629faff40ec07c07c339925b45eb6dcfa667fc24bed7c", - "server_e_sk": "0173278167fd3cfb6b6900d37bc22b524618f68719c520c404defde79115308b4e2124992cb4850c137ee5dfc94a6b1b75f530597fca92758d3eb56d50551d4fb1c9", - "fake_sk": "0162c2b032ff4d89b7fb5c8c9f1fb5fb725b64dac2d34b578dc5f137e2ed5d819d07d324b09c3e1f1e7808bcd6fbe6c6cc2ada32d3368e5364c286de6b62fde22b4e", + "client_s_pk": "03010e87bb64e18aa89bec3ebe8a7cfa7b4140674a5e5ebe71ba49781028d63e49c7ee0ff5bc656e5656d49c4cdb3b12c4a2830d09b349ded7fa49ecfb248772bb7712", + "client_s_sk": "00368f0cf37b5503b640b96cc3dde1ad462c71d165e507bca799884d1058bfe87ab2b74ac6452a43945e5baf7bc86adadf174fbba76a72acfa72c74f30388986cec6", + "client_e_pk": "0301c6eee9e9ebd32013a9f4fbe297e718bf5d806836f12bb05fa7d814d1eab9fdc2f4781e5f6cdbe9a98afcfc755378786ac18cb4a6fcefbc12bec1488f70c60e530f", + "client_e_sk": "0051c7de172df4d40a6c9c97a37a3d3db30653c030e84441f2dda3a65cdb42a974cd396f34e1cb18e25c621b912b38ae3d4a10d548819bb0b26f821c7b1989469248", + "server_s_pk": "02005ac5272f35edf20b8dfd9801c0a77b3c29e942055418bda668c33290a16f8d3817659e34d00b4412e49edaa73c84d637769d95b8049bf5167153cfc3229fafa5c6", + "server_s_sk": "01aae3374d31f661f20f715d8ec5b35da0144a0ec9d1bdd7bca941b01ca9a6040700db05a6fd7b253a559890bca79de95ce0eb1c1034be244715a6de04309f948bd6", + "server_e_pk": "0200b5a2d8f2c6da3e9a2478fa3f6c0b01bc295209463b8688486a8e227429f43197c9b771e5417f14597c1f46428a7fcc973d92e77c65432129f24794c67180e26d9e", + "server_e_sk": "01e82aabcbf02e802a024bafe80d704c8406b4958b84fa732a143cbaf8a84edb13de6005e13ae8aea7840c47c552f9b60a83783ede000f20d6f056494ad843348a56", + "fake_sk": "012852c8b74458f42f9c90594d561063238e009492d423b739d0c230239287de1d91d46b9b75c3a4379e5496e09c17c19a2c5437196edcf73740c033178c9b61683c", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "57125635bada101f311db5fc471b275693b4c04d21a7665b940a1f52c9931409", - "oprf_seed": "7a5ac3b095b7bff0b33db84344f36a03fdf66f9309738a00cdebc362401134fac04ccafeea9180a398afae7b35a086ed3a482c02803a1aac0f21b8841b9049f4", - "dummy_masking_key": "bdf303572b1249de05a019a3068e865bbaf3290e78db5e77883f6da756ec5bad2d332ce6cb7cbdea81b9a2b6112d2421f0aadefa9b9e435e316445c84cf58ee9", - "masking_nonce": "12f6ae24083d635293e4b9bf3a005668e63a10090948d7ad6843fac7774365b724ab820ed3107779aa4012bd72f942eea3b2c21af15a62b94509ba8b5c07f055", - "envelope_nonce": "60e3bdd103b0f12fca7594b17cb0f74f9f0d2904fcec2e75041850c484364a2a", - "client_nonce": "b32470c966a68fa2e005051c6b4dd5160ed60f7c99d7b893da87b7c1b6760bc9", - "server_nonce": "d4c30240fc3a8c196c06e8c8db650cad19ecb74e9da664671a60c7a47ba5b87e", + "blinding_factor": "703ce855b19d258dc022cb256f9f0ddf031aae08acd6fca93629ec7d6faae70d", + "oprf_seed": "1478b6a8db6149dd5f8a576cd68495ef5dcbd6ca87a3bc835c62beb5be0a8dff29d785b23c9ffc7f917c374087dd670b05192e15c8195569c1ca53c55af0432b", + "dummy_masking_key": "7638df0c99ec351a184113ef6e02fc600bbb1a6cb4394a8478ed5be975490f5222ca9a2b6f8bc628660ac402936b37d5dfb2d38306c35f5f1a4acf1e0442a9a2", + "masking_nonce": "2415ab30338064da1db52194d69d13e022f3e83177b3963c0e96360724d0e2c6ebc77d5eda97d331028373e0f12f9e017d4df013d9bc2e88d11abc93e2ce315c", + "envelope_nonce": "b3dc0b736086b99617f22eb3fa89309179b7e199492768a674aba04091199d6a", + "client_nonce": "b2048707f74e30e8038593fe55aeba6e218e72ba6a86557eeed72ff445d85330", + "server_nonce": "39fcca66947e3dfdb197d5c1eee15f773b3e1936360e6c79beb9f99587ca1072", + "server_sig_rng": "8997a71e4dbb5fe0c4c3549810cc320a198eb0366d63f01c8e0385589872fa95731c7a63125a13a193dc27ba5aab193ab8169122464c1359d9389275b3b948a59083", + "client_sig_rng": "10970003f3f4495ee9aa470f458bbb770ef998f4fb72218485a19b204a332a3b86c27afcfc0082ae7f166f1fb894a483bc7b9ad8abcb7984098ed821ac7a7e42b61c", "context": "636f6e74657874", - "registration_request": "7cdbbb607dffba72a9511263dc1554f346da0b9fb6e44c0be8285c2ba0229e46", - "registration_response": "e0ed3449add492c69ad4fa80cf29c25c7d44f86be0321d619afc31f6d83b506f02014f8d6c8a9910fc140cc693a7a49a9bd24cf897a979927ee8d4486fc6755289c4063ebf40808c453faa9257687cf60552a465456aad08c6cb1fa316c2ec866fa19b", - "registration_upload": "030151030d54956421344ab5780a8044aa98c5322e61e0541d70cb60804befe00e9432c3fed2825ad563e72826ac8a5b78a15b379c107987bc39fe5e4d715ef97076c75fe76b5c79f3f05c03c7e7f80e729ed6ed0eb044c372a065dd62debecf5364fdb787d0e014e0f64cc50cfa8277606c659309d8c89da5c2470e3d1a1fcabd333100ebc2232bd33ec799cf8f02128ab251a0cce8a714e8d371a132eccb773a811b074f63f0e4f6563a8f8aac04cc561825209618265380bf6eecc784fe92b7ca0368aa3c21d6e8f48cf3415338229efbe1e08fc8308922f93073b40f687d361f0a", - "credential_request": "7cdbbb607dffba72a9511263dc1554f346da0b9fb6e44c0be8285c2ba0229e46b32470c966a68fa2e005051c6b4dd5160ed60f7c99d7b893da87b7c1b6760bc90301b3276457021c66b394b26f20ff40b5eb30dc55d01f5b692229e213aebbde8845bc2d317153152dad361c722f4cf46a60a271180721c49d56789c39d842e36b8fe0", - "credential_response": "e0ed3449add492c69ad4fa80cf29c25c7d44f86be0321d619afc31f6d83b506f12f6ae24083d635293e4b9bf3a005668e63a10090948d7ad6843fac7774365b72b74dda983f3d2128e26ec7556b75c50ca4b440a6c9c8c6e13c5616715395936e3ac564aec34ba393603b2b16e3d384a3237b0f7ab7309f23bc8afd62453a1fad096498fa90ad0521176dd6c8687eb43a14414424540d7efb55914fc3ac44e1300df756497b5b27c9f5401cbe71eb8b3576090b1c90a5ce7ca1e77a6136222c3a337fc47de8be2bc390df1f0587320d280a38e249eb0b374957af07c74f7d81f760e4d24992cb4850c137ee5dfc94a6b1b75f530597fca92758d3eb56d50551d4fb1c90201372f66cc827bac29da7c05d7fdf10fecb287a6ef9615d6d1b0fa7a0a979fd38b5d71648b35f82f7bee492e4721fa880026010cf15ab2829b671b32614e5a13e103564de31b62d5728457dca2a6ee28f78ac168af217a78435c308dd7061bedbf786bc2eb0e2ca88b2ef7ec7a9b067a5f8029bff729345b65e3bf891e9f162ed88f", - "credential_finalization": "d5b7954452fb57c6ec068c73f635ac83925fb35976d4396c67e6ea6b3cdf5eac56f2ca2bd0f93ea53c02b636f1995ae7745d1140c0abcd41924ddc33fa36223f", - "client_registration_state": "57125635bada101f311db5fc471b275693b4c04d21a7665b940a1f52c99314097cdbbb607dffba72a9511263dc1554f346da0b9fb6e44c0be8285c2ba0229e46", - "client_login_state": "57125635bada101f311db5fc471b275693b4c04d21a7665b940a1f52c99314097cdbbb607dffba72a9511263dc1554f346da0b9fb6e44c0be8285c2ba0229e46b32470c966a68fa2e005051c6b4dd5160ed60f7c99d7b893da87b7c1b6760bc90301b3276457021c66b394b26f20ff40b5eb30dc55d01f5b692229e213aebbde8845bc2d317153152dad361c722f4cf46a60a271180721c49d56789c39d842e36b8fe00088f21e8708da3cc6aad4cc93afad21bb6f9702109851a0db67c46eae859d7b327f1f07e1adfdd1047c8bf14f533bfc34aecc05485fbf84ef7ebd26563c247ca9a1b32470c966a68fa2e005051c6b4dd5160ed60f7c99d7b893da87b7c1b6760bc9", - "server_login_state": "4871350b99ce495d7c6f78d5977c8e1bf32d925b60c67c9c7aaa9b301a59fcbdea8ed1426874543a1540d052bde3a0bf501c51aa5731c99696ae47622f5d39a5ef97bae946c0a6e8544ee26b2c63bd4028396931a8fc326a2f0faca58cb770921a9b0b05732d70d09e11bd22f49b3e4285389d0e1e73aa695c763e2d89afa302b9a5d122f13d5c050cfe5f501b8946db1a614e253fa2e2044860bcf1ffa51fd69efc143f95843a1dc74b9f5ea7a0725e9d56a8392b55ec0fc77a317aa3a95bca", - "password_file": "030151030d54956421344ab5780a8044aa98c5322e61e0541d70cb60804befe00e9432c3fed2825ad563e72826ac8a5b78a15b379c107987bc39fe5e4d715ef97076c75fe76b5c79f3f05c03c7e7f80e729ed6ed0eb044c372a065dd62debecf5364fdb787d0e014e0f64cc50cfa8277606c659309d8c89da5c2470e3d1a1fcabd333100ebc2232bd33ec799cf8f02128ab251a0cce8a714e8d371a132eccb773a811b074f63f0e4f6563a8f8aac04cc561825209618265380bf6eecc784fe92b7ca0368aa3c21d6e8f48cf3415338229efbe1e08fc8308922f93073b40f687d361f0a", - "export_key": "706133345636af0960531c938fa5d1aa3098c8c24564c7ee36ed28333220e2add7248a612a0e8ba15a394126cc26ccb7694f287ab7d45c2648d1a13a3731983a", - "session_key": "b9a5d122f13d5c050cfe5f501b8946db1a614e253fa2e2044860bcf1ffa51fd69efc143f95843a1dc74b9f5ea7a0725e9d56a8392b55ec0fc77a317aa3a95bca" + "registration_request": "0438cf8a853c6c6c9d8fb7d30b2769f93396d2b61ff3f7ed209599761d81d835", + "registration_response": "520d7fb21838be9fe7795c3e122e968f001690186ed53f2984e3f6a81cdb1c0702005ac5272f35edf20b8dfd9801c0a77b3c29e942055418bda668c33290a16f8d3817659e34d00b4412e49edaa73c84d637769d95b8049bf5167153cfc3229fafa5c6", + "registration_upload": "0300b661b3285b5ad40a81500c15d572bd811bd6db942a1dea0f98a2ecc31f1c7cf83440206e9817ea81a9d78461319c974b176e96cc87f1c4068903934654f87674c819dacb349a9878a1354ae28602767eda108286d1fd72017f12f73909465c42fc59214092c838e69d103dbb5d8f84c10e93da9f5ad91a1fd553b5b09d2131866500368f0cf37b5503b640b96cc3dde1ad462c71d165e507bca799884d1058bfe8ed6693bde9d89cb58aab3f325d55aa8cf89d8d18450729e4704283126b7f9466611223b629f96264d6af6161014c8843514c3b87d8865ea2561e03898652ab09", + "credential_request": "0438cf8a853c6c6c9d8fb7d30b2769f93396d2b61ff3f7ed209599761d81d835b2048707f74e30e8038593fe55aeba6e218e72ba6a86557eeed72ff445d85330020004fa35c254e2168954d0dda931a58c1882e2905997f2fb4e8835d9f94d8b9417193882bdfb096e1b22da9890ae04b21611655fc2d9242cd94e9b9d20d3ea421525", + "credential_response": "520d7fb21838be9fe7795c3e122e968f001690186ed53f2984e3f6a81cdb1c072415ab30338064da1db52194d69d13e022f3e83177b3963c0e96360724d0e2c623b6dc934ac0dd6db5079e16c25ea5038317e87edccb1c8f835eb618326faf6e6b638ed209433ae0065d07583e78ad3a2379493b8cedc2baa7fdc2be75acdabd6502f5fc7b6fb1bca5bced3aa731200351fbcfe1ab0b27519590c3cb69fe6d49e74e95a06bd7339096247ba70973300350b51139bcdf7bbf8e4c138e9ecd31edaa0eff4a5c23d5d0cc3e809fb896018f97839a37808a16429dc0a60815d4242e1458706005e13ae8aea7840c47c552f9b60a83783ede000f20d6f056494ad843348a5602007577088c0d5e7f831c3431efbe99732dba69a744aca4a6313105275c8ca39deca3ea8985df4c2cc2eddfd6c7d298b7fb700b6d37312ba59fec8ddc5ca73a44b8c72b64983d3f3f05d0147bb39c394c259799db0f49eccb6e0618ca7dc8b9a9c406f22e968c24c6700029af93bb286b4dd13f9b75bcdd8c5d87ca14340ab7273b0a", + "credential_finalization": "ee882f1e9f7a7ab3938fcec81171d002212e9d0080166f5cabd56b80c77f036e46af761eb55be6ad09f1bfd9655cc101513822d6ea5e256f362888dfc6037055", + "client_registration_state": "703ce855b19d258dc022cb256f9f0ddf031aae08acd6fca93629ec7d6faae70d0438cf8a853c6c6c9d8fb7d30b2769f93396d2b61ff3f7ed209599761d81d835", + "client_login_state": "703ce855b19d258dc022cb256f9f0ddf031aae08acd6fca93629ec7d6faae70d0438cf8a853c6c6c9d8fb7d30b2769f93396d2b61ff3f7ed209599761d81d835b2048707f74e30e8038593fe55aeba6e218e72ba6a86557eeed72ff445d85330020004fa35c254e2168954d0dda931a58c1882e2905997f2fb4e8835d9f94d8b9417193882bdfb096e1b22da9890ae04b21611655fc2d9242cd94e9b9d20d3ea42152501037ed1503a9bda9daee794a41a19f27a64f9be911f8e26b0f8d370f4f9330ea182f474d692f9afd3ddf787c1a6a6a8ada5e0b2775cbd8e9aee4a4c900504d00d28b2048707f74e30e8038593fe55aeba6e218e72ba6a86557eeed72ff445d85330", + "server_login_state": "fa9075463ab487b548a5bb0df25f98022a1d13317f0509f317bc23f30da13c27468f2f389231d06a7ab942b9fe16efd57e89610c8d0483c52f4860c6a3c8fa78ee882f1e9f7a7ab3938fcec81171d002212e9d0080166f5cabd56b80c77f036e46af761eb55be6ad09f1bfd9655cc101513822d6ea5e256f362888dfc6037055", + "password_file": "0300b661b3285b5ad40a81500c15d572bd811bd6db942a1dea0f98a2ecc31f1c7cf83440206e9817ea81a9d78461319c974b176e96cc87f1c4068903934654f87674c819dacb349a9878a1354ae28602767eda108286d1fd72017f12f73909465c42fc59214092c838e69d103dbb5d8f84c10e93da9f5ad91a1fd553b5b09d2131866500368f0cf37b5503b640b96cc3dde1ad462c71d165e507bca799884d1058bfe8ed6693bde9d89cb58aab3f325d55aa8cf89d8d18450729e4704283126b7f9466611223b629f96264d6af6161014c8843514c3b87d8865ea2561e03898652ab09", + "export_key": "7e7ef57c8a2e1d8adb52a37cef05958c30633e002efd525b6f87d44e5aaa8d0e3d398a42b3f201290fded3b274f90670db9869b4cdd27aecd61874e6ad8cc1e1", + "session_key": "fa9075463ab487b548a5bb0df25f98022a1d13317f0509f317bc23f30da13c27468f2f389231d06a7ab942b9fe16efd57e89610c8d0483c52f4860c6a3c8fa78" +} +"#; +pub static TEST_VECTOR_P256_TRIPLE_DH_P521: &str = r#" +{ + "client_s_pk": "0200ab9d5e651c6d456427b7c4f048de917d6c4f20dd45a2e41b59ccd2093de6c8e7f5e76b9ada53af176ad63f3b00a34b011e53fce56dc432a24d7bf6f712a64ed1fd", + "client_s_sk": "01deea9aba817c02826c011f57a122a73c914d9c91c39d3e15e6ab5ffb22b6fb2914dccf867c4a882d9f7e09e8d647d61b2df8a5d005a01acea036e8335b1445d723", + "client_e_pk": "030183c41406887071c6906db919aab3a36f69c089d617734045b198ec39398b9d79ca94899d3720ed7adfac37a7a3cfcab5a3da28e30295f2363f2f48a0945ae6d9b4", + "client_e_sk": "01807eda8c190bf13c72e3b19e00f81638abad80019648f242162fd80ea32c37ff2df5b1918c0ef8a9b199261e1566d468e5bf352a825f439725ee464c0baeea6372", + "server_s_pk": "0200e6c75dc98507786077bf88479b4d95c5034218ae74b4a989ac26f91439d3e808adcbe1051c4f0aed62f181f43600083f794798eb7820879b411b0c5f46adb32b3e", + "server_s_sk": "01d17b75c2578fc9fc2f457d1b2f944eec055515102444c2b30de5cc34d10fc1134fa213b54e64a6f9f172a59c0753da62971c04c655087d5975494ff5e8eb4f554d", + "server_e_pk": "0200474dccc932c3a20368a9f131c7201fc3048927a7eba9bb0196951be875d48c7d768d9c3d551e4009629a851085e4cd9b0902ff38da1c175c76db228aa273b86a39", + "server_e_sk": "01a2b92f355f5b28e12d0bcff5bdd3c9410bbaa74c04fe30e1adc0f227ef0164a50ef1bde48b83d562139d35e07d4bcadb62bc2ff3db58223ab26be388a8fef15a71", + "fake_sk": "0063e16f58fab15ce3ba75842b71a50eefe9331f96dbecae293b5e30d23b66b19ccb8ca6c24f37f4b38a0cfdb087a12faa39b86e9fd6015ad46c9b4d807269d330c5", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "62dd7d3f9a08d6095ea1c7e28ee26ca16d3d03a5fd221863babb37acd6246d53", + "oprf_seed": "820a6edcd73dc6f89b7b408acc253f2efa1c11b52fdd91faf8712f4f427bc7e0", + "dummy_masking_key": "e588c5f0bb3969b36d5389c1e194b51a5c5111ffe28c3887ff467b4b04020fc6", + "masking_nonce": "be5450430177235d2510cc948503da49bfe97f4d880ec0a9d51c8b7670596d2b7a4d87d46d9e3a534912e58c9cd94f0e9766eecd57cdd9aef08f282f165b2704", + "envelope_nonce": "56c801e8f0a3cbba53a5ec593875aff7420d6aca20c87dac22b70b25eed39297", + "client_nonce": "ebc037c9adc3dfcf1d2842efa4d1ef5bf314221862d1df3e577566b553b7791d", + "server_nonce": "ee66f21ba1c6d287a2bc693a0f34b3f1313b19e80b767ae4c11edea8351270c1", + "server_sig_rng": "91e77f441cb983ec3e4a6f0d4ecfab62015dc7efa84396620681fc72e69dbf0108f22c45405cfbb3cb4640077a56a9963eda0e7e85538075a2e30e205722f0cc079e", + "client_sig_rng": "27630ee072f26d59a497f236cd876d4ed1113e14c6171a77937114d40ceb08e6ec5f7c5bdf1a8d0820b57b0a90b5f36f6447c1a4f08b3d5bcee0a70092338494cca3", + "context": "636f6e74657874", + "registration_request": "02df866d0e96989b879a50576050fa279fbd7173f8d4d526cd0295a826c7adaee2", + "registration_response": "0258ffa146c23d8a6119fbe500d3b291cb35e58a6898bdcdc685f3f12dc456d27a0200e6c75dc98507786077bf88479b4d95c5034218ae74b4a989ac26f91439d3e808adcbe1051c4f0aed62f181f43600083f794798eb7820879b411b0c5f46adb32b3e", + "registration_upload": "02019c274ee4af33118a924adf7086b709b8da8ba2acf3bfedf5f3f391936269965e02df4c4f4e216ade03ead891abc3f1c886333322e69f9eb1b727e0d3aa9e928b95a7bb3a486e86b1f728f8e4f361ab053b927066463f544cb914ae22c314d02f2c01deea9aba817c02826c011f57a122a73c914d9c91c39d3e15e6ab5ffb22b6fbbd7d57c669232f6a6635f82823e5137b10f5d63013c2a74e3ae9e6908685042b", + "credential_request": "02df866d0e96989b879a50576050fa279fbd7173f8d4d526cd0295a826c7adaee2ebc037c9adc3dfcf1d2842efa4d1ef5bf314221862d1df3e577566b553b7791d0201e749b26879580cb7db9290d428d5f87908d65b36c4dafb9c7a15ef6c0624e8dda49d9d473e846ecd674f1971e7ceb1f8578c7607618f7eca1d2f8e71cd13ee2168", + "credential_response": "0258ffa146c23d8a6119fbe500d3b291cb35e58a6898bdcdc685f3f12dc456d27abe5450430177235d2510cc948503da49bfe97f4d880ec0a9d51c8b7670596d2bdb4a836b6aed9b1d186be50f98f683713c64fc1febc4a06ac7e8091511b1b94d9532f52b9f550eb67ae42e25098946455a38da844faa0ed74f3edd38ab56695cb224426c32099366bb52532fa86dd99e6cc7aaa57c1ea52a23420774bee91d48361393970832a384bec89707850aef191d97aa801d4687920ed8194a18f4cb3402dbadf1bde48b83d562139d35e07d4bcadb62bc2ff3db58223ab26be388a8fef15a71020077d91623982ff4984f231f9d7feaa812b971e519268517c52ec673ba73f365adf3ca80deb4309f79779e813cb8ec0a72257997d7b57dda976dd7e221a07b58855787c784d4234f74d6cc9338b5b372408c0c54d2618b61a467947be673d76fac8c3ef835b81eb1884cd53749f7963adcd41ef059d012f5c9bc01ac92e23ee96eec", + "credential_finalization": "75dfc38e1b410f122f374e7ad4b85b3b8f8365d315a9f7a0c59ab9a37c66ed2684b9f9920e777de332167a02aee5567c53f4e13f8a601b0e556e3c9799d4c6c3", + "client_registration_state": "62dd7d3f9a08d6095ea1c7e28ee26ca16d3d03a5fd221863babb37acd6246d5302df866d0e96989b879a50576050fa279fbd7173f8d4d526cd0295a826c7adaee2", + "client_login_state": "62dd7d3f9a08d6095ea1c7e28ee26ca16d3d03a5fd221863babb37acd6246d5302df866d0e96989b879a50576050fa279fbd7173f8d4d526cd0295a826c7adaee2ebc037c9adc3dfcf1d2842efa4d1ef5bf314221862d1df3e577566b553b7791d0201e749b26879580cb7db9290d428d5f87908d65b36c4dafb9c7a15ef6c0624e8dda49d9d473e846ecd674f1971e7ceb1f8578c7607618f7eca1d2f8e71cd13ee216801554ece72181381ce896ce999bd76ece449dae1cf985e64917649530af98284d87bb23d34db80ba69a02c83671165926051c0c1bd766d1203440618da7e5adddf2eebc037c9adc3dfcf1d2842efa4d1ef5bf314221862d1df3e577566b553b7791d", + "server_login_state": "04d85410e31093ba5bbb36aebf8444dee27d573a28a6d7a20f62ecdc18db8e56c974c4b7fc929345a87ad4c8633847b6418bdb6f77399ef86e8b405817224e1f75dfc38e1b410f122f374e7ad4b85b3b8f8365d315a9f7a0c59ab9a37c66ed2684b9f9920e777de332167a02aee5567c53f4e13f8a601b0e556e3c9799d4c6c3", + "password_file": "02019c274ee4af33118a924adf7086b709b8da8ba2acf3bfedf5f3f391936269965e02df4c4f4e216ade03ead891abc3f1c886333322e69f9eb1b727e0d3aa9e928b95a7bb3a486e86b1f728f8e4f361ab053b927066463f544cb914ae22c314d02f2c01deea9aba817c02826c011f57a122a73c914d9c91c39d3e15e6ab5ffb22b6fbbd7d57c669232f6a6635f82823e5137b10f5d63013c2a74e3ae9e6908685042b", + "export_key": "bef5c446e48e5b82d5a31a36343d2df2ff7f9e61215c6775993b951b90b9e615", + "session_key": "04d85410e31093ba5bbb36aebf8444dee27d573a28a6d7a20f62ecdc18db8e56c974c4b7fc929345a87ad4c8633847b6418bdb6f77399ef86e8b405817224e1f" +} +"#; +pub static TEST_VECTOR_P384_TRIPLE_DH_P521: &str = r#" +{ + "client_s_pk": "02002a081452cf35b20a20910b2ddbdb06b3937040ef58ed9d0580ba3dd75427c61d1fc1ce020b6eee26f6b3253f56d2ed099b7af17c95b7a8492c2c94659169ca3169", + "client_s_sk": "01d7ba4f06e7acae6d66da05168703a6d51e80cc9b5f328047d81a26009653cb2e220bb4b0ec27e1f10ed38505e857629ded2e04d1b12b368e063847d23e04f21ead", + "client_e_pk": "030134c20ac371559d2377577fa657f5bec91c47e9618a0a278d04d20d339e34ea42ff76346bca735faa5b449bde23b3155a81d1dddfef51d3a8f83e67e6f9c52ac33e", + "client_e_sk": "00959e015b4934a2f01e2253967aba5e096813f5e1038f7d33e8562ec076759f1f3fcd031e9372047d8d9d7e780d9be445df140ca895a807253d5f79a882cc277f7c", + "server_s_pk": "0301d572072e32aaef08c8e27feb49c452a76a509aaa06b9da0761ddac1d668b8412b32c6af30e72b498633299e42c22cdb54384b051e7954ec26fb0dda756e9e07d86", + "server_s_sk": "0169aa3df594a7fbdb7a43f2e26e71e85aa5d4ef70d3784e3e2447348ac9ed317a06cd592fdebe29c4c472e1c73e71b0f04a52104113509513a851fa62edb598b04b", + "server_e_pk": "0300a56fa42d14f8142c8349fa85ed0e3d2c18b2d38880ebae96e863ab04d372e75d65676e226fd50983685e4a58b5b5386b253eb1ed942775f2138a7c777e800c6660", + "server_e_sk": "01778d96797239b794f942c843d7533e93a1cc7930a056f9d617fb3ae5606802a3ca0dcd04f78d036b37ad1364dc0d69fad02b83849b238cdc863399192e84f8c302", + "fake_sk": "01bfd75ce097493e721018d9e3ea7483aea9e56ca434371b1318118ed90f89e1e000df4b58fdaa9ff4cb89815d871f22be291a40ae87e91ef279aa8c6e34c180d1c1", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "7f631a2c223bd1d36eab1aa2e92371c697b788113ad92d5558bfddee825370a40eee8e47bd7c1f1060de667fa241a0d0", + "oprf_seed": "4b474f5510c9d574e6aa9f60d3b0edb6d8403916766a26050dd8cb9b1456ed8c1054e5fa336e15bed4f0c2a6f5d094ff", + "dummy_masking_key": "ec45e79c2167dc63fced927653dddde6939784405b14542b1cc048fd4cb1c73aa4964222f6aad626b91be051d096fc59", + "masking_nonce": "5dde45cf3aac04a99ea4ad9007774dbf71041987d7f4c296fcacd5ae370cdac238177171b7bdb72d5e1a5e2c720c7d096ebfcf5d0424783402432f8a8be160fb", + "envelope_nonce": "9a60f231549b183299a604be39be2226332522ba86e77d7bd999c318e27d9a57", + "client_nonce": "8786d9f197332e318a158797d53ee71f7cedfce3716edd0cbc1318c397f5a78b", + "server_nonce": "35a593c13e9af6fd0bf94734621c41eb6e799cd7337ea002be06404878c92b8e", + "server_sig_rng": "3b9d8e2de7eb278a1a14ecbcdfba56a68f08dc5a318dbd299d625f2a11b727b362423ec68bc131eb1e984367d772d6faea6c0a6ce054da63e3b9d6d12088147e4f25", + "client_sig_rng": "0d0174543b7900fb6409b549f3f4480e75a0c43efe0c18c7e255a01016686252d389899518e388dd22ab752d6dd47b0c582991a2079f1508e90f5e2254bedebe165f", + "context": "636f6e74657874", + "registration_request": "0382ccd7225b29432262fc92524af0d6d1c5ef55e1248e623f3199d36f8732abd7013dd400f026790abb2a15550b166b6f", + "registration_response": "03db80f8647fe84c4ce984d323c584f28298229dd8830c31cf870d64e2cc26188024029fc5a0bd6531054fb605c0da30b60301d572072e32aaef08c8e27feb49c452a76a509aaa06b9da0761ddac1d668b8412b32c6af30e72b498633299e42c22cdb54384b051e7954ec26fb0dda756e9e07d86", + "registration_upload": "0300ccecdb3dada43fc1984e9812b552f165a0d1686f10662524efceb93c172a50badb709d5c7875103544e60e35518d46c683d77d86f9bf7b165c596279246f836a90a704f9234fba5b83d1437fc2ef0551832dc04bda0b67d4a7385e00345bd2fe5690d57177d875a7ce91dd6e827c844d1601d7ba4f06e7acae6d66da05168703a6d51e80cc9b5f328047d81a26009653cb546d0cc3bb4e3eb3b5bc334d792149eddf231cc51f2d399f3b63f23bbb8d4d7558291f5341e61f1614c11b34dc6df89a", + "credential_request": "0382ccd7225b29432262fc92524af0d6d1c5ef55e1248e623f3199d36f8732abd7013dd400f026790abb2a15550b166b6f8786d9f197332e318a158797d53ee71f7cedfce3716edd0cbc1318c397f5a78b0301671efdfd813fe4a25988bad9ddfa240fbae861a5a46904db4c28d621d42425d29dcb641802853f8d9b59e2123a604ae0d3ae59c6a6ced4fd19943297a1ea300b1c", + "credential_response": "03db80f8647fe84c4ce984d323c584f28298229dd8830c31cf870d64e2cc26188024029fc5a0bd6531054fb605c0da30b65dde45cf3aac04a99ea4ad9007774dbf71041987d7f4c296fcacd5ae370cdac2c4265736ed8fe70fe392bc2e0eb0c262575f8fb4156a108b52293a3abeb0b3fd2070ae37c8fd649329060f7dfaade6bfbf81a71a2689e987020ab7bac5053bc412aa2b05fb837875913e1502ccc4f9213ae05a602d6df38d801fc12011d2bff15959e7601aa03298b2c6cf4d1a73e1816f46be24f2e4d240b284f34cafcef9d7e16056af1e4654e416c4d384c179caf490ef1b0dcd04f78d036b37ad1364dc0d69fad02b83849b238cdc863399192e84f8c30202007cac08e850bebb3366d2c3b10624d5437bb500e54749c86e5338d7db5c766d166fa7ad92f7b28f5183f369f7712528452da87804b598280fcb4769e9dcecc271330754511ecba5d31d287f6cd83f9553b619938b7b16e8ce452889c82c79f214e1e9a95375cb1aeefbd4c7d102a2a8438bbde7c492a90f03781d77443d588f12aa", + "credential_finalization": "c84905ed2bf6d0112262cfd5c6d6422d960f979d02f76697226dd4789fb72e7c816fafa8198e201eaaea5af19a5d15537184a48d66b87d4e46c67184c0d72f4b", + "client_registration_state": "7f631a2c223bd1d36eab1aa2e92371c697b788113ad92d5558bfddee825370a40eee8e47bd7c1f1060de667fa241a0d00382ccd7225b29432262fc92524af0d6d1c5ef55e1248e623f3199d36f8732abd7013dd400f026790abb2a15550b166b6f", + "client_login_state": "7f631a2c223bd1d36eab1aa2e92371c697b788113ad92d5558bfddee825370a40eee8e47bd7c1f1060de667fa241a0d00382ccd7225b29432262fc92524af0d6d1c5ef55e1248e623f3199d36f8732abd7013dd400f026790abb2a15550b166b6f8786d9f197332e318a158797d53ee71f7cedfce3716edd0cbc1318c397f5a78b0301671efdfd813fe4a25988bad9ddfa240fbae861a5a46904db4c28d621d42425d29dcb641802853f8d9b59e2123a604ae0d3ae59c6a6ced4fd19943297a1ea300b1c010e0461416c7577f309fb3e7d603a6993f5343490b3814ff6f96157155e59d5b7ae43f9ab6d33029f8d63cc3db13fa5fdf9cc6a77cd1472319ae7d752662f05c2218786d9f197332e318a158797d53ee71f7cedfce3716edd0cbc1318c397f5a78b", + "server_login_state": "955f471a44bcdfcfc747f229d8ad84e0e8e6721357adcf7133b09aaaf0b4cd2ad84d96fb6377e58becd8c16318f281fa2b39f4d28600a6c0d15a2fdf08221974c84905ed2bf6d0112262cfd5c6d6422d960f979d02f76697226dd4789fb72e7c816fafa8198e201eaaea5af19a5d15537184a48d66b87d4e46c67184c0d72f4b", + "password_file": "0300ccecdb3dada43fc1984e9812b552f165a0d1686f10662524efceb93c172a50badb709d5c7875103544e60e35518d46c683d77d86f9bf7b165c596279246f836a90a704f9234fba5b83d1437fc2ef0551832dc04bda0b67d4a7385e00345bd2fe5690d57177d875a7ce91dd6e827c844d1601d7ba4f06e7acae6d66da05168703a6d51e80cc9b5f328047d81a26009653cb546d0cc3bb4e3eb3b5bc334d792149eddf231cc51f2d399f3b63f23bbb8d4d7558291f5341e61f1614c11b34dc6df89a", + "export_key": "3745940f27b17c4bf2dd18734e7a1db8a0312d760b216b02406f66dd252500f0be03737e82902c11a597e7a7df04cbc0", + "session_key": "955f471a44bcdfcfc747f229d8ad84e0e8e6721357adcf7133b09aaaf0b4cd2ad84d96fb6377e58becd8c16318f281fa2b39f4d28600a6c0d15a2fdf08221974" +} +"#; +pub static TEST_VECTOR_P521_TRIPLE_DH_P521: &str = r#" +{ + "client_s_pk": "0300a4e1dc08e441a9c0622a191f9dbed562f2d4fb071f1a818cac4f2a1e8cdb999b2b64791a0aea0332c7d5f7f31bb0c8a08e958aae610721144147c42dc693eeaa58", + "client_s_sk": "00bda313491184969ab11dd7ddc6db9a30152579b41721f8e561a5eb877ccd4b15b336f43e8c5fdf010b312f6a82a163a4896575a87016b8d980ce2b767bfb3398ff", + "client_e_pk": "030105dbbbb938c1e5be0ee13a4abc6d33613121cc316e9c397a8e344980f7e559e41f7a0fc02d8be143c317a22dc8e44a7c0b020663bf6bfa80ab46667536ac94fc0b", + "client_e_sk": "003fb8d3a1030533c644121ff1756891ef292b3184f61818a97c9bf79b682e74df3efeeead52b8c097214d5f4b4141e7afe1ee861a6379a57762a94be4e56f8ee98f", + "server_s_pk": "02002bca741ca8e4f6e7976a7b3192513bdfa12b11dcc9ef8dfdf9dd35902fa64b579356a003cb8a61da2061c69c62823fa0e1dd3b006f11f1e15f9de31eef6f8fa50a", + "server_s_sk": "0178eacf6516e1ea0ab4f63e22d5135bde9acf1dc9de743c036f815ee68bfcf45b3010e7535c23b9e1f4ed1ddf8d332bf7a4eb68525521e519f0e188b26a6a2e70cd", + "server_e_pk": "0200a4c52e0558740139b2700e781e095cd07c16f61ce1b8a8e43bef856bf0237e06a92d5e6e9a7653a43d7fd8c25ce6457d590daa0349e3131ab5bdbde1bfd8e93739", + "server_e_sk": "0134ef34c788c8ac56cb4aa439bcef97f3a44b02aed76376dbd8a4a4dbcf14ab9d7385251fdd17c1800b2f3a127912a76509ebcafde01797e73392afcde5bc61befe", + "fake_sk": "00ddc7999a757a5f5b47de1867d855dd9f4673cbfe683dcc6f5961a0f4963cd3d18407a1c3ef84a51bc089b71b4f339e21b70fc4941864c30d1e1a46f724db3152fb", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00bd03da8a21d2273689abdc24c11c1d2120544c3597cf1f7d89db90a89bed98bf5704e667066a0cf338028aace8ae1de8cf48b7825fde02820781bcc6556084fd05", + "oprf_seed": "bd224abf27b41eaf33f4e52cb212d8a9517f67b200883ade60ee65d1f41f0a35d7813fc1ad3f59c5100460a6eb4814038525a44e9ebe325bce8dcf88adfeb9d0", + "dummy_masking_key": "c7ee69641d749ab949196baf908cf537fdd63bbd9f4baf0542b3463beffa534fa52b08ff2b7e49b0a4ced5087e6a2eeb5dd8550e70287eaf127f387e76fdcf2d", + "masking_nonce": "d0f125ae5197de33ccd2e1889a113e39b82b8202068bdcc98abf9a6c32fb251fbb442187fa6b3613d1e27275d8a6de847c498adb31e5cf0f2bd6e4b55a28b0d7", + "envelope_nonce": "a4bb1729c4d8357e51e7bfda1c8c1fa0e9a0768bac98b758cf74e00163715871", + "client_nonce": "47d93dc1f3e859c93b3e692705cd4aafa53fe67ffde03d949966c7fe92b05632", + "server_nonce": "838702bfee589843d4168be92e50b70610adc096b9f5e295e61ea80b5583c630", + "server_sig_rng": "3e1c11cd31bd07ac5bb84e4fb475242706178dc9a8faf45e1144759ac9b385463489649460b6e8e38c04583634b9fd724bf08ceff19f7f4cd97380b75017feb57efb", + "client_sig_rng": "c924e4dc22d1cdf3738121dc37e294b2755c229b333a34764bf9a632e40e06a5d333336d8cb3689050ef33c190cd96d9e872a7f4496569f5c37c3df396012f8ad172", + "context": "636f6e74657874", + "registration_request": "0200ad2a28e4e723d1cafb146079170e3558bf3ebd9c13b51785279840b3fe844663ccfa5399099f71af6ff3bc6fa949d5c239febb862a694babdc7795ce358db1d655", + "registration_response": "0301d77a7f794df1df8eb66e13d9ecf6215e5ae32cbc99834c5d0736d452cdf2edc80be086327adf7c7173738200c96971fe554a42a3ac1a0b938572b03b396677be8f02002bca741ca8e4f6e7976a7b3192513bdfa12b11dcc9ef8dfdf9dd35902fa64b579356a003cb8a61da2061c69c62823fa0e1dd3b006f11f1e15f9de31eef6f8fa50a", + "registration_upload": "03010d2ab75e78c59384b6fac3df0a754991d6c2138c448e5ff538afc5aea7a190f2d77be6338b58d065c5777f6099fc65a5610de527e49b509bb1775b4c3616457205c5f5411bbe9b1ec54eae13cf99b6d3d8eaf274e801c269532c86ba1f7394bdc409f481ef5bc690bb282ec9a57e951fce8622fde11bf3d8314af97eee232d487700bda313491184969ab11dd7ddc6db9a30152579b41721f8e561a5eb877ccd4b850d0f5530add20d4f1cc8d6006dc72fb0701f32b61a89751bcee828b9d3534905fa26b80b2e0939184ee9c5124af6497d38c80c0d390b6e09e914dbece4b10b", + "credential_request": "0200ad2a28e4e723d1cafb146079170e3558bf3ebd9c13b51785279840b3fe844663ccfa5399099f71af6ff3bc6fa949d5c239febb862a694babdc7795ce358db1d65547d93dc1f3e859c93b3e692705cd4aafa53fe67ffde03d949966c7fe92b056320201ef1572e485fb05906402c16e131d4ae36f2ca8a78ad63ee5b707fca934207f55c46d93b3de8ff902f030618521ed04b420872eb4fd51caf6e13935e9c9afd5066d", + "credential_response": "0301d77a7f794df1df8eb66e13d9ecf6215e5ae32cbc99834c5d0736d452cdf2edc80be086327adf7c7173738200c96971fe554a42a3ac1a0b938572b03b396677be8fd0f125ae5197de33ccd2e1889a113e39b82b8202068bdcc98abf9a6c32fb251fd8559b3bc9c797a27dccdbf0823560940a59eb6a04c1b0f5fe067ca99925e06f2733a1ad410e13c5418937420278d6124aac265b9ec8130cdaf93dc3b72a25988ef70e6bb182a2698759e37313924c1b3656f17d96d6aa06b0906ef2b2ed22ade5280bcbf4bee0ad0c3b8fd1713faa30d37d011cca07f1a75b58e865b17423e43679ec77f02edae7e803d1fb4b39414d4224f2d19540d61c04611732a89976bd3f343385251fdd17c1800b2f3a127912a76509ebcafde01797e73392afcde5bc61befe0301f0fbc1420fd359f132357b587b78d4f79937b6d16293289158823bdebfa0bad5363b1abf8f00a24f5e94e830c7d1af7f6010c27e54dba75ee5585060df874ecd73dc919141eb98591e49ce54da99182584d3ee5a1b3fec7934408d2d8737901a34e9e868928266d66b1033bdecbf3c40b0b21a7909d07df39d915659452e924760", + "credential_finalization": "ea83cf1b2f34d379964dd6f6a1ac5a24a08d76f969a0676f7baaa034d80f7c0751176d784f013b15c6d62fbc186eb355ac250ae9e07fc31e8b729554f852e7af", + "client_registration_state": "00bd03da8a21d2273689abdc24c11c1d2120544c3597cf1f7d89db90a89bed98bf5704e667066a0cf338028aace8ae1de8cf48b7825fde02820781bcc6556084fd050200ad2a28e4e723d1cafb146079170e3558bf3ebd9c13b51785279840b3fe844663ccfa5399099f71af6ff3bc6fa949d5c239febb862a694babdc7795ce358db1d655", + "client_login_state": "00bd03da8a21d2273689abdc24c11c1d2120544c3597cf1f7d89db90a89bed98bf5704e667066a0cf338028aace8ae1de8cf48b7825fde02820781bcc6556084fd050200ad2a28e4e723d1cafb146079170e3558bf3ebd9c13b51785279840b3fe844663ccfa5399099f71af6ff3bc6fa949d5c239febb862a694babdc7795ce358db1d65547d93dc1f3e859c93b3e692705cd4aafa53fe67ffde03d949966c7fe92b056320201ef1572e485fb05906402c16e131d4ae36f2ca8a78ad63ee5b707fca934207f55c46d93b3de8ff902f030618521ed04b420872eb4fd51caf6e13935e9c9afd5066d016aab988c22e284a78c435f05dc4d44ec798b79086fbf126000b3f94090fc64c01c1c05a2826714cc889d2b470b185a9b00dbeb4f4df916fcc8697937c1fa0f94e547d93dc1f3e859c93b3e692705cd4aafa53fe67ffde03d949966c7fe92b05632", + "server_login_state": "ee27cd3d3682171f80ad3cb3e35d3a52a2d2e2fdd9e58d54116ee11c9e3ad3c9b467cca988db716d4fde30214e734b10b06882d745625fd4bac519f4d1ffc624ea83cf1b2f34d379964dd6f6a1ac5a24a08d76f969a0676f7baaa034d80f7c0751176d784f013b15c6d62fbc186eb355ac250ae9e07fc31e8b729554f852e7af", + "password_file": "03010d2ab75e78c59384b6fac3df0a754991d6c2138c448e5ff538afc5aea7a190f2d77be6338b58d065c5777f6099fc65a5610de527e49b509bb1775b4c3616457205c5f5411bbe9b1ec54eae13cf99b6d3d8eaf274e801c269532c86ba1f7394bdc409f481ef5bc690bb282ec9a57e951fce8622fde11bf3d8314af97eee232d487700bda313491184969ab11dd7ddc6db9a30152579b41721f8e561a5eb877ccd4b850d0f5530add20d4f1cc8d6006dc72fb0701f32b61a89751bcee828b9d3534905fa26b80b2e0939184ee9c5124af6497d38c80c0d390b6e09e914dbece4b10b", + "export_key": "ae2f6012ed53b165b809cfd39b060c998633d41ca9119075ecb834cd95204fce1ef9e1371c276f8519fed6ce837cd8734c573021252eb2772311412135689e48", + "session_key": "ee27cd3d3682171f80ad3cb3e35d3a52a2d2e2fdd9e58d54116ee11c9e3ad3c9b467cca988db716d4fde30214e734b10b06882d745625fd4bac519f4d1ffc624" } "#; #[cfg(feature = "curve25519")] -pub static TEST_VECTOR_CURVE25519_P256: &str = r#" +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_TRIPLE_DH_CURVE25519: &str = r#" { - "client_s_pk": "52ad7eb691c57353507b37ec5d61dad8f53805f782a13eaf27e347b89cbbb563", - "client_s_sk": "70efdc3d29142db15f1b6ed251aa69dd7d9240ee79a3dcc82dc6ad0c79c06e79", - "client_e_pk": "39865af8adc47edc6dcf23f09ae4f6c1e3e8dee6bf7fe2a3fd7349a308a1b975", - "client_e_sk": "00ca60f27ba93fbbed67bbd58075c86259fb7de219db20af595458ef974a8c4a", - "server_s_pk": "e125cc979ccb363a5939efb29d915ee8eff861fa6b4e34efce82f8d904aa111f", - "server_s_sk": "e085953892ad1777b13902e58f8d4b0319549fe4ed92858bc29bccd7c68e9f64", - "server_e_pk": "bc9420f1a8dc312337a1adf91065cd14a050f674dba208efa8dc4edc7f03bb43", - "server_e_sk": "70d69619e3b4746545a6e5301bc693caf74ed4258c11485268208969c2c3a370", - "fake_sk": "507e552b622c6bce2371997efcf0fd0d3e57163f04bbf3366b5209471f11c77a", + "client_s_pk": "55ec4463a493b349d65ee754aff59e89d0705a2b2351f60e5d229950e81ff630", + "client_s_sk": "801d49bb641b1f78163f96d0e9a1001aa52dcfb3bf4552786d8a30ebc9155b5a", + "client_e_pk": "fafff7cb42915b24ef35e42a76dd52d66dec04e9fde2e723882a3f73ab688545", + "client_e_sk": "70e3ffc05b3418c6179820f3fd5c22fa0ada76b502e7ed5683dcdbe7aa8fac61", + "server_s_pk": "34e1894054b5c856a79c20beb89b84bb14c687145f25e40727f8862b218c7259", + "server_s_sk": "f86eee4e4e0898f993158c49ff9117cf1e993b4465b138e43f05c384518e8567", + "server_e_pk": "4759f0f439f84bd1024470228b70a9f144683311a777113aa8f26c38e73a476f", + "server_e_sk": "e0f6a2cc1c1b3ecf03e602e2b4f5896ce19da2d2d3290595cad14bd8ac72e27f", + "fake_sk": "505e9669244529668219fba75c569aa345de5b2ed5944d141b8d498414860c4e", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "4fc2094f060c9f57751b2b15d192bb3c4236ecb77c6c1e559c4a1aecf3565e6e", - "oprf_seed": "75cefdc542e6ed95a03ae01718174d8cf11fae13c05140401decce3b1da4c1cf", - "dummy_masking_key": "ec1563a38a1395a2409f7a87285a71587e440b1ada72a4f5518eb20e0a910a71", - "masking_nonce": "9a03232f3b0dedab6b68cd25b218c46dc889b66b32440d62bdc7be2557ffbc08132ed3071a892ef0a4706c6c6702ff6299da9313aa1c5f46ac85a081712eefcb", - "envelope_nonce": "129b73181b1ec1702d6c836ebe694ac59089e828cdbfcad7597bf9f162efca06", - "client_nonce": "c4734b4e73c0c5c3e25394f05c6df17e8fea29a2bec0282d845b0a248ee505c1", - "server_nonce": "70fdefcd627d587bcc35bc77b5fd7784a15c7754327f9dc3e2b0e45dd715faf1", + "blinding_factor": "79e778d2e1d11ff6addd82009075bb19bd012b85cb9ca038729410b87da39309", + "oprf_seed": "2c88660acf0f167510737c601f0e90c3cb22d5a4df784ec0556324ece5111938b371bd85982db3900e2ca243ad51f9ab00d6c89dac9555b260d1fd87dcedc72a", + "dummy_masking_key": "bd67ac3dbc33de642e8dbfd1a2bce1c0f3b47b17bd5e460f7820f7dd1523ac33bccecf9b1c0713b338772affab75d270ec7d26fa4d60dab7b8cafc80890ce906", + "masking_nonce": "b4da03c8bdba087438869faeabce1200d25a63afbe425010df6a3242367117a4429c3e5e681b2b50fac2225a8de5bdf8de225e9fc1bd50dc358ebdb95fd4b31e", + "envelope_nonce": "dcbf783cb18fc9f4698b0bda07f0abf1624f04a9398f3b5141d40673a7d0a096", + "client_nonce": "0c73ef606d5b0f552b28232ac315c7f4c4e1b46c2de9a2fc951bf2c40cfac391", + "server_nonce": "067636dd6fba1fd87e7fa7f2b6565636314d6aaf67a42d08d358d88f2048523e", + "server_sig_rng": "28e78db22e3d525394ef139d37e88acbe6bc165ab5d6b36bfe8f2e6007ce6b55", + "client_sig_rng": "49e4b016808f03b574764d84c6728851d0e5be9d76680729fa0d44a6b30b6577", "context": "636f6e74657874", - "registration_request": "02027fc431d219bd95a64eaba73a66eab3e0b3931a36370c287c87bebcfaca7e3e", - "registration_response": "033ac461fa2cf8f60e9e36f032801a8bfda58fb2d2374e90a90359d39452603651e125cc979ccb363a5939efb29d915ee8eff861fa6b4e34efce82f8d904aa111f", - "registration_upload": "40fa5fa15f29dd9560135499a7755b98414bab516d1e112a16a34fd62f464a2d08d27fc750e9bf63ffa9d3e8fc261f86eb5c073d9369713308aa4fc431c7806f70efdc3d29142db15f1b6ed251aa69dd7d9240ee79a3dcc82dc6ad0c79c06e79caf9d83a5ca7b6628aeea3650f7efcc037f696598c3d7ecbe0abd894efdfed64", - "credential_request": "02027fc431d219bd95a64eaba73a66eab3e0b3931a36370c287c87bebcfaca7e3ec4734b4e73c0c5c3e25394f05c6df17e8fea29a2bec0282d845b0a248ee505c139865af8adc47edc6dcf23f09ae4f6c1e3e8dee6bf7fe2a3fd7349a308a1b975", - "credential_response": "033ac461fa2cf8f60e9e36f032801a8bfda58fb2d2374e90a90359d394526036519a03232f3b0dedab6b68cd25b218c46dc889b66b32440d62bdc7be2557ffbc089b9abcdfeca7afc8e05c18ff8bac4692f21364cb4ba531f473e2183fa0fba7fb05029630591524058473ba269994b462f4fcf586f3560f5d187ed2f2ad06c9bd522234478500f5421e9a94378c9573efe77facedd2d57e3c5b4023b600a291b670d69619e3b4746545a6e5301bc693caf74ed4258c11485268208969c2c3a370cb0d41fcfd7113a2d21fe24a019f42bffdde422dc4d96473e150d74ceac454387c49712fea57aac634dbb719a31521ba3d6d77226f0be1d301f185fc7add696f", - "credential_finalization": "e7e856b2a92c8cb829817d358bdfa980bb8127ab3b5c3bdf12db9b7e6ba93321", - "client_registration_state": "4fc2094f060c9f57751b2b15d192bb3c4236ecb77c6c1e559c4a1aecf3565e6e02027fc431d219bd95a64eaba73a66eab3e0b3931a36370c287c87bebcfaca7e3e", - "client_login_state": "4fc2094f060c9f57751b2b15d192bb3c4236ecb77c6c1e559c4a1aecf3565e6e02027fc431d219bd95a64eaba73a66eab3e0b3931a36370c287c87bebcfaca7e3ec4734b4e73c0c5c3e25394f05c6df17e8fea29a2bec0282d845b0a248ee505c139865af8adc47edc6dcf23f09ae4f6c1e3e8dee6bf7fe2a3fd7349a308a1b97500ca60f27ba93fbbed67bbd58075c86259fb7de219db20af595458ef974a8c4ac4734b4e73c0c5c3e25394f05c6df17e8fea29a2bec0282d845b0a248ee505c1", - "server_login_state": "727067e23a048ff7672f6ce771eca63a31e5d00fe3aef6fdb6c807823808e65d534c1c65c55eae839b4f981ca43f324fdf19def00b9b3a5de7e5da29516952959ea951ae78a210c2c1042e7b8290d9e77d2e1bc91d3a8a9735a4640b428a2d92", - "password_file": "40fa5fa15f29dd9560135499a7755b98414bab516d1e112a16a34fd62f464a2d08d27fc750e9bf63ffa9d3e8fc261f86eb5c073d9369713308aa4fc431c7806f70efdc3d29142db15f1b6ed251aa69dd7d9240ee79a3dcc82dc6ad0c79c06e79caf9d83a5ca7b6628aeea3650f7efcc037f696598c3d7ecbe0abd894efdfed64", - "export_key": "376060e759e16beddb76a0cfcac27a5549b47e8d93668c5aac8e2792b2fee240", - "session_key": "9ea951ae78a210c2c1042e7b8290d9e77d2e1bc91d3a8a9735a4640b428a2d92" + "registration_request": "26470d3f1e8eb8b277b9320f78d116aec23e87888c8bf66c4384b0a20b5dee49", + "registration_response": "48926f85f41b508ef8b4a8769f0ac1301082daf9886d8d83951c00445e1e416734e1894054b5c856a79c20beb89b84bb14c687145f25e40727f8862b218c7259", + "registration_upload": "e646edc778438a5bd3432b4760f2616291acbe543ecd762b115aa0acecca9d63063c52cee5d5b484c3c64e8a46efc4c7ad0ac7e9f10c94a9f42d5e1e4646f9ed71d3e70aee8a34490c3f2fb4a7c4259c29e0a3c0d29e0217bcabdc3fd4cc1784801d49bb641b1f78163f96d0e9a1001aa52dcfb3bf4552786d8a30ebc9155b5a85f398181c785817fbaed6fe9ce376e32c0c183cc01707e425385b6763016a42fb848529a968457f508c3b4fc3a8557019b46b8be72b01085f5accceea8c9f0a", + "credential_request": "26470d3f1e8eb8b277b9320f78d116aec23e87888c8bf66c4384b0a20b5dee490c73ef606d5b0f552b28232ac315c7f4c4e1b46c2de9a2fc951bf2c40cfac391fafff7cb42915b24ef35e42a76dd52d66dec04e9fde2e723882a3f73ab688545", + "credential_response": "48926f85f41b508ef8b4a8769f0ac1301082daf9886d8d83951c00445e1e4167b4da03c8bdba087438869faeabce1200d25a63afbe425010df6a3242367117a465f5af72b842cb0917622f7272c276770fbe0a366ef9a84d0ff9086755bbabc9c24a6b5c2becbcede9526e1f56a99f03fe42fe048234fbf4bfa7500298371c2b639d7344beddb92fadadab682fc38d26d9a6885d1d89c6d85728a7f6bac93e41b0a900eae218ebbf94a60637c8c31275ad920d85ded2c444852f30a289e49b70e0f6a2cc1c1b3ecf03e602e2b4f5896ce19da2d2d3290595cad14bd8ac72e27f07daba6b19e378e13e187357adfe1f5b3d522417437eb1e04ce5f95a2d75340508096604119431ac0eb1812f4a5aca2609b20c935331d50195f4062c89314f1dbb6a2d12f154f2d4f4bd91d2a120734c248428529692458d5b5409989453ee3a", + "credential_finalization": "19fbecc92732f02691193651fc3c29ccd8db9a5b18b3593fec648d497203cc09983d8ca9568c79be3c5e11e5d799102b5ead86af2f7c8da1e14a60879926bef5", + "client_registration_state": "79e778d2e1d11ff6addd82009075bb19bd012b85cb9ca038729410b87da3930926470d3f1e8eb8b277b9320f78d116aec23e87888c8bf66c4384b0a20b5dee49", + "client_login_state": "79e778d2e1d11ff6addd82009075bb19bd012b85cb9ca038729410b87da3930926470d3f1e8eb8b277b9320f78d116aec23e87888c8bf66c4384b0a20b5dee490c73ef606d5b0f552b28232ac315c7f4c4e1b46c2de9a2fc951bf2c40cfac391fafff7cb42915b24ef35e42a76dd52d66dec04e9fde2e723882a3f73ab68854570e3ffc05b3418c6179820f3fd5c22fa0ada76b502e7ed5683dcdbe7aa8fac610c73ef606d5b0f552b28232ac315c7f4c4e1b46c2de9a2fc951bf2c40cfac391", + "server_login_state": "a053b12e8de3508b16b6348b3b5aee80e32d9fe4d4b04449c9b97961bbdacb35650c4bc18cf8241fa1471b80a9b8da177bf25642fabfa4dd041e3c778505f31519fbecc92732f02691193651fc3c29ccd8db9a5b18b3593fec648d497203cc09983d8ca9568c79be3c5e11e5d799102b5ead86af2f7c8da1e14a60879926bef5", + "password_file": "e646edc778438a5bd3432b4760f2616291acbe543ecd762b115aa0acecca9d63063c52cee5d5b484c3c64e8a46efc4c7ad0ac7e9f10c94a9f42d5e1e4646f9ed71d3e70aee8a34490c3f2fb4a7c4259c29e0a3c0d29e0217bcabdc3fd4cc1784801d49bb641b1f78163f96d0e9a1001aa52dcfb3bf4552786d8a30ebc9155b5a85f398181c785817fbaed6fe9ce376e32c0c183cc01707e425385b6763016a42fb848529a968457f508c3b4fc3a8557019b46b8be72b01085f5accceea8c9f0a", + "export_key": "5ca0215e3c99e912364ca69d7a96a5e585c7aabab44de49296876f8465638f395fe87fba8cf1107273b0fe2e2b7b4756d855b75855ccdc9d57689cae8d136ace", + "session_key": "a053b12e8de3508b16b6348b3b5aee80e32d9fe4d4b04449c9b97961bbdacb35650c4bc18cf8241fa1471b80a9b8da177bf25642fabfa4dd041e3c778505f315" } "#; #[cfg(feature = "curve25519")] -pub static TEST_VECTOR_CURVE25519_P384: &str = r#" +pub static TEST_VECTOR_P256_TRIPLE_DH_CURVE25519: &str = r#" { - "client_s_pk": "99dd997fac84a96f8ee7b12e23892c5fe0f669da85ed653131e80baf25bbe37a", - "client_s_sk": "b0995459b636301e28f9cd58ef30a09adbef50e4ab7a4562335febb7bf506e53", - "client_e_pk": "0802d3e237661af8f8742c57117515bd9b8ec40cb502e5ccc22921b0e9d7764a", - "client_e_sk": "d86df169f4ec3d91bb407f1528ad91f0b91514810218dba76d96c78cc9416d6b", - "server_s_pk": "4522774d69bc3bf300e7fbda9bfdb23ecf588de8a718bdfba6913c99ebac111f", - "server_s_sk": "b83549cb6b313a948144fa0950ac07cf0d1a6ae3b5c0abe18f8cb9e268c1d348", - "server_e_pk": "8cd68a43ad4bc3fc0ab7020fcf26dcc4d87d1e49fc993c61cd70cd04f8918c60", - "server_e_sk": "608adee8afd25a40cba23590e063cad33e180f1829ac6ed069e0e19fa736aa44", - "fake_sk": "e864224434a6192738bc678a34d913e89fef4177ea865f230d0290bab1ea1371", + "client_s_pk": "48a31ff8518a6441284932dbbe76f8f090c69c63aa6d42ccb74ceeb9fea95c69", + "client_s_sk": "50ef13b81036ef808c7270df1f5d184c89b5a9a0f0fd96a2a3af262ad1798260", + "client_e_pk": "31b47d98f40c8f8d3740bde5976aa572f7c296dd846f181939e46ae986640d35", + "client_e_sk": "605366b15279692a5bd592975320999b1d84f7750fbe425cb01d2c885bebe05c", + "server_s_pk": "84f8d1382df385041057e676294629297a5cab358b8d01d2956aae0064482c5d", + "server_s_sk": "c0d90709e14f79e50508a92fde8427deb86bf3a611fd59f9131862c386a35a77", + "server_e_pk": "cc23a895bb9b1552556ed232a62e1984953b4ba3be3718326d294fd742364402", + "server_e_sk": "e075a28dda8628508ab887677922daf0e11355f1ff71b7445565d48049bf087d", + "fake_sk": "189df882849ce0124bfa21e943115b63d35fa4311ff84a6b3c42608a7864ac41", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "883781bc1a2546ceaa064450b6620bcbe2b272c8034b29513562f6c3fa2ec1a15c65708ea4a9e48afd35df085be50126", - "oprf_seed": "faf6cb8a945c1785c86f518ef6ad09c134016f2ed48ea01beaf92e42a55d7e9792fe1586b600633003d06730a907de48", - "dummy_masking_key": "c1d5741b13b65a4461c8dc936a505a32bc5d7a2777be8f0054687e746a02605302cb462d865d91e5a88bed89938cc090", - "masking_nonce": "a5f9546d7e688c2d5b4f6c6033947a52349019655558ab9e2f1f649feeb4504b2bac6c62c9a24860bf0db0907dfccd5b4725e96aa5221c4e13d4897f1c8cca3a", - "envelope_nonce": "67df69a5e42142c385e5a5330de9411b38e1f82592aaf7bc3ab5fcd4447ecaaa", - "client_nonce": "a0d061c3e0c1cff928c85cb60abc357c9be0d5a8048f4993aa1a282ad43316f7", - "server_nonce": "a3870e1fb94a9930fef014a741de871531c999e18244c2beb809375dda45c256", + "blinding_factor": "9c9276359d11b121131b7fc2f14f28933f7d17a3ae1f30b0db12e1003a21c15d", + "oprf_seed": "0d882fff5f14555aabad9b86a15ad04218906e70e75eb6b3fd02c27edaaf6bde", + "dummy_masking_key": "8d694f42f687ddabb0fe32ba817a3c5c2e6994c94a467f7fab98562e0a0bbe90", + "masking_nonce": "db6c3b2709b6beee4d7dc8174b3348d149767149522d373e7ccd38eac1611f7acbcd0d9e434c368668ac26946f88fcba31e5a7d3b2dc7e0ccf3c05a2eb7f34d4", + "envelope_nonce": "9c63a0c72b54fc4a57bdb174841f6866faef695d9a7b390dcb2f5ad3ddbaff11", + "client_nonce": "a1b49393dafea0bbff72ca6a5bac23686e9defc709665c3f66616e9f53890654", + "server_nonce": "48f5c9942085d24e7d5b86b4218a6f32dd31a4c23c79459a54ccdb8f34bd52a0", + "server_sig_rng": "65a24194816f65e91a3b97db6927e606f173a7c920ac10b83d17b9c37abec006", + "client_sig_rng": "c73252ab228295e0079f0188d5589317c3ba661437f474470e093b0d4e428191", "context": "636f6e74657874", - "registration_request": "03fb6f904c5e92d298eec16fdae6a612bb39ae0d7c69f63edd8436f93193af66ab4fe5e816866c05f3d0548b7fc133b7a4", - "registration_response": "03491278e4ea5fbc87781c50979ee90700941455c74c718cee30a6c25c23f843130c34c4a928fdd4c2185e7a6ab0a5b0b74522774d69bc3bf300e7fbda9bfdb23ecf588de8a718bdfba6913c99ebac111f", - "registration_upload": "8416207327df962c4ff53c5c4edb5b710c0b04e1527b5a651e78ebf5656f680bdd1172a568d59511cbb10e38213accb6f4e515dd169c6c4751c6016150d675df8a1b381d22cc6952ccd0a043b1bd451bb0995459b636301e28f9cd58ef30a09adbef50e4ab7a4562335febb7bf506e53db4053baf546c8c58d34d9d18463d305366a1db21f57c5647dfb6f1f3c726cdb90b85728cabce1bab9917a6ea7b04443", - "credential_request": "03fb6f904c5e92d298eec16fdae6a612bb39ae0d7c69f63edd8436f93193af66ab4fe5e816866c05f3d0548b7fc133b7a4a0d061c3e0c1cff928c85cb60abc357c9be0d5a8048f4993aa1a282ad43316f70802d3e237661af8f8742c57117515bd9b8ec40cb502e5ccc22921b0e9d7764a", - "credential_response": "03491278e4ea5fbc87781c50979ee90700941455c74c718cee30a6c25c23f843130c34c4a928fdd4c2185e7a6ab0a5b0b7a5f9546d7e688c2d5b4f6c6033947a52349019655558ab9e2f1f649feeb4504be4a8d7ee009b1ac5888f207533fb78a4bab1d1a3bccbec9885da47fca25ed4acbe10f99d723a47a84a2ea8c497aea46c0c69f8290acebf78974af130227bb2bfe3f9b45916650306dd1aaaad18b9e052c2d7daf7a6e089ac518d7511899197f04c2e6ea485c9d9012b0a2c760bf2483c608adee8afd25a40cba23590e063cad33e180f1829ac6ed069e0e19fa736aa442616324d11101bf0cb4ccc7e09b120d20806344d1e7541d4a42146e7d6fd0906dd40e3e7d761da5f85581678b67f839371c569d2053ab4dc6abc8b059d65d26bafa25cbd5d4c9c4306622f7d6c8fb632", - "credential_finalization": "28241f636fd8a80cdb4e20fbe819517e27f19e21115e93e6c70e5963b00bed581a32d8bfe8c4750565d742a2b45639d2", - "client_registration_state": "883781bc1a2546ceaa064450b6620bcbe2b272c8034b29513562f6c3fa2ec1a15c65708ea4a9e48afd35df085be5012603fb6f904c5e92d298eec16fdae6a612bb39ae0d7c69f63edd8436f93193af66ab4fe5e816866c05f3d0548b7fc133b7a4", - "client_login_state": "883781bc1a2546ceaa064450b6620bcbe2b272c8034b29513562f6c3fa2ec1a15c65708ea4a9e48afd35df085be5012603fb6f904c5e92d298eec16fdae6a612bb39ae0d7c69f63edd8436f93193af66ab4fe5e816866c05f3d0548b7fc133b7a4a0d061c3e0c1cff928c85cb60abc357c9be0d5a8048f4993aa1a282ad43316f70802d3e237661af8f8742c57117515bd9b8ec40cb502e5ccc22921b0e9d7764ad86df169f4ec3d91bb407f1528ad91f0b91514810218dba76d96c78cc9416d6ba0d061c3e0c1cff928c85cb60abc357c9be0d5a8048f4993aa1a282ad43316f7", - "server_login_state": "d5a043104b4a32a84c956a23ebd0983a74baba5306172dd3f927f90546836ceabf2ad412617001e405d64e99c851f5fdc4b2c8c2373da9b5d24b139bc9ca56052bc95710c074c63264655222e16306eb6f5a271510d421f1273258a3c5773e15a4b5decf1dc9d3bf7e0275bdf14ec73015740efd93ce02fc72f0dd532acf9adf3b2665a7b961bef717343b814a5e56cc", - "password_file": "8416207327df962c4ff53c5c4edb5b710c0b04e1527b5a651e78ebf5656f680bdd1172a568d59511cbb10e38213accb6f4e515dd169c6c4751c6016150d675df8a1b381d22cc6952ccd0a043b1bd451bb0995459b636301e28f9cd58ef30a09adbef50e4ab7a4562335febb7bf506e53db4053baf546c8c58d34d9d18463d305366a1db21f57c5647dfb6f1f3c726cdb90b85728cabce1bab9917a6ea7b04443", - "export_key": "b8e6630165dd1949481f534a6ed72875b7ecadea6c6531c1628545465078f396f491393fd58c757fa7fdb0470fd2f55b", - "session_key": "a4b5decf1dc9d3bf7e0275bdf14ec73015740efd93ce02fc72f0dd532acf9adf3b2665a7b961bef717343b814a5e56cc" + "registration_request": "033c6569d1c7787341d53103cb131469b4145842a9dd28a10ac3fe778637238e09", + "registration_response": "02da2dabfb84dcde7c831ea5e69784e03d1dc646b317247343e363aeefa83889ac84f8d1382df385041057e676294629297a5cab358b8d01d2956aae0064482c5d", + "registration_upload": "02893f59040a2abc8a7af91708ad9145efcb9bf9933e4122804a7723e059e820e1150ec6682b2cdf8c1dd3ad5a1de14064cd15acab4be7e6b73d31b34e26689c50ef13b81036ef808c7270df1f5d184c89b5a9a0f0fd96a2a3af262ad17982607c2a7241dc47625cfe5d659869c72833e5c50e507abc7054c3e196d5ebb234bd", + "credential_request": "033c6569d1c7787341d53103cb131469b4145842a9dd28a10ac3fe778637238e09a1b49393dafea0bbff72ca6a5bac23686e9defc709665c3f66616e9f5389065431b47d98f40c8f8d3740bde5976aa572f7c296dd846f181939e46ae986640d35", + "credential_response": "02da2dabfb84dcde7c831ea5e69784e03d1dc646b317247343e363aeefa83889acdb6c3b2709b6beee4d7dc8174b3348d149767149522d373e7ccd38eac1611f7a4753ce60b57ca2ad41a0372dafbfb65c3d162a065fad8b7fb718298c5295fc2d30c7839270959e0058bfe7f01cb96f57264db8dd7aa3e92464600e2f070cdcdd1a7a0b3255c470fb9c1b6344456d593fb2e71ffd1e02e87b575213fd1b8d8e60e075a28dda8628508ab887677922daf0e11355f1ff71b7445565d48049bf087db92d1480a54c0cdf0d15b765eefa84a487c2feac9c782dd2033feb7a651af00fe94f8b8310ff20907ca37c62990937e74cb70622ecd45aaf98a5fb6e8032016a01b8a5e60164b0ee02d9e9d20f94341ed2ec69bd13fc91638228eb20e36e8466", + "credential_finalization": "c39b3d02389fb6908ca3a359c696aaf8d35d8d35379fbe6952c0f94eebd280288ddc75e276185482036357520c8c19c2d5ef67adfb50d3c29dc7ae668bf98645", + "client_registration_state": "9c9276359d11b121131b7fc2f14f28933f7d17a3ae1f30b0db12e1003a21c15d033c6569d1c7787341d53103cb131469b4145842a9dd28a10ac3fe778637238e09", + "client_login_state": "9c9276359d11b121131b7fc2f14f28933f7d17a3ae1f30b0db12e1003a21c15d033c6569d1c7787341d53103cb131469b4145842a9dd28a10ac3fe778637238e09a1b49393dafea0bbff72ca6a5bac23686e9defc709665c3f66616e9f5389065431b47d98f40c8f8d3740bde5976aa572f7c296dd846f181939e46ae986640d35605366b15279692a5bd592975320999b1d84f7750fbe425cb01d2c885bebe05ca1b49393dafea0bbff72ca6a5bac23686e9defc709665c3f66616e9f53890654", + "server_login_state": "9ca9191139acc5cc0a52e661808454fa49c37b1fbc2aba752a58ae2cd017d4f4ed7796d454685cc4ee979e850c342e0c67b633ac811221932457cd0c1e5a8091c39b3d02389fb6908ca3a359c696aaf8d35d8d35379fbe6952c0f94eebd280288ddc75e276185482036357520c8c19c2d5ef67adfb50d3c29dc7ae668bf98645", + "password_file": "02893f59040a2abc8a7af91708ad9145efcb9bf9933e4122804a7723e059e820e1150ec6682b2cdf8c1dd3ad5a1de14064cd15acab4be7e6b73d31b34e26689c50ef13b81036ef808c7270df1f5d184c89b5a9a0f0fd96a2a3af262ad17982607c2a7241dc47625cfe5d659869c72833e5c50e507abc7054c3e196d5ebb234bd", + "export_key": "f600ee687ca907fbbf6c9e3018fd6302a67c49a221bb625c7a2ba591a18949c4", + "session_key": "9ca9191139acc5cc0a52e661808454fa49c37b1fbc2aba752a58ae2cd017d4f4ed7796d454685cc4ee979e850c342e0c67b633ac811221932457cd0c1e5a8091" } "#; #[cfg(feature = "curve25519")] -pub static TEST_VECTOR_CURVE25519_P521: &str = r#" +pub static TEST_VECTOR_P384_TRIPLE_DH_CURVE25519: &str = r#" { - "client_s_pk": "d542bb61dfca61d50d4b49541df5852cbccae386badb7f134b4e49fa895add19", - "client_s_sk": "60769230b1fc9d1cc4e8ffacb97f674ba733d45bf78a0b6c52161663e8ce5656", - "client_e_pk": "d48867a4c38e761cc5f92da0a42c123728a1e8334ce025a29b3361e85ce25f30", - "client_e_sk": "d8ddb81893ab4239b316dc89e9f5fd88cc2024821fc90e6ca0eaf1f747e08f73", - "server_s_pk": "59455aedf7b1091f03ac9d2d3691907517690e4e822afd969cf0e2669cb5622a", - "server_s_sk": "f0b350cd5fc71c2c5da9eccb2d17fe4f69f8eea252fd83c18983176907ae347b", - "server_e_pk": "b5597ba3e3b5fd806c0567cf8327084ae2646c9e5831a99cd4a7c77cf1bd032c", - "server_e_sk": "883341a3627e737a5d1c92216c8067ee10c9ced6ffea56db6a640c5e29c5a253", - "fake_sk": "d0abb7cbdc80bfbb836fd26119417774495c372f7dffe99df7a8ab464c67f25d", + "client_s_pk": "59a09d8563587366781abf725de9940f968e64e01d35b7f8aff85389ec85aa66", + "client_s_sk": "30c390ca7ea45dd0674c381c8d7f6f15ea058b0c7a0d7ded32b11677a0e2567e", + "client_e_pk": "9b28398c62740892d4d78243ba00fe0b533bd6430fccba548912b938112cac37", + "client_e_sk": "20115f6149d8f749241a6d2ed76bf1200f067b8bd5b72c6bc14959f2ef9c365b", + "server_s_pk": "b0c60a2f6678278e44c503cdbf9bba7ce5e517e96286471616f83482e54d6e7f", + "server_s_sk": "60b305b83dda7adcc9e6b151a7d98754d5b320a7863ca34c603a64b979376e57", + "server_e_pk": "a40693438d98d514723626d8979a0779a33e5776ff43c6ded9ce3444a0f85a70", + "server_e_sk": "e80bcef85c061b2b2d183df912d20cac8fb7f7ea243121813983d63247c4424f", + "fake_sk": "5037464a6beffcd0c74ccc4a3479d803d1f83828618b09a59b681ee34c6ec165", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "0024f06f6682e0ba1a24e61fd4ce8ff7f1cadc7dd89143ea63ae96d88a133b1925ba823347fd15e32ab945b89285cde9d8603e995d3897d06c9dd36ac46aac2a3c64", - "oprf_seed": "def7e4417e534e8d4462245bbccc78653f362e6345f68d7816014743c349279d18764fe3f8ca96f688affbae733fd726e636638ab13f630cc812a02538a721ad", - "dummy_masking_key": "8adb8015e8c3fa16ec07dedf1ff2575a31c4968f1c86c5604ac3d0f869a34a702de48794c76aba3452017c87ff436f23498ae6c74357b4f2616bbdbc04520411", - "masking_nonce": "d467a974ba56460387fa20c66d46f680e59ad11fb9284b5430edf83ed963718cf733ff528b4174908fb4add55c474fbd323a1e4b6b2e7c59fa9ae5d2bfda0c84", - "envelope_nonce": "a77df6bed8a3caf7a6f27c18a04270a1d9095b59ccd9ebb39212a07c705394b2", - "client_nonce": "329efdf500ebb9eed9d122878fcc754dbe167de5d38377fba231deac6adff9ea", - "server_nonce": "4b8cc582e710d40987af1d90042142d6ef158db676dc9d80208435456c17e2b6", + "blinding_factor": "edda93a22f4677c302835496c34b3285b3c43acd3735c5835e5d2d12738176418e5f10d4583ef89821c23efffb1978da", + "oprf_seed": "69dd0e755a43bd81875ce281d0a73535d9fb59926e6ec52418c6ee19c2f0f966451ab2433d156aef4de75e9c32e07663", + "dummy_masking_key": "fbfb1dcff8e753ce842ba6db4c15a52abdd6311c157538fba685c86d9674ca5e98ae9beba7200f7eb582bb0ba2ca9b50", + "masking_nonce": "01cae2bf0f9933eb52b347828869ae69b2f3883883028c5cc97203dc3a12e8563bddcd76e2eb8627c163bdecbac1272f22a8946f3e14b93a363d9cfb6fc4149d", + "envelope_nonce": "f38b3d26a14304f1c7f27c4933b7c44e4724dc0f7eb88be4aa9f24dce0926f0b", + "client_nonce": "d33d06a0797bdc3ce20478a36dffe8488c411439a936636c368a18d9cd4d9996", + "server_nonce": "0f2e45edfd5f7e3cf64b3f23e70f66d4e8fcf210ebc78747efc098e0ac567f9d", + "server_sig_rng": "8c997994fe06ea1cdd32df37074ed4d502e004e8ffc241081fe3c46a26b84c61", + "client_sig_rng": "900b6d2fe25c613f2efeeb286a81cc997a1b1bf7f6507a2094c810ca10009f9b", "context": "636f6e74657874", - "registration_request": "030013a2ed969089855e162a78d482cda2fb438b3a70369d5f5e431bdf11a08e72724725bca7c3e8bec3156bb1c427ba8a1c1369a740a24b2d452e8a82f9132afeb6b0", - "registration_response": "0200573b3e6820c365b992efe1aaef5a41e691db55345ba0ea5d45ad07acfdffd63579b84e5e9b889c41e3d41baada77a3844f134c182a38f5c2d88a41a08a8d5207e959455aedf7b1091f03ac9d2d3691907517690e4e822afd969cf0e2669cb5622a", - "registration_upload": "d703cf1f169b6315d618f53daa5daa56a7145f04c312c053a0819e913cb34d1e994bc56da0e6f4433ff4ef61c33d1ab64e36dff60797e4206358d5e70903206a5adbcc829abd04e4bc98d9fa18ccc0cef7f3871db91c082d948a40554c886d2a60769230b1fc9d1cc4e8ffacb97f674ba733d45bf78a0b6c52161663e8ce56560bdef1b8e863937303a1992f7baff58bb65e36fb007e040d92719ed14289186b10a9e724e1791bf30fa11934926afa11a3938b6cdc3cf2755e6f062ab507648a", - "credential_request": "030013a2ed969089855e162a78d482cda2fb438b3a70369d5f5e431bdf11a08e72724725bca7c3e8bec3156bb1c427ba8a1c1369a740a24b2d452e8a82f9132afeb6b0329efdf500ebb9eed9d122878fcc754dbe167de5d38377fba231deac6adff9ead48867a4c38e761cc5f92da0a42c123728a1e8334ce025a29b3361e85ce25f30", - "credential_response": "0200573b3e6820c365b992efe1aaef5a41e691db55345ba0ea5d45ad07acfdffd63579b84e5e9b889c41e3d41baada77a3844f134c182a38f5c2d88a41a08a8d5207e9d467a974ba56460387fa20c66d46f680e59ad11fb9284b5430edf83ed963718c64643e35207bc8945d2295511da223b8fbf2031f248e0e939d2c2f7458f96839e1e9db2ca62738bd36f2ead5ca95e9013714f12cc5199215ab025b1e96de738aeb4dc445b4d5fb6a68072e1af4094186cdfbb090c8b2ca1979e812b6d89a715d46b27c326f5e53ba911c438b7ecc173236137d55aa68152fab5693e52d0519c5883341a3627e737a5d1c92216c8067ee10c9ced6ffea56db6a640c5e29c5a253a2eb3ca9353f405051bc578a4b1184f6eea2ed24840b35c6e70bb6362ca98773ab101257982687ba36a673262f3fcb432c2225ed0cb8d42e181b0815052473efca7c08128c522783c2b0818add21238c9d8df64744f3112350f0119a79d6b359", - "credential_finalization": "1d1b3a99ca20b7725f66a9de63a9841048e13058c3e9ced538f6c0f08f784939f70e248cbd994896c7767d3806d96fdd615d41515beaaf5cb37a1aa640084f87", - "client_registration_state": "0024f06f6682e0ba1a24e61fd4ce8ff7f1cadc7dd89143ea63ae96d88a133b1925ba823347fd15e32ab945b89285cde9d8603e995d3897d06c9dd36ac46aac2a3c64030013a2ed969089855e162a78d482cda2fb438b3a70369d5f5e431bdf11a08e72724725bca7c3e8bec3156bb1c427ba8a1c1369a740a24b2d452e8a82f9132afeb6b0", - "client_login_state": "0024f06f6682e0ba1a24e61fd4ce8ff7f1cadc7dd89143ea63ae96d88a133b1925ba823347fd15e32ab945b89285cde9d8603e995d3897d06c9dd36ac46aac2a3c64030013a2ed969089855e162a78d482cda2fb438b3a70369d5f5e431bdf11a08e72724725bca7c3e8bec3156bb1c427ba8a1c1369a740a24b2d452e8a82f9132afeb6b0329efdf500ebb9eed9d122878fcc754dbe167de5d38377fba231deac6adff9ead48867a4c38e761cc5f92da0a42c123728a1e8334ce025a29b3361e85ce25f30d8ddb81893ab4239b316dc89e9f5fd88cc2024821fc90e6ca0eaf1f747e08f73329efdf500ebb9eed9d122878fcc754dbe167de5d38377fba231deac6adff9ea", - "server_login_state": "77d9ec8f54d3c1fa933fb8d0eba338297565cf6e0e5d0e7580bbc244ec7ccda5e4fdecda4633b2f363f40df08d1813924955d0c370c60103df38f58bc43ea7a9a01bfadce4a2e4639e56fa1afca01eb7d447c3d1e0636cc52fd128216bbd143573afac5c7d3145ab8970de7461438f997cef93cf52889b095c46402666d4e2c3112f9183d20b45e101c30c107c0ad465ded1fbc38821f76962446c68b79789a5bb035ebde5041c21059b9d2283547d76d8badd874db530cce994a3e4da018e98", - "password_file": "d703cf1f169b6315d618f53daa5daa56a7145f04c312c053a0819e913cb34d1e994bc56da0e6f4433ff4ef61c33d1ab64e36dff60797e4206358d5e70903206a5adbcc829abd04e4bc98d9fa18ccc0cef7f3871db91c082d948a40554c886d2a60769230b1fc9d1cc4e8ffacb97f674ba733d45bf78a0b6c52161663e8ce56560bdef1b8e863937303a1992f7baff58bb65e36fb007e040d92719ed14289186b10a9e724e1791bf30fa11934926afa11a3938b6cdc3cf2755e6f062ab507648a", - "export_key": "a80d7271dd592b8302efa5137ca550df457e012e74b4b4361f9c7e6e988722b42329ebc61946802204d85a79d2e3f7789820d38f9ae2335781c5e8ffb536ab37", - "session_key": "112f9183d20b45e101c30c107c0ad465ded1fbc38821f76962446c68b79789a5bb035ebde5041c21059b9d2283547d76d8badd874db530cce994a3e4da018e98" + "registration_request": "02bbbc52ad7c84fc52864e5e05486017a8a128c5ce1b6594ad94939a7c12bd3624db5819d1d10b18683b50c5bb057412c1", + "registration_response": "0255b18ef97ce5317888d0b32817b49e06bb921f5003289195fe9be07750eb6debe6ebcbad0eaae0075bb00c0f71f11accb0c60a2f6678278e44c503cdbf9bba7ce5e517e96286471616f83482e54d6e7f", + "registration_upload": "f4c0307a30dff9a79c2e00520f298c05ba94411fb710b67828c7e04e2fe3453fd18beb36db188cb00d3dda4261299e4a42019c5735c638829206dcccbdb511a9cadfd6b49f3a6597853db200eaccaf9830c390ca7ea45dd0674c381c8d7f6f15ea058b0c7a0d7ded32b11677a0e2567e1f44d0c852d663b9c97803033e7cc8458dbd80435cf3d6003b17b5cc5260a004ad1d8aa2910e5a40a2a0be29066bae5e", + "credential_request": "02bbbc52ad7c84fc52864e5e05486017a8a128c5ce1b6594ad94939a7c12bd3624db5819d1d10b18683b50c5bb057412c1d33d06a0797bdc3ce20478a36dffe8488c411439a936636c368a18d9cd4d99969b28398c62740892d4d78243ba00fe0b533bd6430fccba548912b938112cac37", + "credential_response": "0255b18ef97ce5317888d0b32817b49e06bb921f5003289195fe9be07750eb6debe6ebcbad0eaae0075bb00c0f71f11acc01cae2bf0f9933eb52b347828869ae69b2f3883883028c5cc97203dc3a12e856f556d4005212b5da12d86b968a4c2f9fedd9b97f4557a24766988c8ed5c9c0c0a18f09485952f26a3aee18799b002101408edf2345114eda03ee1fbd877062ba9ed2bd8c7b71709c1d2df663aa5ec070d7fcddfc868c75c474544f39daca9dbf997c8ad4dc4b5438b6b876d1c3d94293e80bcef85c061b2b2d183df912d20cac8fb7f7ea243121813983d63247c4424f8e4ed776b7da6360968efaef231eaf19c3412019cd844dde19b55022e0337941c583f871368e13771cf70bdce4f8f2fddab57307d9376c5cba41ded495ed7c97505d07688f202650668ca85825501204f2ea175c0cdec4984ee78dd3b148bfe8", + "credential_finalization": "ec5853d8afd0294fb09f38c82421ca6807f2c840f1ed061914c41c47abf767d2b2ab8db07cadaddc3fdf6381680febd01cf42d0966121cb67e0d20e5d57d94fb", + "client_registration_state": "edda93a22f4677c302835496c34b3285b3c43acd3735c5835e5d2d12738176418e5f10d4583ef89821c23efffb1978da02bbbc52ad7c84fc52864e5e05486017a8a128c5ce1b6594ad94939a7c12bd3624db5819d1d10b18683b50c5bb057412c1", + "client_login_state": "edda93a22f4677c302835496c34b3285b3c43acd3735c5835e5d2d12738176418e5f10d4583ef89821c23efffb1978da02bbbc52ad7c84fc52864e5e05486017a8a128c5ce1b6594ad94939a7c12bd3624db5819d1d10b18683b50c5bb057412c1d33d06a0797bdc3ce20478a36dffe8488c411439a936636c368a18d9cd4d99969b28398c62740892d4d78243ba00fe0b533bd6430fccba548912b938112cac3720115f6149d8f749241a6d2ed76bf1200f067b8bd5b72c6bc14959f2ef9c365bd33d06a0797bdc3ce20478a36dffe8488c411439a936636c368a18d9cd4d9996", + "server_login_state": "ab1c0b42e2551c2f2ca28112083d8dd55149ba47814e6d2730db3723ca57aee4172eb6fbff5fca315963ba96cc4852eea1b421f838609113c787fb346b6d3ac5ec5853d8afd0294fb09f38c82421ca6807f2c840f1ed061914c41c47abf767d2b2ab8db07cadaddc3fdf6381680febd01cf42d0966121cb67e0d20e5d57d94fb", + "password_file": "f4c0307a30dff9a79c2e00520f298c05ba94411fb710b67828c7e04e2fe3453fd18beb36db188cb00d3dda4261299e4a42019c5735c638829206dcccbdb511a9cadfd6b49f3a6597853db200eaccaf9830c390ca7ea45dd0674c381c8d7f6f15ea058b0c7a0d7ded32b11677a0e2567e1f44d0c852d663b9c97803033e7cc8458dbd80435cf3d6003b17b5cc5260a004ad1d8aa2910e5a40a2a0be29066bae5e", + "export_key": "bace430b5092c83be92d227988f0eca3070db19e895e10f9bc9074a712dcf5961694ef411ae2a3d10fea2028828f7212", + "session_key": "ab1c0b42e2551c2f2ca28112083d8dd55149ba47814e6d2730db3723ca57aee4172eb6fbff5fca315963ba96cc4852eea1b421f838609113c787fb346b6d3ac5" } "#; -#[cfg(all(feature = "curve25519", feature = "ristretto255"))] -pub static TEST_VECTOR_CURVE25519_RISTRETTO255: &str = r#" +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P521_TRIPLE_DH_CURVE25519: &str = r#" { - "client_s_pk": "00855289f8d868e09f1f69449768c077b8e00ed940e275fc4f46c0440e7a1732", - "client_s_sk": "d02527875ad64d9586bc93d9a35d9d80fa7f9c0be478b915b54525d51464976f", - "client_e_pk": "d0a3e8600ed65a2eaac1acab000f3b328bd5d99fae9b8754500fc0a14a5d1441", - "client_e_sk": "98c42ece119ac7c135527bcf2894e4d411521a2813315f7fa969daea46791b7e", - "server_s_pk": "afa850dc2a3a25bad6ca5700be028912347ea2da7243bae21dda5ecc2af52065", - "server_s_sk": "18bc2c4c22ee427eb2719df8abd3e7636d4d6bd1887069a7513a9c6b4537584d", - "server_e_pk": "cfd3677743c23878023cb9aaf25885911af9f909e5be1115a6d4c7b0b69c1b32", - "server_e_sk": "b09aa335d5e34053ceb72aa2045821624a3bbb458c7b9e197fe9eb43aba95970", - "fake_sk": "88515efbc2d6ac067a48a85312048d1e0365d70e8ea7325ecb77e8c76a141d6b", + "client_s_pk": "c1bc781b1aa02af98d23f7a4d44632b4a6ae546671aafe2448f823ab797b1876", + "client_s_sk": "3816bfa9ae07a8f5cbcbc12d3fdf32233d4c87d7889d5e008d004c2bc3461e63", + "client_e_pk": "0555c75158f3a6046832800675a0bcb5c73701916a4a16b130bdc08f193aea23", + "client_e_sk": "20ee3b2a8dfb96f1569224fd4fb49f1485a8a414fbd4c62592bdb98b7f26c942", + "server_s_pk": "b581a490f82b98f5c34fa072f22139b09a9fede3e652b2c2793ef8a01df67c10", + "server_s_sk": "50d391a3ff3c0290f623d9be78a2aec75473da340f089db919f64f03b2c4df59", + "server_e_pk": "03a9da6d1c96918f4e50cf7684614502ff78623e20f0e9759a15fe592238931c", + "server_e_sk": "e0c445cd094526a6a04a68c8897907c198ba4ccf1b1c0e8a9f1c1991fd5b3551", + "fake_sk": "605d778190c0cfa0f93e185d21a9f9b7853e0726eb1eaab6d121009222262846", "credential_identifier": "637265644964656e746966696572", "id_u": "696455", "id_s": "696453", "password": "70617373776f7264", - "blinding_factor": "8c527e3c1fad86d3b27126a45f0adfd919acc2e7bbb5573b6c52cd65dec5770f", - "oprf_seed": "88e39184f466c8cb3962d27c0ddbc611701d6ab0ccf5008bb9a60f55e08f9a2fbf15bd39d1125a105905f4d87f893f2896e31c1245da9c3759047a2cdd0fcfc2", - "dummy_masking_key": "fa201f221e237bde9ecc76e5690d97b655cfd613247005a3c317b841c262f62dfc08faf085c5de8b951bba491c31e1efbd434da836b14c349b82e8ec6f362faa", - "masking_nonce": "b4a77fe8f10b7f54495af85512ce5080e9ec2b83dac3ca8fd403dc81bac4346998b119124c31d25c24a613ed5c0448fac02f91ec6ab9b68613372ffca7c880a9", - "envelope_nonce": "8c11c63de1218c6f965cb2568a6799ab976b0545de0bb8a9d72b578c0120feb7", - "client_nonce": "0988a50db40081f230af51ee9bdb5440a288a3d9c7d91749a9ac565413b0e5b1", - "server_nonce": "6e7b0169f839ffe63639cec347ca580d5f391eeae3b9873d575b0b5245306d12", + "blinding_factor": "006d740240c3b41471b9932f0f51dc03ddfb34337b2893db8edb0123465641ca51dc8f785086fbd733cfc9f84319d83baa8d999c23b9fc6e61af716e30736f063b0c", + "oprf_seed": "9a2db879dc3366701e469899a3bc50a0eb24ed5d4c9a15a3b40b70b9d65c62d466eb1eb28e2a4f29133f41253b57101eeb6189ee61be6375ec1161611950737f", + "dummy_masking_key": "7932e1a1912ccd530ec172169c341c1ffb06df23e1fc3214c7c0574349548050f7796de12658c25b19d285bb5f4b56cc8079d58395c19ce4dd5a35bc251ede09", + "masking_nonce": "3cf8739a1ae30b58d5b8b2051eb39bd76fa125a0e3bf48acb04bce8b2848dbebd30ea96f3c49f1d615a81a53b8b9cdc93328d607352000653ab0eb460fdac8dc", + "envelope_nonce": "d42811dc73afdc7ceaa18ccde23de48467edb7d6e6cc712b7664c6de441c5696", + "client_nonce": "6185e8ecce22d0b0c228c0d4ab7da41ed0a87d7ffd01a1228636b7434f7e2333", + "server_nonce": "a1b5f7ae6776aeddfc725d121baa647f9948936ce8d2b8362125195785cf29a5", + "server_sig_rng": "1dd3c31b9e6b7691430a6f19a394160fd0f26a85f2d0057acd354b028aa6abc7", + "client_sig_rng": "4f7e8c71124fc3151a9170ccf32a258544d7469ff55c0b3b938290dfe9cc9959", "context": "636f6e74657874", - "registration_request": "3e7592e6d62f188410bcfcdbf1243378ab71b64ecf8b7e3bcd167f17add24053", - "registration_response": "fe4a6044ee3d1d9c114fbea3e4ef1e102d4be3fa1bc01b7efab45ce12d381d0eafa850dc2a3a25bad6ca5700be028912347ea2da7243bae21dda5ecc2af52065", - "registration_upload": "59487210a750b87e2178d757aa15bb2dddf8a79d1d5f0a40a8fea9cb7825ba4a61bc13269e1b9665a9ff0d3d0eeff271dac3cf24cf00a7e0b1bb973a63dbcb5eb680d80e5efec70c6772824e1eef5c4f92cd13fe9e3efd5a9111951d6fbe9085d02527875ad64d9586bc93d9a35d9d80fa7f9c0be478b915b54525d51464976f83d43a42fb9f0b797133a8f9e550a6531fd3e421dd39667cd43f073fa18339887bfb70b76f1a2f49fbd12547dc72c5339468b032a9af80fe2a04930e00d13e36", - "credential_request": "3e7592e6d62f188410bcfcdbf1243378ab71b64ecf8b7e3bcd167f17add240530988a50db40081f230af51ee9bdb5440a288a3d9c7d91749a9ac565413b0e5b1d0a3e8600ed65a2eaac1acab000f3b328bd5d99fae9b8754500fc0a14a5d1441", - "credential_response": "fe4a6044ee3d1d9c114fbea3e4ef1e102d4be3fa1bc01b7efab45ce12d381d0eb4a77fe8f10b7f54495af85512ce5080e9ec2b83dac3ca8fd403dc81bac43469d5f3c87708b548cc1ef792a37e0d370d74bb4ea7a447892cc7ee58ae0623ec5f29b6c585d16ff62fdbe9f190bdcde741cdd5cc58d2de9fc8e5cc670a3df74a2145b8512615269f7da97b42314287be975d9eab230f2fa58d38304fddde5ab56cca2b3ea14a2d93784562d4ccb1a757ef5054619f1e2b585de1dc14b6225c8aebb09aa335d5e34053ceb72aa2045821624a3bbb458c7b9e197fe9eb43aba9597006be27835bda262fb14085d2f5878cdb41ec21a30a0ba976a0c587c33bf529331996350e16b584d3b24887f053087b1629edc2ef33cd285abf41b71b54ea299f488dd41e85a90e93a4d0487d7a8dca005b7c8ca03728c47bbe7e0252fcf5aea0", - "credential_finalization": "d6f3b69bc824b48ffb0fee26c74d351b53e20b0f80879040f1f59bb11808b9aaf905cae53b5d025f1a229965916189fd13c5d0fed83992722374722897b0ab4b", - "client_registration_state": "8c527e3c1fad86d3b27126a45f0adfd919acc2e7bbb5573b6c52cd65dec5770f3e7592e6d62f188410bcfcdbf1243378ab71b64ecf8b7e3bcd167f17add24053", - "client_login_state": "8c527e3c1fad86d3b27126a45f0adfd919acc2e7bbb5573b6c52cd65dec5770f3e7592e6d62f188410bcfcdbf1243378ab71b64ecf8b7e3bcd167f17add240530988a50db40081f230af51ee9bdb5440a288a3d9c7d91749a9ac565413b0e5b1d0a3e8600ed65a2eaac1acab000f3b328bd5d99fae9b8754500fc0a14a5d144198c42ece119ac7c135527bcf2894e4d411521a2813315f7fa969daea46791b7e0988a50db40081f230af51ee9bdb5440a288a3d9c7d91749a9ac565413b0e5b1", - "server_login_state": "25557bd27170c9fa6abc0d7701dc919f5d607b53ecf5ae1b5910de693e23f352a563055086f4f7b9bf955c451d603279fcd3abebbe89ffbc3c9391b30a688025c6d0d32efa3f58b62df977d229f99a45f56909962a85a6418f68a6e6607259ef5fdec9b624c31096790994d2ec219b1cb05e6530197af02e7df1dae99fcc15851808470fda80454965d8d805a8405a92659c6847f00ed5395f0370d2147bdd1dd739fefe5d5c673aa76e81ef1da426c345ff9ae66d52c02729d468e0c80c7ae5", - "password_file": "59487210a750b87e2178d757aa15bb2dddf8a79d1d5f0a40a8fea9cb7825ba4a61bc13269e1b9665a9ff0d3d0eeff271dac3cf24cf00a7e0b1bb973a63dbcb5eb680d80e5efec70c6772824e1eef5c4f92cd13fe9e3efd5a9111951d6fbe9085d02527875ad64d9586bc93d9a35d9d80fa7f9c0be478b915b54525d51464976f83d43a42fb9f0b797133a8f9e550a6531fd3e421dd39667cd43f073fa18339887bfb70b76f1a2f49fbd12547dc72c5339468b032a9af80fe2a04930e00d13e36", - "export_key": "d8326b715215f34be18d3063f1de96aceda0540d3438a1b0e979ac493d5c87888e2c086603fd923cb2ef537edd9c708ed66546f36be2fb30ca310bb57eff1f87", - "session_key": "1808470fda80454965d8d805a8405a92659c6847f00ed5395f0370d2147bdd1dd739fefe5d5c673aa76e81ef1da426c345ff9ae66d52c02729d468e0c80c7ae5" + "registration_request": "02016db0ef58f4343103c4f01165bfdbb8fc1550aaa0dbeceebaff55651fb62d41e01ae8e6e741929ec1d6267a4d4a029cdc04a5067dba22ce1a6671dec6924b7470e5", + "registration_response": "020113e2a6ab0bd69c4b203922730557850e2b9d5cf4bde6e323d8aed3e8c7816eeb4558f4c9348dbffa13c05bdf2656b75b84b1d7aeba36254971f6c6cc8faad08190b581a490f82b98f5c34fa072f22139b09a9fede3e652b2c2793ef8a01df67c10", + "registration_upload": "b4496936fae9dbd92ff58f8d3b40b608811b1c34cada0361235c7875f40e4a7791167f102de746ce3c48578b55bf473c9c95d12158ea67d4b67bdbd8821ceb4ee614d3b0c1fcd862642454a1d26069a4f9fcb4e8b933ab28e215a2f83d3c2da03816bfa9ae07a8f5cbcbc12d3fdf32233d4c87d7889d5e008d004c2bc3461e630fee6bcd60ad799410554186c02eff348d52d97ff0da3e70506c59b1da2bfee7caecddc907e388eba87146974155f32d51b7b4dfa41dc1b5ccc14642da014bae", + "credential_request": "02016db0ef58f4343103c4f01165bfdbb8fc1550aaa0dbeceebaff55651fb62d41e01ae8e6e741929ec1d6267a4d4a029cdc04a5067dba22ce1a6671dec6924b7470e56185e8ecce22d0b0c228c0d4ab7da41ed0a87d7ffd01a1228636b7434f7e23330555c75158f3a6046832800675a0bcb5c73701916a4a16b130bdc08f193aea23", + "credential_response": "020113e2a6ab0bd69c4b203922730557850e2b9d5cf4bde6e323d8aed3e8c7816eeb4558f4c9348dbffa13c05bdf2656b75b84b1d7aeba36254971f6c6cc8faad081903cf8739a1ae30b58d5b8b2051eb39bd76fa125a0e3bf48acb04bce8b2848dbeb94227e8991029a2ae2ff9e042160255fa01f814a4ced9312a6ca5cd327ee0b47f645360b1eff25d73a7026b6684945d1b7a9c7b02f2b17521edde2c56f83f01fed6e3cb00c180ebc8bb1fde19a56e54eb1977275be055b2777b699734baad2d792106a12e200c94fe3f4c41f23edd64dc175f17be4a556df75776bf4cd14d714e0c445cd094526a6a04a68c8897907c198ba4ccf1b1c0e8a9f1c1991fd5b355104b7f3e076bc9e614ca727b28a2321b8a5b45f69affe6f04ef86794b26282632638b9e0ed7f7b7ccf9659eb3645505af03510c1d4b3d52c3f25cc22898b7e165f98600633e7169081c88b6e264b41482af5e40693a9f9b8593d06c02f0312326", + "credential_finalization": "f1c6487f3fdde7fc51b9618dfa2efeb24f6be56e6bddfb0490da05c4554e67a18c27f0d86ebbbb98ab46777e5dac984f758fc92ff946a23914707101cfc955f7", + "client_registration_state": "006d740240c3b41471b9932f0f51dc03ddfb34337b2893db8edb0123465641ca51dc8f785086fbd733cfc9f84319d83baa8d999c23b9fc6e61af716e30736f063b0c02016db0ef58f4343103c4f01165bfdbb8fc1550aaa0dbeceebaff55651fb62d41e01ae8e6e741929ec1d6267a4d4a029cdc04a5067dba22ce1a6671dec6924b7470e5", + "client_login_state": "006d740240c3b41471b9932f0f51dc03ddfb34337b2893db8edb0123465641ca51dc8f785086fbd733cfc9f84319d83baa8d999c23b9fc6e61af716e30736f063b0c02016db0ef58f4343103c4f01165bfdbb8fc1550aaa0dbeceebaff55651fb62d41e01ae8e6e741929ec1d6267a4d4a029cdc04a5067dba22ce1a6671dec6924b7470e56185e8ecce22d0b0c228c0d4ab7da41ed0a87d7ffd01a1228636b7434f7e23330555c75158f3a6046832800675a0bcb5c73701916a4a16b130bdc08f193aea2320ee3b2a8dfb96f1569224fd4fb49f1485a8a414fbd4c62592bdb98b7f26c9426185e8ecce22d0b0c228c0d4ab7da41ed0a87d7ffd01a1228636b7434f7e2333", + "server_login_state": "cd9fa0cd8e00e79de521b4462d4b7fc86008ac8a883ca2b9036dfd2f45eb199561b7a37ffdff41e37b4c7439822c085286247b594447fc537f1ae08ded93ca2df1c6487f3fdde7fc51b9618dfa2efeb24f6be56e6bddfb0490da05c4554e67a18c27f0d86ebbbb98ab46777e5dac984f758fc92ff946a23914707101cfc955f7", + "password_file": "b4496936fae9dbd92ff58f8d3b40b608811b1c34cada0361235c7875f40e4a7791167f102de746ce3c48578b55bf473c9c95d12158ea67d4b67bdbd8821ceb4ee614d3b0c1fcd862642454a1d26069a4f9fcb4e8b933ab28e215a2f83d3c2da03816bfa9ae07a8f5cbcbc12d3fdf32233d4c87d7889d5e008d004c2bc3461e630fee6bcd60ad799410554186c02eff348d52d97ff0da3e70506c59b1da2bfee7caecddc907e388eba87146974155f32d51b7b4dfa41dc1b5ccc14642da014bae", + "export_key": "a295b55e88141ecc5c00740d0e21c04bbe1d7a6096c46e48cc5c30f0ca3a824f2848f1e7855ca96e1d829e452aee1b04d4f1f89dc61280e343557a79f7f970ff", + "session_key": "cd9fa0cd8e00e79de521b4462d4b7fc86008ac8a883ca2b9036dfd2f45eb199561b7a37ffdff41e37b4c7439822c085286247b594447fc537f1ae08ded93ca2d" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P256_RISTRETTO255: &str = r#" +{ + "client_s_pk": "02e819589ec57faf9929fd0b2fc8ba54f6ff477869e300a124f08aa1e3318ce38c", + "client_s_sk": "ef104ce1864352165cf2626b5123b97ba575488d2201a58329f444869b811366", + "client_e_pk": "03ecb6153f38ca76b5cf16c6cf79021fc35aaa9f882fbed1c6cb40378ce8dab13c", + "client_e_sk": "ca6e89dbfc908094652255ed5afe67d68abf43fc3f31a286489f1fbc8f0cd4e7", + "server_s_pk": "02fb2d9b9922789f96405bf1c295ce70d65f6a9f7b2e2e6d19cc4f7d2e411e6455", + "server_s_sk": "94ca84be78e7db3c4ac7a949c762b4c76c67a287383118f98779bf9b0333319e", + "server_e_pk": "025a9d873861ce916cc265ed32852ee89000caa0536b52c0c96646523b3ecaace4", + "server_e_sk": "1f0b7acff696eca56b96f30c81d7c4c5d16bc23ee63a5ba6a5e994f8ac8f3955", + "fake_sk": "11afa6013c13d38706d143f487c264df7cdf121961aeeda369e536258ab2e0ba", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "1fc0fd106b7e61b57d7e101c940b2c05008a2f785bbfa495e03b29047b058c0b", + "oprf_seed": "4c136a661230050528febf070ab250db2007abc2c2a06b2f3fdc08f8265320f9e71a28daa9157c853a83d790dac371b4bf14659b9edf5dd74675cf978b25fb26", + "dummy_masking_key": "02a4d56e58c88c042a2ad98b1761be39a75d488ac4d570c7396d1ab1075eeef17291cb4fdab5720a9590025505efe1e4b5874161671575c46098d7539531d2a3", + "masking_nonce": "1a7561b04c7a5ad05edd899d03ae594dbddd932173e866ebba2ba5352f7de974f357e06082001b9b299b02de01119e0267e1fe34b65b69cd295d9469987d6ea5", + "envelope_nonce": "5ce92e8679d46433454d77bcc4636090720e78a8973e988a031a33dee2f4991e", + "client_nonce": "7635721c727329d35896a9b84062fd85d974c1d0f2030b6f673da227d63dbd7e", + "server_nonce": "a094e28d029cc93658ce3601cad7c40b0d1b12a5109392543b9aee71c4a6c715", + "server_sig_rng": "321e421fcc91734c4af82c6c5129be080cf1edb1552c2df99bf4698fbe7ae7e4", + "client_sig_rng": "bf4951f8171ec2f1992db4f63c91db892d4979b8494b3758e98ada493ada734a", + "context": "636f6e74657874", + "registration_request": "9a3111fad29c3a83b2f1ef77fd780b31ab4b5ff2e412041368790995e9b6af54", + "registration_response": "302147a228a6b93a2ceb9df0c5e645d429bae0e395d7c7938a7094856517fc7702fb2d9b9922789f96405bf1c295ce70d65f6a9f7b2e2e6d19cc4f7d2e411e6455", + "registration_upload": "02d3d0a2e28183b8c546a156d2376fe1010abed03401fcf34568ce93bbca213fc1edda11bc38b6106b99878c9a2ffccb3adb0e48ed988aa9c9e403db057ddb551879aeb07b4217e1ee6d431c91246debe133e358cc588cccc57cbb606c5c3a7d88ef104ce1864352165cf2626b5123b97ba575488d2201a58329f444869b8113663d1bbf9a149e0fa1794d97770413646c814315ff0310e3a9c83b1a5cabc797992c6eac80e188dc3dad4876a52e32cff32d293ed0a47bd56a0efbfffa3021317f", + "credential_request": "9a3111fad29c3a83b2f1ef77fd780b31ab4b5ff2e412041368790995e9b6af547635721c727329d35896a9b84062fd85d974c1d0f2030b6f673da227d63dbd7ebcca7c627211b88a233c4572c3431333948637989509f46610eb0d1e29c9403a", + "credential_response": "302147a228a6b93a2ceb9df0c5e645d429bae0e395d7c7938a7094856517fc771a7561b04c7a5ad05edd899d03ae594dbddd932173e866ebba2ba5352f7de974cf8903c39b476561ef1a919406c7119df2e7d6d099cbc296ddc95307964fae2be65b7a523b7463150b65b691777a78dafe5cfe6ea3a2073f44351f71625c76faac58e90901e99531851ccd14cdd6c899f7d4e431ebe88a34353d79be913803cb2a51af8b772bd5c3ba1d5c74eb521de7630494d41ca3d801a5c7912597cd95e1b21f0b7acff696eca56b96f30c81d7c4c5d16bc23ee63a5ba6a5e994f8ac8f3955f4a1d1975e53ce7460a250af0fd076aad2bf52e901194edc60cc7798e2669202cd6b4bd6bad91a03a6caf439b6ece35f9cfc37bf3f440007397c74153800da65bcbe010b46318aefb13340078af02897dc01c3941c37bb79ba42e0ed039d2cf9411a768745069cfbd475520fd6c5d848653c8cff33bdc27548adfb1e2f2e1cf106383581ebaba53464262cdbe8a15bf68600b032fb8319eba6439de3c4c51a38", + "credential_finalization": "a14142c4e274287f9b77ac7f4664276e94d4525f2a66ed8c2a8b53e4736d02023a3893c2cc7b41dc416b741cfcc302b854464771436872a8791020be143cf16f237b0a820ce2aa911f440ce00d536e6a7e44e906d28d4cd5857f23e70c182bf37b1c3594da9aba67a6cdf609b7b5d27b103a5f7d74c35e1a5120e731e7ef17b5", + "client_registration_state": "1fc0fd106b7e61b57d7e101c940b2c05008a2f785bbfa495e03b29047b058c0b9a3111fad29c3a83b2f1ef77fd780b31ab4b5ff2e412041368790995e9b6af54", + "client_login_state": "1fc0fd106b7e61b57d7e101c940b2c05008a2f785bbfa495e03b29047b058c0b9a3111fad29c3a83b2f1ef77fd780b31ab4b5ff2e412041368790995e9b6af547635721c727329d35896a9b84062fd85d974c1d0f2030b6f673da227d63dbd7ebcca7c627211b88a233c4572c3431333948637989509f46610eb0d1e29c9403ad7389f2afd7b428efd32d9da8c6a63ebaed38e3ca3a93c370c0274369aff92077635721c727329d35896a9b84062fd85d974c1d0f2030b6f673da227d63dbd7e", + "server_login_state": "02d3d0a2e28183b8c546a156d2376fe1010abed03401fcf34568ce93bbca213fc1d256375ba26e2ad650a541f0281d2aeccd2871c6828b98ffa3ba0f95c44f1095843efd89e083b1ec0093cb98526c0b4b6dd74f091d9be4580d1fb67e9d5865e3a2beee25d49876d5fc81fb914348dc434408fd34f912a61d18888f10efd5458f237b0a820ce2aa911f440ce00d536e6a7e44e906d28d4cd5857f23e70c182bf37b1c3594da9aba67a6cdf609b7b5d27b103a5f7d74c35e1a5120e731e7ef17b5", + "password_file": "02d3d0a2e28183b8c546a156d2376fe1010abed03401fcf34568ce93bbca213fc1edda11bc38b6106b99878c9a2ffccb3adb0e48ed988aa9c9e403db057ddb551879aeb07b4217e1ee6d431c91246debe133e358cc588cccc57cbb606c5c3a7d88ef104ce1864352165cf2626b5123b97ba575488d2201a58329f444869b8113663d1bbf9a149e0fa1794d97770413646c814315ff0310e3a9c83b1a5cabc797992c6eac80e188dc3dad4876a52e32cff32d293ed0a47bd56a0efbfffa3021317f", + "export_key": "bd93a04343713a91fce38c855987a82b7fdc66e715bf4460e648e5ac6051a1ea62478029b66039f16398ba1d1ae4df2766192e983f6710c3c3b08c35e098582e", + "session_key": "d256375ba26e2ad650a541f0281d2aeccd2871c6828b98ffa3ba0f95c44f1095843efd89e083b1ec0093cb98526c0b4b6dd74f091d9be4580d1fb67e9d5865e3" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P256_SIGMA_I_P256_RISTRETTO255: &str = r#" +{ + "client_s_pk": "02229c0bc84469c1958b215fc9510949b8b661470613c1478806fe6108948d9848", + "client_s_sk": "32050fdbecb901e98885cf17ded7c71379ea7a2c138ea702f061ea39c556c70b", + "client_e_pk": "0387c8ba7178f044c8d2df9294825cda1aa0c1b2b266e4c4bafc9012ce5ab8decc", + "client_e_sk": "2327588459f70774963120234694add27cd89e19454a0ce99be937295fa9f930", + "server_s_pk": "038d344e8e063af64066dc125f64cdcfdf4a90e788e777729a2d7990225900a25f", + "server_s_sk": "9834618951b62aebbbe032217bbaceee0d1248cf66711ece5858bcaf89d5056a", + "server_e_pk": "025ac17c1e82d5aa88ebdaf10ba3cf49d8e6adbcc60beb20df74b078367517ec52", + "server_e_sk": "a5a6969715365531f13042c86ec003144357a13c01f6d0e4f8bf9cee8ad41c34", + "fake_sk": "c83982bccb1967a9c1a826f926ef91f1459677095223043f8a85ae7cf78b1771", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "72e6637bf2165b07890c3d6968b7b4e12b21cd60979febc57a633e01ea80fb38", + "oprf_seed": "f9efe14ffaf5030277f860abb6bc114359548a92f38d6b7852320bc1a44cd18f", + "dummy_masking_key": "5ee538a4d474e6871f266fc418d6a282af70d542443da66f86668506cec897f8", + "masking_nonce": "0bbeae5fab8bef1a2300792cefada1cad70c8816a2f495f27122341be2225ce36d7121063739cef20f2ad947a674e6dca4e45b6edaf591341bcb0b45ceefdecd", + "envelope_nonce": "a16b292b7d45d93fc495e1e271f67286b6b5352b6265be4027b2c8f73969a05c", + "client_nonce": "36ab5c81f8d0447adc84bc7d83f39ea5b7f8641a9659397ae2e4828d4eb62f73", + "server_nonce": "c2899caad302e8cbba89e390c8ed01fdebc1cd7dc55700b8281ea686384200ec", + "server_sig_rng": "5828cae2dee5fe3266e4df815742098549254ac51af2de04d1c6eaf92d3f1948", + "client_sig_rng": "a062940ef7ecee1f40d003de8a6a6822d808e5b730907551cd1e882a0e1af755", + "context": "636f6e74657874", + "registration_request": "02d81e2c81b7e3416e06d7afda4a1fe69cf56b52d0de8bbe3e9f9b9deb5448dd01", + "registration_response": "03d0dd2536d645e774b5c0b2b5745a8107d208b57156727958418b269e6e98e877038d344e8e063af64066dc125f64cdcfdf4a90e788e777729a2d7990225900a25f", + "registration_upload": "039ff5c3af9ffd92331a6b943526b23cb2c8b7fd3a625293c6041fa60bfee46831124548b40d2600f7d3612d9b1cad98cdb02eefa39f7c0ec79324e8749bdd8d4b32050fdbecb901e98885cf17ded7c71379ea7a2c138ea702f061ea39c556c70b7e4da092b11a14b1d40b42259860ef35b3d1bea0fc8b08b67250065854acbb1e", + "credential_request": "02d81e2c81b7e3416e06d7afda4a1fe69cf56b52d0de8bbe3e9f9b9deb5448dd0136ab5c81f8d0447adc84bc7d83f39ea5b7f8641a9659397ae2e4828d4eb62f737c7c71ccfca4a4c0f007f8e699be2191a7147f5a99ca4b644f1439de56c9880a", + "credential_response": "03d0dd2536d645e774b5c0b2b5745a8107d208b57156727958418b269e6e98e8770bbeae5fab8bef1a2300792cefada1cad70c8816a2f495f27122341be2225ce3906251c997248550994e812f0bcfbda65942a9031aa8718a0cccf34197cd0559f94d2a89b808fa5dfdc8836e527457478ce649d30175f30be7d488abe369230e5c3f5d022c39cc7434cd158aae9efe7fdfa2846782af6dc65312a18d30f67d95a1a5a6969715365531f13042c86ec003144357a13c01f6d0e4f8bf9cee8ad41c3414f75f69beeb017c4b85d74213d24f008424189aa5664b95c47048030d9a9e0514f2c7c464ea0aa5bda3b35a6063c6d5289c068e227336cd9652ca58d38f2ef31c5e81059754b5d7028ec0bd569f8970ef1cb489aa99f4eb4ba0fe4e4011028ab25cabea600fea73e01890e59f588a60fda0f65da1efcdb0bdde52665659a6d684c98d1b796036ba3481a04f25306aade8954dce84ce9c0d9e52d839d47d1776", + "credential_finalization": "e27c2bbb12a078fa824424c14ed778ecd4dcd74b26fb405c01cb6967f9a774700d8eea01425fdcc3d395eb3ba352c6ca6dd64f670c4099993002f9d1bbb3e6afa78c14d9b24d67b9968c5d50f94d946e57fba57bd4c63ff187b790a3ce2af0af8e2a33742f8fb2aa28e0c175322e72385fe1cd283b226895060fd7f2156309f2", + "client_registration_state": "72e6637bf2165b07890c3d6968b7b4e12b21cd60979febc57a633e01ea80fb3802d81e2c81b7e3416e06d7afda4a1fe69cf56b52d0de8bbe3e9f9b9deb5448dd01", + "client_login_state": "72e6637bf2165b07890c3d6968b7b4e12b21cd60979febc57a633e01ea80fb3802d81e2c81b7e3416e06d7afda4a1fe69cf56b52d0de8bbe3e9f9b9deb5448dd0136ab5c81f8d0447adc84bc7d83f39ea5b7f8641a9659397ae2e4828d4eb62f737c7c71ccfca4a4c0f007f8e699be2191a7147f5a99ca4b644f1439de56c9880a33f465216fca0b086d88dd8ff3e4a0e026ab511e6fcff787b55bfc64c8f1e50a36ab5c81f8d0447adc84bc7d83f39ea5b7f8641a9659397ae2e4828d4eb62f73", + "server_login_state": "039ff5c3af9ffd92331a6b943526b23cb2c8b7fd3a625293c6041fa60bfee46831230d6a3f90a70a515de94b63458fb5bfed5cb9ee758381ed606c5cbe9af3e06c89a58cd677d5f8e2cebe0b2fdb6acf3178e09387a8345860374c792a7bb663ac77f465fd0cca77466df50724ab34c58cdee0d7fc5192fac02175c72ce72b342da78c14d9b24d67b9968c5d50f94d946e57fba57bd4c63ff187b790a3ce2af0af8e2a33742f8fb2aa28e0c175322e72385fe1cd283b226895060fd7f2156309f2", + "password_file": "039ff5c3af9ffd92331a6b943526b23cb2c8b7fd3a625293c6041fa60bfee46831124548b40d2600f7d3612d9b1cad98cdb02eefa39f7c0ec79324e8749bdd8d4b32050fdbecb901e98885cf17ded7c71379ea7a2c138ea702f061ea39c556c70b7e4da092b11a14b1d40b42259860ef35b3d1bea0fc8b08b67250065854acbb1e", + "export_key": "b4703107804da4f6ed5257478befe8ff4751e5f3b559ff03f75087687cfafccc", + "session_key": "230d6a3f90a70a515de94b63458fb5bfed5cb9ee758381ed606c5cbe9af3e06c89a58cd677d5f8e2cebe0b2fdb6acf3178e09387a8345860374c792a7bb663ac" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P384_SIGMA_I_P256_RISTRETTO255: &str = r#" +{ + "client_s_pk": "03585bc2ac90a2b20fff8b1b2dfb5bd30744b7434a39cf60b8bc8d539c8193011a", + "client_s_sk": "859e3e2025044b3a7bafdc7058dd9eb64c087065c98db8c5f5bd0614e89fe3de", + "client_e_pk": "03b2c074ca80f91de92e877eb1878507c356aedcfbc2b94a144604fafe107aa346", + "client_e_sk": "48b761e3856be3924f958b0fab2ff0759e82f6db1490ce49aa3f65db7adfae9f", + "server_s_pk": "031eebecb52109ffa1eabd1e782302286f8de1b9b4335493b9af8dc3b31f5588e1", + "server_s_sk": "6c4e42b7353fdd5757f825f57aba84b2189165d9bf0748886601472ccf0ce5fb", + "server_e_pk": "02c7c94128872b7e704e6c25f7e41d154bde04bd5905316009a921868650d8c628", + "server_e_sk": "b22d20da1c60c8bc65c1cb3d5903d9295defa66e19f6713a2bfa22b651c5e128", + "fake_sk": "f59972aac89f6c5e6494475ac5e9ec6c1289c4b75fff8f9f42315fee4d1d30d8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "210f31aee122aa5f34912b235b1b7978d76ef3adfaf18b17609bc0c7d0014c5ef9e2b147a8177b1b524b597558a0e288", + "oprf_seed": "9f7af618e55d9a078db6cfbaa773291be9f27cae04aeaf31101d289244a61681444e47dc9a4317b4c50769ccebb4f48c", + "dummy_masking_key": "906bd1ec6453f76d61fbb4bed69ed9f5c309339e7a5452005acc231be03b00afb623aa6571f499baf5a9629ecdc1d97a", + "masking_nonce": "d3308556f4b6464eb79cdb4b8c2b1b980a7b93e5213c6eb37f2b57abe07f0bcbbd573ff51c38c3a0fb4d85997ee045503c203b370d269d70a0f0808478bb3c2f", + "envelope_nonce": "fde05df66c9b323a7a378e969b673c1a4560d7d93105e6083e228c53d5daa9b0", + "client_nonce": "a19c2f626c8b6e61871ba010d61d9edf2a0062e6645b41fbd33f7573b5d75b1b", + "server_nonce": "8b13c2e1a937db97ea922cb14ac1d39a1d4d2f57adc310dfb60bbf3c0bafe86f", + "server_sig_rng": "d3e222496fe38a9fb7fb8866fb355b93384b4204279e0b071b924eb9f0598130", + "client_sig_rng": "3b163e022f8daf1ebb810f0c8263e95628b2be4320a7a8f27871e01683998089", + "context": "636f6e74657874", + "registration_request": "03fb24be423764bc5f7fbd94b24ceb8cbd6634871071dfd976b10cbaa4f1c1ed1ec255c6f82b74a5ed567c5a96011c43e1", + "registration_response": "0230fb1c9268d30b350f28ec747d4684f1806eef0b19ab3c20973ce208cc3e9b6506d7c96833b70b152b3e23c7b1d9077c031eebecb52109ffa1eabd1e782302286f8de1b9b4335493b9af8dc3b31f5588e1", + "registration_upload": "024ee2ff368f3a3d700690ccbdcad6f70aee9dd22d95aa8d8cabf95b7cc8d7a4a449512a7b112119565269f273bb6297843a33f42eaf2445abab84e18d84e013d3f4a0c94e70a80f05f586466ca9c82971859e3e2025044b3a7bafdc7058dd9eb64c087065c98db8c5f5bd0614e89fe3dec0da71950e38f480f305dfef79a5887058c605919629ee5d52453276a5a8c6297c5bb7e446e00c67ca17c2c14a9f3413", + "credential_request": "03fb24be423764bc5f7fbd94b24ceb8cbd6634871071dfd976b10cbaa4f1c1ed1ec255c6f82b74a5ed567c5a96011c43e1a19c2f626c8b6e61871ba010d61d9edf2a0062e6645b41fbd33f7573b5d75b1b164f51c00ac160d370f05cf479009d060c9a5a3cbb578b37d8b4057c2ec6233c", + "credential_response": "0230fb1c9268d30b350f28ec747d4684f1806eef0b19ab3c20973ce208cc3e9b6506d7c96833b70b152b3e23c7b1d9077cd3308556f4b6464eb79cdb4b8c2b1b980a7b93e5213c6eb37f2b57abe07f0bcbdce2f038d1e095a311901d7ab30391025f2fe51ea7e72700f979b24940e31fd1a9b026e2770cb77bba7cf5fea37b286b0766d2a1364a61b35ab20d6ebed54088e2d7d97061e9f9868b7918b16318cfef1dbf3747b40d0f58b952de91ebaf19e030013a813c2208e82f80211a993c2606a2b22d20da1c60c8bc65c1cb3d5903d9295defa66e19f6713a2bfa22b651c5e1289aa947e98bcce96b1c84778a7cfe83de8f6eb6bec6eede3d8332b015749f963446934e574cf701c0aef0a6c29a59feccd3ecbb1f6e14e383a2e48af61426a2be1f07fdac2c80a01936e9cc253b37d32058e642dba97991967aee89b622816b7b220405e44de82fce26c30041a8c5326724c05d20bf1d57006cc58be0990c7063742507d38c865ed9332a215ba0586c360324963955ccb01aa34bb231850dd40b", + "credential_finalization": "2c26747ce823c74cbd2a9be277c6c93aaee68b3d56a7fd0ee32ff38ae61af2e959f39a87e178bee9b649334ea1f2fd5295f539e9c9eac911dc2caea95f3f1eada9ba86dff62c2f85318a6a109eb7b1889c5e53d63423686edcd18c8c3de2a66a602098ccc42585dc7cd198454a547b066023be0e26f1e7783f1cc85a503e2158", + "client_registration_state": "210f31aee122aa5f34912b235b1b7978d76ef3adfaf18b17609bc0c7d0014c5ef9e2b147a8177b1b524b597558a0e28803fb24be423764bc5f7fbd94b24ceb8cbd6634871071dfd976b10cbaa4f1c1ed1ec255c6f82b74a5ed567c5a96011c43e1", + "client_login_state": "210f31aee122aa5f34912b235b1b7978d76ef3adfaf18b17609bc0c7d0014c5ef9e2b147a8177b1b524b597558a0e28803fb24be423764bc5f7fbd94b24ceb8cbd6634871071dfd976b10cbaa4f1c1ed1ec255c6f82b74a5ed567c5a96011c43e1a19c2f626c8b6e61871ba010d61d9edf2a0062e6645b41fbd33f7573b5d75b1b164f51c00ac160d370f05cf479009d060c9a5a3cbb578b37d8b4057c2ec6233ce2d2e836c82252b9d8753e74d9baccf23edd0aaf775e110d49b79d2ea536a10aa19c2f626c8b6e61871ba010d61d9edf2a0062e6645b41fbd33f7573b5d75b1b", + "server_login_state": "024ee2ff368f3a3d700690ccbdcad6f70aee9dd22d95aa8d8cabf95b7cc8d7a4a49a3276f9ea869e445f78f870b22e08f32c3973b69dd40ea9362be1d40795d0251b7a0cd534f74d200dc4713ed95866f94b2cb51c8967beeca2f843f78151017c35fef782d27f4f4981b8155b7c99b93fec65298c666408b69a1f385db8ee9989a9ba86dff62c2f85318a6a109eb7b1889c5e53d63423686edcd18c8c3de2a66a602098ccc42585dc7cd198454a547b066023be0e26f1e7783f1cc85a503e2158", + "password_file": "024ee2ff368f3a3d700690ccbdcad6f70aee9dd22d95aa8d8cabf95b7cc8d7a4a449512a7b112119565269f273bb6297843a33f42eaf2445abab84e18d84e013d3f4a0c94e70a80f05f586466ca9c82971859e3e2025044b3a7bafdc7058dd9eb64c087065c98db8c5f5bd0614e89fe3dec0da71950e38f480f305dfef79a5887058c605919629ee5d52453276a5a8c6297c5bb7e446e00c67ca17c2c14a9f3413", + "export_key": "2121ca7d0941443c9261bdaee7d2cf23d7f5624c3b1abae351f1b82f67776029c9393cdfe045b5ac3a9d9f6121d42161", + "session_key": "9a3276f9ea869e445f78f870b22e08f32c3973b69dd40ea9362be1d40795d0251b7a0cd534f74d200dc4713ed95866f94b2cb51c8967beeca2f843f78151017c" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P521_SIGMA_I_P256_RISTRETTO255: &str = r#" +{ + "client_s_pk": "028851e45a74c4eee10af1b6505a0544a3451ad3702c8dc882c062128d4226a6fd", + "client_s_sk": "384f27cd5c3a2d148b6332216c1690f5232df9f7bd124fa676cbb37600ba3963", + "client_e_pk": "03870a49d6e300005cdc17b3717d226f5f06a77fb96409f85736b511c88ed6dea8", + "client_e_sk": "aa09e883cce0362d2e762ffe0a022105b69d7f003bfd2af7529ff3b206e84031", + "server_s_pk": "034a4a071e6f6f7db72246253a473dd4804755013fbbcf2feecf59610516432db8", + "server_s_sk": "55da14fb1334bb52813086b43f9494fac4029328bb7e9d2cfd36bf0d0d94b4bf", + "server_e_pk": "03d269bd0bb490626433fda4746588b7ad501a086256dd856c4a6ee0e4ec82317d", + "server_e_sk": "6e6d3fa5589c1d0a548d5c75383bebc3a137bd497948a60eee51f3ae65c7c147", + "fake_sk": "a6e17e1d5a67335a87b41b3d4d559c3457fd5b2e4adca4b1e581e309738f4168", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0153b423ee8729e0d3fec0087c06fd4d9fceea446a4736636992ccef7e9a947f6eaf82a502e1eebc52bf69842bdc5d536165abcf9790c42a5ecf0caae4a71ebc922c", + "oprf_seed": "f9d9358d626089c882d032108b4321c342bf2b0d3cd77c0a6fd3eee9399e36b82b04007b0af7af6f1c1388399e0b264236152ecc0eed9a1b2cf59539fdc300c9", + "dummy_masking_key": "a749d5b6effbb77b2216e36bb23d63d5d13f3f6b2584db85f7d6c7eefc1e4d7c9e0b8c5fd8d384d167cd3a7986c0d0cd39d9de7eb107a766c968671c354d561a", + "masking_nonce": "5d754ea83e474710a03536bdaa4e654fb6ac53380f64fa83fc6aaba1915a312c01436bf9df6f48227c1080c839262e5c7756e2a8afc890ed75efc9eeb5ac87e6", + "envelope_nonce": "7e35a81dcd1e074ccb205d18bf47ecee218dfddc2f68f94da838391bd32993c1", + "client_nonce": "e5551cf79c2cc9725282fedb916412af9e712b08f331194b9c85370fe2160a55", + "server_nonce": "756b8dce4633d85fba4e528da5faae64375003bf5d7f2f3f9204a68f9376ef81", + "server_sig_rng": "4cf54637e6bc14cb318a0e60f5ac8fbce669693198f3f6b485fb9e02bfd13057", + "client_sig_rng": "a6406eaa3e4d5eaf2fb8ff9fb7638facc0b41e4a5efe23324df77d63c635c80f", + "context": "636f6e74657874", + "registration_request": "0200c122049ef9fa27c9a100bd9d01edff3cf0663b3638428345da5113aca3e7992280fa2cf44a8fd030e9217a6d0f9be1b94fdfe38e0f1d56e3702e375a9f1db894b3", + "registration_response": "0201be44ad7d14a8d65a4070f2fd9cd084eb3badac32acca74455022c60ec216ab7be0b92200313754d27acf9b37a833c4f8fd5dc3cb51b55c842c9c53479e3b210d3d034a4a071e6f6f7db72246253a473dd4804755013fbbcf2feecf59610516432db8", + "registration_upload": "03d6345f9a2bd66b1b34f495b7164b1a5cacb5b87bcd04d64852b166ddf6b8a6cb708c485da42f702e9415582b05ed17642ddbde58285401e6dc552756a982948881db667e22d3d418da185ff76d4fd17980f8eed651bb8d0e3bea4f1e5bd138d8384f27cd5c3a2d148b6332216c1690f5232df9f7bd124fa676cbb37600ba39638d9135c8a299bba7d97b096bd5ba9a7e272dc6021dae4584ab262b2638233001f9fa99f017e4f0def782f8699a71c69c9e2f2070020aef24e5aa775f211bdd13", + "credential_request": "0200c122049ef9fa27c9a100bd9d01edff3cf0663b3638428345da5113aca3e7992280fa2cf44a8fd030e9217a6d0f9be1b94fdfe38e0f1d56e3702e375a9f1db894b3e5551cf79c2cc9725282fedb916412af9e712b08f331194b9c85370fe2160a5596541e7651c4968f2fbb643d45dbbf5d1415bf423474a07d77c5a40734cf5456", + "credential_response": "0201be44ad7d14a8d65a4070f2fd9cd084eb3badac32acca74455022c60ec216ab7be0b92200313754d27acf9b37a833c4f8fd5dc3cb51b55c842c9c53479e3b210d3d5d754ea83e474710a03536bdaa4e654fb6ac53380f64fa83fc6aaba1915a312c5bd2c6064d1fd1f87098d4295f71f50a9c0b2b7d4624e3ce526e60295acba8dc232b5a1d13cd239e65d309b44895a4a373927a308aeed966c874d577ff6d03cbc150dc52ad81baee0abfca8c5d47377db92d8b8010120175cb0f6ea0a7df4e689861bb48d36601ac7a2baf3bb7251f075231eae87d30606a63ccb29e99d865f4c76e6d3fa5589c1d0a548d5c75383bebc3a137bd497948a60eee51f3ae65c7c147e2f20ab40b4bce8a9adc8648c2cfc99ff0bbfe3573da3b702d6b58f32e1e4050372f9abf901ce49c8e9da3cd53a5531ce48020ed21c5387945416c6e692f46ad2a9a2189a45a40ff5136ddb748eddb44667d7455ac8430321586677f2613977fb7d2369dbbe69b687a54d0207fd957455191140ec3a944fc736882f604caf26aa8cf8b1fe2b376508f9b50f5d6a4962d1525de07ab922517c2763d2c22811982", + "credential_finalization": "6afaed2669514707598e2b207b9680f716b80b184e86c14bd0b7f5e0638657f61cc0c21c0364bfacdc8738310615baca02f2d6c2b19c6100e2e29b4c1f277d9711c31304923ae94eed3e17e2e73377ed9513e101127372f2b27c99d025705c1b47484892e0c2d40791349bf0dcbb34cd3a3ae698a5681969a075f9b5e1d961be", + "client_registration_state": "0153b423ee8729e0d3fec0087c06fd4d9fceea446a4736636992ccef7e9a947f6eaf82a502e1eebc52bf69842bdc5d536165abcf9790c42a5ecf0caae4a71ebc922c0200c122049ef9fa27c9a100bd9d01edff3cf0663b3638428345da5113aca3e7992280fa2cf44a8fd030e9217a6d0f9be1b94fdfe38e0f1d56e3702e375a9f1db894b3", + "client_login_state": "0153b423ee8729e0d3fec0087c06fd4d9fceea446a4736636992ccef7e9a947f6eaf82a502e1eebc52bf69842bdc5d536165abcf9790c42a5ecf0caae4a71ebc922c0200c122049ef9fa27c9a100bd9d01edff3cf0663b3638428345da5113aca3e7992280fa2cf44a8fd030e9217a6d0f9be1b94fdfe38e0f1d56e3702e375a9f1db894b3e5551cf79c2cc9725282fedb916412af9e712b08f331194b9c85370fe2160a5596541e7651c4968f2fbb643d45dbbf5d1415bf423474a07d77c5a40734cf54561e459bac47aeec51dd9bda5b832347737dc190b8414d782306f98e27f7667a0ae5551cf79c2cc9725282fedb916412af9e712b08f331194b9c85370fe2160a55", + "server_login_state": "03d6345f9a2bd66b1b34f495b7164b1a5cacb5b87bcd04d64852b166ddf6b8a6cbd387e935eee462e9b56a74b3d60f137f0db58587fefcf1a86fd8c78b9285610ad37629f4f299157a4f844e45cd79a69d42a7a1c57408fc36c4d4a6799d00ab5d357c2e9e06da2a8b54114bed0699e9316d7ff2620981b7d78260ddb79650b9d811c31304923ae94eed3e17e2e73377ed9513e101127372f2b27c99d025705c1b47484892e0c2d40791349bf0dcbb34cd3a3ae698a5681969a075f9b5e1d961be", + "password_file": "03d6345f9a2bd66b1b34f495b7164b1a5cacb5b87bcd04d64852b166ddf6b8a6cb708c485da42f702e9415582b05ed17642ddbde58285401e6dc552756a982948881db667e22d3d418da185ff76d4fd17980f8eed651bb8d0e3bea4f1e5bd138d8384f27cd5c3a2d148b6332216c1690f5232df9f7bd124fa676cbb37600ba39638d9135c8a299bba7d97b096bd5ba9a7e272dc6021dae4584ab262b2638233001f9fa99f017e4f0def782f8699a71c69c9e2f2070020aef24e5aa775f211bdd13", + "export_key": "664364590cb1b3db9947191db4ff9524498f2aa432f660d680d7798a1e84ec69898017ccc8514afb38a57a7df55cd585212b17c4eb186683724c6520e3e1a3f8", + "session_key": "d387e935eee462e9b56a74b3d60f137f0db58587fefcf1a86fd8c78b9285610ad37629f4f299157a4f844e45cd79a69d42a7a1c57408fc36c4d4a6799d00ab5d" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P256_P256: &str = r#" +{ + "client_s_pk": "02746b0fe7c28d2105570120044e875404f326cdc0c18e421275df0083d2308af6", + "client_s_sk": "4607441b89d0c5bc1d109a8582bb94e1bfefd40d2951b9f60a86b7e6e9432f45", + "client_e_pk": "02f25edc2d8f2337973c82ad6266c729ee9495f62560f9a93582009b29c4afdb1e", + "client_e_sk": "7876aacf3f230095f4c0937c92007a62881641369444bbb4427b78ca35113bb9", + "server_s_pk": "02ca442201e759147f521571e1796c28a3cc23f951e787823dce0d5d7eaac0604d", + "server_s_sk": "845b47d2a49e51605cc59e46dff01d33ff11078c8200946564259ad7d73f4c64", + "server_e_pk": "03ccba2c027ba3d60e6cd307ef4bba458133c86173cf40383a3052f9a7787d9cc5", + "server_e_sk": "c122f96b1f983c2ffa85f7329ec921312a15225e896b027cd4360bd7865ad982", + "fake_sk": "1e03c615cffd9885e6c7f4fc4ddbf0895d4b3f47ac1649d36125e34b289e0478", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "9b627e6214819c2d6a10570f9e46ff01f22a0e63f8e0d3c678ef78869eeba00d", + "oprf_seed": "31d85ee1fc180a20a3f17421851002b9555f26fb0ee3c7f2cb0e7e5297b857c7566f2bc6b1290088e35e877495c4eab89da3540a56cb1d10d9707e57a960c0d0", + "dummy_masking_key": "fc8d800e0e09d8bbfb39f43d9a9df19c2ff9db3d453e547bad42edd44e136ff96f051c7eb3826d84e13a75281364aa4c8565062fb5f587a4779092ceecc9386e", + "masking_nonce": "b7432be6e9aeb978ace4cf5a4afe3deea8df347891b209e5bce47b37a5a7fd88c0d45fafb5562c0d3837e6f71cceef4474bc1117d01b76d7119851e71af8792a", + "envelope_nonce": "3ac182dab9e4bf9362cee37717f4742b5bd175f4bdb2a341c83eef0bb5af2fe1", + "client_nonce": "d21d44e013ec1b9f0f9d315e60069befbca75b244584fd860313f756cf422091", + "server_nonce": "e90891938123d59317f040dcae5083733981a8c675eda2e76b31ae0ce6390878", + "server_sig_rng": "6afd7048f6b01a8e8a637430f4b54115c143d6a5d1e47100ef43d2353032fe4a", + "client_sig_rng": "c09fe513bb7426c29d259899b87d0762a99d89fe3771389daff9b62411b581c3", + "context": "636f6e74657874", + "registration_request": "c625a93d95bf186d85e29aadc01ad9a4335204db269ba9c89e5c6030739f4c74", + "registration_response": "acbb587a3ae6d3d899104eb4a25eb85633a1d4c1106641e254b408426a55e52502ca442201e759147f521571e1796c28a3cc23f951e787823dce0d5d7eaac0604d", + "registration_upload": "02e444a6e87a636e1c7d5761a5b23ed067cc414c9e1943bd6b91bfdf734b00079387524d2930634934d784458ddc21a287b946a4e585201558d919594e5ff49578a75b185c0eb412fee607c9052f1aeb791265e6b2228d1ed63c26a632014620fc4607441b89d0c5bc1d109a8582bb94e1bfefd40d2951b9f60a86b7e6e9432f453a247e10768cb1dacc9a3ad51797520222122f450eead1a093d508a4dfa7dfc698141aede8b99ca9dc9182ad70a152028e00f8a159b61d8ca91725838c8449c2", + "credential_request": "c625a93d95bf186d85e29aadc01ad9a4335204db269ba9c89e5c6030739f4c74d21d44e013ec1b9f0f9d315e60069befbca75b244584fd860313f756cf4220910243759941226708769bf069f0a2c6a99be6e8e4868fce8a5d0ab51d72d38cfeb0", + "credential_response": "acbb587a3ae6d3d899104eb4a25eb85633a1d4c1106641e254b408426a55e525b7432be6e9aeb978ace4cf5a4afe3deea8df347891b209e5bce47b37a5a7fd8809d9ab7843d6c6cdd12bde702e71a088a40b1122986d8fc37f2a45e6d21f69b0a1cdaeacc33a88f5f3763748e3cbcc426bd89b2863452f662fb8500f27ab753b0759d17d570af3ba49aa88e7d9460dae815cee26fea7d2a6ea2c757779ea1d40c2547d899b239efbc8b3bd8749ef310436df040fb80d19b8f663a29e1c66288cdac122f96b1f983c2ffa85f7329ec921312a15225e896b027cd4360bd7865ad9820205111de8790def5429a52bc56c0af5c5b045d9422af457557968c0a96982a453464b18bb108dd006197a7daf69791d08aa9b341ef5d1154a07a66b50a634f448be97e73b1ffe9d7ea33d76f2da32f5d7235fd84595a8c8c5d5fa3ba5d6e711d5c0e39fb2225c9ba9c792dcd37f1b94d46c790f6d3d128503fea1047c820c9279", + "credential_finalization": "93a8b193af7dae2d7a6c072292116b8c79fe4163fd0473ffc0fe336a3f84917d3bf7a0148e460e7da950a0cb71627d4cfe755062e622442aace15280de0c9c07c1ec412edc1c56e42251151feaaac435f8e57b9c11ca8116af29924c23f209ca", + "client_registration_state": "9b627e6214819c2d6a10570f9e46ff01f22a0e63f8e0d3c678ef78869eeba00dc625a93d95bf186d85e29aadc01ad9a4335204db269ba9c89e5c6030739f4c74", + "client_login_state": "9b627e6214819c2d6a10570f9e46ff01f22a0e63f8e0d3c678ef78869eeba00dc625a93d95bf186d85e29aadc01ad9a4335204db269ba9c89e5c6030739f4c74d21d44e013ec1b9f0f9d315e60069befbca75b244584fd860313f756cf4220910243759941226708769bf069f0a2c6a99be6e8e4868fce8a5d0ab51d72d38cfeb0b54f46626347a5228bc234fac42c55da6806996ab16fd22448f1cc17a0efabb5d21d44e013ec1b9f0f9d315e60069befbca75b244584fd860313f756cf422091", + "server_login_state": "02e444a6e87a636e1c7d5761a5b23ed067cc414c9e1943bd6b91bfdf734b000793379569ef99babe8e5a5ab10a6291f7a7c0d9a3fb748906cab250f76d7d96cab4ceb38262df1a71632d85f40b9a7a46def38e2d66123f29677750645ab411ca5ec1ec412edc1c56e42251151feaaac435f8e57b9c11ca8116af29924c23f209ca", + "password_file": "02e444a6e87a636e1c7d5761a5b23ed067cc414c9e1943bd6b91bfdf734b00079387524d2930634934d784458ddc21a287b946a4e585201558d919594e5ff49578a75b185c0eb412fee607c9052f1aeb791265e6b2228d1ed63c26a632014620fc4607441b89d0c5bc1d109a8582bb94e1bfefd40d2951b9f60a86b7e6e9432f453a247e10768cb1dacc9a3ad51797520222122f450eead1a093d508a4dfa7dfc698141aede8b99ca9dc9182ad70a152028e00f8a159b61d8ca91725838c8449c2", + "export_key": "39cf7dd5c32bab318859b1a1cb766a5ff417075a2fa81004db7f2b91ab79cfa047e59b74998a0305b08b1ff715630d6cc4efc11d9f7e938ad672ea5b266c105c", + "session_key": "379569ef99babe8e5a5ab10a6291f7a7c0d9a3fb748906cab250f76d7d96cab4" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P256_P256: &str = r#" +{ + "client_s_pk": "03ef2b35adb21c6d3137583600daf903b7490200a9a8235bdde60c33d4ee5721a2", + "client_s_sk": "583b9c89dbbd1e3dfd1c194aadf784c2c76296e540d43f63c4376ab983785063", + "client_e_pk": "024645a914c7330d384f5bad6a698d90ce39a58bbc3eba8aedcd5808fb4979004d", + "client_e_sk": "657f1e432f71be5ab8478a2f344339cf22c9ca66779a15a5c5c71baab4986d00", + "server_s_pk": "035a18d5383289e4f0ecc557583e29d87a89dfadf5f13227690f5caf6eeb350aac", + "server_s_sk": "9eedcb744d2319d25d389b79d39dbf95f4f99b046f9cea1a87783aa47b67deea", + "server_e_pk": "0232b43e151523ed25e5e3a747e65fda6b3769f1cce4869e4c10057785e197a71e", + "server_e_sk": "491e34691a818322c46257739e918ef091acbcb78071bfd3d4d094bdd6ccaa80", + "fake_sk": "e8c3f63e8797d7b784eb1f56549787cae6e17c9d864579bb100dbb29e3ae518f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "663516f5c729a0f8ef2e5d21f54f4e3fc9d9dd401525e2dcbc120cbaceff2b00", + "oprf_seed": "4a45174dfe4d297e3ab2f0ec2a2f441459ab547cbf73ed7231d3323c39b7dd71", + "dummy_masking_key": "c609681ef529c12c2d1a5cbe7760cb2f28146f76e16b96811113269a5f0b6d51", + "masking_nonce": "3dfb94b48fb4c9d418a4f806c3da890e5cad70c945ad4b51a2b603f88a166ca735be88e166713ffe0a7ad35111d739565e2fc7c4a6ecbf2a6689156ff070fef8", + "envelope_nonce": "894f2ddc52d736eec0fbea1111920b27c94fa237235f37b5fdf1257cb7cb49fc", + "client_nonce": "f3553fa98220fbd57d125c0f9ebdb9fc430395fa573e597b3c091ad96e502620", + "server_nonce": "ad51eb9d5112da54c12343393998eeb44d65c78cb9ea96a182357156dea4cfff", + "server_sig_rng": "c03a45191b39a4bf88a72e5696e75bcd0cd0290a23b008dfb7ccf1ab805fbdf7", + "client_sig_rng": "0e9ddbda1881b545bb14c1f4782da69e53eda4bd7422d648962cd3329bac1d61", + "context": "636f6e74657874", + "registration_request": "02867e5fcd8b88b20c9ade19a0448402fc90258bca848088171c1b3d59253fc6e2", + "registration_response": "03e64be4c6fd9eb717d6e4b3332ddfe9d97a8c7eed70887eac2c09f4d932e253e8035a18d5383289e4f0ecc557583e29d87a89dfadf5f13227690f5caf6eeb350aac", + "registration_upload": "039560be3a85b9529b06b664f72969cebf53683c198710d049424be3834631081bd4df0c13c61b3d7e37243cd2f4f2fc8ff0694ac85b05b6d0033d5ad8e14dd52d583b9c89dbbd1e3dfd1c194aadf784c2c76296e540d43f63c4376ab983785063c6b668ec5e94331de9efdbe316ffa7a01c4d716ea9328d6be3a109df33f1b477", + "credential_request": "02867e5fcd8b88b20c9ade19a0448402fc90258bca848088171c1b3d59253fc6e2f3553fa98220fbd57d125c0f9ebdb9fc430395fa573e597b3c091ad96e50262003be9aa1204229723f6a0a690eb2a043e22c65090e4964c13fc5e61347d592a3ac", + "credential_response": "03e64be4c6fd9eb717d6e4b3332ddfe9d97a8c7eed70887eac2c09f4d932e253e83dfb94b48fb4c9d418a4f806c3da890e5cad70c945ad4b51a2b603f88a166ca7987de41f2e4df8ef6546ce35288b17cf4e1e0713b9e461716b7cafb936a08d7aee497d22faaf6e978e5b3b2dd5411670a1541c769fe045ae670787cda14f5aa6617df00356e698c1d4f097b7007d20b46b84999a0dfb9c02ee92c6cdafe2b57a28491e34691a818322c46257739e918ef091acbcb78071bfd3d4d094bdd6ccaa8003819041fdb70d6db0bed1c200e7f89093c797f3af980d4542d0b3ec97187369de977864f20fb099ea9de9f80b5dc76906ba1fd73de382e76299ab68a9969fb2af8f549f5d3acedb375d4632282edb24cc68de4d1fbb77018da373c224a1fd176cdebb535d22556d17cad2934e2899c496b28ded1a19c9ac664f078a8b20763c87", + "credential_finalization": "56a9167f67cfc11c73e932cbe1387642d8c181d2d5d51fed6b5b428711d6a3d7f63c211b52adf259ad4f1f1e8d915e59d692e28fc334c0210a4208253648cb3b2c4b629d2a52c700dc7c3508eb888ba7595c54c38461d3e9b3b157630d8490c4", + "client_registration_state": "663516f5c729a0f8ef2e5d21f54f4e3fc9d9dd401525e2dcbc120cbaceff2b0002867e5fcd8b88b20c9ade19a0448402fc90258bca848088171c1b3d59253fc6e2", + "client_login_state": "663516f5c729a0f8ef2e5d21f54f4e3fc9d9dd401525e2dcbc120cbaceff2b0002867e5fcd8b88b20c9ade19a0448402fc90258bca848088171c1b3d59253fc6e2f3553fa98220fbd57d125c0f9ebdb9fc430395fa573e597b3c091ad96e50262003be9aa1204229723f6a0a690eb2a043e22c65090e4964c13fc5e61347d592a3ac3da7d1a6ca092af676d0e8f1135bc94a40851ca684a85aafc7fc4b4f75a2d6fbf3553fa98220fbd57d125c0f9ebdb9fc430395fa573e597b3c091ad96e502620", + "server_login_state": "039560be3a85b9529b06b664f72969cebf53683c198710d049424be3834631081bf259cc9e54576b02acc2e016fc6eacb74a2a5c0e30e6149c6365fbbb76aa52b96e5c2b7cff9c14da64009cd8b641037bc9cc5d4ccbb0acb309b9c645797df21e2c4b629d2a52c700dc7c3508eb888ba7595c54c38461d3e9b3b157630d8490c4", + "password_file": "039560be3a85b9529b06b664f72969cebf53683c198710d049424be3834631081bd4df0c13c61b3d7e37243cd2f4f2fc8ff0694ac85b05b6d0033d5ad8e14dd52d583b9c89dbbd1e3dfd1c194aadf784c2c76296e540d43f63c4376ab983785063c6b668ec5e94331de9efdbe316ffa7a01c4d716ea9328d6be3a109df33f1b477", + "export_key": "bb804e2fbfb98f194ae8e8e4e2fcedff072f7c8846376d20f35ab2b162dc27fc", + "session_key": "f259cc9e54576b02acc2e016fc6eacb74a2a5c0e30e6149c6365fbbb76aa52b9" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P256_P256: &str = r#" +{ + "client_s_pk": "03b844feaeea4563393c84bf23b4dfdabd32b17726514b026df72465e12eb3674f", + "client_s_sk": "2ea86bff2f219cfe908c1831febd3dc7b364f20fb0722e707b41604d19cbda02", + "client_e_pk": "03e67a019ed4272c411e4dd886c9fd2ff7227b04bbb30828bcad8bde47d405ada1", + "client_e_sk": "d4fb934110b5cf0e940b27fa1484564123476909b474206d05fd3d0dda7b68db", + "server_s_pk": "029c319f319af1761d2ec4c037eb904889cf2faefcfb062e84e7b2a6f07756331e", + "server_s_sk": "fbde676b2aaa4d90cfd174e815db099b8750f413bfb80f552f29d22ef0555296", + "server_e_pk": "0371afe0e5f80dd1e226dd7116d58a8d5f5f2a9d0db1b435a7cf8df4a3a7f41925", + "server_e_sk": "d36c622620a9fa085d34b47b3486e43154af50536f58a8ce81204b981ec54211", + "fake_sk": "28db2a12f53cf24fe7dc7bd90cf57d0712b87cf6009f81bf364e61d36c059f1f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "b76e736fe0be4fd9c05aff1f751b18f81ac6a17a680eb649a6eeb847b9fd4ca1ff54bc828fc70ae4a803d7d71b205489", + "oprf_seed": "5f8dc3448c2539be2026cddc03ed97d6ba3a29d477b2a57feb15c5de568940182812fcc68a9265fa035cc8dbefc7025c", + "dummy_masking_key": "08b1ddd4301de8356d382260cac0662b9bf37206cbf9faaa63b201360bfbbc8aa73a97f8ee658e8edd90d6c8a3d85c99", + "masking_nonce": "0265298226409529fb158926c9231fafc5a84b8b925c80bd94accca7b2bf5af40f19816ceb6a114118a2abfbce8b999d8da6528257cbac626a045273c47cf78c", + "envelope_nonce": "5d9329e7624000c498a3d26ec91f0d8c82138328debb532fcf84907f5abd78ed", + "client_nonce": "c09365e932808de7634b68700ce24663d0f1c4826c10d302088d3a28ff5572d0", + "server_nonce": "5a1381de1e3a545efdfe48209859818c3bec868daa0283baf1290ac26c7ac292", + "server_sig_rng": "cc7d146e21b141da95b2ef9f6b0b117f56738d43639709774eb43b8e326f4757", + "client_sig_rng": "7f84ff83b6c0fc24ab6575e6d7d2d344c73562bdcc2ce528c01696c2d454934e", + "context": "636f6e74657874", + "registration_request": "03590e05a9108e66ea28f8fc5e787d3a4d1f797ac21858ebd8650a9f3fe8cd476c0d4b0af76826993ed2e1227b3557220f", + "registration_response": "03a56b5fbb7af67d7f5ece2c40c054ac4b375ca00754a1966bb291eb1c5091cbc704eb4d30e50125cad92be9261103e018029c319f319af1761d2ec4c037eb904889cf2faefcfb062e84e7b2a6f07756331e", + "registration_upload": "022025706de85dc400df5eb7534f55c02b72487bcb2d9028c979f86fbf86cf354c0c445bc295ddbe989e1c11871951677021b178d2e7f6691785c480eddd9c817f5e3ee93df931c29282f2ac25b2e1d9f12ea86bff2f219cfe908c1831febd3dc7b364f20fb0722e707b41604d19cbda021000fc936a6128080eea22e9f27419508363836d7de76e4d61186f61e7214dbe2b5368a81b09ba06e28ef6449e2c6de9", + "credential_request": "03590e05a9108e66ea28f8fc5e787d3a4d1f797ac21858ebd8650a9f3fe8cd476c0d4b0af76826993ed2e1227b3557220fc09365e932808de7634b68700ce24663d0f1c4826c10d302088d3a28ff5572d002c2757ce9c5f965507c1d4bb8b6c3ff8bab75b3c99c8e700a886084694b9380f0", + "credential_response": "03a56b5fbb7af67d7f5ece2c40c054ac4b375ca00754a1966bb291eb1c5091cbc704eb4d30e50125cad92be9261103e0180265298226409529fb158926c9231fafc5a84b8b925c80bd94accca7b2bf5af49da42622ab287d66a18d2771b691dbe195d378fb0fe14717b2c094ad603c3ae597935ab07bad4d27db0fd72f60d9d029064592b6b02fc6ab6a59a633679c0a0e0f8e3947550ecb69f6c6230cc6f758ab1cad00c4fce6a804e66d3414f31582e1b8e9c9b431d6f17ad5d784d03fc2422fafd36c622620a9fa085d34b47b3486e43154af50536f58a8ce81204b981ec54211025effa28bd8c36921004e15d18e15c6a46d4c157f63dc29cea080f49374caee3728a9b6730af331ca7bdd15adb0bb808ec084f86a4f0f15fae2894ac508b9ebb74f0313c86ffe627a9338ad99b90dc2507bbde4a1bc0f82270d567359a006271778f2790e75b287b7b52a345d5ddfdc37c7f1ddbd1667e021150eefc1e270353d", + "credential_finalization": "1ca192d404afc784469c3590e4ce169e819a6b6df9d6276887e68eedc9eb92176a2849e66da7c126135f83711c81ac0a2d78241689e1fc986f8f4046bc01174059046024d994fc2759c07d4b6b9eb0403630b9bfc757f9c0fd7331e338d0c17a", + "client_registration_state": "b76e736fe0be4fd9c05aff1f751b18f81ac6a17a680eb649a6eeb847b9fd4ca1ff54bc828fc70ae4a803d7d71b20548903590e05a9108e66ea28f8fc5e787d3a4d1f797ac21858ebd8650a9f3fe8cd476c0d4b0af76826993ed2e1227b3557220f", + "client_login_state": "b76e736fe0be4fd9c05aff1f751b18f81ac6a17a680eb649a6eeb847b9fd4ca1ff54bc828fc70ae4a803d7d71b20548903590e05a9108e66ea28f8fc5e787d3a4d1f797ac21858ebd8650a9f3fe8cd476c0d4b0af76826993ed2e1227b3557220fc09365e932808de7634b68700ce24663d0f1c4826c10d302088d3a28ff5572d002c2757ce9c5f965507c1d4bb8b6c3ff8bab75b3c99c8e700a886084694b9380f078ffa682e6f7a00ae8eef3f3dc85934e1eedb9816c4bf790cbe199cf13a0cb30c09365e932808de7634b68700ce24663d0f1c4826c10d302088d3a28ff5572d0", + "server_login_state": "022025706de85dc400df5eb7534f55c02b72487bcb2d9028c979f86fbf86cf354c23e93949de33c982a42fbf1a8be05d719e74e15459fe62cbc39b5c8c111ecd32f0a8a3bcb45b84d89d619234ffc80ec6ad270bd8a888f151b4ee19077dc6986b59046024d994fc2759c07d4b6b9eb0403630b9bfc757f9c0fd7331e338d0c17a", + "password_file": "022025706de85dc400df5eb7534f55c02b72487bcb2d9028c979f86fbf86cf354c0c445bc295ddbe989e1c11871951677021b178d2e7f6691785c480eddd9c817f5e3ee93df931c29282f2ac25b2e1d9f12ea86bff2f219cfe908c1831febd3dc7b364f20fb0722e707b41604d19cbda021000fc936a6128080eea22e9f27419508363836d7de76e4d61186f61e7214dbe2b5368a81b09ba06e28ef6449e2c6de9", + "export_key": "ea9c613e7cc16d20e2ea3cdd1c3c9193e77444643a2bb0d676a74144e85964b7c6f75c575f1318874548adfcd0118930", + "session_key": "23e93949de33c982a42fbf1a8be05d719e74e15459fe62cbc39b5c8c111ecd32" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P256_P256: &str = r#" +{ + "client_s_pk": "026c0e59a2216018be8cd45cce9d82d91047f220b2a2bb3cf9a5d544e61dfdf769", + "client_s_sk": "9521efc548f53938c679b8f5cc6e215bc939aee588b9656fcbcf39a68100eb6a", + "client_e_pk": "0360bf26c86d3f3a5337efe5424fa403d94285aac85bd42e206f71110c9022b5dd", + "client_e_sk": "3067e10b13bb0f46c09697f1b1fc69ab7020d8548628cea8baa9931bfe056c3b", + "server_s_pk": "03a284fd621c4e334487064abc72c0b63420a28ee5822bb4640c245b3a833efe7e", + "server_s_sk": "23ff33a0be688c0ab0d4c295f94a77c03266503f9ec6a2180a5b4512de8bd127", + "server_e_pk": "024376df1e5f97b29bfad901808d76698e915a801dea32aa658bdf907830fab68c", + "server_e_sk": "7610b064724d5abb707e0377b901f06f8f9f902e66a1d18c440614ce8fb5ba59", + "fake_sk": "f7708c6f905d83533310c2f1d473a72a6ea872d9d367cb8b88665a94c0f76b99", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "009383b1df30344b17be81708ca24838d71b36c5a0c8077b7cc55a7febe617ad85d7f1785e23cf65a0d655438eb427aa952f7b8f036914f3528ea641a2bcdc5dbc6c", + "oprf_seed": "ddd1ba53d5afa60db72f407d4de8a06aaae7a338f50c9cf13dc1b967be3c56e989c728c808fafe968b71c4412ee498a8688e7d74989585ef80e5a8714febfdbf", + "dummy_masking_key": "3312ba276db91d73c0dbeb589dbd9b63aeb0c6ec174b72b149f13d23cdcef2038300ac369f77e4ab472c1649aa258322d3a3097c70885e7c248f7aa97d3a9e77", + "masking_nonce": "ccb7362b82766834744c46787956ac09419504caef73b2aade0d847bf7e2fa587bd423adb392c2e21981f1e4f9245417e347433b7d301c9770908d9d01eb89f6", + "envelope_nonce": "0a4dc7ada6e3743fc81b043d7384425a008a0be1c52c24e5ec6709fe6aabeba0", + "client_nonce": "3400ff674b79a62eb272b8980a7d00b7afa032baa73f8bf575156a81beff500f", + "server_nonce": "4384069e25881b23cc2be4f32c3a83658f8c75dba6a12bcd8741973236638f13", + "server_sig_rng": "3f4f4e8b4999d2bead6ca958b0e778219b13ef4a4aeefcd3cc26ef1282e937f7", + "client_sig_rng": "2192ec160071e1b551748fe723c99634e230bce35c211b7612cb20467ad72619", + "context": "636f6e74657874", + "registration_request": "0301a010124777de5bc19b59e2cb5d5e23d3188f4810199b07621c88bcf3115e3717f7dcbd800cd7626889a96c650de8260078c817578d5c60cf2d26f8b471ad2b9d05", + "registration_response": "020163fcb5d71e6832f9d975124a1fd48c226e82e3bcf77f7d3021492bee67421f627ded7bf85cff0667b7c6be9bd0e2c71827265f46bafaf8cbdeff17acc511872cc003a284fd621c4e334487064abc72c0b63420a28ee5822bb4640c245b3a833efe7e", + "registration_upload": "034e2606fb218a69a5831f5ec35a65f7066fc8cf5ebfaefa289b337fcb8d8837906344a7eeb3f278e97e987dd8c6aa8c256b8274e0c5cd48e411a366611ad20bd73fedda992d21eeb3f058c2880377e27a22801cbddcad2c86758818e4096fe6949521efc548f53938c679b8f5cc6e215bc939aee588b9656fcbcf39a68100eb6a05a5f89afa69637eb48de9f9532461f366e13113eb1b6f0d650d3869540da7ca0757acc8cec30438d16de2525a779aa5935b8422b69747ac1514bacfb035aab9", + "credential_request": "0301a010124777de5bc19b59e2cb5d5e23d3188f4810199b07621c88bcf3115e3717f7dcbd800cd7626889a96c650de8260078c817578d5c60cf2d26f8b471ad2b9d053400ff674b79a62eb272b8980a7d00b7afa032baa73f8bf575156a81beff500f028e5c7ffcc2c6d132c4fea2f045f71812e57291b616a5dbd4e77df32d4b2032d6", + "credential_response": "020163fcb5d71e6832f9d975124a1fd48c226e82e3bcf77f7d3021492bee67421f627ded7bf85cff0667b7c6be9bd0e2c71827265f46bafaf8cbdeff17acc511872cc0ccb7362b82766834744c46787956ac09419504caef73b2aade0d847bf7e2fa58a1b696a8bacd77756d22ea4109fd33eb7f6572f0962c23e36ee90036713ca134920767a099605ad52210821421e500162657a43640a8697f3f2a24d90301965f6d96102579ce0735bfd2693f5a6655e78cb42085fe7ebfd3c316a4e89198ce20bc8308d5c9b7d31119ea5d4dec0101f6a70129dcb1aa72e081997ed0a70a6447797610b064724d5abb707e0377b901f06f8f9f902e66a1d18c440614ce8fb5ba5903e5c7023c4e49b3e88beb613a05bdb73c306f74d66edb3d7954c20a8728d5912e235450992e958bfb0141266ff9fb63eb1d9063466e378167357b9c351bb7561f853e61c1f1215c51ea0a56a83b13f6454d3bc5d125b8753b527f80f10da4eed81cd8206a4189d9b0d91e09b27db87105761c4a5b3c030b5b2add45c01f3a36a7", + "credential_finalization": "c4015c2d475b953fbf264ddfa3de91b98e74e22d20f2de7129a1db8e21d155245059a3be894392c0f787e81f8ff8e614994d20cf5c3a9e871bbfd074911e4e8cdb8887730d62f0bc8a76f14a1d2cde4fc0de929505fa2a879e8ce16e156803f9", + "client_registration_state": "009383b1df30344b17be81708ca24838d71b36c5a0c8077b7cc55a7febe617ad85d7f1785e23cf65a0d655438eb427aa952f7b8f036914f3528ea641a2bcdc5dbc6c0301a010124777de5bc19b59e2cb5d5e23d3188f4810199b07621c88bcf3115e3717f7dcbd800cd7626889a96c650de8260078c817578d5c60cf2d26f8b471ad2b9d05", + "client_login_state": "009383b1df30344b17be81708ca24838d71b36c5a0c8077b7cc55a7febe617ad85d7f1785e23cf65a0d655438eb427aa952f7b8f036914f3528ea641a2bcdc5dbc6c0301a010124777de5bc19b59e2cb5d5e23d3188f4810199b07621c88bcf3115e3717f7dcbd800cd7626889a96c650de8260078c817578d5c60cf2d26f8b471ad2b9d053400ff674b79a62eb272b8980a7d00b7afa032baa73f8bf575156a81beff500f028e5c7ffcc2c6d132c4fea2f045f71812e57291b616a5dbd4e77df32d4b2032d6a90d143edee0ff96a3edc95be10948160344b330a39ca6f9c73a3660814f5bf73400ff674b79a62eb272b8980a7d00b7afa032baa73f8bf575156a81beff500f", + "server_login_state": "034e2606fb218a69a5831f5ec35a65f7066fc8cf5ebfaefa289b337fcb8d883790aee5782d2274bab0f3e0360613a97c4ebf2c6709a5db39657a13658cacb0025adbd9dcb10d0907a25db80dae6b91f618b663c24e87e0d3f0cc2e84da09c26bd6db8887730d62f0bc8a76f14a1d2cde4fc0de929505fa2a879e8ce16e156803f9", + "password_file": "034e2606fb218a69a5831f5ec35a65f7066fc8cf5ebfaefa289b337fcb8d8837906344a7eeb3f278e97e987dd8c6aa8c256b8274e0c5cd48e411a366611ad20bd73fedda992d21eeb3f058c2880377e27a22801cbddcad2c86758818e4096fe6949521efc548f53938c679b8f5cc6e215bc939aee588b9656fcbcf39a68100eb6a05a5f89afa69637eb48de9f9532461f366e13113eb1b6f0d650d3869540da7ca0757acc8cec30438d16de2525a779aa5935b8422b69747ac1514bacfb035aab9", + "export_key": "104248e2029a3b0c9501216947c2a5509b3fbc8a424392963d571b937a502f4f4d7e0eb462abcd9167e204ddb69f48201bac035ae909a6726db3bff523c990be", + "session_key": "aee5782d2274bab0f3e0360613a97c4ebf2c6709a5db39657a13658cacb0025a" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P256_P384: &str = r#" +{ + "client_s_pk": "02ef9735e49697b7c651bdfb7aad4fbb468bc7c2f5a759eccc31355869053ae0f5", + "client_s_sk": "fa9e07504e0a1401f32778d30b9625458c38157de2660fc4755c527b6b5cadd9", + "client_e_pk": "02c099859a971642578c22f7584665b5e4ebe82b8606c35886f40304cae3daf7f0", + "client_e_sk": "a365bc8397f2d6158383ab33ef27589468c89e90c435070259aa63b5770bf038", + "server_s_pk": "03255245fc4eef1c04b69a34cff94e0afbdb7ced9f1b484ce6c377dada170283c1", + "server_s_sk": "41f52b0acd4c45f53eba8ffa5e6df7f6f5f4da674404a0e7436745d54f43cf6d", + "server_e_pk": "029942602db5b55200d83d10e7f2190f2cea544791fe1a1d835d5f5f4c7c2533e9", + "server_e_sk": "d5b46d485e83f1a09dbe423314a50ddfdff9600ced5dab3d2d74d9ce52b2719c", + "fake_sk": "c5dc6a5ba8d06347df6e4e44c5f5359c994745eb8538a7a4757704c142215545", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "157c299808da104030015cdfaf8de29e1088787664e350d0845a7ca7bae7a508", + "oprf_seed": "fdddccac4af8ad4eb0bb5a1dc9ec70ff5dfc04ba243287aa7679aa3f6e5e41bc786d9afea348f43d8a3b997d0afeb565846e48b5aa6b71a442631005288e6ccc", + "dummy_masking_key": "1e3987e5548f548fe181f2d54038dd4cbbb08f6609a0b2edd7344514a09fa165a87088e65111c9da4d9cbd860c69e35b2da1f0fd8ab46215e7d38b1eb556508d", + "masking_nonce": "fcc6938747e550f12099fab6540ff5af2f130018dec1ba41b2bb95b30a2ffc996cf38a5373ee8bc441764f5a742df250d6b127472edc59e4c30a8f51f6671fcf", + "envelope_nonce": "00743688a87a74138905971ba00e4e2d35cba9a7571c4598bab5e8ec7aa0155f", + "client_nonce": "5fa377eac49626e4d5fd21f3b843bae5983dcabdf744f06419e7322a5c84ec12", + "server_nonce": "c998c1fc0a7d2910817dcc7ece228dbeae3b884f2fc4d2d33f4085b09d96dc64", + "server_sig_rng": "ac873fda065d1f744793771d6dd2ee9f88f422e3a93bbfdd694fa073a9931512", + "client_sig_rng": "0826e5ebb92dae438f851381639e01de5a6a3a75b1f3db6f6226918eeceea343", + "context": "636f6e74657874", + "registration_request": "6e159f22b7d0092039c411d8cb9a14d711b86abfa92965fed809621b67920613", + "registration_response": "5801a8609731cf9ab2bbf425d4eda9a95de37f7304b58ecadfdbe9ec41af265a03255245fc4eef1c04b69a34cff94e0afbdb7ced9f1b484ce6c377dada170283c1", + "registration_upload": "02a2ff0ba90334c88c9dc7bd4b3eab2565e04e8bd3d7202b06ab41de633a3d22206b0bdf8c7e6589f251b6dcbf66826da4256b5c66583d5c16722f88337fffe2b67ad655a90aa87a4acdc0c758f1c54118089ad492ebef256a5248f4543eefa1a9fa9e07504e0a1401f32778d30b9625458c38157de2660fc4755c527b6b5cadd95de4350013ef89f31a3dbf31293cc323e5c0ee849249e020d21c53a13c2460b69534f6cc94b7385d8ec12cd310441c05e46babb18138420213cdfbdd388b643c", + "credential_request": "6e159f22b7d0092039c411d8cb9a14d711b86abfa92965fed809621b67920613983dcabdf744f06419e7322a5c84ec12157c299808da104030015cdfaf8de29e03b2e1948bd71ca1057b27bfd3486a5747e7e8d540650ea655d84c9b2f2723736a3de5dbd1533697e11ec2a92f6c32674f", + "credential_response": "5801a8609731cf9ab2bbf425d4eda9a95de37f7304b58ecadfdbe9ec41af265afcc6938747e550f12099fab6540ff5af2f130018dec1ba41b2bb95b30a2ffc99ae4f0030bd76b3eb5929698641efefe69d830dfa5a3cacf871a8006c0d929a482ff52b42e1a1e1502d22ac47e803188349dfcc58653109231c87b41e22a6253be0d7c126ab348a62ec3cd1e4cfbbfee221c969c5fee9f16cce0b3a59b0fcbed6012760f30bb2c4cb99c7f9e321c2c64bdaf06ee52607419ee4734b9c0f483c2bb3dff9600ced5dab3d2d74d9ce52b2719cc998c1fc0a7d2910817dcc7ece228dbe02c3ca48eed08147610bb9bf2946aeaededae5e408e80198520d14a36d3f1b0967119a9b9ea6affd936fa3494cc1aa0601383b1ea0c6fef28cb6151223753c56e994c847783ec7f0dfa9f0870c8b7590ff1fbf285b06806cadf6e38ae25ffaaae1098d5efd6b0bf3a1cafcf1228423366d7bfec1a52a3cdf3f279645df402151f9bcd9614a85794b102bfc49080b744f78cfd6cf7102f12335645d92a2df0330d1", + "credential_finalization": "5d35da40c678ff2244f80b888457dd6c3e8efed5f31f139b49b3924b77c3322fcfddf49247570e9fc9557cee33667d710cb8f889ca7e0b9abd090db87792bd0dd134c0d460de1ecd1638c5d94b87b113a765cc565b5cd3fe5f22cb306e5d9aed43c44cab4a91846ec029aec91207cc53", + "client_registration_state": "157c299808da104030015cdfaf8de29e1088787664e350d0845a7ca7bae7a5086e159f22b7d0092039c411d8cb9a14d711b86abfa92965fed809621b67920613", + "client_login_state": "157c299808da104030015cdfaf8de29e1088787664e350d0845a7ca7bae7a5086e159f22b7d0092039c411d8cb9a14d711b86abfa92965fed809621b67920613983dcabdf744f06419e7322a5c84ec12157c299808da104030015cdfaf8de29e03b2e1948bd71ca1057b27bfd3486a5747e7e8d540650ea655d84c9b2f2723736a3de5dbd1533697e11ec2a92f6c32674f5aa1555398296bfdacbf1c33239d1b0cb2038015b8ed30d8531070b10b77880ccc520e9f2a46065b507e31a013dac0cd983dcabdf744f06419e7322a5c84ec12157c299808da104030015cdfaf8de29e", + "server_login_state": "02a2ff0ba90334c88c9dc7bd4b3eab2565e04e8bd3d7202b06ab41de633a3d2220ec3b26aeef8f528f46a275514b59b44d69391e2091cf05bf276296becbbb3f860861e40e5f49f1d903c9e9755f3a60573078878d9774f1a00dd3654ee2684fe6cd93333b71d9e2b7bd4dd441c9dad76dd134c0d460de1ecd1638c5d94b87b113a765cc565b5cd3fe5f22cb306e5d9aed43c44cab4a91846ec029aec91207cc53", + "password_file": "02a2ff0ba90334c88c9dc7bd4b3eab2565e04e8bd3d7202b06ab41de633a3d22206b0bdf8c7e6589f251b6dcbf66826da4256b5c66583d5c16722f88337fffe2b67ad655a90aa87a4acdc0c758f1c54118089ad492ebef256a5248f4543eefa1a9fa9e07504e0a1401f32778d30b9625458c38157de2660fc4755c527b6b5cadd95de4350013ef89f31a3dbf31293cc323e5c0ee849249e020d21c53a13c2460b69534f6cc94b7385d8ec12cd310441c05e46babb18138420213cdfbdd388b643c", + "export_key": "e112a13e24f4cebbc004b3c42aba98e903fee6e8312f6cd7feb86c8c0c01b5d5c9b63cb754e90b75dbe27489c5f2dbedf5092d897e2f2ed0a3ad95b24dfb5e30", + "session_key": "ec3b26aeef8f528f46a275514b59b44d69391e2091cf05bf276296becbbb3f860861e40e5f49f1d903c9e9755f3a6057" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P256_P384: &str = r#" +{ + "client_s_pk": "0216527010b7a4b9fd7ecd346237fa1d5b7cddde99b383f80248f80642d4fab7b1", + "client_s_sk": "1a5eb0cca4beb64ba44126c18fd6412c0fcc01f11805613b0296d501da5e6c34", + "client_e_pk": "038671d8a30c9107127232aa3b55293110f4f86b4d4ef1718dec0a1a0c03029df7", + "client_e_sk": "7aaadb591c302898e0b8c9b0bec133a52cc9f20b2a03ad18ba57ab61111dbc2f", + "server_s_pk": "02a4c06d91ba3592e5d288262ce166c2f54d334ea363f2973779acd5ed777645d0", + "server_s_sk": "aa32b47153995fd383b340ee667824cb01d7a90e82db5e56e514cc31b4e7deb3", + "server_e_pk": "0377d7a07c0ea5f48d79beae7429b31284434fb27993de8dcf04abf3852379e0d2", + "server_e_sk": "e526aac48179253f7d1264adbebb70923651323031a4182d8a0ccf0d02611910", + "fake_sk": "e6bdd4e73865c4da75c2866b9c288b87ac595eb501f841da9151f07f94b7554d", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "18261c1cf09798cba1d57b1821b9c3ed4d32e48cbae91af0e36b2417e39905f5", + "oprf_seed": "49eb6142f31580b4bb213eb2187f581b531056e9f5508d6cc1b26c685cf92ef8", + "dummy_masking_key": "374609f4c75806cdd0c56bc08565ed45948a537c1634abf1feb7e28dc462237e", + "masking_nonce": "a9c603c441736e650e8e9d49b64798b58bfe0f05ba7f519d46c53b3ec84c6273d0c999b011a44e99a0c0d535e04de2d5bf762aec9753e904d43d7a960e664118", + "envelope_nonce": "11542d65fb8a3da4caad11dee80177868b2e6c2c9d2e80484584d0418bb03813", + "client_nonce": "63e919bf74c744f2be07b263cbfef5fcdd0f281f8f287ea142403cf8956806af", + "server_nonce": "03cf458e16c41c84c3552abd5fc9d66d337eb6845cdbd91c9c65d25ee5122606", + "server_sig_rng": "23db703e5b0e059668bffe6980c0d368cc3fefc9ed5ccb4851fd5f0dc1abf932", + "client_sig_rng": "55053496cad6d87c27daae43b9ff41d85b0d39d0fcb3fc7a7e5f8071c624a240", + "context": "636f6e74657874", + "registration_request": "02f626c675520a15d0b2fc7a252f0189115a46474ccdc2031556c5c4b1404a0876", + "registration_response": "028aadd3a41f18db8dc2389aed6d25f71ba3fd4bdd12e1b95318dee88f5f0060bc02a4c06d91ba3592e5d288262ce166c2f54d334ea363f2973779acd5ed777645d0", + "registration_upload": "03478d0b4cb97195592262f7fc8a9547fc4cfb44246b3faf3c5f1933535fbff6a0602a6910a1aa8ccd1c98d94306325d50a59cd506393b80ea5a9db3cbcd3e892c1a5eb0cca4beb64ba44126c18fd6412c0fcc01f11805613b0296d501da5e6c34a668a661f6a95cd53488dbb3c69d2041aa26f3dbd08f1dedcc0e2eb00058017a", + "credential_request": "02f626c675520a15d0b2fc7a252f0189115a46474ccdc2031556c5c4b1404a0876dd0f281f8f287ea142403cf8956806af18261c1cf09798cba1d57b1821b9c3ed02755ec0ad1a8824fd231209b7904f947f8a239f57137daafe1b7dd1d7bde1ec0e9c9d70f956c6157cd6ba0bd4033da5e9", + "credential_response": "028aadd3a41f18db8dc2389aed6d25f71ba3fd4bdd12e1b95318dee88f5f0060bca9c603c441736e650e8e9d49b64798b58bfe0f05ba7f519d46c53b3ec84c6273eeb0a0edf0553f5a2c22c630730f981c1e5fedf9c82934ff7d7d2efd2e98506a717c7636dec6e912648b4763a4606720aaad363690f29ffe2fc11e55dc16664d7df370e483806936e0425bc7565bbf7db47411427aa02ce4968b8864ca1d0e620a3651323031a4182d8a0ccf0d0261191003cf458e16c41c84c3552abd5fc9d66d028a3c8db7462958469e7d3369365a2235d5e6d767f2a8d76372af0c9592885279e17a1e7b6979bd23a30fb1395e7e3647bc64a740252d06d016fdb51b57f49d4c05718202a6503b94c52423f8543605e2b7e4e07b94498bcc558547455ac8ae5cd179963548f4d7bb782ca99bf91d1494cd9c153f21696baf642ea67295e4c3f71e61380f0917e26470c0934ef36ff55042407627d3948b3154a3ab7a41e05798", + "credential_finalization": "22dae093c4a963ac7298f47d03ed83aa28a1e3bf33e494ebf99ffc71fd56a572563628ea7aa9fadd1c2f397e3aac77ac58b939d60b792120fa15b447728b64fa7a0555f7823659c8f59aff897ad15d09b0cc9a09bb863e547958cbe95de6a72c6de2c372d6e55f5c5ba6320bece76d87", + "client_registration_state": "18261c1cf09798cba1d57b1821b9c3ed4d32e48cbae91af0e36b2417e39905f502f626c675520a15d0b2fc7a252f0189115a46474ccdc2031556c5c4b1404a0876", + "client_login_state": "18261c1cf09798cba1d57b1821b9c3ed4d32e48cbae91af0e36b2417e39905f502f626c675520a15d0b2fc7a252f0189115a46474ccdc2031556c5c4b1404a0876dd0f281f8f287ea142403cf8956806af18261c1cf09798cba1d57b1821b9c3ed02755ec0ad1a8824fd231209b7904f947f8a239f57137daafe1b7dd1d7bde1ec0e9c9d70f956c6157cd6ba0bd4033da5e9082c05cfd938f6b10da5742b6ca914a4ebdabcbf6e1319ff739f907cf52acb2d83a9e325d4383a54d544e2b17ce4ccd3dd0f281f8f287ea142403cf8956806af18261c1cf09798cba1d57b1821b9c3ed", + "server_login_state": "03478d0b4cb97195592262f7fc8a9547fc4cfb44246b3faf3c5f1933535fbff6a0c88c4f414d8087d2e7c7a93417a0eea4b82d605f7624b5f08788b9ee61152565257a02bb313df919255099664beaf08a1be0bc73524c1fff0a29dc84f7f1291f045b225ffed8234fb969ec65c5acf34d7a0555f7823659c8f59aff897ad15d09b0cc9a09bb863e547958cbe95de6a72c6de2c372d6e55f5c5ba6320bece76d87", + "password_file": "03478d0b4cb97195592262f7fc8a9547fc4cfb44246b3faf3c5f1933535fbff6a0602a6910a1aa8ccd1c98d94306325d50a59cd506393b80ea5a9db3cbcd3e892c1a5eb0cca4beb64ba44126c18fd6412c0fcc01f11805613b0296d501da5e6c34a668a661f6a95cd53488dbb3c69d2041aa26f3dbd08f1dedcc0e2eb00058017a", + "export_key": "af2c5a07b09e0019f8b4a35b9561be678b27692576d536438978794f4ea813ef", + "session_key": "c88c4f414d8087d2e7c7a93417a0eea4b82d605f7624b5f08788b9ee61152565257a02bb313df919255099664beaf08a" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P256_P384: &str = r#" +{ + "client_s_pk": "035c2816149cbde34ffe87e18692b54ee2b1cc465ae57022052279fe4882606e56", + "client_s_sk": "39a5c5e76e623d4cf12cfd9be2998351ccf740e8a3e271b053f84b7b51e14d0f", + "client_e_pk": "02e145ef5ac54932f95c9c58bcae54ee472520cb309cd06cc6917dd2cede0cc488", + "client_e_sk": "02ee6b3fac97d710234816b4121ac55e2c4236af8d62045778f9522d3fc2ef3a", + "server_s_pk": "02f3b9654e74e860c5f9372f873b16b845ab9e72cbaf94a32ad0ac1efcd238353c", + "server_s_sk": "b7ee780b09a9ceabd510b26ed27e24a46b082dd3d506e92627ce1b3f5c56c87a", + "server_e_pk": "03e2f461a40e5fdfc92a3301574c138e558b988243dea79a8f4efc8f8b6d85153c", + "server_e_sk": "564b568a40dafa48191275d79c48f888c98ce41ecf4403723d9edb73c77abe28", + "fake_sk": "f1f58c1c18a50b2c3aa5ce281c0dab2fdf156bd7d336a75f35eb1fe81b4a0545", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "567beaa0fc4dc4c8bc396771180d67416bebc03cff6005fe7b4e90fee28c12cd6f011ae161e65ba8d9ae487fbe26a128", + "oprf_seed": "82707fed925c68d00bfc3bb8611ebbf4286c4517a18dfc8e7b97db557d994f51106cc2afb200097f776adf990c2786e5", + "dummy_masking_key": "4a48c22bce4b4e17fa3dd09e898a5de01b039c60a615312029b8b19566be677e6305ea6944562a8af0da0ca12f6328af", + "masking_nonce": "1615047472dd78a890314d07c0918fd4927da68cd440e1b491b9ec378dbdf4b4d3c3280ef377a0d8046490ca0e280c6b8750f735472760f3ae0f251c1a444454", + "envelope_nonce": "4d3b94f5b04183110f859e11302f31014147c95eeb64a41d9be22b935d219b35", + "client_nonce": "b5a197d50dd72f43a83536eab999ce39449a878c3af482a556e2207779f68659", + "server_nonce": "bd8002e72860e8fc8e5d220fb925c2036c99dc026cd89a277ceda22c95d34686", + "server_sig_rng": "2d6e982dca7237d10caa34a0b30ce27afb410514124548bacb8af7dea1e8cc3a", + "client_sig_rng": "c00ebc8eb286f380be1ea0b86451791bae15766607dc915797a3aae50bfd913e", + "context": "636f6e74657874", + "registration_request": "03a4a5fe83e2a6922834417451b9d1ea382662e478681bbabdd9b5720c3317c2d7535ac75eda5e0d704829b873da9e143d", + "registration_response": "02c684d623d33e981543227ae45e525faa2a3cda66d833695c47b485c568fc034218aca90d43bc9d349cabcdb58d88a0e902f3b9654e74e860c5f9372f873b16b845ab9e72cbaf94a32ad0ac1efcd238353c", + "registration_upload": "020a449620cbcb15b1d2918954a97de8d9b5cd5abd5158b4b8ecd4f5085cd342f7453b045e145b6e673e39f740a94638673eb499496610a862ba5d008d588d86f0fcdaabc150924d60848b1240568cf53439a5c5e76e623d4cf12cfd9be2998351ccf740e8a3e271b053f84b7b51e14d0f75d49c8d398156c3c15e472648159c5bbdd002d1934a360c045d25ae105e967705f4408e5d4aeec626c8bb74edc735d7", + "credential_request": "03a4a5fe83e2a6922834417451b9d1ea382662e478681bbabdd9b5720c3317c2d7535ac75eda5e0d704829b873da9e143d449a878c3af482a556e2207779f68659567beaa0fc4dc4c8bc396771180d674102cb36937daaa8e0e1b49dd1da149827bb4c8bde4aa0000518ff135bc2e1afdfad73e34ea6b4b0bad45afd7f50fa56e8c1", + "credential_response": "02c684d623d33e981543227ae45e525faa2a3cda66d833695c47b485c568fc034218aca90d43bc9d349cabcdb58d88a0e91615047472dd78a890314d07c0918fd4927da68cd440e1b491b9ec378dbdf4b4c73360a6bec9b6279735113f5babb6599f610a43cf2add2ceeb082710d1994022b5d0b706712e0127301e6390e363ed8a24e20faefe712d856bfc08cf458fd6e516c41e6ca1fcc7f292a1a033eb30df4a0187ea50421008330fd46afd2c5593b274121f16cf2e80e66b9c37e0fe360feb7c98ce41ecf4403723d9edb73c77abe28bd8002e72860e8fc8e5d220fb925c20303ddf21b9d00f3e75876e5815f743bff6b26b8d20a07ec19abd752a7728308d766416c6e2b083978af2a420e4ab1a304c780797d65bb6da527dfb23c527b520687b579fe67df6a22040d6c66751570b062685bf3eca6b1a575e87b72245ad6d3dff06897782f414c6d1b419f454af855c6a75527ba7559169474b8260703a94db30b1145652a7a48e816314fbc0f58caedeb718be22373d0a7cb9e891249d6e361", + "credential_finalization": "90d4f5aa9e307d79f7ef6da474938e790c9b47b7075e16c70e95f133d24dcda86d56e571c7c9e9a36bdd1813be6500cd6ff919611aa15a7c35045e7610ea8929b8fcea40172d847ddb87acec0d51666998b2955c6c2b97120f570694a65b4465d2eac9d159c8bbfa049b6822ea6f9cd3", + "client_registration_state": "567beaa0fc4dc4c8bc396771180d67416bebc03cff6005fe7b4e90fee28c12cd6f011ae161e65ba8d9ae487fbe26a12803a4a5fe83e2a6922834417451b9d1ea382662e478681bbabdd9b5720c3317c2d7535ac75eda5e0d704829b873da9e143d", + "client_login_state": "567beaa0fc4dc4c8bc396771180d67416bebc03cff6005fe7b4e90fee28c12cd6f011ae161e65ba8d9ae487fbe26a12803a4a5fe83e2a6922834417451b9d1ea382662e478681bbabdd9b5720c3317c2d7535ac75eda5e0d704829b873da9e143d449a878c3af482a556e2207779f68659567beaa0fc4dc4c8bc396771180d674102cb36937daaa8e0e1b49dd1da149827bb4c8bde4aa0000518ff135bc2e1afdfad73e34ea6b4b0bad45afd7f50fa56e8c11135d05cadd18238be72686fd27d90d5adcd104fc7a360bcaf4e481ac4e0ccb846a88e97514773226ba343d209c8f296449a878c3af482a556e2207779f68659567beaa0fc4dc4c8bc396771180d6741", + "server_login_state": "020a449620cbcb15b1d2918954a97de8d9b5cd5abd5158b4b8ecd4f5085cd342f72aada7d7ae987201b8e37a726bfda5f5da213f9278692a2c541f4ef297a6fc9db71149d5274240d77c0a55a49f43817677ff218946bb6c37547b5fe4ac9ea80d466f3cdc10fb20c6f61e1db97ea7c384b8fcea40172d847ddb87acec0d51666998b2955c6c2b97120f570694a65b4465d2eac9d159c8bbfa049b6822ea6f9cd3", + "password_file": "020a449620cbcb15b1d2918954a97de8d9b5cd5abd5158b4b8ecd4f5085cd342f7453b045e145b6e673e39f740a94638673eb499496610a862ba5d008d588d86f0fcdaabc150924d60848b1240568cf53439a5c5e76e623d4cf12cfd9be2998351ccf740e8a3e271b053f84b7b51e14d0f75d49c8d398156c3c15e472648159c5bbdd002d1934a360c045d25ae105e967705f4408e5d4aeec626c8bb74edc735d7", + "export_key": "d6daae319e75d523a2a91575d521da34b5def7811e2cae26f78e063ccc7cc0ed73a40cf65c8497d01d072905f7b3fe36", + "session_key": "2aada7d7ae987201b8e37a726bfda5f5da213f9278692a2c541f4ef297a6fc9db71149d5274240d77c0a55a49f438176" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P256_P384: &str = r#" +{ + "client_s_pk": "03ecaaebcd876d4857e5afaab7d4343afe1170ba2275cfca2e1ecbfec2ba4e0451", + "client_s_sk": "550438132c20fa1e95769f6503209ae88a0f06349e1cc16e449c8b4999d287eb", + "client_e_pk": "020907bc342a6c6b491a97c1bb428a5107705a7e29a71789774525963a19721d80", + "client_e_sk": "2ab642b121cd49c20deb99fa4656c168a54a7c321b9fa13e8254584a64f94cc9", + "server_s_pk": "02092cba08c0a5df1dedf213cadac388b1d773341b014af4096260a90dd34e873b", + "server_s_sk": "9b403a41b5c5856c7c46326251c95dba4573da345c56372bff9fdd307d8d0420", + "server_e_pk": "02cd57e8ef4e8e76ba991cf55a312735d171c0725a506342556cfb2917d0617c99", + "server_e_sk": "8d057cdedb6a1d1acf65d8029f5e56cb29991a8b9540658285b7f82e05d2c2d7", + "fake_sk": "5a976d7b80970b196425e8b727ff57a38633aa16d7a4a450dfb1e7250673db5e", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "01e0183196154e47fa28f76b879dc3487c64e0c8488fa7a490b9ef97fc7545c11deae6c08b0cfaa03e81e20c90205d5939ba368fa2eff3c41cb1bb8bbe927a723509", + "oprf_seed": "707a444b9eb8e463663f0569c3ad6b19708ddc0bfc2bf5613bc61a5ded724903300c7f74d0bdc38a8aa3aa60510c23a8211a12eb215efa0511f45f8a84c5356d", + "dummy_masking_key": "ebc4d09c8e6582ef08c421fc68221342cc5b2719516e00edf8137ce6df155679290faf6a4e17b649a6e4881760cff1494385600025d2761cd3219dea9d07cb72", + "masking_nonce": "9b89d25c9e28491bf1bba71139587cc59ab8fcb5c78b0edf614bea0f852ca519ef2976065dedb121e171a1fcc03e93b60143f552f2f22a64ff30f6e73ddb1b40", + "envelope_nonce": "99bc7ef9fcbdfe4c88a44d1f4bc8e5e09ff4c8d2b6a14258219291884123c734", + "client_nonce": "bb5b8a24e459faf2c324e1d76c84a2aeb5e6956176684684645041ec9dc2076d", + "server_nonce": "b9d9faf9aed1ee4f47e7770a6822b9e9e1c4a660297722b714a2a128774ffd1d", + "server_sig_rng": "335a1de0eabb5caced3f8a573a4af1e473ba97cc9def510b15e7ec895be9b0b0", + "client_sig_rng": "2d25b8d8b6baf2d9cfa34f78fa9734b0f1a45091160c465f8b8e13c654dc6409", + "context": "636f6e74657874", + "registration_request": "020108343a6f8002dea57512571f54db2ed73b7e8fb52dc8b833de23fc87e222ac487664a5b6ab7afa9f72bdc7323cf39c83d651673cd8cc444889d105d780523e56e6", + "registration_response": "020122670ef04ec33d4792bd7d5af38a0691ed245e3f63c807437f5ce56efe3915ca9bb3d5fed6ec419a4dd71f21d77edd32b4e3aee251092979a9a9f0b1ee34adefd802092cba08c0a5df1dedf213cadac388b1d773341b014af4096260a90dd34e873b", + "registration_upload": "025b7e594de6613fe5091e58ecfaad519aacd74c2999b12ce4e44dd7635c757cbee8dc2cf32e8b6e7583cd4b30194409ec9028aacc8531d704026416b9fe21a30fb69348719df40d1728d58d16aae9f54e8b5c39f7187729f5a52a96eaacbee791550438132c20fa1e95769f6503209ae88a0f06349e1cc16e449c8b4999d287ebdfcbcfe9e25b78b514d7bd6d70834bf68ee9f7bb5638d1fde93351357b259e9a87873e9820833b5bbe9cd2e068a761ace5b010c01bda51aa6a1bda91c3234ac2", + "credential_request": "020108343a6f8002dea57512571f54db2ed73b7e8fb52dc8b833de23fc87e222ac487664a5b6ab7afa9f72bdc7323cf39c83d651673cd8cc444889d105d780523e56e6b5e6956176684684645041ec9dc2076d01e0183196154e47fa28f76b879dc348024cbc781487863751c1d6d240552621d7ef1162d1619cf2520a307fe5456e914056e9d3b4a49556d37f0e36c9e78220a1", + "credential_response": "020122670ef04ec33d4792bd7d5af38a0691ed245e3f63c807437f5ce56efe3915ca9bb3d5fed6ec419a4dd71f21d77edd32b4e3aee251092979a9a9f0b1ee34adefd89b89d25c9e28491bf1bba71139587cc59ab8fcb5c78b0edf614bea0f852ca519969b0eb94c3c604171af4b67a50422b9a70b7b1d9192d80574bc03c2ebbe8ce56f52cb045d6a7d974de2d70a0a5a63844d6b76809feafabd99e81d4da91c6907f0fbef82083b7657e52228c8bc436278130b173d30956222878d75a2835a043c0aa354785f6d86684e217a62180bd915e5a0d5cdbaa882f2e09393ccce207b765b29991a8b9540658285b7f82e05d2c2d7b9d9faf9aed1ee4f47e7770a6822b9e9030caa6a9ee1d409e6b6ce2d32214187b69c4106a1eb3652b5be1cf88280dd1e233d053c5a5e2c428caa01e527adb7a334471ef9cfffb608e64f3316d5a0d5d6078cbe571927f5b1d227b38c96125a2a956584cfc2bce0b6643a51dc18a3cbb021699fb6980e05c2df6da66904bf035941583a6aba078642f9a950c5e1e7f5d22185bda60de36abac7a26ac9caa4b5e22dde33103d8f9cf8cd4e8927c1e0b5e8ec", + "credential_finalization": "9c243966130841474e6438be16ed666486008bc6dda0037e0de316af09ff6dd8f6c061f9c9d1fe37cc2a67455cd0776bbbe6a27caa951af643e5b2b765ee30b95f73b95638bfaa2092968223de0e0fd3e493743a53fee54db0b7958d167d9222d88ac1ca45a8a7b6c79f264d4fd48834", + "client_registration_state": "01e0183196154e47fa28f76b879dc3487c64e0c8488fa7a490b9ef97fc7545c11deae6c08b0cfaa03e81e20c90205d5939ba368fa2eff3c41cb1bb8bbe927a723509020108343a6f8002dea57512571f54db2ed73b7e8fb52dc8b833de23fc87e222ac487664a5b6ab7afa9f72bdc7323cf39c83d651673cd8cc444889d105d780523e56e6", + "client_login_state": "01e0183196154e47fa28f76b879dc3487c64e0c8488fa7a490b9ef97fc7545c11deae6c08b0cfaa03e81e20c90205d5939ba368fa2eff3c41cb1bb8bbe927a723509020108343a6f8002dea57512571f54db2ed73b7e8fb52dc8b833de23fc87e222ac487664a5b6ab7afa9f72bdc7323cf39c83d651673cd8cc444889d105d780523e56e6b5e6956176684684645041ec9dc2076d01e0183196154e47fa28f76b879dc348024cbc781487863751c1d6d240552621d7ef1162d1619cf2520a307fe5456e914056e9d3b4a49556d37f0e36c9e78220a1fe52065cba41b012a06862ae401e9fc1b2536f8d9ebf4e0fcb302c653da6bf82ee80b25e23d7ac690781a553bbb723f4b5e6956176684684645041ec9dc2076d01e0183196154e47fa28f76b879dc348", + "server_login_state": "025b7e594de6613fe5091e58ecfaad519aacd74c2999b12ce4e44dd7635c757cbe2df2330e62678b2d002b902144cb6346106a3b168b02941f10e62e2afd4fe029584b46cdaec774bab4e90510d2735162ee9c4d597a49ae59dfa7163224b7f0c9ef4a056c901a707c3cb1767b1e25a6225f73b95638bfaa2092968223de0e0fd3e493743a53fee54db0b7958d167d9222d88ac1ca45a8a7b6c79f264d4fd48834", + "password_file": "025b7e594de6613fe5091e58ecfaad519aacd74c2999b12ce4e44dd7635c757cbee8dc2cf32e8b6e7583cd4b30194409ec9028aacc8531d704026416b9fe21a30fb69348719df40d1728d58d16aae9f54e8b5c39f7187729f5a52a96eaacbee791550438132c20fa1e95769f6503209ae88a0f06349e1cc16e449c8b4999d287ebdfcbcfe9e25b78b514d7bd6d70834bf68ee9f7bb5638d1fde93351357b259e9a87873e9820833b5bbe9cd2e068a761ace5b010c01bda51aa6a1bda91c3234ac2", + "export_key": "fb8e08c2e239c4534590c1e52fd58bddc393f6f5d392f3e70e10a74675acd54ac9e3cdf9a05e49e6f384d38f59b8690ed4f1d67d136d0549a00eee9f373a748b", + "session_key": "2df2330e62678b2d002b902144cb6346106a3b168b02941f10e62e2afd4fe029584b46cdaec774bab4e90510d2735162" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P256_P521: &str = r#" +{ + "client_s_pk": "02bef12474de31bf64f81fdbe21e1d5c4effb6e379060306173aa6e97af0fd9aa7", + "client_s_sk": "21c259cbffe64f1e189f531cb85b2155ea8d4c6700ba618701fea0390b7903f3", + "client_e_pk": "02fac06cee3195d6478a53e423333ce9a760bbd12c4524512a5035aed1b3821179", + "client_e_sk": "ba646a3e0f50abedb03d20fde18ead7032d8de721f979dc97e077a783efe81bf", + "server_s_pk": "02db7764540da14edb185391722374db44f97b8de52d996ee922a5af7b274bc3d8", + "server_s_sk": "c2184fe99b7ed016bc66cec0e41a8f86ff43004964f5f5de0fbd0a06845821db", + "server_e_pk": "03ef7ccc65d2d4b8adc927a1b215e7f64238a22638ca6a1319dc9fa8ad56ca663c", + "server_e_sk": "069909389e98e929adaaed4a480a63c12bf4576afc7e94c461de5f1fb56e4700", + "fake_sk": "4caf2779252c8e0b023a3982cccd841cbe4367223ad8c40c56543fa463f90eda", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "2e407aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03", + "oprf_seed": "43fca1cd344b61e605a53a25b1e4c20d5c9863484a5c647a38fe2c2ce942b183853f558aa321dc06755cfb546dda311e7ebe94e42b46942e4cc9fb5c47840dda", + "dummy_masking_key": "74b49e25eea66be911d618bcbaf4d83571bba3d0ca9362d68c125be40aa8d45e25c842d0b0bdba2ade37cafb20c30440822cf87fb541973e3fd347f7954b9f5b", + "masking_nonce": "e7f15020d0f301782888b22347578ba45d22aee4141e5e7e53c3db8b7992d1a545a11d3c611f8385151d33512ecaa2f7705f7656dd26803ea4e1ed8a10a587d3", + "envelope_nonce": "67ac67b55b696478b80630697340b22852bfd698aea3752e5a312d0d6b961a9e", + "client_nonce": "e11fbed9a4d8a6445129af7f09d1fcce0ad3d85fa7ee41f7430cc5b69cbb23c5", + "server_nonce": "6032e6a79498dfa4a30ba0661d3a0122b1d50bc670b29f9d3cb2b5a86399057d", + "server_sig_rng": "7646c37b9a1885c3fc781fc8809e62cd2f38138e5b2ed780956aacc4209c689e", + "client_sig_rng": "3dd4896634fc2d72632fe6edcfbc73392c719b2e2ea27f70654a37bd4f7dc028", + "context": "636f6e74657874", + "registration_request": "bcd286521da30b03a09050a4a6bc03eead70083526772200d1946b8ff9513520", + "registration_response": "0444a809fe11961aae427732e10e4575013d6355b1b5bad8e2615b07019dc37102db7764540da14edb185391722374db44f97b8de52d996ee922a5af7b274bc3d8", + "registration_upload": "03b92420e97bb5af95418af531f33a64846ea1b8d896daeab4878332b51d9f76d3a29357491dcc82d801cd2a08f81079286aefa81ec7f070ae21647f83d12f880ca9c76c6f3cddc264f001a86d37b3b2375c843d9807c732af857b169d6464a45b21c259cbffe64f1e189f531cb85b2155ea8d4c6700ba618701fea0390b7903f3a4b3c0899f3e8e7856298907482e2c075985426c05dc4e69371d43e386918003ee8d2a88f0b81db513ed17f0eca9186bb38b530a5bbaa91855e7ccb1d5676f5d", + "credential_request": "bcd286521da30b03a09050a4a6bc03eead70083526772200d1946b8ff95135207aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03ba640301a6d1b90169373b90f087f58577da1a50cd3d870dd64885ae468e66418edde2cd02234d12dfcb3e33a7df514e8ede0aa4780c969b52ed4d28bd1441b2fdfca88df5", + "credential_response": "0444a809fe11961aae427732e10e4575013d6355b1b5bad8e2615b07019dc371e7f15020d0f301782888b22347578ba45d22aee4141e5e7e53c3db8b7992d1a5e84b99cddaa54dcc0af7a9ad8e0ab538b80522b84e59dc301f4d104a886a0d2027c6f7f45cc43e855f9cdea6168810541dbae0f97269bdeaff1eb2d38b42eade42f5f12642c2b08f2dc89221afc85ee03103f50bfcf5dcb3b733fe635595538d07cae37c6d590ef20549c60415910706d1de2d532d3b33d160a446991a081785dce6a79498dfa4a30ba0661d3a0122b1d50bc670b29f9d3cb2b5a86399057d7646020169b20065f5f9057d05151e31763939fdd77db795e8d00f290bbbecd1c5c040174c01c20c261aa806a3f2e9298332eea9cb85963972cdf1f2f1aca3489cbc6ec371253f34087623e22c36c71cba4ef130dd1e62808090e8eff7c4091012ce67daea157cca81b74e6673515ab847c6f5f2eb8aff4b9850d3523efa03e2060c5339ce58d3a8cc3585ec99d7f128e114b324001ac4a4e935badc22843e7258d53b9c50d2ed1f92e7e83a6e599bc6afa6219b25d10f1092e228e1a87351eb72175d1d62", + "credential_finalization": "6255e4a66d4ba1b4ccb45f66a903d24d0f9396f8a35ce97a2c8bcc60f5ae17152c21492d2f21e3d3bb84b1f5a14646198918855d8ae9dc279a04625e117e6859c735be638d3708b2c25fa591d90a9153ea4eeffa5153020f2599176fa00548e899dad556cfafe08d3073656adff34498908cbc8e45f5c5dd3b808fdeb1d75064", + "client_registration_state": "2e407aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03bcd286521da30b03a09050a4a6bc03eead70083526772200d1946b8ff9513520", + "client_login_state": "2e407aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03bcd286521da30b03a09050a4a6bc03eead70083526772200d1946b8ff95135207aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03ba640301a6d1b90169373b90f087f58577da1a50cd3d870dd64885ae468e66418edde2cd02234d12dfcb3e33a7df514e8ede0aa4780c969b52ed4d28bd1441b2fdfca88df5010c5a3eea5f7893b66bbcac1c7b8a86dda2b6dec35cd1497ac92595e4b6921d85cb1fc538b404ff0fcd70e50a1d7230a9ddfa25d40a3d34e35e469fa9a99dcdb1537aa4370b0117eb0e08529d82f53321ff98c2873148c0ca55d13e39c16e03ba64", + "server_login_state": "03b92420e97bb5af95418af531f33a64846ea1b8d896daeab4878332b51d9f76d3724e7114d86f32eba5bdfb281c86e4dfc6595c8cfb94f123e141aa07e940f364be196a9185fb3591ee9ad47c6fb3367abb8ec353b447989f541a2c033b34b075e0ca1021e1f0eded8afb7196461d71c4e5e4e73452dc7b607b6f6979a4fe9039c735be638d3708b2c25fa591d90a9153ea4eeffa5153020f2599176fa00548e899dad556cfafe08d3073656adff34498908cbc8e45f5c5dd3b808fdeb1d75064", + "password_file": "03b92420e97bb5af95418af531f33a64846ea1b8d896daeab4878332b51d9f76d3a29357491dcc82d801cd2a08f81079286aefa81ec7f070ae21647f83d12f880ca9c76c6f3cddc264f001a86d37b3b2375c843d9807c732af857b169d6464a45b21c259cbffe64f1e189f531cb85b2155ea8d4c6700ba618701fea0390b7903f3a4b3c0899f3e8e7856298907482e2c075985426c05dc4e69371d43e386918003ee8d2a88f0b81db513ed17f0eca9186bb38b530a5bbaa91855e7ccb1d5676f5d", + "export_key": "53549c43ba6aa0cf189701559024a67cc6ff9cbea9e47af6da45a1e6494fe69158a2c09a071b420d7936ca8b828beee7d24656b2d92cd6b318ca020984fed507", + "session_key": "724e7114d86f32eba5bdfb281c86e4dfc6595c8cfb94f123e141aa07e940f364be196a9185fb3591ee9ad47c6fb3367abb8ec353b447989f541a2c033b34b075" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P256_P521: &str = r#" +{ + "client_s_pk": "023479c3797362fa5398fed347179ebf3c57033378a3a4b76bf5f60a8696241f42", + "client_s_sk": "3b55ef1ceb163cfe919957f5413e49b046010617b3021fec0ad2bf2a65184627", + "client_e_pk": "03d9b0e45ac6ae584e18bf85c9427b97f6bc7147775ea8e1b1afedf63b2f68ed17", + "client_e_sk": "cc7b47f728460c1699b942798b225d985d8cfbdb749af1d5c964750b4f311665", + "server_s_pk": "02aa7d1633ff285063de62fd5efe878bc92dd46a8a1ddd7775ebea50352842e693", + "server_s_sk": "6d5d2cc0212d61d5809b73ffb075126d94a02dfad7fa4e96339f8c3ced7b8f2e", + "server_e_pk": "02877c36c10237d52d539d75b197ac1d8366c063e82788b73481fd365b9f1e952d", + "server_e_sk": "9ab5cbe322dc088c63c5cb376afbf193cc3651c86b370bcd6c9e25adf05a2d30", + "fake_sk": "29e1377ada259aacfa6e10ab958f50e197f6beff9e38ebf6667d06c6e62fa9fe", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "587b6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f7", + "oprf_seed": "23fee06c883885d119d5fd326abe527ac8abbffb0882acd2beb37ddfc275feae", + "dummy_masking_key": "6996d3303859b8f390d9496797d8e05c0196d2f383295ba5fa5048e5e2d7dc8a", + "masking_nonce": "4d2ecc610c928801b8c4af780bbcd54060f9cdd6fadc1884a07aa3d5c1da420ebeeabc29f6c0785c6d3e150ca972a4ce8f8c0da306d06a8baa83c5d2708647bd", + "envelope_nonce": "182dea7cc17b6571280b8f242f4fbfe2fd5e249313d4778afaf0fa6e1dd54786", + "client_nonce": "a846336f222ad7f35c51501703b39eb4269ff59fc6607537684d4d5f1807d76b", + "server_nonce": "221a138d399639e7686d8cd5388a78a83ef2195d49c7a25335eb09b25c9d449a", + "server_sig_rng": "399a33ec91be462d652c08b309fd8fd1b8d71756c571e8df743c8d70648c48fb", + "client_sig_rng": "299a9722c3c3b8985b35f1a973d065740e706c82f15cb120c4d51c1afea1ef9a", + "context": "636f6e74657874", + "registration_request": "02c73f362967dc5912713c883fac0e2a10d95a859fcb69e8169b40ec654b51cffa", + "registration_response": "0310d3f842919830828ed173249c9001e3dcb12368ea3e79f48ac7ea92e413b76402aa7d1633ff285063de62fd5efe878bc92dd46a8a1ddd7775ebea50352842e693", + "registration_upload": "02b03e211467a68b5c7037674effdd7062d9bd66776b4f6713bd09b16b3810192526cc8c42fae4dab449d6a974c1e743b71afdced61f6f32847180f87dda9edb123b55ef1ceb163cfe919957f5413e49b046010617b3021fec0ad2bf2a65184627f2ef7c35fd89558854b5453e1e392fecf2963e7e79b217da8be348b1c73a4bd4", + "credential_request": "02c73f362967dc5912713c883fac0e2a10d95a859fcb69e8169b40ec654b51cffa6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f7cc7b02008278a14e3336e1a33e0d11762bc0f793d97e89460029eb78b41518a01683b21247768185d425ff32a13e69bffa4d94f90d4aae06229a79e313b5e585069f3af8f3", + "credential_response": "0310d3f842919830828ed173249c9001e3dcb12368ea3e79f48ac7ea92e413b7644d2ecc610c928801b8c4af780bbcd54060f9cdd6fadc1884a07aa3d5c1da420e2cd8353ec490c67d622b2458fb915964992057bb19c53383b7be214eabd1b7b6160e56152575814a958a64a6834f8fdab779ff4f72c3da451732b4b7e04f6bbe3146948bb11cda91cb90eeabd8aa45ca9408eb0fbee457bdd3ad96bc25ec877823138d399639e7686d8cd5388a78a83ef2195d49c7a25335eb09b25c9d449a399a02017e749d2e1b8a91b3849b4e193558d5c19d3623443f83b1b27ece6fee9786d13a15ffadaa04001a5e9129d627355d01ae054336750dfcc6aa054035ef1846f72ddcc5c134a0fc8421ad04e8a0ed2a0d9e1fbd910439b67ad9bc07e7ab5a5f878da9a2a05ed7354f4f161f93affcd381459994efb29b96ea935dbee154dc0998cf77f374532aa9bd374ee0e6ba3fb04475be432010323aa5abc30f9369976a20a82e20ddf779656cbb9758472b48ee35d3e75123579c80fff6b366b4938a86798fe3", + "credential_finalization": "f7827e4f2a6f450174314b54726e044fecded9ddb0f4e32010898fc1422e472ac76adf357d532372c6ba19a0c37aeb43234a3870aa7c859891219989fc0492c942f3b785e9e1b8f9ebfe159bf4107f7041c9187a1d2b3a3880860cae706a71dca910acf5fe969ce9aa86d2dd0316541c2b9c7b55d0baaca3bda00541c7e705e3", + "client_registration_state": "587b6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f702c73f362967dc5912713c883fac0e2a10d95a859fcb69e8169b40ec654b51cffa", + "client_login_state": "587b6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f702c73f362967dc5912713c883fac0e2a10d95a859fcb69e8169b40ec654b51cffa6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f7cc7b02008278a14e3336e1a33e0d11762bc0f793d97e89460029eb78b41518a01683b21247768185d425ff32a13e69bffa4d94f90d4aae06229a79e313b5e585069f3af8f301656c826416705ddfb001f36f33444fe19054f4a01b04037792a2c17a0a241d58c33d0412444adb3723fd9d08487aca92cf2831df6b4e7364b8fe52a8c4bbbe4cbc6931feb74b4d155d54dc5e69ac4d9a444eae2c2ef033595a8a109a2955f7cc7b", + "server_login_state": "02b03e211467a68b5c7037674effdd7062d9bd66776b4f6713bd09b16b38101925f09c7df1c81fda8ae527d37d0a006d0f62c31165be131ec7bc1d84ef872493595e5e007c17182aa8191243cb34e2fb19532482682909616517f16901fd8d868ef2a705eca68d4fce64f39dbaae2ea34c8ff96a9776c91ab27ef61314d09d158942f3b785e9e1b8f9ebfe159bf4107f7041c9187a1d2b3a3880860cae706a71dca910acf5fe969ce9aa86d2dd0316541c2b9c7b55d0baaca3bda00541c7e705e3", + "password_file": "02b03e211467a68b5c7037674effdd7062d9bd66776b4f6713bd09b16b3810192526cc8c42fae4dab449d6a974c1e743b71afdced61f6f32847180f87dda9edb123b55ef1ceb163cfe919957f5413e49b046010617b3021fec0ad2bf2a65184627f2ef7c35fd89558854b5453e1e392fecf2963e7e79b217da8be348b1c73a4bd4", + "export_key": "3efa931d599ccf347b9daf01064a65d8f13df397d2290b69a94ba75b6497b299", + "session_key": "f09c7df1c81fda8ae527d37d0a006d0f62c31165be131ec7bc1d84ef872493595e5e007c17182aa8191243cb34e2fb19532482682909616517f16901fd8d868e" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P256_P521: &str = r#" +{ + "client_s_pk": "0319f23af6e0a64dec047da6f7fda573db2e3281b0dbb7e86b516b5ec956662055", + "client_s_sk": "0d3c7d95da5b43b1f25007c89c5d0f2bb8012457fa7e34df754b453cdb1268fa", + "client_e_pk": "038aebb25ec4366c6d5a9e4063433e8d5da1dfb6c73cf173ae5e03c691eeb0ca1f", + "client_e_sk": "25cd5cb4dfb4d42de8c2fafb68a25b3eca8faeffa77f4e19e516200372c8db40", + "server_s_pk": "029a8d4bb33576aad5bac60d34465ee842ed4cfabab1e072cbd5fd44ed926e570f", + "server_s_sk": "74a302e918effbd50734eeadaf12c841e983cb55fbb8c89c151d9d92508c9a3d", + "server_e_pk": "02dcfa11cc8763ec04c962c0e40929f9399f61820bb80486fa3bd26658c9b33f3b", + "server_e_sk": "6fca5d4c413ea0994f4a07426f92c572c234cb2af5dd5b42fe9e2b72453fda5b", + "fake_sk": "a0bcdb4bd98fc6a165733d7bbceab3c2750b82057876bd7ce1abea877cd7595f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "9871316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b838e7ee61b7caeb9130150462309a", + "oprf_seed": "cff28e71cf7fcf78dc4918af2ab7a3a24068039690dbd8d81bc3f26ae0d81ed6bcd9dce0253655cf7010df872f3d50a5", + "dummy_masking_key": "83ff7a8100916f622215096aac662f5631616a9364551d7cf0fa84d5ec36168b818904ce75fcdc5d200a829f2b2849f4", + "masking_nonce": "190497e6f4707317b286c803a308de159af90e1965b3735f434db479a28d650465599e8d29f5595b520cff69f0cfdaaf6929ad6b9b64ead46382ae2be06296f4", + "envelope_nonce": "3b20ad7372d5ff601cc0693bdfa7699ed9f69a155c9a272028bf0ff606e83e4b", + "client_nonce": "c503b6bf2dc7a2119f8c478629179bb05a52155a28d3372f58bdb182b56fc1d1", + "server_nonce": "d867311733c88e2bc674845f7a2a9004b20b4f1f15a00026203ac09f3f8c9485", + "server_sig_rng": "f9b1509d8d05e927c16e3059eec21063f44c12450b59eea285da00d7505052b5", + "client_sig_rng": "a60b52683f8013f8e64edc1e667fe6a4133da1b43fecd45a877e8d515a2a052e", + "context": "636f6e74657874", + "registration_request": "02af0f9f08abd6d8f22669395bc31f6b3fe10f61512916841ca0124808b9001c6d87fa8c550c71849701c81943d223367d", + "registration_response": "039c2dc32198cfe081d56c44bdaf1fc21de657ceeaa04d36f2b8bd940c17c7e24424830efd72428200582f4331bc9e9114029a8d4bb33576aad5bac60d34465ee842ed4cfabab1e072cbd5fd44ed926e570f", + "registration_upload": "03813c666821878c2006efe7c344710e885c2c4337ebab3c1f70d0b767397256032dde24abb3131421505bdc3a6dd38a74840b2ce434599000fbe905d68ce40aa8911d443e78445129c94fcee3161350cb0d3c7d95da5b43b1f25007c89c5d0f2bb8012457fa7e34df754b453cdb1268faa7ccc5cdb431ef81c604a2e6eb63c46eda80f6977ee57ab705b18e7a18831182be408f01a172a1fab29e96c1ac7477c1", + "credential_request": "02af0f9f08abd6d8f22669395bc31f6b3fe10f61512916841ca0124808b9001c6d87fa8c550c71849701c81943d223367d316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b80301116733b7458b11928592fc6fd714ab51375deb963f8270d56cac3edba7cb901d46dab3789dc62133e4740f9bf9139124284f7d0b7a068400b7eb89a91d1349a4ac", + "credential_response": "039c2dc32198cfe081d56c44bdaf1fc21de657ceeaa04d36f2b8bd940c17c7e24424830efd72428200582f4331bc9e9114190497e6f4707317b286c803a308de159af90e1965b3735f434db479a28d6504aab01475616e1f2781a443d4a0f065d7625e7323a0cc2207a977c476bd423a34a8ec72d9b580d4ff36b09f191f7f96afc860b22dd6879333a40eb5ced6163d162514f157fec5e1fa653596198e9c1739ff7a5a1eba4c98265d78ac70a49fc8bcebc711ef266ef2af24ea8b6d5083b25728311733c88e2bc674845f7a2a9004b20b4f1f15a00026203ac09f3f8c9485f9b102002d001a4b818e47c08af3542d0f2eaad7825c45d97c26f024edf3f899c8f57f221849c56d1ffb8fcb1f8147ba5ce77553a35fb5a2f12d37ad7e1737720fbb63d2444285d431811092734d5a38a96afa932e936fb7fb37c456416239537864a762ca6b93ca1f25a9d4b52233e0544c4645e24f53f97f530a25185c6fb6d1d050b15f6bf297980c983440d4c81386c0468b4ff87850f3de407d8646d73074e925906dbf2f8576454f4926d7158be0d3b05d72bc505f0278c2144d444126d73897c138", + "credential_finalization": "cafa5fa4d79362aa1be1a9d9992e587368a0b5e50555a533e0e4f62668d4003d7ade9d2f1ab7aa12450ad3489dfc6f366d9eef165287dfdaebf65e9a14627deae59d6d13159f8fcfe4013cae0498bf373f9af17a6307318b8f143a578c2ddf7b174df08122efc59529004004cba9b65cad9596272f0064a2667a22a56f1c7a97", + "client_registration_state": "9871316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b838e7ee61b7caeb9130150462309a02af0f9f08abd6d8f22669395bc31f6b3fe10f61512916841ca0124808b9001c6d87fa8c550c71849701c81943d223367d", + "client_login_state": "9871316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b838e7ee61b7caeb9130150462309a02af0f9f08abd6d8f22669395bc31f6b3fe10f61512916841ca0124808b9001c6d87fa8c550c71849701c81943d223367d316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b80301116733b7458b11928592fc6fd714ab51375deb963f8270d56cac3edba7cb901d46dab3789dc62133e4740f9bf9139124284f7d0b7a068400b7eb89a91d1349a4ac00f9da760a69c2e40526a440d20cb7175ea6c4d49c201b65e493efc234f9a4b9ef4c26dde310646992863960d96e6c1c29d2956e4bea7a7e0ca9c0abc3a086e78cf6316eccd2e443b0b01311de90cfda8a1da70b17d75ae9c7dcbd9a2f591b2594b8", + "server_login_state": "03813c666821878c2006efe7c344710e885c2c4337ebab3c1f70d0b76739725603001d58713ce40e5834c4889be9a5f7045a343c1712fe9f3dd10b2677419c17da07c35770973f2ef376adfb69485ba81343d8f568c53d57f6204122e3f47c08388422e5fe1228d8727e63164167da384033f9af46e636d0dc7e7155b3213eb79fe59d6d13159f8fcfe4013cae0498bf373f9af17a6307318b8f143a578c2ddf7b174df08122efc59529004004cba9b65cad9596272f0064a2667a22a56f1c7a97", + "password_file": "03813c666821878c2006efe7c344710e885c2c4337ebab3c1f70d0b767397256032dde24abb3131421505bdc3a6dd38a74840b2ce434599000fbe905d68ce40aa8911d443e78445129c94fcee3161350cb0d3c7d95da5b43b1f25007c89c5d0f2bb8012457fa7e34df754b453cdb1268faa7ccc5cdb431ef81c604a2e6eb63c46eda80f6977ee57ab705b18e7a18831182be408f01a172a1fab29e96c1ac7477c1", + "export_key": "5a870fcccc9fe80fdde6016bef44c6f704817c96a8461af39de88657d25d3fb3e09a06a4f7160f499e83a72e1c961493", + "session_key": "001d58713ce40e5834c4889be9a5f7045a343c1712fe9f3dd10b2677419c17da07c35770973f2ef376adfb69485ba81343d8f568c53d57f6204122e3f47c0838" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P256_P521: &str = r#" +{ + "client_s_pk": "0213beaa86978adab7953ce948d8c5faa7d6000493d6e94b4edaa58eb5a4e95ce3", + "client_s_sk": "7bf47e8031b15611f4e57ae1434de366b49ba593db315798e88956dd9dbc24e9", + "client_e_pk": "024143cd0b45af217274fb3a3bef348a6a8c991a24f7494db76785ec7805a3e2a5", + "client_e_sk": "3f651f23192dca79e1e30c9725c6e958170df00b2667beb91219163b53255e0c", + "server_s_pk": "02b4da4ad7faa9c00f98c4a35b63e9ca99c0445b2cdb8c3d67b8f1d242b33ca11c", + "server_s_sk": "742bd7fb3ae35ac00ba671bfe34275446a8c482ab5c8d1a330f0893f495924cf", + "server_e_pk": "023dd2fca33d0b4c7f182b6522dd7eeaee7b4e20e654a31879d42cce2b224c9913", + "server_e_sk": "2cb3b909d386e895f270345f456da3d277e616e97acd312d577368a19b287d95", + "fake_sk": "6b97f7ff70f9faab5a510f60a123bd0a4275b0755f5a9de2d78ab555be0e9ee3", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "018b16935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec07147f06142732eaf41a7a77264b040b2f17400d266ee0c2afeb07e3e2b1ed2da578e", + "oprf_seed": "5dd5874116fe318128b4379fbf815d1fc639bc0cf5e0e22fd3663dbb92bf3d0b3713dabf8b46384f2cf270263261e771dea88d17c72b25d4aea81b6f698a79a8", + "dummy_masking_key": "7d84c87b1062c9c6a964520375ece374a6ccd300b98e0c44c86f8286313fdc8bb9951461742e30b310163e30f477a758041a9e2b243512ef181e597271695747", + "masking_nonce": "83197a4c35c70664b83d2c390f98a959ab04063c884ecae53cc8ec5273d5c996896c4e59e286e5be64149b5262852a223bee7fe693d03beb631031c47d1e8fbb", + "envelope_nonce": "5c0e7b6dcbb3cf3499a6beaacf15ace76ccb773e961e67f3eee5453ad0bd6bda", + "client_nonce": "4af76e28f4c3c63e87133f2632adac89dbe4abb07542a9fffb5932b808e8af94", + "server_nonce": "14353c6938f56aeaaac49533e58402024c359d38ed107d95a38c35774e2a6516", + "server_sig_rng": "f305de8b2a39e7e30705fc6bfdee429f1cc3ce0f06503f3469c426f56538389f", + "client_sig_rng": "b08c2d1b6379fff02bc27705b49cd11a181589a90db2a5b8a7b4bdd155281e23", + "context": "636f6e74657874", + "registration_request": "020197b5a04ecb238d5593bebd29ba75b7705527686ca8af7e17de0ae324b9682fc550c613809a8e4802dd838588e5341a7b71fc6a8fd81068b7c698fd537fe03223c0", + "registration_response": "0201aaa3fac28309803793f4bf3bbb69fda2a4c6e7290e44b3177f74e0646d5a550f85d7be99fea97b0b36bca12db7ab580eceeeb2fe1b03d5602be7687386cddfabf302b4da4ad7faa9c00f98c4a35b63e9ca99c0445b2cdb8c3d67b8f1d242b33ca11c", + "registration_upload": "0299919d6711b1def8f2c4be014d851d0663e877f666a22c02651cf584358fb825d812e6a02ecd190967d6550aafd0612fada51ae8077fe620b38be13f176c64d63c0579652affe9b962f8081c5dbfea8581a783057d285c81b0d9f3a3bd4d6e707bf47e8031b15611f4e57ae1434de366b49ba593db315798e88956dd9dbc24e9e917117a6570966bb207b193f4edefa71cd32f74e2442e83d6d0137d669fde944f37eef549c1f7d1dd2763f2c95a841ddb3f92f8e6277bf1d60fc56808b79eed", + "credential_request": "020197b5a04ecb238d5593bebd29ba75b7705527686ca8af7e17de0ae324b9682fc550c613809a8e4802dd838588e5341a7b71fc6a8fd81068b7c698fd537fe03223c016935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec071470300de0cd43840b1e89088c31a44b499daee79076c88e48453954780dab203c33bb5c1cbd82bb0c264f9354b9abe4bc57d4accc3aebb9e0820cd75f76a5b24d50c3e2c", + "credential_response": "0201aaa3fac28309803793f4bf3bbb69fda2a4c6e7290e44b3177f74e0646d5a550f85d7be99fea97b0b36bca12db7ab580eceeeb2fe1b03d5602be7687386cddfabf383197a4c35c70664b83d2c390f98a959ab04063c884ecae53cc8ec5273d5c996f855cac20ca92d0046fd6f2a9dfa053cf57d32470bdfe7be158386a03442a83ae636e740679764dba22989c3a5ff4130ea14375796561519383516395daf461532a5e45c04c0fe5605bc87131fd6d2629931cdd0e7cd2491e0a9960fbef6cdc1952e1d69d23b823dfbe4001ca7185fb181d33bf9270cb35e03300d0a37a02b99f63c6938f56aeaaac49533e58402024c359d38ed107d95a38c35774e2a6516f3050201382fc958e5e04981fc3acba9859ec15349684edada929aadab30519b1e8867dc88bd7c3a9063fa137ac914990b6d38cf95e898a7412a941e176ade70a08aaa4e3158feb8e5fe6cac7993a8b735f7b86c0cc5ad8db6a8a00f06e9faf3c45c5fdc950139224020a906872382988bb8cbafb6c3f0f65637d074a99826b565fdc2d6cbce0284bf430743e6b6cc8841a8dad42c6c70f21e254c9d3e6417a9f5a98e756ac8327ca6009995d08fb18bf1f0649126965cc5bcec44a32d63a06be985341068", + "credential_finalization": "61800bff9127b9a484133910155a7439914a0166b15e290e9dfe3f5afa5e6395b6310ed6a9c46475a9659c401632b568563555ef92431d70614e2ae9ebe6dec125b991030bbc13d960f30e8b8bb37bb80050860f2f32e0c9fd6d188d006309b14bda972511f6d0d063b2fe561d70614220ffe3cd429906d14070a3febaff2a1e", + "client_registration_state": "018b16935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec07147f06142732eaf41a7a77264b040b2f17400d266ee0c2afeb07e3e2b1ed2da578e020197b5a04ecb238d5593bebd29ba75b7705527686ca8af7e17de0ae324b9682fc550c613809a8e4802dd838588e5341a7b71fc6a8fd81068b7c698fd537fe03223c0", + "client_login_state": "018b16935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec07147f06142732eaf41a7a77264b040b2f17400d266ee0c2afeb07e3e2b1ed2da578e020197b5a04ecb238d5593bebd29ba75b7705527686ca8af7e17de0ae324b9682fc550c613809a8e4802dd838588e5341a7b71fc6a8fd81068b7c698fd537fe03223c016935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec071470300de0cd43840b1e89088c31a44b499daee79076c88e48453954780dab203c33bb5c1cbd82bb0c264f9354b9abe4bc57d4accc3aebb9e0820cd75f76a5b24d50c3e2c00f6c7a5bed26110bcd3fe9ae2a9b56cce74a13e68e20ead3bbf59a1dfc762107679ba7126fff576f4b2b9aa4b00eb20b16765c6c147f0d927221a4a6f9ec824d05e16935232710b3aab9c97aea91bb8c5b1b2a82d183e19ab57c3b596d5cec07147", + "server_login_state": "0299919d6711b1def8f2c4be014d851d0663e877f666a22c02651cf584358fb8259252ded2574c1bc51555a42dbde35680ea995b0b737a0cd2c54097e33344f050d129e0e89680e9a006fa780a5626ab29a7ce904aa477243e8050427dd5b866e203c0a90560756b3189e32257cfdf5e1b9287d7c07679db241138706407630ebf25b991030bbc13d960f30e8b8bb37bb80050860f2f32e0c9fd6d188d006309b14bda972511f6d0d063b2fe561d70614220ffe3cd429906d14070a3febaff2a1e", + "password_file": "0299919d6711b1def8f2c4be014d851d0663e877f666a22c02651cf584358fb825d812e6a02ecd190967d6550aafd0612fada51ae8077fe620b38be13f176c64d63c0579652affe9b962f8081c5dbfea8581a783057d285c81b0d9f3a3bd4d6e707bf47e8031b15611f4e57ae1434de366b49ba593db315798e88956dd9dbc24e9e917117a6570966bb207b193f4edefa71cd32f74e2442e83d6d0137d669fde944f37eef549c1f7d1dd2763f2c95a841ddb3f92f8e6277bf1d60fc56808b79eed", + "export_key": "c7fb8f782d99ec4b8dfbb7da1651c004a35fbd8902ce36a51787e9db4898bae25264e2c80a7c829138fd424162bd3a62872aeea37385ce9c13f211f1e16bd162", + "session_key": "9252ded2574c1bc51555a42dbde35680ea995b0b737a0cd2c54097e33344f050d129e0e89680e9a006fa780a5626ab29a7ce904aa477243e8050427dd5b866e2" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P256_CURVE25519: &str = r#" +{ + "client_s_pk": "03ca186e43dcc2567519073a2169d756a4559280f008086e3f30b5f1c93bdad634", + "client_s_sk": "7f135c44c04c6d56e5e3d2f8ea38223750b229fd0e353818a0921a4d4fd4b122", + "client_e_pk": "03857466cff506eaed24786277f33574db817e74c308e75cb0d7b057d0fbbb9439", + "client_e_sk": "4081a449aa42f4b086395e4d541d420be2a57f036940199cfa7575f1059c0843", + "server_s_pk": "03497a9a07ac98d0d11090c6b3ca83a988fd7c9d886453d10753362399b2182f4e", + "server_s_sk": "11e1dd9d343057fd7392d6e0d303610a9803afa2079966c5cbeb46d02144469c", + "server_e_pk": "0313af2d97b722a1b57881f1c0f2d4c417f25440807589636dbe6b8149989cbeaf", + "server_e_sk": "9d587e1e73263c8f449d9ab80ae90771478d0c9380df48969345fddb921290f5", + "fake_sk": "f0604249d487b7413a2f7656a94cae1def05624bac1e82cf1b07d01bcce890b8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "224269dcf6edaa262938ea11f7c6bbd258881d7b98eb94bb4fa63b63ce938000", + "oprf_seed": "120c5707c273b863676554008591f087fda372ecf4781ec596bb43da3b9c71008327c555e7a83f2cc3435520e5c538517835831c18f7549523303e84dc2de466", + "dummy_masking_key": "ad4879e25492346e79bfbbff21d79cf9af790d71f311cb01a37c74c749534f6b1038b99a7669465cc26cf7d461ccff205103ef611a3dfb2a843b76388ab92f41", + "masking_nonce": "2a1a8085c3ef8cf4d35c802f0a5cb2aad6bbe009ae3ee74747d8cf4c61f7d7f66f40a47bed1fb32dc48a2434942569f65e48294c9bef527082b604151100392d", + "envelope_nonce": "ec9006440d47a31fcdd7c7018bc4bc7c54d5efafa8f62945b3f76ce00d2cbb56", + "client_nonce": "02bbd6b2646d498f7a5c3c2ba07149d9b864fa90c40a7939a29a2ca5af013e9b", + "server_nonce": "af1b68bb9ff304c684cb4c77819769e17cefee0e433dd59a89152392dca3b8c6", + "server_sig_rng": "7e5e2651f75f7988103d5ff0bbc691281a71f72b3b9521b5e29e193a5ac9311e", + "client_sig_rng": "ad965a65a5f638dcb83851d2a7719009dbd6d2da83b0eb16826b2bb3c1f65867", + "context": "636f6e74657874", + "registration_request": "de224cda6e0058f154bf56c19eabcc051617c3f5e06ab62f9b3696ce3bf66b60", + "registration_response": "06859b852f0c88fd810213f45704af052ba4dc957090e227122632291b1b4a6d03497a9a07ac98d0d11090c6b3ca83a988fd7c9d886453d10753362399b2182f4e", + "registration_upload": "02eb39eb2cb51f620ea4b82d365dbc270c4881d4e7c986fc7f992a6bd918d387b2392881e91672c987107c80c6ca9d92d88994cfd8a746cdb72c9f366177534ecb06b706cc0b19b71aadd7e477a85e19c26de30be7601b3d5cd4902ac35b24d4d67f135c44c04c6d56e5e3d2f8ea38223750b229fd0e353818a0921a4d4fd4b122b3da8f3cf39ea430e1739543b7a9255a5df3449222c7b37b06c2dfa2f3b9c581a81edc373d56b9f45a1030e4cb0e43fd120f95bc07834507de297aa7f4225207", + "credential_request": "de224cda6e0058f154bf56c19eabcc051617c3f5e06ab62f9b3696ce3bf66b6002bbd6b2646d498f7a5c3c2ba07149d9b864fa90c40a7939a29a2ca5af013e9b0d3c9e9b0b49afda94c1f26a5f2de175d9b73d970dd9cbb09137ed3545e83135", + "credential_response": "06859b852f0c88fd810213f45704af052ba4dc957090e227122632291b1b4a6d2a1a8085c3ef8cf4d35c802f0a5cb2aad6bbe009ae3ee74747d8cf4c61f7d7f6bc59c7b30f6d28db504d6b7195aef220a82bd5464be5e6e67597d9d93c37b1c7aa0140e359ae5f8627e5fa561210eeefac9a335a7f0ef89861e84b1de2eb0505cc683e7e4e9828dcb7cf2cff98da0f941ba2d99492eb87b4cb5353f5c6d5254645167e25ebb3f6c4cf8a99b0a98ad76e84c31fc7142893210b03f59827ed5e3b3b9d587e1e73263c8f449d9ab80ae90771478d0c9380df48969345fddb921290f530943bac71b2d8ac55ca06fea6a6ed930ccaae3946cf0e5acad393f0375f2136e29b7881dad3f4d4901eff25df815ed13566ef00f1a1a041234835282379f3e22c055a070fbb2a621fc503e21f60e053b075ea9e1bb0055b56dd91792a952fa7ac3566f1b513916c646b87bbaeebf0638e2f7a3705e63306cf9b452940f13f8f7bc74e1d4ee0f27bb11328d91c8a73cfaf407e3bb504ae1648ee7044da39c987", + "credential_finalization": "1b90eb25e985563d18d48a94a7f31256cb3cfc6d25c0cda5d41b6c92b237dd196d2ca2e70e5487630255a528279358cb17a7564f3670b5f4778d8acb9b002ed98dc8397d9240742198f11afc5ea0a7a0f058d8d9a3ada5ead483e8862f8382d9f403dcee8c74910ae2ae5bbf10372c32850272fededf7c01eb17d059c110c1e5", + "client_registration_state": "224269dcf6edaa262938ea11f7c6bbd258881d7b98eb94bb4fa63b63ce938000de224cda6e0058f154bf56c19eabcc051617c3f5e06ab62f9b3696ce3bf66b60", + "client_login_state": "224269dcf6edaa262938ea11f7c6bbd258881d7b98eb94bb4fa63b63ce938000de224cda6e0058f154bf56c19eabcc051617c3f5e06ab62f9b3696ce3bf66b6002bbd6b2646d498f7a5c3c2ba07149d9b864fa90c40a7939a29a2ca5af013e9b0d3c9e9b0b49afda94c1f26a5f2de175d9b73d970dd9cbb09137ed3545e831354081a449aa42f4b086395e4d541d420be2a57f036940199cfa7575f1059c084302bbd6b2646d498f7a5c3c2ba07149d9b864fa90c40a7939a29a2ca5af013e9b", + "server_login_state": "02eb39eb2cb51f620ea4b82d365dbc270c4881d4e7c986fc7f992a6bd918d387b2a56904a9e61130f1212cee4c3acf800d61d40f1e7036dee6e2cc5f703600689c33d6ff6944f8d116cedd42312f040f9c04f635397c14a72752f011324ef215bf6f05f9cba6e7e512b3658090f94f6d550f2ff561bd5da6f42d0de52e28da244f8dc8397d9240742198f11afc5ea0a7a0f058d8d9a3ada5ead483e8862f8382d9f403dcee8c74910ae2ae5bbf10372c32850272fededf7c01eb17d059c110c1e5", + "password_file": "02eb39eb2cb51f620ea4b82d365dbc270c4881d4e7c986fc7f992a6bd918d387b2392881e91672c987107c80c6ca9d92d88994cfd8a746cdb72c9f366177534ecb06b706cc0b19b71aadd7e477a85e19c26de30be7601b3d5cd4902ac35b24d4d67f135c44c04c6d56e5e3d2f8ea38223750b229fd0e353818a0921a4d4fd4b122b3da8f3cf39ea430e1739543b7a9255a5df3449222c7b37b06c2dfa2f3b9c581a81edc373d56b9f45a1030e4cb0e43fd120f95bc07834507de297aa7f4225207", + "export_key": "60f347eb2614b02f628251843c28e7f74075626bc093a0af16137e3b9a2b7f13595321e8cd440a48df635c8b5cf9737a9f953dec987d00b9c733370dbf90ce3c", + "session_key": "a56904a9e61130f1212cee4c3acf800d61d40f1e7036dee6e2cc5f703600689c33d6ff6944f8d116cedd42312f040f9c04f635397c14a72752f011324ef215bf" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P256_SIGMA_I_P256_CURVE25519: &str = r#" +{ + "client_s_pk": "02addec1fb616e513b78ff2a4fe76df8355843bc79bddf6966b7a96075fb6ea173", + "client_s_sk": "4681a66a3ccaf86b60f7fb97cdcaee431044028d507335281a34c0aafdd2fb73", + "client_e_pk": "03af9eddac1b0ca43a029d889ed37972699c8860847e13e7f4a27103b74c538a0b", + "client_e_sk": "cc7934659091488752afc0f81df52d5950161f84e86fd40b067759c4aa5e7f0d", + "server_s_pk": "03c2638e58e0464369fb4d7bc23626df65c9e06efb44eea099e38eaf920d9656d3", + "server_s_sk": "d180227cecf4688c2d2f3a21a56f5ad4024cc9371b583ea408fd1ebee413fdd7", + "server_e_pk": "0281c67d24a9a680d668384eaf2bba8940b4d2fa92b201644871c0149a5cd624aa", + "server_e_sk": "f13c02fcec7a84cd23e59e66750c72139dbd8bde5668a3eb83d724c0b254208d", + "fake_sk": "ebbbdbe5b70719f2fc8641eb502aad7762c1ef6a40ddba5c76e611dd878fee74", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "7725ac1186d7ee75ea919a1a35947149c80bdfa0d94c64be8a682543e1ecb3d8", + "oprf_seed": "2d7842a24affc4daca09d1391011362e2b2babd326ef1c98e8275d2c6d7dc35f", + "dummy_masking_key": "8fd5b979b4107ce7e6b92c84f722814b869b94d885d259d8d4ec98d321d4e4b8", + "masking_nonce": "eec2ab943496af130eb1c267ca897e849ab30d8126b39d2649d389d73415680ce8dc7cec11ef16a753678283261e67b1794efbb74ffee9c5308f7e85cdd9cff6", + "envelope_nonce": "b57785826c82836f9aa539172d0b8e8be22a2cfb5b5c214d9ce0fce15456e257", + "client_nonce": "697e5626ce501b09162d27a59d2759ecb494588d2ec8964b8efdac8966ae9ff7", + "server_nonce": "ac63b3a3b2d553f5912afdd4a159d35afb7fc93c67e04b27e364ca82ac38e93b", + "server_sig_rng": "4f7582b3a7c569e212c136be63e03a1b923f29ccae2432bc6d5c4274799be476", + "client_sig_rng": "6bf2120b5de857d6388d4e49709c81d97b9eac02fc902201457207fcf3c063bc", + "context": "636f6e74657874", + "registration_request": "0385d9952818a239fa5826a02c0a6a83e21c919393b72ccda72c0ac8389a7a75ff", + "registration_response": "03695f9ad08156ab1c76b1287940d5d74eb2e174ae78739bdd2c68e9d07b50daa703c2638e58e0464369fb4d7bc23626df65c9e06efb44eea099e38eaf920d9656d3", + "registration_upload": "03d5cb1afb2e6df914eb7e365e5825ce510248716cb9a41256bde0de456b5eb63034cd864e52b4ca9903c30e86ecd796ce44ec136a927ba1e36db68ffa6f1d9ebd4681a66a3ccaf86b60f7fb97cdcaee431044028d507335281a34c0aafdd2fb7358187a7bad57ba4dee62d71863f267cfc2b45905007bb301fd60de2eb6a0d2e9", + "credential_request": "0385d9952818a239fa5826a02c0a6a83e21c919393b72ccda72c0ac8389a7a75ff697e5626ce501b09162d27a59d2759ecb494588d2ec8964b8efdac8966ae9ff7fa3f7f88c7eb5f86568c018b104fcd283e478cfaa6b2bbbc5996b1efc7829b6c", + "credential_response": "03695f9ad08156ab1c76b1287940d5d74eb2e174ae78739bdd2c68e9d07b50daa7eec2ab943496af130eb1c267ca897e849ab30d8126b39d2649d389d73415680c865dd0b5028cea26043c08f03c1a63c5336a4933f069ab916487e9f48c63c4019534691c22d6f7f2be7d52b1b1fe2d9272832a72efa00a9a72793f346b3a846ba6a8bbf712e931dce8b067fb95f6064a722d51eee07323ad48feeb9a1d8b469514f13c02fcec7a84cd23e59e66750c72139dbd8bde5668a3eb83d724c0b254208dd25b42e3e780458cc73fc71a2a58fd10719009b78d5d93b7f40a9db96c10250752e8ddadc7205cae098d572c533eb3f00e5fdc1ba301f61b23b737683205284c0875365a1cdc2b3d8292309f9b3b0c032fe49d2a1581f709c10ec73ce57ef6383f1cb89f640c956f1b541b1bdd5af83048cf35c81e2501fee3de20a63fcab99e4ef4b86339dfff45754ee8a676e3a779bf43ef1cdc07d69e42bb6aa9753d80c4", + "credential_finalization": "420b2f974d2f20a490ccac032250bb8da3be6970b21d6341afd9bcc44bd2ee9d5cfbc8cd98392f8db22d83685ab668d663b55291fa1bd62e1ee0721f9e8b23f45a6efa359beec632e6a8d43abadb4fda2fb645c705ebfa8af63faf5daefe4c54c61e3ce1ff7089ac973a81399a1b525bfe9faf5161e4d375c91869b730e85f88", + "client_registration_state": "7725ac1186d7ee75ea919a1a35947149c80bdfa0d94c64be8a682543e1ecb3d80385d9952818a239fa5826a02c0a6a83e21c919393b72ccda72c0ac8389a7a75ff", + "client_login_state": "7725ac1186d7ee75ea919a1a35947149c80bdfa0d94c64be8a682543e1ecb3d80385d9952818a239fa5826a02c0a6a83e21c919393b72ccda72c0ac8389a7a75ff697e5626ce501b09162d27a59d2759ecb494588d2ec8964b8efdac8966ae9ff7fa3f7f88c7eb5f86568c018b104fcd283e478cfaa6b2bbbc5996b1efc7829b6cc87934659091488752afc0f81df52d5950161f84e86fd40b067759c4aa5e7f4d697e5626ce501b09162d27a59d2759ecb494588d2ec8964b8efdac8966ae9ff7", + "server_login_state": "03d5cb1afb2e6df914eb7e365e5825ce510248716cb9a41256bde0de456b5eb63005886e3686352917ff26617d17c89366aaacf75110f85096efb513d4f1c702f57f994743f6f3b97f0e6186de41acdf2cecf485d875b8872b2fc7200c7e3f12a5e2720569cf3b7003499aefb818a00d811e345fda4304cb60d6c1d2c6d2714ad65a6efa359beec632e6a8d43abadb4fda2fb645c705ebfa8af63faf5daefe4c54c61e3ce1ff7089ac973a81399a1b525bfe9faf5161e4d375c91869b730e85f88", + "password_file": "03d5cb1afb2e6df914eb7e365e5825ce510248716cb9a41256bde0de456b5eb63034cd864e52b4ca9903c30e86ecd796ce44ec136a927ba1e36db68ffa6f1d9ebd4681a66a3ccaf86b60f7fb97cdcaee431044028d507335281a34c0aafdd2fb7358187a7bad57ba4dee62d71863f267cfc2b45905007bb301fd60de2eb6a0d2e9", + "export_key": "868911463e1117c8a151399aa725d463c475756bd4536d04b290c77d462ae8ae", + "session_key": "05886e3686352917ff26617d17c89366aaacf75110f85096efb513d4f1c702f57f994743f6f3b97f0e6186de41acdf2cecf485d875b8872b2fc7200c7e3f12a5" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P384_SIGMA_I_P256_CURVE25519: &str = r#" +{ + "client_s_pk": "030709d3ec5dcb3d062ac41bedba248c9e376ae50f4048928286628828ba658c61", + "client_s_sk": "53dcc084986b8343745594990335a703a1371e1c2a468506e91db6a25583ee3a", + "client_e_pk": "03a3612d57cf147eb75ae2854eff0b5d9388535a8ea104981fac53fa87e89218b1", + "client_e_sk": "61854770d1e98cf7b2f7c73ec6865ec7210e06ac763e0319c358552d3a8a9f23", + "server_s_pk": "02a52565cee0e96397c70effa62986cc6fd157e9e27a32d74af98f37869df6b1c4", + "server_s_sk": "c563d51c3135862679db5b9298dea5a49fa7d8676717c6401601938e22f134e5", + "server_e_pk": "033fa98a1f894af60600c67acf6bf76b5cb4b9948511dcfc6978ebe5ccf0c95226", + "server_e_sk": "88e744433fb0d5c61e40a1fdd895b060c435f8c34573cb1704dcd892d1e34ba5", + "fake_sk": "a0edec69680a03b7530adbb49e822328b69cfabf1ed7afc1237ca7ec13e8b5b1", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "8b317771e9ee06c51eddf1ba20be7071655a83673caaa203b7f041b40846b35fec017d6ca93499c079b93c362b943e10", + "oprf_seed": "817c78b4a9d9574da9c1bb588e8ea75ed4dabcfd07ece3d4e722cbe7a4f911774955f5d69346fb7397e0bec92aceb9a3", + "dummy_masking_key": "98dcffcffbdcbf87fd8e189b139c6c8e8ce71221a4c0933329a8bc6262e4f7951f1cf58b9968b069ce95525963cee2d6", + "masking_nonce": "712f9d81afaf566bbb7c125a95be1820a8b0e015eb8c39e2e81bdcaa34a38d79312d2efd847c2ecd138b445901221615403b64d3f08f349b0fa82427414504eb", + "envelope_nonce": "cff046bdcad575bc90b9af0b407bcb111d16efed3bf0e494f01fd85159658cb3", + "client_nonce": "3abef45930243309b4a9faba58e16b9137793a3915ded0899982f476b67bbfc0", + "server_nonce": "ef0b62403e0a7fb1f9a7e817adec3183f110bb10646051dc24299448d4abeb68", + "server_sig_rng": "26ac7a9adedf63f69bb9276a3ac85c839e6396e17e3a9f60fa4645626fb3d922", + "client_sig_rng": "33d72ea97961677f621805262775a7c30b25cd3b671c58e14052a9c2d251c3d5", + "context": "636f6e74657874", + "registration_request": "02a0fd05e9c85ec6b59a9e931abb68555f8bcb003b3935855dfa96dbd5de77085fa7cf9e7add35b188dcc9a5fce87c89e4", + "registration_response": "023a71c617cf79f25d9fb2eee4358b96f935b77a0c9574144b675c3d1452ac788db8948e34e81ed49e7ca976de956918f702a52565cee0e96397c70effa62986cc6fd157e9e27a32d74af98f37869df6b1c4", + "registration_upload": "03d1530795e175adaee8c2c282dd539330d2b85a68b09eeb3c8ea70165e43e5c8c320bfc751f0a9ce9d95bb8ba50d7b8832950b4389a9df00e1d5ab249159af5fdd042de1a8e4e3348e908ea29117df70053dcc084986b8343745594990335a703a1371e1c2a468506e91db6a25583ee3af09b009bf5ab95b5a22d999b1e100a172107a143cdad20336b7f767d99d578bc890edf3dc5bacca57d0a260d87d91635", + "credential_request": "02a0fd05e9c85ec6b59a9e931abb68555f8bcb003b3935855dfa96dbd5de77085fa7cf9e7add35b188dcc9a5fce87c89e43abef45930243309b4a9faba58e16b9137793a3915ded0899982f476b67bbfc09a3457fb7c336b4657898938f6d0bc6a85ea0bdae48bb06ad3dc524c96b83159", + "credential_response": "023a71c617cf79f25d9fb2eee4358b96f935b77a0c9574144b675c3d1452ac788db8948e34e81ed49e7ca976de956918f7712f9d81afaf566bbb7c125a95be1820a8b0e015eb8c39e2e81bdcaa34a38d79f97ad6cfba950259ce16b0940423b308f97cef5aa66265b8130647edbe88e9afab4cdf882ec170d1fa7d191cab90b8b2b08e1d3666efa35d36e0ffc530e06f497281605aab71a461c860f544a55f91cd7c9ed197c9dce6e199a80fdad0a359b35e5c37ac826b4fec849fb1f7e63cb9beb388e744433fb0d5c61e40a1fdd895b060c435f8c34573cb1704dcd892d1e34ba5a8806c237e15f45774d60bbfc357c5294545db4ec495768e92f8a0cc26f4e607b615d998fe6a45eaf0d8be60b5c372e362625775c4aa16ee14c9a1033c54d6314cee247f020097683d357869c8971ab997bf72bd3573aeaff1fd2035e4678e322db8a0e303e74877db8f61deecc857a964fd0cd225f1ea021c1a59d58c2d5559f9f43290b70d8153d012bc46a1217a361215992a876bac9e9a289346f06024a3", + "credential_finalization": "e1347dcb5e46f439df9eb91bac863bf6955aa355745b58ad48692853795edf9fe071e33b6ef8c4ff2c474088843406bd128982ed9dd62c67d8b40aeab57cc5f1490cf5d3291ca6d869ee98796ba2b49a324c1a8a428cd2d37108590b11bf78f2e0b8ab284e208697061c8b62afa39aff7e2b75f9ac23599acba82874c9ae28cc", + "client_registration_state": "8b317771e9ee06c51eddf1ba20be7071655a83673caaa203b7f041b40846b35fec017d6ca93499c079b93c362b943e1002a0fd05e9c85ec6b59a9e931abb68555f8bcb003b3935855dfa96dbd5de77085fa7cf9e7add35b188dcc9a5fce87c89e4", + "client_login_state": "8b317771e9ee06c51eddf1ba20be7071655a83673caaa203b7f041b40846b35fec017d6ca93499c079b93c362b943e1002a0fd05e9c85ec6b59a9e931abb68555f8bcb003b3935855dfa96dbd5de77085fa7cf9e7add35b188dcc9a5fce87c89e43abef45930243309b4a9faba58e16b9137793a3915ded0899982f476b67bbfc09a3457fb7c336b4657898938f6d0bc6a85ea0bdae48bb06ad3dc524c96b8315960854770d1e98cf7b2f7c73ec6865ec7210e06ac763e0319c358552d3a8a9f633abef45930243309b4a9faba58e16b9137793a3915ded0899982f476b67bbfc0", + "server_login_state": "03d1530795e175adaee8c2c282dd539330d2b85a68b09eeb3c8ea70165e43e5c8c8cb4106ae576669579acf4490e83201154ee9d8c462fd3008140c2eddcfa3fd42e05e900559dc6f234493336c07246b3e65e59642af58ad546801d3546acc35e6cd36c084997e0dc146fff4328a42ab45bbaf94b97b268e9e20cb64ce2ae130b490cf5d3291ca6d869ee98796ba2b49a324c1a8a428cd2d37108590b11bf78f2e0b8ab284e208697061c8b62afa39aff7e2b75f9ac23599acba82874c9ae28cc", + "password_file": "03d1530795e175adaee8c2c282dd539330d2b85a68b09eeb3c8ea70165e43e5c8c320bfc751f0a9ce9d95bb8ba50d7b8832950b4389a9df00e1d5ab249159af5fdd042de1a8e4e3348e908ea29117df70053dcc084986b8343745594990335a703a1371e1c2a468506e91db6a25583ee3af09b009bf5ab95b5a22d999b1e100a172107a143cdad20336b7f767d99d578bc890edf3dc5bacca57d0a260d87d91635", + "export_key": "ba127de52e75e274be9e13d2fdacead21340eccb51bf9720e24ab00b44862d8ae0b1f118daa1f8d3738d97e4d6bea042", + "session_key": "8cb4106ae576669579acf4490e83201154ee9d8c462fd3008140c2eddcfa3fd42e05e900559dc6f234493336c07246b3e65e59642af58ad546801d3546acc35e" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P521_SIGMA_I_P256_CURVE25519: &str = r#" +{ + "client_s_pk": "03373f43975bf470f8508b7959eed96869f29311df052860318ab78fb1fc759431", + "client_s_sk": "0d6cb28685c0344c5f314737b983e56a0b5152a6cb4d1f08abe02706c5e772ba", + "client_e_pk": "024fa838cac614209ebcf5d87422a4bc2322c0a37678f3e46125d5414d107df14a", + "client_e_sk": "a79217ea09ff4aa9f63f5ae422989df5ef7a753ee0bba73fbc18f04ba180ef36", + "server_s_pk": "03fd23498b3c482d2d6cbc0ccfd1bf8898892ad455e181e2ec3505c61a30cdbd1d", + "server_s_sk": "581b295756d111c76ae1cfebd06d6ba3ea46221fecc7c5bd40880481c23a1a47", + "server_e_pk": "026313faf812173bc77c850e37ce3eb7ebcb1b233efdc8058a2138f7f8a7939016", + "server_e_sk": "d53f4dfd22f2693ecb0379e27a4ac2aabda482aae076309db201e56d7f6dbbeb", + "fake_sk": "be9dffcb113bf0017ac5feafcf7d31a4bae7a92d739b6eb24d49c25aa07bb184", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "013f9aaebb7ce823bc617949a032e11fdb41932063e8d9af9377527816edd18899bf81044e9b7171c91f2c6b2e34dd1ee614413884160d824588da3b994eb8f47d3a", + "oprf_seed": "98fe0df530fc618a3c0ba594913d00a31b66dca7f4fdd87d69b4f1cc6ff021328069bfe2d760cbff57867606379ece61168d163f55c9a3eb856ce65b46b5f1b7", + "dummy_masking_key": "7ad1b415e0228082dda2c38a9f0524bb1e52f2578480e6c785349510a19c8040015652112f47e7afaf1bc8ca3e247be32654c9ed2e0673e27b8c3c46cd696ff0", + "masking_nonce": "24d886efebf3edfb207f43a86f92f56073be1c80c4552a46e6b5f0cae4ae2e6c1458da21eef11f2e043982dec563b27afe3240d68017ee9262e4c0b3a10b0c37", + "envelope_nonce": "cb9bd1f824e327957a175f3549b3e0160446b56e029543d4eb0c80e74e20fc2a", + "client_nonce": "368429942a14fb35b036ceec638572842d940031297ebada26b885b40b4a41b2", + "server_nonce": "9d9345b28766fedb574356574b50c67f784448108bbab590f2e8a0a31a72e371", + "server_sig_rng": "20c5bf94f4a318e7af6e76a30a1e947b64d74abb6ab234a63fefc66fb88cb587", + "client_sig_rng": "b249b71dc44cd563aa4c6aed2e9c942fd13b73f5c00674cdd93ed9e9cf16e98d", + "context": "636f6e74657874", + "registration_request": "0301b2ad9c479f0483b018cc8d9bfcbe846d81a6947cc6a64e59ba57d92c3c796bdc8cd2d937dea264ba2c14116fe0c16aa90895d2a00712bc881160252ce5703af2a7", + "registration_response": "0200d91f56046824aa0ca6f1411f2a8cdf27611023bd84930d89e724042ef7d1faf7043535c2506f0155441c44b2292b263b89b5d4422c64ab5ddc3f160f6259aa6db103fd23498b3c482d2d6cbc0ccfd1bf8898892ad455e181e2ec3505c61a30cdbd1d", + "registration_upload": "033b6923aef73d2074a3a3798e2422fe60e58db7dc4a72c65d4e1b671ff84922b13788338e1cf61431e48b9b7ba78521758740bfee6990c876e1b5f1645a374cbd33503e0cbb79ab98fd89c58e483fb8cdbd2494033b48d17fcbaac70c97e9dee30d6cb28685c0344c5f314737b983e56a0b5152a6cb4d1f08abe02706c5e772ba1faf6a6a6b44a06aa30d4bd0bb9eb3b87cc3442876aa865ef73ff2197bc86a4fafe2a134aa4e76d849dd182f6836f7623c3b098c2dba1ca3286e1d2a61cc6e43", + "credential_request": "0301b2ad9c479f0483b018cc8d9bfcbe846d81a6947cc6a64e59ba57d92c3c796bdc8cd2d937dea264ba2c14116fe0c16aa90895d2a00712bc881160252ce5703af2a7368429942a14fb35b036ceec638572842d940031297ebada26b885b40b4a41b2fe43f813132a594abc8b69e6fb927b01136f741d649eff87cc4a05d1fc025f20", + "credential_response": "0200d91f56046824aa0ca6f1411f2a8cdf27611023bd84930d89e724042ef7d1faf7043535c2506f0155441c44b2292b263b89b5d4422c64ab5ddc3f160f6259aa6db124d886efebf3edfb207f43a86f92f56073be1c80c4552a46e6b5f0cae4ae2e6cba9ab880a4f306c29b658691db4d4e0cb76dddeb699e42cb5311aee3644814c52d3bb5eb4a595b2f7eb78fbff1459d71e9266c9e19831adb00e32d7283ca343257adb23322d20b3012d0b9f3b53b7dad63545f0c8a9b4146c39a1ef0cf4fab93181630a7a9c1f02869d64db104ec66975b7c777eaa409fbd522975b26afaee876bd53f4dfd22f2693ecb0379e27a4ac2aabda482aae076309db201e56d7f6dbbeb8e119c24802246d7a8803363a471c06e1c6af543d4341e8379f8e878b6afca778ce3c34f7f20d01e9b3cc8de10d7f0e5c50f498e92304eb864f74e05898ae3499087506939771eceb9419606ec8c1ac09f42e68b59fd5dd3555667349e8a34bee2cc6fb0595f6a062bda0e7b23d5a5fd7893a57c36e7a68d05473dfb6ed0d76a84f231cc5f0cd9b48761c078c20f2b585aab82fcfb675ceb791f1d21fc8dd259", + "credential_finalization": "30c77bc8ed1248f400150b893250a3ce1e7372a3e78f785400630bfe7145461076cdc875080c69a1966f51e2ba57fad00c31446b7202a9366f2d1a2f5305fea57f9ea812c7ee0ecbf36d4d8404c8886397c8870e577031634c875d3ddd1661b0667e940be845c4122e3d6c3acca822be36288f50351cfd75a20124c18cb51762", + "client_registration_state": "013f9aaebb7ce823bc617949a032e11fdb41932063e8d9af9377527816edd18899bf81044e9b7171c91f2c6b2e34dd1ee614413884160d824588da3b994eb8f47d3a0301b2ad9c479f0483b018cc8d9bfcbe846d81a6947cc6a64e59ba57d92c3c796bdc8cd2d937dea264ba2c14116fe0c16aa90895d2a00712bc881160252ce5703af2a7", + "client_login_state": "013f9aaebb7ce823bc617949a032e11fdb41932063e8d9af9377527816edd18899bf81044e9b7171c91f2c6b2e34dd1ee614413884160d824588da3b994eb8f47d3a0301b2ad9c479f0483b018cc8d9bfcbe846d81a6947cc6a64e59ba57d92c3c796bdc8cd2d937dea264ba2c14116fe0c16aa90895d2a00712bc881160252ce5703af2a7368429942a14fb35b036ceec638572842d940031297ebada26b885b40b4a41b2fe43f813132a594abc8b69e6fb927b01136f741d649eff87cc4a05d1fc025f20a09217ea09ff4aa9f63f5ae422989df5ef7a753ee0bba73fbc18f04ba180ef76368429942a14fb35b036ceec638572842d940031297ebada26b885b40b4a41b2", + "server_login_state": "033b6923aef73d2074a3a3798e2422fe60e58db7dc4a72c65d4e1b671ff84922b1f993bcc10089a8c5b244073f7b24b3289d95dc1a696d23ea0e1b7f765ff22b86bc271b643ce7464e870e47fbee01707233111988418deaef7b8a8e2931cf7e8e238ed79dc06cd9ed2c09c12d23f1a9cc6d35999cf3c0268f6676579893bdbf747f9ea812c7ee0ecbf36d4d8404c8886397c8870e577031634c875d3ddd1661b0667e940be845c4122e3d6c3acca822be36288f50351cfd75a20124c18cb51762", + "password_file": "033b6923aef73d2074a3a3798e2422fe60e58db7dc4a72c65d4e1b671ff84922b13788338e1cf61431e48b9b7ba78521758740bfee6990c876e1b5f1645a374cbd33503e0cbb79ab98fd89c58e483fb8cdbd2494033b48d17fcbaac70c97e9dee30d6cb28685c0344c5f314737b983e56a0b5152a6cb4d1f08abe02706c5e772ba1faf6a6a6b44a06aa30d4bd0bb9eb3b87cc3442876aa865ef73ff2197bc86a4fafe2a134aa4e76d849dd182f6836f7623c3b098c2dba1ca3286e1d2a61cc6e43", + "export_key": "d3860ab64dbb625a5a8a10002cf7e34c136159b3dba1c880bbc8bc9c1a7902d12952edcf255f1f358f274f4280ec4b7c80737b7dbeedaee45861f7678bae2a74", + "session_key": "f993bcc10089a8c5b244073f7b24b3289d95dc1a696d23ea0e1b7f765ff22b86bc271b643ce7464e870e47fbee01707233111988418deaef7b8a8e2931cf7e8e" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P384_RISTRETTO255: &str = r#" +{ + "client_s_pk": "034ccd3ab258b4beff047d7cae8299976be85463353c80016b12ded9b115be3b2aeb7f80e61d98aee152c5e793ed57d732", + "client_s_sk": "9ba354c14cdaf7ed4dbc617ab097773c58ce720bb1c52515c7f8a615e13d41746c07bd88c2c102286852656c5b12a556", + "client_e_pk": "02b348d3cc8cb012a78a9ec91172043b2fb34008db77a244549ad1aa5b78f3146217d28a4955e264aafad1cc51eda492c7", + "client_e_sk": "14aa97d13007bd92e49f152ec20c91c4db0f8c811df338d560c93c8f8e1c36265529d6c931b93c52eb84451b6f025755", + "server_s_pk": "038518526fefcacec264b13a3bf5cf5e6b03decbb7851c8d0889faf92980a17756f97426d05452507b46940c8284ee2a55", + "server_s_sk": "d7d0131e7aaf6a1e942683b1c272ec60977789812e13c8c7c2d07578e66c8be6b4ad794e3916923f6d56fd520b9c3256", + "server_e_pk": "038e27b1a872a661a52b9c04b0120dffab6aae37bb3d78c2b75e9c8f2e142da7e5361b3abf3b1d05453e362b4a098d3e37", + "server_e_sk": "d079ea7958ec99dff75d8691e9612e7942126545690e8d9c7dfbeb3bd8c874d706e3785447e258593126d63caf69b5aa", + "fake_sk": "de84c8429ac2746bd83b0262d7c41cd244a86b0d35409f3e2756841b076d461f62dfe5cf57e8cc2a344dea30bce76292", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0f99c4d1fad85fac58fd19fc42934772a9e0478b32e3178f31dfea2c5d1da305", + "oprf_seed": "11ad6fe3ebc730afb88c2ef1b17d37762daa7ef5c65859d2ac88681101a57569937b161b726eb82b66fe0db77fe872a624bd4a0b3975b61d3e659a452c8522a5", + "dummy_masking_key": "8ad120941a013c0be369d45a9e3875bd85eec4f3d0d8abed2cca0dc0e629b2cb3f9d5fe7c773c5930bc43726c6a7096b12c7d40fb8a2941094215aa5268f6f67", + "masking_nonce": "9eb2ef199762a1d79b7ad12843054b50225b50bc2dc56e2acf395a3de4d5fb797fcdcfcbbae0e9f489aadc9525583558bafddad5d655203f665378be71332083", + "envelope_nonce": "7f5d41113fc23fd1f9fae7d235b25cbaee29539694a7ac388468b0d1d009f972", + "client_nonce": "8228ecec7da67ed1a65feb74f4bd079f03fd11b1d5075ab8771847611be2dfcd", + "server_nonce": "2a826b7821baeabbbb2b62686dad5978a39e2deb81ed142686c0c17aeb41e4d1", + "server_sig_rng": "eb271e9d192748e897e27c1a1fe2fb3992dec252ee5bc47e7218e00a002484d6c79741783e020f1ed2bc05c00fe41408", + "client_sig_rng": "dbe5916c02f1a940f51c041bcf4f24c0ed72e7c022e25d800fd9eb0cb70e6a0f4907219c654be3db7257c7dd6fadff2c", + "context": "636f6e74657874", + "registration_request": "620cd3974eababa61bf47093efb3a3eff1558b4adc320fa9cb6046cdd2a8155d", + "registration_response": "b87fb725c21a9b8f6aead2bfc0904e0888ee9ce23336157df72ea7b09a46ab62038518526fefcacec264b13a3bf5cf5e6b03decbb7851c8d0889faf92980a17756f97426d05452507b46940c8284ee2a55", + "registration_upload": "028c804e1cedfdcdb14ee09df61f0203000f4764f2a3a4da525fd06d2201e872460846001018c35b59b1c47b718412b54a2868726cc6716eed407972158a73c3273d324e001d9e3a8efc3dc76255668a5743f3a0f8db142ccd97ea6498c290c14ed969ecc7f12a7acea510c603978201529ba354c14cdaf7ed4dbc617ab097773c58ce720bb1c52515c7f8a615e13d4174cafad0a99abefeebe7be043c44a7a5bde2cabc3c3a24c59fd8bf117cc18f80d140b49ad690d612e59d616405b716bbf29f315e8e487fba9a5a1c748f8cef12f7", + "credential_request": "620cd3974eababa61bf47093efb3a3eff1558b4adc320fa9cb6046cdd2a8155d5529d6c931b93c52eb84451b6f0257558228ecec7da67ed1a65feb74f4bd079f5c009d9a92fba16c0a16f6b392d35cda032f0d1b90f9fbbc20944728b1b2797a", + "credential_response": "b87fb725c21a9b8f6aead2bfc0904e0888ee9ce23336157df72ea7b09a46ab629eb2ef199762a1d79b7ad12843054b50225b50bc2dc56e2acf395a3de4d5fb7994322b98ced000ae60da085cf4bf71ccd45062bec137ace9e0c2a920ef65b715402c18a5afca044806d4b29c77c17e367a21dba9c9cf39c70b2ec91ac98df83da9d9a2f837dee2f325e75a8665c3b9769612ccfcd82f7d1db3387529021b95208c6638c200f249394c23901f04baeb179e9b4fb4d8601219ee2f447987a636165357dae052638a258d36ce5a1be2d43a67d079ea7958ec99dff75d8691e9612e7942126545690e8d9c7dfbeb3bd8c874d73a127edad4e636f40abe17795c9aff07e465a38175511004306161377edd2a36e69d945bf259db55d7bba342141005fdfe91e10204d49a3dc6b6616f979fdacd1148ab28c168c905fbae8bbddfc6c5155e5b9f6de728e5983b6a034b07e56568612f295eb944db1457a6a6e9ccecb37972bdb3654ac94b9f18bfe0bc7bf74948fb142dd4b36eae140abeda77b4eb2cf3a13ac5761eaf8f03829fc11a32c3c48d2d2af32a2223d4bd371248d157a0a1b810dad66720e10b82e7adce00a31299e2", + "credential_finalization": "6a11b5898fd9f2d14fde1842d9f697f3b1fcada290c6b7be1277d9258a8ddb6592f808058ea1d047fa87d9dcf1bb54e1d44df09eb30d9fb58ffa4bc1cd654d94666c8ebdb855d2cc410dda2ac48608167123b36e4439e7f954adf5c782a81320fc1b05818a0f9c2bc5d0e66fe629d6e564e45b58fe02e7d77594974a8c7653882c1ab74bdf0b60aa94e81d3b357cc0f6435fc7af94759552933cb7bf218a817c", + "client_registration_state": "0f99c4d1fad85fac58fd19fc42934772a9e0478b32e3178f31dfea2c5d1da305620cd3974eababa61bf47093efb3a3eff1558b4adc320fa9cb6046cdd2a8155d", + "client_login_state": "0f99c4d1fad85fac58fd19fc42934772a9e0478b32e3178f31dfea2c5d1da305620cd3974eababa61bf47093efb3a3eff1558b4adc320fa9cb6046cdd2a8155d5529d6c931b93c52eb84451b6f0257558228ecec7da67ed1a65feb74f4bd079f5c009d9a92fba16c0a16f6b392d35cda032f0d1b90f9fbbc20944728b1b2797a000db2e32571e9b6f992bcb76be282a7194a566dd255e49d965c29523b7c950b5529d6c931b93c52eb84451b6f0257558228ecec7da67ed1a65feb74f4bd079f", + "server_login_state": "028c804e1cedfdcdb14ee09df61f0203000f4764f2a3a4da525fd06d2201e872460846001018c35b59b1c47b718412b54a37bdc3e8d2c48edb6f37a0754cb49ed72c5d4c2f67ec78bab54fbbe8e361c152e87f54241ac674ffa3c5ac72ec8e66d104306125f68b9050e510592cdea503e0071bcf4fb64aedf92db2f81880632111ead5c8f579647bcb2e36f7ee1dd48c904f03fec4c067b8ded4ad035fbe3c4bc1fc1b05818a0f9c2bc5d0e66fe629d6e564e45b58fe02e7d77594974a8c7653882c1ab74bdf0b60aa94e81d3b357cc0f6435fc7af94759552933cb7bf218a817c", + "password_file": "028c804e1cedfdcdb14ee09df61f0203000f4764f2a3a4da525fd06d2201e872460846001018c35b59b1c47b718412b54a2868726cc6716eed407972158a73c3273d324e001d9e3a8efc3dc76255668a5743f3a0f8db142ccd97ea6498c290c14ed969ecc7f12a7acea510c603978201529ba354c14cdaf7ed4dbc617ab097773c58ce720bb1c52515c7f8a615e13d4174cafad0a99abefeebe7be043c44a7a5bde2cabc3c3a24c59fd8bf117cc18f80d140b49ad690d612e59d616405b716bbf29f315e8e487fba9a5a1c748f8cef12f7", + "export_key": "eb6841113ae96220b8c720daaef516844d03d88704f14e6fd324317c28a3a0e1d3b219e392fd4539faeda9c8b5b8f265ce9ef8070853409d4f8df63d9275b7fa", + "session_key": "37bdc3e8d2c48edb6f37a0754cb49ed72c5d4c2f67ec78bab54fbbe8e361c152e87f54241ac674ffa3c5ac72ec8e66d104306125f68b9050e510592cdea503e0" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P256_SIGMA_I_P384_RISTRETTO255: &str = r#" +{ + "client_s_pk": "026fe3808537db353a47c4924d458e5e66faa7d1a3e4c81bae5d3db26c97e9389e4d56620e3121c8cff378b3ce49a07df8", + "client_s_sk": "decce73f49a4dc231b5fbd8c3fbfaadddfe490ba8ef8be5bd92695aeef5b1c4d288abdda2c00d951e2482ffa222a8f24", + "client_e_pk": "0288ced5fd7c2cd1e7125d5727597b11a55a19acf9a2b33d65439ea88c7c5c8c14671ae1e49e71fe6d72667809b482b5e8", + "client_e_sk": "8e843c0fe7ccb074253cf39a1d7e2636b8224fdab9a9448ed6351fb140fc1ac4ece7d10a5c579b3e5e6312a15916dca3", + "server_s_pk": "02c500e92a7dc64acc68bcfebd9d22d57a400c40d5a377f99b7b20fe609188e9b89e6c6103a1ca723392bb052f750b7255", + "server_s_sk": "b32a858781891afa9b148c1b3dfad380d0325aeb66256ba25d6a11f397148ec7ec803b79e33271fe15672a460a724e75", + "server_e_pk": "02ff7346c208e8f5013bf5c3cf55a3f95f644d195344b6713eb021229635800f517a4bf45825d220731cc2171698146213", + "server_e_sk": "8ef62130a817c8d6706931533c18c3cfc763df95360165dee26dd8c773ffab5ab64883e714135782e1851687429551c7", + "fake_sk": "042feb4d7cba0cf3926789db0a77272e55a9e50cd9c201f30ec432f24beed145a29b9a9471f8ce68bb9793b006b309f9", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "c6e41e9f5ccfdd38f5e0d0f96f2bd444bb563e037f838834ff330bad71ba592f", + "oprf_seed": "909b976853990cec0780a939d4337a4500d4ef38c6c8924340bc9741814f9158", + "dummy_masking_key": "7165613c4ccf31b999c42b337cc025dbcb4e40722afeda43214823c7907c592a", + "masking_nonce": "5797c51e97be0126f9b4db507f75dc53aa929eed98da637121f3966dd6cb98997fbc772b4e6ba4d7b7dc52c324c8edca74a064fbe61fbef4cdc669662185aa6f", + "envelope_nonce": "fbd36563df8e3070dacdb063363f108897a1323e681a65b7509946e614c531f4", + "client_nonce": "de15324181d7e533f6b1cec276c237217f21edd02724ec5fd9ad52e11baa8fca", + "server_nonce": "4dc487815215096de232cd0c36bbcd8d3627fe046e6979f4ef2f257172202f70", + "server_sig_rng": "dad27bd7b207c36393387b20046affedaf9d5ea80233a1339672afd0b90b43cd240988441f609b73accfce598f0dc47d", + "client_sig_rng": "58f465b5bede2a1d81a2c9e71f58e6384062d20d7de142439cc792bb29d7eee71b8da8a8581b404e6ffa0d80be804ecf", + "context": "636f6e74657874", + "registration_request": "02e47488ee025bcfc0693168571bf1d055260ef693411af2f026623252fa840f11", + "registration_response": "037ba21d5e699d341cf330ea5c924c30e8f22a432864055242bf5da228a3adf7e002c500e92a7dc64acc68bcfebd9d22d57a400c40d5a377f99b7b20fe609188e9b89e6c6103a1ca723392bb052f750b7255", + "registration_upload": "03ec4e9b09180ac6b734993cccc2e14e68ce396642292b13c77c97d71b4d9cfafe07d6a74d9a0c35af4bfa0fcac140c9d198bd6b6ef7999d28c09db8702cc4356c62f863db2ddfae525e782bb58b7f59fadecce73f49a4dc231b5fbd8c3fbfaadddfe490ba8ef8be5bd92695aeef5b1c4df04ae1fd13cba4462c6eef82874dbc121eec817b399f490c3ca295f5fa1fe017", + "credential_request": "02e47488ee025bcfc0693168571bf1d055260ef693411af2f026623252fa840f11ece7d10a5c579b3e5e6312a15916dca3de15324181d7e533f6b1cec276c237212ea5c3db02c65adccdaa348c918b561bce91cadfc64cbe7457fa4bc43974f014", + "credential_response": "037ba21d5e699d341cf330ea5c924c30e8f22a432864055242bf5da228a3adf7e05797c51e97be0126f9b4db507f75dc53aa929eed98da637121f3966dd6cb98991a8b7b7942c2cf6ab0b84e03d0a21ffcb719bf4daeaa22135f87f998add844bf0bbb6f2ba4ffeddfa290baec518a7a791ecc13c52888d41564f307d0005cb7518cb924b9c199b742606945cf7b52740fc0e61eef1d926378f430016b1dd4c4ab2de9974ea82acf33906e6ee9d574a12e9d8ef62130a817c8d6706931533c18c3cfc763df95360165dee26dd8c773ffab5a527c867742e9b69a7475aec48e4fe075c58f4ff89f9b00c88be9be01eed9655148548a674c594160fe485c112417665d69a7f936b7542d9fdf403a5a7d5985710fbbc9ead36e214fdb922e41db81660c6816a5fbf2bf6788ea800c5afc31c63ffa8bb8dd5117c8ad8b7b7ab56c9fb71b906d9e29018c80f74362ab3a10e63c16a3d58fcfe156d2d771d729df5c31f2601e972ad1134347fd8a9c3b39adc1a8b997737fa72158ba6226144addb2148e2562443ac3fc7e9106d012a6899ab51dfc", + "credential_finalization": "87574e2dc358543eead8da8bb1da79b4a8e1f7a11f2c5f1c504c715eb3383804e821a9022db93e49cd9457ab282f40b41ed15a08d246b783b136eb33d50de2b162e1b04a2ea79b9be2e8e0d00b5ca55e965236b644857f9e94ae2c7607b36ae30c2d01ddaec91bc13d9a2027d5b2696eb0be946441171cfd0aeb98e50db3f1c29922ed1cf1de39655b788e2912384a6939d3316445a919d3becf635987e4f86d", + "client_registration_state": "c6e41e9f5ccfdd38f5e0d0f96f2bd444bb563e037f838834ff330bad71ba592f02e47488ee025bcfc0693168571bf1d055260ef693411af2f026623252fa840f11", + "client_login_state": "c6e41e9f5ccfdd38f5e0d0f96f2bd444bb563e037f838834ff330bad71ba592f02e47488ee025bcfc0693168571bf1d055260ef693411af2f026623252fa840f11ece7d10a5c579b3e5e6312a15916dca3de15324181d7e533f6b1cec276c237212ea5c3db02c65adccdaa348c918b561bce91cadfc64cbe7457fa4bc43974f0147f30c4e6a050317b4809cb91cc234dd8a4e5133d32e5eb9a81bff2191f46790aece7d10a5c579b3e5e6312a15916dca3de15324181d7e533f6b1cec276c23721", + "server_login_state": "03ec4e9b09180ac6b734993cccc2e14e68ce396642292b13c77c97d71b4d9cfafe07d6a74d9a0c35af4bfa0fcac140c9d1d7fdc855b650e237afa02e5f0dbdc5f29fc1fa26dc95eb3e1ab590ea4a7c4271107a2e8551e1b673fe418e26a8035c776d53c6de1851d447ace5038582690e9b87f44d60c480d4f63810d5bea50d90af7c90b080296b282ef307f2f7cf12ac3717e4565be74529be721b7f2312ecfd5b0c2d01ddaec91bc13d9a2027d5b2696eb0be946441171cfd0aeb98e50db3f1c29922ed1cf1de39655b788e2912384a6939d3316445a919d3becf635987e4f86d", + "password_file": "03ec4e9b09180ac6b734993cccc2e14e68ce396642292b13c77c97d71b4d9cfafe07d6a74d9a0c35af4bfa0fcac140c9d198bd6b6ef7999d28c09db8702cc4356c62f863db2ddfae525e782bb58b7f59fadecce73f49a4dc231b5fbd8c3fbfaadddfe490ba8ef8be5bd92695aeef5b1c4df04ae1fd13cba4462c6eef82874dbc121eec817b399f490c3ca295f5fa1fe017", + "export_key": "f49706519477faaa91ac3c40d106b5dcbe51cdb959e7f9de1f875950bca396cc", + "session_key": "d7fdc855b650e237afa02e5f0dbdc5f29fc1fa26dc95eb3e1ab590ea4a7c4271107a2e8551e1b673fe418e26a8035c776d53c6de1851d447ace5038582690e9b" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P384_SIGMA_I_P384_RISTRETTO255: &str = r#" +{ + "client_s_pk": "038a8462f6e02f90cdfdba0a70cc105dfa8a6f365870817d015bce714f969de02e6f7f6ee57b6a593db6801cbef0ba9fe9", + "client_s_sk": "13e22de96437d3e295de74faaa95977c4436bad830c832cfd1c43e707ba9a5b2e4bbd1f96c9c6aa4cf2ebe738f25b238", + "client_e_pk": "03ed8eefd56c6aff44bb94c65e77dc6232ffae883ebc4a0ee71b9149248a08da1a9dcb9d9d6fdd2c12256d4af081def73b", + "client_e_sk": "36a5400dc373fc7a70287aff89a06edd65661c809c1853cae45148550dbb7c15d28bf234b0c45c8e2c33defddd9eece8", + "server_s_pk": "0399a742b053460614d1df29de84f856e11138c8aaaabc332ed993fe316b32fea1faffab3ebcc9978fc60fdae6e63e0618", + "server_s_sk": "82af6bd8258a3d9b48dae4e94480651e9fdde6b31cf4346a4d6624342a581ba5e4f438758841c70da2855883a57fd99c", + "server_e_pk": "03154d2af1f45124115a4105b6924eeff07000476248fc2618d9469939aa9d042c3dc770b871d92d7a80ee3fdf2f2ac15f", + "server_e_sk": "696d318584cac0bc18dc89bf6f90aeb6d12a00d9b4b5f3a2e17d857ba13478498b2e02f7db1eaf5ce2279049ecf7a1b1", + "fake_sk": "9ea2d3c5377fe61dcb287c2d7bdb6d4765db4c7a530d7441758fdc4407c26c6323f569c11cb7b65be69c781c198e0004", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "f6451d51bc5bb523311fc2fb7640866738ed33d20ebb152642a3f69d6d1d780b61bbc964020881f0b3c89ca256036f07", + "oprf_seed": "50359b0a7cb2dddc14ad8b8d3f714c76200929b11da9259f548d9f8f3c2eac384e411c0ea2b3937b0e8e99cfa3af4056", + "dummy_masking_key": "f1e508e0318d5820ebde83a2f0b8926d25238f11f722752c1ad2c2de73e74d9005a23e9e6c86b1e867cddfc1d7d51b03", + "masking_nonce": "c3c42ab662accf29377d9376b1ecc62fd52bb5c60d9831b80bb38e251338470319989cca36f34be1b1343c332cbb058df7fdc9e9941aff9326e1dd73d7226e85", + "envelope_nonce": "288b301ea8850b33fefa13b1aa6f3f10d66a70ac70d7f23ed19a3bcf93e5cb7d", + "client_nonce": "a8ed19b988ee63758a3a7918a084ae34e576841f006f3a7b236db2b91e4a6394", + "server_nonce": "e5814859324902ed0ba01c9ef10f8daab6758a5473786ea0b3d59c0d8699a33c", + "server_sig_rng": "611d5ca3e2b0d513952e39d6eabe0b2bfc4010c739a4e943d5e8415063572c85480fb5e3e005d10996a3f9bfd87584a8", + "client_sig_rng": "dd0269456e814aef4e4495040df62e594fabe3c6828054a34efe3d5325fa82304e785e926f59edea4411ca90bbdee393", + "context": "636f6e74657874", + "registration_request": "02010d73f84f25cc1526fdbf31dc4cc505e48fc5e287d0f9a4e068a330a0fb8b151c778a1b286b8e373a5eed2f69e91ac8", + "registration_response": "02beea182b9408ecf317ddff4912a59af3a90ac1996b7a8bb6867e557c2413bd26feca2d4341bfcad304ee8fe74d7ae8e00399a742b053460614d1df29de84f856e11138c8aaaabc332ed993fe316b32fea1faffab3ebcc9978fc60fdae6e63e0618", + "registration_upload": "02b45b60b160307db9cdbe43e55ea8073baa22a6e64470dfd61f6ab78296fb2a8ff7dd298dac39b90469c2e501787d4cedda16bd71258ed1721d3f563c01cab747a204c4840731a20c73a7e68fd180d30ce421fcf15020e0c3b8e3c290786796e613e22de96437d3e295de74faaa95977c4436bad830c832cfd1c43e707ba9a5b21a55f46023b71ac0fa2f8050d204de03f9f1a088b30b9a32a67b1195e928c5ca87027da32130d67ab5c82002d3dc907e", + "credential_request": "02010d73f84f25cc1526fdbf31dc4cc505e48fc5e287d0f9a4e068a330a0fb8b151c778a1b286b8e373a5eed2f69e91ac8d28bf234b0c45c8e2c33defddd9eece8a8ed19b988ee63758a3a7918a084ae34e07f5921d57e93554269481d48d50bb561a71e4f4d9637c6f298143ca9851b2e", + "credential_response": "02beea182b9408ecf317ddff4912a59af3a90ac1996b7a8bb6867e557c2413bd26feca2d4341bfcad304ee8fe74d7ae8e0c3c42ab662accf29377d9376b1ecc62fd52bb5c60d9831b80bb38e2513384703a3f168ee382ca51769ae145542c59e6aa3e1b1484428cae02c071c58c92b908e411ceb3f87b659b04ea78e88066f7a8b29fa2f4f7d445f9e00f24f51b773944d3ced558bbdaa26f7504c5f349e0cd737c5a1ee1ecef6b59104e5818e17fabe627b357f5afcd086de084f1b262669382d048b838c5c40219a1d9b4b135f8f591864696d318584cac0bc18dc89bf6f90aeb6d12a00d9b4b5f3a2e17d857ba13478494882f3acc3840ef772f422a1347489b116887348bfcd33859c504b231f225f1b23f7486c5c411134db125d14dec23208fceff0c8001c00ec76b397218f520f17bff3e5eae4f9597e0074a64557eed88395ba7e7a67bf0103604893d4036888fe19571bb033b9ce1e59349c8a8fae2253240711c07dbee5d23baeb9cddb2965d3fc49daf1e18cff6e1c3ea3ebb113e388bf42f9aab939840e7efa14efd79d202bfb8f21e4a3ba7a224c5f5be3f7df8cc5af489f43415365ea2bf6be9afd8bd8fe", + "credential_finalization": "5b987a1462fcb853ee98c62c29a933ba5f06e281a7789030e8f0b7db7e5585abfe1e01825bcffd0d6ccd61e6527827917f496887071623b79101eb4fb2904df0534d33f64b9f6133936c3e3e90a94e61f302fa0fa6800ecd270a8394825661fb0b3f8bf5974c6f5b4bc53c9e268a553b201be327e40c306279a9084aef261105c4b772bbc3b512ba4b5adbfbf262463ee9f031751a8785eae322ae0d60100c74", + "client_registration_state": "f6451d51bc5bb523311fc2fb7640866738ed33d20ebb152642a3f69d6d1d780b61bbc964020881f0b3c89ca256036f0702010d73f84f25cc1526fdbf31dc4cc505e48fc5e287d0f9a4e068a330a0fb8b151c778a1b286b8e373a5eed2f69e91ac8", + "client_login_state": "f6451d51bc5bb523311fc2fb7640866738ed33d20ebb152642a3f69d6d1d780b61bbc964020881f0b3c89ca256036f0702010d73f84f25cc1526fdbf31dc4cc505e48fc5e287d0f9a4e068a330a0fb8b151c778a1b286b8e373a5eed2f69e91ac8d28bf234b0c45c8e2c33defddd9eece8a8ed19b988ee63758a3a7918a084ae34e07f5921d57e93554269481d48d50bb561a71e4f4d9637c6f298143ca9851b2ebfd15d91d5dd03e84425a59cd7fc83d81deb5e068cf42f3b0850b12baacd7a06d28bf234b0c45c8e2c33defddd9eece8a8ed19b988ee63758a3a7918a084ae34", + "server_login_state": "02b45b60b160307db9cdbe43e55ea8073baa22a6e64470dfd61f6ab78296fb2a8ff7dd298dac39b90469c2e501787d4ced29a69d5c0a6e95c541e91cf797b8ed44c81a55f3603421a0c2cb910a2ccf760abe57fc3c55a1f53266b99ff26cc8e055db0439bf78ac114beb546fc4c9cfdff64e6bd21380431e23dd361ffecbf71340f1a6ddcc0bbdf3312f134f85bf45f278dd2ce3a74027b5b6493562419ed919c40b3f8bf5974c6f5b4bc53c9e268a553b201be327e40c306279a9084aef261105c4b772bbc3b512ba4b5adbfbf262463ee9f031751a8785eae322ae0d60100c74", + "password_file": "02b45b60b160307db9cdbe43e55ea8073baa22a6e64470dfd61f6ab78296fb2a8ff7dd298dac39b90469c2e501787d4cedda16bd71258ed1721d3f563c01cab747a204c4840731a20c73a7e68fd180d30ce421fcf15020e0c3b8e3c290786796e613e22de96437d3e295de74faaa95977c4436bad830c832cfd1c43e707ba9a5b21a55f46023b71ac0fa2f8050d204de03f9f1a088b30b9a32a67b1195e928c5ca87027da32130d67ab5c82002d3dc907e", + "export_key": "dc4f1060d99394a0d4b53f8ddc542b5d0a8a4fd5b094cc07b2bf5788f82294ebb01a5ac8d6b655d56a475570ce9f2279", + "session_key": "29a69d5c0a6e95c541e91cf797b8ed44c81a55f3603421a0c2cb910a2ccf760abe57fc3c55a1f53266b99ff26cc8e055db0439bf78ac114beb546fc4c9cfdff6" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P521_SIGMA_I_P384_RISTRETTO255: &str = r#" +{ + "client_s_pk": "029880a78fe8ffd63d9fe70647abe52cf06abc8de736e7193de30c1f286b5f75084025eac8a9d103e7bac334c3ad34c587", + "client_s_sk": "89945442341379accd836cf52d30ec27610700fbdcdf58229ffb7af55ab6fbdcb0c4c2c39121c90c46d6b9686fac6c7a", + "client_e_pk": "034556fe05fdd4c15996982da25783a5dba73d16d96626ac1ebe1e57bbc60aa3d566d05402b7657b53ff74ba0ab20b824f", + "client_e_sk": "95025baa239ebe6c4e909f321c5e1c6905b58c28dec39c094037e57437fbad7b34028f7f21fc8676603ee00f75af170c", + "server_s_pk": "02a181ad345ce2fa8d0e91ad7061cb28fd7fc501316d6b368f993eaeecd28eee81b9cafca2a9ded94bdf65a3050703d56b", + "server_s_sk": "f9ce7661429d0a57747b5d11d4c293554248f659a7992bb25d4448200e2d7a701da4652508a3d062516fc8a4470bf7ec", + "server_e_pk": "038f9324c9b1e635d27d072e938f03e466ebf6bf3e90b789be6c43bf2a5b3a839a2c2a2765d6f0d3e4fe6d0088da3a96cb", + "server_e_sk": "bffce1b246789c925a37345a68db62783986f35836991c12b00df3ad26760b003f789e103f1454dd1babc4d0093bc938", + "fake_sk": "ee13909d3cf8f62c37625df69c272d2db387f5c617748df30cb6b962e21b45dc19bedb54d4d7dd76be4783d320dc052b", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0113de3d6f472834814ec30d337d0ae8b1d97f1d3ded90cd8045097056d6fae15a49e71de6f11c634d2fee733ac74d8ec17b27c78d11887e1420c00901285d6f2404", + "oprf_seed": "4af507fbc104a0097a6ae022875ac20b9700f5f0d683870e333fd85f1f225254c76dcd55e0d4a82df74c5957c995524053ad423e27be2ec0d9c450c9dc5b13e0", + "dummy_masking_key": "5327d6047a67203dfa5752ee5b1dd69bdf57c744a12abf3b0a88390582d87da3474f9ff9c46d2dd4b99ef110a2cbcd553f38a43077acc7f4a5579bb4622c9d12", + "masking_nonce": "441d62b13b45a9d5a23c418e77adc2a4d3921ca497dfd6823f39160e1145ebb8c34b2e2746bf22343ce630eff616e36adfb9004c8b205738045871385dfaea0e", + "envelope_nonce": "d3f7c412e80fec4cf896dcf60c0053c47c52c6c5a2e727d74a81acde3eaaa686", + "client_nonce": "e3a2342912b14296f90bbb6fe4aaeb08ed019091766a747b656e000481451a0f", + "server_nonce": "c04e15815584add28a067a5f7f8b3eded9046cab6e076c81a1dff7e64ebca680", + "server_sig_rng": "866976dd53a81cad03e3ba047bbf7f9b9867697686e15f84f49974e77eda8193baf40a52ecd4e184377696c1d4252f76", + "client_sig_rng": "1b87852f0f11a89f4eeda07f65b5330a4c590088427f07b76fe493e8ea091afe6d2a52861e5ffe20f60d3ed925892f82", + "context": "636f6e74657874", + "registration_request": "030015624f5610c92b2f881e37dd3289bee1b074b73d18f4f1b8f673516c3823aa1c29972c59da5e1216186bb71afca83c727f60d77e372ba56dc4ba2a0ca8c2b0b16d", + "registration_response": "02017f8a6202965b2be73242ed52b7d9f136b48e20422e4aa3a5790f0ab0d3ece9a53f9abdeaad999c7e99858e708f13702f875c5eec57ac94d9cf0439e2328196a41002a181ad345ce2fa8d0e91ad7061cb28fd7fc501316d6b368f993eaeecd28eee81b9cafca2a9ded94bdf65a3050703d56b", + "registration_upload": "03e10f8daa527b1d135f24e642268134862c3495e334814407fc9e85da8c738e7e6cfa33de26b455895251858b0f83fc8fe4f13bd7c8cf931b81df2ceac19cef79e4b72ce8b8e8c91c9a77e1070ba137a4dec9490d7d82b7aee1b84fb490446941fbf1e556012895868e6f4fcd48f6863989945442341379accd836cf52d30ec27610700fbdcdf58229ffb7af55ab6fbdcbb90f75832d4a506923dd7a7259f0523012bf5dd2d6d307e60032a4a4bb29c92f1b2474bac5c5f932ea66a565355c3c79bba7b242e2b5ccc1c85e0df1b0ab158", + "credential_request": "030015624f5610c92b2f881e37dd3289bee1b074b73d18f4f1b8f673516c3823aa1c29972c59da5e1216186bb71afca83c727f60d77e372ba56dc4ba2a0ca8c2b0b16d34028f7f21fc8676603ee00f75af170ce3a2342912b14296f90bbb6fe4aaeb08ea9513d99910104d2a9f61d07d70f1ddb0a9cc746884373421551dd205465a45", + "credential_response": "02017f8a6202965b2be73242ed52b7d9f136b48e20422e4aa3a5790f0ab0d3ece9a53f9abdeaad999c7e99858e708f13702f875c5eec57ac94d9cf0439e2328196a410441d62b13b45a9d5a23c418e77adc2a4d3921ca497dfd6823f39160e1145ebb8d9dc3f9044e6551c59640913d72d13e09b60617f4206c45dd1eece84336846674520c031e27e0f809fec94f0edf08c92cb61fb62c2147d58e8603126d685d77338643f93bfcfd24260c9f6c8c9def0f0fea52846d04b20168c1c6c3558578d5c515c437419ea3b8c3d02b4c6d5fa940ed58965f6539d5740a16b017319d3310af8e77e0e27aecdf2930923eac87d76637dbffce1b246789c925a37345a68db62783986f35836991c12b00df3ad26760b0028651ba85cf4a2905d2a317418539d6654f2f33f79c0aa938992f41e3679bc4bf194f72d588970b121ec555f2b8932be22c8cc109204eeebc35c2c0baceab08a48462b67a397bbde9337f69919c71b72f9d06f052eac1203ccad28215641d8309ee4b25f4a2b2c4717d50d7e482115f4a0065e44887cc43effd9d0a655a79970e4f26789e74ab315510876d3f46727a69164b5828aced6dd0d6332ed69ab1182edb496bf962bad050592dea490ed3e8944a1f3b5a21e3ad4da45418ed897c5fb", + "credential_finalization": "0d8bb6787a5a3e8a24d9ae5d87184d41559ac4e024c548d08311d36b9c546b88b5a49ff8ddab51571313168e866f79fc96966ab02a0ba09cef71fd7dfc5e744db60a4884aceb6605866899feaaffe34015e11beb1aee84d73e1be55772ddecdfc3b1e7322a01bfebe877bc20a6057acd4e4e13e89e63295e30d3b987dbb84ed8bab2627af11639ff419e54c72900a10a4de0ef06303361411d44d1caa8b3b82b", + "client_registration_state": "0113de3d6f472834814ec30d337d0ae8b1d97f1d3ded90cd8045097056d6fae15a49e71de6f11c634d2fee733ac74d8ec17b27c78d11887e1420c00901285d6f2404030015624f5610c92b2f881e37dd3289bee1b074b73d18f4f1b8f673516c3823aa1c29972c59da5e1216186bb71afca83c727f60d77e372ba56dc4ba2a0ca8c2b0b16d", + "client_login_state": "0113de3d6f472834814ec30d337d0ae8b1d97f1d3ded90cd8045097056d6fae15a49e71de6f11c634d2fee733ac74d8ec17b27c78d11887e1420c00901285d6f2404030015624f5610c92b2f881e37dd3289bee1b074b73d18f4f1b8f673516c3823aa1c29972c59da5e1216186bb71afca83c727f60d77e372ba56dc4ba2a0ca8c2b0b16d34028f7f21fc8676603ee00f75af170ce3a2342912b14296f90bbb6fe4aaeb08ea9513d99910104d2a9f61d07d70f1ddb0a9cc746884373421551dd205465a45c9b5aa0221988eea9c55264f3849305198d01395bcd4012ef941070ca8ba640934028f7f21fc8676603ee00f75af170ce3a2342912b14296f90bbb6fe4aaeb08", + "server_login_state": "03e10f8daa527b1d135f24e642268134862c3495e334814407fc9e85da8c738e7e6cfa33de26b455895251858b0f83fc8f2438bca1f279ab08f9d5f3ac42ef694bd5ab217e781a3bb0eed5ccee3e7f251078a61a390559fbea5af163224055004d7828fdaff037eaa90b7a47bb117bb3bc13f05ffc09ba71fe8d35de394a24588e224614ea3d44252851f4cb7d90619e794b9463ffaeb2a554b2b1a598d3d5d6c8c3b1e7322a01bfebe877bc20a6057acd4e4e13e89e63295e30d3b987dbb84ed8bab2627af11639ff419e54c72900a10a4de0ef06303361411d44d1caa8b3b82b", + "password_file": "03e10f8daa527b1d135f24e642268134862c3495e334814407fc9e85da8c738e7e6cfa33de26b455895251858b0f83fc8fe4f13bd7c8cf931b81df2ceac19cef79e4b72ce8b8e8c91c9a77e1070ba137a4dec9490d7d82b7aee1b84fb490446941fbf1e556012895868e6f4fcd48f6863989945442341379accd836cf52d30ec27610700fbdcdf58229ffb7af55ab6fbdcbb90f75832d4a506923dd7a7259f0523012bf5dd2d6d307e60032a4a4bb29c92f1b2474bac5c5f932ea66a565355c3c79bba7b242e2b5ccc1c85e0df1b0ab158", + "export_key": "64a122fd8b7b73d7592ce4415cf7ff1535f4de9027adb5647fed6bc30928f05aca242fa63df6a67b5b9c648dec8b15e5cedd54277c4a1f9aab30813b9d9b604c", + "session_key": "2438bca1f279ab08f9d5f3ac42ef694bd5ab217e781a3bb0eed5ccee3e7f251078a61a390559fbea5af163224055004d7828fdaff037eaa90b7a47bb117bb3bc" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P384_P256: &str = r#" +{ + "client_s_pk": "03ce7ce5ce2125070570c84f3bcbcf433da3ff03db08087519a839bb4c294c2275235c3ecb2390db92a789992ca60e2204", + "client_s_sk": "d4304f8b67cf76ad1d90f0100bbf4919bc125ee6303c4b54966d5d9c8c38a54100c28431cc458899d7f2fe4fb7771247", + "client_e_pk": "02c020f9a4574860cc54d6bdb76d17d44ac686b17197d77d7ef63137b4ab22d2ab22dd16dabbe688b7dd82c7d9d4f941f8", + "client_e_sk": "86a6fbc91b404e61d9ab03c9d139cfc5d2ba6ad025d690c43f022987cfa344d772634e8b1c7e56ed49802270b81ad52d", + "server_s_pk": "03690eddaa248f1441a55648be289b553dffb8e24d5c81bc4e692b12b5eec08bdaccd430948b4d5dea48ac877600e18111", + "server_s_sk": "3903b40ea51acb7b819cb5178ce7029654c500b4f29c7b705e271fee22cb073a33c7e6c6ed60cfe98a0a45bf02604c7c", + "server_e_pk": "03c13aab12229cbf271538c0e06393f6d102c34d6acfb205176aec1f5812f598262a92fb7c7854ead11f9996d04a36196b", + "server_e_sk": "4684458a5979737e5c8e3e70860240163a7d5f8e48aa5ea9fd2cb3d7e4f30e68ea97f3f7d76d1a1fc85b4680758d1eeb", + "fake_sk": "9eebdfa04ec17142c67d6a186326e293cf84028c1a40327e7ec5d86f1be2a24febfe8586bb0711e8b809f5af471424d8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "b9a353faac913823ef9e23b3f9ac5b8bc76265c2a669de06997b035781388605", + "oprf_seed": "f64856950c6ef5edad1716fe5dc9930ce07aead1d8b6e204713eebbafa7d6aeebc9b4a6bfacd90ef5388b2b3dfb3a2bfa03f50d2bf3dd357ee4f28023d09b5e3", + "dummy_masking_key": "2049d01dbc2dc98154f0fca3a18a07af5c82432008a9f008a772e3f84a191f9a9450ff1ef3142e2101e2862119571fadff48f46641c191b64f660f78503289df", + "masking_nonce": "84daa648fb6427be78da339a5fbe6b1f3d046b91e723852f41fa9d72a7afc2cbef72811b800ece0cb9859d872a6ae77564c651c70708ef1422cef2a246b81f55", + "envelope_nonce": "45a1b2bae0489e3fd999098cedee1484190a7ce27f744d0c36fc84ff90b826cb", + "client_nonce": "4f2122e946e28a3c68dfecab7676ba36a8f59063c27ef6dd875b8eb2b82cf259", + "server_nonce": "3290e1c0dfdf2a6ca2765a9a7de30088eab1bb1a865600c1497ed6ad536b7664", + "server_sig_rng": "0e12242ab4eff0691a947dbab60c77bc2c67d956faf97e586574a405ca93c42840a766c0a2678711344521f37ff7bd32", + "client_sig_rng": "b09fbc4068c0d24a3b64e57dc08da51e845924fd5d0c41de50751d1bddaadb66e86dfc54f26a384c1eb6ad6215d2d43f", + "context": "636f6e74657874", + "registration_request": "82dda9669973e0e4a10744b60f66b7fca312c33f1b87d90a61d275cc52a4cd4a", + "registration_response": "acf2e24c41be083be8b37a094283f9a440b657dc2d77eb9001909c56282a191e03690eddaa248f1441a55648be289b553dffb8e24d5c81bc4e692b12b5eec08bdaccd430948b4d5dea48ac877600e18111", + "registration_upload": "03cfa61774a56cf59e04dde3ed6fd2214f73d2de095f493bf5c1ae470889df7149a3cc3f54ba57093296c7acab4b32b85757724825dd0bf3e53ff7f45747d77361ec5f348096ac264a4df204f67604719255dfa55abecbbbf08840e98eb92965b4248e35f68bbf8d003b59ad3850428409d4304f8b67cf76ad1d90f0100bbf4919bc125ee6303c4b54966d5d9c8c38a541b0f0d41e82b99c723ce9208d85ba3684af7485b0350ff17e1eadd8f6440a99d4dee92cb59fcd7fa3a027a4edc1e5145d0f0cfc5ae57c54cd19d93e6170204bff", + "credential_request": "82dda9669973e0e4a10744b60f66b7fca312c33f1b87d90a61d275cc52a4cd4a72634e8b1c7e56ed49802270b81ad52d4f2122e946e28a3c68dfecab7676ba36026154357bc0c1bc8e0b00b3779edb6bcb13214c8898ce146c83bfac7b20b05eb7", + "credential_response": "acf2e24c41be083be8b37a094283f9a440b657dc2d77eb9001909c56282a191e84daa648fb6427be78da339a5fbe6b1f3d046b91e723852f41fa9d72a7afc2cbf7cef5e02868b2334590c412994a9192b63d46bf7f46f1df98de909a53895bb7d2e976f1c9d28229b8d33d444e23468cbe99b8e69e764e800d63746411c57c6fbb017f1f533a47bbe13abde193292f7846cf7f2534b5d8d03681d568da321c72ea2d5e6755454ef01a8f47c1fb4dc0d14f9e1f6c60e2a323d7e42e3e1bdf0f30f12a57c1cf3b21f51ff5114d3d4f902f3e4684458a5979737e5c8e3e70860240163a7d5f8e48aa5ea9fd2cb3d7e4f30e68026f5c36c9d1112aaa7378ac809f5717d69fa905b66079c9e085c299b36e67b355518efa4d53dce9db6ad76f435a50b438acee0239eb0e1bf3330f3bea48ed99a8cd7dc101d82aca5ec1ad1ea6a9ad7bed20860a712018329228fe7c837b380a0d7ad17e00787dae79111e5e63380d0ce10cdf1eeee5b7b07eff80c8353454dd25c8189cdc67ae099261243e54afb8a91ca5441517749bc2947e575b5d1b58b324", + "credential_finalization": "8b37f3776b85a8bc4a74ecb726235d69ae502d25ef833da67cec6c3d26d8ef5d3ac1eced6cb146fb59ab2bbcc758202d83ea3b0c7dd1b891e53784ca9973154e7a280861fffe761099e0c073418e8c6b087c936401a0c6aae5c18613febfc0fba936f646e45e5a78047e59f988c444e10b321c527dfb61df8d9b4e6726ade9c7", + "client_registration_state": "b9a353faac913823ef9e23b3f9ac5b8bc76265c2a669de06997b03578138860582dda9669973e0e4a10744b60f66b7fca312c33f1b87d90a61d275cc52a4cd4a", + "client_login_state": "b9a353faac913823ef9e23b3f9ac5b8bc76265c2a669de06997b03578138860582dda9669973e0e4a10744b60f66b7fca312c33f1b87d90a61d275cc52a4cd4a72634e8b1c7e56ed49802270b81ad52d4f2122e946e28a3c68dfecab7676ba36026154357bc0c1bc8e0b00b3779edb6bcb13214c8898ce146c83bfac7b20b05eb7404b2bd1b96bfa270cffbd3b7ffc2b2607ff6ac6079adf5446dac0e8f3e2b3b972634e8b1c7e56ed49802270b81ad52d4f2122e946e28a3c68dfecab7676ba36", + "server_login_state": "03cfa61774a56cf59e04dde3ed6fd2214f73d2de095f493bf5c1ae470889df7149a3cc3f54ba57093296c7acab4b32b857e000658c87db56361b55e550b6b92f1259616eae9d6dcdea740b66bec6db57e7c10de189e764462745013d8fc062617426722f0ccba06c8ce5067d400add292591138e9ab2a6ce272737cebeec745b2ea936f646e45e5a78047e59f988c444e10b321c527dfb61df8d9b4e6726ade9c7", + "password_file": "03cfa61774a56cf59e04dde3ed6fd2214f73d2de095f493bf5c1ae470889df7149a3cc3f54ba57093296c7acab4b32b85757724825dd0bf3e53ff7f45747d77361ec5f348096ac264a4df204f67604719255dfa55abecbbbf08840e98eb92965b4248e35f68bbf8d003b59ad3850428409d4304f8b67cf76ad1d90f0100bbf4919bc125ee6303c4b54966d5d9c8c38a541b0f0d41e82b99c723ce9208d85ba3684af7485b0350ff17e1eadd8f6440a99d4dee92cb59fcd7fa3a027a4edc1e5145d0f0cfc5ae57c54cd19d93e6170204bff", + "export_key": "b18dc0ccac6129efa99f4ce85dbefb442647a07477dabfce0d7737f724ef437ee6dc3aa00dda64164da1f1a59fa40774b71e41bcaf389aa7148c871fd9870e95", + "session_key": "e000658c87db56361b55e550b6b92f1259616eae9d6dcdea740b66bec6db57e7" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P384_P256: &str = r#" +{ + "client_s_pk": "036dfef070d711089569239499ade01f34d731ae4094e2397683200db74b910258330faa9d1cc3099aec65065cb85d1766", + "client_s_sk": "72c18c6b6ee1a79e9fa4fed8b914cea83e4621365c607fc32ba3a2ad0762f3cc6097b6fc0bca652813a4653998f1b08f", + "client_e_pk": "02e035e9786d7adb0b1da00d0fc8d826993e8014ef0758f972f7cfccab6a4fade1139d5cf170b2df2dc06282ae1fbbc17e", + "client_e_sk": "13b3c96496b9c19ec3f412fcbfca243a003641370f060f2e0f5251faa33d3e56d3c18804356e513adcecfbe9c11c2b2c", + "server_s_pk": "02065a87dd7a62568c51480dae6e41349c79d80d0065341593c5d0a4b95469b85351a7b94a8b9d5328487282e6141ee4bf", + "server_s_sk": "fa5530b6c0a3bb6aef7ce3b3c3f902d9174bcdf2885538f03e063d45f961c35dbfd77fe6178a062ac0f28f259f3346a8", + "server_e_pk": "039ae8e30ecde9eeaaad669372f52a92b8328f8248d6a3bceca2c176043b96e33e7776d20aab4de345b536aa1e2e5fab26", + "server_e_sk": "886414ec4042f092234abdac10cfdd5c854ca0793a49a4604d53b87c4d58ee2fa0474f8f14b37302801cf10a52e2b357", + "fake_sk": "abaf4250f7022af08aa0d14e18755b8024a60e96334e38345d0775aabcc829cb89d17bd82a18a86a8bd2e7ca3ae1b910", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "e7f2ce4a4094e150168156b388bd5f5300e0d34fb8c349333ac0d140e688af07", + "oprf_seed": "94aaeae2a2ff2b05c0b3deb44bbedcdce088098eb2f4f0e401dd5828fe52ab9e", + "dummy_masking_key": "cd628ed7df18b2ca42e0c8e1afd71b7fef1ed9b3cc30afe200af47cebe586cca", + "masking_nonce": "54d5abe669521b8158035db7db333dc6b50c1170c73948ea0091722a7075d9ebcbbee99b4b3276a592382b889b9184ffadf0dba3c1578456fc3bbfa675c21143", + "envelope_nonce": "2c66aba35aa7dced3e2061eb1c61b88598bacaef12b1d6709a61298dcc34e446", + "client_nonce": "f715f762822adddcbc292f583f0f84893f179d198a50b671873f07534541b690", + "server_nonce": "c069a3d45a113469b238b471a7f82504a95b5ef94f955fd1b0bce19251758cc7", + "server_sig_rng": "4ddccc0853e06508688029e3296ab501aca025280cfb9dda7c247c0fec72d436c092b022914dcb481a60ae6061704971", + "client_sig_rng": "0dce52d4800e36fc3b64249e5e1cbbc1eecc13365f1bb63913fee2455a6bb2f3a58b2cee0368e5f89b3801247904f636", + "context": "636f6e74657874", + "registration_request": "03d58ecd3f3d94f97e10b6872a4ad8a8a6cf62d89075d6209a14fb5b94ac259ac5", + "registration_response": "03d121a77db04b759db582a67ee4af09e5cc7365effda8a44d988477db9ba7d61e02065a87dd7a62568c51480dae6e41349c79d80d0065341593c5d0a4b95469b85351a7b94a8b9d5328487282e6141ee4bf", + "registration_upload": "03bc3c449f912801a51118cfbed71f394fe5b16e2b04e9decd27f898b499c5a884795075c1e174245b775133f9646067f3d3065c1f3460d7fe173a3f70d7643dbe6f8607ad8e61f6cf23ddcde7bf633bea72c18c6b6ee1a79e9fa4fed8b914cea83e4621365c607fc32ba3a2ad0762f3cc0e2d51e07be1f4dac024ddc2dcc9c02f92bf3e40bb2ceb13943624aac22d4173", + "credential_request": "03d58ecd3f3d94f97e10b6872a4ad8a8a6cf62d89075d6209a14fb5b94ac259ac5d3c18804356e513adcecfbe9c11c2b2cf715f762822adddcbc292f583f0f848903ab731ffc8dc9a9caa39814aed4e1d0266de0438ba7c6f542eec5fb726516135c", + "credential_response": "03d121a77db04b759db582a67ee4af09e5cc7365effda8a44d988477db9ba7d61e54d5abe669521b8158035db7db333dc6b50c1170c73948ea0091722a7075d9ebf58d50b52e84e50b269e4cd95a374cc7adefd126603521cb241350c2a12e4403bec724fea62e92861889c9c31abb282ec96619f4c4d8b30583e47ab92186f45039952c410fbbdaad4fd27e177e55b7cfd627014f981c47d6b46f90107fa461c4ddad901f04302e405afdcd45f8fc222435886414ec4042f092234abdac10cfdd5c854ca0793a49a4604d53b87c4d58ee2f03178d83180433a4860b9138bdbc2323b4ab8d5b619769e2f068d8dc76bcc5063e739cdc37534e388f07cb2fe473466da97ea62651504b9053d49b66b274245cb79d3d70dd2f0c263885898aa893cb080c8a42cf0cc530b649cace2f693a3ec59467e476d32dc208e610cfabfe3cf6ea8794858ed968a3419facad75d7c54ede43c71c2e42e9c37612c58b8a64a5a8984efd456a05a765944aba41d4980fecf554", + "credential_finalization": "f301bbca92da53361484e648d3b18e2a7b09b76cc3c3f58f34fb398a1d8387ba40c9920596a2679c3968b74479ad8a7511d7fd5b22baec8af893ace73cda13f1da1091f2c608c7bcdb0621fa467531b325a9069e69e48766082021c1893cd5a253be3b19c7efea1841f4f587205444a43b182a17def251bb1d22c386f66c1248", + "client_registration_state": "e7f2ce4a4094e150168156b388bd5f5300e0d34fb8c349333ac0d140e688af0703d58ecd3f3d94f97e10b6872a4ad8a8a6cf62d89075d6209a14fb5b94ac259ac5", + "client_login_state": "e7f2ce4a4094e150168156b388bd5f5300e0d34fb8c349333ac0d140e688af0703d58ecd3f3d94f97e10b6872a4ad8a8a6cf62d89075d6209a14fb5b94ac259ac5d3c18804356e513adcecfbe9c11c2b2cf715f762822adddcbc292f583f0f848903ab731ffc8dc9a9caa39814aed4e1d0266de0438ba7c6f542eec5fb726516135c1ee4e29d9712b8219d74b69814038ead2cb8c02f8d19f8956919d0ef1bbad8ffd3c18804356e513adcecfbe9c11c2b2cf715f762822adddcbc292f583f0f8489", + "server_login_state": "03bc3c449f912801a51118cfbed71f394fe5b16e2b04e9decd27f898b499c5a884795075c1e174245b775133f9646067f37de5f65235539200068744ca95baa52a8497ff14160ec2c2089d79318712ee5b788b65d0a60b0d52d9948749e6a09c8feea414c1ec09c747eac3250857f4e2734cc7661c655e408b76f151fd9e8e363c53be3b19c7efea1841f4f587205444a43b182a17def251bb1d22c386f66c1248", + "password_file": "03bc3c449f912801a51118cfbed71f394fe5b16e2b04e9decd27f898b499c5a884795075c1e174245b775133f9646067f3d3065c1f3460d7fe173a3f70d7643dbe6f8607ad8e61f6cf23ddcde7bf633bea72c18c6b6ee1a79e9fa4fed8b914cea83e4621365c607fc32ba3a2ad0762f3cc0e2d51e07be1f4dac024ddc2dcc9c02f92bf3e40bb2ceb13943624aac22d4173", + "export_key": "a2e22c57cea27969d354deeb086f001e52e0c6b9c6d2232ac0394e0e891b3d6e", + "session_key": "7de5f65235539200068744ca95baa52a8497ff14160ec2c2089d79318712ee5b" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P384_P256: &str = r#" +{ + "client_s_pk": "02c9145c84922b1d039433f6e3d342c0f5a6f0b18aab72d92fd7877920989edfc72973a0ebcfbcfda357ca72d5e71f3deb", + "client_s_sk": "6f3485f8d2550a634a70119c741f1bed0023607fa85d6bd417b5909f5e607e9a38182a5bf21cc566bbac4b056dd43914", + "client_e_pk": "031f52c183df1a5a570cbee643631d534e578209d4ec79bc24211f2bba2ccd811fb49cf2927b06ec6578ef27e98dbd56be", + "client_e_sk": "1b666be7908418ffc724233103f540dffc1db7f49b5df3b7a3726357cf4bf29fa33f01836a7b803cad368cc6ecd6e7fa", + "server_s_pk": "0256de722cf72c332f080d11d891ec323cf69477091f260086e86617586983c5eaa598a351a98b4c2da5c9df36c2632d3e", + "server_s_sk": "9ea0cc8deeb2d57a8f1d080d35501418b1674e8492cdb6c366274d0d6fcc8d4cbadd0ff498b4ccb7565f03c1ef922574", + "server_e_pk": "02aa3d603fae52caa88a6ce2b13cfba89afc2ee5ef7e809a00d9a89d6031875514b9e1e3a71d7d517ebbc69ad502898b7f", + "server_e_sk": "746fb17f9a40a67bc06045806c5b009062a13c608ca485d23e06b4b3678ade830f660af3d74626c4c3b5eb81c8409f81", + "fake_sk": "ea8ef633031fa69b00edc5f552f3de06b76a24deab5f3c68469ee53c481d060e3e17642a8d466f0f4a772831a39951c8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "d7f9bc6c8d32d5f7479516b655762b25f7cf4dcaef0ef101e2aa78d0902fb680884db3d51bb804940859c7b6bbed4e57", + "oprf_seed": "d37bde14f0a54bd50d940ddbd1c62b1e56570774bf360faee3b40d2625abb873397c57dad9dfc472be0ac5ff01614fb2", + "dummy_masking_key": "f7816f87bac65b5479dd74fc42a61af25c3556b5b23ffc20dba0e298ccf537554d883527204a987c16452ff41bc8aa34", + "masking_nonce": "b4f67fe0cdf74534da0bdcbd1d3ead293f289a2730a07d58f85ac4105f0c0abbfbe48399985dacdc2039cfe885459ec51e67072bb394f99059219a1f8b3a6b3d", + "envelope_nonce": "31f93764a894405eb1a197d241072319aefd50860817732c79420dbaf83dd567", + "client_nonce": "786af3324a06e1b4cd1062de974590a0489c641678a6518a1544ba356a359f03", + "server_nonce": "7e8a78d4fe236ccbd1a60183029e5740e7a45779b990bd1b3d0f7a5f2703e583", + "server_sig_rng": "805511ece4bc2deb573a2f47a0dd72ff53d4cc334272fe366561c5952ed5689363a536b360dd8c4118188f9774adc242", + "client_sig_rng": "5b4074ee4278e4b9890c34a0a066c85855c643c5823d3c211de05006621036fb05debd8cba9148c49c02b841b8fdb879", + "context": "636f6e74657874", + "registration_request": "02711025655ab338b28f86f5ee808dfbc9595fd07994c635f95a07c988b7a1ff4aaccd428f0f371e83f2ec6592b350ee0b", + "registration_response": "02149081b22dc98dfd294e84dc2196264810046c2694d6ef12b4fb27970fa717428825bb7728e11ba7ad4048981e0d5c640256de722cf72c332f080d11d891ec323cf69477091f260086e86617586983c5eaa598a351a98b4c2da5c9df36c2632d3e", + "registration_upload": "03daae8d9fed9d483c061b571e9ceebc087787ea11bbf8911339322cb9617ec621847407f78d865b36beb37d462dc2383599b9828bb5ee17e602745b01878331ff9353d01b79648b1c1311f403da17ecdc09f982804f422ea747a4dbe5482f273e6f3485f8d2550a634a70119c741f1bed0023607fa85d6bd417b5909f5e607e9a97eee746f84a1f354b1d3b6c4f295ea80c0f21dbda70d520d13cd12e52b7c0278396d6e20788c858ef361bad46ece006", + "credential_request": "02711025655ab338b28f86f5ee808dfbc9595fd07994c635f95a07c988b7a1ff4aaccd428f0f371e83f2ec6592b350ee0ba33f01836a7b803cad368cc6ecd6e7fa786af3324a06e1b4cd1062de974590a0024f4a9ed440871cb6042c56021b4798c7aa9446ba5a9829d2a7070b98198cda19", + "credential_response": "02149081b22dc98dfd294e84dc2196264810046c2694d6ef12b4fb27970fa717428825bb7728e11ba7ad4048981e0d5c64b4f67fe0cdf74534da0bdcbd1d3ead293f289a2730a07d58f85ac4105f0c0abb9356c977f605e15201567fa45c9c1da565c5bb9781489619733ab87db442ec190d6b93f39c2077aee2d5b5b405392caf7fbe329c617919af35463848387967495ef59360739fdcb0746ea69de52486e8b04caec8c6a04da0cd89b8be8a5657d019eaf944dc7116a5f96b7016cc0416d414d239050e3ffe8daaac3e6d7716ba98fc746fb17f9a40a67bc06045806c5b009062a13c608ca485d23e06b4b3678ade8302e4e147b743e659add063730e273ecec70707bfc87b6c3f71cd9254804daf76de82e29c52a628ba20e32581ee1fa4932d69c8a41c36a2d8f6be245ffab15a4c8aed9e4d2285ee2de5e9497bac61d57a0e8035f87a7af77bf4ceb184e2656d1a9e8a2a299f38151901231122446e734735d4c85a14d4fc8cef000a9968a5aea7fad5a4bb5dd0eef8088e8ab288d2a8f8cc85287a552e2f121cfb34bf450f682520", + "credential_finalization": "580ce0bbd2649313cd73bc17d464ee2bc07e3be5e25127c616740c16d8724d6d9f95d96d9516f9b9f5e98f3bc61016899af45041ec55d0787df8dc79c020d5084d8b0a56fa80c253f8f6de2979969ebd79dbb008399459d89949f142320f0e368e923b777b75ade3f07d540fb877f6633901d566a2d95cee6a627e6bf4128704", + "client_registration_state": "d7f9bc6c8d32d5f7479516b655762b25f7cf4dcaef0ef101e2aa78d0902fb680884db3d51bb804940859c7b6bbed4e5702711025655ab338b28f86f5ee808dfbc9595fd07994c635f95a07c988b7a1ff4aaccd428f0f371e83f2ec6592b350ee0b", + "client_login_state": "d7f9bc6c8d32d5f7479516b655762b25f7cf4dcaef0ef101e2aa78d0902fb680884db3d51bb804940859c7b6bbed4e5702711025655ab338b28f86f5ee808dfbc9595fd07994c635f95a07c988b7a1ff4aaccd428f0f371e83f2ec6592b350ee0ba33f01836a7b803cad368cc6ecd6e7fa786af3324a06e1b4cd1062de974590a0024f4a9ed440871cb6042c56021b4798c7aa9446ba5a9829d2a7070b98198cda19410792abd8c79bc1c5ff8f70149e1dfd5736a779a81f70440d00ef72b946be6aa33f01836a7b803cad368cc6ecd6e7fa786af3324a06e1b4cd1062de974590a0", + "server_login_state": "03daae8d9fed9d483c061b571e9ceebc087787ea11bbf8911339322cb9617ec621847407f78d865b36beb37d462dc2383525c4dd945cd329b2f974d538e521403e2087f8fa85a11db8b89687ee4293d29b9f78881cdcde08d5dbe6fbd5e04fef7f5a48d21890a976b43d6c9be51215bcd9d4b569b09864693ea4fb24e33a9c95168e923b777b75ade3f07d540fb877f6633901d566a2d95cee6a627e6bf4128704", + "password_file": "03daae8d9fed9d483c061b571e9ceebc087787ea11bbf8911339322cb9617ec621847407f78d865b36beb37d462dc2383599b9828bb5ee17e602745b01878331ff9353d01b79648b1c1311f403da17ecdc09f982804f422ea747a4dbe5482f273e6f3485f8d2550a634a70119c741f1bed0023607fa85d6bd417b5909f5e607e9a97eee746f84a1f354b1d3b6c4f295ea80c0f21dbda70d520d13cd12e52b7c0278396d6e20788c858ef361bad46ece006", + "export_key": "a75b9b82531402e21781f1a3e51ed5463d0b32e2e2285ef5596afd572eb99a619c281c2f428512f573df7d8bd137b0a1", + "session_key": "25c4dd945cd329b2f974d538e521403e2087f8fa85a11db8b89687ee4293d29b" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P384_P256: &str = r#" +{ + "client_s_pk": "02b5fe0ca869363a2428ab57c22b910d8367ed9570e9b1dadd784bf62fe3156d13150fa55928e6a5831c6b24bfa948bf79", + "client_s_sk": "a60e906fd3e47b7b1ff46327bd7095e17a1b44d14858eeda6e48feba8dd706acf79f7bf67b819bc52e8077a996f94e0f", + "client_e_pk": "0249e87d9ad575aa61e9a6293d5e1790949a41d360fc05634518aa3496f231893e4acb08f1f076333e32de453e00fae443", + "client_e_sk": "b72379e282c5c5ed686dd66c38cc266a587ffcaa00a7c8aa1989bad9dfbd357d2ca6783e4163b4215010862c737a7aa7", + "server_s_pk": "02cd70b0c366cb09f3f7694e8f4908827ecc4a2d2eb600344f1c837b626507401ed6bc7e9783b3138472d9eae54894a43e", + "server_s_sk": "b4ba8e85627ee2edba81e3b598ccfac76b4a059d2301e0794cbf9e727a35e0a311932769d9c0086a509989b6d74dbd62", + "server_e_pk": "02648520079878926e153dfdf4c910b718f7a09ce9c1aaa37bd7f863b24094ac197d5a1a5846923d9e1bc46116553aeaf7", + "server_e_sk": "ce89433064e2aaf238a8b33d9dda73ac6abf292e25de824770b3691a188435ad6b2b55814d6de172d6edcda92554db25", + "fake_sk": "aa3a884bca2545447c65a2ebf3aff0a7119d41aa71d56e7716611a78c5cbf7eff07b7652087ab1fab878de504447bba7", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "01e45619e2e133cd4f90d44498e2e98de6121848891c694dcc1b6d9d9b7869db8027b13844f9423fa42699ccf80ce31a232c4fda427ac9d729238a00bf37db34ecf0", + "oprf_seed": "ee314aa30197bba5db71b3ea1b44db6d700d4e7305ab16952bb0a13acb5f44aa8a783d2e336c8e8a9d43547c3aaf52e62e2a1ef9b4e76ccc6f1cb5f05b9c3779", + "dummy_masking_key": "27a03067d8930e9e6b8bf0c15354bf2c9ebeda1a9fc4611b0cc76ccfb91a2799c73460fec947d7262d3d6536363da751b264aed9e141aebcb8adf39785e2deac", + "masking_nonce": "a9df1f4098b0abdd0069be95ba3ca590bf1a11bf305203f514c1f6c79e51a7653efeb2867ca7ceacdca683e512e3d7d07555d00dbb34725870d07db13076b754", + "envelope_nonce": "a6246a21fbff6f93bce655ecd1784a9ddf99804150cca4cb3a0ed745949d6335", + "client_nonce": "89247dd777db19e5d361a56399951dbd391327df416eb24f2ca3455346715262", + "server_nonce": "0b56235c6fd3ee78b15f1218d459af87324a289940dbb313f36e0f80ee5faa5d", + "server_sig_rng": "64240347fb04fe67989e29c8538c384aa941219df9f82c4bd23493b3aee6f5c83e18288655dd94895a5c9e7fa739f011", + "client_sig_rng": "27379f0368594a46401417f06545b6d2f02896631638ace6a055e90af8086ec2a7944db00fc2221b330487dfe6078afa", + "context": "636f6e74657874", + "registration_request": "020175ceccdf849c9153d4a3822fa18b40f4ff489c0ceb2cd09ea3a3d5ede1e39f138a33a6ee87481b860546248a481a3d3aa3628d0e79d7d511bac4c71c88d8c7d231", + "registration_response": "03006063020deb1e48cfe462fed6683e2da79f5a67b27bdab20f42f8e5e0c9345333ddf588f8343b4ed0e9e25685b1204a1e83f1c5a145fdb2ca00efe78c5f58fa5ffb02cd70b0c366cb09f3f7694e8f4908827ecc4a2d2eb600344f1c837b626507401ed6bc7e9783b3138472d9eae54894a43e", + "registration_upload": "0264219f0617769455d28544271aa40ff68658de587cce26fa9f03b0f0e94c54c0d476b03adb893ded6492454107fdcbccfa45faf1974d9061a35bf1551b6d3624de654c5ae578574b0c8b69a01c16483805ba66a826c43519e822953f13bbe124eb6906286e7d35e5fedd139af5484238a60e906fd3e47b7b1ff46327bd7095e17a1b44d14858eeda6e48feba8dd706ac981ad1d8e5917d6d4864903dda4ff4c4d076df0d5fbb130d03ad7052904fe92b34ca4da50eb1b7e1875e551c13b63de2ff6946639dfd2514dda88a4f1556d1f0", + "credential_request": "020175ceccdf849c9153d4a3822fa18b40f4ff489c0ceb2cd09ea3a3d5ede1e39f138a33a6ee87481b860546248a481a3d3aa3628d0e79d7d511bac4c71c88d8c7d2312ca6783e4163b4215010862c737a7aa789247dd777db19e5d361a56399951dbd020e4eb23304a3231a08fb215db5b0d88a3ded4e42399baf5e5a9172935f0a7609", + "credential_response": "03006063020deb1e48cfe462fed6683e2da79f5a67b27bdab20f42f8e5e0c9345333ddf588f8343b4ed0e9e25685b1204a1e83f1c5a145fdb2ca00efe78c5f58fa5ffba9df1f4098b0abdd0069be95ba3ca590bf1a11bf305203f514c1f6c79e51a765b4da8e7a6cfc20e0eadb7274474fdf13fed8f12473a385fc153a9bf8dc38ff5bd7350294212ffa5800bb2da38552bffd7a5958e840f67b96fed2ce5d11a0e685f69e6ae867c4834aef82f31db082b7a141ffd5a11c2897fb08ecd67b57b0ff6b51647277d93ed02cb3d0013adf1f2e4edcf26a090f0d46cb26f20e734b5a696d4d043fa14118ffb035fdbe69746be30487ce89433064e2aaf238a8b33d9dda73ac6abf292e25de824770b3691a188435ad020e48a10610f513b2cd69ef688bcfb2456ea8f4dcdeb6271708d01c666d0275f56139c293d8b9647496ce374d20e8e21533b7cebf7e73e8deece0f9b1135a39daacfd8a27fe4ef19dd777cd9e48de69459bbddd2223710bf853064d7b26a6a15c6f8b293db7173e17361664c0dcdc90414e5e3ae75d053f5ce836aa7762e4bf9e8787ec0391dff206b78c2457ff62d1e2d35b1ea76db704269ca02592f29ee722", + "credential_finalization": "6059648476cdb7597ee09f2ae54c807036f3923d6d737cac28d15f346c43db7d1057e33c40eab9ab95e4973763b1da5eeb3fd68a9b379df924a74fe5c87e67a5b7d9b9a536563fe8dddd98c4dd5de9c65310abec3c255d98867831b9d114332a1fe18b15f10541c10012dd87112799a178dd337d40278b81f09b529453b37471", + "client_registration_state": "01e45619e2e133cd4f90d44498e2e98de6121848891c694dcc1b6d9d9b7869db8027b13844f9423fa42699ccf80ce31a232c4fda427ac9d729238a00bf37db34ecf0020175ceccdf849c9153d4a3822fa18b40f4ff489c0ceb2cd09ea3a3d5ede1e39f138a33a6ee87481b860546248a481a3d3aa3628d0e79d7d511bac4c71c88d8c7d231", + "client_login_state": "01e45619e2e133cd4f90d44498e2e98de6121848891c694dcc1b6d9d9b7869db8027b13844f9423fa42699ccf80ce31a232c4fda427ac9d729238a00bf37db34ecf0020175ceccdf849c9153d4a3822fa18b40f4ff489c0ceb2cd09ea3a3d5ede1e39f138a33a6ee87481b860546248a481a3d3aa3628d0e79d7d511bac4c71c88d8c7d2312ca6783e4163b4215010862c737a7aa789247dd777db19e5d361a56399951dbd020e4eb23304a3231a08fb215db5b0d88a3ded4e42399baf5e5a9172935f0a7609f12235b98645382d951063d7e0b2176bcc6d720a243f16d7289e4820b245fc142ca6783e4163b4215010862c737a7aa789247dd777db19e5d361a56399951dbd", + "server_login_state": "0264219f0617769455d28544271aa40ff68658de587cce26fa9f03b0f0e94c54c0d476b03adb893ded6492454107fdcbcc4e0d4a7ece3676294759f6e975b1ef2f5bd40a73e1b63ddad2c8a51b5a9ec5e8a0a58068f1cbae0da31bd938532e34bd49f2db6811146bb50f32c0b4a87dfe91a0d0ea495bad2fdbe827c16ef0a443e21fe18b15f10541c10012dd87112799a178dd337d40278b81f09b529453b37471", + "password_file": "0264219f0617769455d28544271aa40ff68658de587cce26fa9f03b0f0e94c54c0d476b03adb893ded6492454107fdcbccfa45faf1974d9061a35bf1551b6d3624de654c5ae578574b0c8b69a01c16483805ba66a826c43519e822953f13bbe124eb6906286e7d35e5fedd139af5484238a60e906fd3e47b7b1ff46327bd7095e17a1b44d14858eeda6e48feba8dd706ac981ad1d8e5917d6d4864903dda4ff4c4d076df0d5fbb130d03ad7052904fe92b34ca4da50eb1b7e1875e551c13b63de2ff6946639dfd2514dda88a4f1556d1f0", + "export_key": "3c80a732dac34943cf3fe68fc15c0443764b33bb46ba49c4dd7d4ec7ba145ff2d1d9eafbdfb6f2e86192dda1ea7351d9c3a3614ec9a8f790bff6f58cb7e07a51", + "session_key": "4e0d4a7ece3676294759f6e975b1ef2f5bd40a73e1b63ddad2c8a51b5a9ec5e8" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P384_P384: &str = r#" +{ + "client_s_pk": "033704acfa80c832d2f59d7dbca29517cd9bbc64462325fc14f47fb23ae6b06423ec29dc406e69e964bd675ebac64b964a", + "client_s_sk": "5fc95b04d5cf1e937cfb29faedb274bd664d0dc309a74cff81ef4d38b829006a38d40915e6d06ca4ac4071ee40ac8e28", + "client_e_pk": "03d805147768651394a5623cca90805b501703ee63cda0a6d8c9acaad98c40bcd8a3b01196cfe91a6b29b1406ff3002a82", + "client_e_sk": "54e3f9801fd85b42e683fc5fb05fd7dbc4baee75f5b0b309f7df317bb31a0a09ef593783963f6b942e1ab434f0c67851", + "server_s_pk": "0373b9f94beadf465af052cfdf04feb1c1d7cfae83feca5b33441de740d3b123fbdd7956881aea3ba1e48d1d164c256e78", + "server_s_sk": "4cbd83aa019496a7d6aa46944aae91c8b4ba3c16e9429556dc38c2805b80bb6606edb67d5706ac2e659c4b3bad6516a6", + "server_e_pk": "038feb2cca13ad7fbe0e01750d6c091fec7f1133907d47acfbdf50fc5685581a3def43f6889b826226bc6ab886f9da44ec", + "server_e_sk": "b52a5f721493094bd4728be45655f874eac736db03fde7c833410fbfcbc9cb33a1420e9c16a2257aaecb8d0a7ad43431", + "fake_sk": "91f63e2df3d2101543af304c1d7a87231c9fdfd9a7f72ebb9ffc03ed4133b6bce5d31238c80494c20c2c81d499b97b4a", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "e2d7330bd30dec9ae09166761beaef26be5e36767a15ca8ab7026568acbce00a", + "oprf_seed": "98afc5bd3c63129f2edef4adbf1c054c117834a22d645a083ae9ae00df365ba0aa80883f4bb44156d72e70b0c54e1805460450e84c0d1a6a6fe50871897e77b8", + "dummy_masking_key": "cb8949c9a1b492689624a86cf1c49ade8bee2ef34b2c5bb6c0b45ac4495517b3d6246a9cfa9c0ca7110a298e23eb9b4770b9ae33e4c171c3fd8c6823ac04928c", + "masking_nonce": "0d07e2dde5abe55de0001f7cc8737145b3fb5205ec80c6cee132f33db4e9875c61de53e944b315d74b7371edb87f0c19776a5f75161c87378f7e1d73e1ad1b5c", + "envelope_nonce": "bd6e4360d68188e42c3eb95fb120f950b24c5026990c727fb0605ed07860e7f6", + "client_nonce": "5215842e98e3a2047e5ca54dea91ef01850df6053e3d0f6230310f38cde69d3d", + "server_nonce": "03b728581990d6651312ca25e5d6e645ddfcc2c0b35f2eea9c3389e60d28e157", + "server_sig_rng": "39858c21d2269ab819ab36b107fb7d75cf46107552f397502f80e9d424e01b5f59986618995561c8178686c01567e1a2", + "client_sig_rng": "20d6faecfe26753a1fb0b66d96313a97dfb6ff708b0a44296974a9a79948fadccbcf4556e012b1553a0f42c8c5c3945b", + "context": "636f6e74657874", + "registration_request": "962740a7731be2c79eba3cad8e7f8037214c718adc5bd5c9693a8ff03b7f6719", + "registration_response": "ecf639b579544b2a078480a1141f9c640dee9f719c4c15e4dad0721a3681db510373b9f94beadf465af052cfdf04feb1c1d7cfae83feca5b33441de740d3b123fbdd7956881aea3ba1e48d1d164c256e78", + "registration_upload": "02f2a56adfcd330b122e2bf873c6cf55dcb9e31100e4c6b1a70445c0772a3bc5a3ce15d205cc5f186465b9d69938e97f66bdbe1e5125cd835b703cc1e035e8eb776dd81cdcdb547be0c80446c8e4cae4f24d635ef57c68c8ae35839da10849a163c62ef6e83dbf6bd5b0f83b64266a45855fc95b04d5cf1e937cfb29faedb274bd664d0dc309a74cff81ef4d38b829006abca8880ba9b76407e914f7c4eeb95fc2e2b196a574b3adab836d969c59501980ff03abea58ed526260932b0efbaeeff59796395e3a438cec6c8ce007c4612c32", + "credential_request": "962740a7731be2c79eba3cad8e7f8037214c718adc5bd5c9693a8ff03b7f67195215842e98e3a2047e5ca54dea91ef01850df6053e3d0f6230310f38cde69d3d02ca6536b5beacee531c730cb4f72c617ae423716e57eaca5443ba880b17c54b20bd0dea20c7fd785828f0106339438e9b", + "credential_response": "ecf639b579544b2a078480a1141f9c640dee9f719c4c15e4dad0721a3681db510d07e2dde5abe55de0001f7cc8737145b3fb5205ec80c6cee132f33db4e9875c2894bd37128357ab40ad24e039fbd82696209df701a368f52aaaf227e850df9a70342cfa3fc1f601dfda4d34fffabc26098b2fd4b645f0ebc7c9d1d515e60ce4d071a376730e3252beb7d754535a292683d181aaf228887b9891b101d9691a0b945140f12d88aaa916933aa6ec6ee7518eb8509a797df899b491fb004c57e7c334ceb60efde613fec0d203294cc3c310f5eac736db03fde7c833410fbfcbc9cb33a1420e9c16a2257aaecb8d0a7ad434310327756d82bf6dbea825c6c8e652cd57248e56dc265db0d76ee034168a5956521c861f0a37d2f15f88fd7bc483d1043cf7f5391b40a1b59df2ae776e96140959780dac024b193f1918ac41bb708926440437dc1b78b34a295f1cf6f375eb921d3329a025701df82d6affbb770f499e73a045f555dd92cb4a0403aa0ac2fa3cf57ff2ae7107790e52840c00937568fae065d53318634597d5572d0ad6503cd6e2123675d48ed959809bbbe0bb97f937154b4336bb35198799270c83409a83df5faf", + "credential_finalization": "8e1aabdbb3ed8ef3acabe903fb6f328c9ef196228d89ddf8c34a08dcda3619bb6d40009c765521920ac8a84ebc7f8aa5f1a31ee7bcc64720e9259ce073901da8566ff85cbbf713e7000c0e9f244add3a0c7e12a9c93f7f73eb00aa9eab9129ba3723ab6112cbb8dc0ee532937596d7e68d29df42550b2f332d98abbb561119aef683290115054efe71e49465d6e36535", + "client_registration_state": "e2d7330bd30dec9ae09166761beaef26be5e36767a15ca8ab7026568acbce00a962740a7731be2c79eba3cad8e7f8037214c718adc5bd5c9693a8ff03b7f6719", + "client_login_state": "e2d7330bd30dec9ae09166761beaef26be5e36767a15ca8ab7026568acbce00a962740a7731be2c79eba3cad8e7f8037214c718adc5bd5c9693a8ff03b7f67195215842e98e3a2047e5ca54dea91ef01850df6053e3d0f6230310f38cde69d3d02ca6536b5beacee531c730cb4f72c617ae423716e57eaca5443ba880b17c54b20bd0dea20c7fd785828f0106339438e9b3cbb862c7ccd702deb5c4c0ca5340049266feee5e4f98b2cc07505e2fb2a9b429952e72e88c0b788675d159785d3e1a55215842e98e3a2047e5ca54dea91ef01850df6053e3d0f6230310f38cde69d3d", + "server_login_state": "02f2a56adfcd330b122e2bf873c6cf55dcb9e31100e4c6b1a70445c0772a3bc5a3ce15d205cc5f186465b9d69938e97f66a9008aa26d778dda92b8f1467797d64fe8c0b1a35111b3d0a4f376368ea663e23e6871b73efee9c4c8bf31d1214e93c61d3a39f9f1c7fa21da68e6038c8c8a2f061db04a402134d9c6f7ea8358c8490ea151734a00289ffb02cd07345bfc04393723ab6112cbb8dc0ee532937596d7e68d29df42550b2f332d98abbb561119aef683290115054efe71e49465d6e36535", + "password_file": "02f2a56adfcd330b122e2bf873c6cf55dcb9e31100e4c6b1a70445c0772a3bc5a3ce15d205cc5f186465b9d69938e97f66bdbe1e5125cd835b703cc1e035e8eb776dd81cdcdb547be0c80446c8e4cae4f24d635ef57c68c8ae35839da10849a163c62ef6e83dbf6bd5b0f83b64266a45855fc95b04d5cf1e937cfb29faedb274bd664d0dc309a74cff81ef4d38b829006abca8880ba9b76407e914f7c4eeb95fc2e2b196a574b3adab836d969c59501980ff03abea58ed526260932b0efbaeeff59796395e3a438cec6c8ce007c4612c32", + "export_key": "19acc35c1de732c7b4a6c2829d1a329984abd5c8b87f5babc41ae0f15f3515e768e625a21d61e404e8204fbe3bbfe9d9b1e4ad5c221b4602a37b71c1225cae9e", + "session_key": "a9008aa26d778dda92b8f1467797d64fe8c0b1a35111b3d0a4f376368ea663e23e6871b73efee9c4c8bf31d1214e93c6" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P384_P384: &str = r#" +{ + "client_s_pk": "0261fe4add5a918450cae55ed23b4ac31e7609eaed7517ca3560ae00e4cb7d211fd9774e9152bbf77bfb0a999ad3880986", + "client_s_sk": "0ad196d188e22a353a1854ccc7791336142346fda833423cc608d71fe9f129718f2c7e1ec4432a2f6c2e1bb5cf874d30", + "client_e_pk": "02a454f6b7b40bd20e94a5373f0cae4298ba7ea72349208e6ce12ec9d6bfab0a805bae025dc4c888ff351e10cdede5b305", + "client_e_sk": "c989db133690e9e01c57e0ef4ea902fd21c800924d9316a293e4580726cd8be80542ec41902a9ba8f527765dbf2b52f9", + "server_s_pk": "03d204a011143d53ea1bf9f847abe50ff0183186bdc4fced7d7c80982671bf46db884d72fc1253066bb7bd1203586aba53", + "server_s_sk": "90f2a9fc4e180f88503871252f4f90ebd23a264b1f6d81b2e57343de726b94196c4f79a9b3c96b983d624af09815b36e", + "server_e_pk": "02fabefe02183615f2c030993532b44957837563db7aa58d6a9e2fd93c8ca6164c8c4fd2472d46deed8f39bddd042129ca", + "server_e_sk": "afc6c39a696815f9bce01575806f84f0b398be788da1cba09732d3afa3bde29b0d63ee95286db1ca8447bbda5a3c822c", + "fake_sk": "930f35c1de09b6b07876eaf57d6511fc97770a6865bbe8740ee7137e4106a3a68aa7f23a9bdeec8dc7c324411205f72e", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "1880a410f461ab0fed7b24928c96439f460a8d261b9433242de719e7ebfb8882", + "oprf_seed": "a1fd1dba48d95b47861e731d228e34d1cc068f4e9e6f297c196b036213716bb3", + "dummy_masking_key": "bb63fe543a67be323f6e33d2d5dbedd0e7c2273f4569a726661ca4648d03f110", + "masking_nonce": "d4a89779883024db6e5cf25703220b5d7dbbd722e38dd8f18aea5d137c2213b32fa19edb9e23dd03b9d42ba5e67d070df95a306e9595e172c23f6a05f9bbc85c", + "envelope_nonce": "e2db2f07266120669c9bd5cfb3251a883698166ac624100e55779e3745d02e37", + "client_nonce": "cdaf6568ca851d634a35f9ffdc61fa87359e8f5e744228001b7eb2b9ad00465a", + "server_nonce": "cd46e42980babb7eedb889add53875a85d926bb60ac003028ceee0fbbc9d0bfa", + "server_sig_rng": "83e66dea75ef9daeed1b8927c53f1543d100b3293523202a3750f4eaa8897fa332dd6b10646790768d44c81d768b14c0", + "client_sig_rng": "43d3076dbbfd66654394e9cef264b157f724f4f620e58b1ec3e8455b40ffd569c4ac2a78c82a6a30c8ed094d59c572b4", + "context": "636f6e74657874", + "registration_request": "02eaa2e503e0ffef8e653b6d9928eb7a57d53a9e388ab1b8bd5856f26dcde66d7d", + "registration_response": "03fadb418a4adee7e60a42473e2d5fcff3db6ffb84e26705002e6dbbc7810816d303d204a011143d53ea1bf9f847abe50ff0183186bdc4fced7d7c80982671bf46db884d72fc1253066bb7bd1203586aba53", + "registration_upload": "038a9f5d544703f69c4802088ead2c302d6f771fc827836e64bcbd768fea52598747b81ce8003a186d69973253a6af5043cab17f45c73b025bc5283322cb96e4682299493b417b3390868bb247c5523f240ad196d188e22a353a1854ccc7791336142346fda833423cc608d71fe9f12971f75c756f05deef6c9b6ead7ad400359fa209ba9da9e8ac418295aaa3a4258e98", + "credential_request": "02eaa2e503e0ffef8e653b6d9928eb7a57d53a9e388ab1b8bd5856f26dcde66d7dcdaf6568ca851d634a35f9ffdc61fa87359e8f5e744228001b7eb2b9ad00465a02b829f2b800bad1c1f018d675db2e9d16577d63f3aeb59d1a2a1ac1218961402d56369aa3c144837e5c732c1c38e59542", + "credential_response": "03fadb418a4adee7e60a42473e2d5fcff3db6ffb84e26705002e6dbbc7810816d3d4a89779883024db6e5cf25703220b5d7dbbd722e38dd8f18aea5d137c2213b3c863342766ca7713adaeb4d26048c42c47566f205277680ff481a3dd3ba58fdce1d452376ebafa2db31fff79189ff545a6b31a59d15c4280f230c7383cd3f5394ddf638a86ad1cd90cb5a7ea3e077e148c229e9511123957803a072c1eb4ca01ac778fa068e3012eece3fbf4b9ab7d1ef1b398be788da1cba09732d3afa3bde29b0d63ee95286db1ca8447bbda5a3c822c038a5d1e7c4c70586e7ce4d250e8b8c29e94670a75dbdb186334628694385307819a5e8645eb17d91db718cd24de52cb0eb8624648a47681883b8a43183f5948cffdabbdced60c87a034a86745c158cdac4e79439b5dff3fae82931fccc5b7756362be359f64d027caa9393af81abd46b7a68f4ba21ab926555234440149859cf7e2a159700c935bb647f0eac5d2a9e19a6063c7f2d0abd6cab5115e046c30613b43b186fc9c75c6cc40a529719dffcd5e8ab74e0ebdc47be622eb444c814297ca", + "credential_finalization": "7e6181beb120129d30882455974d07c9b21fed1ffcb15fd50b2941c62d59574315b0c23be332c566c1b0ecd9271d555194b286b2fc44619771c5e31e0254b75ee295a0c25f54b34b5993243445eec22d6ca2a89fc54842de66ab91ea542f3559e5f9179120044b7e71eefb9ba0b705706833b3e825ad33d3eb5c370317ec2d71b4878d28618712ec8daa09204093895f", + "client_registration_state": "1880a410f461ab0fed7b24928c96439f460a8d261b9433242de719e7ebfb888202eaa2e503e0ffef8e653b6d9928eb7a57d53a9e388ab1b8bd5856f26dcde66d7d", + "client_login_state": "1880a410f461ab0fed7b24928c96439f460a8d261b9433242de719e7ebfb888202eaa2e503e0ffef8e653b6d9928eb7a57d53a9e388ab1b8bd5856f26dcde66d7dcdaf6568ca851d634a35f9ffdc61fa87359e8f5e744228001b7eb2b9ad00465a02b829f2b800bad1c1f018d675db2e9d16577d63f3aeb59d1a2a1ac1218961402d56369aa3c144837e5c732c1c38e59542e4a75287335c7bb10ef3500f711357ed2c4543eb42ec73db969264608a406c6e183deec6865aedbf45df9e0cba715ef7cdaf6568ca851d634a35f9ffdc61fa87359e8f5e744228001b7eb2b9ad00465a", + "server_login_state": "038a9f5d544703f69c4802088ead2c302d6f771fc827836e64bcbd768fea52598747b81ce8003a186d69973253a6af5043de0a308a02386fe397afd7c1a8c501e47830ae46ad8e65fdb820531fd1470261c0822719712370c78787b3fc9fa6e8ba96f0cf5d028a27292e62c3d3866ea690f0f908309ea1e602533604673c3b8b3b43220c042a74b0187740b9b72d99fc6fe5f9179120044b7e71eefb9ba0b705706833b3e825ad33d3eb5c370317ec2d71b4878d28618712ec8daa09204093895f", + "password_file": "038a9f5d544703f69c4802088ead2c302d6f771fc827836e64bcbd768fea52598747b81ce8003a186d69973253a6af5043cab17f45c73b025bc5283322cb96e4682299493b417b3390868bb247c5523f240ad196d188e22a353a1854ccc7791336142346fda833423cc608d71fe9f12971f75c756f05deef6c9b6ead7ad400359fa209ba9da9e8ac418295aaa3a4258e98", + "export_key": "21320cf4c103efaf923bac5bd5574aae39f0d6c1b535a8f48d39ca7c69867241", + "session_key": "de0a308a02386fe397afd7c1a8c501e47830ae46ad8e65fdb820531fd1470261c0822719712370c78787b3fc9fa6e8ba" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P384_P384: &str = r#" +{ + "client_s_pk": "02b8595d5fbdfd80c122f4c995b430232ffe94c20e92833a704b7fe59084f72073c763f1ca9d0ab6deb44158b1ddcf7a8c", + "client_s_sk": "a9f821a4a42df09a5b09f2e26cff341456ef1dc0e13c0f30a24417d637bd94caf84fa75304ffd49d77723d155ad62dd0", + "client_e_pk": "02e1935cc35f4d7e77bc500812d85784d95cf9d956ec9350e323ec6bea1e03efc64a4c0012e6e4d2f8d7a9d19a6d7dbb23", + "client_e_sk": "2dbadaf69e5f61928beebe9cb0797fedc49c54c2ac840db5a7f706a55508cb37d9ea7e8e44b5aa17c3c962613ad743f9", + "server_s_pk": "03b07c7455e6878551047d0b3c393275d7622be565acb8bd5c23777f2662d560e25029d665f2ec38bd0613bed792118c77", + "server_s_sk": "594dd6e93a3333ae2a822c65dbf33c4fed3e8fab7476f13d811bc8cc55b89d9d26c0a45ef547fe6b320f72cf3d4fa89b", + "server_e_pk": "02ebe346d4cfc56503d550e8abaf9af9155d319a5bddbbc301516bbd9b8b22c4fe7384f325b9cd976b1876285bacbcbb65", + "server_e_sk": "ebdc926e11dacaea113969e9ab62c9e18abcde4300b7c709cdb643bc16c70db9fbccb9c6545e3517c97dee763c2b8cfc", + "fake_sk": "326c734cd4067383d77720c55408bc1b9d6344b5c434db13d3ef9a3dbb44a0a73757d60ab348494d11072f652a1738a6", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "5cf3f0043a4df3b151923f8abe389b43904d01688b11c16547e7ba5956feb659a7bb735a9e2655dd94241c2404ac65fe", + "oprf_seed": "c227ad548c33b6f79ae549690547879dedb308795b4c5eaa565875e1e91b0f237736030a01116d662145fd38f5b752fe", + "dummy_masking_key": "52a2339ccae7f5bd194baa70a1da678e1f39bb9012452f5da2aae24bec7acc99ba84017a771250305e6c008f2d0cba21", + "masking_nonce": "c85cc4cae4cbfbe80a4c2f75bf9a6cc4fea4582817bb9969df5445346991016afb42dbae0cb1ce7caf74fe883794a3638f6f25a3a9d61348d531eced532be43c", + "envelope_nonce": "03afa73a36cdb6870f8dd9705aa87cdca3264204cda2913df6e63e84aea8cb97", + "client_nonce": "650fbf96ac85238574c00884c8c364d688d19a29762ed9938e0784a556606d1a", + "server_nonce": "9355107485b32e8f18267c5e828c90afc385a40ab154417357d2099837fb451f", + "server_sig_rng": "69cd78a4e6335704d8b4e17cc62ecbcc86a5a42ebe59cc48b6deba5fe5377d3dda8040c71a396d5cf8e78bb6f07ea987", + "client_sig_rng": "548bd89be64ae1941d64a5191ea8045631b7e883d16f4578fd3db9c56992810c4e38ca80ce1a766357ab92a0c161fc23", + "context": "636f6e74657874", + "registration_request": "02a67364ab6188ec7d0b5debe2bb25635b6e5dad78c175c504bf9fcfc05b52502384fb406c1cde51943a3111f34ec466ba", + "registration_response": "02d0891b34743a00449ce302d65cf7d2878915e9fe52c7b5242d4773e714d55c540abaf9147d152449eddc83919ec6a23703b07c7455e6878551047d0b3c393275d7622be565acb8bd5c23777f2662d560e25029d665f2ec38bd0613bed792118c77", + "registration_upload": "02d7b61bed41ae6810caf18497c66c0606921e890094b8e9b17adbf6d6e3c965d41e91fc7e1ea87fe41eefff630df84f7851e7ca1b36a7c9aca05ddf1ccbf4ee45640065248e6b650f99ef43f30d23787e988fc20eecff50fa76b055f1afea246da9f821a4a42df09a5b09f2e26cff341456ef1dc0e13c0f30a24417d637bd94ca0045325b9b74c2dec58468445a542e6650dd51475d2649aae57a3ccd832758f7ce06908bd6dd3b02e9bbe6209cf67e36", + "credential_request": "02a67364ab6188ec7d0b5debe2bb25635b6e5dad78c175c504bf9fcfc05b52502384fb406c1cde51943a3111f34ec466ba650fbf96ac85238574c00884c8c364d688d19a29762ed9938e0784a556606d1a039c0835979b2f1cae008075b76cb81131d10a89a0d8cc29994b8437e76d491547847844c3820b23b9f8c7f6b4987d709a", + "credential_response": "02d0891b34743a00449ce302d65cf7d2878915e9fe52c7b5242d4773e714d55c540abaf9147d152449eddc83919ec6a237c85cc4cae4cbfbe80a4c2f75bf9a6cc4fea4582817bb9969df5445346991016a338876dfc850d998a1eb329340a26a64a5ccb293245eaddd2a52dd990855e213696cf660fd01041363a17977beb2f1f700495f63a7aef13ab8ed5526b888d365ea1dbd83633a27604d8b6b52d753a11de12f47a83b49b5a5a5c84cab2811ff08f405fd5ba571d04660d0e9b22d19c73e92917602cd4fec891700527e26877410d88abcde4300b7c709cdb643bc16c70db9fbccb9c6545e3517c97dee763c2b8cfc0344c530ca517b16bf49ba43dccc0a34cf228b4c73cf9ee454e1dee571f0bd83882424fc970add838b9a602b3714a43f817a53340d0551623cf3f1acbaaf0b20dc53f22a83f95f9c442996493410400494d575abcccb9f98510ae867b632963e9da7c97b3d65ccfc68fb2203c1312a2308b218f2c734f29deffc0d3c38d1be700b90beeb870958354bb45052e3d5bfb633b783ccb5dd6ee614b41ab25f3a8b9958a341efdc79f02adab731d676d03df9386aa8e69d711e9546e66f178dcfdb092e", + "credential_finalization": "73233bb9c6c99cc5d418c3335f7e1f57360af1af66d559436b61bbdfe59a06a7034f3be15b55edab609cafd26e2014e79c3f148285bf66f75715320694aed7200e8ed2fbbbc3edfb78b21ec04f998f4285b6215aace7ce0fc5829e363e8b9058f83a09624968c79dac4d61fd542ea2012687c9be603bd76063336b8ea50eec649c1318eacd5c538d81158977c298c84a", + "client_registration_state": "5cf3f0043a4df3b151923f8abe389b43904d01688b11c16547e7ba5956feb659a7bb735a9e2655dd94241c2404ac65fe02a67364ab6188ec7d0b5debe2bb25635b6e5dad78c175c504bf9fcfc05b52502384fb406c1cde51943a3111f34ec466ba", + "client_login_state": "5cf3f0043a4df3b151923f8abe389b43904d01688b11c16547e7ba5956feb659a7bb735a9e2655dd94241c2404ac65fe02a67364ab6188ec7d0b5debe2bb25635b6e5dad78c175c504bf9fcfc05b52502384fb406c1cde51943a3111f34ec466ba650fbf96ac85238574c00884c8c364d688d19a29762ed9938e0784a556606d1a039c0835979b2f1cae008075b76cb81131d10a89a0d8cc29994b8437e76d491547847844c3820b23b9f8c7f6b4987d709a636dfdd41f9bfcfef5d055fae176ffe3a738548ad31306983ba414486c756ee6ba73675c0c4145910412ef99b25d196d650fbf96ac85238574c00884c8c364d688d19a29762ed9938e0784a556606d1a", + "server_login_state": "02d7b61bed41ae6810caf18497c66c0606921e890094b8e9b17adbf6d6e3c965d41e91fc7e1ea87fe41eefff630df84f780af978fb9f89128d8e0fc708b7463f73ae07768c734aa4e4bcdfb06959e45e2ee339a17cc67560045cca20eab82b0eada3a1c1fa334e16e7004ba039d52e2307476f0738dd3d430812cec8da923baa21659e450353b109eaf6f009d91547a819f83a09624968c79dac4d61fd542ea2012687c9be603bd76063336b8ea50eec649c1318eacd5c538d81158977c298c84a", + "password_file": "02d7b61bed41ae6810caf18497c66c0606921e890094b8e9b17adbf6d6e3c965d41e91fc7e1ea87fe41eefff630df84f7851e7ca1b36a7c9aca05ddf1ccbf4ee45640065248e6b650f99ef43f30d23787e988fc20eecff50fa76b055f1afea246da9f821a4a42df09a5b09f2e26cff341456ef1dc0e13c0f30a24417d637bd94ca0045325b9b74c2dec58468445a542e6650dd51475d2649aae57a3ccd832758f7ce06908bd6dd3b02e9bbe6209cf67e36", + "export_key": "351027e9f82bcb2a216538959e609debe4541994373ab2c20fdb4afd694527f3b693ef9cb972c1962778b4ead86d11cf", + "session_key": "0af978fb9f89128d8e0fc708b7463f73ae07768c734aa4e4bcdfb06959e45e2ee339a17cc67560045cca20eab82b0ead" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P384_P384: &str = r#" +{ + "client_s_pk": "03866c3dcb0d158d25a904da4d9bc84982c074d829ad61a67700537ea8cfc34607322332dec6ac90cbbc81c21d0c1da23c", + "client_s_sk": "6fc12640a8d8b283f97401a8394de9d390ad5b31b8ba38bbc6179d7e5f1ae7d51692a46ae8d247b9a6db250b0776178d", + "client_e_pk": "03eac600b718a82fcdfb1bda40052e0a3a2779eaa74871b61f753af797e26a1a9312315e39015dc3430a89bcc06c7ee7cf", + "client_e_sk": "794dc61bd6c3f802bc489de1d117e96ca2740c8530db425d1c7dba8259b3f4098cd45ba18a272bc888bd36cca37e8023", + "server_s_pk": "026766a2ab3b3c5284dc997893ba709e37af61e01de039315a70a76e2bfb236be2b5cdcbf4b115f5150971500290c36e8f", + "server_s_sk": "b51c3d74c1d00654f2723c73bc0004ed738edbb48b5717d388db1cf32742ea91099ae39df8373c672ce651458079d665", + "server_e_pk": "034173ee38bf46c6d70e7a28a64d475dd7ea0b89ec1d7672c4b76c47c45fda7334530d7f0d33247b41572a9d80682ae0cf", + "server_e_sk": "dc8485152281e183ee8e443d1a6b2e3bf6d8a1764111243c98dbeb0a96ab574f644e00606b18d0276aef6354f2b895c9", + "fake_sk": "85f9b931a837eafea5c520734965e2a81d73af8082086e30a5b41df7c04147e9905b919c514b5939f0e1c3882e238f36", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00c4bbcfb9305f7681928aef826a1519ace3409e840d25e0273383e58ea0549fa2fc49ac971d80aeb4a8b49138b6f6efe8aa1d6b22d4f958db7201b520eeb79fb7a2", + "oprf_seed": "6e05e3af70b508cdd62692e71f9eec1a345ca932b5c5241f253bc91f728177209d531d0a3d9c91ce9f9e91387ba87648db7928ad2e67b5d1ebffef9683fa59be", + "dummy_masking_key": "cee81cba3863fb249f80ba0f7c67dc4364bad940f4614c578df6f84d635bd89a5966cfeaabb5e69256150a8725ac92b05772b6e88f53cbdac8fd89033f14282f", + "masking_nonce": "34902f685b202b71e89566fba3b8ed0b332234318b473aa997ca56e811cf408731614ad9e4a2104c76b0daf953a0475e38cd5e8ab24cb6fd35baef7faf84e732", + "envelope_nonce": "9d1b25d5b380eb1da560a6ebd337be6b8bc8c027975af07ef93b111d635401cf", + "client_nonce": "0d02f371695bb676c72599adf987ed929e49eeef061aa531d49f90403e067a5c", + "server_nonce": "7df9c62978e33713bf19eddb27b1d175d0064d4febc9399385888598ccdc71b0", + "server_sig_rng": "90607e97b8ce5800627fc9f0c209cbce42574e89421a58dbc2ab0a90dea91442b58ea16e5f391413585380051bdca59a", + "client_sig_rng": "0ffee4bc00f65557804bcddec1db04f0f3d47aca5a857bc5a7ee9feb2eba922d82526e78e1b379bcadabd4552b98d522", + "context": "636f6e74657874", + "registration_request": "02004e3a181cc3fc30e62347cdb622bac6666f380cd50847d73f3bf4294353fb168cc3d44b08c82d5a36ec0f1216dec6513ae7bcf4fbfd2ed7121e2cd59c355a6e137d", + "registration_response": "0200883e12f51f7c5a304a1e2b74f179a19bc3955d10088443ed14df63149b6602c8da05db2b0585146519bfeda52ee854afa405d93bcf399067e42d66f5b8ca1c7dde026766a2ab3b3c5284dc997893ba709e37af61e01de039315a70a76e2bfb236be2b5cdcbf4b115f5150971500290c36e8f", + "registration_upload": "0263e4b6596cbb84693ef3c82d21a19d844dbffb79492fddcbe227a78ba8ff5319c5693bfe7dc3704cbc4853d25cc7de5ffaa602d3b7ef74f90fcd93f5b8ad9b4d5e07a45163dae77f06fefe047a8904c5df93d9640c8545e7dbb5770a5983c8a205cce7cc5a1055696db5a6e42d6066526fc12640a8d8b283f97401a8394de9d390ad5b31b8ba38bbc6179d7e5f1ae7d55b9ad4c82eab0212ccd2063bf9dc6bb76e678d83c72b31c5f69c501d5ce5660e0df74ec6029a9bddbbd0c8811d21a1246be0b9daa9e80b20693b442a392bd727", + "credential_request": "02004e3a181cc3fc30e62347cdb622bac6666f380cd50847d73f3bf4294353fb168cc3d44b08c82d5a36ec0f1216dec6513ae7bcf4fbfd2ed7121e2cd59c355a6e137d0d02f371695bb676c72599adf987ed929e49eeef061aa531d49f90403e067a5c03130fdf5f1282a0a9278b8ea6fc4c168a0486bd90f977530bfefffcba7dbb762800a2a39cc3c8eb4941209a73f672279c", + "credential_response": "0200883e12f51f7c5a304a1e2b74f179a19bc3955d10088443ed14df63149b6602c8da05db2b0585146519bfeda52ee854afa405d93bcf399067e42d66f5b8ca1c7dde34902f685b202b71e89566fba3b8ed0b332234318b473aa997ca56e811cf4087da1fa8ff67f5f8a135d4cc2889ea151e89738c6666ad614ba06d110d651966364736755ff3c02f3d8e8a0d9bc60bd1c7273c8cdb7819b4b81630b13be5f40241721786a1bb6ee020ae65644ba6dbc566e427c81710b221e1d41966bc8229e6d669bcd59608e2a5c77635f651ca0128a61527f1c1af4db611a5023a9d954f7bbfaa77cb456125458b820e3fec306c923c0bf6d8a1764111243c98dbeb0a96ab574f644e00606b18d0276aef6354f2b895c902a5e577124c7cc99fb4fa741b7740d0fd71d7c6a7e4daadcc05046280c4ed8affc98396d26bc3cbf270cf5555addaf7b447e90688ff120c785d4eda5575c156a53fd6248e1810e922a1e5eb6f99f925c3ddd7befd5d0284b0e6cf557ebee13faa69f8be33ba1e7d6ad7da3b573ca2c60b862867dd64f4c4b1d257513e208c4467957c73498a7ed538bf4d9bcf7e152577376935d3a451af44adf03c9fadf9545ccebde71b97639e04e6e0c66968daccd6a642cd53052d8edd4c4916aef269aa6e", + "credential_finalization": "7aac7a0c5d6be57f13b7d5e0d2e5f410a05e74e485a3f37acb982bb6d31cb5fdda2b34bae88057aa0b2f7ac3ab1f9de98a23ef3eeb40b48b88ac5fcbd3caa4453418fb61bb84370a217579baf57108fa9ecf4d83c9ae24b5e636416f8f0480ba74a5db1f6cb366c7476414be2d055c428a6b3d4b2cf8a327e3253e00bc78a9fc4d5be5e8d3df8a21c70e0e1736857741", + "client_registration_state": "00c4bbcfb9305f7681928aef826a1519ace3409e840d25e0273383e58ea0549fa2fc49ac971d80aeb4a8b49138b6f6efe8aa1d6b22d4f958db7201b520eeb79fb7a202004e3a181cc3fc30e62347cdb622bac6666f380cd50847d73f3bf4294353fb168cc3d44b08c82d5a36ec0f1216dec6513ae7bcf4fbfd2ed7121e2cd59c355a6e137d", + "client_login_state": "00c4bbcfb9305f7681928aef826a1519ace3409e840d25e0273383e58ea0549fa2fc49ac971d80aeb4a8b49138b6f6efe8aa1d6b22d4f958db7201b520eeb79fb7a202004e3a181cc3fc30e62347cdb622bac6666f380cd50847d73f3bf4294353fb168cc3d44b08c82d5a36ec0f1216dec6513ae7bcf4fbfd2ed7121e2cd59c355a6e137d0d02f371695bb676c72599adf987ed929e49eeef061aa531d49f90403e067a5c03130fdf5f1282a0a9278b8ea6fc4c168a0486bd90f977530bfefffcba7dbb762800a2a39cc3c8eb4941209a73f672279ca61e742ebf6caa3e133465611f095f6384ebe94ab447e5f4b9816381ad99aa68874dead8529fa35ac59395452e713da20d02f371695bb676c72599adf987ed929e49eeef061aa531d49f90403e067a5c", + "server_login_state": "0263e4b6596cbb84693ef3c82d21a19d844dbffb79492fddcbe227a78ba8ff5319c5693bfe7dc3704cbc4853d25cc7de5f9da8e7d7a2c763dff6417263a5466288d59d1cff055202975c3e4ea320ccccd10040ec8d6608a0e683687c62fccc0c66e028ff2d5171cae78dc71d140197f9448c93cb87b765f65c9c5e9eca282c89d05eebda469219ce58dc9da30422c4fdbf74a5db1f6cb366c7476414be2d055c428a6b3d4b2cf8a327e3253e00bc78a9fc4d5be5e8d3df8a21c70e0e1736857741", + "password_file": "0263e4b6596cbb84693ef3c82d21a19d844dbffb79492fddcbe227a78ba8ff5319c5693bfe7dc3704cbc4853d25cc7de5ffaa602d3b7ef74f90fcd93f5b8ad9b4d5e07a45163dae77f06fefe047a8904c5df93d9640c8545e7dbb5770a5983c8a205cce7cc5a1055696db5a6e42d6066526fc12640a8d8b283f97401a8394de9d390ad5b31b8ba38bbc6179d7e5f1ae7d55b9ad4c82eab0212ccd2063bf9dc6bb76e678d83c72b31c5f69c501d5ce5660e0df74ec6029a9bddbbd0c8811d21a1246be0b9daa9e80b20693b442a392bd727", + "export_key": "b33409ae8dc289d110eaabb3d3d09b5f1b2da76e5478a6ebb8fe278a428f3a162d71e2e2bc58bfd8ef6802d76ad886aa637dbb8c1f308342fc74b091878ae829", + "session_key": "9da8e7d7a2c763dff6417263a5466288d59d1cff055202975c3e4ea320ccccd10040ec8d6608a0e683687c62fccc0c66" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P384_P521: &str = r#" +{ + "client_s_pk": "03c9515f3b1b76eae5572ed930cb0d434d393907129c6ba4553202c5e73b4e9665bf3fc6bc77673eaa68140f949c69ff59", + "client_s_sk": "0fb2537d1351afdfcb800c78bf5ba98caebc0de9dbd457d116531642c8566961d5cbb8704d91a0e1cf4acef1a9e75e4e", + "client_e_pk": "02a891cd0013c32817ebf57f6bfe068c62da0c739df2de0426069c239fe5f3f77448d07fd5225d1a86eb49d4700ad86d94", + "client_e_sk": "248915852c40dd842f7bbbb7f05b8ea8f907807b9a2e47c38eef55e8c9876d1a3528a7349490992e0a03f53bfb1b5b26", + "server_s_pk": "03fde1706befaa18f5e939d51df80328fb525ca3c1d2e863ee3e94d5c43ca91dc4eb711e63771063ac2ed10f04c1e89b84", + "server_s_sk": "b350de827d3216eb8224a4b0decd0973dd61ac6ee0648387122d1b95672ba5f2452e5d7119eb5862cc4252d72700c128", + "server_e_pk": "026558fd214d18ea91db57ad6d717b0449863f9cde10aef5fc80190c03eca161b49bc921210e322d4dd69df29e035c1348", + "server_e_sk": "ec63e939d55750b13ea977307291062858139dd273744535f40b6a3ec068f9726fbebdda43f125944771d36366cc601e", + "fake_sk": "d03447ba242165e8fd2b8a4b230bf52c20923506c711d4fe822017dadce45aa4ce6a8118d0eb043e9e190c12ccc4114a", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "b0947a3f7f0a4328e481e848161f8bf1404dfb847918e6c7272a24044a59c001", + "oprf_seed": "61dcc0a1f29cff3039001c611473e2b4a23f7737f340b41b47129fa2816d0a2513897483e9dc6ea5319a731c1ff086d01230da15989706ccb4bfeb03e7c7705b", + "dummy_masking_key": "bc2af6faa06e3bd32e6d206d6e7b65d3d3362b3cd98be2ff11fc6564f1a3e5d71f911b9a6fa89f0dcb7a853b9d8c09816451d626e2747f1fdc318787dd7d6318", + "masking_nonce": "f4a345d31a5ac884427fb2e60a5f50b3e94821dd34cbafa8fce2ce7e595d7dc2eb77857d7f7a87c6f201801aa42f1ef26fae27b1eddf26964fbd75bd52e35b03", + "envelope_nonce": "ef0061de79eac830f1e5d77385d252e20ac7f5b87534cb4ddb07ff73a4a67b79", + "client_nonce": "a9f61d24469b55ed29d0f15e25a836644a93bb305806d305d9873e276d32682c", + "server_nonce": "f2b28579206145a8ace373d89e236d0e4dce727edffb868940f8e9db4eee23d7", + "server_sig_rng": "27ee0e4df17b6a9a752e63d21d52cda46f5200a1b47442f13ccce5e5733f6596f1814a78d2d6f8b270634590179137e1", + "client_sig_rng": "79c559f5fbf0beea9508e1d9e143b15cd98d13856ff920664a1c26e617b2062b1f1c43c74c87a419cbfa35ff11523209", + "context": "636f6e74657874", + "registration_request": "e299e1a4886c445b6f5203d3844abf0496c443d2c95440558bb5495f0f9c0d4d", + "registration_response": "dac8cd6a890edd8f9b96cef2380a96eeb9f37ceb455003e2dca1b00d6e52955e03fde1706befaa18f5e939d51df80328fb525ca3c1d2e863ee3e94d5c43ca91dc4eb711e63771063ac2ed10f04c1e89b84", + "registration_upload": "02cde43c3cf9399f4bea81ba296f9f9902502f5c6e6fd5160332039fcf854cded3ecf45cb7b26c86c62cb65d294c79694c14c9845518a1cc1f9e57c6bdc8bdd7a023fdf024b9f04a796620fe40c6ed39e2261296de429ce1424d7b0f502fb64dc4159606e96fc4f60d37651ac3fe5a287f0fb2537d1351afdfcb800c78bf5ba98caebc0de9dbd457d116531642c856696101dbe16446b46c4b085230a0c5829cbdf85132bafae82ab8d400dc83640862fa648178c6a15068b08fa31e350acabf0a7bbbec92b90190034277e49f6b148603", + "credential_request": "e299e1a4886c445b6f5203d3844abf0496c443d2c95440558bb5495f0f9c0d4dbb305806d305d9873e276d32682cb0947a3f7f0a4328e481e848161f8bf1404d03015eca28f64984ce76c9cbbcaefeda6693ecdb1d28f67ea6ef7f12a3b301c87ab7fc69b4e67fe521a315a571efdfc5bf5512c56142e8b0f86f0684745ac28f1934e0", + "credential_response": "dac8cd6a890edd8f9b96cef2380a96eeb9f37ceb455003e2dca1b00d6e52955ef4a345d31a5ac884427fb2e60a5f50b3e94821dd34cbafa8fce2ce7e595d7dc2818d4d7df58a15dde02753d1dec26d2b3e763208809413109a43ece839cb93bafdcab0a7c6aa71b828c75c0450da61c84f84d5f397c3f78d9fa926e710c4162ccba7a52a4130906713c71f375e3b64fe4e57d553a6ee8029f2eced23e2394f57157f2bab9ac5ee2f9f56807bbe68edfb87694f588010ca3c0b60c7089ae8a0410d596736baa379f2c6947bde88414f7d08bdda43f125944771d36366cc601ef2b28579206145a8ace373d89e236d0e4dce0200be8d8de97cd2f7de718001bb070dd736963309f9b73831076276e574498598b4320cc1e2f6916a3e1588db5761a0d26f5e74e1f2bbdf7706945037f42cdddb63411a161a5eb3e64ee9f9b515a5e5fb8824d1453174578007cb212d26468903fdf27056a95d3e0c7b6377642312db8934593b66a2d2b512d476683096c26d5d5fef4bab4f224a0b5b50928293295488af27b43fe224f4a74372aeb713bd3058e816a468a8aff69bcf33b13f23c3b14403c84aa9d7f4915d352940e7c9a83b7dd9946fa87cb675212a90f277388bb24b4769cdbe7d08cb3abcb6f21fab9c78ee919a", + "credential_finalization": "91dd97645c1e8c59930d0e46aa79422950de520a834665de377db1f8b02a05ad3a0b9f83db69a3c2137923dd5dc3a2e657c562fe76114b19793ccd1b08447c5d0ac7ffc1ffbb0928adc09cf607e5cfdc0a283fc74c533dcceb1245e792607d5d0b99a66e20f01d418c44ce00269317b72d9baf1938cb79aebc391af66970c2e53a1392b571cc207b42fc31288b9b24e895a8a70fdfc550a3b9f25b9d72aa594b", + "client_registration_state": "b0947a3f7f0a4328e481e848161f8bf1404dfb847918e6c7272a24044a59c001e299e1a4886c445b6f5203d3844abf0496c443d2c95440558bb5495f0f9c0d4d", + "client_login_state": "b0947a3f7f0a4328e481e848161f8bf1404dfb847918e6c7272a24044a59c001e299e1a4886c445b6f5203d3844abf0496c443d2c95440558bb5495f0f9c0d4dbb305806d305d9873e276d32682cb0947a3f7f0a4328e481e848161f8bf1404d03015eca28f64984ce76c9cbbcaefeda6693ecdb1d28f67ea6ef7f12a3b301c87ab7fc69b4e67fe521a315a571efdfc5bf5512c56142e8b0f86f0684745ac28f1934e0017199bb068f5596a3f55d84ea5f306701c5b171290e79db04a1aa429e52e20ee7ba6d1c8dd4591d08e81eecba4e430412e02aaa3e0d856d0c88742db69a7c4c7350bb305806d305d9873e276d32682cb0947a3f7f0a4328e481e848161f8bf1404d", + "server_login_state": "02cde43c3cf9399f4bea81ba296f9f9902502f5c6e6fd5160332039fcf854cded3ecf45cb7b26c86c62cb65d294c79694c61ae1f6f72a8378e7e73710649f01189bd52c4dbb4ac85e0e80de57c88ef1ecbae1df203c1cc5b7bcfb28ab9ab8fa733f91e5a7022885c641a3b573dfae077d3fa4697246af1c03c3f5fe44aaed27416c7ec63228609c6e7a15304b57736b975f8e81f990b31fc4bb40c34d0094ab5060b99a66e20f01d418c44ce00269317b72d9baf1938cb79aebc391af66970c2e53a1392b571cc207b42fc31288b9b24e895a8a70fdfc550a3b9f25b9d72aa594b", + "password_file": "02cde43c3cf9399f4bea81ba296f9f9902502f5c6e6fd5160332039fcf854cded3ecf45cb7b26c86c62cb65d294c79694c14c9845518a1cc1f9e57c6bdc8bdd7a023fdf024b9f04a796620fe40c6ed39e2261296de429ce1424d7b0f502fb64dc4159606e96fc4f60d37651ac3fe5a287f0fb2537d1351afdfcb800c78bf5ba98caebc0de9dbd457d116531642c856696101dbe16446b46c4b085230a0c5829cbdf85132bafae82ab8d400dc83640862fa648178c6a15068b08fa31e350acabf0a7bbbec92b90190034277e49f6b148603", + "export_key": "e90d0c7460e88886b99e5abeeaa947d8edb714a3e2a10773dedcd9fc2f2eb7bb16e7af2abc4f8cd3392bfbd6531d94033a9984b0edfe7ad3b0deeea035a67a2c", + "session_key": "61ae1f6f72a8378e7e73710649f01189bd52c4dbb4ac85e0e80de57c88ef1ecbae1df203c1cc5b7bcfb28ab9ab8fa733f91e5a7022885c641a3b573dfae077d3" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P256_SIGMA_I_P384_P521: &str = r#" +{ + "client_s_pk": "02fe61e5c4a783d5735edbc5f20c51fe2941c367bbe1efcb05722a7c59c8d45403a2d070190636f2a74171951f8cb4cccb", + "client_s_sk": "09d240f146815567ee36736dec84a6ec556a0b89e367e6862c1eab6eda0bb5bcfcab99ce79d33cb8a96c285d54a19a4e", + "client_e_pk": "03a5f66b7f539e3052208937be62abb1870787e9dc8d4e67389ad5a5c857df62dc857c5e14975654e986433165c867a824", + "client_e_sk": "5a93a1b42163046451b62e02379af4d79b2cfcf280bd353a5a54ba30db8373a487964c8b80a83fc97eccc53f3e7a00a9", + "server_s_pk": "0215988745ced3a5670eabb912a9a9ef4932ff65fe6f09c725cc4c9d7075781cc7ff9b96fba508d9ae993df1a3abe14384", + "server_s_sk": "2e9ebb930646f95e958f52245ece24195c31c47aca7e4cda14188d16b2d91ef678c16126169ea5530b78f3dd65d2d114", + "server_e_pk": "0325d68eacfe0e215841f5f006715bc112ecbdd87162ca1f89ce4b8454646576f03bf913c4f99e13a6ceabc5bb4184fc84", + "server_e_sk": "ce19fb7ec31b608fa1ec9adccb86fff500c739d65676c6e9bf73421d49c1858646824a84cdfee351833cf644ce28a0cc", + "fake_sk": "66db5817cb497e7ec9ab57d830e85066bb6f08d2d416ddf40c46c4425e19a2b6af89eacccbec3c8eea3f1e014961a797", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "2fb1f54220661aa3ec02d23a856f28c5ef3d1fba0d81c810ca64bd9ee48aa139", + "oprf_seed": "dc13ddbce04fe74ddc5519381f03fdfbd9691b194a26ad4f566fb8c6064369ef", + "dummy_masking_key": "e140d996558f6202bea6cf49553760ef0791a019ebf13c254d4830d3877fe539", + "masking_nonce": "289ebdf4ecb65ffdaaade141bca9b192c7b28bc8fbb6d0414ca3ad98fb6b14676bd3aa7393d6eb0caf7a3ba02b8dd12ffba0e61f08e9f55e665cefb08f204259", + "envelope_nonce": "1963688043c9f36c48dcc0dcbf105edc46b3045cbe021da41c27b7aed6144932", + "client_nonce": "f27a1d21dcfc6527f28216fdc44812fbec7d97deac50c1ab3978f9d6a916920a", + "server_nonce": "0491bf44cf345a3a8caa76bf09df948120073e510f4946da1a3dd95430a008a7", + "server_sig_rng": "8b2b92c735139bcafb3a35635d8ff109da09f38d073b9b052630702073440619a542ecd1e9077cad83d7933816643a78", + "client_sig_rng": "875d333dc7a4f0748c2570f039bc35dee5e477ad03d63ab4947fa93890425a52be68f4a4721f3289c13da19713dc998b", + "context": "636f6e74657874", + "registration_request": "0325a452587a1581dc9ecc1144de1758e6e413e4d16802b957826a6ca92481847a", + "registration_response": "02d0780819e49a0026565eefc178c8836cb457059292d48d1fc9bb7ba4abbbf3b10215988745ced3a5670eabb912a9a9ef4932ff65fe6f09c725cc4c9d7075781cc7ff9b96fba508d9ae993df1a3abe14384", + "registration_upload": "0287ffcef6739660f29f0d73e4033db6966f1f269f430866a437cec737eb4cd04bf4ecc6a35ee3bd58a2f9ccbb43feadc9d2af247d47913fd2c48a4463d43897486920674c7b25d034dd3febf258c08a5109d240f146815567ee36736dec84a6ec556a0b89e367e6862c1eab6eda0bb5bc74ed3174b31f577919f9847de5f6a5bdb6e0e353d7af83005ed9d9d09f80a371", + "credential_request": "0325a452587a1581dc9ecc1144de1758e6e413e4d16802b957826a6ca92481847a97deac50c1ab3978f9d6a916920a2fb1f54220661aa3ec02d23a856f28c5ef3d02019017436995ffe86660c3d54c37fb553b3a8dae63c16193d28caaf959703557ce11455c0f5cfa4e80f97f1bc6e528be9b8df86f91721bc2fa3830931ce57677dd13", + "credential_response": "02d0780819e49a0026565eefc178c8836cb457059292d48d1fc9bb7ba4abbbf3b1289ebdf4ecb65ffdaaade141bca9b192c7b28bc8fbb6d0414ca3ad98fb6b14674c115a83bedc5c62ea97ca76fa8cb184f2deefd925e5e05476a5dd1b94c4286dc32fa94049dec6e5f6637b9aeab81778271171bb9cfda983182189809d9f696634b2a364ddd4b6fda3728ae11321c2a5c36ec102e50331acf90d02758fc7dcf92f5b77ee3c94c3e8e020cfbb7360d998034a84cdfee351833cf644ce28a0cc0491bf44cf345a3a8caa76bf09df948120070300890a3253ecfc072c0017ed6a970b6dda56c9c9606dcefce4319ac5873f28fbfc6adc5d5018a7b6c8d8f8cfa3bdfc3d7f7ec7a36d8eae5fc2cd43ef1a4cdd3e383134cd662c0839c6f9159815a39d3428eac45de7995dd5173989a3c1f48bb96d09d53534e376686ba1cfff8950f0b9c8ab28b75195b70c5a3a90ce830c643c7c69c335c72f049474197d8635289fe763fda168efb021935c4e11670d5b7946f64c49ecaa7a11ed80d9eb94017ef953f98d9a6c71ddb83c1edbd9f13bad18ef2c3880704a78755450fde584b4c25b48fd4edf5b911a02d694d6b8eae61ab2d71a4b", + "credential_finalization": "0cb11d5231e734ffe9d010532531f1636e6ba9abe1fe4dd230797887d29329c8fb2c6d2038cd44dd39953db9f0116257532a11021c6e817aa05ff800f560b2f4b7a5214201a7e9c29ca1453bc5e15e59a61fe5196e823ab01d08854b6dd7585b51442006bf5cf16949a73f0370581e9bcb612a2cb74eeb1d7011c63e76aea530ec3885a8e1b0d7b73d85ec5b6c9c5fc85f246489a301ebd96b8bdd54adb90e43", + "client_registration_state": "2fb1f54220661aa3ec02d23a856f28c5ef3d1fba0d81c810ca64bd9ee48aa1390325a452587a1581dc9ecc1144de1758e6e413e4d16802b957826a6ca92481847a", + "client_login_state": "2fb1f54220661aa3ec02d23a856f28c5ef3d1fba0d81c810ca64bd9ee48aa1390325a452587a1581dc9ecc1144de1758e6e413e4d16802b957826a6ca92481847a97deac50c1ab3978f9d6a916920a2fb1f54220661aa3ec02d23a856f28c5ef3d02019017436995ffe86660c3d54c37fb553b3a8dae63c16193d28caaf959703557ce11455c0f5cfa4e80f97f1bc6e528be9b8df86f91721bc2fa3830931ce57677dd1300e8338042d04ed20b84af0d6c5e6f2135e4fc6149d334facb9b5c0385080fcecfe3d14c5070591f7730744edf684c868e8c49391b23e2267136f5072a5810bb657897deac50c1ab3978f9d6a916920a2fb1f54220661aa3ec02d23a856f28c5ef3d", + "server_login_state": "0287ffcef6739660f29f0d73e4033db6966f1f269f430866a437cec737eb4cd04bf4ecc6a35ee3bd58a2f9ccbb43feadc910c95d6eaf36c116ae5d3b17b3fdef9ba8005c378705f6ea1fa9afca0eec12b7cb2a4e83ae5130ef022a2850e98887d2e96122109c4abc9eacd33e951557189cba5356789b49025326403e50017169a12854f9a2ae275e9db2320c0d6d5739536bae869d100f4c1397acf62b7ea399ea51442006bf5cf16949a73f0370581e9bcb612a2cb74eeb1d7011c63e76aea530ec3885a8e1b0d7b73d85ec5b6c9c5fc85f246489a301ebd96b8bdd54adb90e43", + "password_file": "0287ffcef6739660f29f0d73e4033db6966f1f269f430866a437cec737eb4cd04bf4ecc6a35ee3bd58a2f9ccbb43feadc9d2af247d47913fd2c48a4463d43897486920674c7b25d034dd3febf258c08a5109d240f146815567ee36736dec84a6ec556a0b89e367e6862c1eab6eda0bb5bc74ed3174b31f577919f9847de5f6a5bdb6e0e353d7af83005ed9d9d09f80a371", + "export_key": "9f7d1d4b1321a7faa6dc7899330150eceeeaa5eb641abd915c855e4b5b78888f", + "session_key": "10c95d6eaf36c116ae5d3b17b3fdef9ba8005c378705f6ea1fa9afca0eec12b7cb2a4e83ae5130ef022a2850e98887d2e96122109c4abc9eacd33e951557189c" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P384_SIGMA_I_P384_P521: &str = r#" +{ + "client_s_pk": "034d438b2223d2e5a00f4d542f5258bbfbf6f1e550798809fa0d277778bf17d049218c97899aacc3b971e7dc30014269d5", + "client_s_sk": "523943ae9916590b18423dcd71788c8418da7d82185bce91e2592153a6b397d633aa57417ddb8737faf20ee3162d6224", + "client_e_pk": "0220ddb200d361939813b56cac9a05f101f87b66c48b2bac05fe6f3790891afa62c3ab97303bdfa81d7c75807c3ad55537", + "client_e_sk": "bcc7b4bdcce356e4dc8ec7a6de911a98dfb518bb2c1452a8c99cd8ca0ffef2b81d5b00a46d02d0825add2c07e4e89a54", + "server_s_pk": "02dba543190725324a66e77d6e26d590827cb570f370b2a31df862c96e36a456b3d82cf454ddba69f57f8ca430c64e5c6f", + "server_s_sk": "0612689921a431290107768cb438c079f99b1510f9a9608e276031a50ba8f05618cca7cfff8d5feb63c41efad3fd1eb0", + "server_e_pk": "02a59072d4f4ae9ec77bb3dc170e1060b27500fb6e612c829bf122cb9448d920497cd962dbb0f29e495e960c026888dd7f", + "server_e_sk": "311f850f0f910f4175c87ad5d00081d88751c56c4a718afc49dcfc7ec8e91c9f20c3998a53df86c540de3a1d5895f6f8", + "fake_sk": "7a2216e0a5eb5e06e05d3f68ee2d91869e10f87f1c5132721f5c6170d559d3b3f7d77ba981c2de63fb5f73f98a51d35c", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "76c6cdc734472f9074fca71b2065d7d17d5e264ad8ce2bf255f616e1cba2301b79e755bf2b5acc8bfe3e99a002d11e5b", + "oprf_seed": "3792b739bc46d897e0f15f73341762e7f82216dcc11d8c674f9af28b04b6d55d6154f118c21e145de901aefbca24328b", + "dummy_masking_key": "39e2e91a82f314e7d8e560bc156d1702b8624927db27fb3238d92c65a2c7b69f20f97dbff5d3ccc17109e44c2156a63d", + "masking_nonce": "77fd0de46567035b67f68928505f3d7a6b1d7812c87408fe7c7c1551898abd7758d58061a840a5ba1a3f30bf30c1fe50f60dd16b1809b7dfb21bfe9ea89325a1", + "envelope_nonce": "4ad218bf81fa03ca3a34a029d994f4d118fa90a799db742918c5f1ed11789a6b", + "client_nonce": "c0a22341913b190818fca9cd1d271f07d54203dcdb88e17b2405531cf003a1f3", + "server_nonce": "16a30ae08b5ee04c4e5cbc5d203ae8a2763ec1eca25ef2ac4394335d721df4e8", + "server_sig_rng": "b209d06cbcde909da565c245203fc98fab0b35b37958ad2fc29774ac337f2e1d56915e8caca9a28c575307edcbc5a7dc", + "client_sig_rng": "9cd056c11abb66e1d397d4a398678e1056d46a5e58ca00b2d757304ed94c8ef2cceb736a3e4301f2bdfc79dda57d6fe4", + "context": "636f6e74657874", + "registration_request": "020c9bbb2632a89dc570cbe3d243dec57a6eaec676ec278098b79a98b1ba5f69d51b9a7abe7e02ce2cc39f2df5a6b9bb41", + "registration_response": "0285261211337ea95c85ebde3aba85ef81a2ddfa4c55626368135b9a0b65f4132942009d809e9c5e5aa62ce0771150364102dba543190725324a66e77d6e26d590827cb570f370b2a31df862c96e36a456b3d82cf454ddba69f57f8ca430c64e5c6f", + "registration_upload": "03b10ee3d228df14135aef3c2546aa6546a60e62ab5357b9fb107db0d9f9b9c557781c00ad427198a1c39ecffcd0d30b21b7a8fb9643d0e638a6f0a3f049f08840c6eed9175fa61c8ba4b89c3b22f7e9b879c7df14631213006e46d33c5cfbe336523943ae9916590b18423dcd71788c8418da7d82185bce91e2592153a6b397d63ab8df65567a2930cc459f25060003ac3512539cb3d220b6cc923fe06659400c5c25231e3359ba0842f488e7f18b1ce8", + "credential_request": "020c9bbb2632a89dc570cbe3d243dec57a6eaec676ec278098b79a98b1ba5f69d51b9a7abe7e02ce2cc39f2df5a6b9bb4103dcdb88e17b2405531cf003a1f376c6cdc734472f9074fca71b2065d7d17d5e0300932baf7a4ef8456e03495b3c183cfaab573dfa3650c233e4659cbf6556b105fe3d0533dd4a164a9f1c73db04825723f318d95f271dcd4ce565077739df1f7ad6a2", + "credential_response": "0285261211337ea95c85ebde3aba85ef81a2ddfa4c55626368135b9a0b65f4132942009d809e9c5e5aa62ce0771150364177fd0de46567035b67f68928505f3d7a6b1d7812c87408fe7c7c1551898abd77076a1d176713c72fca85191b2bac608bd03237fee3f2b88ed5f3e5231a091d4bbd668a9a5d67a4e98396e35ee50aa10ba69327b1a131bfaaebeda95b50b599909290873d718da91feb1550e35f6a7eee88bc8587854c95226cef65c5e73a527ff4e78ea6938b9e9f7e627f43de5b7fd08ccf1579d5136af6bf75805d0a4051aa1a998a53df86c540de3a1d5895f6f816a30ae08b5ee04c4e5cbc5d203ae8a2763e0201a0a1cf3bae1af113d7c465add74d1126c2e3d80df90d69198e647ff6ec197d7157060b0969bdacaa98f6dd91eafa6c44be47a91d211333dd935cacddd6c0f4f03f07e2b0d1cb401698e05f5343c3a63c1093f77c23f2fba5e47ce7d802d9cd19ad613314ca4ccdfd92739a1c23dd6a776c6d4e0afb79e7039a61ee40b8c95010c79edb13a50e61a6d27b4b2a12c49fcd28bc14c43b1caaaaaa61367c53b24272287a4fcd963327be4ac75db72a12db6ed1a58a59caeba79f011a90210de0203e3f612f89be6235fa76aa7cf2683ba132d7b3ec8e50b3f65559952d6f4e989cd7c8", + "credential_finalization": "138beca9418b6074ea313a4eb4548e34239fadb5be6f6011fe63a26c755dce6b287bcd57802c517764176524a95eb130c2021ef3f729658a85f14a2dc42faf64b0e92b5cb3e60e53951353b70e7fc1a2da054688a8dff45f8915cc996579976c63f78fda39d120e5ae630cbebb693980ec5a8a029d945138f89dbaf9e0a25c66a2899dac2aca7a6f6d5ad42aa95677fb5204a6a2298bdbedfd1401787eac9779", + "client_registration_state": "76c6cdc734472f9074fca71b2065d7d17d5e264ad8ce2bf255f616e1cba2301b79e755bf2b5acc8bfe3e99a002d11e5b020c9bbb2632a89dc570cbe3d243dec57a6eaec676ec278098b79a98b1ba5f69d51b9a7abe7e02ce2cc39f2df5a6b9bb41", + "client_login_state": "76c6cdc734472f9074fca71b2065d7d17d5e264ad8ce2bf255f616e1cba2301b79e755bf2b5acc8bfe3e99a002d11e5b020c9bbb2632a89dc570cbe3d243dec57a6eaec676ec278098b79a98b1ba5f69d51b9a7abe7e02ce2cc39f2df5a6b9bb4103dcdb88e17b2405531cf003a1f376c6cdc734472f9074fca71b2065d7d17d5e0300932baf7a4ef8456e03495b3c183cfaab573dfa3650c233e4659cbf6556b105fe3d0533dd4a164a9f1c73db04825723f318d95f271dcd4ce565077739df1f7ad6a200bb357cd6ec86b2a56a699aff8816a436c5f036fe1addeded7f9da4b5dd7c162f849156eebc5dd64a064a0661e7980e1ab76646f1c20981634b7dd5dbb855be786a03dcdb88e17b2405531cf003a1f376c6cdc734472f9074fca71b2065d7d17d5e", + "server_login_state": "03b10ee3d228df14135aef3c2546aa6546a60e62ab5357b9fb107db0d9f9b9c557781c00ad427198a1c39ecffcd0d30b21de33fe86e0e75406ecbdfdcf9745e6de17cedaf1c0258e701b10695bea0904e6e77a356da98324d6629717a1506d4295ff6248bc974db48304c58899b2a28d20ef510b710d57c32d06723d7e941a4af750bc221b8a87b73326bdcbbbf635342ddeaf4d83a03df210596aef2efbe9c47f63f78fda39d120e5ae630cbebb693980ec5a8a029d945138f89dbaf9e0a25c66a2899dac2aca7a6f6d5ad42aa95677fb5204a6a2298bdbedfd1401787eac9779", + "password_file": "03b10ee3d228df14135aef3c2546aa6546a60e62ab5357b9fb107db0d9f9b9c557781c00ad427198a1c39ecffcd0d30b21b7a8fb9643d0e638a6f0a3f049f08840c6eed9175fa61c8ba4b89c3b22f7e9b879c7df14631213006e46d33c5cfbe336523943ae9916590b18423dcd71788c8418da7d82185bce91e2592153a6b397d63ab8df65567a2930cc459f25060003ac3512539cb3d220b6cc923fe06659400c5c25231e3359ba0842f488e7f18b1ce8", + "export_key": "146220d4da8da989f3b6daaa068b1bbce0a546fb77711c47bfd9694ef854bbdc5ef7b83ec40a4170570c2868fb99822b", + "session_key": "de33fe86e0e75406ecbdfdcf9745e6de17cedaf1c0258e701b10695bea0904e6e77a356da98324d6629717a1506d4295ff6248bc974db48304c58899b2a28d20" +} +"#; +#[cfg(feature = "ecdsa")] +pub static TEST_VECTOR_P521_SIGMA_I_P384_P521: &str = r#" +{ + "client_s_pk": "03421da5451285950cf4bb000381c920ea9e9ecfb27bfdfcbfb1bcaf0bb3c775a7b422d6eaf678b239d31278e9df6fc229", + "client_s_sk": "e4c0bd9e8fc9280ce64c69c5a432e57ab4d2f6692d880bcdb35fa9ee9e3ab6ac5eeb3aa07232e10c3b2562d816f8d86b", + "client_e_pk": "03ffa75fd8ae9fcef3ef9b70b00e5a1fe7ed09ecc6317b9ebfecd8dc618a91c899f65ae8901cbfcb520b4c380abd24d68f", + "client_e_sk": "d3189ff8b5c264853603e3aa4ddc7b6e997561d60c9baede62fc2bca3490ec4be25a68f938be6fa59106d125815261ac", + "server_s_pk": "02863ccb8376c7070839f28f12801d20d6fb72b2454be2cedfcdd5cbf26a89fadf9a8ea10d507c9b9d5de11704dbbd1c8c", + "server_s_sk": "c4e00149225253ae5d1e595d2c7d04baae8621d625416ae64bc767f56a0dca07ba691cb3c1e07dfa217fed5769970d26", + "server_e_pk": "025be71825f86b768b402faa4815bc3fa74138a4da69b117e090feb0249cb928e637996fac3cdc2af7575a065f032db90a", + "server_e_sk": "388df49a3a991db31de0aa073ad3b3045cbed4538414452813e84d4f7a164a7ac1c14569d2b4640a0cc06ae8aaabfb81", + "fake_sk": "adf02fb8529074f96c64100efa9b0bbd07604226f8f4beb821276c8843988f06395aadbfb136c845acef4af7fdd51ea1", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00e17199bd36347c7bbff7785cc3d7ac448445c8ea076781ee1eb22d2071e5705cf58987b4f12c2478e16f74967a55c6c44e693b10fec5db68394850948696f89593", + "oprf_seed": "92dfa84b836ece803943a4135e2d317b427ea4af3220d9762986a99fb51c0dc0a7d4eade0cf8e68f1d9d32a944153f164ec0ebc409a037ac17fcfcf004612dbf", + "dummy_masking_key": "3c20a6d3462cff4bf7001e4cb7c17c0ca136b068602fab885b3112e7f52f9cdfc8948824d1aee61af85fbe392695d5f126008a2b67b60c4ecd054e5a5a795620", + "masking_nonce": "b29746e6228a729e67ffd8e0ffacff09d021fbd5d9383a1d8b741464bf2e940ce15c663648d2d21ebd86ced5e5d045d12d80eb2f28d5c998be89660238f863b4", + "envelope_nonce": "66ee0665ac43fccff0cd6ee0554a790c5e4c2bf770a2122a1814d043702c1c1c", + "client_nonce": "409af4e00d4b2903b331d08db80497c06c5ad3c560e645023bd04d862b089cc9", + "server_nonce": "e50a5dc07ece679ca08388af35c604d52c5fde12571c18973345a9c4332d4e84", + "server_sig_rng": "70647fe9a7ca9caa220a7c6c4f1fe58ab265a554af87e81ffad66838814674c573f12bbafd17f20fd856e46395017fbb", + "client_sig_rng": "71d85a9180470f41724a5f2a288cf3ba53f2c9956d4dd2a26022b46abdcda5d40da2678c714bae91d452201bdb2649fc", + "context": "636f6e74657874", + "registration_request": "02005de5740fd87cb7fb369df3ec11375368565b1f5f86c14f0f5f6f1ebd2c7bce55922beaa5c4bfe868fde04ca411eb6cb479b3389e904d6af69d3a294e763136c8c7", + "registration_response": "02017291d1eb3f7bfa4972071c2d9d3aa8d205a12588c1aa5d526bdcadf285e385531027b0a41914b44151faffe4930e7f68946d169838331c574904f14d363ec5d50202863ccb8376c7070839f28f12801d20d6fb72b2454be2cedfcdd5cbf26a89fadf9a8ea10d507c9b9d5de11704dbbd1c8c", + "registration_upload": "0204d26f4a27a8a5f86968caadf45c56e6c9b593b4baabcd8595df9d972e016b47a1fe45f1b4895276b9c5a64773a52390fcb672104b93e4dfb6aece7d024f5c70c07675f9591fa113e08194399a7294fbc61a519fb656f861e5268d77dd13a6a9e238f0c3520de72128076f9c0e687652e4c0bd9e8fc9280ce64c69c5a432e57ab4d2f6692d880bcdb35fa9ee9e3ab6ac356e1446940d9d193a122b882dd41ab4714b5b974fdbaf495840ed81f6dce7e4418bf20bfe06077a31d8b29bc3bc9847e1a75f90b4c2fc0d120ef737a102cc96", + "credential_request": "02005de5740fd87cb7fb369df3ec11375368565b1f5f86c14f0f5f6f1ebd2c7bce55922beaa5c4bfe868fde04ca411eb6cb479b3389e904d6af69d3a294e763136c8c7d3c560e645023bd04d862b089cc900e17199bd36347c7bbff7785cc3d7ac448402004a348c0ce0bbf40821f4c1039bd3733b1010191fb6a928ca6233e24414c1fac9160ea75e738da1930351611e1c37ac2e3afb08e23b3e7f14885456a761823f9819", + "credential_response": "02017291d1eb3f7bfa4972071c2d9d3aa8d205a12588c1aa5d526bdcadf285e385531027b0a41914b44151faffe4930e7f68946d169838331c574904f14d363ec5d502b29746e6228a729e67ffd8e0ffacff09d021fbd5d9383a1d8b741464bf2e940ccd8562c525b920ad5dacf07d11d26eb4cfa7f9d0812ee7e7a4f3aa6a5445d1649787f53064737bf5ab1f01490fb598b481557ce197ca30e23f3bb3ad6638e2fab29ff34eddc4697ea7910bcd1e0e2866c6c3db07b9776ec59d4127e7fef41ccdbd12e8c4e52719f65fdd48d0c55708e46c463efb2c75690b3a30a8e8ef250213a4360a9787aa0b734571557638581a37f54569d2b4640a0cc06ae8aaabfb81e50a5dc07ece679ca08388af35c604d52c5f03017b5ba0715c22980c63b3686e8bebef93216c071c5f0cb78986b997ee447f9d482648da1d9287f21425df68402ef41aca1f58ee053f75b8908657ac02c9a27e2324002c8cd0554e7513f6905ff90638f46a955f93726d58d4f6800e5b15fa9ae5ffd8a823a266c4068f06c54048c647f60323097b11b231e2a7bee8fe806b150c9bb262ce16551a202e814573b0f6ea3d596715b2e8be0b5329cf7e1f9228c0d15fb5325dbde5b0345c233119129a255bb56c749607f976c4990f0aa5a06885ea14101f634540f0d5b91633b65c0871bde7ebc40795f995cc3d60f5bed154078299", + "credential_finalization": "ecdb622d29dd0e82bc8fdd3464e3baa01168d2deb5aadf44f5ce793aded310d6ab9d91c9095ba8e71ab3b00751eee7d109acfb3f8a5337c882136f98d876e6a4d86162c1e0057a5755fa99d36feee3127b6c752d462889613334bdd80a0c78831368071b88eebb1ab1e4107ad4d74b657dd43e6f874fb3c6288c084f893bee80ebb7ca73df41674fb559acbdb605ccedd6ba011e4c91bbdab8f80d11db9aacb9", + "client_registration_state": "00e17199bd36347c7bbff7785cc3d7ac448445c8ea076781ee1eb22d2071e5705cf58987b4f12c2478e16f74967a55c6c44e693b10fec5db68394850948696f8959302005de5740fd87cb7fb369df3ec11375368565b1f5f86c14f0f5f6f1ebd2c7bce55922beaa5c4bfe868fde04ca411eb6cb479b3389e904d6af69d3a294e763136c8c7", + "client_login_state": "00e17199bd36347c7bbff7785cc3d7ac448445c8ea076781ee1eb22d2071e5705cf58987b4f12c2478e16f74967a55c6c44e693b10fec5db68394850948696f8959302005de5740fd87cb7fb369df3ec11375368565b1f5f86c14f0f5f6f1ebd2c7bce55922beaa5c4bfe868fde04ca411eb6cb479b3389e904d6af69d3a294e763136c8c7d3c560e645023bd04d862b089cc900e17199bd36347c7bbff7785cc3d7ac448402004a348c0ce0bbf40821f4c1039bd3733b1010191fb6a928ca6233e24414c1fac9160ea75e738da1930351611e1c37ac2e3afb08e23b3e7f14885456a761823f981900cdced1ce66a04be5067e75e2d1f9018e2034d6b2009a08b5051f2cfd33b57862e519379ddb46f2795412c645dda5bf6e8565bfca4308efb39a94fbb4ba514e73ccd3c560e645023bd04d862b089cc900e17199bd36347c7bbff7785cc3d7ac4484", + "server_login_state": "0204d26f4a27a8a5f86968caadf45c56e6c9b593b4baabcd8595df9d972e016b47a1fe45f1b4895276b9c5a64773a52390b0d9c0160f117dc8c700cce8f6a5a6fab05a00e419ceb305d8ae9e87ba86e59d6b323bd784c973620bc9923e7000ce17e2884ad2ec45efebb32a8dcdde80a3959c342d922dfcdcb2ea9b1c33f1c9768e478499c87b58038d622045c0fc895d47aa8ec541eea4f6ac6a1a77b851a723241368071b88eebb1ab1e4107ad4d74b657dd43e6f874fb3c6288c084f893bee80ebb7ca73df41674fb559acbdb605ccedd6ba011e4c91bbdab8f80d11db9aacb9", + "password_file": "0204d26f4a27a8a5f86968caadf45c56e6c9b593b4baabcd8595df9d972e016b47a1fe45f1b4895276b9c5a64773a52390fcb672104b93e4dfb6aece7d024f5c70c07675f9591fa113e08194399a7294fbc61a519fb656f861e5268d77dd13a6a9e238f0c3520de72128076f9c0e687652e4c0bd9e8fc9280ce64c69c5a432e57ab4d2f6692d880bcdb35fa9ee9e3ab6ac356e1446940d9d193a122b882dd41ab4714b5b974fdbaf495840ed81f6dce7e4418bf20bfe06077a31d8b29bc3bc9847e1a75f90b4c2fc0d120ef737a102cc96", + "export_key": "a082dd4e71b442df38c5ed675745791959ed3cc02531583c39caa624df7eda277c5b3c7ece19642ff88976d091067ba974bf52a932091426422e1c09417cab10", + "session_key": "b0d9c0160f117dc8c700cce8f6a5a6fab05a00e419ceb305d8ae9e87ba86e59d6b323bd784c973620bc9923e7000ce17e2884ad2ec45efebb32a8dcdde80a395" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_P384_CURVE25519: &str = r#" +{ + "client_s_pk": "02313d20e6e932f9540be62d2555b653f8e837f3344da2801f1a72ae73c86ca860f05d277bad43295cb7c6d2b3161f22f6", + "client_s_sk": "8304e45ccce8829de773607df92dee257b7824048b3c0f8440c25a703ac5f5ff85a9b06b058b2022ec02fc4de4908e17", + "client_e_pk": "039547d67d08647947eefe3b3ec18d0c29e7012968dda87f158c88aaecc86820b4390d5a41994fe2e2da9c6714baf822e5", + "client_e_sk": "807f175096d20d4df376267f4a6776390a5cf2759ff6b90f59b418901d6329a4eb00f2b1aad4e1cabb9c6383f232926e", + "server_s_pk": "02d6a31f776888f859ce584c3b4fad49979c80da6ebcfb4b9b6c857c5c9b1093e667f86dd189b3b2b96873bd44c7a45b6d", + "server_s_sk": "3abdfd331fe8012c5b4a2469badc175483f756085593cbaa0effe77137b7d191fb9dfa03538ec1bb1c4b42071cbeb56e", + "server_e_pk": "02e18a93833d736112c512ba1c4e2cfdffe0e31839a70096a4e7e6fefd1d80719d4615c79d65de2bdf1b6ebb51b9ea81da", + "server_e_sk": "ec8ec0642934d5b25bcbbabf34f7834827cc3362bb9555f179555e59cd1abf1750eec8ed5b7e32f67e23c9a340593dfe", + "fake_sk": "d698694066f8e1cdd865c58504145e30864417fdd870ede28d4138deb1ef2fc6bcf1f7692494f5b03eb52640151ccb39", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "14e4c57880d29f5f9ba60cb0b73730e02e4b9a542cb9da598272147273e26e0b", + "oprf_seed": "d593c368b2ba9a655b4e33dc10e1f074f4a80bdccdd108e36ccd74b8f6f5a3d05127ab50c41b312e372ed478ff51a3fe83c96b5e3074560d24f2ae9d5eef0086", + "dummy_masking_key": "1f37d87b070d59d197c62108eabcabbc2998d8f1daf81d141929f4e5d1de4190ece77b4e17a576b02d72cf7ac5211bf0f11911a3939d4da17c59a61af5101125", + "masking_nonce": "af7ba9628a3c113074e0e237195633c8dd333be0588d35e8403735cd3a54ec855e5e659242c0631df95724f06a29c053c5aac545facfbc4529e32899b8674b8d", + "envelope_nonce": "84dd2ec7aab4dfe2417ab40feaadb1c54a709901e8529f692d10c7030f8d75ff", + "client_nonce": "924613a592971e961ff748f7203fecfbc8544c1d255308f650937d03b733c38a", + "server_nonce": "f072aa8d1dd06f4d5518ad6933cc1e86aafc51e9bcc1370197f787af82fb2923", + "server_sig_rng": "af0f89dee04da95392cfcfd0b0129c4447d2fee6ac7885f46dc98ae91605b2da7bf4c303aca1253e7c45022f2a7cc4b1", + "client_sig_rng": "6dada901829af4338b2bf936a3aaab66237f4228ab4f0c799f0929f2e4c685390c88146ea86f65e8e11656583fa1a716", + "context": "636f6e74657874", + "registration_request": "0039fafe61e53d9bce42dabe427cd0eee1c5362c30ca03cb12a7f7e33f62c159", + "registration_response": "7ad887e6b362db254e39c9132d5cad50f269451e5930fd742bb57ed1db57671302d6a31f776888f859ce584c3b4fad49979c80da6ebcfb4b9b6c857c5c9b1093e667f86dd189b3b2b96873bd44c7a45b6d", + "registration_upload": "0349dd17cb505cb311d8555d52a9f644386d74a18bb7601efdb7680819ca0d912f69d97582bce9963408baa416296fb9a7a3f79b917c1bd6743dea57fe3f6f90c455877ebaf10807f43929da439f40a14b6b94999a86f8c66f37367daf73ff6e61e46ce8de07f1851a75e4a44b67258e528304e45ccce8829de773607df92dee257b7824048b3c0f8440c25a703ac5f5ff7524e659125bc905edd099119a6f7de87c30dccb22d9ff4bf72a9a754967fc5f9e0452b9f3ceb8522f32043264ca32d4bb8f9505337e1e7e71f9c744006c6882", + "credential_request": "0039fafe61e53d9bce42dabe427cd0eee1c5362c30ca03cb12a7f7e33f62c159eb00f2b1aad4e1cabb9c6383f232926e924613a592971e961ff748f7203fecfbe752da5a150c09fc93778ac57dda053c772e064fea08df291b5f9866ea920900", + "credential_response": "7ad887e6b362db254e39c9132d5cad50f269451e5930fd742bb57ed1db576713af7ba9628a3c113074e0e237195633c8dd333be0588d35e8403735cd3a54ec85a34e00c481d103c601fac8b32f42192702e9704aac497a7b20729924fda886421be83603411915144e5355cde3a3c8b236be42df3c19e43e9d7c48b613980765417f7b68d2d97568d2ba68371664a9f46ed877d937dac4b9806f6479b925b3c4699a288f561e9124079ee41666f6ffd7ee109ae56cf555e0970d64c2d3855f154760baa834b4ca10ef8b066c016c32da2bec8ec0642934d5b25bcbbabf34f7834827cc3362bb9555f179555e59cd1abf17dabea104b17d93e8a87de411c31bcfebdfb52cf3856d4953ae2c310f1fae1930a1c2f503a66f7e81523927c6ce1e3d393b1030191a748ba2e405144ca47a5336e7fd64d88940d6910240d4da09749a598cfb7f13735c07238d5a398cf293bd63019a75a72ca79ffc593cd0a357377c4b96c908e1579fee8b3cd314a1f173f9bf9912efe71251eb6bbd1092703efd0738c3c8c0b3e66fe9e6858cdb5e7c8ba3a955a90103541271fd7f245843b88d5221854f114808e898a0efc1740215179c76", + "credential_finalization": "9c1115599ef6dc2dcab0f74568f4f955dedf6a5706ad5fae2e307a937e4605688dc8f783f68c14037692a96a34a0536aecd5755433e1774ce3f7beec9a7a768f154ad400ef230095ee1978295fc11640650afe0cf13eaba9fea69481bcb66817199e24cb4d24f4298c09eed58a4f5e9fd02403e3f97a152f299bb9d989a026d09765b46432e69f2dd97cca1dfe3e3258f6e035f8d28c15e248741e98068bc919", + "client_registration_state": "14e4c57880d29f5f9ba60cb0b73730e02e4b9a542cb9da598272147273e26e0b0039fafe61e53d9bce42dabe427cd0eee1c5362c30ca03cb12a7f7e33f62c159", + "client_login_state": "14e4c57880d29f5f9ba60cb0b73730e02e4b9a542cb9da598272147273e26e0b0039fafe61e53d9bce42dabe427cd0eee1c5362c30ca03cb12a7f7e33f62c159eb00f2b1aad4e1cabb9c6383f232926e924613a592971e961ff748f7203fecfbe752da5a150c09fc93778ac57dda053c772e064fea08df291b5f9866ea920900807f175096d20d4df376267f4a6776390a5cf2759ff6b90f59b418901d632964eb00f2b1aad4e1cabb9c6383f232926e924613a592971e961ff748f7203fecfb", + "server_login_state": "0349dd17cb505cb311d8555d52a9f644386d74a18bb7601efdb7680819ca0d912f69d97582bce9963408baa416296fb9a70d9c8a9ab8ee1fb8844a083cd0110d7398d125782211fb76853aecf733f45991b2fac0fed0ccbf7a16dcc52db98886208ad9d434e0cb71e9e784cde418e2dc7df8ab718bb2d5ecae3f41644d5fc28610779709c3dfb23ed8be8bd72077f7780392a24956ab25d80af5587f68854628d0199e24cb4d24f4298c09eed58a4f5e9fd02403e3f97a152f299bb9d989a026d09765b46432e69f2dd97cca1dfe3e3258f6e035f8d28c15e248741e98068bc919", + "password_file": "0349dd17cb505cb311d8555d52a9f644386d74a18bb7601efdb7680819ca0d912f69d97582bce9963408baa416296fb9a7a3f79b917c1bd6743dea57fe3f6f90c455877ebaf10807f43929da439f40a14b6b94999a86f8c66f37367daf73ff6e61e46ce8de07f1851a75e4a44b67258e528304e45ccce8829de773607df92dee257b7824048b3c0f8440c25a703ac5f5ff7524e659125bc905edd099119a6f7de87c30dccb22d9ff4bf72a9a754967fc5f9e0452b9f3ceb8522f32043264ca32d4bb8f9505337e1e7e71f9c744006c6882", + "export_key": "b10aa514819d114825cd67bf34555c1e3f4ffe3b3c88e44fa71a82375b2fcaeb971b8ad2cdc0151a0c7f012b4915ba00138eda127ea43fdad9846f132f1d66c8", + "session_key": "0d9c8a9ab8ee1fb8844a083cd0110d7398d125782211fb76853aecf733f45991b2fac0fed0ccbf7a16dcc52db98886208ad9d434e0cb71e9e784cde418e2dc7d" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P256_SIGMA_I_P384_CURVE25519: &str = r#" +{ + "client_s_pk": "02930a0fddb41d9bb4779de43c018f525b9bc91bfdcc500d6e8658d95601967989e4856529a864d5cc52be14a11e64ba77", + "client_s_sk": "364bfcc128b34e621756ca96f5677187cbafb529dd1991e94c728b8c2dea918dcc24e0aa1539c04cb7d76ed6a041f62b", + "client_e_pk": "03922cc4e23c8163079422fe847d96e7f14e872ccb463d05e73804ddb21ec30eef9c63fc09046bd9bb3bffb451595c9e25", + "client_e_sk": "d86eef5a348a3aca26b0c4f2c1a558ca9a9d122cd0242c80ac6e3f87e11daf2e75730cfe9c0814f7a74e34865cc1a3a1", + "server_s_pk": "03795cfa9e55a18dc5881301c908cfbc5a4e093a50edd4fc9724f3198681f89bfbc4efc78cb81291b6b4461bb1d864bd8d", + "server_s_sk": "02f25c2c81416b452daff8cd751479bc1912e65945fd91fa35263885738e233f701dcd6a5b6bf305132631274bebb863", + "server_e_pk": "03662967b94af554485091da211d58ffa3244bfd95453dfc1ed1d883cf92bd140a84df4e6376457f35df83ed4fc865cad2", + "server_e_sk": "8fb691c257449aac6629cd235bed672c1072fc8ce85f842510ad01af97086131029a1d3b729a71ae921eb3e074acbbed", + "fake_sk": "1eeb6d7f3606c62368d0e5857e3155137b9f7ff44830d490337f6ca1efcc065ade0c9d6e41a779c0ac67ec726ddf8f77", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "7130377650f8028f9076fdc19d7aad43db4a07eb414890001c010593aeaa586e", + "oprf_seed": "a6246227366b70de34d8c7cc3fcc45a31d085866538d02444919f9e57942f293", + "dummy_masking_key": "6859d3f3143bd0f6461240561a8f392588aab9d1967854fb2238a9c255ff27ae", + "masking_nonce": "7b9f58b9781bf7a1f3436e8dbf3ba1fcf74607cf05b56abb8a1f6c0338c667708f45390d85e3852cd1ff89f376c2654d362055fa70d0cfb26fc0dab1b0c1ee6e", + "envelope_nonce": "316a6b223652e8dc36e50490b1998364bec9a6aef245681e286e20bd32ced48a", + "client_nonce": "0a5c4814035215ffc6975cd26c6274954ab6cdf641559cadc787245efbc0cce1", + "server_nonce": "4b0bd1e452a8b4d92506608192f53ca7128351e69a42c3e39bd52b9bf9b271a5", + "server_sig_rng": "6c4b25eeeb5e55d346575a98dccb9dcda1a2760ebef5d4f9c369ab71e959dc7f1b1bdd9775f18c1ab8a3e4e21498b270", + "client_sig_rng": "9b9ab93f89ce6df4020066d34f74d9068b30a182b7e18bae54d7161af1e6cb3fc1ec0eadc285873636bf53bb3d1c55af", + "context": "636f6e74657874", + "registration_request": "03ec8ef68e65cadb1c1ea1743a18267601f086c138fc5e9af65d9850b466dfbb83", + "registration_response": "03f6e0e141c66d5c240e1b0bfdc9502fc66d92832b74d6a5eb5ae37a6d389d064103795cfa9e55a18dc5881301c908cfbc5a4e093a50edd4fc9724f3198681f89bfbc4efc78cb81291b6b4461bb1d864bd8d", + "registration_upload": "03bc7774080cf458bea3b6ab062300b7730af8647dca567d7c4af147aa632eba71574d713beb81e43e66133fd14ae0853a0119ecfb4410a4c00baf04543b9e7429e44e5cdc7d607d1f1bd519a0f0974b69364bfcc128b34e621756ca96f5677187cbafb529dd1991e94c728b8c2dea918d7e95a1d819831c775f424833cc151dd463246470d9481496b659cca89ee89eab", + "credential_request": "03ec8ef68e65cadb1c1ea1743a18267601f086c138fc5e9af65d9850b466dfbb8375730cfe9c0814f7a74e34865cc1a3a10a5c4814035215ffc6975cd26c62749529da79e7e1f2e15320271bce0be581086171382cb9280efa0da24ff5599d156b", + "credential_response": "03f6e0e141c66d5c240e1b0bfdc9502fc66d92832b74d6a5eb5ae37a6d389d06417b9f58b9781bf7a1f3436e8dbf3ba1fcf74607cf05b56abb8a1f6c0338c66770d82e1b84dc579ef7994c239135e714f1f3764548214963ba747a03faf532b27fbd3411b9fd9955df4a18cf06c2c46a571cd7853607b7d39122b7413bb9204d35d4e350a5ac9ed3d28165a585ee79895baf528adf7500fd9daf6afc5b8d734018fce8f4e2b4f61d724c067db8a0471b08b08fb691c257449aac6629cd235bed672c1072fc8ce85f842510ad01af9708613108c4edb219b2ee84cbab7e783c84580a0c37fa87b24b96cbe014607e54f2ec300f7098d7c4c88c950e009005790edba94ca2469ccc43216ba665ca07da06eba04b241b5e304140bb40fa351b52c22a9daa93c1da4a0b2dba0b9f745e752bd9889aeed0cb8fdb89c28f9abb46c0b6698bc6388367007d58127717b936bcbb69e4968e6fc81a43a85cdaab782b29b9b46894ac8abd51652f8b1d7e8feaa4e9b8dd201d4d65c5a2fa71e5e8271e9af6a81533d325a4d3f70e1594cca6a09e93a74b", + "credential_finalization": "7e9e41ffc641e9453a4fd6ec04fa2c83c69f3ea73e22be85394e1251fae85d2730ee4315f6bca9b5e885f64cd9c794251293cfa9e3b0d1a7d7f075b1f6a2910f554ce0da44f6981f0664123f2db097db82ddf0f46850f56cf493de3596e1cb80a21d8dfda8b27b1789a6322d6b4caa00aad32e4d58b76d89de98c6cf0d976cf7e1c14940364c46ba46170e8ebecfdafff4dc43cb76eb11645cae8d13367921cb", + "client_registration_state": "7130377650f8028f9076fdc19d7aad43db4a07eb414890001c010593aeaa586e03ec8ef68e65cadb1c1ea1743a18267601f086c138fc5e9af65d9850b466dfbb83", + "client_login_state": "7130377650f8028f9076fdc19d7aad43db4a07eb414890001c010593aeaa586e03ec8ef68e65cadb1c1ea1743a18267601f086c138fc5e9af65d9850b466dfbb8375730cfe9c0814f7a74e34865cc1a3a10a5c4814035215ffc6975cd26c62749529da79e7e1f2e15320271bce0be581086171382cb9280efa0da24ff5599d156bd86eef5a348a3aca26b0c4f2c1a558ca9a9d122cd0242c80ac6e3f87e11daf6e75730cfe9c0814f7a74e34865cc1a3a10a5c4814035215ffc6975cd26c627495", + "server_login_state": "03bc7774080cf458bea3b6ab062300b7730af8647dca567d7c4af147aa632eba71574d713beb81e43e66133fd14ae0853aa2f994b7a23e72d1b839fe154c001596c7777f165584ff9252d09b1119f614849cb6e8c4e7a7b0f0b3314496b88b22a1577d10901d808a0df79605fedabc15e4d3af4e9b56f49f1d873506bde3c83bae15f2624a7543c10b3b960674adc16cce68b295bb920496c9983dfd5500a27912a21d8dfda8b27b1789a6322d6b4caa00aad32e4d58b76d89de98c6cf0d976cf7e1c14940364c46ba46170e8ebecfdafff4dc43cb76eb11645cae8d13367921cb", + "password_file": "03bc7774080cf458bea3b6ab062300b7730af8647dca567d7c4af147aa632eba71574d713beb81e43e66133fd14ae0853a0119ecfb4410a4c00baf04543b9e7429e44e5cdc7d607d1f1bd519a0f0974b69364bfcc128b34e621756ca96f5677187cbafb529dd1991e94c728b8c2dea918d7e95a1d819831c775f424833cc151dd463246470d9481496b659cca89ee89eab", + "export_key": "1cb0b223a31c5cbf127635e1277df8a41daa2406d8876637edc006a82c8fa998", + "session_key": "a2f994b7a23e72d1b839fe154c001596c7777f165584ff9252d09b1119f614849cb6e8c4e7a7b0f0b3314496b88b22a1577d10901d808a0df79605fedabc15e4" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P384_SIGMA_I_P384_CURVE25519: &str = r#" +{ + "client_s_pk": "02bc2886a71493257ceb79ef7763a8fc99fa8956b059d2f830dfea2e815ed71e606d63ac4035af417104e399599d3bc7ae", + "client_s_sk": "6e9ab0630d777f88c7990074ec9b0880ad7de3fdad5bd85656e7fb7f29a41f61d07e9093e4d778ae4686ec4af914a7b4", + "client_e_pk": "036bb96a6ce4ac743f38074e021c2c4d22227c37fd512dab8775c340ac64a29d2006fe91f7dfb4020b40b0036207170353", + "client_e_sk": "53bf0203cf5c47e7b3c1889e6f1ec11ca47201f9c31b079487458fee872ad5a8eb8dfa2b8dffe4721c622fd17d5d7f87", + "server_s_pk": "0313e8b7ae64f7c002e2a39311284e18acb6eec92b436d1160c4841bc43369418efca632de5a101877e6b600f5c834efa2", + "server_s_sk": "c982eb137deb8a9398885f0fd8639bd7b5a9aa32a3170505118f78ceffd2e27f5dc9817e64c882a34ded402464d042a7", + "server_e_pk": "02b72bd6713c7773cee6ca8c5885116d864af1827bb7abd689f785677d1e3b6df8a2cd31d0d2514781963d75bb64a4aa0b", + "server_e_sk": "e6f4b060d46b57e98aa9e3ed60c8f05a6c2514c98ce57422d47ccaacf164299b576731e145c5983a821f645184ab0b0a", + "fake_sk": "8563c58ba9868127c0bcdaae9d6a1949115bc11fc740298695bd268ee0a573ae5d4e22fe9173d52be4a5d36466c778a3", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0ed5f88dfc955806efb6196964f49437d8e9382b092f9ce07309813e204ecc5cfde534641c3825d869c863fd74037b02", + "oprf_seed": "30feac518ee5dc8a411a621b00f64a16b3fc8776f93ea6c5ade3147587c8871270874c53dd77f9006b4224e386a8e4e6", + "dummy_masking_key": "d4e4451e68542bc4385c3ae7f9cf9a2a74609c494f8c8d4268bdaaf0b8b6c73eb31c2b10386c21bd974a496de166ae29", + "masking_nonce": "8790d8c6108d527a953dac60a8df00d950bfeb988902702ce2d16c16cd44f9de10d926c0c3d60c4f70db654c119db356e7dabab779d8b2758958e8f74acda392", + "envelope_nonce": "17768209384d1386dbe5a72bc6d065fd353335b045b7dde57d979db9c1e087c7", + "client_nonce": "d66e6ac215006679bc6b28d2c85c6a69016cea91426f02e025c94f25a0a4bccd", + "server_nonce": "51142191934c08e3c7bd2968915da8ff06be966e8101b8773257309a20253c81", + "server_sig_rng": "c28669ad3a33ba31540bb6d3ff25d812abfb6a71aa81a13ed04bee746718aed657b160f3f8cb10d22d97520482132cb9", + "client_sig_rng": "ce976dcaf31ad1db7676a98516a4ba7187a9296af33c8eadebebf7423abfd4579024d9e50cfe31d0de0b8722dac9cdf7", + "context": "636f6e74657874", + "registration_request": "0354862bf6bc42e8d8374cbddec3a27abe53d897b6b82051189c3e7b486dbfb48226f3e2558d045d3c6eab15af8930193c", + "registration_response": "031b7be4bd45107420bd113c801011b8007010238e7b5001079bcdffe799c28abf992c286ea3b8bb820785654e2e0136020313e8b7ae64f7c002e2a39311284e18acb6eec92b436d1160c4841bc43369418efca632de5a101877e6b600f5c834efa2", + "registration_upload": "027fa74c0da5c5a96602b9ab52b65356c5dd49e495ab55da610164c47db7478a87eb208d25ed9afc6e210b433354faed6bb4df3d4e2ff1c18062804c18db6e96f37bfa3924aee7aaa5507f4128e9bf90edc0f31acc668d63dcfea9ae38b46ef7436e9ab0630d777f88c7990074ec9b0880ad7de3fdad5bd85656e7fb7f29a41f610b787c9c736c9ad4cd762cfc5fe52bc3d73456be20295c1c4f9e1eaf25f4feba20c7aa4927e63c17d937b47472f9946c", + "credential_request": "0354862bf6bc42e8d8374cbddec3a27abe53d897b6b82051189c3e7b486dbfb48226f3e2558d045d3c6eab15af8930193ceb8dfa2b8dffe4721c622fd17d5d7f87d66e6ac215006679bc6b28d2c85c6a69d2de3d70ad4323d69883b37b75c684606b4eb42aada8aa854ad94c41c1d29224", + "credential_response": "031b7be4bd45107420bd113c801011b8007010238e7b5001079bcdffe799c28abf992c286ea3b8bb820785654e2e0136028790d8c6108d527a953dac60a8df00d950bfeb988902702ce2d16c16cd44f9de7e664fb9752b51751e147c6a4cf4509fc165a24949b6e68be3130f7a4c77014861f1b660420539d13679aa98de2627d4e68dd5e84fc62df933805167b745df26512e18a188967357bbb84d3467ee4237647b8e8b01c0d44bd2736c1322b8f5c4e4ec8d18686e08babdb20fc08e2dd1d9b691896f15e1822916262f92c2aac62556e6f4b060d46b57e98aa9e3ed60c8f05a6c2514c98ce57422d47ccaacf164299bb820c25bccd07a8b81c09c964e1e19419e0649d66f27bfe6c2c2ff9cd7c26a3c81f9a0c2c398a44d27dd72eefae01a87334109811628921d0ad556514e10876ece91fd1292b66e84c03e2ac7583cd483b5370227d827b5d8d48e0eaeda537efc7fc613d0e7b57d954efff71daa1b1b3e7ccf46fd6d46d37fecd3aab961721a98478617dcb1406aa95b8336503c257da4f08e445faa555f261c631bf80d12f3729fae71261c52e92e1bb21b9fe4787918f3a922c3705c896e2081c4ed4ef23f74", + "credential_finalization": "cd9796d8521c6303e0cc3c353e17fba0a4e04a6575a5454f2560ada1615e6d09477ad81ff32375ee5b72fd94dcd2ccfbb8fe599f82746fe808d1ff1bb07e45ce5a049921317e7d79ace2036ca48dd4a740f817d8eb539ae29a453d514a210e28235e9d43caad05c34ea745c4f45e1549d4ec09de4890b8399003056e6feb6e9fa8a4f71936dc178f10b83898ace779cd407012c5f84c1486a6c1227658ba2260", + "client_registration_state": "0ed5f88dfc955806efb6196964f49437d8e9382b092f9ce07309813e204ecc5cfde534641c3825d869c863fd74037b020354862bf6bc42e8d8374cbddec3a27abe53d897b6b82051189c3e7b486dbfb48226f3e2558d045d3c6eab15af8930193c", + "client_login_state": "0ed5f88dfc955806efb6196964f49437d8e9382b092f9ce07309813e204ecc5cfde534641c3825d869c863fd74037b020354862bf6bc42e8d8374cbddec3a27abe53d897b6b82051189c3e7b486dbfb48226f3e2558d045d3c6eab15af8930193ceb8dfa2b8dffe4721c622fd17d5d7f87d66e6ac215006679bc6b28d2c85c6a69d2de3d70ad4323d69883b37b75c684606b4eb42aada8aa854ad94c41c1d2922450bf0203cf5c47e7b3c1889e6f1ec11ca47201f9c31b079487458fee872ad568eb8dfa2b8dffe4721c622fd17d5d7f87d66e6ac215006679bc6b28d2c85c6a69", + "server_login_state": "027fa74c0da5c5a96602b9ab52b65356c5dd49e495ab55da610164c47db7478a87eb208d25ed9afc6e210b433354faed6b45281873188b5fc928d53795701e557f56798e468d404928de8197edcef989191d6eddb04a774269c25ba07a1f48a5353097551724c1a8a85654e784b045d8892041899eebe8b7efb8d286047843099dfd5283721450b5c839e3e57979976d4749c864ed201aff9d954e9a35c321fb76235e9d43caad05c34ea745c4f45e1549d4ec09de4890b8399003056e6feb6e9fa8a4f71936dc178f10b83898ace779cd407012c5f84c1486a6c1227658ba2260", + "password_file": "027fa74c0da5c5a96602b9ab52b65356c5dd49e495ab55da610164c47db7478a87eb208d25ed9afc6e210b433354faed6bb4df3d4e2ff1c18062804c18db6e96f37bfa3924aee7aaa5507f4128e9bf90edc0f31acc668d63dcfea9ae38b46ef7436e9ab0630d777f88c7990074ec9b0880ad7de3fdad5bd85656e7fb7f29a41f610b787c9c736c9ad4cd762cfc5fe52bc3d73456be20295c1c4f9e1eaf25f4feba20c7aa4927e63c17d937b47472f9946c", + "export_key": "178f3d663597bc8fd082ffab9fb035d740af1bfbc63de03c79d87089fcb8f052d174d6c48ce78bbb4ba0e6835d3a227d", + "session_key": "45281873188b5fc928d53795701e557f56798e468d404928de8197edcef989191d6eddb04a774269c25ba07a1f48a5353097551724c1a8a85654e784b045d889" +} +"#; +#[cfg(feature = "ecdsa")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P521_SIGMA_I_P384_CURVE25519: &str = r#" +{ + "client_s_pk": "03dd56e4e012963fff232213cb65287dd2d1326e17a820bd31b2d0575747a931cea2d5fd85f690b718c79c3aadddf0d1a8", + "client_s_sk": "567e6dd818bc905d04aa897988541378c50185c420e40a9f99a38c2673fa7dda8b57f8af5a41257db49c064b9b2dc1e1", + "client_e_pk": "03f92bcae35197fb582b79401c231a70010f6bb74b7de131893dd3abc784876f81915c20a11f49454e2c9d7d417ef33287", + "client_e_sk": "88fb5c095e4647060e6e0ddabb630fdb49e326566ebf540b1257cd6f4e032d07f3b018edda8a87194f04a55259bb90c6", + "server_s_pk": "02a75160aeb608f47365a58850eb096ec2222bda7853e743778a79d2f45f8645ef62514dec2541f2191ec3088c0141cff8", + "server_s_sk": "bad76db3cf647a0b4f0a8466d83b5cdeb66963df1d3a29ba44c48ae3f9b18e9191a86d1ab5c7dffe2fcb8ad4debb71c6", + "server_e_pk": "03ef1705e9bfe54bc1d3552ae889dfd6e02c149713d4c57b3ea4a03f4f9f2a0ed40414498adaaf612039716f0ef4219cc4", + "server_e_sk": "547d41e94a59f16abe892c44a10ce3a8ac7b1585eba9a7a633af08632e0c0890ba9b8d04eba43a60ba3e304b5ec01456", + "fake_sk": "8d82d2df5efe67e54c6bedba2d8d1ad2f76ebe1579ad5e3c60f0aa93d5717cff6b959e26cad5a6bff632f04cb3062aca", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00ecb70183d42584747cb58cd0f47a34e8cfb694b277d973007d1daaa83a5ee3211d4544b752afc5a8af07889152a347d83f727ed291d03c471142451a983c4362c6", + "oprf_seed": "8c55359dc9cb9954bb9d7f8285b4ea189473db19c42612f2e7ab7715661e89590c622ee3c9c7f4253788bb68dc9af5c0d6ea458e7f9ecff074f780a8ac923d97", + "dummy_masking_key": "589eb2cd3a6d390385a18c8bd27dc215a182a56d529b2fc63fc4301eeb86bdfe094632bfaf0ffa55440838a376624716a2cd69d43e9e3e2b8990bdba01566544", + "masking_nonce": "de7f69abb7714e36df120a840233a1f177d880f020990730b0b65cf460ef115623c1f9eb99d1360b632d1c24d708492ee145da38144c700edc46e9d165c1c267", + "envelope_nonce": "6426f79c0f41bc106e6a40abe4f4fdcdd650b7f980190641b4a7eb90d17036d2", + "client_nonce": "5956dd66c0ab5f937c358e7f4cd393a992e36a6e0d531b069565e8c3f512153a", + "server_nonce": "24163661c8e254a2773dd6456d0052f6e4bca1d856b881aae1c7c8c916490c42", + "server_sig_rng": "40a41c74eb51b2cc02207f4b0496b4b99833ceefd859b8279043eb9e55503a842fb8dc3732a14cb302fdde892567a012", + "client_sig_rng": "7d5925e4db3d6c0976de764b45968d7679b3b708eb16d0cb8ce2b105d1418ca12b5ec2f86714d38bdb5abc8629c9c4e0", + "context": "636f6e74657874", + "registration_request": "03003754f32635524b1c0be2f7f68462e488b32c7f2a70914a4f2d0b5326f885b622723f09e6d5d388d8f601a316f7fa7d0e8bab2dd909729c242b3ff3c7544ea7481c", + "registration_response": "0300c29ad9df9a2bb901816af734b03d0bba39b0a593395a8d48255ec74a8435b99936c6f7ef59208e2a3887df71d5d949a37a9ed46debd290f9a616932a596df04e7302a75160aeb608f47365a58850eb096ec2222bda7853e743778a79d2f45f8645ef62514dec2541f2191ec3088c0141cff8", + "registration_upload": "02c3e1c0490e0a74c79e3da6f4fef1b494a406a3cc309488f40709951620916e973a00ccdcd524336f712d043bd70c9a1528d65b29be6e3b303b014ee93394e2fcb974277d2600c5f8fe316cd69da6e750dcaf70158f37f059621757c9f01f91dd259fd8f64ad6e947edaec8c51d40852c567e6dd818bc905d04aa897988541378c50185c420e40a9f99a38c2673fa7ddaa951977b00ad094d67a530e980451f2affdb2e5ab1e1fa4e24c905fdfdb25f78fc4c4ddbab55fb012e2fe4489615564a21801bfbd4a8668fd0b13ade7e77da20", + "credential_request": "03003754f32635524b1c0be2f7f68462e488b32c7f2a70914a4f2d0b5326f885b622723f09e6d5d388d8f601a316f7fa7d0e8bab2dd909729c242b3ff3c7544ea7481cf3b018edda8a87194f04a55259bb90c65956dd66c0ab5f937c358e7f4cd393a9c03f493a23b6b67a68da3e0876831fdcf3c29fec9e8bb6b044b77ef6e0904d3d", + "credential_response": "0300c29ad9df9a2bb901816af734b03d0bba39b0a593395a8d48255ec74a8435b99936c6f7ef59208e2a3887df71d5d949a37a9ed46debd290f9a616932a596df04e73de7f69abb7714e36df120a840233a1f177d880f020990730b0b65cf460ef1156bba9b88a9963cca2cd0ade040180cb0682b61a26fc9ab60790ed0d7d8572ef00784b396e34e95ae216a8f0a3f9b853940580c66f78758674077b451c464d024476c6f1024bb0f774a0e47cfd79aeeef12f7059ec98e7e44d5196d2b402abf7aecfb9129f6890608be9a5cf4aba5b16af0ba80371658dfc7e6174719a25835df74caedf65a3ea7813a9cd3bed46fabdc57f547d41e94a59f16abe892c44a10ce3a8ac7b1585eba9a7a633af08632e0c089001e8bc50b00b27901de9c821f70be2460b134ce8526c0805b6dad681c15181797d3a11c82ac04f375e28bf0a4e5c1c510a0a8ba5dfed69c639aff030697f3542af81970b559d10af69804b42367f62605585bf184436ce7c3e96595e56d9068216b0fce0150cc4abb96bb492cd9f3ea7ce6f047abf64da828fc55d1c8a6e770bd69027c8c62939a57f4a9271e1b9d8270e8bdd27f9f80fa32191aa6645ee8c158d64bf88ed3932d6d5c3026651179b52350efff81516a4f69d4dc1aff448f5cf", + "credential_finalization": "8f8ca2c577bc4c5995b4c0fec80271c9e28a0b5883b171995afc57715655dfdc41e22aa12bc1aff7f40b2c5714ab9867c3c69c00f59a5b17f05556a9863426da888668fe8fbd25f9d43a8638a17434fcbbfa1c797f32f4ef3543e068dda9b86cd214d349c4b6f86e481347ea0960dddb0e14495508165b6d48c6112257d2b510c295c5b6f443f37b22ef393f2d4f19aada1aed9959839a17314ff11d95283b95", + "client_registration_state": "00ecb70183d42584747cb58cd0f47a34e8cfb694b277d973007d1daaa83a5ee3211d4544b752afc5a8af07889152a347d83f727ed291d03c471142451a983c4362c603003754f32635524b1c0be2f7f68462e488b32c7f2a70914a4f2d0b5326f885b622723f09e6d5d388d8f601a316f7fa7d0e8bab2dd909729c242b3ff3c7544ea7481c", + "client_login_state": "00ecb70183d42584747cb58cd0f47a34e8cfb694b277d973007d1daaa83a5ee3211d4544b752afc5a8af07889152a347d83f727ed291d03c471142451a983c4362c603003754f32635524b1c0be2f7f68462e488b32c7f2a70914a4f2d0b5326f885b622723f09e6d5d388d8f601a316f7fa7d0e8bab2dd909729c242b3ff3c7544ea7481cf3b018edda8a87194f04a55259bb90c65956dd66c0ab5f937c358e7f4cd393a9c03f493a23b6b67a68da3e0876831fdcf3c29fec9e8bb6b044b77ef6e0904d3d88fb5c095e4647060e6e0ddabb630fdb49e326566ebf540b1257cd6f4e032d47f3b018edda8a87194f04a55259bb90c65956dd66c0ab5f937c358e7f4cd393a9", + "server_login_state": "02c3e1c0490e0a74c79e3da6f4fef1b494a406a3cc309488f40709951620916e973a00ccdcd524336f712d043bd70c9a1504aea560fcfe622215689799a11353c6cd2e38f0ddf509ddd460256f437bbcda523380c10570c3d345e80d5b5ecc3515f89d1475c1b2cfea3d7bd7f28d801ce762e838053f018de214a1b74689acd26240c0b818b71183c3ff31734bd917c7ec89cf835ac5304f9540151a9cde582093d214d349c4b6f86e481347ea0960dddb0e14495508165b6d48c6112257d2b510c295c5b6f443f37b22ef393f2d4f19aada1aed9959839a17314ff11d95283b95", + "password_file": "02c3e1c0490e0a74c79e3da6f4fef1b494a406a3cc309488f40709951620916e973a00ccdcd524336f712d043bd70c9a1528d65b29be6e3b303b014ee93394e2fcb974277d2600c5f8fe316cd69da6e750dcaf70158f37f059621757c9f01f91dd259fd8f64ad6e947edaec8c51d40852c567e6dd818bc905d04aa897988541378c50185c420e40a9f99a38c2673fa7ddaa951977b00ad094d67a530e980451f2affdb2e5ab1e1fa4e24c905fdfdb25f78fc4c4ddbab55fb012e2fe4489615564a21801bfbd4a8668fd0b13ade7e77da20", + "export_key": "665b81239aa3dc3488d32c9e241e4a4d6d222dc53d24de1907f1f02e858d40b744c48c721c9efb8e024090de5c7914f8a211e88408d49c47e72df06d52734c1e", + "session_key": "04aea560fcfe622215689799a11353c6cd2e38f0ddf509ddd460256f437bbcda523380c10570c3d345e80d5b5ecc3515f89d1475c1b2cfea3d7bd7f28d801ce7" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_RISTRETTO255: &str = r#" +{ + "client_s_pk": "2b26f56462c1122bb7c3bffaf2bfa4bbbacd8a110677d4cac1940f7bc37f733c", + "client_s_sk": "f60ecaa09a0079fd8c6da32d698f0a373e57c636f56321ad3f32ed1df8094438", + "client_e_pk": "e9fe3f016f149676895b70c8a2408d568044edc053191b9d89a6da406d63f299", + "client_e_sk": "8088843a9a60508c7d726cabb3b6b2b7208598666186a52aa7830bb7892c22a0", + "server_s_pk": "2d20c8b0738ed22b4281ff9085b3bdc94a0119eee7ef939fa64c290915cff250", + "server_s_sk": "c33a9a857bbe2a734bcf0cf506b0a2f34664ab733f705911fcdedd3fd19d9008", + "server_e_pk": "e8b2d24e658dc2b017a1894f7633ad09243963bb7a33bd7dc200f46abe71821f", + "server_e_sk": "632280967b1751fc78f52e655df57b3f9eae01240cc2bfbc5bb46e98dacf3a8f", + "fake_sk": "7eb4e1bf6efc561dacbc313f8022ca599c71f8dd8c7af250eb095ebfaccb0e3d", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "08dca5115685e295fcfe164adc6b79b222269a6887896d7cfb4e493900122708", + "oprf_seed": "69fdaa3a2a4c18f13309a4ff4d9f0c948b06b7e680b7fb790453c32451a0c90de27cb822ac77c8be314a30777004f6919fed13d0b928d2d5a2c82f8e8804b681", + "dummy_masking_key": "a625bb3cad988e50f7b54d60902a024797bac3b47a6ac9a207ffe5f9cd4b5ac3f429fb4745db1bb8d38fd6eeccb5309155aac2137c7aee7a72155c431ab3ee60", + "masking_nonce": "ca7696ff7a4a22f534db64752868db9c4be6368f6b248e4b3198cf15d6239d65b23c084db0fabf6d52121d2ad25e62ba4eae53c3c303f88d1e1c46e95238f97e", + "envelope_nonce": "3d07168d3aabdbb91a93ce7e432b400ec5655a292c0669432d714486beb4ab1d", + "client_nonce": "5b96945677cab11a1491f5031f105bec632e49bd8ad033628041bb8051789739", + "server_nonce": "0889ab148f8436a40c9ba99cc6cb2f79177ee7ad881a22a1ed739d1791ad0fc1", + "server_sig_rng": "effa969c9be841dcfc26ec7c2cb0729d048034ea764becb62e2750bb0c5b667f", + "client_sig_rng": "d787b6e5e860737b22e7b5f270f5d8d2f8c3536eb6e54d5878cfff80cc6d8ff1", + "context": "636f6e74657874", + "registration_request": "8043c88b38765e71ee06909c666c130963f2c82aaee1c326224be75d8e669a0f", + "registration_response": "de6e370dbbe94a298c5288f3025e1404b5f59e95d8e1c18da63b4d34545dd4782d20c8b0738ed22b4281ff9085b3bdc94a0119eee7ef939fa64c290915cff250", + "registration_upload": "d38efad34c80b1894aaed6c02f6979e55058e07a07d93e9ffda261d6d2f287cc0ef9400de725f1a9a4b97e15de291ba5de0b3f2b88f5bc40ac8e0db5b37570a82a2bff20a94667c84ac6a205e203eaf57892cfef8909991674b6ad9b84e38cb7f60ecaa09a0079fd8c6da32d698f0a373e57c636f56321ad3f32ed1df8094438bba66836c586f43e000a993ac2900604e40ff8bd520decad4f3db9b12add26801bdb71d63c8ac4fb3f724b2d6f3bfcbae8a1dc11b4999cf05b9be72d7da556f7", + "credential_request": "8043c88b38765e71ee06909c666c130963f2c82aaee1c326224be75d8e669a0f5b96945677cab11a1491f5031f105bec632e49bd8ad033628041bb8051789739665f47d4df7b6d03413e6f481c2d99b1b657ae39af7cf7df141db84690122538", + "credential_response": "de6e370dbbe94a298c5288f3025e1404b5f59e95d8e1c18da63b4d34545dd478ca7696ff7a4a22f534db64752868db9c4be6368f6b248e4b3198cf15d6239d65a5a6832f53435b1955b74c36c51067cd76cc21cab226e0cadbf24d980c780e030c507f1c06cdfb4146c9dc344637464575e4f500e434d6286829deea4afb5a38015ef19808e10626d1023767c9254d9949397ea1361c8ef3e015c9cff7ea599c1a1db2b61396219585bdb3e2997628015709fac3055beae639dd87603f6d999c632280967b1751fc78f52e655df57b3f9eae01240cc2bfbc5bb46e98dacf3a8f461b35fd883d115932d9bfab42ee0ade07fa36f38be7038512d795cbe08d63296fb1eb525484029719b2f1ecb416ecc0bc31f3c03d196e173082b80775e1931ef2c417772d4c93412ade25aa5a44746bfdd93105cd91fd2cc857b0ce1b261a0e68396b85abd7fa0da082396a8c136b7584287d50001edd63489155a2d7f72d5fe46ae6e54b5fda853ed7b9563f4eb9078685f84ade9fea425748f904a3c7fbb8", + "credential_finalization": "9e85a3a957ed1f1b4e7068005fd972e2c425b4db8432bce5b1108454288bdbbbfaace8b1ca7355ee43aec2e6a1d2043e1c0d44f9d62bf88b0e04db921b5efc019ddb762cf10da3ce9f86a8b65433b530b4868149d801f26ea9475dbb35570e6b865385a541f503e61a68d63d8eec9f7027feefb2728ca2947be7341fce5ec1fd", + "client_registration_state": "08dca5115685e295fcfe164adc6b79b222269a6887896d7cfb4e4939001227088043c88b38765e71ee06909c666c130963f2c82aaee1c326224be75d8e669a0f", + "client_login_state": "08dca5115685e295fcfe164adc6b79b222269a6887896d7cfb4e4939001227088043c88b38765e71ee06909c666c130963f2c82aaee1c326224be75d8e669a0f5b96945677cab11a1491f5031f105bec632e49bd8ad033628041bb8051789739665f47d4df7b6d03413e6f481c2d99b1b657ae39af7cf7df141db84690122538ee4686862791be08adc59463d6dbefcb8443b92889ed452b9c5b53991fee180b5b96945677cab11a1491f5031f105bec632e49bd8ad033628041bb8051789739", + "server_login_state": "d38efad34c80b1894aaed6c02f6979e55058e07a07d93e9ffda261d6d2f287ccee2078375b09f38c036a112a7e473a25b89d19756c5be62f1fc0013448b16acb71a32d2f4276fcf3e2bebed520a99918a87551e91668de72d3908d55b26e297b8043c88b38765e71ee06909c666c130963f2c82aaee1c326224be75d8e669a0f5b96945677cab11a1491f5031f105bec632e49bd8ad033628041bb8051789739665f47d4df7b6d03413e6f481c2d99b1b657ae39af7cf7df141db84690122538de6e370dbbe94a298c5288f3025e1404b5f59e95d8e1c18da63b4d34545dd478ca7696ff7a4a22f534db64752868db9c4be6368f6b248e4b3198cf15d6239d65a5a6832f53435b1955b74c36c51067cd76cc21cab226e0cadbf24d980c780e030c507f1c06cdfb4146c9dc344637464575e4f500e434d6286829deea4afb5a38015ef19808e10626d1023767c9254d9949397ea1361c8ef3e015c9cff7ea599c1a1db2b61396219585bdb3e2997628015709fac3055beae639dd87603f6d999c632280967b1751fc78f52e655df57b3f9eae01240cc2bfbc5bb46e98dacf3a8f461b35fd883d115932d9bfab42ee0ade07fa36f38be7038512d795cbe08d632968396b85abd7fa0da082396a8c136b7584287d50001edd63489155a2d7f72d5fe46ae6e54b5fda853ed7b9563f4eb9078685f84ade9fea425748f904a3c7fbb89ddb762cf10da3ce9f86a8b65433b530b4868149d801f26ea9475dbb35570e6b865385a541f503e61a68d63d8eec9f7027feefb2728ca2947be7341fce5ec1fd", + "password_file": "d38efad34c80b1894aaed6c02f6979e55058e07a07d93e9ffda261d6d2f287cc0ef9400de725f1a9a4b97e15de291ba5de0b3f2b88f5bc40ac8e0db5b37570a82a2bff20a94667c84ac6a205e203eaf57892cfef8909991674b6ad9b84e38cb7f60ecaa09a0079fd8c6da32d698f0a373e57c636f56321ad3f32ed1df8094438bba66836c586f43e000a993ac2900604e40ff8bd520decad4f3db9b12add26801bdb71d63c8ac4fb3f724b2d6f3bfcbae8a1dc11b4999cf05b9be72d7da556f7", + "export_key": "15ec33aecf6a563330e566ce7ad90e6aa690d55d8c8a48c60464aab7288cf34882b264fb5481a95563c1f7d4021ea62e44a4991c4b3c9110a93dcc4ebdadb1ec", + "session_key": "ee2078375b09f38c036a112a7e473a25b89d19756c5be62f1fc0013448b16acb71a32d2f4276fcf3e2bebed520a99918a87551e91668de72d3908d55b26e297b" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_RISTRETTO255: &str = r#" +{ + "client_s_pk": "cb1bd5998d02a31cd74df0e13b723690d0d1644ed8e72217283340f71b563c8a", + "client_s_sk": "52825ff39cd48521d197a695da01fb2cf51baa0c216bff01b3462b14444435c1", + "client_e_pk": "65a87afaa3aa98ef6b03acd2481f7c80fa884c4a497fda85559c01d9c34ab8e5", + "client_e_sk": "c706b2e8b19a2df1bb9dd8988c53387e2415450f4a1e69f81f345d3f24c999c2", + "server_s_pk": "a3c7504062a0378af85a93bf5ecab767725b41ac696c6a44e87947507c20e658", + "server_s_sk": "5f3d0282721829c2d5de6b2454d71666302d898cad26b46ba22df4651a50d184", + "server_e_pk": "eba9f47aab3a4ab86cfdf8915fc9c4e0fd7357f7910d55c30ca915fc8275af4f", + "server_e_sk": "05170f3191ca1670b72b41ada4d6bd2c15f7bcdc2858a053f54d32be9f901493", + "fake_sk": "db20dfcc5ae61d103bebbfc4add91d99a8a97f2df50ec2ac5b5ebfbfcb23693f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "53effbeb8e24d36a6d882d7eaf5930208d0df21925d1acc99e9e714d656e943f", + "oprf_seed": "b81d1242101da3bce7f68e4a0f104e7ed823eb87f680a787d8dd865d0964a7ea", + "dummy_masking_key": "aed968109c1c51f43457076d282bdc5a52addc57d11286a27797aa71b6bc9d02", + "masking_nonce": "74187722dfa92f27e9e8f3dca954b72deb765173b1a6778fc10561724551ed70978ae2e6c2843c11afd3f76ba5510843aaa03622b8c0e33a6a9687c3e7c14a94", + "envelope_nonce": "d58d56f036756225bd2e16f4e32badb80b279c161387b0bb65afc4167034b7c7", + "client_nonce": "ef57aa23e2317c7bda8d432e2aa1f241a4c5c8d0ea09e9a5935acff6226cfdbd", + "server_nonce": "d27f6b0abffbb234d7b70118a6337c1dd038f6fe6f1ca8b9d03b725a7ce8ed07", + "server_sig_rng": "894b43d5f9b991d63320210fe276822afa9f657043ba090ba332d734b5643060", + "client_sig_rng": "fc7d16a9bdbfb38f5342153903abd551c001231eeac1dcd1de236e9a8d92e60a", + "context": "636f6e74657874", + "registration_request": "02fbfea93ec758dc5d77241b689ec4eae126604b22acc32374c376c3be363adc92", + "registration_response": "025920b0624d2392b37bda686ce6ce93b2b0f26ac7e287fa75892b21ef36188e91a3c7504062a0378af85a93bf5ecab767725b41ac696c6a44e87947507c20e658", + "registration_upload": "e476749aa3b56c5871326c58cb7e05b656bfb81a6b358942d9f17496302f8fad439bb885f69d809427109c9cbdca25803cd391ed09cc75e96d04064ab218aae052825ff39cd48521d197a695da01fb2cf51baa0c216bff01b3462b14444435c1f1841c4a057a1b78f28a2c80264f770ca4a0402a7620377f92a7ee24282432e3", + "credential_request": "02fbfea93ec758dc5d77241b689ec4eae126604b22acc32374c376c3be363adc92ef57aa23e2317c7bda8d432e2aa1f241a4c5c8d0ea09e9a5935acff6226cfdbdfc4b7e46fc7c5ee6c99e6f3513d6f9f7161a58c87a888583bcaf4ce74330f463", + "credential_response": "025920b0624d2392b37bda686ce6ce93b2b0f26ac7e287fa75892b21ef36188e9174187722dfa92f27e9e8f3dca954b72deb765173b1a6778fc10561724551ed702421ea95e5ecfa504ed284f087aaec0cb00493e7e4214ee957a3ab9ea401f5ff56bb0104a4c8815f6731cb1f5c823d64ca70f73e14163a1a1e316517fbf3cae08137f9a7318127502c56c635058d4cef2da85480027d46ccfc24320c42cdedb805170f3191ca1670b72b41ada4d6bd2c15f7bcdc2858a053f54d32be9f9014934ce2bc291de7e6dd9bcb45a7950ab615e18f6d68c66f8bb820d826132e1bad0036592e7debdaf2129fc65db3ceff0c3081ee079fabd6e8400c94e7a6cb8b9df47adc7b5f4a4007b8fc08ddec999fa7354a08790868ca9d44d33e8a54b949910628bc8fa12ef7c8df3887b05403aed7209c27ccd74752c4d26cea8e4442b6d9aec7fc4f8783b8851afe5fa522a3ed1be8b586d20b3ea02796aec2c7fe0f6b60cb", + "credential_finalization": "c51248b556584af73c429904b8a28b549fa7bef05ba42e7f01fbddbfc169ceb636dc09c9e2106de8623156c0651998d722649c15c49997564bc14e7cde77fa0d6cf669a8d86d2bfe43fd44080e732fc36247a3ccb3f60541cb959f35a706eee6c577836903486c71ee9f5e63d41efc3e68c6472fcf93d070851bb263d4c16531", + "client_registration_state": "53effbeb8e24d36a6d882d7eaf5930208d0df21925d1acc99e9e714d656e943f02fbfea93ec758dc5d77241b689ec4eae126604b22acc32374c376c3be363adc92", + "client_login_state": "53effbeb8e24d36a6d882d7eaf5930208d0df21925d1acc99e9e714d656e943f02fbfea93ec758dc5d77241b689ec4eae126604b22acc32374c376c3be363adc92ef57aa23e2317c7bda8d432e2aa1f241a4c5c8d0ea09e9a5935acff6226cfdbdfc4b7e46fc7c5ee6c99e6f3513d6f9f7161a58c87a888583bcaf4ce74330f46346486b9e5e8b96a9665ab3cdb9bee77003b9f74d61586ec861563985e1c0de05ef57aa23e2317c7bda8d432e2aa1f241a4c5c8d0ea09e9a5935acff6226cfdbd", + "server_login_state": "e476749aa3b56c5871326c58cb7e05b656bfb81a6b358942d9f17496302f8fadf3a95d1801c8f80c0d431e8fa2b72e359b1ebc6f6b357349c0ec46eb7c51a8873facdd744f92468220814ba4bfa87947a8f7a9e50154284a1eb2df2f4322fec502fbfea93ec758dc5d77241b689ec4eae126604b22acc32374c376c3be363adc92ef57aa23e2317c7bda8d432e2aa1f241a4c5c8d0ea09e9a5935acff6226cfdbdfc4b7e46fc7c5ee6c99e6f3513d6f9f7161a58c87a888583bcaf4ce74330f463025920b0624d2392b37bda686ce6ce93b2b0f26ac7e287fa75892b21ef36188e9174187722dfa92f27e9e8f3dca954b72deb765173b1a6778fc10561724551ed702421ea95e5ecfa504ed284f087aaec0cb00493e7e4214ee957a3ab9ea401f5ff56bb0104a4c8815f6731cb1f5c823d64ca70f73e14163a1a1e316517fbf3cae08137f9a7318127502c56c635058d4cef2da85480027d46ccfc24320c42cdedb805170f3191ca1670b72b41ada4d6bd2c15f7bcdc2858a053f54d32be9f9014934ce2bc291de7e6dd9bcb45a7950ab615e18f6d68c66f8bb820d826132e1bad0028bc8fa12ef7c8df3887b05403aed7209c27ccd74752c4d26cea8e4442b6d9aec7fc4f8783b8851afe5fa522a3ed1be8b586d20b3ea02796aec2c7fe0f6b60cb6cf669a8d86d2bfe43fd44080e732fc36247a3ccb3f60541cb959f35a706eee6c577836903486c71ee9f5e63d41efc3e68c6472fcf93d070851bb263d4c16531", + "password_file": "e476749aa3b56c5871326c58cb7e05b656bfb81a6b358942d9f17496302f8fad439bb885f69d809427109c9cbdca25803cd391ed09cc75e96d04064ab218aae052825ff39cd48521d197a695da01fb2cf51baa0c216bff01b3462b14444435c1f1841c4a057a1b78f28a2c80264f770ca4a0402a7620377f92a7ee24282432e3", + "export_key": "2768e355d7c8b066bfad214ce3c21b1b79897923e2249bad3c34ae20ac10f078", + "session_key": "f3a95d1801c8f80c0d431e8fa2b72e359b1ebc6f6b357349c0ec46eb7c51a8873facdd744f92468220814ba4bfa87947a8f7a9e50154284a1eb2df2f4322fec5" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_RISTRETTO255: &str = r#" +{ + "client_s_pk": "42fa7a924734db8b5191466c9c784a0aa9e6fdfc829375631ef01ef0284ec1b3", + "client_s_sk": "b4da35dc4b4461761dbed645ded28f28a4a31e6d17ca6f93503a1314d7fe7e52", + "client_e_pk": "7d7c356b7b7bcd49a246ef5bacb117ebbc606de8b110a2a363ff7fc1aacd280f", + "client_e_sk": "76de393427527646ac35968e904d3fa0e44d77ec80beeba9b739e8af6d26c905", + "server_s_pk": "829b89ba945c1fbcee1fabc166ed35070864a7c44f40af9287c52025d8df6b71", + "server_s_sk": "59e3a6b10983f6d1845dad6b9e8e3f5d6ce413f28e4b340a077098f4d2c867e0", + "server_e_pk": "7abdd044d6b565643bff13948c6a2084fe4f07fba68a03ec234233955f650515", + "server_e_sk": "77d6d3c0d3cb6912f2d9663a5b703f339f2248a66f8c1e3fc62acb3d91fb65d2", + "fake_sk": "a4e549b5675f816fd30c732773eec116c31ea0dc39726419f689d17d4d7ff35f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "a74e1562e963ee90eec264ac3e21212f43fbc67cf2845aafbc0f166a805d25b18fb22999f57e50880fdf6fceecb5bda4", + "oprf_seed": "85e02e7f6abc5c591031dacca1bef8b0059b8a1beac5011c4ce88ce1fe237eb4964944359dadfb5438c14a7ec4072793", + "dummy_masking_key": "f922b4fbb1231f31a8120b5c13f61957197c2e953551235c5ff9b934317a9dbb26379428baf0c5b53bd08fb7c973a286", + "masking_nonce": "24a79c3fc932eb92178d7890cb865398df485e1acf779ebdcdeba7df76d14a7c4f2ea1ee7bf5df50635781ac26987ef9d5a5cccd85244b0435f180c4fa365913", + "envelope_nonce": "59b45c92d3417fe2ae33f4726c347ead7ae05db4015f9a797abc142f2bb41942", + "client_nonce": "5c6e06512f0b466f9e865833942f1aa73e860c7eb3d46b420d7dc6fef8a77ee6", + "server_nonce": "86a2cff45fa18a7af121fffee791bac412dc6771e00dae1a7545eaa88bd79140", + "server_sig_rng": "615234b59e0020ea5262b9694eceb1931cbf935f3ce1f7f4719c368be66b95cd", + "client_sig_rng": "894000a93d814235ebbe38dc770144639c2085e4099ab16bc4ccc6698920a0eb", + "context": "636f6e74657874", + "registration_request": "03bb2ec310157d4f82c78a1cf186dccb858f88589777b77c4236b27cc7a3459ac53003788a9320f0ad2d2b442999de2101", + "registration_response": "030da388d57b11568a29c8f04bdaef6589a9a60772e5e461cb5be9e6eebe1d79b24f71fd9b88adfd8ac75e1028fa0705b5829b89ba945c1fbcee1fabc166ed35070864a7c44f40af9287c52025d8df6b71", + "registration_upload": "d86cde85459e9eda126cb7ac3c697f641e5d8b15be58063bcf879faff1a5ea2dd3b836fc84868d09f4090bb6f5d5d35ff95f7e098ae75e89cb8e5aa12f69ea17bbabe90954403e60d5b1176b970fde87b4da35dc4b4461761dbed645ded28f28a4a31e6d17ca6f93503a1314d7fe7e52393e2961367fe6ced76afe40d1a956cc182ed0a566dd445a66b6394694dee448be49c8a9d608ca485ab0881d3fdc8eda", + "credential_request": "03bb2ec310157d4f82c78a1cf186dccb858f88589777b77c4236b27cc7a3459ac53003788a9320f0ad2d2b442999de21015c6e06512f0b466f9e865833942f1aa73e860c7eb3d46b420d7dc6fef8a77ee69e3c4fd03d52adabcfc6e0efdb5bbb6d469f87540239c824d1d8006fcc96b055", + "credential_response": "030da388d57b11568a29c8f04bdaef6589a9a60772e5e461cb5be9e6eebe1d79b24f71fd9b88adfd8ac75e1028fa0705b524a79c3fc932eb92178d7890cb865398df485e1acf779ebdcdeba7df76d14a7c0a682a95f3c97a6da4c46648a8562f8498f2a3410128d385504220d4bd1aacb252c4d38b7625ec12e71c3829ac0b23c4d5b9d35f01cd891f163e7994b94147773212c4b4c6e9e3884f50b6587d48f054100e95f4e60b4dac9fd83f14d6fdf2b683aba84eb22440524bc99f91a220ecdb77d6d3c0d3cb6912f2d9663a5b703f339f2248a66f8c1e3fc62acb3d91fb65d2aafe580a2607a436f1425084eb7ed032e47726e36eceee0c1c2064bb7d49165f14b34cb8860bf6356e40a6ef3af4b551e656f9e32ace693b86d5fbd6e2a96a799b8ff3ace3285829c61b1cd9d970722a4801b816f7948747936a7be156d22d09650d9334bae558275e6c30f41fe6a705def79262c2ec45ea985940f14ec6c99809646f83fa091b126adffe75fa61ee4360d6dfc9ee4c7c1d7388a440ff2e7369", + "credential_finalization": "faefcafc93efb32d0b2b805fbd00ee6a1b04ddafaaf92cec6a886e4e05b41979014f13888eaf387b18de268fddbf6d3ffbe2f341ed7447cb0c4f0ebadb18380176982bbc7ae503198023d8f701cd431247875077ddeefe420cf0af1994bc042f4ce7159cb3e93cd5cb90fea6d38f85ad4acbd2ad99d4d533570c84fdbed7854b", + "client_registration_state": "a74e1562e963ee90eec264ac3e21212f43fbc67cf2845aafbc0f166a805d25b18fb22999f57e50880fdf6fceecb5bda403bb2ec310157d4f82c78a1cf186dccb858f88589777b77c4236b27cc7a3459ac53003788a9320f0ad2d2b442999de2101", + "client_login_state": "a74e1562e963ee90eec264ac3e21212f43fbc67cf2845aafbc0f166a805d25b18fb22999f57e50880fdf6fceecb5bda403bb2ec310157d4f82c78a1cf186dccb858f88589777b77c4236b27cc7a3459ac53003788a9320f0ad2d2b442999de21015c6e06512f0b466f9e865833942f1aa73e860c7eb3d46b420d7dc6fef8a77ee69e3c4fd03d52adabcfc6e0efdb5bbb6d469f87540239c824d1d8006fcc96b0550a9ab9881eac140fdffff472b1980c490dfea502324c9473f3e2f4539989040c5c6e06512f0b466f9e865833942f1aa73e860c7eb3d46b420d7dc6fef8a77ee6", + "server_login_state": "d86cde85459e9eda126cb7ac3c697f641e5d8b15be58063bcf879faff1a5ea2ddca07da67098324b28d54f2d18c9592284ce787aab983a6b04a2b210f310af5286aa683af4ef68e9d2a7d56d1c18bc97afa2e9089efc0e19b8c1304b94293c0503bb2ec310157d4f82c78a1cf186dccb858f88589777b77c4236b27cc7a3459ac53003788a9320f0ad2d2b442999de21015c6e06512f0b466f9e865833942f1aa73e860c7eb3d46b420d7dc6fef8a77ee69e3c4fd03d52adabcfc6e0efdb5bbb6d469f87540239c824d1d8006fcc96b055030da388d57b11568a29c8f04bdaef6589a9a60772e5e461cb5be9e6eebe1d79b24f71fd9b88adfd8ac75e1028fa0705b524a79c3fc932eb92178d7890cb865398df485e1acf779ebdcdeba7df76d14a7c0a682a95f3c97a6da4c46648a8562f8498f2a3410128d385504220d4bd1aacb252c4d38b7625ec12e71c3829ac0b23c4d5b9d35f01cd891f163e7994b94147773212c4b4c6e9e3884f50b6587d48f054100e95f4e60b4dac9fd83f14d6fdf2b683aba84eb22440524bc99f91a220ecdb77d6d3c0d3cb6912f2d9663a5b703f339f2248a66f8c1e3fc62acb3d91fb65d2aafe580a2607a436f1425084eb7ed032e47726e36eceee0c1c2064bb7d49165f650d9334bae558275e6c30f41fe6a705def79262c2ec45ea985940f14ec6c99809646f83fa091b126adffe75fa61ee4360d6dfc9ee4c7c1d7388a440ff2e736976982bbc7ae503198023d8f701cd431247875077ddeefe420cf0af1994bc042f4ce7159cb3e93cd5cb90fea6d38f85ad4acbd2ad99d4d533570c84fdbed7854b", + "password_file": "d86cde85459e9eda126cb7ac3c697f641e5d8b15be58063bcf879faff1a5ea2dd3b836fc84868d09f4090bb6f5d5d35ff95f7e098ae75e89cb8e5aa12f69ea17bbabe90954403e60d5b1176b970fde87b4da35dc4b4461761dbed645ded28f28a4a31e6d17ca6f93503a1314d7fe7e52393e2961367fe6ced76afe40d1a956cc182ed0a566dd445a66b6394694dee448be49c8a9d608ca485ab0881d3fdc8eda", + "export_key": "18e1b1e75ec005628b0be98c602ad69a2d240c4a6fb97bb81675f9c25c82ecd3ce95c6e376d45840e90ff4e694314ecb", + "session_key": "dca07da67098324b28d54f2d18c9592284ce787aab983a6b04a2b210f310af5286aa683af4ef68e9d2a7d56d1c18bc97afa2e9089efc0e19b8c1304b94293c05" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_RISTRETTO255: &str = r#" +{ + "client_s_pk": "0d7fcb5841ba70589a001d43523da05bbfcb9a8bc52fa509168cd3f020175edd", + "client_s_sk": "460a0d8c650b565ee51a58c0a1e4685896fb590edaf262da84a85c2056d18298", + "client_e_pk": "80a5d840ccb32e187bf2d0a1d4a239c756cad263409ca13b03a6b4fd43eabfa2", + "client_e_sk": "001074dcbc15ad8a77db98b724c2b330a9b47dc77ef92fd6cb99ff57b9681f8f", + "server_s_pk": "1a717eb4f81b9d6bc4f1fde88221ec0fa4ff4c2c5b3c5482310d881a2ed357aa", + "server_s_sk": "03faeef51f327f13601af856001a1965e664301302b262df734595bae512be5f", + "server_e_pk": "693411e19af6b07f753feb5779cd2966888b40c9b5c5120e4221510917fe784a", + "server_e_sk": "0cf8987ffdf39377d61b163f30ba30117d591665523b087266c8fe0ea3d1f9d4", + "fake_sk": "97de3ad5cd050567daec3ac2186b8846f4f8b9efa074b7db7c648817eaddc688", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00431806022fd7b2f84227654264eb2c09dcd3ae7f61d639000cf9b7a67a81d659577fd31d21ae0d094547ef00319ca38897bcaa5e9a30c7e485de872aaf6f278420", + "oprf_seed": "f3c2277667cbb826291678a4b004455a12e7897bc04dc0bd0bc3b80b39214513c51db15c69e14b8ac5e1abc613fb13e45dc422b85f41595a54ec58fede421849", + "dummy_masking_key": "e5155bf16320be6c66107d8a7e5d62026cc1528d9d64a81cc74ed095be6822fcc87ef1445427067a251c317145c5e531570cef08765be60f1f59d8ba01e66f7b", + "masking_nonce": "af1e80f28c8be7fc9ef5ca6dfeb231468c45c432246b7e7669b82e793a5711b646e129c45c49ecc95dbd395dd92e8c7cd8b96744fe050d6959b10c72efb3ee64", + "envelope_nonce": "7d67e7fc40227b7d2e28d8fadd00cf8862930af65b8f07219b7cb6c2a956d063", + "client_nonce": "4a141682e88f948e5f042fb35391b600a9da2f7a72cbbecd1658bdfa0806c40f", + "server_nonce": "a6a6097f80966b482325c0b624f21c41cae3c69aff89cd26af88c8afe00f142c", + "server_sig_rng": "06597fc1d38e573d7185994dec8b8673e062f13701cf425929956f6871fe64c3", + "client_sig_rng": "46460cc424380a2127f959540654806bc686c401029e9843011f37f8a963582b", + "context": "636f6e74657874", + "registration_request": "0301e6966eaa152e8023fc191f76ec72d3dc5fabf7533ce15043cc4196e19657832a87484c82517f6f84745a4d619c2817666ce7abf94b10f4adbffb7e0701bf4b5ce5", + "registration_response": "03019516cd3565961b8dc2631ad5c22aee7b31e4ec8bb080e5f8be850d1e4adb8de4eddc301fa1c0004c36c4dfe9ae9110e85e7d5e1bd71bf828b033e1848be55605221a717eb4f81b9d6bc4f1fde88221ec0fa4ff4c2c5b3c5482310d881a2ed357aa", + "registration_upload": "2201ae86d79b0d990ce0176b1833348c4a2f4a023b05bbdb1ace928b4b4d701195a37db13f5dd615d967b0f34a7316d4f5a5c9802cdeb8d6e4cdf4cffb1b4fa93467dd52aaab09f6cd26e7067d953b5188ab0819b89de109ba426c4ba1daafc0460a0d8c650b565ee51a58c0a1e4685896fb590edaf262da84a85c2056d182985e49997745dbdb20ff5fde55fcdf1eaa469ea8994529974b221a3f335fdaf1851f7792073b87d420d9fdc75a8878d5fe5885d85dca26ec6928f476221e3caa81", + "credential_request": "0301e6966eaa152e8023fc191f76ec72d3dc5fabf7533ce15043cc4196e19657832a87484c82517f6f84745a4d619c2817666ce7abf94b10f4adbffb7e0701bf4b5ce54a141682e88f948e5f042fb35391b600a9da2f7a72cbbecd1658bdfa0806c40f249453c6ebdeebac663018ac9e7c7044d90e3a5a4a688137d56d2333d9cf4657", + "credential_response": "03019516cd3565961b8dc2631ad5c22aee7b31e4ec8bb080e5f8be850d1e4adb8de4eddc301fa1c0004c36c4dfe9ae9110e85e7d5e1bd71bf828b033e1848be5560522af1e80f28c8be7fc9ef5ca6dfeb231468c45c432246b7e7669b82e793a5711b6ac067b09576c7a91db5a32609caa137cd2b540bfe8bdefafd6c16a74c02fd01a54b1e422d8ed0af3deb86caa4dfba03fe038a5b78b2f2a364845454aa64e77fa5279f6289b4d8cc829c8c58fa99da8a5554ee2efdcaa44f88a84b0c11ef53f6fed2bf6eca12386515c64455340f5e2fed51dc5f15f082ebae95ef619cf2a7b750cf8987ffdf39377d61b163f30ba30117d591665523b087266c8fe0ea3d1f9d4d6bbb7aeb73105fdf26f848785676b0e1559bd94dfaa2a96839e51ddd072440c9f3d6b66150bf1536e6b25b42ac0f80dee880d53c300b875de522e84b00d18189aafd40d275356115042fca62e76f077d04122fb5c8fa16313019c8bb8c1b70cdb1adae4c2112a2997e26940ea09fb6274d78cedbd3db9ad1c3802f854b80a140cb55482535a2a074e689c69a04e391742ac96357c11576299981058658e63be", + "credential_finalization": "b77697cee39497f18b97ea79adf4657db222fb627b59ca777b9117d26affc4f2bce2068b9f980249dbf3a44b19a20b37cf4adba404e99459feaece4ec9862e04d3fef216dd22c0939ea1dd01277b461d83771cfa269f4fd52e2370c87296b3462cf73ca372d0606688923ac031d3c7e5319bb8f464ecb80ec4512bb489232c85", + "client_registration_state": "00431806022fd7b2f84227654264eb2c09dcd3ae7f61d639000cf9b7a67a81d659577fd31d21ae0d094547ef00319ca38897bcaa5e9a30c7e485de872aaf6f2784200301e6966eaa152e8023fc191f76ec72d3dc5fabf7533ce15043cc4196e19657832a87484c82517f6f84745a4d619c2817666ce7abf94b10f4adbffb7e0701bf4b5ce5", + "client_login_state": "00431806022fd7b2f84227654264eb2c09dcd3ae7f61d639000cf9b7a67a81d659577fd31d21ae0d094547ef00319ca38897bcaa5e9a30c7e485de872aaf6f2784200301e6966eaa152e8023fc191f76ec72d3dc5fabf7533ce15043cc4196e19657832a87484c82517f6f84745a4d619c2817666ce7abf94b10f4adbffb7e0701bf4b5ce54a141682e88f948e5f042fb35391b600a9da2f7a72cbbecd1658bdfa0806c40f249453c6ebdeebac663018ac9e7c7044d90e3a5a4a688137d56d2333d9cf46579da501a88cc88f004eb685e63a1197cbe3e5dacdb6adbf2189bdc5898318940c4a141682e88f948e5f042fb35391b600a9da2f7a72cbbecd1658bdfa0806c40f", + "server_login_state": "2201ae86d79b0d990ce0176b1833348c4a2f4a023b05bbdb1ace928b4b4d7011e527e71955ff5b3ae5ab5422adfdb3b6b8bab6ddef2df11d47db21f09ed33bab7b1aaf429e4a60e66e7077785266b44114090610feb98193c4ec1e33f1ae4f090301e6966eaa152e8023fc191f76ec72d3dc5fabf7533ce15043cc4196e19657832a87484c82517f6f84745a4d619c2817666ce7abf94b10f4adbffb7e0701bf4b5ce54a141682e88f948e5f042fb35391b600a9da2f7a72cbbecd1658bdfa0806c40f249453c6ebdeebac663018ac9e7c7044d90e3a5a4a688137d56d2333d9cf465703019516cd3565961b8dc2631ad5c22aee7b31e4ec8bb080e5f8be850d1e4adb8de4eddc301fa1c0004c36c4dfe9ae9110e85e7d5e1bd71bf828b033e1848be5560522af1e80f28c8be7fc9ef5ca6dfeb231468c45c432246b7e7669b82e793a5711b6ac067b09576c7a91db5a32609caa137cd2b540bfe8bdefafd6c16a74c02fd01a54b1e422d8ed0af3deb86caa4dfba03fe038a5b78b2f2a364845454aa64e77fa5279f6289b4d8cc829c8c58fa99da8a5554ee2efdcaa44f88a84b0c11ef53f6fed2bf6eca12386515c64455340f5e2fed51dc5f15f082ebae95ef619cf2a7b750cf8987ffdf39377d61b163f30ba30117d591665523b087266c8fe0ea3d1f9d4d6bbb7aeb73105fdf26f848785676b0e1559bd94dfaa2a96839e51ddd072440cdb1adae4c2112a2997e26940ea09fb6274d78cedbd3db9ad1c3802f854b80a140cb55482535a2a074e689c69a04e391742ac96357c11576299981058658e63bed3fef216dd22c0939ea1dd01277b461d83771cfa269f4fd52e2370c87296b3462cf73ca372d0606688923ac031d3c7e5319bb8f464ecb80ec4512bb489232c85", + "password_file": "2201ae86d79b0d990ce0176b1833348c4a2f4a023b05bbdb1ace928b4b4d701195a37db13f5dd615d967b0f34a7316d4f5a5c9802cdeb8d6e4cdf4cffb1b4fa93467dd52aaab09f6cd26e7067d953b5188ab0819b89de109ba426c4ba1daafc0460a0d8c650b565ee51a58c0a1e4685896fb590edaf262da84a85c2056d182985e49997745dbdb20ff5fde55fcdf1eaa469ea8994529974b221a3f335fdaf1851f7792073b87d420d9fdc75a8878d5fe5885d85dca26ec6928f476221e3caa81", + "export_key": "76310fb1ec5f1d3569f92616f4ad2a0488714e63a16c403da1b3c1d32f9eada23772945158b8d7cb4dcfc90896dca5b660da05bdcb81368f8cfe03b93f7311d5", + "session_key": "e527e71955ff5b3ae5ab5422adfdb3b6b8bab6ddef2df11d47db21f09ed33bab7b1aaf429e4a60e66e7077785266b44114090610feb98193c4ec1e33f1ae4f09" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_P256: &str = r#" +{ + "client_s_pk": "d7f368968523e86c79b4e753dfdb49184cbb5d2c24c0af4162cdb43e1120fbfa", + "client_s_sk": "8cda3e3349d08b7eaeeecb44a4fbd72e1bce20cca55d99713788af19c3a60ee9", + "client_e_pk": "824d293ac43a02bcc4a3d1fc6e26941170ca695f9a061940860989f4c504e6f0", + "client_e_sk": "46ff1c2912370c5db62e6028f1cef1fc611a2178ab270591a69ebd73433f470f", + "server_s_pk": "bcb8ac2b2aa24587ea57010943ba2e172e1584e05f3b23eb6c6b9ffd229216a5", + "server_s_sk": "706ef0c3c1302db5caeeaf44cf4b588db6ccfd3689103a1c7f9026ba21a57625", + "server_e_pk": "f9da18d84faff97df5fe37dee7ea5e2155e65c5993821347a2bd8bf476325495", + "server_e_sk": "33c691168f92356e92ebb9f3601ce4f4418681de827f0540dfd553f63dc5c52f", + "fake_sk": "e0c92632b962ab2f3d5ada9e65622fc933394ca9069067671adc80591223223a", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "c41e953e6cfdd823701b59262f3ef4141e1c3488a968628575499e38f59dcb05", + "oprf_seed": "a8b4e0f1c1493183bbec0d8135dd0f724302c4e4186dee26161ccd808b9505dd47b90277141430dd38ecdaa567cf39c752cf5d6a135ef1d48447f92ae3634f67", + "dummy_masking_key": "8b3404882afeee6f982126d6b2609ed12a47f23e452c01eb9196f7d6c901013bf3a6470cfd36ffdf31bbbae28965978619d3cf2d0167a48c972105f16cc22715", + "masking_nonce": "ef222d3e331cdd8811531d867a98a417e7f0cf49b1bafbacae703ce6d2698293ce5dc400f1c7ed5e4d57a084aae006bce52d4dd434eeac5cef5c37ea38df5e4a", + "envelope_nonce": "509d4a3624840646a59331ed82fdcaff9cb8f85be3772e76babe6f9f88060ebc", + "client_nonce": "64a58ca3c78901ec42a6376aae7a0e5efabd2562d93d724092b9746321b8fb9a", + "server_nonce": "f5f78274cdc880d1d52ba38999517f9a188d29657dc4230db604bb4a42c6cb8a", + "server_sig_rng": "72970ae8f03e6a0d1df3a8fb106d6e034538d2d902debb377a0c0f4e4864ba26", + "client_sig_rng": "71a99247e4efb7d171939926f096728e65cc570d20692bcabecc10fc522d2469", + "context": "636f6e74657874", + "registration_request": "aeb2c176576e8a124e1285de12c6d3949f1ed9fa961032fc318bc8bbc51f7c3e", + "registration_response": "96ac9374019e12b2042b506678b2c718ec2c1eb9b88b8079b8092ea96fb91574bcb8ac2b2aa24587ea57010943ba2e172e1584e05f3b23eb6c6b9ffd229216a5", + "registration_upload": "3f30ebc7e65224c9917d27b21d87dfb7c6c7c8291d7ddc65bc0df42927f64ce20957d464261ce050d40f310811320e9def26117a30e85f35349bb811c92ae8d4bbbe65f9d48f23021f8623e91fc5c5a2b7c397bc9f4456773a44f3e3fb6adf468cda3e3349d08b7eaeeecb44a4fbd72e1bce20cca55d99713788af19c3a60ee9be162f2f251c0205b473b054fce72d81e3ef99e89a6f07220c0332d69fd125cda29a163a3a27bf766238dc648dc46e9101fb466975872463f1bfd464325823a8", + "credential_request": "aeb2c176576e8a124e1285de12c6d3949f1ed9fa961032fc318bc8bbc51f7c3e64a58ca3c78901ec42a6376aae7a0e5efabd2562d93d724092b9746321b8fb9a0282bf4127acffb731efeba7d00eeb70115bbc77d2a2aafcef7d6789d838104710", + "credential_response": "96ac9374019e12b2042b506678b2c718ec2c1eb9b88b8079b8092ea96fb91574ef222d3e331cdd8811531d867a98a417e7f0cf49b1bafbacae703ce6d2698293683161755de13e27423b1b45b505fe6121934fb8b44753d936267407aa0c4bad5c3f314ab2591f480b6e01ca6e8fcd9e1945f291150c661cfee3ac3927a6c125330fe7557b52bf786d143e825690ae99d14c1afc975120971fb1134279f00edb9f10ca11dbd94374c0fa90119217f1d02ca341ec0488ea1ece04f3b2c274265033c691168f92356e92ebb9f3601ce4f4418681de827f0540dfd553f63dc5c52f03b0aa43e39f4869ef6010c727bcf487288367387059adc2df90e40667e72d85263848322a38f1f9ea17d62a277d7084920cdb3331164f68ebda26d4e74c1c81f2ef1a5b084fb8550647a0356b451cc827d585d574b31691347707a06ee915ac0453d286eee82ffdfad6a128a4ce6e2f9e69404e004af4e22c59ce86aa0fa11053", + "credential_finalization": "fd961d9d4b24af9a3e91c581690784e2fabc3e4d6b7d25a12b318303c6774b53eb3630101f443ccc6811dd0ca4db329bab1078077398be233ec781cd06d4a8085b0beccef6b6b771164a3ec8c2477a4db65a742dd427b7a66d92a3192cdbf9c8", + "client_registration_state": "c41e953e6cfdd823701b59262f3ef4141e1c3488a968628575499e38f59dcb05aeb2c176576e8a124e1285de12c6d3949f1ed9fa961032fc318bc8bbc51f7c3e", + "client_login_state": "c41e953e6cfdd823701b59262f3ef4141e1c3488a968628575499e38f59dcb05aeb2c176576e8a124e1285de12c6d3949f1ed9fa961032fc318bc8bbc51f7c3e64a58ca3c78901ec42a6376aae7a0e5efabd2562d93d724092b9746321b8fb9a0282bf4127acffb731efeba7d00eeb70115bbc77d2a2aafcef7d6789d838104710869eca7b27c24f3e43cbe9ecbaefc067d55361b8713bc7954887c131ae7c031964a58ca3c78901ec42a6376aae7a0e5efabd2562d93d724092b9746321b8fb9a", + "server_login_state": "3f30ebc7e65224c9917d27b21d87dfb7c6c7c8291d7ddc65bc0df42927f64ce27d946782d22c8be15aaca9ceea878ba2a3d8b66844f09b0068cb1bbd91f6ec42aeb2c176576e8a124e1285de12c6d3949f1ed9fa961032fc318bc8bbc51f7c3e64a58ca3c78901ec42a6376aae7a0e5efabd2562d93d724092b9746321b8fb9a0282bf4127acffb731efeba7d00eeb70115bbc77d2a2aafcef7d6789d83810471096ac9374019e12b2042b506678b2c718ec2c1eb9b88b8079b8092ea96fb91574ef222d3e331cdd8811531d867a98a417e7f0cf49b1bafbacae703ce6d2698293683161755de13e27423b1b45b505fe6121934fb8b44753d936267407aa0c4bad5c3f314ab2591f480b6e01ca6e8fcd9e1945f291150c661cfee3ac3927a6c125330fe7557b52bf786d143e825690ae99d14c1afc975120971fb1134279f00edb9f10ca11dbd94374c0fa90119217f1d02ca341ec0488ea1ece04f3b2c274265033c691168f92356e92ebb9f3601ce4f4418681de827f0540dfd553f63dc5c52f03b0aa43e39f4869ef6010c727bcf487288367387059adc2df90e40667e72d852653d286eee82ffdfad6a128a4ce6e2f9e69404e004af4e22c59ce86aa0fa110535b0beccef6b6b771164a3ec8c2477a4db65a742dd427b7a66d92a3192cdbf9c8", + "password_file": "3f30ebc7e65224c9917d27b21d87dfb7c6c7c8291d7ddc65bc0df42927f64ce20957d464261ce050d40f310811320e9def26117a30e85f35349bb811c92ae8d4bbbe65f9d48f23021f8623e91fc5c5a2b7c397bc9f4456773a44f3e3fb6adf468cda3e3349d08b7eaeeecb44a4fbd72e1bce20cca55d99713788af19c3a60ee9be162f2f251c0205b473b054fce72d81e3ef99e89a6f07220c0332d69fd125cda29a163a3a27bf766238dc648dc46e9101fb466975872463f1bfd464325823a8", + "export_key": "2b6d2ac09a4275e2f4a878adb02cc6fc515146a919df47cb4bdb9f99b25f18d07e1a9133df9fbe21e683e8acb14e6a18e1551ede5b6f02818fa902d6e78a2183", + "session_key": "7d946782d22c8be15aaca9ceea878ba2a3d8b66844f09b0068cb1bbd91f6ec42" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_P256: &str = r#" +{ + "client_s_pk": "db4dceb83e7fd572940545393f69bc171c40d9f086ca61f2c4f78f0ee0421e9d", + "client_s_sk": "d1c38117808c6de80d467942bfabf7483d07f06581d56f4ed18a5800ec97e5a0", + "client_e_pk": "de0598dcc63dea71b1f49b8278de534fd6b7f9edcca89a0353cbf46af9743447", + "client_e_sk": "63a63200da399a08922aa0349c50c49dc0e88224d3ba9db83de92109be0cef14", + "server_s_pk": "15fc8bd929ddcf1e0ca9e6a7968435026af1edf21c9797f664b2b8f4d183f905", + "server_s_sk": "7530756a6a0365013c664e91f4328685119cd052b99ba9f97ae41ac46f3d6073", + "server_e_pk": "c02f52fb31c48b853d9018f83c54b7a20d7e0d0557b736fbc7c6b3acfabc77d9", + "server_e_sk": "8fac1353db8fde0e737f6a5ccdc95ca741028ef3952650378b6bdaeb5ca17220", + "fake_sk": "63e4daf0f37db861af70e8b0c01a4e2f0ab7bbcb7d215f4569c540752b787aec", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "94039a28b3feddaa36a14ab3d43460fd292d0d7af03c97875a712983483f941a", + "oprf_seed": "c532aa4c5738b06686b949b85a463632dd4573122fe448a6429770de8040bca9", + "dummy_masking_key": "977ba386d59f2fabaed09edf6d13e0470eddc5b0b62ab469b4fa96d29be751ab", + "masking_nonce": "859e1b805fb7f968857617bc6831b8f0dc7628687a4d310fe36af2a9e382adef1ad97de395f9de29afddf7fa5c94d25c56a76efb9de59744755efe0ec11e71cd", + "envelope_nonce": "affe329b7a010617239e0889f3ae09823464735721a8d516af4febc14151a0ed", + "client_nonce": "7d1d9ec95c284c6469891ae469412a6b0598589ea373e60ab774876985e3b50f", + "server_nonce": "176a4a68703319dcde4c1c80eb92f9d201c9d7bb151a2910df8999426d11154b", + "server_sig_rng": "c361efc589d6e50996b25d4c28078dcb3bd96f2081621e0375ae3cba524b3106", + "client_sig_rng": "3cf63681a67a34ed80d739088eea1f2612ce68e0cf997dcf67fd87e3eb1c2189", + "context": "636f6e74657874", + "registration_request": "02edd65a5ab328a63f90b7b47a281e190ad4e2c693566da7fb4891320745a24b83", + "registration_response": "0273bdc707ddc70edc78c8514a08f624e89ab1fc8b900807be43f9ccf32f5348fe15fc8bd929ddcf1e0ca9e6a7968435026af1edf21c9797f664b2b8f4d183f905", + "registration_upload": "3f3adf05a3867eef8a2923c8688e76ce0abd2e341ada3ee22e7f24b643d77ab17710753f412247e1b1f922da9a168ad18c0aa7a00ef202238d0b9d53104c9829d1c38117808c6de80d467942bfabf7483d07f06581d56f4ed18a5800ec97e5a0a165006594d24ac5a18fe9ebc3a793075a9961f7f35c0461350eee9b4b0bd59f", + "credential_request": "02edd65a5ab328a63f90b7b47a281e190ad4e2c693566da7fb4891320745a24b837d1d9ec95c284c6469891ae469412a6b0598589ea373e60ab774876985e3b50f02bab1ecb2acbe46a226e9f9472baa10a72eca5a373089260205ee21371e33fadc", + "credential_response": "0273bdc707ddc70edc78c8514a08f624e89ab1fc8b900807be43f9ccf32f5348fe859e1b805fb7f968857617bc6831b8f0dc7628687a4d310fe36af2a9e382adef775eb39f7f7bbeb6315d79eaa2289e412c07b948fd9509b1b830572595ca753789d132d3f862d8761e0d9bd1263a681cf8c3844a8794ca4e672289d4c50416185936d43f6904a96632a96781703845316f3cf224c43b8988126b2e5097c15ab88fac1353db8fde0e737f6a5ccdc95ca741028ef3952650378b6bdaeb5ca1722003db2d6d69db147e8b806ab17e051d25ef2d5da56dfe9770be34e48660810e887791c14dde06619146b9fc3cca610c850154885d1c7c4cd8e4c9ca1954125ca48444977ac73bd0cf23e3e9e831f4f2ebe4d7e05dc8df156480d647a7ab62694d0a2e2475ff5e2ba9215dce0f88461319f445e7243c6e7baaa6394dc6795f111556", + "credential_finalization": "233aaa3dd97dcd5cc3248451a570b6215aa0819d3a62105f3373903def186086163042c74ac0079d9560f0cee6b9063f9e673fa908b4f2483981c641cae32e0388a88cf06840bdf85b5227d1a5d44f3fa5738e1f16418769b4499e2335c4adf9", + "client_registration_state": "94039a28b3feddaa36a14ab3d43460fd292d0d7af03c97875a712983483f941a02edd65a5ab328a63f90b7b47a281e190ad4e2c693566da7fb4891320745a24b83", + "client_login_state": "94039a28b3feddaa36a14ab3d43460fd292d0d7af03c97875a712983483f941a02edd65a5ab328a63f90b7b47a281e190ad4e2c693566da7fb4891320745a24b837d1d9ec95c284c6469891ae469412a6b0598589ea373e60ab774876985e3b50f02bab1ecb2acbe46a226e9f9472baa10a72eca5a373089260205ee21371e33fadcc5a7c165e5a9a4a41e2ed12ba72155450d3e8ff4182cd00a2d396290105acda27d1d9ec95c284c6469891ae469412a6b0598589ea373e60ab774876985e3b50f", + "server_login_state": "3f3adf05a3867eef8a2923c8688e76ce0abd2e341ada3ee22e7f24b643d77ab12f6cffad8b18cf16ef18e0551bc5c4cc5de1537212507f893e03cb4f969fdd6302edd65a5ab328a63f90b7b47a281e190ad4e2c693566da7fb4891320745a24b837d1d9ec95c284c6469891ae469412a6b0598589ea373e60ab774876985e3b50f02bab1ecb2acbe46a226e9f9472baa10a72eca5a373089260205ee21371e33fadc0273bdc707ddc70edc78c8514a08f624e89ab1fc8b900807be43f9ccf32f5348fe859e1b805fb7f968857617bc6831b8f0dc7628687a4d310fe36af2a9e382adef775eb39f7f7bbeb6315d79eaa2289e412c07b948fd9509b1b830572595ca753789d132d3f862d8761e0d9bd1263a681cf8c3844a8794ca4e672289d4c50416185936d43f6904a96632a96781703845316f3cf224c43b8988126b2e5097c15ab88fac1353db8fde0e737f6a5ccdc95ca741028ef3952650378b6bdaeb5ca1722003db2d6d69db147e8b806ab17e051d25ef2d5da56dfe9770be34e48660810e88772e2475ff5e2ba9215dce0f88461319f445e7243c6e7baaa6394dc6795f11155688a88cf06840bdf85b5227d1a5d44f3fa5738e1f16418769b4499e2335c4adf9", + "password_file": "3f3adf05a3867eef8a2923c8688e76ce0abd2e341ada3ee22e7f24b643d77ab17710753f412247e1b1f922da9a168ad18c0aa7a00ef202238d0b9d53104c9829d1c38117808c6de80d467942bfabf7483d07f06581d56f4ed18a5800ec97e5a0a165006594d24ac5a18fe9ebc3a793075a9961f7f35c0461350eee9b4b0bd59f", + "export_key": "64e18a1e2a032e5a41b25de60b32778cda8284989e79b563cbf3151694e6a24d", + "session_key": "2f6cffad8b18cf16ef18e0551bc5c4cc5de1537212507f893e03cb4f969fdd63" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_P256: &str = r#" +{ + "client_s_pk": "a9ac3a604ad9cfd9cc4622d85bcaea49e4382e591e1ab8c2842e4a915ca4225f", + "client_s_sk": "990ad182899ef56be0925a70301bdc49656e59d5164e8495cbd72651aafd1e15", + "client_e_pk": "c1cc7e2b9c95188f88b8d2e0341827940e1db5f1d308d77401a04a516647026b", + "client_e_sk": "4bcd993118554d1fb962c8ad512e098a1f7f2b6038d6850b1fc8a90d7efaee00", + "server_s_pk": "1bbb56f5c5667c1342f4e0c9b6efe253cd527b8fef3b830121eaf8bd415bebd0", + "server_s_sk": "4e0d3cd6a7d0bb3702c9fed7564fa173908e709a4b8f4d5eafcd4316310950e1", + "server_e_pk": "95d1917ca368373358719a1102df9b9c3a1871705b9ae716387bdd0b663a9782", + "server_e_sk": "ddcde6a33445ed8b9c44ad1420bb1ca8d323cebc21a95c268d9bfba64b739777", + "fake_sk": "2220d8c69194e24fecc57a7f968dcfe84d04d46ba90342bafd04e58c16d8c112", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "e00b3dd9ae59956a99fe97dc1369d0c1e47df57df201bd63ff5176a53bbd6dfbb84eca344a952b385b4c78d0a841c614", + "oprf_seed": "8aaca28e387e9ad308401c95ec95ee6025c8b886d3a14c1fccd0d6d0310c7e02ffa7907bd02d89e41c80a9ac33e719c7", + "dummy_masking_key": "35b15fa3fe7f84179ef257c7b635fe53364704cc03945f0cb8a37d33a0b9e10252d43db192d5de72b4f346b6bfbd71e2", + "masking_nonce": "84f38beab532c06c7d2f740aeb6c5cf935d3ba191e1467de6cbca39d88047f2adeb4e694f685d928c181a7f40aab42a790539c340bbe2802fe782e0a1cf573ff", + "envelope_nonce": "660af573937e8277836b5de2a5aae18a1d414733c850f6d593a6c68753d48ed9", + "client_nonce": "e357100d8fc6022beec7c84234d884d1cea28f685783d7b86dfd9abdd5a62248", + "server_nonce": "fc388c272f0ce88d871166e9b8617dea5f58c3537ece71b36f808f644c13e755", + "server_sig_rng": "bde1bd41633ca6ca075b01f58c33f8c3f46ca866812e4a8351edb576c5dd2e1a", + "client_sig_rng": "b8613c921a5127def4881906747fdd618e139fd656f09e7ae03737b09ce20a45", + "context": "636f6e74657874", + "registration_request": "035310beeb25711caa2c82bbc4320f53059141832194d5ca36de1868d3e957f4a6d71293de6fb7fbe7e70851917e54c834", + "registration_response": "023992068aca37eabf25bbecc5755fd52d76518e03f7958c23a3974a3d0467aad6654b089ecd1312bfc49ca0251031d3f61bbb56f5c5667c1342f4e0c9b6efe253cd527b8fef3b830121eaf8bd415bebd0", + "registration_upload": "3f2eb864580c88549962ea0c4240ec5155695be3d769d76e5e7c2413cd49c2a7a5e6a26e0ff62b9def9cd032f4cf7ad54d672c885d74e3cb477bbcd0a9d2801b539688f2aae6024de49a0ef49998f751990ad182899ef56be0925a70301bdc49656e59d5164e8495cbd72651aafd1e1554f4392651249f96752104d88be6bae359b4c9264c25d0356cef0f54cd1e75a654148ed6a838a0d0696825eb531a5679", + "credential_request": "035310beeb25711caa2c82bbc4320f53059141832194d5ca36de1868d3e957f4a6d71293de6fb7fbe7e70851917e54c834e357100d8fc6022beec7c84234d884d1cea28f685783d7b86dfd9abdd5a6224802d3be0c54f4ebcc2231b4513c98ce041c4bb7a094c3ee4e5263c3c38f56a8cbf6", + "credential_response": "023992068aca37eabf25bbecc5755fd52d76518e03f7958c23a3974a3d0467aad6654b089ecd1312bfc49ca0251031d3f684f38beab532c06c7d2f740aeb6c5cf935d3ba191e1467de6cbca39d88047f2ad4f89f9df89cfcc67a2e52cb6b01f3cad7a7d0a1ccff2df893133d4e1b379fe3ec4122716fcde15026684f1fe5bbcf59d269210e0703eddd97e5a9bae93a6cd1d768842c287b55144d12c954ee933aa13c5389e26c80fb9444e127dae2719018d6869c27b05647c85a59b172dd8e2b32ddcde6a33445ed8b9c44ad1420bb1ca8d323cebc21a95c268d9bfba64b739777021e3a8343061fb00e8b4acd96d35345bcd9ff5f9ce586f2bb08a53469ce0ba06e1b08b9ae310c7270387dab5c262ccd3789bcf21b4d415e188629e504a8443eea28254b6cb89fa8323a2d2818c3fd4ac66ede3be392f7157e6ed656c389a12e07e795f716a66ce5782789d3207d9784f4ec18e54b01f7bd1466649fc52231f2a4", + "credential_finalization": "39378a05d53aca90d6d6c637b8a8e74a5bcdf062ea15d823b6d48d33ebd3788673d287aa5dce3c5eae995e7e5c2ab158e6c4c189ec14c6c3575079a1dab51f0ccc9e0ed253ab7515668335186b063811065290bac258034ae220fcbc515f04b3", + "client_registration_state": "e00b3dd9ae59956a99fe97dc1369d0c1e47df57df201bd63ff5176a53bbd6dfbb84eca344a952b385b4c78d0a841c614035310beeb25711caa2c82bbc4320f53059141832194d5ca36de1868d3e957f4a6d71293de6fb7fbe7e70851917e54c834", + "client_login_state": "e00b3dd9ae59956a99fe97dc1369d0c1e47df57df201bd63ff5176a53bbd6dfbb84eca344a952b385b4c78d0a841c614035310beeb25711caa2c82bbc4320f53059141832194d5ca36de1868d3e957f4a6d71293de6fb7fbe7e70851917e54c834e357100d8fc6022beec7c84234d884d1cea28f685783d7b86dfd9abdd5a6224802d3be0c54f4ebcc2231b4513c98ce041c4bb7a094c3ee4e5263c3c38f56a8cbf677eca36a63d40a52f8e2e2a253e6d75a91c55bc4ef838dd1d3ec43b1eb63eb24e357100d8fc6022beec7c84234d884d1cea28f685783d7b86dfd9abdd5a62248", + "server_login_state": "3f2eb864580c88549962ea0c4240ec5155695be3d769d76e5e7c2413cd49c2a7a7d18f71f27cf4f1ca2b86da0813449bf67ccaccd25ea93fd7dd48c6162d70c0035310beeb25711caa2c82bbc4320f53059141832194d5ca36de1868d3e957f4a6d71293de6fb7fbe7e70851917e54c834e357100d8fc6022beec7c84234d884d1cea28f685783d7b86dfd9abdd5a6224802d3be0c54f4ebcc2231b4513c98ce041c4bb7a094c3ee4e5263c3c38f56a8cbf6023992068aca37eabf25bbecc5755fd52d76518e03f7958c23a3974a3d0467aad6654b089ecd1312bfc49ca0251031d3f684f38beab532c06c7d2f740aeb6c5cf935d3ba191e1467de6cbca39d88047f2ad4f89f9df89cfcc67a2e52cb6b01f3cad7a7d0a1ccff2df893133d4e1b379fe3ec4122716fcde15026684f1fe5bbcf59d269210e0703eddd97e5a9bae93a6cd1d768842c287b55144d12c954ee933aa13c5389e26c80fb9444e127dae2719018d6869c27b05647c85a59b172dd8e2b32ddcde6a33445ed8b9c44ad1420bb1ca8d323cebc21a95c268d9bfba64b739777021e3a8343061fb00e8b4acd96d35345bcd9ff5f9ce586f2bb08a53469ce0ba06ee795f716a66ce5782789d3207d9784f4ec18e54b01f7bd1466649fc52231f2a4cc9e0ed253ab7515668335186b063811065290bac258034ae220fcbc515f04b3", + "password_file": "3f2eb864580c88549962ea0c4240ec5155695be3d769d76e5e7c2413cd49c2a7a5e6a26e0ff62b9def9cd032f4cf7ad54d672c885d74e3cb477bbcd0a9d2801b539688f2aae6024de49a0ef49998f751990ad182899ef56be0925a70301bdc49656e59d5164e8495cbd72651aafd1e1554f4392651249f96752104d88be6bae359b4c9264c25d0356cef0f54cd1e75a654148ed6a838a0d0696825eb531a5679", + "export_key": "b149e161b2b306c73f2b2ae37470caeb3e7169579555c3037a74c4eeadb7d9403f49c67a1d015b235873a3e5e4e4dc38", + "session_key": "a7d18f71f27cf4f1ca2b86da0813449bf67ccaccd25ea93fd7dd48c6162d70c0" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_P256: &str = r#" +{ + "client_s_pk": "cbc8c818f6fc93b0971cbb4bb034f6acf65f93bf6281a30a641ab60337930582", + "client_s_sk": "802e7053ca56bd99492870a94e1ed12d518be51fa12caf579d14244d785a7603", + "client_e_pk": "ad09e90f78c4de5b18251d5bb2f5ec81679437bf1bc65f3544a92b855a1623b4", + "client_e_sk": "49144133582a8bad60757c4b86d4df56de3de1c16b09651ecfd70c26bc5d94ba", + "server_s_pk": "55a75c06aaf7b53cfa3dd0f44c985d15599b01c3def5ed2aeaafac6a0f68bf42", + "server_s_sk": "11f677ba396e0045bb6825cc528a9d5ed44de6e08f6bb2251ae103c8bbc5a1af", + "server_e_pk": "e562ac411467b91f961475071023e6ced3534427e5f7ff50ffaa0ede9dcf68e9", + "server_e_sk": "b6b7401e9fcdabfeea480340f3837aebee3f0971724b22f7230d63f3e74d6a0f", + "fake_sk": "7b51a6af23fa536d8248d0e47e27992f3e51645ecc9d5e6b48a90b07328235ed", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0121f0b96cea04de9f31a1689f8de9324b2f790acba264835fe7865c82b60637f7c3bc845739a27aea528a7754aabaf197c4f8d1003f73a61bf3e2b67dec3a130f8a", + "oprf_seed": "4c7b450a0216fc697548191909849ab5a75c1dacaf4d8f3ac6fb276af50179f5bf25606d8aca08ec3f70b30a18378a13e1bd366b32cee69422ce8573f9eb7c9a", + "dummy_masking_key": "ff19e2bd09bd68a4148cde603e9b49829f78d0f641f7d1de9eaebcd39455d9cf6405486d05655d7ade364390efc1a4cabb9c6a7d53dc3fbafc514a4f509f8a62", + "masking_nonce": "7290bf6cf8848fc8375e18d277dbbc653d2d01511cff6c0cfcf29cc3320ccd0ad5059b734e1b30bcef384514abc8a9308484007751676a11e27d4e69e9a749d6", + "envelope_nonce": "6a086e1338dcb3b0924fba198304512d4419626e1549f39930863427573770be", + "client_nonce": "415c6475a17aac619aa945dc6170e1836afa33b815934d04beaf53af52a127cc", + "server_nonce": "4ad5ace5f183809aed4e9694f474cbbaa61020462dc4295a26db65e39b8018e9", + "server_sig_rng": "924e413a5b9c0ca43540b0b2932bb1568d26ddbfdf72d03421f75213fca0696c", + "client_sig_rng": "30072be252c174831294401d8670360495b56b8431433ac4e948846a799eb379", + "context": "636f6e74657874", + "registration_request": "0300cd10d2139c11e4a716c7178c13bad2acf33784a381b62ee73aaaf9b599a3e088cbd3c00f67ba0cff73fa314d3ae50d2f07c0c1f6db41bfba8b49635bc6bae78fe0", + "registration_response": "02013af9ad292b775448e14104af2c903bde3225e7f0971b513f0a2233b81fcb57cfdd7d830929e94acb6c75549a2de137a444c84b2b35e8f3eb3193ed151922b2dbaa55a75c06aaf7b53cfa3dd0f44c985d15599b01c3def5ed2aeaafac6a0f68bf42", + "registration_upload": "15adac0b99a72989d947b4ab06f0d03a108c17ed937a3e7ab3174eedbf7cbe2fef4204c20156593a68b2e5962829bc334b0fc13ffaac783e33ef9274d6ab0aca347388502f3290c7169e38390e51b4ae8ee51ee6c0e4fec4b084f2f27afe26d5802e7053ca56bd99492870a94e1ed12d518be51fa12caf579d14244d785a7603aaed3ef0842fb1ad436261a1797e202c8f83651ba1ce2e638b85b07a34adc258dcff3248c625e70871e61889aa90c442075be2c2462cc1a79458000b89c9e08f", + "credential_request": "0300cd10d2139c11e4a716c7178c13bad2acf33784a381b62ee73aaaf9b599a3e088cbd3c00f67ba0cff73fa314d3ae50d2f07c0c1f6db41bfba8b49635bc6bae78fe0415c6475a17aac619aa945dc6170e1836afa33b815934d04beaf53af52a127cc03f53d33c50e7fc17926c0f59fa1d2d8a77fd337696fc97d0867205c0d0a5bf322", + "credential_response": "02013af9ad292b775448e14104af2c903bde3225e7f0971b513f0a2233b81fcb57cfdd7d830929e94acb6c75549a2de137a444c84b2b35e8f3eb3193ed151922b2dbaa7290bf6cf8848fc8375e18d277dbbc653d2d01511cff6c0cfcf29cc3320ccd0a7af7cecc1371a926b7a3ef85443377007c65b8266934e50350ef66f0e4bb993c846bdba38c1d102ca0a1859b45cae11c869c6a27dff61275f24db48a2fc2310b6b18340b309c7fdad8cc21b999750e89137156dd2a7553521aeb6aad787fa1daa8ec15bc6b55c9c42e1a188739a0ee3b25df48b80a7e65a489883939f2422358b6b7401e9fcdabfeea480340f3837aebee3f0971724b22f7230d63f3e74d6a0f02be5ed3e6dde70f6d0dfdfe0e2a4376adb7311743be846dfa52b1f26c2ef2885ccdcaadd23b278352f5ca14da8da36169330a5c97653668612eac45a1583c3475c61c1255b72edad00e2aad77f06c2213cdcf49a25ac647aac00722008942590d98d38b1c23fa74519a169acaf3ba986d73f4c4e8a7044c3826e1976aa6f2aaba", + "credential_finalization": "fdc7c34fc78b8cdf763ee7a4f80d443d9c7216f17c91977b02be19de104127d0edff9d4d6005ebe68458ef40139f7df0f3b4238122c832747778911bc05da000ef56315fdb71a2c44209925ae148448c6794474a90b57e4d329d6bf48911a089", + "client_registration_state": "0121f0b96cea04de9f31a1689f8de9324b2f790acba264835fe7865c82b60637f7c3bc845739a27aea528a7754aabaf197c4f8d1003f73a61bf3e2b67dec3a130f8a0300cd10d2139c11e4a716c7178c13bad2acf33784a381b62ee73aaaf9b599a3e088cbd3c00f67ba0cff73fa314d3ae50d2f07c0c1f6db41bfba8b49635bc6bae78fe0", + "client_login_state": "0121f0b96cea04de9f31a1689f8de9324b2f790acba264835fe7865c82b60637f7c3bc845739a27aea528a7754aabaf197c4f8d1003f73a61bf3e2b67dec3a130f8a0300cd10d2139c11e4a716c7178c13bad2acf33784a381b62ee73aaaf9b599a3e088cbd3c00f67ba0cff73fa314d3ae50d2f07c0c1f6db41bfba8b49635bc6bae78fe0415c6475a17aac619aa945dc6170e1836afa33b815934d04beaf53af52a127cc03f53d33c50e7fc17926c0f59fa1d2d8a77fd337696fc97d0867205c0d0a5bf322c5324e48a2bb9c2fd24d22e169e2c2e5e3800d3b6fa75bb7f14a05617fbc8bb0415c6475a17aac619aa945dc6170e1836afa33b815934d04beaf53af52a127cc", + "server_login_state": "15adac0b99a72989d947b4ab06f0d03a108c17ed937a3e7ab3174eedbf7cbe2fe7d5a0a02bb75b3aa2a68e9b2bc08dbc6d2975794cc10c08e619d7bfdc5627490300cd10d2139c11e4a716c7178c13bad2acf33784a381b62ee73aaaf9b599a3e088cbd3c00f67ba0cff73fa314d3ae50d2f07c0c1f6db41bfba8b49635bc6bae78fe0415c6475a17aac619aa945dc6170e1836afa33b815934d04beaf53af52a127cc03f53d33c50e7fc17926c0f59fa1d2d8a77fd337696fc97d0867205c0d0a5bf32202013af9ad292b775448e14104af2c903bde3225e7f0971b513f0a2233b81fcb57cfdd7d830929e94acb6c75549a2de137a444c84b2b35e8f3eb3193ed151922b2dbaa7290bf6cf8848fc8375e18d277dbbc653d2d01511cff6c0cfcf29cc3320ccd0a7af7cecc1371a926b7a3ef85443377007c65b8266934e50350ef66f0e4bb993c846bdba38c1d102ca0a1859b45cae11c869c6a27dff61275f24db48a2fc2310b6b18340b309c7fdad8cc21b999750e89137156dd2a7553521aeb6aad787fa1daa8ec15bc6b55c9c42e1a188739a0ee3b25df48b80a7e65a489883939f2422358b6b7401e9fcdabfeea480340f3837aebee3f0971724b22f7230d63f3e74d6a0f02be5ed3e6dde70f6d0dfdfe0e2a4376adb7311743be846dfa52b1f26c2ef2885c98d38b1c23fa74519a169acaf3ba986d73f4c4e8a7044c3826e1976aa6f2aabaef56315fdb71a2c44209925ae148448c6794474a90b57e4d329d6bf48911a089", + "password_file": "15adac0b99a72989d947b4ab06f0d03a108c17ed937a3e7ab3174eedbf7cbe2fef4204c20156593a68b2e5962829bc334b0fc13ffaac783e33ef9274d6ab0aca347388502f3290c7169e38390e51b4ae8ee51ee6c0e4fec4b084f2f27afe26d5802e7053ca56bd99492870a94e1ed12d518be51fa12caf579d14244d785a7603aaed3ef0842fb1ad436261a1797e202c8f83651ba1ce2e638b85b07a34adc258dcff3248c625e70871e61889aa90c442075be2c2462cc1a79458000b89c9e08f", + "export_key": "10372e65dd37d9da1c6ba04c2fd83d41acf87b44717341931ee7bc1d9ecab715e5b7b953f9fc12f0c20e5babade5af302821fb48d27dd5f6e28f93056bfc447a", + "session_key": "e7d5a0a02bb75b3aa2a68e9b2bc08dbc6d2975794cc10c08e619d7bfdc562749" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_P384: &str = r#" +{ + "client_s_pk": "81bfd323af46165baa31d1c970e118d4ea0b67c15c8cd1ccd3c285e442182f58", + "client_s_sk": "49362c56efd8d0bb4668f905c02e71d7f1094fc274f3d254079df817749a640e", + "client_e_pk": "2841413458159d98e3feb23f30f3aabdebd5b3f13ed6493c5a0b3975a0fca53c", + "client_e_sk": "b88c982e802fb403a799c7dbdd15f1ecc201e84f42f569942257031b101c048e", + "server_s_pk": "cf2f75a6995777ec804572dfcd51481307c3e8f2c81d6f20d88c3f9fd36ed048", + "server_s_sk": "7ba0b546b0f06dcc9b552399010de05204cf04280574ff36525f8877a9053ae7", + "server_e_pk": "1d8c3a0ca580853712234fb118becbfd49d9c742842a08e4ad0779eeab40c801", + "server_e_sk": "75b0449a5923b5e40b5af83d5b7d458bb9a0bb0b2b288f9fcfd375db73c6eba4", + "fake_sk": "4585deef0a694a71bfe1dd60124ba389600c7073c92b14e0f233f87842274075", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "14045eda6ae230f03fb9021c2373a472ab12ffb7726b8bb74eae9b715ec3a804", + "oprf_seed": "46458100f5fd8989a7996ef693b1619b7fe85d8187cd53a47d0f64951f7caa9f3b612059139fa4074d7191d7c5c818bcc9beb4fd40bdf038a288e8bd841a5009", + "dummy_masking_key": "1f341920b1ef3ba613fe3817d5bb9917313bcfd2748b1a4f47a61f1f74e9bcee3dc982991979062ae7b0ec1b73003fec2e7c4159e7b09b74469c175a2bc4d57b", + "masking_nonce": "5e60130dc84887179586a67ab774885bee870259f5fe0ee46c13caf5e9d46e0bbf8b212fc2361e02eee712966c1b92d3306174032e86803bdc9dea7e1de10259", + "envelope_nonce": "14b1329e89a51363620a708f511f6f29f37f2c589d2f2c4fea45b1ffcfabae99", + "client_nonce": "5c3d1298f5d6ffcb12ac42fe69dc2cfe5254c6c9c0dd88848517210fddbc63e2", + "server_nonce": "003247efa72fed6deaf1115cf536c448f3ce7cd38b019f5d53a0b2bc2f8cbb89", + "server_sig_rng": "b030379472f313af0995838beb9e7b0b413794355c6793b6559f52783d4f9132", + "client_sig_rng": "14086f50f0cc810297997c0cd30938ea58e974691eb10c677d61e0c737d62fd1", + "context": "636f6e74657874", + "registration_request": "a89a5fa4fa7883570fcf731a484377451e16c8ed564105bac56e8a7312f45e6f", + "registration_response": "cabd00c761b9ab175b68024cee479aeeef77ef2b2f3076b9f9a1f98cf284dd76cf2f75a6995777ec804572dfcd51481307c3e8f2c81d6f20d88c3f9fd36ed048", + "registration_upload": "13ef0757eb9fc8dbe6f4a6e80320fae6fc36bc937338241d25d0c5b19781f22bce4fe9150952ca0d7365ca17cc824562a20cd1180e97650d1e23b225c24f2f0378c2a0d3326654b6a02f4420946119cee12b000542b6c528c57500694bc5ec9b49362c56efd8d0bb4668f905c02e71d7f1094fc274f3d254079df817749a640ee9f44137aa3efbf757db952c78b31623321701df586220dc44614afbbd36782ed539315a71d4b355f124890775ca92412a1470066b7585222bdbb45f3bd9abf3", + "credential_request": "a89a5fa4fa7883570fcf731a484377451e16c8ed564105bac56e8a7312f45e6f5254c6c9c0dd88848517210fddbc63e214045eda6ae230f03fb9021c2373a47202b8f5e7e54b06b8ac22e89e75a785eedff7fc5ee1f836bedfeeebf0695441bbe9ce5a5eded02693a6bc1b9ec78aca3565", + "credential_response": "cabd00c761b9ab175b68024cee479aeeef77ef2b2f3076b9f9a1f98cf284dd765e60130dc84887179586a67ab774885bee870259f5fe0ee46c13caf5e9d46e0bfd97c040f75c9f6716606f4e984c7ef0c10f30a3466714ff3fa7fc542382369b7d25dd77e2d4ef919764d317c563559e8114025dfa5a051ad63ed0ba7512ee1263f9dd3327f937a51efbea8348f96bc0bb9b6c0a09d384ba4b28d7aa33cc4cf3f89b6ca94cdd12150e41bef04af6aeec5d704f5320c2cf55f662e0d334078bc3b9a0bb0b2b288f9fcfd375db73c6eba4003247efa72fed6deaf1115cf536c44803a7704b54a1561506fa6b83967d35bb8c16568a1e23c7c7dfd27432dd281d8e4d9e25bcdb053026b08dac0d117e7d681638b9ff571ec359afb63bb81f9a01a2c68182ac852384f9964f64283e49f0afbea775bfaf7411ec30a0f108e6d615c14c6a613e244f9027f9fdf78647b87a6e0535910173ee26805cd355088ee776c925283e3d64e19598c9e46d157b77231ba0dbf9f51990df81929a3519502cab37bc", + "credential_finalization": "d5966bb0636408a9c0f339cf1230e76ac6e5f9e3369ddc0094d36dacb69cc3b3281941df17cd5e36ef73101dd96ea643d03e7dc8a76409ade2d8e0983e2c150c72007d6b4965414d793efb9d0a392989736015faccfb00729d162a9854b3b10df6ad10121635cdaed75e64122838ab46", + "client_registration_state": "14045eda6ae230f03fb9021c2373a472ab12ffb7726b8bb74eae9b715ec3a804a89a5fa4fa7883570fcf731a484377451e16c8ed564105bac56e8a7312f45e6f", + "client_login_state": "14045eda6ae230f03fb9021c2373a472ab12ffb7726b8bb74eae9b715ec3a804a89a5fa4fa7883570fcf731a484377451e16c8ed564105bac56e8a7312f45e6f5254c6c9c0dd88848517210fddbc63e214045eda6ae230f03fb9021c2373a47202b8f5e7e54b06b8ac22e89e75a785eedff7fc5ee1f836bedfeeebf0695441bbe9ce5a5eded02693a6bc1b9ec78aca3565d56ec32b18e96b0f4e3dfb351e4153b69f51156763d302c4b44566634f6caba4656fa627d479e362900ed36c57c7c03b5254c6c9c0dd88848517210fddbc63e214045eda6ae230f03fb9021c2373a472", + "server_login_state": "13ef0757eb9fc8dbe6f4a6e80320fae6fc36bc937338241d25d0c5b19781f22b00185d67c42ecd9c5b610778f0f23e8c751596e6b9b828e2141478e43f9acdc68597d3ce400f3d9914a44d28d07d4376a89a5fa4fa7883570fcf731a484377451e16c8ed564105bac56e8a7312f45e6f5254c6c9c0dd88848517210fddbc63e214045eda6ae230f03fb9021c2373a47202b8f5e7e54b06b8ac22e89e75a785eedff7fc5ee1f836bedfeeebf0695441bbe9ce5a5eded02693a6bc1b9ec78aca3565cabd00c761b9ab175b68024cee479aeeef77ef2b2f3076b9f9a1f98cf284dd765e60130dc84887179586a67ab774885bee870259f5fe0ee46c13caf5e9d46e0bfd97c040f75c9f6716606f4e984c7ef0c10f30a3466714ff3fa7fc542382369b7d25dd77e2d4ef919764d317c563559e8114025dfa5a051ad63ed0ba7512ee1263f9dd3327f937a51efbea8348f96bc0bb9b6c0a09d384ba4b28d7aa33cc4cf3f89b6ca94cdd12150e41bef04af6aeec5d704f5320c2cf55f662e0d334078bc3b9a0bb0b2b288f9fcfd375db73c6eba4003247efa72fed6deaf1115cf536c44803a7704b54a1561506fa6b83967d35bb8c16568a1e23c7c7dfd27432dd281d8e4d9e25bcdb053026b08dac0d117e7d681635910173ee26805cd355088ee776c925283e3d64e19598c9e46d157b77231ba0dbf9f51990df81929a3519502cab37bc72007d6b4965414d793efb9d0a392989736015faccfb00729d162a9854b3b10df6ad10121635cdaed75e64122838ab46", + "password_file": "13ef0757eb9fc8dbe6f4a6e80320fae6fc36bc937338241d25d0c5b19781f22bce4fe9150952ca0d7365ca17cc824562a20cd1180e97650d1e23b225c24f2f0378c2a0d3326654b6a02f4420946119cee12b000542b6c528c57500694bc5ec9b49362c56efd8d0bb4668f905c02e71d7f1094fc274f3d254079df817749a640ee9f44137aa3efbf757db952c78b31623321701df586220dc44614afbbd36782ed539315a71d4b355f124890775ca92412a1470066b7585222bdbb45f3bd9abf3", + "export_key": "463ebe6cae385352af8a728706fb616d98480bd28f54e1228a7804635d5253dd36824db2541f705d4771b7fd949c5b70b12632257be39513adfa3fa22999aa5c", + "session_key": "00185d67c42ecd9c5b610778f0f23e8c751596e6b9b828e2141478e43f9acdc68597d3ce400f3d9914a44d28d07d4376" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_P384: &str = r#" +{ + "client_s_pk": "77910d50f7802ab4a2a095d635be79467b16c7fef6a926fab3e2275ab69329d0", + "client_s_sk": "14d37b02814340657c8d80ecf5d0b4f00a2f2003cdcea83a50549b3ad1117b74", + "client_e_pk": "2e9c243e9b8665ae517cbf834eaf4c51cc2b31762e8089531948c66ff9d25d36", + "client_e_sk": "069ddbe0e70099cdef380182665407fa98ed04d86e5c095b98b06ee5f2c65951", + "server_s_pk": "d7478c67ed4710d10069c0a8805d2e5556d908aa311b79f035cc14ae6bc99f68", + "server_s_sk": "568bbe35d73da4b03e25ee3d67923c7e61d7c711f3549a53e4d4e183b33bfc79", + "server_e_pk": "1bfe60c42e18fee4c6eafe0d1aab89c9d76cdf4c7d76c8c83b696171123a25d0", + "server_e_sk": "45bb0d3a93c89386a994d127ed0a5ade8eacb500b48da50170a8c5fdf8465701", + "fake_sk": "7d02fe5adb7169eec5693a08611604875539de2b29994fe56bc48fe866a60597", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "8a265333d10541446a10c0c14a5346021c173dd6cf098fc347f184c6b524e1db", + "oprf_seed": "5485a3a54b87e1b5aed706413286c1804e706f1680207afcb9d6c7df9434f4af", + "dummy_masking_key": "b369aef8c518e6dcf0325e8d7d9fa7d1278ac2bd130b11a433b6e9fbcb65c307", + "masking_nonce": "8e67807009af36629d573879a0b77dc4f14abef11fa7ac367ba0ca6184523caf3a6526e96327edf5c45f7ddfebb62feb6208f47b69d50ddf99c0748ee0c11433", + "envelope_nonce": "67389de14fbd1691eec18a536d31ee4925bd95b535fc7fad1f9b90256c02b21b", + "client_nonce": "d25d81bd5ed02d2ee1e4ef6b700ea55d628a9e6d232309aa5c7d3828467076dd", + "server_nonce": "e25dc63cf9ed57545c64b4ac18478c7c99b99c8abf1ed0194886d556b921d6b4", + "server_sig_rng": "6db13dde9c4b47485e3313453de7efe1a4e0ea32677222083e5f83934d0869c5", + "client_sig_rng": "3802ad8ebb391c26d3b8640c2ac5ccd5dc64eb4ad3b9e2d119c655490bfdcbbb", + "context": "636f6e74657874", + "registration_request": "03065dc2d227f22368b27ba94bbebcf16a514df5dffadaeb35a6c29c55759e852a", + "registration_response": "02e4d677bd37e6b9d0a8d818bc923d142a63d6c8c217855ecdfd07acc4cda9a5dcd7478c67ed4710d10069c0a8805d2e5556d908aa311b79f035cc14ae6bc99f68", + "registration_upload": "f0a93b5f83af1abbaa9a78a83bc9058e66655d6635b98fd2cf1eb81191ab8470f072bebc9bd7b79f9268c6a324ffc062f208a480cb675e93da693e2cea011d6014d37b02814340657c8d80ecf5d0b4f00a2f2003cdcea83a50549b3ad1117b740d69bb4b37c27124861d8cbc7a9affd4c66e4ae5ec2d3317079fd710f78cf618", + "credential_request": "03065dc2d227f22368b27ba94bbebcf16a514df5dffadaeb35a6c29c55759e852a628a9e6d232309aa5c7d3828467076dd8a265333d10541446a10c0c14a53460203afd2e4f330f295ab072f815390f5e8ae2362b48bfac582262bee1715ceb23ba8997a6675fd457d4b8b967cb64d777c0d", + "credential_response": "02e4d677bd37e6b9d0a8d818bc923d142a63d6c8c217855ecdfd07acc4cda9a5dc8e67807009af36629d573879a0b77dc4f14abef11fa7ac367ba0ca6184523caf2a5558ba0737d99e5c84b1416c4cee4876adc5f3fbf6ea9f5a206945d0b76e7fdefbb0cb91db32fecff7c1c02b87091874d35cbc26e5d08b39c0cadfe8d834ae8c4323743275c45f8e9e576339bc92e61beeff5a5d89902af768ec6c4db1c0fe8eacb500b48da50170a8c5fdf8465701e25dc63cf9ed57545c64b4ac18478c7c027d9adea747ce88d69e0424007cbe63eeb089896a3b8244b752c4cbe63037a19a865342c2c212e9e6b41df3c7b1306403f3844358cdfca05bc2a76de3b49c77035960d63ff95d5183d284fec5b7c2243a5ab4befb64d8f8ecb44099717130ae5321859ce91cd3fca4967c7b43933ef2049cbe79887e0e014014ee1d9672325e45db85f01259145a293570792636d82367d083a4949b4d4d3e0172bcc07585ba7d", + "credential_finalization": "8b76f46d736eff152c2dd3b10a8d8a778cc6f54c646121b96987b3d03592b6071fac1c416f7da6f8a03d33996c94404cf42ef803e3652c6e3aa2c61e555c050282fc47449767dc9a870d49eaf6d347d3dd86c8ed0be6995a230082e242b3f3b0a05500c0dec85051398fc8363465a4d2", + "client_registration_state": "8a265333d10541446a10c0c14a5346021c173dd6cf098fc347f184c6b524e1db03065dc2d227f22368b27ba94bbebcf16a514df5dffadaeb35a6c29c55759e852a", + "client_login_state": "8a265333d10541446a10c0c14a5346021c173dd6cf098fc347f184c6b524e1db03065dc2d227f22368b27ba94bbebcf16a514df5dffadaeb35a6c29c55759e852a628a9e6d232309aa5c7d3828467076dd8a265333d10541446a10c0c14a53460203afd2e4f330f295ab072f815390f5e8ae2362b48bfac582262bee1715ceb23ba8997a6675fd457d4b8b967cb64d777c0da58a69e39de817859b61fe2efe44910476a766329fa420ef5faae1a54f5513ff5f411bb40bb983c771e118234aed2b1a628a9e6d232309aa5c7d3828467076dd8a265333d10541446a10c0c14a534602", + "server_login_state": "f0a93b5f83af1abbaa9a78a83bc9058e66655d6635b98fd2cf1eb81191ab84703c50b737f1f91f8362a89c2cc6eed90745d4d34b24de5b014ff3c24a9418000a6d4d9d258f20f8cfb1b985d48e3d690503065dc2d227f22368b27ba94bbebcf16a514df5dffadaeb35a6c29c55759e852a628a9e6d232309aa5c7d3828467076dd8a265333d10541446a10c0c14a53460203afd2e4f330f295ab072f815390f5e8ae2362b48bfac582262bee1715ceb23ba8997a6675fd457d4b8b967cb64d777c0d02e4d677bd37e6b9d0a8d818bc923d142a63d6c8c217855ecdfd07acc4cda9a5dc8e67807009af36629d573879a0b77dc4f14abef11fa7ac367ba0ca6184523caf2a5558ba0737d99e5c84b1416c4cee4876adc5f3fbf6ea9f5a206945d0b76e7fdefbb0cb91db32fecff7c1c02b87091874d35cbc26e5d08b39c0cadfe8d834ae8c4323743275c45f8e9e576339bc92e61beeff5a5d89902af768ec6c4db1c0fe8eacb500b48da50170a8c5fdf8465701e25dc63cf9ed57545c64b4ac18478c7c027d9adea747ce88d69e0424007cbe63eeb089896a3b8244b752c4cbe63037a19a865342c2c212e9e6b41df3c7b13064039cbe79887e0e014014ee1d9672325e45db85f01259145a293570792636d82367d083a4949b4d4d3e0172bcc07585ba7d82fc47449767dc9a870d49eaf6d347d3dd86c8ed0be6995a230082e242b3f3b0a05500c0dec85051398fc8363465a4d2", + "password_file": "f0a93b5f83af1abbaa9a78a83bc9058e66655d6635b98fd2cf1eb81191ab8470f072bebc9bd7b79f9268c6a324ffc062f208a480cb675e93da693e2cea011d6014d37b02814340657c8d80ecf5d0b4f00a2f2003cdcea83a50549b3ad1117b740d69bb4b37c27124861d8cbc7a9affd4c66e4ae5ec2d3317079fd710f78cf618", + "export_key": "5a976bd3d96e38df75210811614a25ede805f7a62d15b3ac97cb02bab9494b2b", + "session_key": "3c50b737f1f91f8362a89c2cc6eed90745d4d34b24de5b014ff3c24a9418000a6d4d9d258f20f8cfb1b985d48e3d6905" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_P384: &str = r#" +{ + "client_s_pk": "36fdb549fc4ff049f0784d81784414142f18df957c16efa41dfd2e2348e1db3e", + "client_s_sk": "c53dee517fc0746fda1d967a6ffe52ed377587a586330fb88a01b6f9c79fb8b7", + "client_e_pk": "843454521dcd4e0b1e6d405c84f0084afb123a7384fe4c5bd8edeff21157eb63", + "client_e_sk": "2cbde7aea3708d47022bac3ad03e317b59e7813001025f846246a4540cf5fe65", + "server_s_pk": "ded87995bb8d7e861a3da81316c2af2a8757fa72a2224711217ca61ddfb06ece", + "server_s_sk": "c9bd8bcf6afb03d5d2a7468cce54830d9b2caf99f57107159bc09204901508e2", + "server_e_pk": "1cbc3ac30775491d670124d9f1c6dd86c25218beab4be4ba4f22ef2476841210", + "server_e_sk": "14781ea8edfd2eca20d979c3bb91b9d2aa0a910a662736345bb525a4df57cc5f", + "fake_sk": "61cd1bb21f0d383dd87a16a0bb5b442a2528b414a3aa346e23d996a43dcb85bd", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "db3487cfabf0e8f2171ab0e9c4daabeb0257c261dc35a3932fe98006db0b97304cadf0ead4a791b14714957197bb5972", + "oprf_seed": "60b81742066a62dc619a4fa31f4d98b1ebcdb37fe0434972cc306e5ddbadf48ba6bfe9b8bb96de6d5ff912f387c4c07e", + "dummy_masking_key": "ee43c923cc1c2b98c9205c19b50bdc96d23f3df0d310836a5dd0e718e4506c49f9b0e71a7ade416af6d98ba7577be86b", + "masking_nonce": "54bbc75f366ca8786a499baa413b346fb5682403da626d8c495a64e9b36970cf1df0a83e79d05e8f31237473824dcd88ebf5d9d37a5e7924dadb39254bd57770", + "envelope_nonce": "13553d1d3174cd1b76f88436d78c8a12cc0c7afb09f07d446926b8bee3a106ad", + "client_nonce": "8fd5b18fb42db2d1d3881c72ffc76c63abb8dc0cf0f5bd4b7572b0891c0ae8ea", + "server_nonce": "d90a70a2477f0f162b4ab30242c069309f445258722e7e3657b49236fcd42c9c", + "server_sig_rng": "09b656d08e50bb49657f91d9fb97c9f90c4790b3b6eaf04c639d8b37812a5244", + "client_sig_rng": "a68d4a07eed06be96d9426d8d4469001a16f9f89d7098a221ea77afbf15ae2a4", + "context": "636f6e74657874", + "registration_request": "03c55a51851c383b7e7d67c377270ee5b373a1e7046158fe2cc14a59f57bd0f89abd18976f3df6364e5ebafc4ea7e6ef47", + "registration_response": "0243e33991061696474b78a13419ca97867b5997e902c95e0de4a05f7659fa8629d9761a7bf9ae6aa7df919afca71b98a1ded87995bb8d7e861a3da81316c2af2a8757fa72a2224711217ca61ddfb06ece", + "registration_upload": "bc84fcf90f8ae6b28cf8c24314a0fd34841db421f222e7796da8bacc4962cf1adc55b26db8214aed8f289337df7a8da3a0ce9022a9b40de70945cb95f8cd3328d55c7834a0e8a113d3fc80af116aa0f5c53dee517fc0746fda1d967a6ffe52ed377587a586330fb88a01b6f9c79fb8b706a007d8c1933f83cd26d94675f8617e968ec934271e8c1f96ebcbf4674db36e7b7cc724ae99b1b95077a9b359e75012", + "credential_request": "03c55a51851c383b7e7d67c377270ee5b373a1e7046158fe2cc14a59f57bd0f89abd18976f3df6364e5ebafc4ea7e6ef47abb8dc0cf0f5bd4b7572b0891c0ae8eadb3487cfabf0e8f2171ab0e9c4daabeb02d438deb44c1b1678c2f7663c92c67643bf61f8b299c7e9cbc0045acbb33a9965ee7e1e07c0c8296553f229b7ba225aa8", + "credential_response": "0243e33991061696474b78a13419ca97867b5997e902c95e0de4a05f7659fa8629d9761a7bf9ae6aa7df919afca71b98a154bbc75f366ca8786a499baa413b346fb5682403da626d8c495a64e9b36970cf3d0bafef68642c76cf8cdcd059f8ed55f88bfd1b85c313d8861f2674467b0355f28958f12eff7d79e81cd5ecc69deaeee7279f8b7eae6ac39e37d1463ec66e95286da6fa25badd2b75a8c52f0cdeda0c88a9fc8388d19fc27c360e4ca92a82a5f63472cc32f3ab349a399533d38e529caa0a910a662736345bb525a4df57cc5fd90a70a2477f0f162b4ab30242c0693002fabf54a618b0fde233d9ecc2465e64085a10c4f1caec62814509fe2ebb3f7700af028f7e4b38c6879dc8523546c026f7ec4a4b48dc209747f7de34e8f481a3e6e64ff6bd6b6168c8a4fd8c72558f0a33a9486b6d5a810cb820c3a9f32b9b865310faec8e7d6646a4a3c2d521268c46052f3b68f9cc9308af17cdca8286c87ecb730f2f1ed5146ecbaa71fed9b2cf127a5171ca231b666eac5044b7777790d24d", + "credential_finalization": "459b93c9cf8b10b333b063c473114141bd51c525fa3a9c3d8366ddb15c4f3cddb013365efd40312133445c43d6d3f65b9c6ddfdabbc6152deb5f57218d58c30d50a32b2522fd2380642fce46a5ec20b410fe08d8ecea7733996b04f5a8a52f5bb2ac17b8f308f00d3c99370285fa9d5e", + "client_registration_state": "db3487cfabf0e8f2171ab0e9c4daabeb0257c261dc35a3932fe98006db0b97304cadf0ead4a791b14714957197bb597203c55a51851c383b7e7d67c377270ee5b373a1e7046158fe2cc14a59f57bd0f89abd18976f3df6364e5ebafc4ea7e6ef47", + "client_login_state": "db3487cfabf0e8f2171ab0e9c4daabeb0257c261dc35a3932fe98006db0b97304cadf0ead4a791b14714957197bb597203c55a51851c383b7e7d67c377270ee5b373a1e7046158fe2cc14a59f57bd0f89abd18976f3df6364e5ebafc4ea7e6ef47abb8dc0cf0f5bd4b7572b0891c0ae8eadb3487cfabf0e8f2171ab0e9c4daabeb02d438deb44c1b1678c2f7663c92c67643bf61f8b299c7e9cbc0045acbb33a9965ee7e1e07c0c8296553f229b7ba225aa8340529db88c6de12beadf9e433846fd37dc5980f2da57264b8470b64de6b731f4ea6b929563143f410a9bb30d3c46fc0abb8dc0cf0f5bd4b7572b0891c0ae8eadb3487cfabf0e8f2171ab0e9c4daabeb", + "server_login_state": "bc84fcf90f8ae6b28cf8c24314a0fd34841db421f222e7796da8bacc4962cf1a1414e211bd0800f58761ca6164254d5bc75eab25f3f19faa7a3c558ee9d70f391176abbb3922d2d6c2f8026bbc28503803c55a51851c383b7e7d67c377270ee5b373a1e7046158fe2cc14a59f57bd0f89abd18976f3df6364e5ebafc4ea7e6ef47abb8dc0cf0f5bd4b7572b0891c0ae8eadb3487cfabf0e8f2171ab0e9c4daabeb02d438deb44c1b1678c2f7663c92c67643bf61f8b299c7e9cbc0045acbb33a9965ee7e1e07c0c8296553f229b7ba225aa80243e33991061696474b78a13419ca97867b5997e902c95e0de4a05f7659fa8629d9761a7bf9ae6aa7df919afca71b98a154bbc75f366ca8786a499baa413b346fb5682403da626d8c495a64e9b36970cf3d0bafef68642c76cf8cdcd059f8ed55f88bfd1b85c313d8861f2674467b0355f28958f12eff7d79e81cd5ecc69deaeee7279f8b7eae6ac39e37d1463ec66e95286da6fa25badd2b75a8c52f0cdeda0c88a9fc8388d19fc27c360e4ca92a82a5f63472cc32f3ab349a399533d38e529caa0a910a662736345bb525a4df57cc5fd90a70a2477f0f162b4ab30242c0693002fabf54a618b0fde233d9ecc2465e64085a10c4f1caec62814509fe2ebb3f7700af028f7e4b38c6879dc8523546c026f72f3b68f9cc9308af17cdca8286c87ecb730f2f1ed5146ecbaa71fed9b2cf127a5171ca231b666eac5044b7777790d24d50a32b2522fd2380642fce46a5ec20b410fe08d8ecea7733996b04f5a8a52f5bb2ac17b8f308f00d3c99370285fa9d5e", + "password_file": "bc84fcf90f8ae6b28cf8c24314a0fd34841db421f222e7796da8bacc4962cf1adc55b26db8214aed8f289337df7a8da3a0ce9022a9b40de70945cb95f8cd3328d55c7834a0e8a113d3fc80af116aa0f5c53dee517fc0746fda1d967a6ffe52ed377587a586330fb88a01b6f9c79fb8b706a007d8c1933f83cd26d94675f8617e968ec934271e8c1f96ebcbf4674db36e7b7cc724ae99b1b95077a9b359e75012", + "export_key": "4c86da1cb7077804cd3fc74bd5f4d4ef3d764b1acc9d4b0db001eceeee35d745b4981e1ca74ba3072298914d20bd3de3", + "session_key": "1414e211bd0800f58761ca6164254d5bc75eab25f3f19faa7a3c558ee9d70f391176abbb3922d2d6c2f8026bbc285038" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_P384: &str = r#" +{ + "client_s_pk": "06d014f662a5c2907cad54ca585c635d40f4448184235a945e96f361b58ca9de", + "client_s_sk": "2febdd281cecec27e80581f5ac6c31c5fea1eb007c04a84e74623f93f5c444a2", + "client_e_pk": "df201126e004cb9feed8dec8b5b72891d4427c886ebd8f77b3a6df82214b27c0", + "client_e_sk": "1bb26ac6de7a6c6891cf4cac85a2864a390d82ef2ae13d38bb134c36d54d0069", + "server_s_pk": "60c263b78c97256e4de5f15ab3d25113b7835cc61743c2a49a2ac1c9e58a0d26", + "server_s_sk": "39b9a46175400281167ea0c548fe859c27fb800a37d234845e021da486e0919f", + "server_e_pk": "8bd2c758b3b90f85ee219dc5bf9c75e7ca3efa0ae0dc12458c3d6a043af8b708", + "server_e_sk": "43ba4363294ceccc135a54b3d523fead9e4478fb6c9162bdb76dc330f69cb83e", + "fake_sk": "a205c82a0445863c0be6beead8e933f1f1d658ac4e2a97a121d18e887c1ccdb6", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "015607ecea48c3152385cd514027d9f62428c4db583d56e495e46dbf0adcb53442a34c17eda3a181989202a99c5e93bcd38f4a39a3f0689531f2a4e00bce7df3ba12", + "oprf_seed": "265a31c756b9073172a30332e10d5e48ffaeb39392e62986fdc277914841c84666660ff69bb0a60bbac842c413ffe63c9c3b5fc404039248fa834f9e1ace4228", + "dummy_masking_key": "12ee59e83f482be22dd5f2e8e688af58b7ded64b8afdb50a49cf82ba11bf55812e94f6d6f4e99e247a743abfb67b5359ea74fb70800ad3478349019267f3d967", + "masking_nonce": "f7487e9bffab4ee211496c917bbaeb9f57d21bf4982fa27c360c63a452955a49988519cec67eb9439de91ef824b68c0088f52497c0d61d9a049358047afbc003", + "envelope_nonce": "a1048cf6ea8795c9a757454ffc892eb675be554a36654973fad55bb33d9cfb04", + "client_nonce": "fdf7e2be4ad482b7614fe3f88a251b45803829291a0e499db06147990d5b10f6", + "server_nonce": "e3f1059572caf75a71c46b2bc4e1f62f335ee5d2eaea086a426c82b17ea80108", + "server_sig_rng": "15b4341efd9ecf2573bb241d594d0c23065438f6be2803b9174c570c44e7dd4a", + "client_sig_rng": "b4e3467df151c6e85fe236e3def3597a0fe82b7cb2b73896ab3d982e8a5e9741", + "context": "636f6e74657874", + "registration_request": "0200e58c2d7df4e0530ae71065dd5e64761d8e07fe54e8c99b2701d4147ef49a0a6c0ae2b9a1cb32f8ac5893283f71b7185ae1abdc222687648ebc12367e834434a316", + "registration_response": "02013fff9b9c62ccd8615e6a8686ca7fa42af304e8b96edcc66f3f45ec54d176b20230cec682e5ca523812434f9710efb114a98298c1d913a7d6df06fca4850812f56d60c263b78c97256e4de5f15ab3d25113b7835cc61743c2a49a2ac1c9e58a0d26", + "registration_upload": "8725308003f6144c3c4bbcea20fb62dc86e71402a25929ab16edbfd46872595dcb621c27cf6b82e5533f0cff05ec22272e0043c1758f3ce30b0aa94341fae9c06905ee931812ef1756af0d5b6183ea21fab209d635fac085775a381393710e762febdd281cecec27e80581f5ac6c31c5fea1eb007c04a84e74623f93f5c444a2b8a7942e3982e473ef261e60abda3aa3c3698b9516a5359d6bfbe3bcf8b7cc75c22917caead4ee6759d4bba289ff69c2f95683ce470f15b76ba1785cc60036e7", + "credential_request": "0200e58c2d7df4e0530ae71065dd5e64761d8e07fe54e8c99b2701d4147ef49a0a6c0ae2b9a1cb32f8ac5893283f71b7185ae1abdc222687648ebc12367e834434a316803829291a0e499db06147990d5b10f6015607ecea48c3152385cd514027d9f60222998018807309b27123cf372b6078f85d0835673e90ba32a0e2b61ec29f93b5c7f6f64fe9b284e4774f4a9d1a6ec363", + "credential_response": "02013fff9b9c62ccd8615e6a8686ca7fa42af304e8b96edcc66f3f45ec54d176b20230cec682e5ca523812434f9710efb114a98298c1d913a7d6df06fca4850812f56df7487e9bffab4ee211496c917bbaeb9f57d21bf4982fa27c360c63a452955a49d078d0cbe792fc81a4c3e57675bc83cffe8ab9aacb3e5e9447e1dd72682df2c88879d9407fb170a52f11e9051348d49ec5b708f05c8dd03ed233761e14f23c1fbb2d8cc1d9c1d6e16dcb35049bccc99c76cdda20ca0dc528a07f53d61ff04ac85aa2363970a9fcb1e5b962955ad74dce2f398b44c6b519ac214657f7212334719e4478fb6c9162bdb76dc330f69cb83ee3f1059572caf75a71c46b2bc4e1f62f030a9d76b8cadad0e2937ea4d347e6dc4bf476ff6125b1c56ad01f4cf157f570e42a8a7fccc041e7081efa36fae53a668bd1d1cd5ac400aeb6dd3840dfebec7a049dc9eb1a8e3935f5d238ea7a6fc6e234b0e294ee167707151051592ff4d471c5f3fc1bd57840edd5c93ae9b9a3a9010477b62351f8fe93eff663aee3b4ef347e9a0d7b2e5b0bb55c6a7b44ea5aaa23f29fbebd02bc8e099091ed15a45f21f719", + "credential_finalization": "ee322120448eaea48938668825fd6a18208317b5cdc77151a38a5f4a4ffb8f436f9216e4be4dd4dd774e0a590dc48fe1286dcf5e98e2578acdd0094e147c13008b21dd65877df21f625c5da4f77556c47d05cc236a5df1f57b229889912786427b56436aeddbfbf05dc4c844e43372fc", + "client_registration_state": "015607ecea48c3152385cd514027d9f62428c4db583d56e495e46dbf0adcb53442a34c17eda3a181989202a99c5e93bcd38f4a39a3f0689531f2a4e00bce7df3ba120200e58c2d7df4e0530ae71065dd5e64761d8e07fe54e8c99b2701d4147ef49a0a6c0ae2b9a1cb32f8ac5893283f71b7185ae1abdc222687648ebc12367e834434a316", + "client_login_state": "015607ecea48c3152385cd514027d9f62428c4db583d56e495e46dbf0adcb53442a34c17eda3a181989202a99c5e93bcd38f4a39a3f0689531f2a4e00bce7df3ba120200e58c2d7df4e0530ae71065dd5e64761d8e07fe54e8c99b2701d4147ef49a0a6c0ae2b9a1cb32f8ac5893283f71b7185ae1abdc222687648ebc12367e834434a316803829291a0e499db06147990d5b10f6015607ecea48c3152385cd514027d9f60222998018807309b27123cf372b6078f85d0835673e90ba32a0e2b61ec29f93b5c7f6f64fe9b284e4774f4a9d1a6ec363cb37187887d0e70bcbf1401dbe2beede32f04a9c37a6236d28baaf31b363483267805eff179948f4f88d5d91f2519f99803829291a0e499db06147990d5b10f6015607ecea48c3152385cd514027d9f6", + "server_login_state": "8725308003f6144c3c4bbcea20fb62dc86e71402a25929ab16edbfd46872595d0fd09406acd01cae22e48d61d1737fd5cd31bb803756040e2cca7b9527c581cba9cf7d64eb61c9e19ce7493e6cf350d00200e58c2d7df4e0530ae71065dd5e64761d8e07fe54e8c99b2701d4147ef49a0a6c0ae2b9a1cb32f8ac5893283f71b7185ae1abdc222687648ebc12367e834434a316803829291a0e499db06147990d5b10f6015607ecea48c3152385cd514027d9f60222998018807309b27123cf372b6078f85d0835673e90ba32a0e2b61ec29f93b5c7f6f64fe9b284e4774f4a9d1a6ec36302013fff9b9c62ccd8615e6a8686ca7fa42af304e8b96edcc66f3f45ec54d176b20230cec682e5ca523812434f9710efb114a98298c1d913a7d6df06fca4850812f56df7487e9bffab4ee211496c917bbaeb9f57d21bf4982fa27c360c63a452955a49d078d0cbe792fc81a4c3e57675bc83cffe8ab9aacb3e5e9447e1dd72682df2c88879d9407fb170a52f11e9051348d49ec5b708f05c8dd03ed233761e14f23c1fbb2d8cc1d9c1d6e16dcb35049bccc99c76cdda20ca0dc528a07f53d61ff04ac85aa2363970a9fcb1e5b962955ad74dce2f398b44c6b519ac214657f7212334719e4478fb6c9162bdb76dc330f69cb83ee3f1059572caf75a71c46b2bc4e1f62f030a9d76b8cadad0e2937ea4d347e6dc4bf476ff6125b1c56ad01f4cf157f570e42a8a7fccc041e7081efa36fae53a668b77b62351f8fe93eff663aee3b4ef347e9a0d7b2e5b0bb55c6a7b44ea5aaa23f29fbebd02bc8e099091ed15a45f21f7198b21dd65877df21f625c5da4f77556c47d05cc236a5df1f57b229889912786427b56436aeddbfbf05dc4c844e43372fc", + "password_file": "8725308003f6144c3c4bbcea20fb62dc86e71402a25929ab16edbfd46872595dcb621c27cf6b82e5533f0cff05ec22272e0043c1758f3ce30b0aa94341fae9c06905ee931812ef1756af0d5b6183ea21fab209d635fac085775a381393710e762febdd281cecec27e80581f5ac6c31c5fea1eb007c04a84e74623f93f5c444a2b8a7942e3982e473ef261e60abda3aa3c3698b9516a5359d6bfbe3bcf8b7cc75c22917caead4ee6759d4bba289ff69c2f95683ce470f15b76ba1785cc60036e7", + "export_key": "8340093cc015b9c988cee3567e9db248d925f51590bbd6edbca4a213131b2af2cea260af3f02ebfc805dd8afd7c8c644e188ec8d4e82ed6f7e3b285ae67bc3ef", + "session_key": "0fd09406acd01cae22e48d61d1737fd5cd31bb803756040e2cca7b9527c581cba9cf7d64eb61c9e19ce7493e6cf350d0" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_P521: &str = r#" +{ + "client_s_pk": "ff7f78b9ac6ffb8d40f897bd2312c58c3c77631311eeaebf4fdfb9549e3f8e78", + "client_s_sk": "cd81b41bf5e65a987b7dcbbaf4ac833b0cfefac68b08c15363d9683b9d120011", + "client_e_pk": "e252d2a95a06558edcc7adfb0e53e0ddc5276192bc9c1e465d5aaddd5a18fa11", + "client_e_sk": "28c3ffc77d78f804f204d02b632b0d9c5ff58db6eb6de2453acabc79ba723de3", + "server_s_pk": "197051f446a279c2d59a236de8ac0921898370a59522bdaad4515a1deb435086", + "server_s_sk": "bda7d981bed2b0daf7cac8bdca5b6da6165b63c52b0964611bcde7429f6d451e", + "server_e_pk": "2e18aef960ae5d80df6b627ba3238ad222b0053ca66f76706f8c58eb37a8cdca", + "server_e_sk": "491cd0630c6f865feea22f19a5f0f6863c11eb3ee23cd31280431f9fe1a72448", + "fake_sk": "f6c133d9cc7baf39cb11a07cf73abc1cd248954336e37e55e42d936df9e95e30", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "896bd9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa07", + "oprf_seed": "d1e5a5f212f53baa79f83fc3c4222f97e487acd691bae72b93e7273cf9fa5f5f0bbc86b7e335afc4ca007f951d598be3ca7cc06a6b2a35e186738368954c7a21", + "dummy_masking_key": "83685d716ca26fff48c70731bbb50ef560eb2f8c495f7c9b4680e0b91b1064111bc54b3066c22a6f89d86ecf5521571f8da2a638b4fdda2aca617c3bbd3abc3a", + "masking_nonce": "4183f5e612396c711cb2434b617065f5cf38c4b008f56bbaac0e9829bca85757571c89dd3dfddd41d33ee3509afd79d11caaed8679dd6ce3b57991fd67b0f2e2", + "envelope_nonce": "f1c5d8e41a23affae8df2da31edc46b99b914cc0d2b344294ebea4d412d88517", + "client_nonce": "4d81c937237f3ba93f0e0cda8935ec1130179a2e773e91013b2cc86737858672", + "server_nonce": "3b2363ee18dea525d07109f9292c194da129c2b7d5899ac4d95f8d2d18df55a6", + "server_sig_rng": "1b63f9990526b31652ae92ee6261b19a3148cfce0947658715d4e6b202b6fc9c", + "client_sig_rng": "88738a5966538bd211be9051753bc57c70192d2d330618229598f3172af04535", + "context": "636f6e74657874", + "registration_request": "48cd2d96a92a7d03bf07e5e2533a08dfc2e89a0908930c7d6c00d09672bae138", + "registration_response": "024e0c6e4b9748a8db1393050d01cdfcf46fda4ffec264f8179c3500b6ccf64a197051f446a279c2d59a236de8ac0921898370a59522bdaad4515a1deb435086", + "registration_upload": "405a1f1ea3dd7c7ff0f858d591c7bfc2dbc2f52bcb720ffa0d5718dcea5e60c38ca1e05c6adb255064ce7c3012e5a37a0af05009f97de5fda28bdf0a29c04c8f6f368c63b5653ff575bb81d854e8b04fd6651e928c246a115c2e9d7d5ac470e2cd81b41bf5e65a987b7dcbbaf4ac833b0cfefac68b08c15363d9683b9d12001176ce9eb8ceca3cb3bf9e9bcf347b28f7f9f18b2701a3487df6a961313b7a398a47ff41790e0d7f8147f0bce66e2bad3c85a4fbc25d9263ea6b8b5836011f4737", + "credential_request": "48cd2d96a92a7d03bf07e5e2533a08dfc2e89a0908930c7d6c00d09672bae138d9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0728c3030141838f6a6ca2d16caeee338368e7d6ef2784445fcc97ac6bd07e730cf708fdf7b528e51ec77bf7f6702dc4d34b843141945340fcb0d9c4d0869c27d06b8cc58248", + "credential_response": "024e0c6e4b9748a8db1393050d01cdfcf46fda4ffec264f8179c3500b6ccf64a4183f5e612396c711cb2434b617065f5cf38c4b008f56bbaac0e9829bca8575730befa90491896a314b0b4f45a0243777d575f2c3663fef1656464295c2cfbc30c8bccd9d0c09f3a10866f928c63ccc3d4c591193179f092d7849d7489939fb151c9636cbee8d14948154fc2eeb6e3af94acff7b0c91e4e5b8d92aae77f769b52cc0d43958661d27e2af456bbb253ffb8245de9c75beab6e7b13feedd319602c63ee18dea525d07109f9292c194da129c2b7d5899ac4d95f8d2d18df55a61b630200cd0a8d7aebbaae73601c4e0f69fe04cbe5679c2a6ac953e1426532f2a22572a822a090c6a93bfad4139035a40379d938e0977f04aa2c01a7266361edba746e1c8c13d1b71961953889f56e1fd484331455b7317fe99ae9865e5d776c7811822d45987db9839fe38549792a0b8e833cc524721a76e91323b1b134bf7e18843aff0d0105889e1fe4f8ef834f4b43cb5c634fa6675ad120cc5b0033b48d326fb7b609cec2a779f5928d29fff4db6c0556800c94fc8439601f3a60d07a6c66ce1ef69f", + "credential_finalization": "31f4fabe2162d4a115fd08df6c1a6995648c382f310d109ff4663212f521956febb27521a6b8392e5bd573985282662e09a8dcc257f02507d9bdd482a67f3b025d2a508ad8b0d41d53b197adc550de662f6e6a9dd25d52474d3cab61253c035a61132f069f74cec168808aae23a7543c64e65f927ef011cfecf021eb3d113a61", + "client_registration_state": "896bd9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0748cd2d96a92a7d03bf07e5e2533a08dfc2e89a0908930c7d6c00d09672bae138", + "client_login_state": "896bd9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0748cd2d96a92a7d03bf07e5e2533a08dfc2e89a0908930c7d6c00d09672bae138d9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0728c3030141838f6a6ca2d16caeee338368e7d6ef2784445fcc97ac6bd07e730cf708fdf7b528e51ec77bf7f6702dc4d34b843141945340fcb0d9c4d0869c27d06b8cc58248015dfb066c3babe66b071b513c70ba0631a392d20eace7f1d9c7fdb2ed3a706ad115b36e2525a509b4854aa6f693ec1d1b14a4f0a5a02f49fe1583676c626cde1abed9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0728c3", + "server_login_state": "405a1f1ea3dd7c7ff0f858d591c7bfc2dbc2f52bcb720ffa0d5718dcea5e60c37e2ce74d230bdea5566131fee17c60bdcfd38f906b62e767acb386564b2462df192e7b6739f893ac07d2408a53bc0e5a94b6a0ec5d159947a4e87739efdf419948cd2d96a92a7d03bf07e5e2533a08dfc2e89a0908930c7d6c00d09672bae138d9c763ed4d39b6c13c480b2970c78b9356cb72e9c43c082942eced86fa0728c3030141838f6a6ca2d16caeee338368e7d6ef2784445fcc97ac6bd07e730cf708fdf7b528e51ec77bf7f6702dc4d34b843141945340fcb0d9c4d0869c27d06b8cc58248024e0c6e4b9748a8db1393050d01cdfcf46fda4ffec264f8179c3500b6ccf64a4183f5e612396c711cb2434b617065f5cf38c4b008f56bbaac0e9829bca8575730befa90491896a314b0b4f45a0243777d575f2c3663fef1656464295c2cfbc30c8bccd9d0c09f3a10866f928c63ccc3d4c591193179f092d7849d7489939fb151c9636cbee8d14948154fc2eeb6e3af94acff7b0c91e4e5b8d92aae77f769b52cc0d43958661d27e2af456bbb253ffb8245de9c75beab6e7b13feedd319602c63ee18dea525d07109f9292c194da129c2b7d5899ac4d95f8d2d18df55a61b630200cd0a8d7aebbaae73601c4e0f69fe04cbe5679c2a6ac953e1426532f2a22572a822a090c6a93bfad4139035a40379d938e0977f04aa2c01a7266361edba746e1c8c0105889e1fe4f8ef834f4b43cb5c634fa6675ad120cc5b0033b48d326fb7b609cec2a779f5928d29fff4db6c0556800c94fc8439601f3a60d07a6c66ce1ef69f5d2a508ad8b0d41d53b197adc550de662f6e6a9dd25d52474d3cab61253c035a61132f069f74cec168808aae23a7543c64e65f927ef011cfecf021eb3d113a61", + "password_file": "405a1f1ea3dd7c7ff0f858d591c7bfc2dbc2f52bcb720ffa0d5718dcea5e60c38ca1e05c6adb255064ce7c3012e5a37a0af05009f97de5fda28bdf0a29c04c8f6f368c63b5653ff575bb81d854e8b04fd6651e928c246a115c2e9d7d5ac470e2cd81b41bf5e65a987b7dcbbaf4ac833b0cfefac68b08c15363d9683b9d12001176ce9eb8ceca3cb3bf9e9bcf347b28f7f9f18b2701a3487df6a961313b7a398a47ff41790e0d7f8147f0bce66e2bad3c85a4fbc25d9263ea6b8b5836011f4737", + "export_key": "fca7e7aead2db5f32f635ae10848a38444ec4b03fe9bb94668370a46e2907314c9ed346b2935fb8f815c8123c8edb9f1fddbafd540aef8ee8c22ce21b964121e", + "session_key": "7e2ce74d230bdea5566131fee17c60bdcfd38f906b62e767acb386564b2462df192e7b6739f893ac07d2408a53bc0e5a94b6a0ec5d159947a4e87739efdf4199" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_P521: &str = r#" +{ + "client_s_pk": "0eac870d3269298ae2876e7233fda6a819353fde8dc0b42bb20daeee736a656d", + "client_s_sk": "4c310969695a089b204a3d40fb1cc5cf386cd5df2a2c67042d8c5def5b80a527", + "client_e_pk": "d801be69b3b1c37f014c09af1ebb0afd06c6d1fee6cddb70efe657626f17c5f6", + "client_e_sk": "bbc07b11d36e5e9cfcf70b7f958131be91b2aaf1ef421e50d84ee92cf4393df1", + "server_s_pk": "1adf6561816184cc25d3d7d84cb24fc3249b9f3ac07c993a5c9b7f0bacfbae5c", + "server_s_sk": "01d776efcf6aa55761c46be07331b6cab6e308b0c8aaa61253873c0723a12a00", + "server_e_pk": "8d0c0d02972aec1c92ab7e19400f9ba293c201bdb1f26dc1a7a0a7839dde9479", + "server_e_sk": "c03567a48161c471da15ae3084c0baf82d0dbddb1115cc6cadf9450fa6c8c842", + "fake_sk": "ac8fd9eb509d94bedda3bb7db23cf175b9028c9f07021863f21d7043b7eca75a", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "d6ece754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992b", + "oprf_seed": "d2d0f931321443ea89ec4e5e21d3723bf83ab54815d6c7bd503d2a4e60b0e68a", + "dummy_masking_key": "8835e71a44a8b472d6c0a260786b0b49790d857c354fb55fce0c4fa1603c16c6", + "masking_nonce": "15bf566a4df9f1e0f3724f4ace21a817de168b28f505928f6d7f774511219f584c804ea35ae019377133f171fd1d96f91a52da1b124541b7e5598e6a62a57347", + "envelope_nonce": "d7a2595f56ba489ccb9fe303ebc0523a80ad885c27cc4df61e377d1d4770d881", + "client_nonce": "e521487b164f663fa7ca61dfee57ab3195801075e15f89a4637ec5210e18ea1c", + "server_nonce": "d5b4efa4a736f17a9c1aa4731173fcaa4650b4ecc78761a9e884195264159c09", + "server_sig_rng": "0f6b8ec88b466368ed286814088d9f3f9fb803466c9cb406101548b452a523c0", + "client_sig_rng": "bedcc9db72beeb8e8ee0b37d0051f0c4c6d353f361ab8f2874fb47084505fd08", + "context": "636f6e74657874", + "registration_request": "02601f38358105685b5042822a638d2e9509465419fc1b5ba47d794dbaad6298d0", + "registration_response": "02d251bad71fc235b23ed26f0a2a298a51c58f4192dfd0fbdb99b80dcff907dbf61adf6561816184cc25d3d7d84cb24fc3249b9f3ac07c993a5c9b7f0bacfbae5c", + "registration_upload": "9ee106302ce167598ef0d69cb13ebc2165cc1475f44f0bd55545e01793f52e8e5ccd4a890aa6ea2a608495f26960e698dcb732588cdc4f143ad81025326f7a194c310969695a089b204a3d40fb1cc5cf386cd5df2a2c67042d8c5def5b80a527fde8525808e4640a2eb42918dca741e52e243b692f85c2b8b3d76fe9b35a10d4", + "credential_request": "02601f38358105685b5042822a638d2e9509465419fc1b5ba47d794dbaad6298d0e754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992bbbc0030103f23beef82fb06cbfe2667fad6ff2c39ec7f160d92f6bbfb7a5a94df0c81090cc2017179bb3dd5fa5066a232289b4dbb3b2c7ad86315c6fed815dce5f8ed88be4", + "credential_response": "02d251bad71fc235b23ed26f0a2a298a51c58f4192dfd0fbdb99b80dcff907dbf615bf566a4df9f1e0f3724f4ace21a817de168b28f505928f6d7f774511219f58e74853221a61fbb1e9a536efa827f81a36e4e70227f54f3961ea67b461cae68997c079d2c14fa162f6f201ceac1ab9f6ec48f87eb221d4f9a572a9593598e8fcf38453ae4266c39fa9d0a1d9fc0643562c2a3dd061371966b391080995d73546efa4a736f17a9c1aa4731173fcaa4650b4ecc78761a9e884195264159c090f6b0200bed4e3b889c98b3669eb1d5102ebcaba8f28065145b1deb4a43205397f00a2eca5f996e79eb1da1009978afde17f8437bc9ad5b2cbb72459afdea7fd733d87b29414334c6874f4d9cbd0fedc2dc0e3a1f83ce20ca9c5026a6b13188cff6de0b76a9a41c4e55ac589f7a41d7315c93d63fd5bea0106c6891018406669e0d7b03a076c3c1b0813a4e19111a4f4587eaa51364d408b98b67d58ad6630eee01e45d65718f597d4b114eca3329847af98119190d49c96b38ce1a29893e2b13a06a224f8", + "credential_finalization": "1db6c4d972d52b2e5b3bf2c8ded15c75b966203ab08fba4911461f5289908b7fcb0e1636ae34cf63bad572e3ccb96c6ac653944962ab8ee9dff1b6bd82f8fa0523eab92a6154cab966c263bffb9c03680627e3e46142a5a7ad11c117520c6f2e7795c0f998cc548c8cb374db56863355249e7f7c53bb530a692fcf7e716f1a9e", + "client_registration_state": "d6ece754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992b02601f38358105685b5042822a638d2e9509465419fc1b5ba47d794dbaad6298d0", + "client_login_state": "d6ece754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992b02601f38358105685b5042822a638d2e9509465419fc1b5ba47d794dbaad6298d0e754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992bbbc0030103f23beef82fb06cbfe2667fad6ff2c39ec7f160d92f6bbfb7a5a94df0c81090cc2017179bb3dd5fa5066a232289b4dbb3b2c7ad86315c6fed815dce5f8ed88be400ab3a280a70ce0be124c04d0bdf03af82a3c748c7209d354353263fb98d8c497de0c97426d49f50d648ff3a572dfebcee1c3f5b0b778773745faf248da7a3f74833e754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992bbbc0", + "server_login_state": "9ee106302ce167598ef0d69cb13ebc2165cc1475f44f0bd55545e01793f52e8e19b0cc5f96d7a6eedb06f3807ac07a392f65d9c3079aa8241ea520f4608fb09f8be6987d29702b17592d7b1b0f2febd855cfba6aaf833dc0e1252d591b1f825902601f38358105685b5042822a638d2e9509465419fc1b5ba47d794dbaad6298d0e754f6d469ccef676797fc255c866c4f36cf554c552387592d855c69992bbbc0030103f23beef82fb06cbfe2667fad6ff2c39ec7f160d92f6bbfb7a5a94df0c81090cc2017179bb3dd5fa5066a232289b4dbb3b2c7ad86315c6fed815dce5f8ed88be402d251bad71fc235b23ed26f0a2a298a51c58f4192dfd0fbdb99b80dcff907dbf615bf566a4df9f1e0f3724f4ace21a817de168b28f505928f6d7f774511219f58e74853221a61fbb1e9a536efa827f81a36e4e70227f54f3961ea67b461cae68997c079d2c14fa162f6f201ceac1ab9f6ec48f87eb221d4f9a572a9593598e8fcf38453ae4266c39fa9d0a1d9fc0643562c2a3dd061371966b391080995d73546efa4a736f17a9c1aa4731173fcaa4650b4ecc78761a9e884195264159c090f6b0200bed4e3b889c98b3669eb1d5102ebcaba8f28065145b1deb4a43205397f00a2eca5f996e79eb1da1009978afde17f8437bc9ad5b2cbb72459afdea7fd733d87b2946c3c1b0813a4e19111a4f4587eaa51364d408b98b67d58ad6630eee01e45d65718f597d4b114eca3329847af98119190d49c96b38ce1a29893e2b13a06a224f823eab92a6154cab966c263bffb9c03680627e3e46142a5a7ad11c117520c6f2e7795c0f998cc548c8cb374db56863355249e7f7c53bb530a692fcf7e716f1a9e", + "password_file": "9ee106302ce167598ef0d69cb13ebc2165cc1475f44f0bd55545e01793f52e8e5ccd4a890aa6ea2a608495f26960e698dcb732588cdc4f143ad81025326f7a194c310969695a089b204a3d40fb1cc5cf386cd5df2a2c67042d8c5def5b80a527fde8525808e4640a2eb42918dca741e52e243b692f85c2b8b3d76fe9b35a10d4", + "export_key": "66d350959c27cbf0b4b2716b3e8910c4874a518a67d445b1b5066af896a9cb9b", + "session_key": "19b0cc5f96d7a6eedb06f3807ac07a392f65d9c3079aa8241ea520f4608fb09f8be6987d29702b17592d7b1b0f2febd855cfba6aaf833dc0e1252d591b1f8259" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_P521: &str = r#" +{ + "client_s_pk": "885cab6c234dcd0a1296a67f5e0cf1c2b70b2156a46b18c88212cbe7150cfc1c", + "client_s_sk": "a35eec14874ac3a06762a7cff13adf6b137ebf883ecb2e817d9f20a984285dda", + "client_e_pk": "36dbc6327cfce7e08f22d5015bffe5bf055dffbf6eeca7f519ecb6bb59933435", + "client_e_sk": "9b982deedd822cfc89c034657332ea647fd876ab833b533b4b8400a2cc680cac", + "server_s_pk": "2fd673f32680a0f3041985c89d4e6e34d184292c4a682ddfe2f719294928e80b", + "server_s_sk": "2118c7a9b07928a98d4c8d41626cc7d4a28fd3bc8f8f7edb33b39eecb881d153", + "server_e_pk": "924fe3578f3fcaa9bb3a14fc21f664eb6b1d291b4bb1ddfa6c8dd7accbe4ad48", + "server_e_sk": "9f46fbe3851225a26b210bcb95aeb988956b042db4019f2163b477e4df87abf7", + "fake_sk": "49c174ee559230380c66ea2d3622edc5579a0c47b9d83f6aa24b73949e8bd979", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "b20d900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4bf06a2687a8100ff89c4a3aed6c2", + "oprf_seed": "83b06b7d88fbae54891aaded24f19378e5b17093efbcd951610d7d963b47732f9fbc0241dd10c5fa824c1da4083fb324", + "dummy_masking_key": "17cbdc6c16aa70fc8c710736fe3197ffa99817afde6d0fa9a9cc2963b3fe4b9c4df03f7b6244a8ac2f8642a8a72f6c27", + "masking_nonce": "65a2d5f7bbf806305cd0a9be4a27a6b63dc6b276a94b6c9811431aa91db849d194d482d3212da758c78a4fff86ec135857abfd1f928c705f6c09ef6febf99328", + "envelope_nonce": "30a587db0703b4cb0bc7d776734e4f8c381cde190278f1cee485105f4badd9ea", + "client_nonce": "6a25f7741003ced687b2a52393ed7334bf609dbb77263d101337ce4d8e14d41d", + "server_nonce": "82ca176df057d67e38cb1a3a07898d0721148dead443156434b3804e4441ed30", + "server_sig_rng": "34f03b9e442fe7fd3e6752da53a7d8a159109715cfeac90718c13b7d45686533", + "client_sig_rng": "a51f5548fb0ac2ea2bd35c2dda38ddd12c8b5f491de51f34f4eb6a87c989e3b2", + "context": "636f6e74657874", + "registration_request": "039e052f3948668cc563bb838dc12cfa347ed405246c59faea488a2139a406b040bf2ad3a058603cc95da4166d2ebd4877", + "registration_response": "0220fb75b79ce90e032af1000b6386eee3115c0b3c305b175dbe7b3724cacc6b2ca701c60789eb0533540a2b6ca76f117a2fd673f32680a0f3041985c89d4e6e34d184292c4a682ddfe2f719294928e80b", + "registration_upload": "537288f6b8f80e3b9ade3619f0d87a5f6f7f1397a7e2a631b46cecd10fe46b6f9b03fd13b07b17f75fdc35f3eb915f7cde26415c165404d186330552802ae12652f5560d2c2e765088a125614709262da35eec14874ac3a06762a7cff13adf6b137ebf883ecb2e817d9f20a984285dda21fa1c57207885124476dea6e42f767a8a16887d2161b10c913820013de9dbe6cdd128029a8867ca557ef902095a6369", + "credential_request": "039e052f3948668cc563bb838dc12cfa347ed405246c59faea488a2139a406b040bf2ad3a058603cc95da4166d2ebd4877900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4020078287bbc1aa6226629e38adfac6fa88b63111de9cf0316da4f2fb8ba3ffa24358e53f515bceb88e31f0143f6e8cb11061a9aea312efd30568a4ea196d58ef32419", + "credential_response": "0220fb75b79ce90e032af1000b6386eee3115c0b3c305b175dbe7b3724cacc6b2ca701c60789eb0533540a2b6ca76f117a65a2d5f7bbf806305cd0a9be4a27a6b63dc6b276a94b6c9811431aa91db849d1aefa6cadf73279ff853e5bec86c0fd218130dbd4b2612832fb4a94d3e4e5081f02154bcf690f0f00eaef0219ad211d2cd930ca63832218736e81fe08a71ff58439c99c5a39e12d2c6617ad2d331f1eb639a2e9e0767cbc2bf99c1f419fc409c3ff07ca5fe3ec8f6f01b9299801aea5b7176df057d67e38cb1a3a07898d0721148dead443156434b3804e4441ed3034f00301c21ef4619362c17970ab3bd9d9e9763153bc3ea1dd02bf3fc063c81751e746f3c8a9273228e496512bab52389cf1e249f0881b57c763ac6b50e58e821f744f25cc7aef1a7bc4660fc4312012f0c2936d48aa071d0b4a649b036dc9ca57004baae311cf66ad48463a2fa232ec95723345514b3ee5d059f8b84cdd368ce30aa31c0ac0648acfd7a766d65455e4c93d2823d5d75275ccfc1a4cc9549271a804de42c37c517c527b42d0783beb23e29bd74fdc27ce789a717388d51d0987be2683c987", + "credential_finalization": "21668f15d7d5b50aee9f31049ebb978eb72debde9d6f612ea7d270778314e0caa841fbff80eba6207d4053d25ef369dd2fea217dd00587bb20bd07256d4f480e562f5c4755b81f283aeb72eaebed9945732782fcced24f4b42b17da161b3999ad8932c094aa6e3965a0a1073160e30e9e0b77bb65b86b429be3008ac0cd50995", + "client_registration_state": "b20d900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4bf06a2687a8100ff89c4a3aed6c2039e052f3948668cc563bb838dc12cfa347ed405246c59faea488a2139a406b040bf2ad3a058603cc95da4166d2ebd4877", + "client_login_state": "b20d900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4bf06a2687a8100ff89c4a3aed6c2039e052f3948668cc563bb838dc12cfa347ed405246c59faea488a2139a406b040bf2ad3a058603cc95da4166d2ebd4877900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4020078287bbc1aa6226629e38adfac6fa88b63111de9cf0316da4f2fb8ba3ffa24358e53f515bceb88e31f0143f6e8cb11061a9aea312efd30568a4ea196d58ef3241901c300f91c9ddb7700c8fb674316a5bb01987f4d6f78bb748dd02ce388b15f87b03b48ca497344632de476e4c105839ea4864239eccfec625d0594c5628ce96cb2ce900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4", + "server_login_state": "537288f6b8f80e3b9ade3619f0d87a5f6f7f1397a7e2a631b46cecd10fe46b6f549d6f141a79a202baaf37d47e45b2b88823f6d8dd6063da25c7b0884c3820d7bd6415908d7d8dfad1b7060b75e803d4f464c776dbceced87a2b3c047807f1eb039e052f3948668cc563bb838dc12cfa347ed405246c59faea488a2139a406b040bf2ad3a058603cc95da4166d2ebd4877900468ea5a28e0a7f3ff4925591e51c1c4b4a7f7afb4be8e31063452ae5993f4020078287bbc1aa6226629e38adfac6fa88b63111de9cf0316da4f2fb8ba3ffa24358e53f515bceb88e31f0143f6e8cb11061a9aea312efd30568a4ea196d58ef324190220fb75b79ce90e032af1000b6386eee3115c0b3c305b175dbe7b3724cacc6b2ca701c60789eb0533540a2b6ca76f117a65a2d5f7bbf806305cd0a9be4a27a6b63dc6b276a94b6c9811431aa91db849d1aefa6cadf73279ff853e5bec86c0fd218130dbd4b2612832fb4a94d3e4e5081f02154bcf690f0f00eaef0219ad211d2cd930ca63832218736e81fe08a71ff58439c99c5a39e12d2c6617ad2d331f1eb639a2e9e0767cbc2bf99c1f419fc409c3ff07ca5fe3ec8f6f01b9299801aea5b7176df057d67e38cb1a3a07898d0721148dead443156434b3804e4441ed3034f00301c21ef4619362c17970ab3bd9d9e9763153bc3ea1dd02bf3fc063c81751e746f3c8a9273228e496512bab52389cf1e249f0881b57c763ac6b50e58e821f744f25ccc0648acfd7a766d65455e4c93d2823d5d75275ccfc1a4cc9549271a804de42c37c517c527b42d0783beb23e29bd74fdc27ce789a717388d51d0987be2683c987562f5c4755b81f283aeb72eaebed9945732782fcced24f4b42b17da161b3999ad8932c094aa6e3965a0a1073160e30e9e0b77bb65b86b429be3008ac0cd50995", + "password_file": "537288f6b8f80e3b9ade3619f0d87a5f6f7f1397a7e2a631b46cecd10fe46b6f9b03fd13b07b17f75fdc35f3eb915f7cde26415c165404d186330552802ae12652f5560d2c2e765088a125614709262da35eec14874ac3a06762a7cff13adf6b137ebf883ecb2e817d9f20a984285dda21fa1c57207885124476dea6e42f767a8a16887d2161b10c913820013de9dbe6cdd128029a8867ca557ef902095a6369", + "export_key": "87e9543712fd68d38b850e9c3d7628ac166c8864148353968120f39403eb6b9282607c7bda62c37e85ce55b9651d7d09", + "session_key": "549d6f141a79a202baaf37d47e45b2b88823f6d8dd6063da25c7b0884c3820d7bd6415908d7d8dfad1b7060b75e803d4f464c776dbceced87a2b3c047807f1eb" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_P521: &str = r#" +{ + "client_s_pk": "97555f87fe2f51fa978a778609ec249f788d00a461b50f38526a0c952fd84316", + "client_s_sk": "0ba6358428626f7881afe33ae0b7c94feb0275a0d42b2f1cf98b52b2dab90a33", + "client_e_pk": "a9ebf4ae91b1a340f9f516528d70d4f3db3f8c8fdd81b2f4effc415335f8269a", + "client_e_sk": "a74f59b054aeee9a747e5b804f7c92d5d7502cef12e44dbc4a6e7aa378bb52a2", + "server_s_pk": "9f72f5196e6093386e47828b840a10b4357bbd7b50dedc41a2e439bcb79b9bca", + "server_s_sk": "fcc7206953d80b1dfbbef7be8112a49fa2962a71cb14caba420d223e1556fdef", + "server_e_pk": "d21b02d33233addac45b0f54342a965c7cb3ba272945c9ea5c100cf902514bba", + "server_e_sk": "a0fe8514f84837ad57a9f6197f9068c94500a67ac6304622d189d92bafb7799a", + "fake_sk": "5d5edb891700ff68fe47aa2ae41614dd4fe7958cd1685963f4d18972b48207f9", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "003a4a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98741dbaccd7e513d22273552af9796832d89c61f176a5fe272f5875258532ce7e3", + "oprf_seed": "972b4b3c45b412d3ae7ee4de93112cdc716e64e442f3e8b694a0c100e5280048f7c532d08b0e24d152f7d55166bd1245661b96c55b9cf9618e6ac596c71b097d", + "dummy_masking_key": "1274375eee57b4dc2b9c35b9eb380211f4f99e9c3cc5d7f57273fdeb1fdf663023f24358d2644fdab85e668791db05e9a5acb8a9909369b7fd0c6ded4ec4a236", + "masking_nonce": "7fa142f6926e060d09caaf15797c0a92dac2630e811286326c12b693572328245380037257b4e81db610e9acede02827dbde595c342b473fa403fea42f2e15d4", + "envelope_nonce": "56558ca41cdd6396d4fd0efef0f1859d390b778afeb0bccf6f5cc22b5c7569a5", + "client_nonce": "f18f5c65275d90e9d43630f9dda61fede7626448a7283e61e62a1f90357f6fca", + "server_nonce": "8587eaa35bc713579048f3663ff2c1e2eb89eec18eef3a13aac8dc1d836f1f8c", + "server_sig_rng": "1d61af2d4c54a102dbdf292df9958b94dd59da3a351e5053bdf64f44ec6e8bf8", + "client_sig_rng": "d95f812736fd47c61b9ba099e1367b61145a7a9b93132ff13ab9ed16367ceeb4", + "context": "636f6e74657874", + "registration_request": "0201567079657df03ee0537cfcaf3ea9fa520a7542cd1444f8a0dc751be7af69f4bba989ab1e7aa188c13e978578e7f587667a318989a40cf8bc00fad2a61166c9a7b4", + "registration_response": "0300441e1e70238434bd20258da4b85fb949911319c9632198d5ad50271a77dbdc9cb2d63bab66fc8db985c284e2c508c6f8777f210b01cd7a1b54e2d2df840dff30049f72f5196e6093386e47828b840a10b4357bbd7b50dedc41a2e439bcb79b9bca", + "registration_upload": "7352c4487ffb54a241bbfc52e6716e2ad3c34448045207f2eca6384d60ec3d34c59d962ad87bcd111922eb29ed158438ab210790e3ddcf18f2b47d286358fb1867571e3d31be5a872ea6761f0f5137e8f0f87e38183d24b6e959485e4b27bcc70ba6358428626f7881afe33ae0b7c94feb0275a0d42b2f1cf98b52b2dab90a33d8339c3a746dfdeefc5632c8a1ae2f3a5dc91989d422db275c0079ea13876e222bb4c25566ffe7e78a4f44f1848f3dc3e6087c8a480004f9bbe28e6778f69639", + "credential_request": "0201567079657df03ee0537cfcaf3ea9fa520a7542cd1444f8a0dc751be7af69f4bba989ab1e7aa188c13e978578e7f587667a318989a40cf8bc00fad2a61166c9a7b44a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98702019f08bb8f29bc732bcf44144bc078117f545809b11d98b753094e404dd031355a15fe5c5a7718dd5e6954b5934fd59f21590a418a424c37ed3e3eafa5dbab103085", + "credential_response": "0300441e1e70238434bd20258da4b85fb949911319c9632198d5ad50271a77dbdc9cb2d63bab66fc8db985c284e2c508c6f8777f210b01cd7a1b54e2d2df840dff30047fa142f6926e060d09caaf15797c0a92dac2630e811286326c12b69357232824249fbdeaa05ef22eb1d0a8a375869254baf43ec7ff6aa0dd3d2e68fde6632277611255e8986d37b51ff9050f8c342cfb0cc52af6888e567c3d19b293ebafae257ce207c62f7a4ec398a597aa369eaa14985a24bef0ca3df96e7e9c2d69f587ec96f5a769f998ba1ff2b0df614a7a7cc08663209d95780d0eb0cc6d3e7e1915fceaa35bc713579048f3663ff2c1e2eb89eec18eef3a13aac8dc1d836f1f8c1d6103007737fbadfee7c802de61362f81eaa40e2598d4a5bb6445459d03408a04f41dfb1bdb37951d9f1bde61fedc2bf6f7939bb681646c0eb5a502c8b8371c7b9b67c071bf4dee3406a184eac13a01ec66647dc2c3e93747ec3783702731bfaf5424b799c4c4ab416055118ec9c69252a2920dfe12abababa94fbe0c6c6ceb664b1a7d0865c757ef2771560b67f9e1e86d49ae1ae68a1c4a6664141afdebac37df071ad70ca43fe4a4c748b3cd8c1e0cbc05c45b34e0afc3bc697fa0cce434fd7e726168", + "credential_finalization": "a57ed8eebf8094f05cc6971fbfcbf3a72c9d69a62b9ecd2d0bad3ccee02fbdf0489fcfae9ba02a73a854b98f2491e8938fa73364b0c2c8901336c0f7288bc50f36770e2745dcb53d5b47ecbc2a5302028b560dba9bf87062fe191a6c5d03189c2fd2e473b776809a5109b80d68518e08f934c7127f6893c985c20dd9b135b67f", + "client_registration_state": "003a4a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98741dbaccd7e513d22273552af9796832d89c61f176a5fe272f5875258532ce7e30201567079657df03ee0537cfcaf3ea9fa520a7542cd1444f8a0dc751be7af69f4bba989ab1e7aa188c13e978578e7f587667a318989a40cf8bc00fad2a61166c9a7b4", + "client_login_state": "003a4a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98741dbaccd7e513d22273552af9796832d89c61f176a5fe272f5875258532ce7e30201567079657df03ee0537cfcaf3ea9fa520a7542cd1444f8a0dc751be7af69f4bba989ab1e7aa188c13e978578e7f587667a318989a40cf8bc00fad2a61166c9a7b44a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98702019f08bb8f29bc732bcf44144bc078117f545809b11d98b753094e404dd031355a15fe5c5a7718dd5e6954b5934fd59f21590a418a424c37ed3e3eafa5dbab10308500eaf1d1fe44b0a33b3c5b95ec4fd0c30c79dc56bc731597ffe58efec09a64978ed014914c9b1ec393e5906ef61135fb21dcbf47f54d3ccc6e6d1538618970d18b774a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f987", + "server_login_state": "7352c4487ffb54a241bbfc52e6716e2ad3c34448045207f2eca6384d60ec3d3474e7007a3ad0f78d122edf0b986782598a0f490aa9ec5b5746fc395bc74bbcd85625cc3dd6486efb470dd2b494c1a9ab7e8364e8eef053271dccaf8d01853be40201567079657df03ee0537cfcaf3ea9fa520a7542cd1444f8a0dc751be7af69f4bba989ab1e7aa188c13e978578e7f587667a318989a40cf8bc00fad2a61166c9a7b44a80e10083dd2bc1f75e95dbc551c982886f10ade02bdd3239820b5bcff8f98702019f08bb8f29bc732bcf44144bc078117f545809b11d98b753094e404dd031355a15fe5c5a7718dd5e6954b5934fd59f21590a418a424c37ed3e3eafa5dbab1030850300441e1e70238434bd20258da4b85fb949911319c9632198d5ad50271a77dbdc9cb2d63bab66fc8db985c284e2c508c6f8777f210b01cd7a1b54e2d2df840dff30047fa142f6926e060d09caaf15797c0a92dac2630e811286326c12b69357232824249fbdeaa05ef22eb1d0a8a375869254baf43ec7ff6aa0dd3d2e68fde6632277611255e8986d37b51ff9050f8c342cfb0cc52af6888e567c3d19b293ebafae257ce207c62f7a4ec398a597aa369eaa14985a24bef0ca3df96e7e9c2d69f587ec96f5a769f998ba1ff2b0df614a7a7cc08663209d95780d0eb0cc6d3e7e1915fceaa35bc713579048f3663ff2c1e2eb89eec18eef3a13aac8dc1d836f1f8c1d6103007737fbadfee7c802de61362f81eaa40e2598d4a5bb6445459d03408a04f41dfb1bdb37951d9f1bde61fedc2bf6f7939bb681646c0eb5a502c8b8371c7b9b67c07165c757ef2771560b67f9e1e86d49ae1ae68a1c4a6664141afdebac37df071ad70ca43fe4a4c748b3cd8c1e0cbc05c45b34e0afc3bc697fa0cce434fd7e72616836770e2745dcb53d5b47ecbc2a5302028b560dba9bf87062fe191a6c5d03189c2fd2e473b776809a5109b80d68518e08f934c7127f6893c985c20dd9b135b67f", + "password_file": "7352c4487ffb54a241bbfc52e6716e2ad3c34448045207f2eca6384d60ec3d34c59d962ad87bcd111922eb29ed158438ab210790e3ddcf18f2b47d286358fb1867571e3d31be5a872ea6761f0f5137e8f0f87e38183d24b6e959485e4b27bcc70ba6358428626f7881afe33ae0b7c94feb0275a0d42b2f1cf98b52b2dab90a33d8339c3a746dfdeefc5632c8a1ae2f3a5dc91989d422db275c0079ea13876e222bb4c25566ffe7e78a4f44f1848f3dc3e6087c8a480004f9bbe28e6778f69639", + "export_key": "51ba842ab1691ba1fe6ba81ca0d7c9717fbbfff59f9378ffd9cde5a887e4578c194343322c0375a3c0d8f97a7b46b3036f83824fdcd01f852d9ed488c174605f", + "session_key": "74e7007a3ad0f78d122edf0b986782598a0f490aa9ec5b5746fc395bc74bbcd85625cc3dd6486efb470dd2b494c1a9ab7e8364e8eef053271dccaf8d01853be4" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_CURVE25519: &str = r#" +{ + "client_s_pk": "d00e695e8d5523d9b79f310ae0a3a3b52f09ce4d89bddd3dec7023584f1ab067", + "client_s_sk": "3cfa55046dabce69fb3863c1ee37ccc983371d9931ea88ee71f545150acc3857", + "client_e_pk": "02b5cd7b27e437362ca82c95f6da33414f43dd791ded7433c4d440b3372ead7d", + "client_e_sk": "fa374bdf69cf4075fe13bb7bff4cbed2db7f94e6cd8225087f0188ad0387857d", + "server_s_pk": "06266be697a8a93b07d85857c6edb6de647bf45256801cf1ef1f578b91faffdb", + "server_s_sk": "ff11622e5dd21568d05c1353ad9ce3225d4c87f24643258257e06320c408d209", + "server_e_pk": "9060526fd066676bf65a96dfc2272b61cf9f07bfecf32381444d3f643bcff0b5", + "server_e_sk": "ee73255b084d338fe84e186b1d0dc11e5eb73bccdee7d5c58749c6a17aa6cd55", + "fake_sk": "3eb212f9366aeae3cef6ab749de37f4712247f9cf834f08b660b3c38e77c0e54", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "2aadccc05202d0946644967386dc63abd04e2f1d55b55c277384369cf9a77602", + "oprf_seed": "8cdfba2cd468c995666e7c88c7d48ecc07b0e1edac798b88a3e14095fe71092e83f5583d837518eee97595d1250916beff57782128e68267a3628598a887f503", + "dummy_masking_key": "a199138a4bf0769eee70de97918f42dcb3b4143a8522cfc2f5298ea19ff8a3b89b13131e1a580e9e4fc19a220eda2ece9a57202475ab0a67497d329a2a3caadb", + "masking_nonce": "9d9f8ac4ffa5b774ed2682e32a68e347395c12f45ada9171ec3f109d1c13aae2edd471336a73ce0064a6e25daeb81650f0cc7ec8c8f33d49e669c9c492217784", + "envelope_nonce": "41e7bba21b3731caadad3b47ae1715d3ef987fc6df86f6a25723295467fd4a74", + "client_nonce": "eecc0d1777b2434ffe14584f405cb42e76ba364211286f733d6df6309ca25fb1", + "server_nonce": "b11b640d8e41c137b8c9f7d418bb13791677b128f355a8c63d360e526458bba3", + "server_sig_rng": "5a3f48f992dfe48d14e7555194b908e01256b2c671be9bc1de0a165d4b876292", + "client_sig_rng": "161dbc7e3da94268d0d0b6994b91856f5dc76c13996caece68c12e453a32e6b1", + "context": "636f6e74657874", + "registration_request": "664ea87d0da1b1bd3488376a473c642f54f6a885324674a535d40af84db72805", + "registration_response": "aa18c8f4b0a14fed19b83f8bbe3b24682103d309a60f6857f83affda2a2eaf5a06266be697a8a93b07d85857c6edb6de647bf45256801cf1ef1f578b91faffdb", + "registration_upload": "1e7f0d94a44bb45bace996b26552df8402a3258acddddcfcb5b90353f3b1a44cd9cdb28f5f8e6abebb07b81dac761c6c20e01c9f0fdeebcfd76ced8fa545a760687af82aae34476f6f45b1bdd342152ee1c3519f1e45630b6da7e0fa45ceccbf3cfa55046dabce69fb3863c1ee37ccc983371d9931ea88ee71f545150acc3857d2f611a41edc56ceaf66b64db992b576b2de51ea55070347895e14e86476cb3acfa876b394cdc0898f7fa124e83149c29afb01e989c42082c20aa6dd05fb6ec4", + "credential_request": "664ea87d0da1b1bd3488376a473c642f54f6a885324674a535d40af84db72805eecc0d1777b2434ffe14584f405cb42e76ba364211286f733d6df6309ca25fb12390a62a0253c3867cb81b1d9270124a4d90aa1b32b7c5decec126f842cd2362", + "credential_response": "aa18c8f4b0a14fed19b83f8bbe3b24682103d309a60f6857f83affda2a2eaf5a9d9f8ac4ffa5b774ed2682e32a68e347395c12f45ada9171ec3f109d1c13aae2c4ecd599cd8081d8fcf3f0f8cb5ef4b8c02a148d8a673255f5da14c7de6103f5310a4f2fac7b4a8d84fe0da69c631eb3396cd373b6ba6b8455926c1cbba57183e30b48f42428e3ccb39e4c6cd065d5f7a32f4a3e303e68edcb5b4e8fe2225134c856d1f85b4c83b772ced7c7a254496633deaecfa84b4397cbaa8bde7ca21c3bee73255b084d338fe84e186b1d0dc11e5eb73bccdee7d5c58749c6a17aa6cd554add93760adaf6d16aeb9d2b8633b614e9af9d829c13325a42a06ca0228d2710d31c5a552d9d7a23f428669a925b7fa601feba5177edf91617ce4020a40a4220a19a1ef8a4b06eac23f4872c819674e81668ea48db53660e0a09740a5ccbc10d5054eb60ee68e5872b69159f1118623db75e7949bfbeb85bf5ec08a401194fed2fea05a639a161cea1f5bf550ff995b8c60b7717f6e0891e9ad1c87f7a8e5f8e", + "credential_finalization": "d465f4c4ff732e5c5b535dbb4d52b326893fd42cc6fddae46b842d870aa7b46120e3057c38d605e1981d7ce36149ad31063b280dc83e24dc69bb816ae9cb5f0d4a22b80d17d69704512a67428a95d8009d9a10b5e8c24b39e2679d7a0f7bf798c82f334deb69590ea21779cea7d4e6add12fa9b05cab0d377408ea638ebe9afe", + "client_registration_state": "2aadccc05202d0946644967386dc63abd04e2f1d55b55c277384369cf9a77602664ea87d0da1b1bd3488376a473c642f54f6a885324674a535d40af84db72805", + "client_login_state": "2aadccc05202d0946644967386dc63abd04e2f1d55b55c277384369cf9a77602664ea87d0da1b1bd3488376a473c642f54f6a885324674a535d40af84db72805eecc0d1777b2434ffe14584f405cb42e76ba364211286f733d6df6309ca25fb12390a62a0253c3867cb81b1d9270124a4d90aa1b32b7c5decec126f842cd2362f8374bdf69cf4075fe13bb7bff4cbed2db7f94e6cd8225087f0188ad0387857deecc0d1777b2434ffe14584f405cb42e76ba364211286f733d6df6309ca25fb1", + "server_login_state": "1e7f0d94a44bb45bace996b26552df8402a3258acddddcfcb5b90353f3b1a44cea468743b67ee64236c73966fc6209cde480bca1ec636aad49f0ecf57d6d2e5cb4e4a7fdcb3b64fbafad9b3c183a9406834730c26b23260d0c6fc6c7f6207922664ea87d0da1b1bd3488376a473c642f54f6a885324674a535d40af84db72805eecc0d1777b2434ffe14584f405cb42e76ba364211286f733d6df6309ca25fb12390a62a0253c3867cb81b1d9270124a4d90aa1b32b7c5decec126f842cd2362aa18c8f4b0a14fed19b83f8bbe3b24682103d309a60f6857f83affda2a2eaf5a9d9f8ac4ffa5b774ed2682e32a68e347395c12f45ada9171ec3f109d1c13aae2c4ecd599cd8081d8fcf3f0f8cb5ef4b8c02a148d8a673255f5da14c7de6103f5310a4f2fac7b4a8d84fe0da69c631eb3396cd373b6ba6b8455926c1cbba57183e30b48f42428e3ccb39e4c6cd065d5f7a32f4a3e303e68edcb5b4e8fe2225134c856d1f85b4c83b772ced7c7a254496633deaecfa84b4397cbaa8bde7ca21c3bee73255b084d338fe84e186b1d0dc11e5eb73bccdee7d5c58749c6a17aa6cd554add93760adaf6d16aeb9d2b8633b614e9af9d829c13325a42a06ca0228d27105054eb60ee68e5872b69159f1118623db75e7949bfbeb85bf5ec08a401194fed2fea05a639a161cea1f5bf550ff995b8c60b7717f6e0891e9ad1c87f7a8e5f8e4a22b80d17d69704512a67428a95d8009d9a10b5e8c24b39e2679d7a0f7bf798c82f334deb69590ea21779cea7d4e6add12fa9b05cab0d377408ea638ebe9afe", + "password_file": "1e7f0d94a44bb45bace996b26552df8402a3258acddddcfcb5b90353f3b1a44cd9cdb28f5f8e6abebb07b81dac761c6c20e01c9f0fdeebcfd76ced8fa545a760687af82aae34476f6f45b1bdd342152ee1c3519f1e45630b6da7e0fa45ceccbf3cfa55046dabce69fb3863c1ee37ccc983371d9931ea88ee71f545150acc3857d2f611a41edc56ceaf66b64db992b576b2de51ea55070347895e14e86476cb3acfa876b394cdc0898f7fa124e83149c29afb01e989c42082c20aa6dd05fb6ec4", + "export_key": "24716c32389579fde8526abf200acb5ad18d7e54a9de5417328bda725e7910a9f28ca7e763669cd49b752b4d4aeb43d6ece69d6e6c12889aeff801ae6608e83b", + "session_key": "ea468743b67ee64236c73966fc6209cde480bca1ec636aad49f0ecf57d6d2e5cb4e4a7fdcb3b64fbafad9b3c183a9406834730c26b23260d0c6fc6c7f6207922" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_CURVE25519: &str = r#" +{ + "client_s_pk": "c8a2acf28bebcf6946886eed8541c9411b58b99a01e91c05ac7918d189b78056", + "client_s_sk": "d4bb724284da01cdc74d1edc5c4ca5562bf719a5642a0debcd2213ec0c739c06", + "client_e_pk": "2c67f3f312fe6ed7313f423947d2cef9714193843f298b8eb8ad2ef1dc8599a5", + "client_e_sk": "5812b3538d62468754592aaaf5ffc2384c2d2a47f29fea2d5cebb5baa840140e", + "server_s_pk": "f308eb575ba9fc19f38a0d2c6a4962910e3b59102dd2f66b2bb14d492f4efa17", + "server_s_sk": "c2b29fb048b5194d013b0ea206282083fa9846ad4574351b1ce2d27c4970161b", + "server_e_pk": "3f45f5bb8f75fd44fab30834e533d8959f5398efac689c5f5913212b2dd63629", + "server_e_sk": "33b124eb768e861851ef49705e8f4af410b75ecf3a8b909b17625f2438103b11", + "fake_sk": "2b441418e6b708c263825a4e0ee6a9b6c045dd40e436918cf8b618abfd109f84", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "62ed499ebd624fc51d1d776302975c29841171212e84762db1676f9818e20031", + "oprf_seed": "d6862830f1b9a1c374e23fddc0b766a474a40c6ad174a6d2ee5f2d268fd36883", + "dummy_masking_key": "41caf292f0b7a1a38e05dfa25d2d7cfb6849d27ff206d552a8e3eee119507d61", + "masking_nonce": "ddbe67984fb28c83f823f82d478848e7b48cc41037aeb5bc253c633ea8c6e3cc57bbf945aa578bae0a383eb918ce9005f62b0c4c23d2e88401e4f70fa98d1058", + "envelope_nonce": "7168542c426d643e778da2d809a8624f86734a0f3d314f42c680eae8041bcad7", + "client_nonce": "9be48a7c66b3d4f18d31d1f1879f24654ac947746d39831c4a1a46b68ad20cd6", + "server_nonce": "ac081b22969f154332f5f27cb04ddb1e2bf3b89da0581cd1dfbe6491245fd676", + "server_sig_rng": "f3995d9601f7724045287bb179b5fa3455180fa8444186c641fcb37d7b9988ae", + "client_sig_rng": "583787581d5ddc1bbb7c8155dad07bc11e64af73b42286c45931fd9f9e24126f", + "context": "636f6e74657874", + "registration_request": "02dc867e2db22b0043e1720d6ceca9fcdb8bef5f1f77351ce1b526579c17ffbec4", + "registration_response": "03eedd065c979bc11a686fe4b442b1ceb82cf1f9b650b3424edf3a5377e8853c99f308eb575ba9fc19f38a0d2c6a4962910e3b59102dd2f66b2bb14d492f4efa17", + "registration_upload": "6471f33d7688a5b3a510d061ed5b0338a85d7a341bf855b76738630a31efafff7b877433ce549f27bdaf59295e1ca262c02fec1ad5385f4ace14e8af7bbbb415d4bb724284da01cdc74d1edc5c4ca5562bf719a5642a0debcd2213ec0c739c06afd96384b9b5fedf702f19001fe2c61823ae4be1671d19f00784c35302222913", + "credential_request": "02dc867e2db22b0043e1720d6ceca9fcdb8bef5f1f77351ce1b526579c17ffbec49be48a7c66b3d4f18d31d1f1879f24654ac947746d39831c4a1a46b68ad20cd67214339f6d6718a25c4a0e2e73cbdbcd6bc7c3c52447ed23221856b336582a78", + "credential_response": "03eedd065c979bc11a686fe4b442b1ceb82cf1f9b650b3424edf3a5377e8853c99ddbe67984fb28c83f823f82d478848e7b48cc41037aeb5bc253c633ea8c6e3cc0ab1efa138b0810a004dff4a47c7d6cd274ee887525254163e31722d9b0577c543d2e43ad73fd38631be3cc6f0b991c713a92d38c8b0699d11303086c1aada4ec3134748f2a782dbceaf04aa75b68d9022ab6a846152a79238ba237af9849ece33b124eb768e861851ef49705e8f4af410b75ecf3a8b909b17625f2438103b1106119e15fddbe5ec3689875ea252ddca3076e0c82f0b7e0648e1237d3270d459db56a5f6342c2e2fda3206fedf95eb6fbbeb87b78f9bba37ce258de30440093894c054488d75eabb6f0282f0f105766ecbc6e0586782435db6e5a28a6bb05601a356b1959b5923596ab07d9ea07c34015cf6288059baa6ecaab863ab69a58bb7c8c6a19a50bb787f02cd0173f82399d889479fb8c54f6c9edad31c14d6a08a66", + "credential_finalization": "53022360f321d03aeda22623d9488a6ad087b65535de22a7cf4867bcc99aae5d008e51a83e8925995b1b3ae708d6bada069f1ef39064156909cf3841b2b2520b174a123cd3c59b017060ced62f29979e567d2b22dcaab243b366b622f26a96da6b999998325056ce23c306fd2ee87005e534933495af16a02e4b92538edee56e", + "client_registration_state": "62ed499ebd624fc51d1d776302975c29841171212e84762db1676f9818e2003102dc867e2db22b0043e1720d6ceca9fcdb8bef5f1f77351ce1b526579c17ffbec4", + "client_login_state": "62ed499ebd624fc51d1d776302975c29841171212e84762db1676f9818e2003102dc867e2db22b0043e1720d6ceca9fcdb8bef5f1f77351ce1b526579c17ffbec49be48a7c66b3d4f18d31d1f1879f24654ac947746d39831c4a1a46b68ad20cd67214339f6d6718a25c4a0e2e73cbdbcd6bc7c3c52447ed23221856b336582a785812b3538d62468754592aaaf5ffc2384c2d2a47f29fea2d5cebb5baa840144e9be48a7c66b3d4f18d31d1f1879f24654ac947746d39831c4a1a46b68ad20cd6", + "server_login_state": "6471f33d7688a5b3a510d061ed5b0338a85d7a341bf855b76738630a31efaffff39ccf9b46d93183fdf3b276b6a3ca1f4c6f50bf93f3255f53fa0d2d714d896639821791111a624a9915ed2e4e97d987df96091262a0ff4162425fd443439e8d02dc867e2db22b0043e1720d6ceca9fcdb8bef5f1f77351ce1b526579c17ffbec49be48a7c66b3d4f18d31d1f1879f24654ac947746d39831c4a1a46b68ad20cd67214339f6d6718a25c4a0e2e73cbdbcd6bc7c3c52447ed23221856b336582a7803eedd065c979bc11a686fe4b442b1ceb82cf1f9b650b3424edf3a5377e8853c99ddbe67984fb28c83f823f82d478848e7b48cc41037aeb5bc253c633ea8c6e3cc0ab1efa138b0810a004dff4a47c7d6cd274ee887525254163e31722d9b0577c543d2e43ad73fd38631be3cc6f0b991c713a92d38c8b0699d11303086c1aada4ec3134748f2a782dbceaf04aa75b68d9022ab6a846152a79238ba237af9849ece33b124eb768e861851ef49705e8f4af410b75ecf3a8b909b17625f2438103b1106119e15fddbe5ec3689875ea252ddca3076e0c82f0b7e0648e1237d3270d459a356b1959b5923596ab07d9ea07c34015cf6288059baa6ecaab863ab69a58bb7c8c6a19a50bb787f02cd0173f82399d889479fb8c54f6c9edad31c14d6a08a66174a123cd3c59b017060ced62f29979e567d2b22dcaab243b366b622f26a96da6b999998325056ce23c306fd2ee87005e534933495af16a02e4b92538edee56e", + "password_file": "6471f33d7688a5b3a510d061ed5b0338a85d7a341bf855b76738630a31efafff7b877433ce549f27bdaf59295e1ca262c02fec1ad5385f4ace14e8af7bbbb415d4bb724284da01cdc74d1edc5c4ca5562bf719a5642a0debcd2213ec0c739c06afd96384b9b5fedf702f19001fe2c61823ae4be1671d19f00784c35302222913", + "export_key": "3a3a7e96ed4cbbb30793d093fae8d57ba7efd14a4811a1d74169b87f586097d7", + "session_key": "f39ccf9b46d93183fdf3b276b6a3ca1f4c6f50bf93f3255f53fa0d2d714d896639821791111a624a9915ed2e4e97d987df96091262a0ff4162425fd443439e8d" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_CURVE25519: &str = r#" +{ + "client_s_pk": "d0355d967b2cf26575aa44f8eb7e21871dc2dbba966989c71d1d15f97f7760c6", + "client_s_sk": "4beb7312a37b59fd83b9fbfc7cbfada3be275fa4e3253799d8133f8a04c4dd33", + "client_e_pk": "db004105e572040a0a3dfe503624a9efe70535925f5e4e6bb8fb241710bdf6d7", + "client_e_sk": "98f2bdf960e177fea3c93e622407832a4a15c192fc0a7395d529d82e3a8f5b1e", + "server_s_pk": "0760cd992916c1a0f4fcd08a30235fd549b8fbf1165c172b12a8df15f60cb845", + "server_s_sk": "5496bbb8ecd09ac463b29202d71be17940ac23e6154b2d2ef457ca120f03a6e5", + "server_e_pk": "62d1956bed79d1b2a050e7644bc9de187334a166048ad2809a99e36adbdd65ec", + "server_e_sk": "b7be1b4364ba615a0d9d51d7d630a404490eb334887e674bfacc86ed617dfe4c", + "fake_sk": "ff8299b7b54bacacfa2b7ec7b3f6ec8057dd38196b0583e4b20ff2eb84e5770d", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "c17a3bf336a6e502c7a38af0ce79b73d21ab08d521c672c06657d130d69a69b7426bdf0b6262abca04e639f23bfed9fc", + "oprf_seed": "8ab830d20d454ef1737400df9f5e49a05463d69cd82545957b775a0091d63fd6aa3745f013c79d5f870e4673d694a23f", + "dummy_masking_key": "a420cc05ff0cf54aa58eca9a06b780511176c348e45d6995f4a8f2f19d99054de05c7ae16a01a236dcba7b94c577d68b", + "masking_nonce": "6cf35de28ee370ddb9057fe27e6fa5a6d0f76c5648f6925d3e2e76b21ff044f37f756b74b31d7c44ff7df4ecea84bcb1df7120abe53c0e2c5e63cf1680d42589", + "envelope_nonce": "ad1177e415e833913529fd666bea716f057c52f943f653422d6073c76fca0b9f", + "client_nonce": "2c94d9f6c1b2a2cf6cf49c2fd000710388b57b0407eaf4702863136931a64966", + "server_nonce": "417d9a42080108eb7091d6cdc538743aaac414bc4c4472894ff2b320a5b5bd32", + "server_sig_rng": "c814caa6b88f115c81e22c89ea1a7c9681a3efaf0c99fee5faf73a7a1bca9d3a", + "client_sig_rng": "f942a747e49dd616b2e523facd6bf562576016ee71f3f317f03d997f4f7c8bcc", + "context": "636f6e74657874", + "registration_request": "022df426ea43a576a618d89501392ff2e87b74698207ef89a1d893f7308b4db7ad52e5d0afae96afb6132024fc3a63d133", + "registration_response": "03763c84aa1f58975dcb8fad187280edda82bb4f6fceb16e5abbd5527d4f805af3f142cbcdaf3c4d08fe9e2875fae94f6e0760cd992916c1a0f4fcd08a30235fd549b8fbf1165c172b12a8df15f60cb845", + "registration_upload": "b4606bc242b9d629fc5d329ff16f8ad829112b0cd0c383e8b1f59e1ec90d6f57ec91e839b002f5b340ab951fc5876495df73bc0b7a988e695bcdc356f81b3ed93f1700e3b8e89fcb5034d96947e9821b4beb7312a37b59fd83b9fbfc7cbfada3be275fa4e3253799d8133f8a04c4dd336db72edcc58d22b251f2eeb4f96802d3d84a42761b2589db477383954a9aeb533d223a761c6b53aebe9e201e8d5e8db9", + "credential_request": "022df426ea43a576a618d89501392ff2e87b74698207ef89a1d893f7308b4db7ad52e5d0afae96afb6132024fc3a63d1332c94d9f6c1b2a2cf6cf49c2fd000710388b57b0407eaf4702863136931a649666d1f3a173ba76a4c59871c4d828102666baaf1888db9e71587297a4b77c88872", + "credential_response": "03763c84aa1f58975dcb8fad187280edda82bb4f6fceb16e5abbd5527d4f805af3f142cbcdaf3c4d08fe9e2875fae94f6e6cf35de28ee370ddb9057fe27e6fa5a6d0f76c5648f6925d3e2e76b21ff044f3fcbca845ee8afc1c0eb7d23b6c54a97e2cd71b4fcf9acb883960a74b1fb7dfec9b506d12fc17dce555982e1f77275dc2e62386cdc2106d0facad28a0db13b2638e45eab4b6b201c4107aed14b721889febd2305dedcb5d0816f4b7565adc4f338bcab732195be7e80d538eac747a21e0b7be1b4364ba615a0d9d51d7d630a404490eb334887e674bfacc86ed617dfe4c95296603aaf3f4630232dc2bb9ba0d4505b31e3857b2debd245b9d2b4b7823231a229c15a5335b96d675c748c3ca0a8ac5ad3a64bce46a311419a006a6cb4bebc5f0fa4efad29be8a06f7bda513cbc4911ed12d2a8a494ffba0d4b1b0a88b30622e4504d8cd919966f48edb6be12a3317ea59be5ead14b8c008b0ac9f6eafc10d0241c56875358e2e22a1fb090074cfbdf1ef8a0dc697bbc3781d6c0caec26a0", + "credential_finalization": "8ecb067f95de2dadfc19df27409ddc4f2ab7461c14b8c5bd499d12e0b096b576192ab1416908aac544a62845c293c5bd889da7d2bbc3f97468c899658343d60a1b27b4bfabd48787a7943295dfab4870e18e5fbc905aef82a11049402acf3bc5ef15ddcaa50acbb24324c7a06a09497302bc8840e3b49ee65a0e7ec30eee77d6", + "client_registration_state": "c17a3bf336a6e502c7a38af0ce79b73d21ab08d521c672c06657d130d69a69b7426bdf0b6262abca04e639f23bfed9fc022df426ea43a576a618d89501392ff2e87b74698207ef89a1d893f7308b4db7ad52e5d0afae96afb6132024fc3a63d133", + "client_login_state": "c17a3bf336a6e502c7a38af0ce79b73d21ab08d521c672c06657d130d69a69b7426bdf0b6262abca04e639f23bfed9fc022df426ea43a576a618d89501392ff2e87b74698207ef89a1d893f7308b4db7ad52e5d0afae96afb6132024fc3a63d1332c94d9f6c1b2a2cf6cf49c2fd000710388b57b0407eaf4702863136931a649666d1f3a173ba76a4c59871c4d828102666baaf1888db9e71587297a4b77c8887298f2bdf960e177fea3c93e622407832a4a15c192fc0a7395d529d82e3a8f5b5e2c94d9f6c1b2a2cf6cf49c2fd000710388b57b0407eaf4702863136931a64966", + "server_login_state": "b4606bc242b9d629fc5d329ff16f8ad829112b0cd0c383e8b1f59e1ec90d6f573d7fd019a7092209a6b3a5444efdc2a619bbc4a55bf38bb85136ca3e3316e3aeef33f7f19bb5a96554375a5595dfc8f2c160b25db2ad8bdf2a30f2669d32a8b1022df426ea43a576a618d89501392ff2e87b74698207ef89a1d893f7308b4db7ad52e5d0afae96afb6132024fc3a63d1332c94d9f6c1b2a2cf6cf49c2fd000710388b57b0407eaf4702863136931a649666d1f3a173ba76a4c59871c4d828102666baaf1888db9e71587297a4b77c8887203763c84aa1f58975dcb8fad187280edda82bb4f6fceb16e5abbd5527d4f805af3f142cbcdaf3c4d08fe9e2875fae94f6e6cf35de28ee370ddb9057fe27e6fa5a6d0f76c5648f6925d3e2e76b21ff044f3fcbca845ee8afc1c0eb7d23b6c54a97e2cd71b4fcf9acb883960a74b1fb7dfec9b506d12fc17dce555982e1f77275dc2e62386cdc2106d0facad28a0db13b2638e45eab4b6b201c4107aed14b721889febd2305dedcb5d0816f4b7565adc4f338bcab732195be7e80d538eac747a21e0b7be1b4364ba615a0d9d51d7d630a404490eb334887e674bfacc86ed617dfe4c95296603aaf3f4630232dc2bb9ba0d4505b31e3857b2debd245b9d2b4b78232322e4504d8cd919966f48edb6be12a3317ea59be5ead14b8c008b0ac9f6eafc10d0241c56875358e2e22a1fb090074cfbdf1ef8a0dc697bbc3781d6c0caec26a01b27b4bfabd48787a7943295dfab4870e18e5fbc905aef82a11049402acf3bc5ef15ddcaa50acbb24324c7a06a09497302bc8840e3b49ee65a0e7ec30eee77d6", + "password_file": "b4606bc242b9d629fc5d329ff16f8ad829112b0cd0c383e8b1f59e1ec90d6f57ec91e839b002f5b340ab951fc5876495df73bc0b7a988e695bcdc356f81b3ed93f1700e3b8e89fcb5034d96947e9821b4beb7312a37b59fd83b9fbfc7cbfada3be275fa4e3253799d8133f8a04c4dd336db72edcc58d22b251f2eeb4f96802d3d84a42761b2589db477383954a9aeb533d223a761c6b53aebe9e201e8d5e8db9", + "export_key": "1ffd77779fe38b0e7e24056db826a1bdce99b67bb330c30304ef939872589f2cb44ec2d8d6079842d99036c3ebdc52f1", + "session_key": "3d7fd019a7092209a6b3a5444efdc2a619bbc4a55bf38bb85136ca3e3316e3aeef33f7f19bb5a96554375a5595dfc8f2c160b25db2ad8bdf2a30f2669d32a8b1" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_CURVE25519: &str = r#" +{ + "client_s_pk": "e229bfad760cd4d74b55a22cb084eb127ad101d97e7a5c0ed74b3f50ca919d70", + "client_s_sk": "2d854cd9fcf943fb74240a21e73fef2ef4e1cb190f45f2947c848b2a3bba593a", + "client_e_pk": "da78d703f3561a2b6ab97c4696bb926c4d3cd3336bbf7360e8db7126dd3a370c", + "client_e_sk": "d5fc6d019437a2f1450637455c4baca0a2ca65711092123250c0b6bd181128d4", + "server_s_pk": "812ebc2d156e166ab9f0559418bbb89cf541647cc3379d9f1cd2af2863fec8ad", + "server_s_sk": "401b76b7b54cbb8f36d31c6088c9d73b3dcd7ccfb723e8c8b667659d01b49d17", + "server_e_pk": "b83090ad6062009418287bf6ffee5adac4ba7a5f5516f58ce6d61e0f49dac7e5", + "server_e_sk": "f732a5f815f33b07128de43be4cc5d55c8c07bfe7dd410ab7de9cac4b5939111", + "fake_sk": "67149d0c127ff4db33d9bba4ce9882ed2b9d56f47268f6ac235f7d8ee9a6fa7b", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "01ce91dac2281f5dffe969990c0852dded6a06188b4ba758da9bbe474f70b23d846ec11bcbaee088a1c15e91d612861039d520f39168c915fe4a534800789902ddeb", + "oprf_seed": "9916de1a98095ffe9b9a151253e294223f578cb5468304ca846f7c1e939b4444c4c1998b4404fd4c989a3637a3dcb2b41e813a832694eaf46465b61ad00582df", + "dummy_masking_key": "1e92d735b88616d5c7c6420197cd7c2b5be7e9443d2b655612f1476f2db8a6ba0696c6ac35064767e94c37829f1ab30d9f221987f22bb9f2da96d0dc85201f53", + "masking_nonce": "86d65e92e6725c60e5b791507c35fa62f16bae196bb7d504ff2423f830ee9429599cf0944ebadd248ed70936b51a0fc1db7bea2322df1dec87ee327cf4bf77ed", + "envelope_nonce": "466899f1f5befe096aad2fefc22a809b4c960339865cb30b74ea587c072ccc92", + "client_nonce": "feb306bb2e6ba591b93d27a4888ceea0a8a4425173f82e0f2259a546c9c12818", + "server_nonce": "76c6f4786f7c4923fe11a90b9779769791a5c881dc459280be212c1743885c8c", + "server_sig_rng": "f6ac8be53afc7e7c840a770ac401c38098cf87cfee4a45e38a31c2b353f763c1", + "client_sig_rng": "517053db3177d51e0f1d66d401dea9ed3af07b1650252ba57f65840cf0cf9511", + "context": "636f6e74657874", + "registration_request": "0200341f2644b1b525a3b3b482c645b9c60a52a71b1949659a1c4bcd0e8f6227d7d064ab386364cf02d1a2a7d116d4a9c8412c49c8088ac4b78115c9a803ce8d1ef01f", + "registration_response": "0301927cb47e0bc62c8126f31401ae590936af43f90e8ebfccbe6c83496f9c8666e87e0e6b1cae917e4c5e2f8f65d6023702868f2fb50b0b3908a96ec539a06094e8fd812ebc2d156e166ab9f0559418bbb89cf541647cc3379d9f1cd2af2863fec8ad", + "registration_upload": "8fc059a282a4442a4758bf12a433374b0322e303f7d7de11fecf389bd45e2299c7c13ea1f520086e3f8539972da43b9ddb7c818b95b906d3165ff8380430e723676e228f7f20152743ee04935ae20d5ec4a95891513ed98038b05e3c1f2742742d854cd9fcf943fb74240a21e73fef2ef4e1cb190f45f2947c848b2a3bba593a7981112c2b90d430ab1ead8d2d40d0cfd3e79af17837437531adec12e925519f786f4b8cb6f5f8850432ff28aee971d730f42bcf129946c328bf2053e4732fcd", + "credential_request": "0200341f2644b1b525a3b3b482c645b9c60a52a71b1949659a1c4bcd0e8f6227d7d064ab386364cf02d1a2a7d116d4a9c8412c49c8088ac4b78115c9a803ce8d1ef01ffeb306bb2e6ba591b93d27a4888ceea0a8a4425173f82e0f2259a546c9c12818ca08a2252ce6b79bdc501ccf56c0f0203f90ad8d105226f4f488e5c0fd688e56", + "credential_response": "0301927cb47e0bc62c8126f31401ae590936af43f90e8ebfccbe6c83496f9c8666e87e0e6b1cae917e4c5e2f8f65d6023702868f2fb50b0b3908a96ec539a06094e8fd86d65e92e6725c60e5b791507c35fa62f16bae196bb7d504ff2423f830ee94298ab5eb5ea9e8bd64b71abc6ff3d18d6327ccd7d2ab134cbb9800d040d863e2fe930ccb074ccb7c69aadcf170dcc227f964d5a1997cf266e4cd3e094d5eef6d2ba8b8e3366729fabc2f306e46431146e5d258d4fff98266bdc18b45a343bb0cdb75a361b719b00ef3198d92118c9d76c2857b8d9bf90b446774bd858a343a0520f732a5f815f33b07128de43be4cc5d55c8c07bfe7dd410ab7de9cac4b59391117939b4d5a5bd46edc60b25d3014d556df8f85d6e65c30a726e27c4f176575602f22dc9e011266d394a76f11837b9e8848e940339f72743f8719a16e2c85045cb4f7f0734ecde3c2ef6bf48c4dd24d81ea42035cbacebf34c90508908b08814076ac9780d5236abb2efe458e91a4eaafb6947a9e1ddb6998031a3f634bb69356e30acf6ffa7534c0faaafd2b867a1b8bf7b098fa5a390c61c95077547ef6aa938", + "credential_finalization": "de9b8cbddc0bea69cc6901d0fe7ff1ed372f889a4e69e8f552eb9efbdae388e774fd5eeceff3dc097b329b4b8053d76d4b7d1190a16003430f160bb7c5f82b047172833dc70cf3a581d971f3d7fb7c53b9646f9055d4263b6da87aa8fbc7f39f564c52c435dcdd8e7828bfed7ac9d70c32782732c6d1780a85b8ba2d25f08eec", + "client_registration_state": "01ce91dac2281f5dffe969990c0852dded6a06188b4ba758da9bbe474f70b23d846ec11bcbaee088a1c15e91d612861039d520f39168c915fe4a534800789902ddeb0200341f2644b1b525a3b3b482c645b9c60a52a71b1949659a1c4bcd0e8f6227d7d064ab386364cf02d1a2a7d116d4a9c8412c49c8088ac4b78115c9a803ce8d1ef01f", + "client_login_state": "01ce91dac2281f5dffe969990c0852dded6a06188b4ba758da9bbe474f70b23d846ec11bcbaee088a1c15e91d612861039d520f39168c915fe4a534800789902ddeb0200341f2644b1b525a3b3b482c645b9c60a52a71b1949659a1c4bcd0e8f6227d7d064ab386364cf02d1a2a7d116d4a9c8412c49c8088ac4b78115c9a803ce8d1ef01ffeb306bb2e6ba591b93d27a4888ceea0a8a4425173f82e0f2259a546c9c12818ca08a2252ce6b79bdc501ccf56c0f0203f90ad8d105226f4f488e5c0fd688e56d0fc6d019437a2f1450637455c4baca0a2ca65711092123250c0b6bd18112854feb306bb2e6ba591b93d27a4888ceea0a8a4425173f82e0f2259a546c9c12818", + "server_login_state": "8fc059a282a4442a4758bf12a433374b0322e303f7d7de11fecf389bd45e229926655c14e303b4f8ffa56c88158e317d42b9e4f9a1d89a3f48a230b0f3d4f1589bbef4d040012642f4e33202da049b1df834c55dcb59fe2dfccb69c31b98cce00200341f2644b1b525a3b3b482c645b9c60a52a71b1949659a1c4bcd0e8f6227d7d064ab386364cf02d1a2a7d116d4a9c8412c49c8088ac4b78115c9a803ce8d1ef01ffeb306bb2e6ba591b93d27a4888ceea0a8a4425173f82e0f2259a546c9c12818ca08a2252ce6b79bdc501ccf56c0f0203f90ad8d105226f4f488e5c0fd688e560301927cb47e0bc62c8126f31401ae590936af43f90e8ebfccbe6c83496f9c8666e87e0e6b1cae917e4c5e2f8f65d6023702868f2fb50b0b3908a96ec539a06094e8fd86d65e92e6725c60e5b791507c35fa62f16bae196bb7d504ff2423f830ee94298ab5eb5ea9e8bd64b71abc6ff3d18d6327ccd7d2ab134cbb9800d040d863e2fe930ccb074ccb7c69aadcf170dcc227f964d5a1997cf266e4cd3e094d5eef6d2ba8b8e3366729fabc2f306e46431146e5d258d4fff98266bdc18b45a343bb0cdb75a361b719b00ef3198d92118c9d76c2857b8d9bf90b446774bd858a343a0520f732a5f815f33b07128de43be4cc5d55c8c07bfe7dd410ab7de9cac4b59391117939b4d5a5bd46edc60b25d3014d556df8f85d6e65c30a726e27c4f1765756026ac9780d5236abb2efe458e91a4eaafb6947a9e1ddb6998031a3f634bb69356e30acf6ffa7534c0faaafd2b867a1b8bf7b098fa5a390c61c95077547ef6aa9387172833dc70cf3a581d971f3d7fb7c53b9646f9055d4263b6da87aa8fbc7f39f564c52c435dcdd8e7828bfed7ac9d70c32782732c6d1780a85b8ba2d25f08eec", + "password_file": "8fc059a282a4442a4758bf12a433374b0322e303f7d7de11fecf389bd45e2299c7c13ea1f520086e3f8539972da43b9ddb7c818b95b906d3165ff8380430e723676e228f7f20152743ee04935ae20d5ec4a95891513ed98038b05e3c1f2742742d854cd9fcf943fb74240a21e73fef2ef4e1cb190f45f2947c848b2a3bba593a7981112c2b90d430ab1ead8d2d40d0cfd3e79af17837437531adec12e925519f786f4b8cb6f5f8850432ff28aee971d730f42bcf129946c328bf2053e4732fcd", + "export_key": "978b5d0c2ac791b7ebd2624a8490d94ecd143873ddc82c81a92eadd3eb398286762ef9670e00711beba03adbb16cff5c55a836b2969914ad2661adac214f65fa", + "session_key": "26655c14e303b4f8ffa56c88158e317d42b9e4f9a1d89a3f48a230b0f3d4f1589bbef4d040012642f4e33202da049b1df834c55dcb59fe2dfccb69c31b98cce0" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_PH_RISTRETTO255: &str = r#" +{ + "client_s_pk": "33c714ff1539ec1969bddb7b843c9973de02ab3fd281912f5c46b45336139090", + "client_s_sk": "782dfad234f2f8fe6a7c15585efe883e5c3f988f422656cccbe062dfa4ffdeac", + "client_e_pk": "10e53dde7ded132e514e51ad2756c070426fab8cd9f400300e8e29e7f8f4ea05", + "client_e_sk": "ac70047f33213c5d4e6e81b6d0281321b890ec2ed9b891aa5cff02be8872beea", + "server_s_pk": "d33ccb4d61d6918ae4e90c27aa191bb195fce4967c32903aa7296b1786b3cbf1", + "server_s_sk": "ab57f8198e78ccb71260f41c2f9437254b58dfefc4789ae440d4af703c0ffe5e", + "server_e_pk": "11ba83f28d4bfea6d3e80fa3cca464fd467322d684eeedfea37e2b51adb530c7", + "server_e_sk": "27d397bba880df29f74b6e1f0defac1a2756eefa4aeb81c621c6e37a354dc82e", + "fake_sk": "51a785e95d5a378cabe73d70442cba3f465333234927ca7a781ab739e2910ea4", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "4ff5967cc6b74193231613f93889964849a704f324b10e1c0ea24738361d8900", + "oprf_seed": "e95d6406f7d0aa588d6b650c7024f68bb95e3924004a6aeb0314564f6f6c0023cfde5b38c346b4252c68473a7229b31f53a5c31dc817841c8cd185841c7b17d2", + "dummy_masking_key": "f2801c7810beb3b5b4403f43df5e9b33b3866bc8363432a6258c099cc09363589924d80805e1191e237188adc1cf09e9620091091071cc0d89d64d9a086979bf", + "masking_nonce": "2a7c49e71b397b839b89616b1d515719ae054e3a6ff3ef251ee9601112d0ecb08987aebdb11967331e75300d403d7b4d2da43e832695cfeff10167c9f49e5ffb", + "envelope_nonce": "38d94f15adf72f3341b74a3d469df2c57c8b321dd07a9d9c7484b8bf33122959", + "client_nonce": "bcfbf6e0e091766a0a98f91ce3de8efded4f83aa852971bbd25d1b225c6d54e5", + "server_nonce": "912009f006ddf81dcf63c71e9ba40796223f9bedbe37df30907718ff7375a7e3", + "server_sig_rng": "7baca026aa8a378d08f5e4578251867145671f85ffbdb9f4613680bb8beb999e", + "client_sig_rng": "e70c6c6a60edda5a671a94151e9505cda2bf7e28576780c9248dca1e316efc2b", + "context": "636f6e74657874", + "registration_request": "e8891c408132769e6e54e121dac25cbfac4160438681841dfc31acb8e279af48", + "registration_response": "be10e69cfbd5049f45741c286c318c99232a4bbd00421b8b95403a7c4105b95dd33ccb4d61d6918ae4e90c27aa191bb195fce4967c32903aa7296b1786b3cbf1", + "registration_upload": "8cd96988f4f82170b295d04d34f43d440dc1e6cad75db1f8f1273bb694e2361f876e3625c8db2c4b1b1ef2f17a891497e30cd318facda328d42103880aec65199e03eaf0c8ab7d8163ef5d116d60bfc98dcfe682b3d3ad9c6e10170a35045f09782dfad234f2f8fe6a7c15585efe883e5c3f988f422656cccbe062dfa4ffdeac9e0eb36113f155182e763dac6f4e0e292c6a1e41108569d781a46f522e8f3e237b7104fd5f1d74214a60e564ab136b97acbcc61289144dd6d4b8b4e6ea4880bb", + "credential_request": "e8891c408132769e6e54e121dac25cbfac4160438681841dfc31acb8e279af48bcfbf6e0e091766a0a98f91ce3de8efded4f83aa852971bbd25d1b225c6d54e5e0a290e42e22bfe372af8cbbdcab931031f1bd88464fcf1da3083af6e2ba7874", + "credential_response": "be10e69cfbd5049f45741c286c318c99232a4bbd00421b8b95403a7c4105b95d2a7c49e71b397b839b89616b1d515719ae054e3a6ff3ef251ee9601112d0ecb07dc85a6409ab678900d8d1ceb6396cf393442f8f42bd0b02135a01a85e8c6ab3589dc463141332c95b45b3be1a2ef24da5d80a441b9f411cbaf5ff3973e2f8458935a820268b1c87fed200f72b2f22d2445b84f179fd4e8518f952f643b6ef5f1027e640bff895ba6434b5c024ad7ee19b28889eb0a214ba6ee6d6862441aaad27d397bba880df29f74b6e1f0defac1a2756eefa4aeb81c621c6e37a354dc82e4e9d21c9ef3990eb28086adbce59e14ada5f28acfa4e011eec1c00fd3fc4860899a660d1d8b8b34b96c5bc5542dc5f74d6dbbdfd0f584f7ee6dcf95e613935f51e4ca0f0a82ee7b8af6212fb385543d02c83f3e8a6e7e2a74a08aa3bc98433058f470ae40427061d032aa2d6aa1198fd91fb2c84e4e12dbb8998cf89f0242f42e737ad3f3213b010720ab193ea8c6fd898069b62981c2b56584b8aebdbf8a2fe", + "credential_finalization": "74e6613e63e3bc67adbbe82835a16f818b0bc7d806d025b8c691f097b8b86b3e3ad5fbbfbc7797811b8f533c8096e7c6133eaec548a7da1763ac24b003535c0cd21be4d8cc36ad2ac986b19839854c4282323770280acda7e4b3d35919a3f9c3b502a65079164018ad44cf61a051db666cfdd93401ea8a85d6c512fb175714c9", + "client_registration_state": "4ff5967cc6b74193231613f93889964849a704f324b10e1c0ea24738361d8900e8891c408132769e6e54e121dac25cbfac4160438681841dfc31acb8e279af48", + "client_login_state": "4ff5967cc6b74193231613f93889964849a704f324b10e1c0ea24738361d8900e8891c408132769e6e54e121dac25cbfac4160438681841dfc31acb8e279af48bcfbf6e0e091766a0a98f91ce3de8efded4f83aa852971bbd25d1b225c6d54e5e0a290e42e22bfe372af8cbbdcab931031f1bd88464fcf1da3083af6e2ba78745cf1bd7c0e787f45aa8c348ef7453e13b76c22184383cb6b497091e37ebeee00bcfbf6e0e091766a0a98f91ce3de8efded4f83aa852971bbd25d1b225c6d54e5", + "server_login_state": "8cd96988f4f82170b295d04d34f43d440dc1e6cad75db1f8f1273bb694e2361ff4b5e809c777bdf640576184e138bbcf3fa2e62814d3e7fddba0ed4d353090e66ff7f2a93ea128a022b93b5590bf49b2c2b3000ff64a6bf962f1ee027d2377cee1673822e621ff1f672476a6a97036fad5e9d18e987c262da54efda97234ed2e8da0cedbe2174ea1781c67ecb8f8a3b0e06b5b19d9abb5f53b4dd4642f4dc0ecd21be4d8cc36ad2ac986b19839854c4282323770280acda7e4b3d35919a3f9c3b502a65079164018ad44cf61a051db666cfdd93401ea8a85d6c512fb175714c9", + "password_file": "8cd96988f4f82170b295d04d34f43d440dc1e6cad75db1f8f1273bb694e2361f876e3625c8db2c4b1b1ef2f17a891497e30cd318facda328d42103880aec65199e03eaf0c8ab7d8163ef5d116d60bfc98dcfe682b3d3ad9c6e10170a35045f09782dfad234f2f8fe6a7c15585efe883e5c3f988f422656cccbe062dfa4ffdeac9e0eb36113f155182e763dac6f4e0e292c6a1e41108569d781a46f522e8f3e237b7104fd5f1d74214a60e564ab136b97acbcc61289144dd6d4b8b4e6ea4880bb", + "export_key": "426c0ccc747cb00c58fd5db6d07872736f6b77fbd908ed411b4fe5856eb12ea33a75131004c78b137a982271e90bc13c216cc6bdee2231213f5cbe5cf6991028", + "session_key": "f4b5e809c777bdf640576184e138bbcf3fa2e62814d3e7fddba0ed4d353090e66ff7f2a93ea128a022b93b5590bf49b2c2b3000ff64a6bf962f1ee027d2377ce" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_PH_RISTRETTO255: &str = r#" +{ + "client_s_pk": "e8790c4b6c335b5f4feb683acabd5bbb439ad40e81e06f8b9c18ba0c77631072", + "client_s_sk": "cdc03ccfbe14820bf9cf461536cee5f2f163970c0201fb739923b592f87a04ff", + "client_e_pk": "9b7f476de75344e584117295f034487f5c31409d678142bc5444dfeec704fb64", + "client_e_sk": "866e217cc89d46d0f3f639d770945e9884516f8500e32d0a60bad3a38499e1b3", + "server_s_pk": "bc60ecfe3a06e3d55fb65d38c05144fe778252af2e3c2ae26384e6e199bd5c51", + "server_s_sk": "000f1c57c13db0b10fc6deb96cc25b7753fbcd48bc5662fb72a7f4c17c71d244", + "server_e_pk": "949904052fecec027c18c72563d0705ba080a897f1262b18e76e399c6bbfcb37", + "server_e_sk": "81eae8fecaf368cab6baf0cecbc900463ecb6b879d42c8407d80258fd0d238d1", + "fake_sk": "04750be34ec2bf5f530a4b410ddec2a61c4fc545a9a6e9f626d9a8732db86661", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "971a2155af96a8af763447048c96beb21a9e6441d8ff4757cda3f25bfbc36684", + "oprf_seed": "d4cacdee4863a1b862d0d09ef32b946fc716d6b686d7cbc308a00d759050a2da", + "dummy_masking_key": "04b41e22920d1703bd4ec0ec4272f86d02e707f4bf296e13c54355d9947e69ec", + "masking_nonce": "2d9253b8dd6b93c8cba2edf3cd8ff1d9ca2a6ffde7410f5f864089f0e538e3a2a3b6c39373a76361b1c15eff57dae792800e4355d29044b44de0b3fa1b91d824", + "envelope_nonce": "f2b59fe01422854a95ce13bdb06417cb8f7e1eb14b8dbf93ca28e35954fb43f5", + "client_nonce": "3939a64d3decc27db2ccfd410da3ed43dd1a97ff633ec2071d033307928c4527", + "server_nonce": "ca13568d062f71bfbdd4bde27cb33fab488d582be2d7dd99bba56237a8c768f8", + "server_sig_rng": "9f65787d29c6a7d82bbaeaad3528de95bfedce56470ba18659c1b24ef618fe34", + "client_sig_rng": "6676ad323fcce02060e45e50424356686b0806cb0b569f01eb74789f32b6fcaa", + "context": "636f6e74657874", + "registration_request": "027551af1bb1c60752165ccf4e8274bb7cfd6f2336e2fa914a088162f2f570673f", + "registration_response": "02f710966d233102c9435eae343debd6ab7b38d7fc9fa7584c88ccd5654ada82cdbc60ecfe3a06e3d55fb65d38c05144fe778252af2e3c2ae26384e6e199bd5c51", + "registration_upload": "8bed45c6a873a2eb6bbc6c485a24b5c18f30850af454b04142506502c89f802ce4fe75c0cad20ddc6b013cee82811d6dd310236201d8de9482c092a909666ab5cdc03ccfbe14820bf9cf461536cee5f2f163970c0201fb739923b592f87a04ff30b8748fa6f1fcc58fd21ad260f7121628991173e3f481e02bcdb7d17dd955dd", + "credential_request": "027551af1bb1c60752165ccf4e8274bb7cfd6f2336e2fa914a088162f2f570673f3939a64d3decc27db2ccfd410da3ed43dd1a97ff633ec2071d033307928c45271640a9bf3035a501c7866e201e1cc1e5b0c5adbfb8628fd598a28e1c59398e36", + "credential_response": "02f710966d233102c9435eae343debd6ab7b38d7fc9fa7584c88ccd5654ada82cd2d9253b8dd6b93c8cba2edf3cd8ff1d9ca2a6ffde7410f5f864089f0e538e3a26a9d0db4f6cee384ad4c5d741dc26992189d57e0b64536f964c3a7909bfe9c06cec37bfac27d5fdf3aa23b9e58841b0e169a7d0fd50a02b35cd9c2673c3ca3f06a935666a64e6f36606f2b0491813982ea305de33da45993d359b98498e229a881eae8fecaf368cab6baf0cecbc900463ecb6b879d42c8407d80258fd0d238d1fee93d06a673af7cebc6f652969c435f45741aa1d8349d7099069ffc7d51fd0f98148ead943765ca75a1026203e24f60a0f9e58ddcc8c25a24b49cf1b33a420d312157dc2bd557d58926567139ee589f2a4d605b1303457c2c1838408ad7b20838c25c1cb4d2f669d1424fdd8145c51a804b45f7355d78840ff8a65bacd49e6531dfba90cdd04a637a670a7135dc9d1ca4f6bcea3f7cd47513f4e1ff1e9488e8", + "credential_finalization": "faa54dcd6382bc5ab25345addf513cf0cd1d0570c48711f2810427ea94766305a48fed74fa0755215ac62171e2d94cb6e0c447f2b9eb58c07d43405b092af003eff081bd5205255e08dd850cd120c1c1e30932000bfa6e7dfb8899e953eee5043db7b04885609fdf22719eff349259be46a53cafe22900895d44861eaed1b745", + "client_registration_state": "971a2155af96a8af763447048c96beb21a9e6441d8ff4757cda3f25bfbc36684027551af1bb1c60752165ccf4e8274bb7cfd6f2336e2fa914a088162f2f570673f", + "client_login_state": "971a2155af96a8af763447048c96beb21a9e6441d8ff4757cda3f25bfbc36684027551af1bb1c60752165ccf4e8274bb7cfd6f2336e2fa914a088162f2f570673f3939a64d3decc27db2ccfd410da3ed43dd1a97ff633ec2071d033307928c45271640a9bf3035a501c7866e201e1cc1e5b0c5adbfb8628fd598a28e1c59398e36961fe615c527c4f2a27d74f62449763b2e520d834d138f278c7ac387a61e82003939a64d3decc27db2ccfd410da3ed43dd1a97ff633ec2071d033307928c4527", + "server_login_state": "8bed45c6a873a2eb6bbc6c485a24b5c18f30850af454b04142506502c89f802c81be906404dc4fcecd098c3c03f1a09df13a57d8d47bb79317b423bef03607a5f617ba95686c7b3488db0241974724b090cdd3ba4b4dd9aec44ea20ad712790900407628cfaccc03491d1eeede13718a39f63ae99007cf81b721e0dcf25cb365b5eb0243f32bde0707975d117c148f3b624242a8efe56b48d785ba9ad90a6e0eeff081bd5205255e08dd850cd120c1c1e30932000bfa6e7dfb8899e953eee5043db7b04885609fdf22719eff349259be46a53cafe22900895d44861eaed1b745", + "password_file": "8bed45c6a873a2eb6bbc6c485a24b5c18f30850af454b04142506502c89f802ce4fe75c0cad20ddc6b013cee82811d6dd310236201d8de9482c092a909666ab5cdc03ccfbe14820bf9cf461536cee5f2f163970c0201fb739923b592f87a04ff30b8748fa6f1fcc58fd21ad260f7121628991173e3f481e02bcdb7d17dd955dd", + "export_key": "57238d650b2d7d4839a058e36d1af81a87ad00f59b99bff8a5e6099eb29bc9e1", + "session_key": "81be906404dc4fcecd098c3c03f1a09df13a57d8d47bb79317b423bef03607a5f617ba95686c7b3488db0241974724b090cdd3ba4b4dd9aec44ea20ad7127909" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_PH_RISTRETTO255: &str = r#" +{ + "client_s_pk": "68f2e9d7a0057ac292a654bbce1937a190888fe4ef29f52b73587e0ce66b53ad", + "client_s_sk": "32ea892dde9df61e4c53988d3eb783a46c695abb367c2c98746972bc111fffbd", + "client_e_pk": "ad1cc3a8fd23f62d014cb03a9eea9c8eb17df8badc22925e87db91937e9b3767", + "client_e_sk": "729be21552417dd2535e2be6dfcfb2e7432f600e18031022775c9a953f00622f", + "server_s_pk": "403c0a060e9ea2af8f8e0a94efed7d4008f9f403eefbf071c67951873c0a1969", + "server_s_sk": "4b466ecfe563acedb0b76c2a9bd50976fe55c86c991b6f508e230d0bfef700f6", + "server_e_pk": "a458b4bd921e44fe584a6fde51ad026b5ce607e2b0428bb0bf8f722b0c6d3f9a", + "server_e_sk": "f59f9bcaef331e2128404fd2ff8c3eafbb4ec7e563a3de7dde1005ecce85ed73", + "fake_sk": "67cb7fc97fa2f25807a9ce9c8616c15eb9e5fb7a1f6fef9cbd56517ec7c47fd8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "e7c82a01c629bf73ff3c62b7d6bbee67fd14c1cc2b7a71ffdc673249a31f214bfdbb74a22302f02ad5b4b39b87a982a9", + "oprf_seed": "ca729477cd25b2fc77c16aafda77893a01895df5f204c2d18cd6f0d12717d293f2c88e14c75dfa787645fa025ab0ee24", + "dummy_masking_key": "8a442043986c9ee4467a4891981143254a2be6f6bdd3c47baa4b67a8350ff8a287fd8db88299084e506ab12bc26902d6", + "masking_nonce": "91b2e62b62ff499ca1513af6da46418e319e9cde4d7a35b9e5ff3badcaa123261497f307cdd20850c115487369bb9083e4f7a3097234aec342f54ed594d3be54", + "envelope_nonce": "66c0a2ee0ffb406af3ad7cec8c4a26fdae1151dc6bedb84659c3e139499bf52d", + "client_nonce": "5b1a8523053c51558bbfefa22fe2cb75036bc550fe187536e4eda32e2471fe3f", + "server_nonce": "c4774ccd73aea57385b5ffb3b4e4dd7d95b3f557a829d7844a10640fd774a4a6", + "server_sig_rng": "451d1fcfc11c0ab61720a0422024b5bb402c5f533eaac6e1027ced5b9390a196", + "client_sig_rng": "a98a321d8b3718b3022710e81e37e746371e84288960c33d9efc9bb1f210fb68", + "context": "636f6e74657874", + "registration_request": "02126e658b742029107a43b6f9249db35368b1b6e513d4e29c20e6f964c67e2f2d407d07d202085d42530d17e80b3be78a", + "registration_response": "024b27712e6a7077cc1ec18f8a6d2087c479d7640401b277cfa3f02d3fee7f88d58f801cb07061641f6063ed51b6358f0b403c0a060e9ea2af8f8e0a94efed7d4008f9f403eefbf071c67951873c0a1969", + "registration_upload": "6861203a109e63afee6296da8e74a5f9510597dba43d3fa83d03143b3d39ea7c059cd1b63e8205323407c0a8e13f14bca0371f56497698e3a4d37fa0ff56cdb7d1b60c83ed802f564631cd3775c704cd32ea892dde9df61e4c53988d3eb783a46c695abb367c2c98746972bc111fffbd480acb9ae0d729f71ddff5d8e21a5179e0b5a75a33e7f27ee87b9b01bffd527175524448b59a22a0a5aaaa74ec888f52", + "credential_request": "02126e658b742029107a43b6f9249db35368b1b6e513d4e29c20e6f964c67e2f2d407d07d202085d42530d17e80b3be78a5b1a8523053c51558bbfefa22fe2cb75036bc550fe187536e4eda32e2471fe3f66e74effe142728b22d6847e07c3b0d2770089f9807ac6d11a288a7ce6ac5320", + "credential_response": "024b27712e6a7077cc1ec18f8a6d2087c479d7640401b277cfa3f02d3fee7f88d58f801cb07061641f6063ed51b6358f0b91b2e62b62ff499ca1513af6da46418e319e9cde4d7a35b9e5ff3badcaa1232603871665cbbb880109389d7f3b0a245c2c944de7b42b2e4a869839c4cd84a49a3548b4b511d78d3c69314ed93a17a0d45c092f0562ce126cdc1780496703a6811fcc9cf2c4ca1a48f77451ef753c60cbeee9f22b3453e982c32b091a5e4e4d3b1cef30e44786c5cc090aef667f470f27f59f9bcaef331e2128404fd2ff8c3eafbb4ec7e563a3de7dde1005ecce85ed73a0fa879701c0c6d0e1c3aafbbcf16285054a66b4a634bea17e09b0a324cef362ee4067c058a3793e69694762de7402ddba523d447656667d8bfddf00d0e3829e96334fba6a5d2b60f0f7cb5a31ad9fac0b39d52d5f09544ef9c3bba91462c0012d6969340d706a325e373d96187e7e7218a5f82e967cc18bb760b741d3c46e8fc9c52eacbf7e11d911ea6d64ba1d2c6179f52a5cfac024ea1ef73a2754b61b9a", + "credential_finalization": "1b6438bc96fbe43bad9f6581eaceb4543726a3d3ff330f67b400cc4d133d214d68ba7afc9a6975b9636620a97ef223ae174e3b7c61d7952a6701187c97107e04decaf14fa433471b1bc496d6481301dc5ba1ac0522448e6eb665520ab0a9cd2ec2514d1623acbd42cdadb94bdd81533eda6fe97734048e28eb5a29f43872c974", + "client_registration_state": "e7c82a01c629bf73ff3c62b7d6bbee67fd14c1cc2b7a71ffdc673249a31f214bfdbb74a22302f02ad5b4b39b87a982a902126e658b742029107a43b6f9249db35368b1b6e513d4e29c20e6f964c67e2f2d407d07d202085d42530d17e80b3be78a", + "client_login_state": "e7c82a01c629bf73ff3c62b7d6bbee67fd14c1cc2b7a71ffdc673249a31f214bfdbb74a22302f02ad5b4b39b87a982a902126e658b742029107a43b6f9249db35368b1b6e513d4e29c20e6f964c67e2f2d407d07d202085d42530d17e80b3be78a5b1a8523053c51558bbfefa22fe2cb75036bc550fe187536e4eda32e2471fe3f66e74effe142728b22d6847e07c3b0d2770089f9807ac6d11a288a7ce6ac532024ff7134524f707f676b0588319e23e72a85858b8c56cce0dc271b5038f8dc0a5b1a8523053c51558bbfefa22fe2cb75036bc550fe187536e4eda32e2471fe3f", + "server_login_state": "6861203a109e63afee6296da8e74a5f9510597dba43d3fa83d03143b3d39ea7cbd45fdfa8ac32fdff8d9ac6cf75fcb4be97ff742b90a16cd0d556026c5c1c492043fb7df21e439aebe83ce0c5963ff06ef742550e8b2c43a9ed6cd70fcd72decf203daf9ee97d994d87c1682b71ad82a14e6ce975cd18a9d27d65b0f5de35fdb9536881acc67acc08ef02c106c306df2c8ec69da96b6c2389f1b537723236ccedecaf14fa433471b1bc496d6481301dc5ba1ac0522448e6eb665520ab0a9cd2ec2514d1623acbd42cdadb94bdd81533eda6fe97734048e28eb5a29f43872c974", + "password_file": "6861203a109e63afee6296da8e74a5f9510597dba43d3fa83d03143b3d39ea7c059cd1b63e8205323407c0a8e13f14bca0371f56497698e3a4d37fa0ff56cdb7d1b60c83ed802f564631cd3775c704cd32ea892dde9df61e4c53988d3eb783a46c695abb367c2c98746972bc111fffbd480acb9ae0d729f71ddff5d8e21a5179e0b5a75a33e7f27ee87b9b01bffd527175524448b59a22a0a5aaaa74ec888f52", + "export_key": "3a8fde18ce42c0f211d051f3e1e515a4b0d71c419cc2687a7830761a4425ba99312bb058fe1f39f9019372eb7aa326c8", + "session_key": "bd45fdfa8ac32fdff8d9ac6cf75fcb4be97ff742b90a16cd0d556026c5c1c492043fb7df21e439aebe83ce0c5963ff06ef742550e8b2c43a9ed6cd70fcd72dec" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_PH_RISTRETTO255: &str = r#" +{ + "client_s_pk": "f289fbfaa74b02514810eff1948a8212034f29cfa1311a7fb9a93e8aa97d81ed", + "client_s_sk": "3e0afbf56a4f923c9500668e343f71cbfed373f80b207688dc6434a3843cfc69", + "client_e_pk": "0bc6f1a0742fdf8ea32a460d4687415dcbbdc025a75428ac23e099e2fc4b0c44", + "client_e_sk": "a801cf5485b565ecca08f1440e414292523882607ce1f66c998f587ffc319cb9", + "server_s_pk": "5673968aa43d1a18946c985b63b4694b2d16fa61a08d2d71851365d837f1be27", + "server_s_sk": "87df702add62bf57840fbf4d66727a55b4ebf42dd8112f8cf4ee402ab3bb48d9", + "server_e_pk": "e4f34677d7a52fee8bb8eae525ab7190b6037ae4b258655ec27904e16b076465", + "server_e_sk": "d72cff2781755cf618067a48284052c43c852ea459bba9b8cdec2877b40ae308", + "fake_sk": "6e5e81189fc1108f84d9c5cadfff53d57d1aaf5560335449a3fa01300f267075", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00ca3be0d826f0109ef98d66c7b1ac37540ffccebc72d7a7db7c8e7500f9986f89ac60f44ae6a878663852dfa1265c36f533298d7278ab55f2531fdc75aa4cecfada", + "oprf_seed": "2b9e7c6b9d370d37dcbf75dc000a2913561106488bb46bec9b6ff83e62b50c920cd04d8fd1bee28c1e55f472e4d4ddaef092fe31a52da30a7e239b12f2321165", + "dummy_masking_key": "21ba59959d2c36f0e1aa0ca70bb3368bea42c75bbe7171a1b0bb7c19cc107273507e6f242c36e984e55b7a13d268364b44d0bb668679033c4fb124f130346f09", + "masking_nonce": "2c96079193f6a757a169df6333c691a84088bafffaa5bb6fea3c1c195816c6b31e1cb5db597e478dc70ded78eeb351d175033701d615bd7c461d486f38e60936", + "envelope_nonce": "3f8b48035290d518e8127014b1a71917f4b86cd8f0eb80eca1e76d84cde49a4c", + "client_nonce": "c269939c410266c693b4d8f5c05f3c6fb17658df3de24cebe5ff86f560c90937", + "server_nonce": "3b7478932529fe381ebd0982469fd250d27033ca3e7596bb904d7393c40877a4", + "server_sig_rng": "d7ecfa81816c76ad37281c88b0f28bb439ccd7d9374cebfe28a7c024def76924", + "client_sig_rng": "b8ef867f76a1c0e6761a2641fdb83c0e11a2834c5ce87325e28971bce04e0d59", + "context": "636f6e74657874", + "registration_request": "030028cb6963fc70560cc2a910db93f6aa0e575bbf2650d07e033c9b5872e7916541b62260a194399272aa006aa6ccd4107b21aa07d7cc80b266a43a455f951e7ce9f2", + "registration_response": "03019ec9e27b8b34e1955c95d36c819b148273648d05c5908802cce40fbb79eb7b879b566a8d8670c481e2c60d94c6c0a90c03106826621342a17f6057ecd87f988e0c5673968aa43d1a18946c985b63b4694b2d16fa61a08d2d71851365d837f1be27", + "registration_upload": "69b47ffde5381fe9f09574fa60a84631abc5061796dea35179afd7ce3e20c715baa83b68acbcbb89d0c193c24ffe0b8178a4ee9c229aabeeb1792694b8e0a52d9af6e185eab721886261a1c7eb610352d4a12743a986b4a2c6e3e17ab50978ee3e0afbf56a4f923c9500668e343f71cbfed373f80b207688dc6434a3843cfc6947dce2cc03c30bec149797995ba46fee5c85fd6a82601b389d36d763fb20ca2f6f5c87c069a8f59a20a9e3afb48c66268b52cd006ebc8977e18963b7c1353534", + "credential_request": "030028cb6963fc70560cc2a910db93f6aa0e575bbf2650d07e033c9b5872e7916541b62260a194399272aa006aa6ccd4107b21aa07d7cc80b266a43a455f951e7ce9f2c269939c410266c693b4d8f5c05f3c6fb17658df3de24cebe5ff86f560c90937aea592af8a10159b337ff21a1f718b3007aca195bed49bd26d1c424508739d4c", + "credential_response": "03019ec9e27b8b34e1955c95d36c819b148273648d05c5908802cce40fbb79eb7b879b566a8d8670c481e2c60d94c6c0a90c03106826621342a17f6057ecd87f988e0c2c96079193f6a757a169df6333c691a84088bafffaa5bb6fea3c1c195816c6b33fe35338da1f81b697ca82cb539050181683ff14d7e46e8b3ff417a6d8fce8a62957cdd9c22f40619276bc4b023ecf4f5c3dd9409f2aa84f290bb5efc21d634cbc8ddd1c39feef3501e918e050be2cd64f7690c118066e508ab2fe48616ededd151173f0439355730e089ee1ad08ca412414857febc3630712c78727c6e82eadd72cff2781755cf618067a48284052c43c852ea459bba9b8cdec2877b40ae3083ef44449f009a0cc946818256e39f62e3c2c371414975e7272b566a55610745d4d74e4e87d804463ec98b5af82f4bb847e43ffb2bd828653c30973fa828b017451bb4a30dfe5186c247c3921b27b59d88c149edbb007b3fc704a84d4351dd407b04545a912027059d26d0c8a03e53ea6466923b9d86f372c04b7d0eb5cacc7595f18d85f93c50c27f657038adc03cd2bf02fa32e5fb9f08c096dd1ea4a312ba0", + "credential_finalization": "830d58e6727307a7502a723761c313e71bf13ef108108b58cdf39ef9afa556a9e8a8f9fc9abd2d9b8a6ee443a824622f96578bac34a5a843667c454966852d0cd9fadcb8fd906bb3bfa4efde23e3a1cd6374a2c9e8b7aa14e84357a07bf86e69dffbb79564be10eb2c6300d3f673631ded30442c26da40758e7c04b424c557cd", + "client_registration_state": "00ca3be0d826f0109ef98d66c7b1ac37540ffccebc72d7a7db7c8e7500f9986f89ac60f44ae6a878663852dfa1265c36f533298d7278ab55f2531fdc75aa4cecfada030028cb6963fc70560cc2a910db93f6aa0e575bbf2650d07e033c9b5872e7916541b62260a194399272aa006aa6ccd4107b21aa07d7cc80b266a43a455f951e7ce9f2", + "client_login_state": "00ca3be0d826f0109ef98d66c7b1ac37540ffccebc72d7a7db7c8e7500f9986f89ac60f44ae6a878663852dfa1265c36f533298d7278ab55f2531fdc75aa4cecfada030028cb6963fc70560cc2a910db93f6aa0e575bbf2650d07e033c9b5872e7916541b62260a194399272aa006aa6ccd4107b21aa07d7cc80b266a43a455f951e7ce9f2c269939c410266c693b4d8f5c05f3c6fb17658df3de24cebe5ff86f560c90937aea592af8a10159b337ff21a1f718b3007aca195bed49bd26d1c424508739d4c034a7e246fe173420422a3916685618d3b2acef0ffbd4eee147e643977177205c269939c410266c693b4d8f5c05f3c6fb17658df3de24cebe5ff86f560c90937", + "server_login_state": "69b47ffde5381fe9f09574fa60a84631abc5061796dea35179afd7ce3e20c715c7e94d37aa246edba662f5592edb413b21b40dfd6b4aa621f8de5c313cee353b9dc8c5c57638a912d39cff3854a301a5be81fcd4923b65eac3b4ecc12934b0e4eea4182a5c62154b6347cd6532c0b5fb3410b5c43cd122dcc3c4cb1e9e3fbd8eb534464abce9164fb2d8814f6206232112f46aa323abad6da9647cb1509d333ed9fadcb8fd906bb3bfa4efde23e3a1cd6374a2c9e8b7aa14e84357a07bf86e69dffbb79564be10eb2c6300d3f673631ded30442c26da40758e7c04b424c557cd", + "password_file": "69b47ffde5381fe9f09574fa60a84631abc5061796dea35179afd7ce3e20c715baa83b68acbcbb89d0c193c24ffe0b8178a4ee9c229aabeeb1792694b8e0a52d9af6e185eab721886261a1c7eb610352d4a12743a986b4a2c6e3e17ab50978ee3e0afbf56a4f923c9500668e343f71cbfed373f80b207688dc6434a3843cfc6947dce2cc03c30bec149797995ba46fee5c85fd6a82601b389d36d763fb20ca2f6f5c87c069a8f59a20a9e3afb48c66268b52cd006ebc8977e18963b7c1353534", + "export_key": "043d43efdb5a8b0d493fe89cf0d752917aea2303466d8498d8155c36526526871a429becf4fe5768a34010246c45e1f2cac8ba937aebe479dc1a805a082101c5", + "session_key": "c7e94d37aa246edba662f5592edb413b21b40dfd6b4aa621f8de5c313cee353b9dc8c5c57638a912d39cff3854a301a5be81fcd4923b65eac3b4ecc12934b0e4" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_PH_P256: &str = r#" +{ + "client_s_pk": "2724724a2dfb4e1ae271fb871d5365fe5e8cd7e8a5e2772257a13dff09ce016f", + "client_s_sk": "de5976c98e4177aa074d94bd28bd7e2d1d3626f410c62da4eec522e556fd5dad", + "client_e_pk": "0b7e8d195f74e51c0e814fadfb55f6762104ba4ad964d41b24a1ea33565a24ed", + "client_e_sk": "6960b63a7f39e590ece7659c503c62ef0d0cdb40c601aa36a4004f56edd7329a", + "server_s_pk": "6e4c57f5749fc05809d4573cc9a16efdca73e42869b1c786d474f4aa1f7e13c0", + "server_s_sk": "c343d44570420c1ba5479b9beb587190f2d466abaf9e4c6dede7cd55169f659a", + "server_e_pk": "47a9231761ef50d4dd6861f2d99c72d272786ca5c8661a43f8fc32153e550ed4", + "server_e_sk": "1b263dcd61f494d1b42c12f519d15ba6c1d64ba9e86d1f4d84a59341a8cd5283", + "fake_sk": "6b7df14506361ac4b076202c1b1a9356f94c52dfef9196173f4014f5b15f3c5f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "cd36e3b29f418744b369a8d79d1d8ac2b7cb35861c9017382c793d7cc2dd9c08", + "oprf_seed": "b42c9ae8eeb5f4043d6f0d5d4932d85624556111dd931ebde67adc9886a95c38dd01553f7fc16605bd7883dd7c9d711479aa06ab4cceea709c6455b1cf46ffbe", + "dummy_masking_key": "d99cc8306409043f754c196c6fd37abbeffa022c2d7d36507e16d6c48b8cbe205f4815b2f3eb739d4fb39b64a4faf4772bdfe3ad695d7098f0cd1c3bc8118cbf", + "masking_nonce": "1d73acd40ce152298e6e8f58698b351f92f30439958a0a15084aa0c79e2785aba2642b9e389f7b97799d1359f788720c7b9b5bd0bcb2f467d18bfed40019d5e9", + "envelope_nonce": "a43bc371fd32916887e85e488d1cf3b16b0bcb71dcf7af48a221e774bf9b8996", + "client_nonce": "61357bd092cd852c5bc4a3ec771988db51e89d435e3b1f2efa4a301b6e12e6d6", + "server_nonce": "4ef370cc6269e0cb2beac953dc8ddd3665e2ac001cad78b82152edf4dd899ebe", + "server_sig_rng": "8b6487d8d37000dfad8f64196ed8e28e05d187ff62e3b95ddb31dc75a3837b02", + "client_sig_rng": "66a3b17466a4527b51e927a36217ec1344f1b72f8fd2b926b6743ba79d0fb336", + "context": "636f6e74657874", + "registration_request": "707b1af9f36b2a8d1fd746bbc13437e12b95a35e5057c912b11d50b545f9a251", + "registration_response": "4058ccd42d45e90c06acc7326ec46323bd69ad4869b13e9bb92954523c777c286e4c57f5749fc05809d4573cc9a16efdca73e42869b1c786d474f4aa1f7e13c0", + "registration_upload": "39166c119dffef7372bc6241e533d836635c07d199018f0d91f07302d053b70f0ceafeb52dfc7f3a50d1ec3bf71c5c1ad65d5d821834d24cd359cab12effd95239bb51fd2ab5c13e697a79772f3a4521986f1aa61b7e00de6eb2b48cc8989729de5976c98e4177aa074d94bd28bd7e2d1d3626f410c62da4eec522e556fd5dadcdb0ffa35af9c98918b9449dba44cd693e393d6f8b3424ddd91161798d84b02fa160dec543adbe81eb7b943f34fef98b8c5dd70e9c6fa45210f78ca1167a966e", + "credential_request": "707b1af9f36b2a8d1fd746bbc13437e12b95a35e5057c912b11d50b545f9a25161357bd092cd852c5bc4a3ec771988db51e89d435e3b1f2efa4a301b6e12e6d602f78c000eff79593ec3413bd1b6192336755fa3b85539f095ba167bc7803a543d", + "credential_response": "4058ccd42d45e90c06acc7326ec46323bd69ad4869b13e9bb92954523c777c281d73acd40ce152298e6e8f58698b351f92f30439958a0a15084aa0c79e2785ab8175e6419c8f94c03ebba2270fc12912e4453dcb94d3583a6c06c3cf48fa62d8517da44a539116f41a2a4a936cfded47a5e9e008b6e20c025f67bdfb7825e5de89e6f83b899560772eb698657ec4d6b48f10c0bcb4c50da797f19891df4bc9eabc2787c53a829c570c4c38f62f66379d7056cdf841de0c0f8e33e292bce4c6eb1b263dcd61f494d1b42c12f519d15ba6c1d64ba9e86d1f4d84a59341a8cd52830355d6795f8210a02661f52f392db2fc8e2f4eda15184b77e971ecd6426a3d4b534fbd95ea09007d51655d6a1544abe7f1446d5772fec12736e200d098be84a03f290d25ffe8a6166b44061200b3aec780d80310793c851ac567cb44325eec0c02a0e8d4969ab13b84408369814ee28e62562f863aeaed0f09af0e5b0cf45488d5", + "credential_finalization": "10e3fa745c5bedd30ed6b3e96339df8de259e4a1f2f12626f08b08e50a38158a6d1b16e36d4899a03afc09a2ede3d0d7f4f353963d9675430be17dd79b167a0c47c65a40304324e6f210540b48f4cb1d0aa70802b30d0b611300862aa177e045", + "client_registration_state": "cd36e3b29f418744b369a8d79d1d8ac2b7cb35861c9017382c793d7cc2dd9c08707b1af9f36b2a8d1fd746bbc13437e12b95a35e5057c912b11d50b545f9a251", + "client_login_state": "cd36e3b29f418744b369a8d79d1d8ac2b7cb35861c9017382c793d7cc2dd9c08707b1af9f36b2a8d1fd746bbc13437e12b95a35e5057c912b11d50b545f9a25161357bd092cd852c5bc4a3ec771988db51e89d435e3b1f2efa4a301b6e12e6d602f78c000eff79593ec3413bd1b6192336755fa3b85539f095ba167bc7803a543dadee722450a9cb218c14b6c2467c88f9cdac2e889cec7fd67c59a65f59b6372c61357bd092cd852c5bc4a3ec771988db51e89d435e3b1f2efa4a301b6e12e6d6", + "server_login_state": "39166c119dffef7372bc6241e533d836635c07d199018f0d91f07302d053b70fd78586ec5fa806faebd3b47c5ea2d50787759366ba41a622b06efbc8fc1d07d307b3ec0308df3a299ce63127ec4513114eb992c999bf77ee8ad41cbb23d23379264bd11cc120e83608528f2443eea0184b06d9b2aa934843331913ecd455bef247c65a40304324e6f210540b48f4cb1d0aa70802b30d0b611300862aa177e045", + "password_file": "39166c119dffef7372bc6241e533d836635c07d199018f0d91f07302d053b70f0ceafeb52dfc7f3a50d1ec3bf71c5c1ad65d5d821834d24cd359cab12effd95239bb51fd2ab5c13e697a79772f3a4521986f1aa61b7e00de6eb2b48cc8989729de5976c98e4177aa074d94bd28bd7e2d1d3626f410c62da4eec522e556fd5dadcdb0ffa35af9c98918b9449dba44cd693e393d6f8b3424ddd91161798d84b02fa160dec543adbe81eb7b943f34fef98b8c5dd70e9c6fa45210f78ca1167a966e", + "export_key": "98d8624038c906d8be5ff4a4be6c902689b38cb2da3baad65300bcbd4cee5883ed759be3b4c528d22eb52cbd31e66f255cf3887eb2a76d317fe5de43b7bb8083", + "session_key": "d78586ec5fa806faebd3b47c5ea2d50787759366ba41a622b06efbc8fc1d07d3" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_PH_P256: &str = r#" +{ + "client_s_pk": "89a8db8a582dc8ade65e8e7bb82e6f8c3a611f4e60aa87c4cf6b23de66715f1e", + "client_s_sk": "524b4b51093690887a2fa572b87d88e56f431f348ef1e6102725bdd1d5d6f878", + "client_e_pk": "9a0b94462be39625acf2aca026ca8c7334480ac1dc9217f0f1c8feec4b24a68f", + "client_e_sk": "61435cfca88eadc01390bfa4047510abffd3382e34d6ff9ef043db90902b06a9", + "server_s_pk": "c70ec229d54770716784e333cb81a4a161e52c0c5aeb4ceba34f4a2ba1626e39", + "server_s_sk": "84a502847c7594225705fe58d32967928d5943a39df608ba20453959355bee43", + "server_e_pk": "dada974654fc0244ec6795927cd5732332cc01fb0431a5806848f95ac390cea5", + "server_e_sk": "5b1bf2da67fcded6338ec10f314c459822d1d28f89dcc7b5eb3b10450270df65", + "fake_sk": "8496b073b7b4b9ff245903175e263536ffa2488adbe9d228dd01c34f2fb4595c", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "9df05b3fa3c71145e41e049303311568d84b22c1d846e3534b1abe2ab2be24e2", + "oprf_seed": "f9d1c26d824e480a5e091645419244951e22323b8cc90d2886b1385f3e4d55d8", + "dummy_masking_key": "e5fa8fd78e2588509a27898bd3eab6e4e33d77fffa625fcbe056fdb702eaf851", + "masking_nonce": "3318454e23f335d98b41eb6eee958b6209d88ded9ffa196b7c44b9893c168ef134de41dd6a280bb9a4e06ba9a55d13677daa628a59b54b9c3b68c9a1c7df48e7", + "envelope_nonce": "07af24f729abc49b1263f36272cc37cca1fb7b3be24727cf96d6d2b035d3974a", + "client_nonce": "1a9c073aba474ac8a33e5c3226bdd506d3859d00177d600481d35f6260829ff5", + "server_nonce": "a750bd530f3fa9f1c8b90a897ad94c6d9ff33838ae44c70556d4cfe0c7369d44", + "server_sig_rng": "9ce2ee5fd70ae22542fa7f369e3210aaa3dec621c81346a7cf38203e5804b86e", + "client_sig_rng": "ba050a18adfb14911e616a551f70e5efa645b7130ff5557a8390b513f0a2f7f5", + "context": "636f6e74657874", + "registration_request": "032a70471ea693e41ead44eaf20213054eecea7f306b9335b01cc3bdb515727cb7", + "registration_response": "03110aa3cd14d31a08712a38e5a2d754d3e811eeb2fff08ce8058264d49977b152c70ec229d54770716784e333cb81a4a161e52c0c5aeb4ceba34f4a2ba1626e39", + "registration_upload": "cfb362ce05607daede4516e1e2edae82f95876c464506110f4057677dbbbdbb69b49387f96c7bfebf62c5f719223bb0e1d4e8b44c06f77e9f8c51d72c01126e2524b4b51093690887a2fa572b87d88e56f431f348ef1e6102725bdd1d5d6f878db6cd107c34f13b38590bd9556d916bb14bbfaea41e48408245d9886119a7689", + "credential_request": "032a70471ea693e41ead44eaf20213054eecea7f306b9335b01cc3bdb515727cb71a9c073aba474ac8a33e5c3226bdd506d3859d00177d600481d35f6260829ff5023e10e8c7a69d6a118687c9585cc4773db2551a954ee19e3c66ac60eaf856a974", + "credential_response": "03110aa3cd14d31a08712a38e5a2d754d3e811eeb2fff08ce8058264d49977b1523318454e23f335d98b41eb6eee958b6209d88ded9ffa196b7c44b9893c168ef16b9302ac9dca21754c6f1d787eb82c4a4d1535964eec6c125600a8eb34c96d0845e67bc5c468d61de597ffad6191708c7ab625178e96c6739abd874a758985357aaf26e64fdec51e8b7267d2f03538bd5642370b2cf1bed8791fa39da85c1d885b1bf2da67fcded6338ec10f314c459822d1d28f89dcc7b5eb3b10450270df65023106ffe0511b7cbf176369cac0cd9657c25a659bcc3f42468db7b3eb2345208bb4cf81fc3a99f7a87f0efd774ae2733adbf1a14104b4d604d9e457b9a44f294574e54c36b6c4f0626d4f2cb647e8fbc723c45a478e9fbe62716ded57b50fd0077ecfab4d15e5c10893593b4c16d197bd0e544767d5d0e23c7f0b79b2e9c05982", + "credential_finalization": "79ccfe8725ac838db3a79dc8424530513786bd7f5877f6335f7f278d1bf1cdc1bb19bdacdb04cd33c97e3df8863e52ba4cba654c177efd75bbdf039e39b4910a812de39c6096264efa7044fb68a7039dbbd976819dfb3caca99effee1d02aaac", + "client_registration_state": "9df05b3fa3c71145e41e049303311568d84b22c1d846e3534b1abe2ab2be24e2032a70471ea693e41ead44eaf20213054eecea7f306b9335b01cc3bdb515727cb7", + "client_login_state": "9df05b3fa3c71145e41e049303311568d84b22c1d846e3534b1abe2ab2be24e2032a70471ea693e41ead44eaf20213054eecea7f306b9335b01cc3bdb515727cb71a9c073aba474ac8a33e5c3226bdd506d3859d00177d600481d35f6260829ff5023e10e8c7a69d6a118687c9585cc4773db2551a954ee19e3c66ac60eaf856a974510123ad4b1af2ba9ddf731673170f9684d21679f44318b70c59fe2ad43d520f1a9c073aba474ac8a33e5c3226bdd506d3859d00177d600481d35f6260829ff5", + "server_login_state": "cfb362ce05607daede4516e1e2edae82f95876c464506110f4057677dbbbdbb66a484decf8e69e1c3c45352b8cbb26f43e4cd7fd90e371b0b2a81cf35ce885f17df7cacc617e5ead2e180097dc0c1932a04b8de5e2d0ba32761fc6f760db45ac58811d8f7eb88be89dca26d8a88205c0215ab97555433a33d40394f9bdc986e9812de39c6096264efa7044fb68a7039dbbd976819dfb3caca99effee1d02aaac", + "password_file": "cfb362ce05607daede4516e1e2edae82f95876c464506110f4057677dbbbdbb69b49387f96c7bfebf62c5f719223bb0e1d4e8b44c06f77e9f8c51d72c01126e2524b4b51093690887a2fa572b87d88e56f431f348ef1e6102725bdd1d5d6f878db6cd107c34f13b38590bd9556d916bb14bbfaea41e48408245d9886119a7689", + "export_key": "e367e107e91f630032ed1c62701a5eab23b33d90cd1b5e8badfa9fe20636c036", + "session_key": "6a484decf8e69e1c3c45352b8cbb26f43e4cd7fd90e371b0b2a81cf35ce885f1" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_PH_P256: &str = r#" +{ + "client_s_pk": "f39807e6dd31c9cd93010e606582add2b402b31ee6cef33b8b5c772686274f9e", + "client_s_sk": "68541dff02b462fa3eb187ecaef19ad9c431d33462f63a4e468e104605c269ef", + "client_e_pk": "40f15c271ce6ea135d8e5d18683d95cf3e78cc22630cf37cfb29638131713565", + "client_e_sk": "54a6cf5821165ede8d3f6d733c4826d79ead35eabc3c03bfcbb72999c1502809", + "server_s_pk": "69d54ac87f84392aa0146e23fab69be259fb76645b0c344970802299bead0259", + "server_s_sk": "bd9ab4cb397dc93aa20ed6d9ad5df3d098d5c39bf934c04c70a0d7f17ebaf327", + "server_e_pk": "bb0ab9ef4df0338a84a717b212e3ac4bf58eca42676803e881e5bf1d9f990e9f", + "server_e_sk": "ea19f3b156401a9f17c44475004151a121b9a45c662a481e9f82d8419b03a0a2", + "fake_sk": "e57d876852321ee918d75d920eba28ed5c3a5f4e7a029c508697391fdc2582ce", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "f42c960d743df04b4dd9f14a7231f7587da6d59633860d15ab877d39b7309d4bfa6d79f27969f80b12a7e0f4fb4c2f67", + "oprf_seed": "91dbd41dd7fe8174508a5fe7e6eac5e1465245bc96416b8ea20f6e5203ba53e29c49bbf3c29f683443592ffd4968eea3", + "dummy_masking_key": "889058acd8c90e9df0c4a8fc3b287d6bac62469371ee4e6ce8016a942b2337671d75231cfbcd0ad92235107c6fc8e27e", + "masking_nonce": "e03190464fe1b318906e93d6a754c898d6751cc35952b1fac4781360117fd0cf30c7c95dc773ceac056f0395b2ced88958911da6970c2b5b3999522cc683b4a4", + "envelope_nonce": "bd99777ed47798dec36414cfc321752607c1a3e234949fc3ae2f179773d87322", + "client_nonce": "fd18cacc9cab4a3b98006f81cc8c67843100f418906a3d59b0aaa8a2aaa4f9fa", + "server_nonce": "65799e34e56a32dbc5301ef1ad363db6172302728ddbc75b650df48df229ed63", + "server_sig_rng": "ffea5c1ca002eb9ecee0a8c750f470602895d74e151f6fd0584a1dccc532be0c", + "client_sig_rng": "6f4a0b33227fe8baf9be304868afb03585f43551db83858533a4146f0a7c492c", + "context": "636f6e74657874", + "registration_request": "02631b6f159829f28f7dc84b26d8f81f830231ced8b84e90677fd5d815017edfb4ade026d8605b7ffe98d0e7f882e3cc1d", + "registration_response": "034feca54341bde6885690625e6b0a575d7923d649c7620ac08330ee27859647b6ce198904834071c402308cb007f274c369d54ac87f84392aa0146e23fab69be259fb76645b0c344970802299bead0259", + "registration_upload": "ee871a0e197242fe7b52ae7b5951b282a7a491d307a6e7dbbe0670302449486929a746c712d62dde5fbe5023284aaf08ae96f9ff99e7e8c6cd515915667c4938ee2be6a1d633abd17ed7ba5503622e0168541dff02b462fa3eb187ecaef19ad9c431d33462f63a4e468e104605c269efaba2d22ef03363413dcc5cc8d38d5d4bd178c8fa7f8b6faa41b256e661dd96bf3d89c237d318b671ac36e592f300e29e", + "credential_request": "02631b6f159829f28f7dc84b26d8f81f830231ced8b84e90677fd5d815017edfb4ade026d8605b7ffe98d0e7f882e3cc1dfd18cacc9cab4a3b98006f81cc8c67843100f418906a3d59b0aaa8a2aaa4f9fa0331a9824023caaaa69dfbcc0b4165180300cea2043a683ec6a1bc5340dafbd0d6", + "credential_response": "034feca54341bde6885690625e6b0a575d7923d649c7620ac08330ee27859647b6ce198904834071c402308cb007f274c3e03190464fe1b318906e93d6a754c898d6751cc35952b1fac4781360117fd0cf0839ca7ee4067685d7533b0cab902a000689d62e80c90e3e59626438be59022c862cdde8f06d819ee8278762ee88dacee77d9b5aeeaaa5eec3309ddfafb5d7d1acee40dbe47100481c2257ba96c85717f94504d12a61d7419693298b8dc2a63096a84c53b25289e8cd8e608769fedf70ea19f3b156401a9f17c44475004151a121b9a45c662a481e9f82d8419b03a0a203c47a97b954383e7c1d14d8af11f8643ccb2d0b022f7abe43b1695291b4be6e53d58fd739956b2a001f6412982cea667675dcbd2585d7bcbd978f548012b52594206b250ccedd45fbea5a1ba7efaa5edcd18c79819fa4e78aefb3d925f4202702a88c701ec5ec91765e96c4529c6e27c705d914c1f95f1fd1a56b30ea242f8e0c", + "credential_finalization": "d65e18e9b44fa8c71d17e14b818874cc3e8f7abf3c68f3991272744ee62334c606d1a21e3d0760dcb8aec97b19ea9a760a36b8754f785fbb608aedb51a13b705b2aca9db3cb81de02f110ad33feab2da03bf5529087e2d8e71db75ebbbe2e265", + "client_registration_state": "f42c960d743df04b4dd9f14a7231f7587da6d59633860d15ab877d39b7309d4bfa6d79f27969f80b12a7e0f4fb4c2f6702631b6f159829f28f7dc84b26d8f81f830231ced8b84e90677fd5d815017edfb4ade026d8605b7ffe98d0e7f882e3cc1d", + "client_login_state": "f42c960d743df04b4dd9f14a7231f7587da6d59633860d15ab877d39b7309d4bfa6d79f27969f80b12a7e0f4fb4c2f6702631b6f159829f28f7dc84b26d8f81f830231ced8b84e90677fd5d815017edfb4ade026d8605b7ffe98d0e7f882e3cc1dfd18cacc9cab4a3b98006f81cc8c67843100f418906a3d59b0aaa8a2aaa4f9fa0331a9824023caaaa69dfbcc0b4165180300cea2043a683ec6a1bc5340dafbd0d68db3c33c2a60538dde4e0a83c25a898a921d68af8dbb4f8dbab22eeab39647f8fd18cacc9cab4a3b98006f81cc8c67843100f418906a3d59b0aaa8a2aaa4f9fa", + "server_login_state": "ee871a0e197242fe7b52ae7b5951b282a7a491d307a6e7dbbe0670302449486939eb9258f4f5f17300a97a67cd9ca525ec5a910b671fe5f07fca67c103c042cd621b7f9331246b3bb0cea953b9a9f555506441ea5cfafc9af0d49bc786764e4c45ed98d1cc8f774f20ded0ae72907bcf7dfce64590e3be0be551f86f9dc2fb7ab2aca9db3cb81de02f110ad33feab2da03bf5529087e2d8e71db75ebbbe2e265", + "password_file": "ee871a0e197242fe7b52ae7b5951b282a7a491d307a6e7dbbe0670302449486929a746c712d62dde5fbe5023284aaf08ae96f9ff99e7e8c6cd515915667c4938ee2be6a1d633abd17ed7ba5503622e0168541dff02b462fa3eb187ecaef19ad9c431d33462f63a4e468e104605c269efaba2d22ef03363413dcc5cc8d38d5d4bd178c8fa7f8b6faa41b256e661dd96bf3d89c237d318b671ac36e592f300e29e", + "export_key": "e66c6ed7a59125297d5066dff33b96c35167ecd9c039d530ad10cbbe55579a629195dbee7c5a6e2d723cd3960f511ca4", + "session_key": "39eb9258f4f5f17300a97a67cd9ca525ec5a910b671fe5f07fca67c103c042cd" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_PH_P256: &str = r#" +{ + "client_s_pk": "04fa09cfc2ab9e8983ec893a894a2421822fd538489777a881c9d8a738a34736", + "client_s_sk": "72260778bfebc27ecab87536097d1b88296ce90515d860dc70eca136325a93e8", + "client_e_pk": "8a3b89fb3338bd288eb82c03287d6e5bf5e0a6ae5a1810dc36a95a3b164c0c8d", + "client_e_sk": "23951f2133ca709282435fe7693708e5a4bcb749f2df18e1577da61468f804df", + "server_s_pk": "505fab346687e11da422458c4179e2dc88dece4a50fed3bd40d197de5dfaf60c", + "server_s_sk": "df20892ae0ff7d2dd0745ee03696e522fa1dfaaaf8a5832a27bc49aa7d89ae3a", + "server_e_pk": "cefcbafff3c56f53a9489b5ab67bd7781609b914a8580f04bc58c53f43addf04", + "server_e_sk": "a2922cc375e1c703adfbeb5870b251d9cb30babe89d17f25b52cf7de1f5a9ce3", + "fake_sk": "ee21f4f0b5e51e45a1e3963da928aef446066eba75d32d6d16666fe64894a326", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "0043e1f4e2335952fce58c7e196da8d3af4d930d3cf744d9e2c53ea1d7fca68fe3d82e29b1673e641de871bf8acbb9d90afd387957cc46a0bb8bd0bdd38376287e55", + "oprf_seed": "7ed27d5536009c189b629d031c6fb79787bcd2d15a3545ada5ca1deddefe4d3d9b451f881db71c53818b577a5f918c0462b18cd4ed86fded52907be2f932e602", + "dummy_masking_key": "05c48d37975d8a5c2107d65b10fa4b9c86a4aee5cdeffc32be3d0ddba9408678554b16821262876825558eb9927e4b8a5d37a870c4277fe3383dfdc45129f36c", + "masking_nonce": "2d9f3037a8faa6132c4e9425f2c535927e34925676a5c2c46631051978acbd25aa30e07eb249d9c6c20a2293ac152336e56b56a305fd0364ccb878df5fbf6356", + "envelope_nonce": "cbfed5bad6213bd569602fe36d23c2fd41406bd2f85c7eeb459e86532838f4c1", + "client_nonce": "b7cd6028fa2984aa2f7212b37f11a1ede38f573b5276b70c279e718541fd88eb", + "server_nonce": "3be6d518f636a931b3fd8cd8cd1fbd32bd5e5eb544b9536f1f9fa92319ef3c90", + "server_sig_rng": "8cf2b9a221fe439376a02bf8a82e6a8c12ea2fb16ef2a99e46b9e88362882d63", + "client_sig_rng": "c5acc7d40ae158075e9b5fa20e16dc944bab7988871d445325d68a1b1ff84e29", + "context": "636f6e74657874", + "registration_request": "0300fa7d9a105a1702f31a43a2797a4cf333de7124dc288d0326a7fb988bb442b8d79539b97066827434f9a7069759e7e519058db17af921530090738ad411858e8bd3", + "registration_response": "0201d2ba94ef7ec29bd5b63bb1e52b4fcfbc2091ae1f7e19b4723bf63de25939aba90f52e006a448ff0a78f2156e8b11ccbc390284563f5f95218d640f9e22252d7c21505fab346687e11da422458c4179e2dc88dece4a50fed3bd40d197de5dfaf60c", + "registration_upload": "2739275e6bb80261e91b483d91328e8d3a5a8b649cf17e98ececab0757ddb3bba651e974759e4cd17731fef755e53b8cc15f3bbe78ff6bb27d69bde374aacf89a881edf2b839d0d59aa786f05cdd7eacab272f6fe196eea313141fa13b6cfafe72260778bfebc27ecab87536097d1b88296ce90515d860dc70eca136325a93e82774cf82766388d9188bb2165fa59b4c153a4d9cf5a81282154b82523bf51b7414af811836f8cd1b6c4c58be778558fa2ed99db63fd81b4488df2bdf13d1e807", + "credential_request": "0300fa7d9a105a1702f31a43a2797a4cf333de7124dc288d0326a7fb988bb442b8d79539b97066827434f9a7069759e7e519058db17af921530090738ad411858e8bd3b7cd6028fa2984aa2f7212b37f11a1ede38f573b5276b70c279e718541fd88eb03029a36b773c4c866eda0b9e2a2930aac55607f306d6f09935990a9f46f320757", + "credential_response": "0201d2ba94ef7ec29bd5b63bb1e52b4fcfbc2091ae1f7e19b4723bf63de25939aba90f52e006a448ff0a78f2156e8b11ccbc390284563f5f95218d640f9e22252d7c212d9f3037a8faa6132c4e9425f2c535927e34925676a5c2c46631051978acbd251940cd01845f355ac589fa5a4caa3907881b8fdf662499dfd8c71e749fba7ac180eb64fc6e8f46d37bedc5589d9aca390b2bac6a25a5cbb7f2a1ce3e880773816f7670269168adae7dbbee1976f523b7f924cb4c3cde2c41a9d6882c68b8f902eda88b6d513d7a2ae527178e0a0b1620bf1e92b8c57ce7dbf69cf68bbcd01ed4a2922cc375e1c703adfbeb5870b251d9cb30babe89d17f25b52cf7de1f5a9ce30275a4c91fb64d74deb6d459ffcf9b576c278e789cd84d3da7bdaaf79c418b5f24de1583f0425184d3175502bf486bf0404e56495d277dc18ce2f96b25869770cb5cec7bde0599988b509b455c6550cbfa5321321461686965d813ebbc19fc6a0e701bbac43fdd2218f32621047ba362fd0e67aba872a2014d8085dd78f5860eea", + "credential_finalization": "68107bd149e6fc99830fccebaa65322278ce6b51f1cc1b8dcaf94057347d0b3911e109cb92f30b3252553270930d2a8f366f74572e50923dde7f5363467c7b093d0a2c3362543e254533087d7b2d2b0991293597a430a46a15b58cd1a5c9223f", + "client_registration_state": "0043e1f4e2335952fce58c7e196da8d3af4d930d3cf744d9e2c53ea1d7fca68fe3d82e29b1673e641de871bf8acbb9d90afd387957cc46a0bb8bd0bdd38376287e550300fa7d9a105a1702f31a43a2797a4cf333de7124dc288d0326a7fb988bb442b8d79539b97066827434f9a7069759e7e519058db17af921530090738ad411858e8bd3", + "client_login_state": "0043e1f4e2335952fce58c7e196da8d3af4d930d3cf744d9e2c53ea1d7fca68fe3d82e29b1673e641de871bf8acbb9d90afd387957cc46a0bb8bd0bdd38376287e550300fa7d9a105a1702f31a43a2797a4cf333de7124dc288d0326a7fb988bb442b8d79539b97066827434f9a7069759e7e519058db17af921530090738ad411858e8bd3b7cd6028fa2984aa2f7212b37f11a1ede38f573b5276b70c279e718541fd88eb03029a36b773c4c866eda0b9e2a2930aac55607f306d6f09935990a9f46f320757803976b6a574c5f1575229a923866161f48c47f9527bae4728140ed69395e48db7cd6028fa2984aa2f7212b37f11a1ede38f573b5276b70c279e718541fd88eb", + "server_login_state": "2739275e6bb80261e91b483d91328e8d3a5a8b649cf17e98ececab0757ddb3bb4cb5392f554e26f9eeace4660720ad0062cd29a710f68f044cb96c4127077aba14448237852b032d31c1a1f263f708fbce1bd990f323cd41c1b49b01cda773d9310118c98ac2f261667c795bb177242f5f6cd1e3fab63c82e7e2692eb71d6c2c3d0a2c3362543e254533087d7b2d2b0991293597a430a46a15b58cd1a5c9223f", + "password_file": "2739275e6bb80261e91b483d91328e8d3a5a8b649cf17e98ececab0757ddb3bba651e974759e4cd17731fef755e53b8cc15f3bbe78ff6bb27d69bde374aacf89a881edf2b839d0d59aa786f05cdd7eacab272f6fe196eea313141fa13b6cfafe72260778bfebc27ecab87536097d1b88296ce90515d860dc70eca136325a93e82774cf82766388d9188bb2165fa59b4c153a4d9cf5a81282154b82523bf51b7414af811836f8cd1b6c4c58be778558fa2ed99db63fd81b4488df2bdf13d1e807", + "export_key": "f929bce2d59caa4f754011b339922da7abda3eb00205ff849bdb74471c76e10c6a84d03b41c0928545c6076e57fe578a7f414c1cbca0be2146c38b8f99c07616", + "session_key": "4cb5392f554e26f9eeace4660720ad0062cd29a710f68f044cb96c4127077aba" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_PH_P384: &str = r#" +{ + "client_s_pk": "4b915ffb97eb3162cf045197d28a2c6a74e572a95d8f49d9a2668dd0d5c15039", + "client_s_sk": "2b27f5289029eef5858a1264c771229da51640b4515c35b8f5c0e423aff0435b", + "client_e_pk": "fbead5de0bed7a74e5a5ff2ac4076f4b2e3c88efa12823f964d36b95b7f6fc22", + "client_e_sk": "a8af607c684ab872dc7ed53d590e24b13fc144be9fe5198f1de0afea589053fe", + "server_s_pk": "e876e8278874673014727751a21bfa9294551da01ced7aca0b1975250e091c76", + "server_s_sk": "bff2e5c6964ed3d5d3235eee6de3a3711cd1cb13f4a59d727c2b56148bff8cb3", + "server_e_pk": "a59230d01a76cb1bab5de9dbd818afdd9f94331f0117d09fef10c5bcb78d4ef3", + "server_e_sk": "b622c21ef351e344cb38d535904b7b7e15ed50dd1a4be8f63097b34f3033c382", + "fake_sk": "469ad9317ebc7024ee6c025a75b95ec37101ee40c46ad09582645b53217ed541", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "d7ea3499c613a757444d118501a668fdb1a01dcf4f1284ea7a328210e161370f", + "oprf_seed": "8861c4640c7c2bf82916a023991ca754471684cacfab51a6bc95915c9ecf97dc442338df439fc709d8b47776f5f02a9c647803c6c558f25e0ce531decfb7b7cd", + "dummy_masking_key": "07c45747f5e5f628f33cfd687e27f1e482a2b3fa7ab765a4aa1b9672c4f214b03bdb4fd3dc2d656f341a952a56a02fed10a1b8ea155c7c991f1a534ab333b02b", + "masking_nonce": "eae6351b26d5a0ed648df824f042a311fadc5ec15bfc3894f310979423cae79c5a68dbbec882e4bfd154d0fd3b45a30b5b99e309c874d647590be3f6b3726441", + "envelope_nonce": "4a21fbe608a3e8536828c90ade1c0be64e9b68b8ed42a6f5e0175375795653cd", + "client_nonce": "e34d4ae832471afb35a75a4877c872832d19f65e0d3c54ad905f83f0f153b841", + "server_nonce": "2e239476298f94dc4a81e5429efbf25411d4b3569e7790d98a15ab90e5349f9e", + "server_sig_rng": "efffbcd2955e684145ee21cd1e1c664e48b1f7dc62369321ac7998f0a8af16bf", + "client_sig_rng": "6f229746cb50b491e7dc0677cd2bbc30ce9d6f66edc675833520b855e878d2f4", + "context": "636f6e74657874", + "registration_request": "0a726b0c3c1afa0a030f0a209730378b8a0e04391e1b58b74f4623b99655dd4a", + "registration_response": "d04dd13e2812452307ee3e24bf77e833d41705d393fad573d0627c0605a64169e876e8278874673014727751a21bfa9294551da01ced7aca0b1975250e091c76", + "registration_upload": "76ce8492e1a267d6ad6df435bbcc40e5a732ccb72c098a029102622764d1111b4d8c66e92fdf87a3c1176ab5ecca08ca66646148d37a8e315c19401ddafe09d61fbe71545d6fd9beef99d8892fee24fd2a40c651530feed5fa9383f8409f688e2b27f5289029eef5858a1264c771229da51640b4515c35b8f5c0e423aff0435bbe147d6ba5aaf0584422da0be5ed35ae42536f58e18864f6fc64c390316d75f9c91abd78a5431f75927fd61a5d5fa7c796f243be344488e6151b9fee53881015", + "credential_request": "0a726b0c3c1afa0a030f0a209730378b8a0e04391e1b58b74f4623b99655dd4a2d19f65e0d3c54ad905f83f0f153b841d7ea3499c613a757444d118501a668fd0367afd4d7515bec98df39ff4b0497a3bc210db44a7aa68c138878f0571bc70116ae177ab6acbab2c5c002eaf61a514454", + "credential_response": "d04dd13e2812452307ee3e24bf77e833d41705d393fad573d0627c0605a64169eae6351b26d5a0ed648df824f042a311fadc5ec15bfc3894f310979423cae79cc70ef31f257738148f53bcab6172d42d0190aea963621ebab31e94b7312feb3586003ff1aa55cb57fd315faeccc3a48c28ef5fc2a33f888150107b85eb90e5dfd2fdc5fd34b455456ccc17c39781e4397bfdab528f1623ff0d4ab8ccef405eeb9ef9e6faec9ed3bfd9471e62c31fe430d6c7a74bc14145591153f2431ee7ca2d15ed50dd1a4be8f63097b34f3033c3822e239476298f94dc4a81e5429efbf25403ae8a7e3db1d5e0f8f69d3b2928de42348731134b0d8b5571389ca78a9e522f1eea6e92a5315910bc5293b1fb9f31edccc603b8f9d65e9787b0ac5db31f4f431c672971cf7a2abce636db4c251f03d5b5dda65c935101093f1fd1c5ceb66016ab05701f59fa20e43f11e68bb94a81610bb10813dda50958f7d00f2334f535378045bd3accd856c9cccf72323f8c05b79a275196042b3ab81c6d8b2e06ee687f4e", + "credential_finalization": "5869a224f6211e02c0d8b54611aef0231a37315c252702766b0da881b998093141c61f12bf1678eeb7033eac1d36b291f6fd754af914c868744372135a4ef90bf6fe4c4b2ed78f01835c97b7871f7f3c6ee2a0d877923b8f150beb4ae088e906019edaef1d99ec61f137f14c2e8ecab8", + "client_registration_state": "d7ea3499c613a757444d118501a668fdb1a01dcf4f1284ea7a328210e161370f0a726b0c3c1afa0a030f0a209730378b8a0e04391e1b58b74f4623b99655dd4a", + "client_login_state": "d7ea3499c613a757444d118501a668fdb1a01dcf4f1284ea7a328210e161370f0a726b0c3c1afa0a030f0a209730378b8a0e04391e1b58b74f4623b99655dd4a2d19f65e0d3c54ad905f83f0f153b841d7ea3499c613a757444d118501a668fd0367afd4d7515bec98df39ff4b0497a3bc210db44a7aa68c138878f0571bc70116ae177ab6acbab2c5c002eaf61a5144540589197f14d1569dc6b2e666dbd560a82c31713296bacbfc9c2c3f0af578b3965c436f8293cbb7e713df20ab20fcd6c22d19f65e0d3c54ad905f83f0f153b841d7ea3499c613a757444d118501a668fd", + "server_login_state": "76ce8492e1a267d6ad6df435bbcc40e5a732ccb72c098a029102622764d1111b1ad656dae992cbc429fa3618da2b7fdd2d8b62da291ed6519ab91e77d45121ed499e0550675c454b3b61749906baa714f5187712ab90416ce0f791548ee9ac4c3b9482ba86e69195a2edb5073ef2b52997233725074912b3bb45f3f49eb0377e83da466b94bcb69228c2533bf47e5390f6fe4c4b2ed78f01835c97b7871f7f3c6ee2a0d877923b8f150beb4ae088e906019edaef1d99ec61f137f14c2e8ecab8", + "password_file": "76ce8492e1a267d6ad6df435bbcc40e5a732ccb72c098a029102622764d1111b4d8c66e92fdf87a3c1176ab5ecca08ca66646148d37a8e315c19401ddafe09d61fbe71545d6fd9beef99d8892fee24fd2a40c651530feed5fa9383f8409f688e2b27f5289029eef5858a1264c771229da51640b4515c35b8f5c0e423aff0435bbe147d6ba5aaf0584422da0be5ed35ae42536f58e18864f6fc64c390316d75f9c91abd78a5431f75927fd61a5d5fa7c796f243be344488e6151b9fee53881015", + "export_key": "adc5bb9e7bb71c0427a7d529b10d60e7e8cdd3287ccfbb12142ccf2aee78cb03f7137784e0959e2a939cb0d05a7970f33c6a4eca44a70669eaafa73f722453a0", + "session_key": "1ad656dae992cbc429fa3618da2b7fdd2d8b62da291ed6519ab91e77d45121ed499e0550675c454b3b61749906baa714" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_PH_P384: &str = r#" +{ + "client_s_pk": "81d7e4c745361293e3265b7117b679ab7f94ff94d3e986f5f975f7c378864a3c", + "client_s_sk": "a71300aecff1f8a0329c2a2559e4b3e8e0b7d891edd27b1c70d581a02523224d", + "client_e_pk": "875a32cf80dbf09f561e657b2c57d5e1855c518367d6f9ee95fb1ee8165ef726", + "client_e_sk": "84ad60da53d3e0cd2fb81db11aeed3e0242cb6a8876be57f52c890998492fccd", + "server_s_pk": "a527c8a59a1d3ee765d473939c45fd177e3c23960307adb39a4819d6506e9138", + "server_s_sk": "17a540253c57c2ed0133261cd1a28ff6cb047ef01b7b4e419c9b89f27e7f9788", + "server_e_pk": "907ad8e3bab57f089f1bdce2bb10619b69bc1cb0fd76ba9d0f23b690ede599b4", + "server_e_sk": "62e00efcbda1bd971f432ccd5855e6ad3a6c8fb509bf527ffed516b3a7aefa33", + "fake_sk": "2cbd3c3e1f4765b5fe299dac0f73b36ecc6ed04cae15d1e06a92acd2202d825a", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "e4d98e3c1ab94c2b74d981ee0277274723f8df7940288a9cfa443a7d1391720a", + "oprf_seed": "128951b5e787249803093401138a282a644ee3a3a7ec892578bb37c198be1fd0", + "dummy_masking_key": "6f3df61630c2ba7f964a2063cc52e938cbdcc984c8908afdac1ca856b344dbe8", + "masking_nonce": "e62123ecedd5a11e6e7160d333922bd66a430659fa7b9b252ea5e3f9fa264dfd73f89894091af9b24dc9ebb660025eff3adc9f04a25439648e2c687909920ec7", + "envelope_nonce": "883b69687a76262bd0b1c096427363a19bd0cb0e51fcf37f7bba16f5e609e607", + "client_nonce": "b44eeccbe773d21bbc44539f7e0e23b33a9eddd054ca7d43f8dda8243e1a6c1d", + "server_nonce": "e7b8d661a8ce54a87e7c77a7ab286c423cf912ed323d9b08d2aa0c123d0d39b2", + "server_sig_rng": "20c75a968bf14c3ceb26b041e3a11e8e2ef64adfc91d1d4538f7ba856abddb9e", + "client_sig_rng": "422de7e0b9fa6b9b2f45effc5a2ecb2e28f57c9adf064b56f17c545536026cda", + "context": "636f6e74657874", + "registration_request": "02ff4aaab2678517acde9fa4a1c622615d2dc7623236388bd3c3fa09332efef1bf", + "registration_response": "0277982b9e32e715f33af3ef4f26b9991e339840a71020bdef8c0bdf7e8a2edc5ea527c8a59a1d3ee765d473939c45fd177e3c23960307adb39a4819d6506e9138", + "registration_upload": "c8cd9c6e91b67cc9c0972f87012eda035c371035fc9053ac9876898dbc0092caebba6fb66cd472299321ffaa544dc36e11449a17cdc4b0113d0fede49e10a291a71300aecff1f8a0329c2a2559e4b3e8e0b7d891edd27b1c70d581a02523224d4ddb6669b3e52aad974e5890bb139215f08cfdba0cb24fe46caf9916717b295b", + "credential_request": "02ff4aaab2678517acde9fa4a1c622615d2dc7623236388bd3c3fa09332efef1bf3a9eddd054ca7d43f8dda8243e1a6c1de4d98e3c1ab94c2b74d981ee0277274703b32b8eadfa1d6180d76e86ac1f31d13b733363fa041807314f86858566351097cf4e790b44853b17440429ed76064c38", + "credential_response": "0277982b9e32e715f33af3ef4f26b9991e339840a71020bdef8c0bdf7e8a2edc5ee62123ecedd5a11e6e7160d333922bd66a430659fa7b9b252ea5e3f9fa264dfdbd68dafddac88b0c779856ae93f98477b49ffc7aba2ab2a919a6457a4ae8913cb940e008a2ec61c0ab84f442e870902b6d7dd25eff4ef9b490bb7eb5e7e7ffc55077056cfb2fa298b1748222a1dc1f25c70624c65bcfc09d5026ed294d645c733a6c8fb509bf527ffed516b3a7aefa33e7b8d661a8ce54a87e7c77a7ab286c4202fd7545b8ef04c37765d549e4d35c35bd684f7847b5548582aa71e09c49c21df0c45b09a1f388d3b886ae5f83543287e05f849b74426e525bcd7d64675234e4e94f42e559c929a7f73b07f830bdf022ac6675ee14cb933e4d098a085e23060206547bc9eca99f681d1f3ef98408a919015e76395c345feb9dcdafeb885740f1d22b6b2cc80f8d404fb0c257bf096f5645b5d48d63581a01d836a740614be33891", + "credential_finalization": "abda3d32743141ce7fd729ef5efc24d507f833c59616cf37f181bda115b188d98f04f69bcf2d58fc80712dd61a1b4e678c6e2b6075ca47c4f76a71c98f129c0035050adcc4b9791615a6a333b7863e51c90df50e3ea3fd0040c28b1a5f5465fa010b7d41f5bad5916386cde35ad0a80b", + "client_registration_state": "e4d98e3c1ab94c2b74d981ee0277274723f8df7940288a9cfa443a7d1391720a02ff4aaab2678517acde9fa4a1c622615d2dc7623236388bd3c3fa09332efef1bf", + "client_login_state": "e4d98e3c1ab94c2b74d981ee0277274723f8df7940288a9cfa443a7d1391720a02ff4aaab2678517acde9fa4a1c622615d2dc7623236388bd3c3fa09332efef1bf3a9eddd054ca7d43f8dda8243e1a6c1de4d98e3c1ab94c2b74d981ee0277274703b32b8eadfa1d6180d76e86ac1f31d13b733363fa041807314f86858566351097cf4e790b44853b17440429ed76064c38a0eff4e41a445e197519cdac25b90a4e622fda3fe45c33986a60384468dd3d2f462fb0091cce539948ebec535827372d3a9eddd054ca7d43f8dda8243e1a6c1de4d98e3c1ab94c2b74d981ee02772747", + "server_login_state": "c8cd9c6e91b67cc9c0972f87012eda035c371035fc9053ac9876898dbc0092ca185132df49732d3b9d795220bde4ce667c5e67eb41c6ab8dfda8204ee2c0979d8e13311136b92e3607848fc19be2c88fa0b67573ed7556f710f7f6e2fb8ce03558c35a3069ee7b0b27cae92b2c615293aa6c28d88204b4a87195a41fa27d6af7c67e2bc4791a1ec4cc0cecc956cca09d35050adcc4b9791615a6a333b7863e51c90df50e3ea3fd0040c28b1a5f5465fa010b7d41f5bad5916386cde35ad0a80b", + "password_file": "c8cd9c6e91b67cc9c0972f87012eda035c371035fc9053ac9876898dbc0092caebba6fb66cd472299321ffaa544dc36e11449a17cdc4b0113d0fede49e10a291a71300aecff1f8a0329c2a2559e4b3e8e0b7d891edd27b1c70d581a02523224d4ddb6669b3e52aad974e5890bb139215f08cfdba0cb24fe46caf9916717b295b", + "export_key": "8751608c4df6c82610b5d0c4d4a99a9664aa5eaee8db6b3110a064f0cf0b9eff", + "session_key": "185132df49732d3b9d795220bde4ce667c5e67eb41c6ab8dfda8204ee2c0979d8e13311136b92e3607848fc19be2c88f" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_PH_P384: &str = r#" +{ + "client_s_pk": "ae7501d6f45cbb7daee41fa4acd04db1ebfda73fd0d55f1b4435badd8c5dbc57", + "client_s_sk": "05ef5229edaf9cbd7a766e58b0425375a60b48aa84e96096cf96be4c6c8f8604", + "client_e_pk": "94a2b716ad9d044c5c8706703759a4030a27fb1d493e95f0dd0d3c50aa5e73fb", + "client_e_sk": "2010634a4dd73a39254168a85c92ee3b4bb8b30bc324e42737406de00e7f272b", + "server_s_pk": "7bfaa50f13cfad60341ec73c2b82b580197e1307d2673e5c5748c52afe60a0ec", + "server_s_sk": "55775a4458e0ceaea2b7c701f71b1d78a209247083e8ad9359991de3c862d32e", + "server_e_pk": "8bc532801e5b04e84701ae8944c39801cc6ea9443e6d1766660a35463dac21c7", + "server_e_sk": "0d51fded3d21490d0416345732ab133547707cd012bf24b6034d517c900209de", + "fake_sk": "90ac2c206c8a4835d9ededa2351ea3ca42a129043b49c7a44a01336e296fa58b", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "ac2d6cdadaaabcee7155ae0bc2df340166b05a3ac9980d5eeb5902066b4bbfcf82b23eeab2e24366cc2d1e4e89de17c2", + "oprf_seed": "8c17fbbe56e52489118696cac925c1df9dbea1727830a95c078ccbb5da32a071cf4390ea098819c1cd179438a4a29951", + "dummy_masking_key": "d3b8e773a4a5e2cb107bfc4790a915e2b452222765437b8a915dcb27be2010b1e29e46513bc2b87a171b13ca66112fa8", + "masking_nonce": "6f15a1f815db3f26a9ba06bb7f4bc88a2ecf13995339d7d445781122e04e4e75aa8570de7651f949b5f822c0daa6b5e4dc0dc43d072481073b5b0776ae3981e6", + "envelope_nonce": "d267a923fce4dbe5b6f99ff80d833b56dab882567b63dda3f2e8493849d87c55", + "client_nonce": "f0bc69fe03e222e11ad6ab2613aa4bfa29431145be134b006a9e63c76d02a6ec", + "server_nonce": "6957342aa6dec19fe3e9e7641f58e2614e8a69187aae9ac07139a0af0deb2cb7", + "server_sig_rng": "1b664d9bef7d98f9e218958a5936202b9b40cf21c301173c45fb3728a8ea162a", + "client_sig_rng": "9524854212a615322aea446f94fddf62da6d3157befb946e1b7e65d2153d929f", + "context": "636f6e74657874", + "registration_request": "03dddb3c2f251fce1d6afc31796746cd79c7f298c2a0d2899a1b060b0533bc6b1eee23fbf435162cbcede32ee42ec5830a", + "registration_response": "03876cf0fa28145e1d7379e954a0e926ee0a62ef469b04952b6103bbdb203454210aa5349001be516085d8379823bcec967bfaa50f13cfad60341ec73c2b82b580197e1307d2673e5c5748c52afe60a0ec", + "registration_upload": "68786b2b60e75066d5a732f77d14172f2a3967ab08739e4025db9ac7f3f1065ba48555f991b23963ba5335b2fe31b62f72f73792a65e54d347cd89f77a541b9ded1d68446d5ebe7ca2b39c7193d62ed005ef5229edaf9cbd7a766e58b0425375a60b48aa84e96096cf96be4c6c8f8604303cb71b193545c0b39d223ddfe6b27483df93e3dad5617928b45068d40e7ab2708095d5c6ded7beb6e4ed41246bd0f8", + "credential_request": "03dddb3c2f251fce1d6afc31796746cd79c7f298c2a0d2899a1b060b0533bc6b1eee23fbf435162cbcede32ee42ec5830a29431145be134b006a9e63c76d02a6ecac2d6cdadaaabcee7155ae0bc2df3401021fa84bc679bfea2a4e61672feb228a2384ea04169f2045eecf25154cca382dd9bf8b668414ee01650b11dd28334dbb3d", + "credential_response": "03876cf0fa28145e1d7379e954a0e926ee0a62ef469b04952b6103bbdb203454210aa5349001be516085d8379823bcec966f15a1f815db3f26a9ba06bb7f4bc88a2ecf13995339d7d445781122e04e4e75415dc5999024f95ae5687da1685a6bd11fd7859a7f1970a1ad0737b67b513b2bb858fd66dc5dff86dca0ecedbb75e66d2b96ffab3a426038faa86cbebc0b1446d666dd699f0dc6414514859a356ec0cf5e60dd1371d6326fbb7cdb1b717d11d35025fe307511818c75ce53b867c5b5e347707cd012bf24b6034d517c900209de6957342aa6dec19fe3e9e7641f58e26102c9cf1986c744a431be938c17fd96f2e6092ad92cc54e5d78b6deccfc27c14221745eef2df579bf4fd2ce635289323d0f24780356b814fda9ea8165e48558bd1bc8e980c3c14890eca7caf4ae77e92e9f359c72afcea39f9523a63f6007dcdd69d61eb015e186bacbeec273bda1ed49048eff3e291e02710ba70ba0f59a286fd4ddc3e074b8029b70eaa363d65c1fc5341cc78ff4b38563f21e2c8bfc308dba8e", + "credential_finalization": "303efe4524c41cffc6dc88c5c858174ceddaeb42d017207eccba89695d8b21076b048a279681cb93c30f91cbed27b0f8b25d433ff798d4693a7b0ba471348f0fd694e5c8ea8751db07a172df9df986e9df3d0e1d4701edaeddf9d28f285cd936f4ea336602985cc5708f3e55c8534066", + "client_registration_state": "ac2d6cdadaaabcee7155ae0bc2df340166b05a3ac9980d5eeb5902066b4bbfcf82b23eeab2e24366cc2d1e4e89de17c203dddb3c2f251fce1d6afc31796746cd79c7f298c2a0d2899a1b060b0533bc6b1eee23fbf435162cbcede32ee42ec5830a", + "client_login_state": "ac2d6cdadaaabcee7155ae0bc2df340166b05a3ac9980d5eeb5902066b4bbfcf82b23eeab2e24366cc2d1e4e89de17c203dddb3c2f251fce1d6afc31796746cd79c7f298c2a0d2899a1b060b0533bc6b1eee23fbf435162cbcede32ee42ec5830a29431145be134b006a9e63c76d02a6ecac2d6cdadaaabcee7155ae0bc2df3401021fa84bc679bfea2a4e61672feb228a2384ea04169f2045eecf25154cca382dd9bf8b668414ee01650b11dd28334dbb3de93764fc0b4ae90da972f3bbf50643ea0911d0d8a04156eca2146d781f1993d8b95c646eace8ac9224ae22272efff3be29431145be134b006a9e63c76d02a6ecac2d6cdadaaabcee7155ae0bc2df3401", + "server_login_state": "68786b2b60e75066d5a732f77d14172f2a3967ab08739e4025db9ac7f3f1065bab69b4188f909f0e6fa56f2cfe2e7a84ad6bf10ee3c67e21191151296ce04474b0966966a75ad4ed5179c8e107f67796a7a2a5f58f61edd0861eeec1fbc625c4ccac66d428ae301ac88fbc7c8d40c3b57781e6ca3b434413a47057d9c16e406f49a3a07341173b8f0b3f73cf902ead1fd694e5c8ea8751db07a172df9df986e9df3d0e1d4701edaeddf9d28f285cd936f4ea336602985cc5708f3e55c8534066", + "password_file": "68786b2b60e75066d5a732f77d14172f2a3967ab08739e4025db9ac7f3f1065ba48555f991b23963ba5335b2fe31b62f72f73792a65e54d347cd89f77a541b9ded1d68446d5ebe7ca2b39c7193d62ed005ef5229edaf9cbd7a766e58b0425375a60b48aa84e96096cf96be4c6c8f8604303cb71b193545c0b39d223ddfe6b27483df93e3dad5617928b45068d40e7ab2708095d5c6ded7beb6e4ed41246bd0f8", + "export_key": "9095aa649142834675749fd323c2dec1370adeba3357d0d70b1f1c4e196f9d49e64bd1f2c052f76cdc59c919858164ad", + "session_key": "ab69b4188f909f0e6fa56f2cfe2e7a84ad6bf10ee3c67e21191151296ce04474b0966966a75ad4ed5179c8e107f67796" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_PH_P384: &str = r#" +{ + "client_s_pk": "c2e51e2c0e0e89567daf477f54a8866b42a654021b23eade337c74e3094c84a6", + "client_s_sk": "81967a8225777fe4535fd7d54c03ea18265a87b38bc57c803390c5a3a20ebd85", + "client_e_pk": "7e066e14ef0ea3ebc5c80b82cf3c247a64ed5b711f76e723a84f68d4464846b8", + "client_e_sk": "14f1febc2044b55f1ead63a3ea54a2c82b117a80cb1632a70e09c7280b3c97ad", + "server_s_pk": "1cac9730b0f07ffd7e35a90e1fe08b56f9a3ca1e1fc85db483bcad6876d47046", + "server_s_sk": "1a579c85c83f7ec34b024bf32bee465f973ced433cd4cc296cd853da71e40d01", + "server_e_pk": "9606883606b514035cf574438ba6fbe46e503aceb9f355c30b8aa9824182e1d8", + "server_e_sk": "361076a00e7970898ae3b06a96f882cf8b8442cdee80b79e2a71a2075f1e46ad", + "fake_sk": "c93921887d0048cbc6cbdd96f0b22e4317eb02e8acd0ea7c81b75fa4b8f9e56f", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "016e3b31bb87f86b04f5fb2b9baaba77512e9699569af180c849904ef662a23bd2f54e070a9cdd8bf880dcd4891a0b9895b7f7f443b8a2dfc6fc4d7ad81aff1a4491", + "oprf_seed": "929c29827e60c5a0a717a8fd2ba0ce3596ccdc2980956c285de798cb34dcdb69f9aabdeaa51f68f0b317fc4354e1a8e8bec96594140035eb39efe1fb18baccf5", + "dummy_masking_key": "280d41c396113ec676f2660e7452b799151b456d457ac253666e5bc903e9a1d4cc9152ad2f0d7d5132efa086fb73c1d1e9003a03a4ba102119e18519b0b53a9c", + "masking_nonce": "00b1f6279508f27085465542baead48bb2b38d6f160095ff7ecc4a0a7d86607fd25e1477cf96ff4a0227a65c09b7cf95ab21f12a9674c0226dfd0da033bc5dbe", + "envelope_nonce": "f00ec8b4a63680a8116dd6e6ec2ff1e7a2ce22bd608e0582bb00aa738a4725bf", + "client_nonce": "c21bcae6943c200f34ed45f05bdee8261755117ceb6ed2fb8fc6dc5b23822a09", + "server_nonce": "d92ef3b2f5d3f02800f3872febd2e793390d18a1680864e9680c4dde012fa4c5", + "server_sig_rng": "3dc09efb86963c917d5d2bf27399d6a932fcd1cc54532a24aa45c067aedb0138", + "client_sig_rng": "d5eb241467228ffa7af2d6aa36c9b4c0377b3d68f522760102f928d5ed645f8d", + "context": "636f6e74657874", + "registration_request": "0301d2ac2b82672b3436bfb7c2e6dc5ce6524ca465174813f44d868c21320825aa6a7e3c395b30ace7b0bd6d7460fd67c535a9d059703226d401bd982a5831cbe40f40", + "registration_response": "0201589b34b897d2905dd8be90ab8176924f9f7e44aa40c4c3f86f67058749e6e44d53fb4a3d82259a028d6aa76a593ab8657de787ca8fcae1e86bb06bf4148dbf0b721cac9730b0f07ffd7e35a90e1fe08b56f9a3ca1e1fc85db483bcad6876d47046", + "registration_upload": "e7b306d0b04fff2bec1d9270356a76a6a71e647ce064704351fcfc1e9865e4990c6d79a2545b5c7e197e09a7c2e872eca5ff677384fd71c2cfaf2bb406e63b5d2f37682d38e102c77d02510dc164f29baa7435dbdac4fd474d49a46cef75816281967a8225777fe4535fd7d54c03ea18265a87b38bc57c803390c5a3a20ebd85ccf7d9d8e4c038dc060e05e279079d3182693b517bf134998cf12ad5b58484aab438c1c1ce38cd0659016d32b6c3ece350b303be1beb02e1269e730903994e84", + "credential_request": "0301d2ac2b82672b3436bfb7c2e6dc5ce6524ca465174813f44d868c21320825aa6a7e3c395b30ace7b0bd6d7460fd67c535a9d059703226d401bd982a5831cbe40f401755117ceb6ed2fb8fc6dc5b23822a09016e3b31bb87f86b04f5fb2b9baaba7702a44c1554585cc033aeda7ccf45d9ee1bc97e41668bd1eb60475105927d2030084760ef0d6ff00ce3e1853e2889006688", + "credential_response": "0201589b34b897d2905dd8be90ab8176924f9f7e44aa40c4c3f86f67058749e6e44d53fb4a3d82259a028d6aa76a593ab8657de787ca8fcae1e86bb06bf4148dbf0b7200b1f6279508f27085465542baead48bb2b38d6f160095ff7ecc4a0a7d86607fac0378946a4997ec3e1ca8a1315f7313d26663d4993bbe69ce3fa79c51565f1a3c2f45d0e3c81358f33af0d8c526e7e28a73176b5fd403ca356b1e8e742ceac150c283fd16aa936243e175a5355691a96f674081bac149af379710ee6cfee123b07bcdc72d57f66f94cf181f0d195154c8de12e94f490af328a1935de426a7028b8442cdee80b79e2a71a2075f1e46add92ef3b2f5d3f02800f3872febd2e793030191d8d4ec82e7d436bc333fb95621acbbca96f68dbf3961a038a5dace0da025baef538edbabb6fcbb2fed7d9297e13b6cbb119f56feb670f00d945b4afa1fd4c47931a459159caa126675e5b12a84f981391b0a83eef0a51071a5078777d4dbd6b81fef60af8d3ce6faf6b20c28d90cc1e175b9bf44ffc017d6638a8c9563099813e000a0b755b4d085e6920270a85f733db68cf9c40c23aad42206cbb218f2", + "credential_finalization": "31648717735a592d563ff488ab49edfb83f174ad3fb9a5782bba61cc709699428f82605e1e1a6f412746dc564bd729395fbe6bd0c95709ccf8a620276d5c050ad28a73e2e53d6bdc0d8658b4b6268e1d1991958726d867b4b66f5bb03cf174d52f8050f2335b11b7f5282d745b6e59c9", + "client_registration_state": "016e3b31bb87f86b04f5fb2b9baaba77512e9699569af180c849904ef662a23bd2f54e070a9cdd8bf880dcd4891a0b9895b7f7f443b8a2dfc6fc4d7ad81aff1a44910301d2ac2b82672b3436bfb7c2e6dc5ce6524ca465174813f44d868c21320825aa6a7e3c395b30ace7b0bd6d7460fd67c535a9d059703226d401bd982a5831cbe40f40", + "client_login_state": "016e3b31bb87f86b04f5fb2b9baaba77512e9699569af180c849904ef662a23bd2f54e070a9cdd8bf880dcd4891a0b9895b7f7f443b8a2dfc6fc4d7ad81aff1a44910301d2ac2b82672b3436bfb7c2e6dc5ce6524ca465174813f44d868c21320825aa6a7e3c395b30ace7b0bd6d7460fd67c535a9d059703226d401bd982a5831cbe40f401755117ceb6ed2fb8fc6dc5b23822a09016e3b31bb87f86b04f5fb2b9baaba7702a44c1554585cc033aeda7ccf45d9ee1bc97e41668bd1eb60475105927d2030084760ef0d6ff00ce3e1853e2889006688ade7e9a44909c1483b40555276a2b4a55c4156feff61b915cb3ddc7af8c348f973504284b59e94a11b0179648bdd33c11755117ceb6ed2fb8fc6dc5b23822a09016e3b31bb87f86b04f5fb2b9baaba77", + "server_login_state": "e7b306d0b04fff2bec1d9270356a76a6a71e647ce064704351fcfc1e9865e49916c02e5cc3d11e8723c1050f811d3fa3e4330a356a05af7ddb6b0e417d9c82bb1546a3956a902cc97e7703e8d3b4ddbcda88f68d2d0d596981754371c0fcaa2befca731db1613060ce20be01bfcd16cd0d5e5e13684c1f264d1b5007430fdaf21001635294bd17d4a38de6d2af36b3aad28a73e2e53d6bdc0d8658b4b6268e1d1991958726d867b4b66f5bb03cf174d52f8050f2335b11b7f5282d745b6e59c9", + "password_file": "e7b306d0b04fff2bec1d9270356a76a6a71e647ce064704351fcfc1e9865e4990c6d79a2545b5c7e197e09a7c2e872eca5ff677384fd71c2cfaf2bb406e63b5d2f37682d38e102c77d02510dc164f29baa7435dbdac4fd474d49a46cef75816281967a8225777fe4535fd7d54c03ea18265a87b38bc57c803390c5a3a20ebd85ccf7d9d8e4c038dc060e05e279079d3182693b517bf134998cf12ad5b58484aab438c1c1ce38cd0659016d32b6c3ece350b303be1beb02e1269e730903994e84", + "export_key": "e9192195d43902508ccba1277f1bf0be02bb7871d6911c2367bb495b112e28078b8357d9aae9b85d9eea1989d094908e53396f2777d7085783a639b1f814ff59", + "session_key": "16c02e5cc3d11e8723c1050f811d3fa3e4330a356a05af7ddb6b0e417d9c82bb1546a3956a902cc97e7703e8d3b4ddbc" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_PH_P521: &str = r#" +{ + "client_s_pk": "49e2b6ce8ae09fea3f43ddc1e266649a18f1507c431e31be4261ca11e1ffaed2", + "client_s_sk": "b3d0726f97077bfcca7905096c9c9c19fa873e319b7d576c8d9101e28587b778", + "client_e_pk": "c39a51b45be223e62816535e2d7ccb9e1c1427dc7ba6b0e564114746720e6b7c", + "client_e_sk": "0f664982187f731e87d6128e67633a90f57f2dafe8401c95efde24c8e1413596", + "server_s_pk": "3ef428a94a38db76137b68dbaf35ba0d9d86e649d0ee83a0126d6a6cde177382", + "server_s_sk": "86186f88244f084043a3997aa604e7437dd1409e3fe383d5d3cc1489a8934855", + "server_e_pk": "41c4ab165879e703e7c570b04c5f04757c67d2abc222198ef2f6546266d2fd96", + "server_e_sk": "91d505506ee643460ed67fcb7803a95da94190a39c2867a9b6302331f3af6df5", + "fake_sk": "e3fff88aee768719fde1a244197e7f249c4428b1718b28c3739ae3578963687c", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "8a769a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c", + "oprf_seed": "f34d9d9a21a4d538d8302e219efb693ef2ae9c34b2f5a098a344a71e91a3b35cbd5008dbaa076f8707da3fe3c1142a4e790142f75379796846f4ad6c038c0997", + "dummy_masking_key": "261b5a5927a0f5357e7acb36f17233642b682e1485708a484969bdf72554e797c52387206197722dd62a4d81a4d351a9982a370dcb4d17695bafd5153fcc1be6", + "masking_nonce": "16a457f49a3fde3383a62e70e09933c2eb918eaf0aad65870b3a5606c7fb2cc89853ba79f8d77da8b557327ae6e9485196b8eac876c6a48b7463112cbdaa39e2", + "envelope_nonce": "17d38e3975513ee7c2fbadb452ae9aa0dd5bd1ca9613ca1b63eb344ef9ab471b", + "client_nonce": "70ef1892b514c78a25325c44e2c1396fde38ea4ac27a5dbcc87b599a6650d462", + "server_nonce": "2628a3d68e44c493ee1fbdbfa80c7995b7eba725e49a6e3480c41846ee72b282", + "server_sig_rng": "1a718c6e533f78272522dad13c47992512b2302622cf63758393ae8f38c413df", + "client_sig_rng": "d5c0ca3916f60978c262a1b53543031443265e0a2bc8c23c0929c1b163fca470", + "context": "636f6e74657874", + "registration_request": "8e8bfa72a44e9499fa25e9d3b947bdae2e744972fdf77cdea469a505e5383f46", + "registration_response": "680c3a5de900a8d637e4f2899f2ca8a93bd205d972fbdb8be3f6f76d6474cf283ef428a94a38db76137b68dbaf35ba0d9d86e649d0ee83a0126d6a6cde177382", + "registration_upload": "f313a9ca29fddf14db3cfc1529b0ed644f4e1f9f9bf4e71c4f50c0992792785048846f3e6ce3b53e4b8f0ccb5c67eee1555b2d143c7ae5d58232706f252b1d21d28cc69037e0ff07c88acfdbd319f0fe0460bc175d5139a9fd4e3c5f3e7d7d08b3d0726f97077bfcca7905096c9c9c19fa873e319b7d576c8d9101e28587b77855d7de490be20af4be8027eb79edf946e2f1586478ad50ef59d45edd7b9947bffb199123d1a715cc275b8f4cd2619b282ec65da91acfd1b4461a5074a43be2c0", + "credential_request": "8e8bfa72a44e9499fa25e9d3b947bdae2e744972fdf77cdea469a505e5383f469a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c0f660300a507b73260507b067d99dbc5b3db59c6129475dfe91328080ddcff09c96e102cd48bfaa6c657a6fbb6eb68fc1ee5f81e11e1ce1bc23ba5a58d53a014e19549a937", + "credential_response": "680c3a5de900a8d637e4f2899f2ca8a93bd205d972fbdb8be3f6f76d6474cf2816a457f49a3fde3383a62e70e09933c2eb918eaf0aad65870b3a5606c7fb2cc8c5517ce7fc1fa1ce546dae9b94f433426bb28d1eaaa5d41133e20cd8c5a46285ee366f2274285801880e0e269828ffd99652fbfb75c5c7f3c5780242685da8d4dbd4b0d8aa64f7fad70de06929650654a7c0a601124e00b4e875c6a34c6271282069390bb6a74f249100aa7f0724ce86117cb8ec24337df70e4ef984095b23f3a3d68e44c493ee1fbdbfa80c7995b7eba725e49a6e3480c41846ee72b2821a710300ceeac56b71b6fc6e25d32543afab707d59070848f249ec3644557167258baa3a885b2e1d6ad014fadd1e524f20587ac382b228c485382611a0e8c2ad2cc8bd8f71caa5b35b40077926f3beabbad8895212fc94f14b9e7398fcc04c415425a2c0991a203abc6c921fee7c6f6219079a68b9839100f1cacebef4825e4db7b53dd201650e54e92a337749d783f5bf8289c992835aab4530f3358137c54afdbb8413529c4910d8bab8be2113fb59399f6b6d5d6084e5eda4256310aa4effe03a2580b6", + "credential_finalization": "37431f6f3b14cc38ee22c95d230a9ce03245fa2941be6cab5cbde30a697e5533a0ca9b97ef4fb0a97881c3270f1c67ab39e0b8e7d81e572afb9394c4eb7db20d1551f7d4afc8830341c8ae493b37e67cb3170b1a67008d6eadbb999db7ae755512a990f895acd12c9ba851320ac27a22b7f7eb50816c609e1e3fef9cee3e83f8", + "client_registration_state": "8a769a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c8e8bfa72a44e9499fa25e9d3b947bdae2e744972fdf77cdea469a505e5383f46", + "client_login_state": "8a769a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c8e8bfa72a44e9499fa25e9d3b947bdae2e744972fdf77cdea469a505e5383f469a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c0f660300a507b73260507b067d99dbc5b3db59c6129475dfe91328080ddcff09c96e102cd48bfaa6c657a6fbb6eb68fc1ee5f81e11e1ce1bc23ba5a58d53a014e19549a9370042438cc2594e69cca71bcc26e0f4b5c4408ae73070970a9ef8d81fa9b23dc8fa4c163895ba9caea2e7e3941ceaa6a4641353bf8e2543d8278f4aae7646fa34954f9a9f2be26ec9c4e31ce6f0c5721be9e93de600a014903e7869f6d6e5ee0c0f66", + "server_login_state": "f313a9ca29fddf14db3cfc1529b0ed644f4e1f9f9bf4e71c4f50c09927927850494aa78c4f7ca8d9726e7a2e3537362b8816d07d6392775bcd9d94f2d4202320c18fdf045d6ebb13a23d869da222b77fcbfda9c9c28ffdeafe564586cc81d88c8f680bb2580caa17ff1344049ca4428be50acd3b7c7eda8a2d78c3bf3bd9b18cc53258aa611630a4983ff816d3ee0074bb8d78fbb58f3d2c8ae1bedee406d4041551f7d4afc8830341c8ae493b37e67cb3170b1a67008d6eadbb999db7ae755512a990f895acd12c9ba851320ac27a22b7f7eb50816c609e1e3fef9cee3e83f8", + "password_file": "f313a9ca29fddf14db3cfc1529b0ed644f4e1f9f9bf4e71c4f50c0992792785048846f3e6ce3b53e4b8f0ccb5c67eee1555b2d143c7ae5d58232706f252b1d21d28cc69037e0ff07c88acfdbd319f0fe0460bc175d5139a9fd4e3c5f3e7d7d08b3d0726f97077bfcca7905096c9c9c19fa873e319b7d576c8d9101e28587b77855d7de490be20af4be8027eb79edf946e2f1586478ad50ef59d45edd7b9947bffb199123d1a715cc275b8f4cd2619b282ec65da91acfd1b4461a5074a43be2c0", + "export_key": "fc50f6c30cd26084d2e978d3ce0a7d93d23e9d74319d677ea20573d0306664539b1cb325e188a5ceef42dfd93858410bab3451b2cbc047ccf5033931f5994ab4", + "session_key": "494aa78c4f7ca8d9726e7a2e3537362b8816d07d6392775bcd9d94f2d4202320c18fdf045d6ebb13a23d869da222b77fcbfda9c9c28ffdeafe564586cc81d88c" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_PH_P521: &str = r#" +{ + "client_s_pk": "a97122dbed7b3d65fa2304db6034fc8953eced48a7b9a9fffefceb3c4b79c1cc", + "client_s_sk": "1776a16a03b2113a9fc91cc08bc7a3672f1b56d19722176e035b7c875ac02f2c", + "client_e_pk": "565434e8bc7a50a1877bf098d486f8f1f32b240cacd4eb2ff5b09b7c89592056", + "client_e_sk": "bfb94f963e814e30d1d5e01a859092d820aadbd3562c03bc1f40cd0f9a3274e4", + "server_s_pk": "a3cbff6a0bee0380b2e960e2ec5273ec2a21185d248b4a1135073844d98a67d9", + "server_s_sk": "993849f4cfd924e4dc3df27b9888417bc78b8115658d9af770cc0f4aa7496a96", + "server_e_pk": "7af4632e79a452c1e1bff56613875e199b16891fecd006f1dab4c988162d4a4c", + "server_e_sk": "77ac2beb4d0f42fa092288dfe46e9f4020a866128e032e1fddafb757dfaa8c54", + "fake_sk": "2d6898de2027c4e606c250e83caab52e59247d09bc947b97b78c6d390264a31d", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "5359bc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc97", + "oprf_seed": "cfe79dcb0a2b480621b3454d3073f4d77106e35691e67518b3cd559eda7929d7", + "dummy_masking_key": "01658bfd52e61f18a2a6353290aa39a7391f5a0292cd57a34807e3aab2b2ffc4", + "masking_nonce": "8a99d1bbc7ab80c31a70860ad70df0ef053d68984991787f7c6b256b09439527117323af122406d92c48ed5c44fc30ec5a3a1d4c26b80e7df1300d5b204ee857", + "envelope_nonce": "fa0922a8f854d359ed209207d825d673f6aefa5d97cdd481d716473e36f7c928", + "client_nonce": "5b2ee8f667de65c6f4c5e9b513b89d9733fe81b2cf650109f87b7715eb0cd0bd", + "server_nonce": "83420ada69558daf4e8dd078368f7e67349035515d184aefe634cfc33b342878", + "server_sig_rng": "0b916ebceb60ddcbac8b019d26697c271b1abc767147271dfc1e738b4d39512b", + "client_sig_rng": "0ad8612a00de0b3952eb88aabf48128377f3de8f82652479f0bdada37dd010b1", + "context": "636f6e74657874", + "registration_request": "03be7d9c4946a0a891adcda6a4a8034a533faa8b0933dcf7c53ab452498edf0e48", + "registration_response": "038cb1e8cfe00ddba00e0fb705f8033e747799c90f55bb08c1b321f01bccd6b86ca3cbff6a0bee0380b2e960e2ec5273ec2a21185d248b4a1135073844d98a67d9", + "registration_upload": "8a8b5e4091e0ce4a1370becd6f60e85bcd9cc19cd01f316e043be0153fd053719da899774d1ee03192aa1be3029508927b86bed440b473d20c325bec107c5c1d1776a16a03b2113a9fc91cc08bc7a3672f1b56d19722176e035b7c875ac02f2cbe5cd5749b260ddc9b02e6c1d602e8c37ee5f1d67e46fc5cf888e6057162aa06", + "credential_request": "03be7d9c4946a0a891adcda6a4a8034a533faa8b0933dcf7c53ab452498edf0e48bc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc97bfb90200aa3d1145a91b8223ef5c753750eabe676a9a7e625c587f14217450e324a8f8b203bdf8a5ef9355a7455a2cdbfce1b14ce0df8f96a622804d540757ea458f3a3a1e", + "credential_response": "038cb1e8cfe00ddba00e0fb705f8033e747799c90f55bb08c1b321f01bccd6b86c8a99d1bbc7ab80c31a70860ad70df0ef053d68984991787f7c6b256b094395272b259d471c9697fd8b359e8ca2e53dc5c2355cdff54d463f1a2abee085b9fa1e4f1aa3b629d990ede3a291d691aaded3c48356582b16d72c352ebd904ad34185759457405f1b88e5b6f2e86e9c7ee1f5eacbe2db01b03f887d61e409658a3e130ada69558daf4e8dd078368f7e67349035515d184aefe634cfc33b3428780b9103011218f5dc5232a0d28d75e02489ab72681af0eb7158353dd8c820229e937136c6968c163380c01d08ab0784eb5e430462e9f596e6ed02f204c7d2e0a7b1a749063567b36dc3813986dbeb4f16ef373af346aca2f2bc07f1a630b1d5c7019b76cd62d359640060a694b0e20583b7806dfbce5d549876481c7636cdbbdb9d5a12bc04b83b69ccb852e950bbec5662e88c4b448e7fa403192438a4f1bef0e75639ef9b261fc572db982b4a33daab88b25520074942d03992cb3b9eaec14dae6a38db9f", + "credential_finalization": "c53a6864ebc91486b3dadea2749f9e79c2cb4a2ba4d6a8e4ae16d39e531d339fcdb69b80e84adabe641c48f595f2fa8306ac047e92168b9425e4989de9f26f0494ff154de9408098fd6dbc16f7bd906301a08693dda0aef62ac87974532bf596114381de91bc91f783ddb9ff6f91a3b3e6bf663f2abe1a89157ce0e84caace6d", + "client_registration_state": "5359bc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc9703be7d9c4946a0a891adcda6a4a8034a533faa8b0933dcf7c53ab452498edf0e48", + "client_login_state": "5359bc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc9703be7d9c4946a0a891adcda6a4a8034a533faa8b0933dcf7c53ab452498edf0e48bc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc97bfb90200aa3d1145a91b8223ef5c753750eabe676a9a7e625c587f14217450e324a8f8b203bdf8a5ef9355a7455a2cdbfce1b14ce0df8f96a622804d540757ea458f3a3a1e007511a91c577bded33482ba0f8b662f46388d84371b091b4dc29279f7936d5e20c4d3bc9086db7ca21c6be67153a1936f13e7961f5995246288a8d0d9c08a1c091dbc8635f98e1b318e1e43f4acd5b97a9211def658c043b970e3c7b754bc97bfb9", + "server_login_state": "8a8b5e4091e0ce4a1370becd6f60e85bcd9cc19cd01f316e043be0153fd053711ddc54cc37bc6d49e6da780d7d956914e07eb480127d2a4e5376b49741389db231b9a673f275341ef2a4bc14ab2e279509f5dd581b2f042dbf4845a6653c994646835d18849140a48361481b7a84252581aaa223198e666a09e2ddf5eccd9170b360575efe949c96c76095e2643a19b140e19fdc6f5f62f7713de20dc3b0842294ff154de9408098fd6dbc16f7bd906301a08693dda0aef62ac87974532bf596114381de91bc91f783ddb9ff6f91a3b3e6bf663f2abe1a89157ce0e84caace6d", + "password_file": "8a8b5e4091e0ce4a1370becd6f60e85bcd9cc19cd01f316e043be0153fd053719da899774d1ee03192aa1be3029508927b86bed440b473d20c325bec107c5c1d1776a16a03b2113a9fc91cc08bc7a3672f1b56d19722176e035b7c875ac02f2cbe5cd5749b260ddc9b02e6c1d602e8c37ee5f1d67e46fc5cf888e6057162aa06", + "export_key": "40036503ef9675a4399420bc57d9a9dae30b51d605f6fe2bb273a0cc6af77f24", + "session_key": "1ddc54cc37bc6d49e6da780d7d956914e07eb480127d2a4e5376b49741389db231b9a673f275341ef2a4bc14ab2e279509f5dd581b2f042dbf4845a6653c9946" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_PH_P521: &str = r#" +{ + "client_s_pk": "1021d2add96bb0bbf3204123d45f2c6bfdb7341dc3da3dd17e4ae1e688d19aac", + "client_s_sk": "a25cf41495cde73267eabf663da94979375f75691884417ddd0f9ee0510b9719", + "client_e_pk": "8f9d23b248fadd3a23816742173864165d0f7b214a37ac8b06bf19743b231f6f", + "client_e_sk": "6278a3551a7c7dca303feadee52efb2a510ba1e5437d7809f6999cc95d5d21ef", + "server_s_pk": "ca5d3e408e8924e434db75392997cce20aa2951fd81e90cf4d3cbefb86eb99cf", + "server_s_sk": "9ac47f1cc1757c8ae305c4ba963896f10b96b456970b40f4edf458962df8d4fa", + "server_e_pk": "62ba3913d0e4fd0741a4e220b9b8ec56b9cf66f86ebfffde29de4227de52ea11", + "server_e_sk": "e5f8f75e4025761e4c1fe843f429d931af15d94988d8ad3fb2ffea00bb647e13", + "fake_sk": "dd4b6397df0c6817df12c7bb12325856eb7252ba6cbd555d6740310309e07482", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "741f6afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd96d6a102e805be7e624a6175ec11", + "oprf_seed": "b3261443ece61074dd524bc82ff15032cc9e781b8cfd5ea66110177bd378f4650aa56622ff91e6ca09caf8443ef8183d", + "dummy_masking_key": "9e08cd0e38278c4f04db54ce3646f960f442f1c7f9397e600676e28ac52478a843f5bd019e56ede9065215fb787a6c47", + "masking_nonce": "7324b71e0e79a22c25408905f6f51815388f6fe2a8a7a54cdc569d655313d001b202bcb2b198820074cf0ab58a055da6d16f9cde3331bfc294400d9cd685aa0c", + "envelope_nonce": "9ffdecfea72255867276625094fe27c121ea3d99447fa918195183e6ead00223", + "client_nonce": "1516eb33f90d5494497303dd2a03516019890188ceec24c00e67ac0e5320850c", + "server_nonce": "69da1d1d8a62137b2c09d5123edda9478e81807553afa4601a5216636b3e204e", + "server_sig_rng": "918545a910f00ea712bcf0ad291e251f9c2315b6f0cf31798aa8680d0fa33f70", + "client_sig_rng": "626a321e444ae204295cfecc584e6588ad575fb56744b69aebb779fe44d5c6d9", + "context": "636f6e74657874", + "registration_request": "02e7fe32524e6332f3546bdfac725b11345692dd13e2249623ad0b4bc35009745cb1f73f978e9bf2806a577dc40edc3f41", + "registration_response": "031553f1e9cbe67dc2513d7450b8827483f4227c8ce12cb8dded08ffb81806c3fb919faf035bc84119662c03f8c77a4cedca5d3e408e8924e434db75392997cce20aa2951fd81e90cf4d3cbefb86eb99cf", + "registration_upload": "66c1c8babf782a7483936eb5a31e3f3e302ac9c104e060a2e57bb46aaf5b9a79930d7fd1ac45a107e53da862d8daacd42666e5fce5578ba204ef57c1da7a6e7a9051d35d282add8060b550476da6b138a25cf41495cde73267eabf663da94979375f75691884417ddd0f9ee0510b97195d8f3ffd57bf4c7ea9236c8ccabccbb2a48abb433608a46f925b4629548c66a27e4a93fd6b95f637869f1440e41efd5b", + "credential_request": "02e7fe32524e6332f3546bdfac725b11345692dd13e2249623ad0b4bc35009745cb1f73f978e9bf2806a577dc40edc3f416afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd03005acfc2fe19c58a0ceb1e48b4f3e2a6d92b6079f90f61d55f40feebb88514955203f7d9dcce6a67ffd4b5616a8236e7edc91c8764792fe11335b82e88cfe1740dbc", + "credential_response": "031553f1e9cbe67dc2513d7450b8827483f4227c8ce12cb8dded08ffb81806c3fb919faf035bc84119662c03f8c77a4ced7324b71e0e79a22c25408905f6f51815388f6fe2a8a7a54cdc569d655313d00155d81f3366994634c47e860609c29d23f2f008b6002e231a26e1fe04a6287bf6bc500e216646e71f8e72e8dce0048cfcbf0a28f8605b2bee9a8ca130f636f191dc0ae34fb7fb007dbcb3d95e3bb6546da18722de968673acca79d7af328a4badda36a1b5a61fa42e9ca0ac51246039151d1d8a62137b2c09d5123edda9478e81807553afa4601a5216636b3e204e91850300c8de38023a5e9f1c9cece1d5305e62b92844e85bb57e085270373eb5cf25785d835607569be8551f4e275b8e52325271a7d8d60dd32245787b0a72f0fa801866029083b4ed8a44b92de2a6ffbe35bf7f0ee9f0895c550c92b41359a80348a574917228f7eebb09b3a98ddd2f9259a5246272b50b37e258749d3a02a9e715be10013206725e0979cc562299517df57c16c42d61690175d0216a26d0146c30b596e40024d2fc490fd05999e60cc5f2d48bbbd3f7f7d4da3a329949fccee7e211f243", + "credential_finalization": "140cecf402002329c343caa1fdb36fbbd701ce082579b70810821bd65a1f4350b73f6ef9d120ed9e98d32dad4b53b4e9adf8df44da4f51450e1f045499247200dba893c375e5200ab92884290a130ef02a0ba493974e970a5b17c4c42bbe0f1ae5566af1543d1094ef22edbdcf60d49f650ba574ceab29e9923fb9ef363429a3", + "client_registration_state": "741f6afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd96d6a102e805be7e624a6175ec1102e7fe32524e6332f3546bdfac725b11345692dd13e2249623ad0b4bc35009745cb1f73f978e9bf2806a577dc40edc3f41", + "client_login_state": "741f6afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd96d6a102e805be7e624a6175ec1102e7fe32524e6332f3546bdfac725b11345692dd13e2249623ad0b4bc35009745cb1f73f978e9bf2806a577dc40edc3f416afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd03005acfc2fe19c58a0ceb1e48b4f3e2a6d92b6079f90f61d55f40feebb88514955203f7d9dcce6a67ffd4b5616a8236e7edc91c8764792fe11335b82e88cfe1740dbc018dfcc3d0c93608758dd2fbcfcb97b56905270d69a5c339e9046438e9db2d6ec2e4ee661074d71a4ce246e8edafda9b085cdd8ca5f51043588b105c7688e4c8b9186afa875705dc98b3cf8fbc276688b120828b90f34deec2badba460ba72b87ccd", + "server_login_state": "66c1c8babf782a7483936eb5a31e3f3e302ac9c104e060a2e57bb46aaf5b9a7937a562a2a3132e28ca1c896937807bfab7f67d2dbc69d610356b674327242b28efd69409af82339ab5221370d26e82f11ae774d15231726c80ef3d7e48e89f7af5dbbc6ff53fb17737953e40c1d75331270e7d95b42fd11d7926200fae93e9dcb50ebfd2bc9b887f370c774363961b0e14a59df2598ba5fde48e4a77cffd32fcdba893c375e5200ab92884290a130ef02a0ba493974e970a5b17c4c42bbe0f1ae5566af1543d1094ef22edbdcf60d49f650ba574ceab29e9923fb9ef363429a3", + "password_file": "66c1c8babf782a7483936eb5a31e3f3e302ac9c104e060a2e57bb46aaf5b9a79930d7fd1ac45a107e53da862d8daacd42666e5fce5578ba204ef57c1da7a6e7a9051d35d282add8060b550476da6b138a25cf41495cde73267eabf663da94979375f75691884417ddd0f9ee0510b97195d8f3ffd57bf4c7ea9236c8ccabccbb2a48abb433608a46f925b4629548c66a27e4a93fd6b95f637869f1440e41efd5b", + "export_key": "3bba11b9db6f23f439875e799f8973c9c86d91cad29d7b83bd3d3bbe2ac84ac7cffa160a8c513f3a1812d64797548937", + "session_key": "37a562a2a3132e28ca1c896937807bfab7f67d2dbc69d610356b674327242b28efd69409af82339ab5221370d26e82f11ae774d15231726c80ef3d7e48e89f7a" +} +"#; +#[cfg(feature = "ed25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_PH_P521: &str = r#" +{ + "client_s_pk": "db6afc1f03c82de7165d8deabd3a42ec7f0964abb3dabfea8bd98e6e47ea9c8d", + "client_s_sk": "98cf5927a2f8ff5dd874d666cf20801b205c0a2c7c1160618b6d58953f8b1c65", + "client_e_pk": "951c959b439b3b7355c977e4271cdb15fd9c9bddcac2578a766b97aec7c646c4", + "client_e_sk": "707881d4c0e6cbe371bad6a5e4c4348317120a1f7e470b6c5d95fd223d00408c", + "server_s_pk": "d8596b0eafa36c899c208e5e43573a7bc177cacbfd2a6c36ebf2fce403c7f7e9", + "server_s_sk": "8dde537f37d1d75594160a7264aed93f1caad4181c3a78b7be4cd25e9941bacd", + "server_e_pk": "2b79f7d74fbb93a84bce7e52f8495a50790d548ec0957c4347415ad787a3958d", + "server_e_sk": "6b6bd225403f1946cf130c22dbc6a40efba3209c690e7e3c166324ccc357c531", + "fake_sk": "d282d4404f01cba8b29b35c7e9542a745478634ae7a552931b9be434af484efd", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "01fc8ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b7f0b83bf89203116e39e4a3dabd18e2955b1f6a51a7003dc93f950a68986a34c2", + "oprf_seed": "c0a1f35b706d8206f060ccde227cc450802eda24ec7cea38aa35f998418ad862a9f4cbf8c974c4ba7df18f9bc04d065c197b0ac63f04dd4dc6c90ef4d35f8059", + "dummy_masking_key": "0c3e8ca7b219f316b95cdc4abb6051251d32a83daece13cf25dc7f6e76a4b3a716756dd0001c2f06b58b5aef82b1a83a2c421c3f0f9318607dcd945dc7dd41b5", + "masking_nonce": "e637d8e8608b1ff89f09218ad18164fc6386819b118d2c3f696a7af16112b81be042aa99277737c0ef2fb3f61a95e8707927d22745066fc89e1eeef1b8773b03", + "envelope_nonce": "1f2f05e99aa5fe2d62e5b49759e7736c661b2c7f52874894cc1de85e5965b7e1", + "client_nonce": "e5dc71d1313b46a74a8504ac0da122c824ebd94f108cc581480f11cf4147fd27", + "server_nonce": "13dedf9d7804a751abd43e65179553f8fad0cc07c170eb64d2dc6f9aa9bbac80", + "server_sig_rng": "e8aef84d0bcb846c250e8d87f0f3d2d012a64fb5c61a47e09664411a8f0cb24c", + "client_sig_rng": "654bc156c758cbc63f74eccaff4cc9338eb915ae49f4553b189b4233f30b6927", + "context": "636f6e74657874", + "registration_request": "02014cf3dce135ea6dd4f42f115373f9698c7aa5b9995da895a81d6583d80a36d29b39bdffce726d5f28b9a66e98e510c98713587ad753946f4c27a2e82f8569f037b3", + "registration_response": "030010c25bb6cbb7697b272b2b5de6f7fdf1fc543a2e54ca6e6ba3bf0b539ae8e241b323cd420783d3fb42772d156be1eb440602e85947acb47863343d3709c65010c4d8596b0eafa36c899c208e5e43573a7bc177cacbfd2a6c36ebf2fce403c7f7e9", + "registration_upload": "b9b4b574f14879ae224e90b3004be4dddbce434b3a0d21c9730c4dc50fa0577c48a0e9c136761448f72fb0bb5b4cbb169703e923e01618280a1494962dc96a25621edebd091aa270816893655121fc6f7653923813c3b203076d628a4762ea2a98cf5927a2f8ff5dd874d666cf20801b205c0a2c7c1160618b6d58953f8b1c6529c9bd43791ae3becffc56e22eef946e73412d416ab72a2b5979fb00141c3988eaef4601e9ceaf98ab9eba046d5a4c0a7e9618c764150c1406d1ec39e2cbdb84", + "credential_request": "02014cf3dce135ea6dd4f42f115373f9698c7aa5b9995da895a81d6583d80a36d29b39bdffce726d5f28b9a66e98e510c98713587ad753946f4c27a2e82f8569f037b38ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b70200dca49433811aef1e61cdbd2f4c6d958680fa93feee9e5ec549e0a5a595e0159bd380bc8d90a5ca7900ab648689259300580ea3c90efa6fcccfac6dc40cce1ce37d", + "credential_response": "030010c25bb6cbb7697b272b2b5de6f7fdf1fc543a2e54ca6e6ba3bf0b539ae8e241b323cd420783d3fb42772d156be1eb440602e85947acb47863343d3709c65010c4e637d8e8608b1ff89f09218ad18164fc6386819b118d2c3f696a7af16112b81b6fdea52b17cc92e98e7767e8a7d28d0c46ae0a8a7cd365d2803c05c5711b10ad51f84a49adc2502a6c78448afff972dab53028bd644750d7530c1c7308977535150d4ec177b42032f6ed842a44c7bcd193eee354e9063a3c9fba8a6177ae61a5aa2ad4546e92ae21960cbf0b65f086eb03542a6e48f337b8310fed0383c9927cdf9d7804a751abd43e65179553f8fad0cc07c170eb64d2dc6f9aa9bbac80e8ae0200cb37a8aec5fef131784dcd18530dac391ea74d607c8218cd9daecfd93672e0b7a3cad3ad49b3f618f42e68af167823abeaab766ec29d6c75018a7653442dde53f9a54ea9e0fec8917ce40ef229cd8079fe9b63c85d45f2ef5189ef310880a4543df6049b8a7b19061238322c4a5643b24d39a3689a99f5988397ff874ed37ed50ab0c1f5b17f45d24ea7aa962f42e63de078e0fbed90b3805fe2e94c7c89d37c2cb8fd866084ce82cf9d6d103d49944b0cace147f8fa595e8655022fea584458aa", + "credential_finalization": "30f7a325f10f4f4b565535241f40c415806970b8573ceb3a5bb87fc7b588ee8ec57062e8d7635f78e80c90a06126e849abb57a451e8ffb5605e507365db21206594b0644601561608f341f6166d66c5368ad38cd398e7e8d69a4c8859d439df650252f1f007f844c739733831728decbf4dbb72b9170a1b4fea4e86fb1400572", + "client_registration_state": "01fc8ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b7f0b83bf89203116e39e4a3dabd18e2955b1f6a51a7003dc93f950a68986a34c202014cf3dce135ea6dd4f42f115373f9698c7aa5b9995da895a81d6583d80a36d29b39bdffce726d5f28b9a66e98e510c98713587ad753946f4c27a2e82f8569f037b3", + "client_login_state": "01fc8ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b7f0b83bf89203116e39e4a3dabd18e2955b1f6a51a7003dc93f950a68986a34c202014cf3dce135ea6dd4f42f115373f9698c7aa5b9995da895a81d6583d80a36d29b39bdffce726d5f28b9a66e98e510c98713587ad753946f4c27a2e82f8569f037b38ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b70200dca49433811aef1e61cdbd2f4c6d958680fa93feee9e5ec549e0a5a595e0159bd380bc8d90a5ca7900ab648689259300580ea3c90efa6fcccfac6dc40cce1ce37d01e1997741676efb501e76ac6f4cf977b03f2ea440bcf5dea8e73de5566d4fdfcee0b79c8dae6c9e51b6e2f82e978892b51ba493f829abb99a14fa8c660f0858f6a08ab8dc209c43e83cd3a9c34879171ff72c08e782e76815bcbccc486fdb7db2b7", + "server_login_state": "b9b4b574f14879ae224e90b3004be4dddbce434b3a0d21c9730c4dc50fa0577c112c1ceaaa2243b6a8e81b0ab4fa66819e3e3ebc432bf9822d22b130f42d7dacc12d809c0598d99e1a1192d30539ce7a1d8db2b6786aac92d527220a1b730b40087c57794f10f6b8dca00acbf5a629f2d16888e398faa4b49bca19f706a2f971cb270f63ace12d2dfd5c1113d484ce26e3f986440f543128995d6d9102c31a7d594b0644601561608f341f6166d66c5368ad38cd398e7e8d69a4c8859d439df650252f1f007f844c739733831728decbf4dbb72b9170a1b4fea4e86fb1400572", + "password_file": "b9b4b574f14879ae224e90b3004be4dddbce434b3a0d21c9730c4dc50fa0577c48a0e9c136761448f72fb0bb5b4cbb169703e923e01618280a1494962dc96a25621edebd091aa270816893655121fc6f7653923813c3b203076d628a4762ea2a98cf5927a2f8ff5dd874d666cf20801b205c0a2c7c1160618b6d58953f8b1c6529c9bd43791ae3becffc56e22eef946e73412d416ab72a2b5979fb00141c3988eaef4601e9ceaf98ab9eba046d5a4c0a7e9618c764150c1406d1ec39e2cbdb84", + "export_key": "014b253d377b3afcb1c6f0a45fcaa3b49e0b5ff84b207dfb24903c38ffb1cc9b71471d59c28b00b71c4fee8ca52796f4b48ac30d11a4a30798b1996830c1abf7", + "session_key": "112c1ceaaa2243b6a8e81b0ab4fa66819e3e3ebc432bf9822d22b130f42d7dacc12d809c0598d99e1a1192d30539ce7a1d8db2b6786aac92d527220a1b730b40" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +#[cfg(feature = "ristretto255")] +pub static TEST_VECTOR_RISTRETTO255_SIGMA_I_ED25519_PH_CURVE25519: &str = r#" +{ + "client_s_pk": "31996196db6f3a2e8962dd56dffd31120f24a0c156fca69ea4ddebe98c04f773", + "client_s_sk": "b9a379cd83b652f247943ba54b433517c075c3d638db5269f8f1918db0adbe7d", + "client_e_pk": "a08c46c70a83afccf935738321e8620909de47b0bdce6ac44d0d2dfbd33711fa", + "client_e_sk": "d68e14b4e1aa54ea03e98ec62426731ed36173268115f7898ed9aeaba8fcdc15", + "server_s_pk": "0b1dba4a5b8912a5741046f1caec9a8ad61b051f6a5d9a29cd7f179fa98fa57f", + "server_s_sk": "f8c4f1576b0bdf6ed0c0f9cb7a78a3e4e32e2d59cd5feb3ced5bd741b1f0acec", + "server_e_pk": "3c828ef47ada2317e765113b9bc6025dd275f1e8452b713b3c43b8bac0c6007e", + "server_e_sk": "7559bf9a4e5a05c9917baf9eb889a440c559f5b20ba08875add31c77a70b8309", + "fake_sk": "143275fbcd052e553d26589ac8de875c1ad4a0afb2e0f80f1ec8648b46b293d8", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "a41b4d1ea17d8d367980fac50b6722ce9a73230f1f5f8794cf8704c3e76ce509", + "oprf_seed": "c5be4c4f9c86548307bb28bdad46a4aa24c0300b2faf0691be55cd2579319a92a9ec41ecbc4a8b883d5182e9b24f6125d3641cba31c1101b21eacf108c7efe12", + "dummy_masking_key": "ebd9759f1b366c4bd0fc674ba751c0b3e429130484dd7e04bbae61ad6be6dfc1c999ef3f46201def5f2309c76e54ab9a7e28bc5d942d83ae3268fb287617b03d", + "masking_nonce": "b8e038059354075d0120e6700ecfd41dfe803a1261fc59e3131f59f38cb544dd193f134fc1a333e8830cc4e3422e1ce2775ac3d90f288e6a743d7a30a4d45514", + "envelope_nonce": "37645e1c83e9d2401ea565c9b5d33ba3d23d13ce8fe51ab68fc2852020857f19", + "client_nonce": "d0dd9f7c17b6327c84555514b38a9b940fc27c9a91fa7ed27f8cc955de74f9ca", + "server_nonce": "193d686c3c9aa33b2577a483660a07a9e933655d2e66fccdbe96747d3ca10f18", + "server_sig_rng": "c81f87ae705d35b240e1cf598b78ce0f53ac43acea016bc0a9a1b9425e691ef6", + "client_sig_rng": "62ea4cd4e1933d71a02ed86c89646d8365b098b3f4173447075202f12a5f0031", + "context": "636f6e74657874", + "registration_request": "4a45c414889f9d208ffc95a58ae844e3427c8335f4e65367720fe10e82f4dd15", + "registration_response": "ba24e871b26360cebb6b98909135849be403b721d52c7d8792c08a59335f8b6e0b1dba4a5b8912a5741046f1caec9a8ad61b051f6a5d9a29cd7f179fa98fa57f", + "registration_upload": "87cbf26ed4cd18fb96645bbc89a5207422169de93c4a0cd1f36c6497f07b7bf55b79c26acb9edfc9d7a07710b583b5dc14586be11235cdbd89c6c7be16a08035ffdd15381954c9cc266e947ac71af9b79371a95afbdbfe2999616d31aa34325ab9a379cd83b652f247943ba54b433517c075c3d638db5269f8f1918db0adbe7d11a1587eb3c08002f3ce44475093d0ff8f7b32bba03ed31d2f3aa6acc7fb15c998c567c5f9f253ab4d688a1ded09391c6a88e4fc10b7b8d2a99af90f9a4a6b80", + "credential_request": "4a45c414889f9d208ffc95a58ae844e3427c8335f4e65367720fe10e82f4dd15d0dd9f7c17b6327c84555514b38a9b940fc27c9a91fa7ed27f8cc955de74f9cab1da2af41a8d17d295e7542bd02c2e2970b6c607641cdcc3fa051c5657298258", + "credential_response": "ba24e871b26360cebb6b98909135849be403b721d52c7d8792c08a59335f8b6eb8e038059354075d0120e6700ecfd41dfe803a1261fc59e3131f59f38cb544dd23ca68fffdf017d5526b7c027c096866d7811dcc325c5ee41ca892bd01274f0ab1bfc3c4e44ae82de25333fa2a1f81c6d7d4087992205c57e83b97c661550c6f5bf685666b97f0beefb6e500c357786d451b538b8e92016c7d5062b85ed636f0634d3f2c4d1dcde8bf48965364d4864e4b7a5a42ac3e78f7702daeea36fc1b5b7559bf9a4e5a05c9917baf9eb889a440c559f5b20ba08875add31c77a70b8309cdac9ca785c2bcd8c69e3df37081fb065fda8ee9ac999083f0ce44425f5a0f4d6409210678aa4560c9538b3e35ffa30db22b3f88d1db8db16df8c6bb7225a262e5992bda1a974ed85bb0336a72cc4340da130779bc6a0f7e282ccfc3b65e6407a2680ea7fa6c333271642ed30abb6ba5caec43f850baf622d1690a8c25be5e3cfa54ee9dd542d8da2beb08e883c1e5531857ca6bacc64d6b62808ac199c3a119", + "credential_finalization": "b6d70d3a843ee04c5b234466426d436f330f6de303b5c68b10b60aa8c55c8a6c1233ef60f292d1cf8a9d1a41ef4fefe1af02d1024833ff81961d25e692961103e15b2415c45f2db0a258f3915587168a67234810689e5be6153df4d94731badeb728f3e86267c16142d6d5ef634a585c29696b9e0a1de5795ec58ec1cea5e646", + "client_registration_state": "a41b4d1ea17d8d367980fac50b6722ce9a73230f1f5f8794cf8704c3e76ce5094a45c414889f9d208ffc95a58ae844e3427c8335f4e65367720fe10e82f4dd15", + "client_login_state": "a41b4d1ea17d8d367980fac50b6722ce9a73230f1f5f8794cf8704c3e76ce5094a45c414889f9d208ffc95a58ae844e3427c8335f4e65367720fe10e82f4dd15d0dd9f7c17b6327c84555514b38a9b940fc27c9a91fa7ed27f8cc955de74f9cab1da2af41a8d17d295e7542bd02c2e2970b6c607641cdcc3fa051c5657298258d08e14b4e1aa54ea03e98ec62426731ed36173268115f7898ed9aeaba8fcdc55d0dd9f7c17b6327c84555514b38a9b940fc27c9a91fa7ed27f8cc955de74f9ca", + "server_login_state": "87cbf26ed4cd18fb96645bbc89a5207422169de93c4a0cd1f36c6497f07b7bf555c4d037e735fa6862ddc46ecbe9bdd2dca94e4b2864404c7422fab684a8443fd8d8c5ae6a53bd7dd3b2231f67ef3038bbd6bafd64f002f0d614f80c217920eb0ad785f265f8d14ec9e6e45901c20552c167104f0a9acf66f993e27bdf2235379dc7aa253046c46235c4459324dcae20afce100f1f3532fc005c644a95b07bc9e15b2415c45f2db0a258f3915587168a67234810689e5be6153df4d94731badeb728f3e86267c16142d6d5ef634a585c29696b9e0a1de5795ec58ec1cea5e646", + "password_file": "87cbf26ed4cd18fb96645bbc89a5207422169de93c4a0cd1f36c6497f07b7bf55b79c26acb9edfc9d7a07710b583b5dc14586be11235cdbd89c6c7be16a08035ffdd15381954c9cc266e947ac71af9b79371a95afbdbfe2999616d31aa34325ab9a379cd83b652f247943ba54b433517c075c3d638db5269f8f1918db0adbe7d11a1587eb3c08002f3ce44475093d0ff8f7b32bba03ed31d2f3aa6acc7fb15c998c567c5f9f253ab4d688a1ded09391c6a88e4fc10b7b8d2a99af90f9a4a6b80", + "export_key": "f6a22c1d4b3f485c3b9dc418019d4450eaabe9ad06993862ad88520e676bf487d4b679e474dc37c2b88462f5b8d482d627e83e88a7d7d78d8fd3984bd31c6188", + "session_key": "55c4d037e735fa6862ddc46ecbe9bdd2dca94e4b2864404c7422fab684a8443fd8d8c5ae6a53bd7dd3b2231f67ef3038bbd6bafd64f002f0d614f80c217920eb" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P256_SIGMA_I_ED25519_PH_CURVE25519: &str = r#" +{ + "client_s_pk": "4addbd5bf973c32bd8b55be130f116d3e3b2f9026997f2e9850bf37c1208ee9b", + "client_s_sk": "47548a8af766ebd269bfc12869946729b1b7ad425be5b4dbebb9e18569686569", + "client_e_pk": "ebc96ff68ebe93e210e89722e431d688c7d14b7c19f6491e41da2f7d74a3a682", + "client_e_sk": "fdefe4f451db4f45b670dafeec0f02073349aeecdbbebd3ddad230a80f919d5d", + "server_s_pk": "7151943c17411f5eb08fd237269addef47b850d2fba60bf9d283f50da2ed0602", + "server_s_sk": "4a9e0462978d215328fbc981827039b4d349f878ba953144e8f226e3a1870f2c", + "server_e_pk": "3149a04ac64847f440b02f08b780f2134db583de8a59c19215e4776d91b7e39f", + "server_e_sk": "f17975b2212b8110419e3abb90de2b82bd1599da4bd4460004d2674c2da6b83b", + "fake_sk": "740fffee6576614eba8523d2c02f0d60c7333eb919e91b8af249e04f3759c8ea", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "cc7d0bf1fc68c05d5a8afbaa71cceff022e950fc4f495791235efc25bfb2771e", + "oprf_seed": "527ac2d51ccdbc07f34fa2e16c90f7dc7961180a7ea7d7f332f9c2b2c62598d8", + "dummy_masking_key": "b29f75429f38300e18547e8b508201fa7e458be82847b9e95f7a5aa6598e029a", + "masking_nonce": "90d762b2f9fb6226cb4731ef69397c1473b60328b00902b1fa2c682422c92984f3e51ad3e3aaf0f6d1f485024c5506e9fe2d98d3ecf3ae76da379f5628d3eb0f", + "envelope_nonce": "796603b0f1d81722d6b6c62797ab3837d32ff9953d9abbfb12b8df7d91f35294", + "client_nonce": "6702139de08504b7a64c9bac73e606738bf5ac70b473e7cc3f6a9e4e2bf0fc10", + "server_nonce": "7ab1cd6a8c3897f9b6b3ca537a3c8a0ae150adb1296676ba38cb4ea527228e03", + "server_sig_rng": "beec05da2118c7804ba294fa1db407353294152f97d9afccf2719caf2cbe5c35", + "client_sig_rng": "231c0632d38110d03f283cde641f2000d1818157233c840add9cde8207b73efd", + "context": "636f6e74657874", + "registration_request": "03752afed6accfda665e40f4c76ab31b4f56cd691e88f3c242f66d76623daa7474", + "registration_response": "02a8834335ed1e61117dda3345b59206cbb238fc45a3050005734f23c3273ef60d7151943c17411f5eb08fd237269addef47b850d2fba60bf9d283f50da2ed0602", + "registration_upload": "c020b29cae1b8951c4142d0016209b531e3f38c7e43a670f99d31bce187a76fed316fd5ddef9744222fb0465ee29be8dfa02f9287712901b75429a9ed07974d047548a8af766ebd269bfc12869946729b1b7ad425be5b4dbebb9e185696865690393bbb00a6667271cd8c928404ae017b397f18fdb9f02b6350164f7d1590146", + "credential_request": "03752afed6accfda665e40f4c76ab31b4f56cd691e88f3c242f66d76623daa74746702139de08504b7a64c9bac73e606738bf5ac70b473e7cc3f6a9e4e2bf0fc106e81473e8501f72690349f9c725b04f306e4f0792c989175d89c8d837b180c73", + "credential_response": "02a8834335ed1e61117dda3345b59206cbb238fc45a3050005734f23c3273ef60d90d762b2f9fb6226cb4731ef69397c1473b60328b00902b1fa2c682422c92984096b036acc57b760a596a2020cdbed0c00698de5336bb7bd619caf2115ddc284944d8218f19579b3c182a17e5329d056ff900d4ed1bce76ddaa325b2ac9d9ac8dcf929343e2b5253e1e84431221cb4c6abe640493837ced23e73d1a76af8e9e7f17975b2212b8110419e3abb90de2b82bd1599da4bd4460004d2674c2da6b83b2f6411548466a159c577a8af8f46fba87e0d0b0ca8bde0349cc3149fefcfea6d0cac62521fc78bdca4394dc4c87db4d02d41fca420319c5cde7485a79e5cfabe0cee9f71818b3120217b8594d4b224aa122a74e31ea6096a7966f78ee41b750d2e4c0d50d44032b9a783d33646fa2484b05bdeb6bd09f37440795a55aa8f131f9b1d0841cc4a5f455b2ffa1af05e9323707993c6a934e5ae88f7b71acfcf044f", + "credential_finalization": "9cf49faf7564f89bf696117ea3fe6086adea5485cbd56c85bf9196ecaf97007587cc0948a4d3cedeffb975900af2cc57dada869b5fbc4d1e1d3779e2a4295a02ae39c5da3fd3c418d4c8bfc3b142aed154c9f36e18e2742d8d2dcbf11f1459c33ca9b1b6813f3ca3e42a261c639fb6bf100e01b72bedf1279456851eaa93faeb", + "client_registration_state": "cc7d0bf1fc68c05d5a8afbaa71cceff022e950fc4f495791235efc25bfb2771e03752afed6accfda665e40f4c76ab31b4f56cd691e88f3c242f66d76623daa7474", + "client_login_state": "cc7d0bf1fc68c05d5a8afbaa71cceff022e950fc4f495791235efc25bfb2771e03752afed6accfda665e40f4c76ab31b4f56cd691e88f3c242f66d76623daa74746702139de08504b7a64c9bac73e606738bf5ac70b473e7cc3f6a9e4e2bf0fc106e81473e8501f72690349f9c725b04f306e4f0792c989175d89c8d837b180c73f8efe4f451db4f45b670dafeec0f02073349aeecdbbebd3ddad230a80f919d5d6702139de08504b7a64c9bac73e606738bf5ac70b473e7cc3f6a9e4e2bf0fc10", + "server_login_state": "c020b29cae1b8951c4142d0016209b531e3f38c7e43a670f99d31bce187a76fe33bd9230174bd77d8233da1a6fbb1488807d1b9180a64ff637f4bc121b9b93b13a825223185614a777399273e097ea22c1748b431a4fae810eb3b4dd82a69cd9b5fae0e2c304dd69512ac008ce0cc2eff81b5c6e6eb1372235f95de8f3939292b3cb5216f3033d9c584e0ed88c85f9e7f2d794ceb50fee966f2c41762abccbffae39c5da3fd3c418d4c8bfc3b142aed154c9f36e18e2742d8d2dcbf11f1459c33ca9b1b6813f3ca3e42a261c639fb6bf100e01b72bedf1279456851eaa93faeb", + "password_file": "c020b29cae1b8951c4142d0016209b531e3f38c7e43a670f99d31bce187a76fed316fd5ddef9744222fb0465ee29be8dfa02f9287712901b75429a9ed07974d047548a8af766ebd269bfc12869946729b1b7ad425be5b4dbebb9e185696865690393bbb00a6667271cd8c928404ae017b397f18fdb9f02b6350164f7d1590146", + "export_key": "ebb91d224013a2c1baebf70b5614a4f20b712b8098276c6a85f1849eb2c687c7", + "session_key": "33bd9230174bd77d8233da1a6fbb1488807d1b9180a64ff637f4bc121b9b93b13a825223185614a777399273e097ea22c1748b431a4fae810eb3b4dd82a69cd9" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P384_SIGMA_I_ED25519_PH_CURVE25519: &str = r#" +{ + "client_s_pk": "186759fd42ce176633e19b4ed67ef3d5be4b624d2e7d059baede7e15b2dfa75a", + "client_s_sk": "a3fada846dc7d221dedbb4543ef78af8157a6f463d1a0f809e447c720aadcac4", + "client_e_pk": "7e478d3471f985d30395da2174e6b1e98d5205cbbcdb5f48f7d97a96d63aa00c", + "client_e_sk": "7599d0b6476b4ba5dcaf76fbb81c040cdf1b378c23476fecf5a8aa6f15851666", + "server_s_pk": "12c4ec4117f252469b1ba7b2a7400bb6c15dd8bf7ce7374c3de8238e09a35d06", + "server_s_sk": "cc4fb22386a8ec35328eb273a3db4f590c29b9df50da7e0792f835d63b2dfb40", + "server_e_pk": "39308416dfbc220b1dce7657dc9f0d1e57a96f3015db6f77b504c7455b42c630", + "server_e_sk": "ecb2fb1d1c004dc28c88f4a2ea94966fd5cefcf1dc300f40975743990c07fd35", + "fake_sk": "588abf7bcb727ea41ced8072d666eabe6de1102d7746b1e4bf7808a3838e3538", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "48dd563d5324f89ca0e9d54f6bf09bc2d7470bc63a6d64b3f6243e2820aa087c96ea1eab2604d726bdd69350fafee1cf", + "oprf_seed": "5c114e57eaa12aa01c3fce1fc2f58aa5f18151a59c8d13dced0e9705b59c9e32e83b70e0a5d73e76c620a7a25e36371d", + "dummy_masking_key": "4feeb3a29d7ff235db8ccbc865134cd36c03efc08d9c3b591283e7bd86fcab1f71f4272f7b2c5c057aa7d5d03db3b1ac", + "masking_nonce": "231fbff7836e909812a75f197620bf212b1b19e5c3a048047e9a13456e65d8113f18d0a542493f4b4b8f6258d125a96a3138ee2493b09f755f38bb0fbd689c12", + "envelope_nonce": "69e0ab88a2f9b49c7f33535e04e33cdcb0c60aa077252063b78aac814f6befe8", + "client_nonce": "9952fb70c17c3b3df555bbce56391c7626b691cf93acf73a0b459f25f51cdc1a", + "server_nonce": "4751e318f3d5e5b3c2300492dc27f2449be400a6ceb4e49396a5e754ebe6368f", + "server_sig_rng": "23a49cf68a23f95448b9eb5cdcad8a1e8eb020c97d1767dadc48138b26e9b153", + "client_sig_rng": "1817bea7b0f5c553c5c6180d81fe25bf792eec240fdaad09b652214f19ec972c", + "context": "636f6e74657874", + "registration_request": "036af6814f0bf27c9406f93a3e7da1b9d6d4292dbe94f47560e56c843d510b47d8a8d3774179bbfe72a7c362f5b898de03", + "registration_response": "0280963117f4a35bb347506d3e78bd7f29e283c687cb730ab1c0aaa1e724c7abbc4cd37e76436ab547de8ee28d4aca42c212c4ec4117f252469b1ba7b2a7400bb6c15dd8bf7ce7374c3de8238e09a35d06", + "registration_upload": "d8dd4b6cd3c51980b6a64c6df910118d6a2319adddac86b0aafe62b441d8bfc43f0f3d9901dfdc4e19591c211a56d2cd5cc47c0f9348819493b4c9e2eebed0811ebf80b4a5679620db0d4b0081ad50c6a3fada846dc7d221dedbb4543ef78af8157a6f463d1a0f809e447c720aadcac4727f56abb5e12ae664b6d5860cffa72f87806229a12522f80fea0bf0b9fc4586f528414ce1ed1fdeded2383118e77e92", + "credential_request": "036af6814f0bf27c9406f93a3e7da1b9d6d4292dbe94f47560e56c843d510b47d8a8d3774179bbfe72a7c362f5b898de039952fb70c17c3b3df555bbce56391c7626b691cf93acf73a0b459f25f51cdc1a92675e627bbf5fcc8f562fef81778b5efd42e92a6898ebd7883e0187e4fa1c58", + "credential_response": "0280963117f4a35bb347506d3e78bd7f29e283c687cb730ab1c0aaa1e724c7abbc4cd37e76436ab547de8ee28d4aca42c2231fbff7836e909812a75f197620bf212b1b19e5c3a048047e9a13456e65d811d2b1cc52f1c9b28c797f43b836bafd997b0ddad81f76b27d392fb1a99842cc04c75576437e0a69ec9b1b6fda488e842f2256dcc05ff5065551b1d9c3cccd3ae2dc562b6dcdc75fd38f6438a1e597eadf368aa200d1f9293cdbdc2f0e9f9a1dcb255e208fe72fca50b6c668a9168b3b9eecb2fb1d1c004dc28c88f4a2ea94966fd5cefcf1dc300f40975743990c07fd355327c352b2d8aa1b65ae96eb3baba32242923101052b491fb11bfcf7d1ec1e0529b135f063c125bb2557f031bbd57694e1ca6620dfb8a4218e9b4b8898b7bcdd4ec0d8576af51830eb743ccae823a9e4a194dea979c5ba3377cfb6da93c10c0eca8ebbfc403a6ed75408b8d28b53559e693e16a78fe6e45c1b01f4068ffb90c2fda41767bf89bd2996f4daccb14e71b0ce4fabe8860f9d687e0bf6ccbcf18c25", + "credential_finalization": "e8cc86e2dcbfddb693277f70ead91f47f63f30e3d882d413d3c1ea8374d5824d0f119a9e513e918c907b539bc3d193f34828b9185d34cb62902e70774aa45d0af88ebfe8504ecb09befd8c98e85bc683e1e8f3d99ff8a85a1eb716ebc4d79c7accfb0bbe020ece9268b3ab1157daee1f926912d36ff9a70652bd81dfcf09af0b", + "client_registration_state": "48dd563d5324f89ca0e9d54f6bf09bc2d7470bc63a6d64b3f6243e2820aa087c96ea1eab2604d726bdd69350fafee1cf036af6814f0bf27c9406f93a3e7da1b9d6d4292dbe94f47560e56c843d510b47d8a8d3774179bbfe72a7c362f5b898de03", + "client_login_state": "48dd563d5324f89ca0e9d54f6bf09bc2d7470bc63a6d64b3f6243e2820aa087c96ea1eab2604d726bdd69350fafee1cf036af6814f0bf27c9406f93a3e7da1b9d6d4292dbe94f47560e56c843d510b47d8a8d3774179bbfe72a7c362f5b898de039952fb70c17c3b3df555bbce56391c7626b691cf93acf73a0b459f25f51cdc1a92675e627bbf5fcc8f562fef81778b5efd42e92a6898ebd7883e0187e4fa1c587099d0b6476b4ba5dcaf76fbb81c040cdf1b378c23476fecf5a8aa6f158516669952fb70c17c3b3df555bbce56391c7626b691cf93acf73a0b459f25f51cdc1a", + "server_login_state": "d8dd4b6cd3c51980b6a64c6df910118d6a2319adddac86b0aafe62b441d8bfc4b80778da346c8e528d9c05db506cf948f3bd66375ee446a3d01bb291855535a587821e853232da176cdc7dad6c57310cd60f66b386c0ff06a66220302dcb43e8ab1abc5fc89c08a108fd506a15f567daaa473a56a0b36d5f9f9ecb6fc9d3547f3665cba59eec138a459030d2d3e68275ca1bbe6ee96ea1c6a46dec1210682620f88ebfe8504ecb09befd8c98e85bc683e1e8f3d99ff8a85a1eb716ebc4d79c7accfb0bbe020ece9268b3ab1157daee1f926912d36ff9a70652bd81dfcf09af0b", + "password_file": "d8dd4b6cd3c51980b6a64c6df910118d6a2319adddac86b0aafe62b441d8bfc43f0f3d9901dfdc4e19591c211a56d2cd5cc47c0f9348819493b4c9e2eebed0811ebf80b4a5679620db0d4b0081ad50c6a3fada846dc7d221dedbb4543ef78af8157a6f463d1a0f809e447c720aadcac4727f56abb5e12ae664b6d5860cffa72f87806229a12522f80fea0bf0b9fc4586f528414ce1ed1fdeded2383118e77e92", + "export_key": "27bf48d3a45354da9f1f7846bf6d4c399df0473e43bb5b10ff1552fb20290096e4a37d5b58b0024ae6c967b894a6be0c", + "session_key": "b80778da346c8e528d9c05db506cf948f3bd66375ee446a3d01bb291855535a587821e853232da176cdc7dad6c57310cd60f66b386c0ff06a66220302dcb43e8" +} +"#; +#[cfg(feature = "ed25519")] +#[cfg(feature = "curve25519")] +pub static TEST_VECTOR_P521_SIGMA_I_ED25519_PH_CURVE25519: &str = r#" +{ + "client_s_pk": "94ee35ec00213b36f8e4638a3fba81978c97932c079e326f3327bceab74d5909", + "client_s_sk": "6da504312fb32504ce7337fe9fb24e35a51069848ad1fe51bb9d83b26cf65340", + "client_e_pk": "fb9352f306e2a772c1f730f8c32d65f111dcff8a68e908bce3bbd3763904b347", + "client_e_sk": "e926278bdef0a5e3617296803327ee8b5badf2bd954de9c713cac7dcbe01baf7", + "server_s_pk": "8b26b99874c422ea62512bef2b2e4bb392e85c9b8d56968ab8eef742fb22c472", + "server_s_sk": "942e53a83b63dda8f905d13fa1146e965055a93f02af309b55b6f4927ba20dae", + "server_e_pk": "6ac3b4c78149f50e9871227b290dc2638bbd4e1cc65c332aadafa220598eadcd", + "server_e_sk": "e3ac1e1434ea79c677a66de74e96ffd1aaa66c25c85eaca8bb93970615d5ae97", + "fake_sk": "c816e0d6eb2e9722bbbae522b8895e03f0ad18fcc4a8bc1686dd8768e31d87f1", + "credential_identifier": "637265644964656e746966696572", + "id_u": "696455", + "id_s": "696453", + "password": "70617373776f7264", + "blinding_factor": "00b71793427f39ccd0d4c028ae14574cb6dda53e913ab8bdc501f708798b0e88d4bdcebe1d41db32ef55c65381b8276f291767db126f51f8918d28bf1b5099ed2ae4", + "oprf_seed": "4dd8a470dce098a8fb629210d18182e76bd76ba0ca6917d42d3f8887d0e67b249a96f78b915775d1c0a1e5236e42d9f4e76488cedbd83e436fe1c789cfd8b2ea", + "dummy_masking_key": "776dba5107b040a31f42f27a76eed37ffed7b3a01126f97232694f1e77098132c182fcecd761db7c35cf34fe09617fd52ef0050e0f15cff49ee27885c6d335ef", + "masking_nonce": "9929b028d9d287b8dafc37b581603214ed3e08629d6a83708133ecfe3ccd9cd436e0a1dd82ddda719dcf9b0f132660892031ce0c34f5a28d2d5d483757337837", + "envelope_nonce": "746421a3ef1e369f3f4fd40f69d6e28a90c44dcfbfbf0553628f15e0045bbf49", + "client_nonce": "28a82ed16d79bb97d1e68c97032daa37da8be7b3adfbdd8d172300ecd2357f7c", + "server_nonce": "2c617c3a5117b5e54006515555ffcfde1b4daf48af094b8ae824bcd552036c91", + "server_sig_rng": "99bb486008f9709baaa4489cfb37b90487fefa458a4901ead9b1296735c71a8d", + "client_sig_rng": "d9c8609845236ec06bfd6130aec3555865687d67ae5f4965d96a7181779b73cd", + "context": "636f6e74657874", + "registration_request": "02006766401b237e88750cb04589d6a5d080ccb74a86c9c34525fe4f73757218b40753a55aa49cc75d5ea8b57de021a6a64c1cc90b823c4ee2d21ed92784ec764a0d84", + "registration_response": "0300e22aed865b538e365cdba3466f5a1d8894c5c9205bf3e940eae17724a0315281f3594fb11a5bcc535f467383dfa894135c3c0e3f48e9883fa7aa59999dd88cbb8a8b26b99874c422ea62512bef2b2e4bb392e85c9b8d56968ab8eef742fb22c472", + "registration_upload": "aa511147f0e81f5484a66870aaf42e5590f6bc542c79265f30d4bcc04d931fadd7caa08ce3bdb052df0b5c29a2e9e99e233f2315b6ceeb8ad250dd0c142c907b169250dcbd127df5431545290413a680470dbebc0b641963c31effa0c84ed2126da504312fb32504ce7337fe9fb24e35a51069848ad1fe51bb9d83b26cf65340e8a04af905f3cb0883d0a3df5ab92209eba90cc871b6a865940a3cc527d98fc6f933f014cce94556c4ce8ecf659f84e36e285e759bb473a7fbd194e747c62351", + "credential_request": "02006766401b237e88750cb04589d6a5d080ccb74a86c9c34525fe4f73757218b40753a55aa49cc75d5ea8b57de021a6a64c1cc90b823c4ee2d21ed92784ec764a0d8428a82ed16d79bb97d1e68c97032daa37da8be7b3adfbdd8d172300ecd2357f7cbe130739340daa00f0c4f9a4dcb396280148e8a532dcf88c02452c42f4163202", + "credential_response": "0300e22aed865b538e365cdba3466f5a1d8894c5c9205bf3e940eae17724a0315281f3594fb11a5bcc535f467383dfa894135c3c0e3f48e9883fa7aa59999dd88cbb8a9929b028d9d287b8dafc37b581603214ed3e08629d6a83708133ecfe3ccd9cd48acd210766fff1ed212fb63f07c7e8bf3608eb9c27bebdc6369904b523cab7ee15be002dfb8cc275f96f45ebb8e3331b19aa4e9e32d5f154b19d9a7abe11951e2456740b2e950eb09eea9a7fb6f8ba19018e6c0f637aefc912684d25776414a750c47a09101e1a41ba6941e6b04dccfc6703fb93c93b2dbf7bfb070e7ecf5738e3ac1e1434ea79c677a66de74e96ffd1aaa66c25c85eaca8bb93970615d5ae971bcb011496729512cf68e5d19313ef242347f0737a3a801860219e0ce781280f859961411ef75deed3be3e1bc682b2eb65896e59a65bb4967bc1bdd42369ec6e2addb305b47614367772d8fd0dad023e69eaed65998b41e5041d01edb80ed700df7d5957c35bfb27102287677516adc54ee8beee8cf6e8bb00050107b986da0555d3d1f9c67b2f8857509f06b424fcf5f79f12cd9f7b6de2c9bd2955a82054ff", + "credential_finalization": "8bcd095160cc9b68070f7195ab5067ee8f5ca59575916703605ea02a80af369f0babd21585451adfa5d443f17b44890d846bc0e941c382c8287cf3f54952740d026af7ee47f4d80c796913a60d536eddc72c50dca94aa25a087f69184c16829a1224edcad56f564d310f07dd3ef8a5acece660a057cc6f984d3e174182ce2049", + "client_registration_state": "00b71793427f39ccd0d4c028ae14574cb6dda53e913ab8bdc501f708798b0e88d4bdcebe1d41db32ef55c65381b8276f291767db126f51f8918d28bf1b5099ed2ae402006766401b237e88750cb04589d6a5d080ccb74a86c9c34525fe4f73757218b40753a55aa49cc75d5ea8b57de021a6a64c1cc90b823c4ee2d21ed92784ec764a0d84", + "client_login_state": "00b71793427f39ccd0d4c028ae14574cb6dda53e913ab8bdc501f708798b0e88d4bdcebe1d41db32ef55c65381b8276f291767db126f51f8918d28bf1b5099ed2ae402006766401b237e88750cb04589d6a5d080ccb74a86c9c34525fe4f73757218b40753a55aa49cc75d5ea8b57de021a6a64c1cc90b823c4ee2d21ed92784ec764a0d8428a82ed16d79bb97d1e68c97032daa37da8be7b3adfbdd8d172300ecd2357f7cbe130739340daa00f0c4f9a4dcb396280148e8a532dcf88c02452c42f4163202e826278bdef0a5e3617296803327ee8b5badf2bd954de9c713cac7dcbe01ba7728a82ed16d79bb97d1e68c97032daa37da8be7b3adfbdd8d172300ecd2357f7c", + "server_login_state": "aa511147f0e81f5484a66870aaf42e5590f6bc542c79265f30d4bcc04d931fad129544eea4b5313fc934fc25ff3625459fcf2b4484d3bac3c121cf26ac23d9df8bb96cb8347211f95ce7a0cf0304bd55f244af0b185b8414913ccd96847f742b59cc8a77a5bcf4daed9a7efcb0366787beb8c46d22abdf2199069baf9fb0260a68a5f5c9a17011575f03c000ed52fe9a38b34566588abe28b192e43a7d8bef27026af7ee47f4d80c796913a60d536eddc72c50dca94aa25a087f69184c16829a1224edcad56f564d310f07dd3ef8a5acece660a057cc6f984d3e174182ce2049", + "password_file": "aa511147f0e81f5484a66870aaf42e5590f6bc542c79265f30d4bcc04d931fadd7caa08ce3bdb052df0b5c29a2e9e99e233f2315b6ceeb8ad250dd0c142c907b169250dcbd127df5431545290413a680470dbebc0b641963c31effa0c84ed2126da504312fb32504ce7337fe9fb24e35a51069848ad1fe51bb9d83b26cf65340e8a04af905f3cb0883d0a3df5ab92209eba90cc871b6a865940a3cc527d98fc6f933f014cce94556c4ce8ecf659f84e36e285e759bb473a7fbd194e747c62351", + "export_key": "52a9a84a06d44b7fda6cdd4f863d17cf76d806acebbe087ac1ba7c42183817567f0fba9ad283dee53fb551010602e9ce4b7614342815e01484c31361f1686941", + "session_key": "129544eea4b5313fc934fc25ff3625459fcf2b4484d3bac3c121cf26ac23d9df8bb96cb8347211f95ce7a0cf0304bd55f244af0b185b8414913ccd96847f742b" } "#; diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 2d25207..45c96b6 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -12,6 +12,4 @@ mod full_test_vectors; pub mod mock_rng; mod opaque_vectors; mod parser; -#[cfg(test_hsm)] -mod remote_key; mod test_opaque_vectors; diff --git a/src/tests/test_opaque_vectors.rs b/src/tests/test_opaque_vectors.rs index 9adcbd1..c8aa5a5 100644 --- a/src/tests/test_opaque_vectors.rs +++ b/src/tests/test_opaque_vectors.rs @@ -16,15 +16,16 @@ use generic_array::{ArrayLength, GenericArray}; use rand::rngs::OsRng; use rand::RngCore; use serde_json::Value; -use voprf::Group; -use crate::ciphersuite::{CipherSuite, OprfGroup, OprfHash}; +use crate::ciphersuite::{CipherSuite, KeGroup, OprfGroup, OprfHash}; use crate::envelope::EnvelopeLen; use crate::errors::*; use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; -use crate::key_exchange::traits::{Ke1MessageLen, Ke2MessageLen}; -use crate::key_exchange::tripledh::{NonceLen, TripleDh}; +use crate::key_exchange::group::Group; +use crate::key_exchange::shared::NonceLen; +use crate::key_exchange::traits::{ + Deserialize, Ke1MessageLen, Ke2MessageLen, KeyExchange, Serialize, +}; use crate::ksf::Identity; use crate::messages::{ CredentialRequestLen, CredentialResponseLen, CredentialResponseWithoutKeLen, @@ -99,7 +100,7 @@ fn populate_test_vectors(values: &Value) -> OpaqueTestVectorPar dummy_private_key: { match decode(values, "client_private_key") { Some(value) => value, - None => CS::KeGroup::serialize_sk(CS::KeGroup::random_sk(&mut OsRng)).to_vec(), + None => KeGroup::::serialize_sk(KeGroup::::random_sk(&mut OsRng)).to_vec(), } }, dummy_masking_key: { @@ -149,12 +150,9 @@ fn populate_test_vectors(values: &Value) -> OpaqueTestVectorPar fn get_password_file_bytes(parameters: &OpaqueTestVectorParameters) -> Vec where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload @@ -194,8 +192,7 @@ fn tests() -> Result<(), ProtocolError> { struct Ristretto255Sha512NoKsf; impl CipherSuite for Ristretto255Sha512NoKsf { type OprfCs = crate::Ristretto255; - type KeGroup = crate::Ristretto255; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } @@ -233,8 +230,7 @@ fn tests() -> Result<(), ProtocolError> { struct Ristretto255Sha512Curve25519NoKsf; impl CipherSuite for Ristretto255Sha512Curve25519NoKsf { type OprfCs = crate::Ristretto255; - type KeGroup = crate::Curve25519; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } @@ -270,8 +266,7 @@ fn tests() -> Result<(), ProtocolError> { struct P256Sha256NoKsf; impl CipherSuite for P256Sha256NoKsf { type OprfCs = p256::NistP256; - type KeGroup = p256::NistP256; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } @@ -325,7 +320,7 @@ fn test_registration_response( ) -> Result<(), ProtocolError> where // RegistrationResponse: KgPk + KePk - as Group>::ElemLen: Add<::PkLen>, + as voprf::Group>::ElemLen: Add< as Group>::PkLen>, RegistrationResponseLen: ArrayLength, { for parameters in tvs { @@ -362,12 +357,9 @@ fn test_registration_upload( tvs: &[OpaqueTestVectorParameters], ) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, { @@ -413,7 +405,8 @@ where fn test_ke1(tvs: &[OpaqueTestVectorParameters]) -> Result<(), ProtocolError> where // CredentialRequest: KgPk + Ke1Message - as Group>::ElemLen: Add>, + ::KE1Message: Serialize, + as voprf::Group>::ElemLen: Add>, CredentialRequestLen: ArrayLength, { for parameters in tvs { @@ -437,28 +430,20 @@ where fn test_ke2(tvs: &[OpaqueTestVectorParameters]) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, + ::KE1Message: Deserialize, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: ArrayLength + Add>, + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { @@ -490,7 +475,7 @@ where Some(record), CredentialRequest::::deserialize(¶meters.KE1).unwrap(), ¶meters.credential_identifier, - ServerLoginStartParameters { + ServerLoginParameters { context: Some(¶meters.context), identifiers: Identifiers { client: parameters.client_identity.as_deref(), @@ -520,10 +505,8 @@ where fn test_ke3(tvs: &[OpaqueTestVectorParameters]) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + ::KE2Message: Deserialize + Serialize, + ::KE3Message: Serialize, { for parameters in tvs { let client_login_start = [ @@ -537,6 +520,7 @@ where ClientLogin::::start(&mut client_login_start_rng, ¶meters.password)?; let client_login_finish_result = client_login_start_result.state.finish( + &mut OsRng, ¶meters.password, CredentialResponse::::deserialize(¶meters.KE2)?, ClientLoginFinishParameters::new( @@ -577,19 +561,14 @@ fn test_server_login_finish( tvs: &[OpaqueTestVectorParameters], ) -> Result<(), ProtocolError> where - // Envelope: Nonce + Hash - NonceLen: Add>>, - EnvelopeLen: ArrayLength, + ::KE1Message: Deserialize, + ::KE3Message: Deserialize, // RegistrationUpload: (KePk + Hash) + Envelope - ::PkLen: Add>>, - Sum<::PkLen, OutputSize>>: + as Group>::PkLen: Add>>, + Sum< as Group>::PkLen, OutputSize>>: ArrayLength + Add>, RegistrationUploadLen: ArrayLength, // ServerRegistration = RegistrationUpload - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, { for parameters in tvs { let server_setup = ServerSetup::::deserialize( @@ -619,7 +598,7 @@ where Some(record), CredentialRequest::::deserialize(¶meters.KE1).unwrap(), ¶meters.credential_identifier, - ServerLoginStartParameters { + ServerLoginParameters { context: Some(¶meters.context), identifiers: Identifiers { client: parameters.client_identity.as_deref(), @@ -628,9 +607,16 @@ where }, )?; - let server_login_result = server_login_start_result - .state - .finish(CredentialFinalization::deserialize(¶meters.KE3)?)?; + let server_login_result = server_login_start_result.state.finish( + CredentialFinalization::deserialize(¶meters.KE3)?, + ServerLoginParameters { + context: Some(¶meters.context), + identifiers: Identifiers { + client: parameters.client_identity.as_deref(), + server: parameters.server_identity.as_deref(), + }, + }, + )?; assert_eq!( hex::encode(¶meters.session_key), @@ -644,15 +630,14 @@ fn test_fake_vectors( tvs: &[OpaqueTestVectorParameters], ) -> Result<(), ProtocolError> where - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, + ::KE1Message: Deserialize, // CredentialResponseWithoutKeLen: (KgPk + Nonce) + MaskedResponse - as Group>::ElemLen: Add, - Sum< as Group>::ElemLen, NonceLen>: ArrayLength + Add>, + as voprf::Group>::ElemLen: Add, + Sum< as voprf::Group>::ElemLen, NonceLen>: + ArrayLength + Add>, CredentialResponseWithoutKeLen: ArrayLength, // CredentialResponse: CredentialResponseWithoutKeLen + Ke2Message + ::KE2Message: Serialize, CredentialResponseWithoutKeLen: Add>, CredentialResponseLen: ArrayLength, { @@ -681,7 +666,7 @@ where None, CredentialRequest::::deserialize(¶meters.KE1).unwrap(), ¶meters.credential_identifier, - ServerLoginStartParameters { + ServerLoginParameters { context: Some(¶meters.context), identifiers: Identifiers { client: parameters.client_identity.as_deref(), diff --git a/src/util.rs b/src/util.rs deleted file mode 100644 index 283713c..0000000 --- a/src/util.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Meta Platforms, Inc. and affiliates. -// -// This source code is dual-licensed under either the MIT license found in the -// LICENSE-MIT file in the root directory of this source tree or the Apache -// License, Version 2.0 found in the LICENSE-APACHE file in the root directory -// of this source tree. You may select, at your option, one of the above-listed -// licenses. - -//! Utility functions. - -#[cfg(test)] -pub(crate) fn test_zeroize_on_drop(value: &mut T) { - drop_manually(value); - - test_zeroized(value); -} - -#[cfg(test)] -pub(crate) fn test_zeroized(value: &mut T) { - use std::{mem, slice, vec}; - - let test = - unsafe { slice::from_raw_parts(value as *const _ as *const u8, mem::size_of::()) }; - - assert_eq!(test, vec![0; mem::size_of::()]); -} - -#[cfg(test)] -pub(crate) fn drop_manually(value: &mut T) { - use std::{mem, ptr, vec}; - - assert!(mem::needs_drop::()); - let mut test_holder = vec![value]; - let ptr = &mut *test_holder[0] as *mut T; - - unsafe { - test_holder.set_len(0); - ptr::drop_in_place(ptr); - } - - assert_eq!(test_holder.capacity(), 1); -} diff --git a/src/tests/remote_key.rs b/tests/remote_key.rs similarity index 50% rename from src/tests/remote_key.rs rename to tests/remote_key.rs index 21d33f3..0c729d9 100644 --- a/src/tests/remote_key.rs +++ b/tests/remote_key.rs @@ -6,113 +6,130 @@ // of this source tree. You may select, at your option, one of the above-listed // licenses. +#![cfg(test_hsm)] +#![allow(type_alias_bounds)] + use std::env; -use std::ops::Add; use std::sync::{LazyLock, Mutex}; use std::vec::Vec; +#[cfg(feature = "ecdsa")] +use ::ecdsa::SignatureSize; use cryptoki::context::{CInitializeArgs, Pkcs11}; use cryptoki::mechanism::elliptic_curve::{EcKdf, Ecdh1DeriveParams}; use cryptoki::mechanism::Mechanism; use cryptoki::object::{Attribute, AttributeType, KeyType, ObjectClass, ObjectHandle}; use cryptoki::session::{Session, UserType}; use cryptoki::types::AuthPin; +#[cfg(feature = "ecdsa")] +use digest::Digest; use digest::OutputSizeUser; +use elliptic_curve::group::prime::PrimeCurveAffine; use elliptic_curve::group::Curve; use elliptic_curve::pkcs8::der::asn1::{OctetString, OctetStringRef}; use elliptic_curve::pkcs8::der::{Decode, Encode}; use elliptic_curve::pkcs8::{AssociatedOid, ObjectIdentifier}; use elliptic_curve::point::{AffineCoordinates, DecompressPoint}; -use elliptic_curve::sec1::{ModulusSize, Tag, ToEncodedPoint}; -use elliptic_curve::{AffinePoint, CurveArithmetic, FieldBytesSize, Group, ProjectivePoint}; -use generic_array::typenum::{Sum, Unsigned}; +use elliptic_curve::sec1::{FromEncodedPoint, ModulusSize, Tag, ToEncodedPoint}; +#[cfg(feature = "ecdsa")] +use elliptic_curve::PrimeCurve; +use elliptic_curve::{AffinePoint, CurveArithmetic, FieldBytesSize, Group as _, ProjectivePoint}; +use generic_array::typenum::Unsigned; use generic_array::{ArrayLength, GenericArray}; +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +use opaque_ke::key_exchange::group::ed25519::{self, Ed25519}; +use opaque_ke::key_exchange::group::elliptic_curve::NonIdentity; +use opaque_ke::key_exchange::group::Group; +#[cfg(feature = "ecdsa")] +use opaque_ke::key_exchange::sigma_i::ecdsa::{self, Ecdsa, PreHash}; +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +use opaque_ke::key_exchange::sigma_i::pure_eddsa::PureEddsa; +#[cfg(feature = "ecdsa")] +use opaque_ke::key_exchange::sigma_i::{CachedMessage, HashOutput, Message, SigmaI}; +use opaque_ke::key_exchange::tripledh::TripleDh; +use opaque_ke::key_exchange::KeyExchange; +use opaque_ke::keypair::{KeyPair, PublicKey}; +use opaque_ke::ksf::Identity; +use opaque_ke::{ + CipherSuite, ClientLogin, ClientLoginFinishParameters, ClientLoginStartResult, + ClientRegistration, ClientRegistrationFinishParameters, ClientRegistrationStartResult, + ServerLogin, ServerLoginParameters, ServerLoginStartResult, ServerRegistration, ServerSetup, +}; +#[cfg(all(feature = "curve25519", feature = "ristretto255"))] +use opaque_ke::{Curve25519, Ristretto255}; use p256::NistP256; use p384::NistP384; use p521::NistP521; use rand::rngs::OsRng; +use sha2::{Sha256, Sha384, Sha512}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq}; -use crate::ciphersuite::{OprfGroup, OprfHash}; -use crate::envelope::NonceLen; -use crate::hash::OutputSize; -use crate::key_exchange::group::KeGroup; -use crate::key_exchange::tripledh::{DiffieHellman, TripleDh}; -use crate::keypair::{KeyPair, PublicKey}; -use crate::ksf::Identity; -use crate::opaque::MaskedResponseLen; -use crate::{ - CipherSuite, ClientLogin, ClientLoginFinishParameters, ClientLoginStartResult, - ClientRegistration, ClientRegistrationFinishParameters, ClientRegistrationStartResult, - ServerLogin, ServerLoginStartParameters, ServerLoginStartResult, ServerRegistration, - ServerSetup, -}; -#[cfg(all(feature = "curve25519", feature = "ristretto255"))] -use crate::{Curve25519, Ristretto255}; +type OprfGroup = ::Group; +type OprfHash = ::Hash; +type KeGroup = ::Group; #[test] -fn p256() { +fn triple_dh_p256() { struct Suite; impl CipherSuite for Suite { type OprfCs = NistP256; - type KeGroup = NistP256; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } test::( Mechanism::EccKeyPairGen, NistP256::OID, + Attribute::Derive(true), Mechanism::Sha256Hmac, ); } #[test] -fn p384() { +fn triple_dh_p384() { struct Suite; impl CipherSuite for Suite { type OprfCs = NistP384; - type KeGroup = NistP384; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } test::( Mechanism::EccKeyPairGen, NistP384::OID, + Attribute::Derive(true), Mechanism::Sha384Hmac, ); } #[test] -fn p521() { +fn triple_dh_p521() { struct Suite; impl CipherSuite for Suite { type OprfCs = NistP521; - type KeGroup = NistP521; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } test::( Mechanism::EccKeyPairGen, NistP521::OID, + Attribute::Derive(true), Mechanism::Sha512Hmac, ); } #[test] #[cfg(all(feature = "curve25519", feature = "ristretto255"))] -fn curve25519() { +fn triple_dh_curve25519() { struct Suite; impl CipherSuite for Suite { type OprfCs = Ristretto255; - type KeGroup = Curve25519; - type KeyExchange = TripleDh; + type KeyExchange = TripleDh; type Ksf = Identity; } @@ -121,6 +138,64 @@ fn curve25519() { // implementation. See https://github.com/softhsm/SoftHSMv2/issues/647. Mechanism::EccEdwardsKeyPairGen, ObjectIdentifier::new("1.3.101.110").unwrap(), + Attribute::Derive(true), + Mechanism::Sha512Hmac, + ); +} + +#[test] +#[cfg(feature = "ecdsa")] +fn sigma_i_p256() { + struct Suite; + + impl CipherSuite for Suite { + type OprfCs = NistP256; + type KeyExchange = SigmaI, NistP256, Sha256>; + type Ksf = Identity; + } + + test::( + Mechanism::EccKeyPairGen, + NistP256::OID, + Attribute::Sign(true), + Mechanism::Sha256Hmac, + ); +} + +#[test] +#[cfg(feature = "ecdsa")] +fn sigma_i_p384() { + struct Suite; + + impl CipherSuite for Suite { + type OprfCs = NistP384; + type KeyExchange = SigmaI, NistP384, Sha384>; + type Ksf = Identity; + } + + test::( + Mechanism::EccKeyPairGen, + NistP384::OID, + Attribute::Sign(true), + Mechanism::Sha384Hmac, + ); +} + +#[test] +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +fn sigma_i_ed25519() { + struct Suite; + + impl CipherSuite for Suite { + type OprfCs = Ristretto255; + type KeyExchange = SigmaI, Ristretto255, Sha512>; + type Ksf = Identity; + } + + test::( + Mechanism::EccEdwardsKeyPairGen, + ObjectIdentifier::new_unwrap("1.3.101.112"), + Attribute::Sign(true), Mechanism::Sha512Hmac, ); } @@ -128,43 +203,31 @@ fn curve25519() { #[derive(Clone)] struct RemoteKey(ObjectHandle); -trait Pkcs11DiffieHellman { - fn pkcs11_diffie_hellman( - &self, - server_pk: &PublicKey, - client_pk: &PublicKey, - ) -> GenericArray; +trait Pkcs11PublicKey +where + Self: Group, +{ + fn pkcs11_public_key(data: &[u8]) -> PublicKey; } -fn test>( +trait Pkcs11KeyExchange { + fn pkcs11_key_exchange( + &self, + server_pk: &PublicKey, + data: KE::KE2BuilderData<'_, CS>, + ) -> KE::KE2BuilderInput; +} + +fn test( dh_mechanism: Mechanism, oid: ObjectIdentifier, + attribute: Attribute, hmac_mechanism: Mechanism, ) where - RemoteKey: Pkcs11DiffieHellman, - ::Sk: DiffieHellman, - // MaskedResponse: (Nonce + Hash) + KePk - NonceLen: Add>>, - Sum>>: ArrayLength + Add<::PkLen>, - MaskedResponseLen: ArrayLength, - // Ke1State: KeSk + Nonce - ::SkLen: Add, - Sum<::SkLen, NonceLen>: ArrayLength, - // Ke1Message: Nonce + KePk - NonceLen: Add<::PkLen>, - Sum::PkLen>: ArrayLength, - // Ke2State: (Hash + Hash) + Hash - OutputSize>: Add>>, - Sum>, OutputSize>>: - ArrayLength + Add>>, - Sum>, OutputSize>>, OutputSize>>: - ArrayLength, - // Ke2Message: (Nonce + KePk) + Hash - NonceLen: Add<::PkLen>, - Sum::PkLen>: ArrayLength + Add>>, - Sum::PkLen>, OutputSize>>: ArrayLength, + KeGroup: Pkcs11PublicKey, + RemoteKey: Pkcs11KeyExchange, { - let (remote_key, pk) = pkcs11_generate_key_pair(dh_mechanism, oid); + let (remote_key, pk) = pkcs11_generate_key_pair(dh_mechanism, oid, attribute); let keypair = KeyPair::new(RemoteKey(remote_key), pk); let oprf_seed = pkcs11_generate_oprf_seed( as OutputSizeUser>::OutputSize::U64); @@ -212,12 +275,12 @@ fn test>( key_material, Some(file), message, - ServerLoginStartParameters::default(), + ServerLoginParameters::default(), ) .unwrap(); let shared_secret = builder .private_key() - .pkcs11_diffie_hellman(server_setup.keypair().public(), builder.data()); + .pkcs11_key_exchange(server_setup.keypair().public(), builder.data()); let ServerLoginStartResult { message, @@ -228,6 +291,7 @@ fn test>( let message = client .clone() .finish( + &mut OsRng, PASSWORD.as_bytes(), message, ClientLoginFinishParameters::default(), @@ -235,7 +299,11 @@ fn test>( .map(|result| result.message); message - .map(|message| server.finish(message).unwrap()) + .map(|message| { + server + .finish(message, ServerLoginParameters::default()) + .unwrap() + }) .unwrap(); } @@ -263,10 +331,11 @@ static SESSION: LazyLock> = LazyLock::new(|| { Mutex::new(session) }); -fn pkcs11_generate_key_pair( +fn pkcs11_generate_key_pair( mechanism: Mechanism, oid: ObjectIdentifier, -) -> (ObjectHandle, PublicKey) { + attribute: Attribute, +) -> (ObjectHandle, PublicKey) { let session = SESSION.lock().unwrap(); let (pk, remote_key) = session .generate_key_pair( @@ -275,7 +344,7 @@ fn pkcs11_generate_key_pair( Attribute::Token(false), Attribute::EcParams(oid.to_der().unwrap()), ], - &[Attribute::Token(false), Attribute::Derive(true)], + &[Attribute::Token(false), attribute], ) .unwrap(); @@ -290,7 +359,7 @@ fn pkcs11_generate_key_pair( drop(session); let pk = OctetString::from_der(&pk).unwrap(); - let pk = PublicKey::deserialize(pk.as_bytes()).unwrap(); + let pk = G::pkcs11_public_key(pk.as_bytes()); (remote_key, pk) } @@ -342,50 +411,131 @@ fn pkcs11_hkdf( okm } -impl Pkcs11DiffieHellman for RemoteKey { - fn pkcs11_diffie_hellman( - &self, - server_pk: &PublicKey, - client_pk: &PublicKey, - ) -> GenericArray::PkLen> { - ec_pkcs_11_derive_secret::(self.0, server_pk, client_pk) +impl Pkcs11PublicKey for NistP256 { + fn pkcs11_public_key(data: &[u8]) -> PublicKey { + pkcs11_ec_public_key(data) } } -impl Pkcs11DiffieHellman for RemoteKey { - fn pkcs11_diffie_hellman( - &self, - server_pk: &PublicKey, - client_pk: &PublicKey, - ) -> GenericArray::PkLen> { - ec_pkcs_11_derive_secret::(self.0, server_pk, client_pk) +impl Pkcs11PublicKey for NistP384 { + fn pkcs11_public_key(data: &[u8]) -> PublicKey { + pkcs11_ec_public_key(data) } } -impl Pkcs11DiffieHellman for RemoteKey { - fn pkcs11_diffie_hellman( - &self, - server_pk: &PublicKey, - client_pk: &PublicKey, - ) -> GenericArray::PkLen> { - ec_pkcs_11_derive_secret::(self.0, server_pk, client_pk) +impl Pkcs11PublicKey for NistP521 { + fn pkcs11_public_key(data: &[u8]) -> PublicKey { + pkcs11_ec_public_key(data) } } #[cfg(all(feature = "curve25519", feature = "ristretto255"))] -impl Pkcs11DiffieHellman for RemoteKey { - fn pkcs11_diffie_hellman( +impl Pkcs11PublicKey for Curve25519 { + fn pkcs11_public_key(data: &[u8]) -> PublicKey { + PublicKey::deserialize(data).unwrap() + } +} + +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +impl Pkcs11PublicKey for Ed25519 { + fn pkcs11_public_key(data: &[u8]) -> PublicKey { + PublicKey::deserialize(data).unwrap() + } +} + +impl Pkcs11KeyExchange> for RemoteKey { + fn pkcs11_key_exchange( + &self, + server_pk: &PublicKey, + client_pk: &PublicKey, + ) -> GenericArray::PkLen> { + pkcs_11_ecdsa_derive_secret::(self.0, server_pk, client_pk) + } +} + +impl Pkcs11KeyExchange> for RemoteKey { + fn pkcs11_key_exchange( + &self, + server_pk: &PublicKey, + client_pk: &PublicKey, + ) -> GenericArray::PkLen> { + pkcs_11_ecdsa_derive_secret::(self.0, server_pk, client_pk) + } +} + +impl Pkcs11KeyExchange> for RemoteKey { + fn pkcs11_key_exchange( + &self, + server_pk: &PublicKey, + client_pk: &PublicKey, + ) -> GenericArray::PkLen> { + pkcs_11_ecdsa_derive_secret::(self.0, server_pk, client_pk) + } +} + +#[cfg(all(feature = "curve25519", feature = "ristretto255"))] +impl Pkcs11KeyExchange> for RemoteKey { + fn pkcs11_key_exchange( &self, _: &PublicKey, pk: &PublicKey, - ) -> GenericArray::PkLen> { - let shared_secret = pkcs11_derive_secret(self.0, &pk.serialize()); + ) -> GenericArray::PkLen> { + let shared_secret = pkcs_11_dh_derive_secret(self.0, &pk.serialize()); GenericArray::clone_from_slice(&shared_secret) } } -fn pkcs11_derive_secret(sk: ObjectHandle, pk: &[u8]) -> Vec { +#[cfg(feature = "ecdsa")] +impl Pkcs11KeyExchange, NistP256, Sha256>> for RemoteKey { + fn pkcs11_key_exchange( + &self, + _: &PublicKey, + message: &Message, + ) -> (ecdsa::Signature, PreHash) { + pkcs_11_ecdsa_sign::(self.0, message.hash()) + } +} + +#[cfg(feature = "ecdsa")] +impl Pkcs11KeyExchange, NistP384, Sha384>> for RemoteKey { + fn pkcs11_key_exchange( + &self, + _: &PublicKey, + message: &Message, + ) -> (ecdsa::Signature, PreHash) { + pkcs_11_ecdsa_sign::(self.0, message.hash()) + } +} + +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +impl Pkcs11KeyExchange, Ristretto255, Sha512>> for RemoteKey { + fn pkcs11_key_exchange( + &self, + _: &PublicKey, + message: &Message, + ) -> (ed25519::Signature, CachedMessage) { + pkcs_11_eddsa_sign(self.0, message) + } +} + +fn pkcs11_ec_public_key(data: &[u8]) -> PublicKey +where + G: Group> + CurveArithmetic, + FieldBytesSize: ModulusSize, + AffinePoint: + FromEncodedPoint + ToEncodedPoint + PrimeCurveAffine>, +{ + PublicKey::deserialize( + elliptic_curve::PublicKey::::from_sec1_bytes(data) + .unwrap() + .to_encoded_point(true) + .as_bytes(), + ) + .unwrap() +} + +fn pkcs_11_dh_derive_secret(sk: ObjectHandle, pk: &[u8]) -> Vec { let session = SESSION.lock().unwrap(); let shared_secret = session .derive_key( @@ -413,23 +563,23 @@ fn pkcs11_derive_secret(sk: ObjectHandle, pk: &[u8]) -> Vec { shared_secret } -fn ec_pkcs_11_derive_secret( +fn pkcs_11_ecdsa_derive_secret( server_sk: ObjectHandle, - server_pk: &PublicKey, - client_pk: &PublicKey, -) -> GenericArray::PkLen> + server_pk: &PublicKey, + client_pk: &PublicKey, +) -> GenericArray::PkLen> where - KG: KeGroup> + CurveArithmetic, - AffinePoint: DecompressPoint + ToEncodedPoint, - FieldBytesSize: ModulusSize, + G: Group> + CurveArithmetic, + AffinePoint: DecompressPoint + ToEncodedPoint, + FieldBytesSize: ModulusSize, { let client_pk_point = client_pk.to_group_type(); let client_pk = client_pk.serialize(); let client_pk = OctetStringRef::new(&client_pk).unwrap(); let client_pk = client_pk.to_der().unwrap(); - let shared_secret_bytes = pkcs11_derive_secret(server_sk, &client_pk); - let shared_secret_point = AffinePoint::::decompress( + let shared_secret_bytes = pkcs_11_dh_derive_secret(server_sk, &client_pk); + let shared_secret_point = AffinePoint::::decompress( &GenericArray::clone_from_slice(&shared_secret_bytes), Choice::from(0), ) @@ -437,14 +587,14 @@ where let mut shared_secret = GenericArray::default(); shared_secret[1..].copy_from_slice(&shared_secret_bytes); - let shifted_client_pk = client_pk_point + ProjectivePoint::::generator(); + let shifted_client_pk = client_pk_point.0.to_point() + ProjectivePoint::::generator(); let shifted_client_pk = shifted_client_pk.to_affine().to_encoded_point(true); let shifted_client_pk = OctetStringRef::new(shifted_client_pk.as_bytes()).unwrap(); let shifted_client_pk = shifted_client_pk.to_der().unwrap(); - let check_point = pkcs11_derive_secret(server_sk, &shifted_client_pk); + let check_point = pkcs_11_dh_derive_secret(server_sk, &shifted_client_pk); - let shifted_server_pk = server_pk.to_group_type() + shared_secret_point; + let shifted_server_pk = server_pk.to_group_type().0.to_point() + shared_secret_point; let shifted_server_pk = shifted_server_pk.to_affine(); let tag = u8::conditional_select( @@ -456,3 +606,52 @@ where shared_secret } + +#[cfg(feature = "ecdsa")] +fn pkcs_11_ecdsa_sign( + sk: ObjectHandle, + hashes: HashOutput, +) -> (ecdsa::Signature, PreHash) +where + SignatureSize: ArrayLength, +{ + let sign_pre_hash = hashes.sign.finalize(); + + let session = SESSION.lock().unwrap(); + let signature = session.sign(&Mechanism::Ecdsa, sk, &sign_pre_hash).unwrap(); + drop(session); + + let signature = ::ecdsa::Signature::from_slice(&signature).unwrap(); + + ( + ecdsa::Signature(signature), + PreHash(hashes.verify.finalize()), + ) +} + +#[cfg(all(feature = "ristretto255", feature = "ed25519"))] +fn pkcs_11_eddsa_sign( + sk: ObjectHandle, + message: &Message, +) -> (ed25519::Signature, CachedMessage) { + use cryptoki::mechanism::eddsa::{EddsaParams, EddsaSignatureScheme}; + + let mut message_bytes = Vec::new(); + message + .sign_message() + .for_each(|bytes| message_bytes.extend_from_slice(bytes)); + + let session = SESSION.lock().unwrap(); + let signature = session + .sign( + &Mechanism::Eddsa(EddsaParams::new(EddsaSignatureScheme::Pure)), + sk, + &message_bytes, + ) + .unwrap(); + drop(session); + + let signature = ed25519::Signature::from_slice(&signature).unwrap(); + + (signature, message.to_cached()) +}