Repository: novifinancial/opaque-ke
Pull request #143 (2021-02-17 20:02:30)

Updating transcript computation for 3DH
Mirroring changes from https://github.com/cfrg/draft-irtf-cfrg-opaque/pull/147


Patch:
diff --git a/Cargo.lock b/Cargo.lock
index 795ca48..7d3e52e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -573,7 +573,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
 
 [[package]]
 name = "opaque-ke"
-version = "0.3.1"
+version = "0.4.0-pre.1"
 dependencies = [
  "anyhow",
  "base64",
diff --git a/Cargo.toml b/Cargo.toml
index 8c36cd9..3688efe 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "opaque-ke"
-version = "0.3.1"
+version = "0.4.0-pre.1"
 repository = "https://github.com/novifinancial/opaque-ke"
 keywords = ["cryptography", "crypto", "opaque", "passwords", "authentication"]
 description = "An implementation of the OPAQUE password-authenticated key exchange protocol"
diff --git a/src/group.rs b/src/group.rs
index 3f077d1..34f8e2c 100644
--- a/src/group.rs
+++ b/src/group.rs
@@ -25,7 +25,7 @@ use zeroize::Zeroize;
 
 /// A prime-order subgroup of a base field (EC, prime-order field ...). This
 /// subgroup is noted additively — as in the draft RFC — in this trait.
-pub trait Group: Sized + for<'a> Mul<&'a <Self as Group>::Scalar, Output = Self> {
+pub trait Group: Copy + Sized + for<'a> Mul<&'a <Self as Group>::Scalar, Output = Self> {
     /// The type of base field scalars
     type Scalar: Zeroize + Clone;
     /// The byte length necessary to represent scalars
diff --git a/src/key_exchange/tripledh.rs b/src/key_exchange/tripledh.rs
index 30a7b32..d12d1eb 100644
--- a/src/key_exchange/tripledh.rs
+++ b/src/key_exchange/tripledh.rs
@@ -30,7 +30,7 @@ use std::convert::TryFrom;
 const KEY_LEN: usize = 32;
 pub(crate) type NonceLen = U32;
 
-static STR_3DH: &[u8] = b"3DH keys";
+static STR_3DH: &[u8] = b"3DH";
 static STR_CLIENT_MAC: &[u8] = b"client mac";
 static STR_HANDSHAKE_SECRET: &[u8] = b"handshake secret";
 static STR_SERVER_MAC: &[u8] = b"server mac";
@@ -95,6 +95,22 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
             GenericArray::clone_from_slice(&server_nonce_bytes)
         };
 
+        let server_transcript = [
+            &l2_bytes[..],
+            &server_nonce[..],
+            &server_e_kp.public().to_arr(),
+        ]
+        .concat();
+
+        let derivation_transcript = [
+            STR_3DH,
+            &serialize(&id_u, 2),
+            &serialized_credential_request[..],
+            &serialize(&id_s, 2),
+            &server_transcript[..],
+        ]
+        .concat();
+
         let (session_key, km2, ke2, km3) = derive_3dh_keys::<D, G>(
             TripleDHComponents {
                 pk1: ke1_message.client_e_pk.clone(),
@@ -104,10 +120,7 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
                 pk3: client_s_pk,
                 sk3: server_e_kp.private().clone(),
             },
-            &ke1_message.client_nonce,
-            &server_nonce,
-            &id_u,
-            &id_s,
+            &derivation_transcript,
         )?;
 
         // Compute encryption of e_info
@@ -121,14 +134,8 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
             .map(|(&x1, &x2)| x1 ^ x2)
             .collect();
 
-        let transcript2: Vec<u8> = [
-            &serialized_credential_request[..],
-            &l2_bytes[..],
-            &server_nonce[..],
-            &server_e_kp.public().to_arr(),
-            &serialize(&ciphertext, 2),
-        ]
-        .concat();
+        let transcript2: Vec<u8> =
+            [&derivation_transcript[..], &serialize(&ciphertext, 2)].concat();
 
         let mut hasher = D::new();
         hasher.update(&transcript2);
@@ -170,6 +177,21 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
         id_u: Vec<u8>,
         id_s: Vec<u8>,
     ) -> Result<(Vec<u8>, Vec<u8>, Self::KE3Message), ProtocolError> {
+        let server_transcript = [
+            &l2_component[..],
+            &ke2_message.to_bytes_without_info_or_mac(),
+        ]
+        .concat();
+
+        let derivation_transcript = [
+            STR_3DH,
+            &serialize(&id_u, 2),
+            &serialized_credential_request,
+            &serialize(&id_s, 2),
+            &server_transcript[..],
+        ]
+        .concat();
+
         let (session_key, km2, ke2, km3) = derive_3dh_keys::<D, G>(
             TripleDHComponents {
                 pk1: ke2_message.server_e_pk.clone(),
@@ -179,16 +201,12 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
                 pk3: ke2_message.server_e_pk.clone(),
                 sk3: client_s_sk,
             },
-            &ke1_state.client_nonce,
-            &ke2_message.server_nonce,
-            &id_u,
-            &id_s,
+            &derivation_transcript,
         )?;
 
         let transcript: Vec<u8> = [
-            &serialized_credential_request,
-            &l2_component[..],
-            &ke2_message.to_bytes_without_mac(),
+            &derivation_transcript[..],
+            &serialize(&ke2_message.e_info[..], 2),
         ]
         .concat();
 
@@ -370,21 +388,21 @@ impl<HashLen: ArrayLength<u8>> TryFrom<&[u8]> for Ke2State<HashLen> {
 
 impl<HashLen: ArrayLength<u8>> ToBytes for Ke2Message<HashLen> {
     fn to_bytes(&self) -> Vec<u8> {
-        [&self.to_bytes_without_mac(), &self.mac[..]].concat()
-    }
-}
-
-impl<HashLen: ArrayLength<u8>> Ke2Message<HashLen> {
-    fn to_bytes_without_mac(&self) -> Vec<u8> {
         [
-            &self.server_nonce[..],
-            &self.server_e_pk.to_arr(),
+            &self.to_bytes_without_info_or_mac(),
             &serialize(&self.e_info, 2),
+            &self.mac[..],
         ]
         .concat()
     }
 }
 
+impl<HashLen: ArrayLength<u8>> Ke2Message<HashLen> {
+    fn to_bytes_without_info_or_mac(&self) -> Vec<u8> {
+        [&self.server_nonce[..], &self.server_e_pk.to_arr()].concat()
+    }
+}
+
 impl<HashLen: ArrayLength<u8>> TryFrom<&[u8]> for Ke2Message<HashLen> {
     type Error = PakeError;
 
@@ -457,10 +475,7 @@ impl<HashLen: ArrayLength<u8>> TryFrom<&[u8]> for Ke3Message<HashLen> {
 // with some auxiliary metadata, to produce the session key and two MAC keys
 fn derive_3dh_keys<D: Hash, G: Group>(
     dh: TripleDHComponents,
-    client_nonce: &GenericArray<u8, NonceLen>,
-    server_nonce: &GenericArray<u8, NonceLen>,
-    id_u: &[u8],
-    id_s: &[u8],
+    derivation_transcript: &[u8],
 ) -> Result<TripleDHDerivationResult<D>, ProtocolError> {
     let ikm: Vec<u8> = [
         &KeyPair::<G>::diffie_hellman(dh.pk1, dh.sk1)?[..],
@@ -469,18 +484,14 @@ fn derive_3dh_keys<D: Hash, G: Group>(
     ]
     .concat();
 
-    let info: Vec<u8> = [
-        STR_3DH,
-        &serialize(&client_nonce, 2),
-        &serialize(&server_nonce, 2),
-        &serialize(id_u, 2),
-        &serialize(id_s, 2),
-    ]
-    .concat();
-
     let extracted_ikm = Hkdf::<D>::new(None, &ikm);
-    let handshake_secret = derive_secrets::<D>(&extracted_ikm, &STR_HANDSHAKE_SECRET, &info)?;
-    let session_key = derive_secrets::<D>(&extracted_ikm, &STR_SESSION_KEY, &info)?;
+    let handshake_secret = derive_secrets::<D>(
+        &extracted_ikm,
+        &STR_HANDSHAKE_SECRET,
+        &derivation_transcript,
+    )?;
+    let session_key =
+        derive_secrets::<D>(&extracted_ikm, &STR_SESSION_KEY, &derivation_transcript)?;
 
     let km2 = hkdf_expand_label::<D>(
         &handshake_secret,
diff --git a/src/opaque.rs b/src/opaque.rs
index 05077e2..ba9c6fc 100644
--- a/src/opaque.rs
+++ b/src/opaque.rs
@@ -584,7 +584,6 @@ impl<CS: CipherSuite> ClientLogin<CS> {
             ClientLoginFinishParameters::WithIdentifiers(id_u, id_s) => Some((id_u, id_s)),
         };
 
-        let l2_beta_bytes = &l2.beta.to_arr()[..];
         let server_s_pk_bytes = l2.server_s_pk.to_arr().to_vec();
 
         let password_derived_key =
@@ -604,20 +603,16 @@ impl<CS: CipherSuite> ClientLogin<CS> {
                 KeyPair::<CS::Group>::public_from_private(&client_s_sk)
                     .to_arr()
                     .to_vec(),
-                server_s_pk_bytes.clone(),
+                server_s_pk_bytes,
             ),
             Some((id_u, id_s)) => (id_u, id_s),
         };
 
-        let l2_bytes: Vec<u8> = [
-            l2_beta_bytes,
-            &serialize(&server_s_pk_bytes, 2),
-            &l2.envelope.to_bytes(),
-        ]
-        .concat();
+        let credential_response_component =
+            CredentialResponse::<CS>::serialize_without_ke(&l2.beta, &l2.server_s_pk, &l2.envelope);
 
         let (confidential_info, session_key, ke3_message) = CS::KeyExchange::generate_ke3(
-            l2_bytes,
+            credential_response_component,
             l2.ke2_message,
             &self.ke1_state,
             &self.serialized_credential_request,


Test patch:
diff --git a/src/tests/full_test.rs b/src/tests/full_test.rs
index 1c448f7..2b2be31 100644
--- a/src/tests/full_test.rs
+++ b/src/tests/full_test.rs
@@ -68,37 +68,37 @@ pub struct TestVectorParameters {
 
 static TEST_VECTOR: &str = r#"
 {
-    "client_s_pk": "2c3247e1d7fcf2bef09a0c6e771c44fe922f36deb5726998c89f7816323bc373",
-    "client_s_sk": "d7dd5397912dc1dce64a26b8d24bee59b7929b15a6b9769ad6357913a13e7f09",
-    "client_e_pk": "3431e8f57ce0c1ae9da2b4f37a2f877a64b244a86bc1384ba70a9c39985b3729",
-    "client_e_sk": "8410c0520fd2a37775e54000d9abb5a84825d37649827d8f2721dd655cd64c0c",
-    "server_s_pk": "6a55f77ffb17741d5dfd404ef7079ef276cb2114a76f507c0ae7172847da647a",
-    "server_s_sk": "f4433f94dea3f4bf877ab760566efa36340e34d516dc4462b2ad5b9600157a06",
-    "server_e_pk": "32d56c7e3b882b9ac1a4e38d60456c4942ec6b6aceed91d069ead967a825df74",
-    "server_e_sk": "256f9cdddb2c4bed42866e37d5dff019b4a9584b7486e5683d52b56842d82b0d",
+    "client_s_pk": "88a330a73dd4b166307c5efc6e7a0a30d9b36ff6cc13cdb7f4e9adb9308a7637",
+    "client_s_sk": "a3f2becb1604e524d414d75e34d69b1984403715f4fb64dbecdf94ee67c56007",
+    "client_e_pk": "782e5d1fba5fc5127f56d026a0796320670260a58007b0c7b8e2c4591a6c2441",
+    "client_e_sk": "117dbea41b3a73f38af6ec5e94f4addcb157fafd01db5640a782cbd205af1c01",
+    "server_s_pk": "ce16950ab0939c9827479b7f7c94662f2aad8149a47260b4e9a36f3013472924",
+    "server_s_sk": "7731db9c827d8d2736dcec7900e635d05b8eb024ba03398be7b3e14380983a07",
+    "server_e_pk": "f8f1a6de4b3708baec68ea94f47b9577f3d36458e82e36f431ba8ce77e2d2e11",
+    "server_e_sk": "f7b415289b0e0f043465d9bf5d6f93393b042aa6f45eb74c1ed29e63484dd705",
     "id_u": "696455",
     "id_s": "696453",
     "password": "70617373776f7264",
-    "blinding_factor": "c0937fddc5b7a8cbb76301cbe588268d52a9efe6a205af21a0a12b1fadf3a008",
-    "oprf_key": "f386e8710c12c870a0ec74f09364811142050a5266ca53d36c11e369343a5e09",
-    "envelope_nonce": "2338be69855ad2a280ab5ed67fb04cd96691841241dbb4873ca776adc60d1c93",
-    "client_nonce": "09f2721189a82d90e891d346aa9be462e003cc6b6824a55352da7df685eca5bf",
-    "server_nonce": "5c11e9abe0d5d677dd1a66cd1c8e9baa1f1a44c7554ffe61978b100e657f79f4",
+    "blinding_factor": "7691a5530384fae7ce5d118b770900b38d523d0ea62f7328410718cdc26a5707",
+    "oprf_key": "c66dc3992fbcbb969647fe94390db974c4a5c6c46457373f28385c8898e9fb07",
+    "envelope_nonce": "a2c8292a03df900668a81badb1003c80bacbb9a4776228997a264d58e7b2a2c6",
+    "client_nonce": "d54b0fb476f66a3c5ac93647c462590431594e63f8b21aeb371cb0f835841a40",
+    "server_nonce": "458b1ca0d48d3d04e6a21127db53ae4208cd5c6ae0aa6b0e2db3146022725c45",
     "info1": "696e666f31",
     "einfo2": "65696e666f32",
-    "registration_request": "58e629f68bd59f1d5fcee531a5afeedb4e07d2c6aed98d15cab686d063f2f46e",
-    "registration_response": "a2227384ed34860b7d879d617f7daa802b6a878eaa5eab33669400f30ad0431d00206a55f77ffb17741d5dfd404ef7079ef276cb2114a76f507c0ae7172847da647a",
-    "registration_upload": "00202c3247e1d7fcf2bef09a0c6e771c44fe922f36deb5726998c89f7816323bc373022338be69855ad2a280ab5ed67fb04cd96691841241dbb4873ca776adc60d1c930022576b449b09abeb68d5f6c56082b0c2f560c636bff4f0af3b44b6377045201b545598d319af3122041f06e3ab86371bff6c0727557c77d20efeb9a0b9f24573e3646735eeebed45e741d11d0120741af27b04c2716eb6bdfe950daff937cfcae8569e",
-    "credential_request": "58e629f68bd59f1d5fcee531a5afeedb4e07d2c6aed98d15cab686d063f2f46e09f2721189a82d90e891d346aa9be462e003cc6b6824a55352da7df685eca5bf0005696e666f313431e8f57ce0c1ae9da2b4f37a2f877a64b244a86bc1384ba70a9c39985b3729",
-    "credential_response": "a2227384ed34860b7d879d617f7daa802b6a878eaa5eab33669400f30ad0431d00206a55f77ffb17741d5dfd404ef7079ef276cb2114a76f507c0ae7172847da647a022338be69855ad2a280ab5ed67fb04cd96691841241dbb4873ca776adc60d1c930022576b449b09abeb68d5f6c56082b0c2f560c636bff4f0af3b44b6377045201b545598d319af3122041f06e3ab86371bff6c0727557c77d20efeb9a0b9f24573e3646735eeebed45e741d11d0120741af27b04c2716eb6bdfe950daff937cfcae8569e5c11e9abe0d5d677dd1a66cd1c8e9baa1f1a44c7554ffe61978b100e657f79f432d56c7e3b882b9ac1a4e38d60456c4942ec6b6aceed91d069ead967a825df740006a0c5112e94c86671fd294468658b8a78375f89fca9fb7c3ee1f63871360d5237e57da81719849a8dbccb974742333a1aed034d63d0bdba0beacfe30196912d561e99c1e79ccf",
-    "credential_finalization": "b1fad859f343f1a15df14bd7782db9ab6ee4493225a470152e53b3b7601dc954bc80d7b7dadfe70f743b1ab1552a054e7a9d192399ea42073a1d1c5839aabfc2",
-    "client_registration_state": "c0937fddc5b7a8cbb76301cbe588268d52a9efe6a205af21a0a12b1fadf3a00870617373776f7264",
-    "client_login_state": "c0937fddc5b7a8cbb76301cbe588268d52a9efe6a205af21a0a12b1fadf3a008006758e629f68bd59f1d5fcee531a5afeedb4e07d2c6aed98d15cab686d063f2f46e09f2721189a82d90e891d346aa9be462e003cc6b6824a55352da7df685eca5bf0005696e666f313431e8f57ce0c1ae9da2b4f37a2f877a64b244a86bc1384ba70a9c39985b372900408410c0520fd2a37775e54000d9abb5a84825d37649827d8f2721dd655cd64c0c09f2721189a82d90e891d346aa9be462e003cc6b6824a55352da7df685eca5bf70617373776f7264",
-    "server_registration_state": "f386e8710c12c870a0ec74f09364811142050a5266ca53d36c11e369343a5e09",
-    "server_login_state": "761333eea593c396021c3930fb36cf97aad7c7ea00f1ff983e4df9ca002885017161427303fddb4508c9136a67612e01b673ed88b1de49ed6628d0a77e43c590595f53bf0b0766c165b876173c509efc982868d3860df5dad3f0753477ec9bdd103b71dab9540537f2b10964da82032a6339da6d663a409f4e8e5dea03e3653bb6202f265ed814df39f446486197e1c6091ec6b74200f18df5eef59813ff7f245d69b34e8843be496630921601ab784b1f3ccbfe2ff014ea132199c5c76deda7",
-    "password_file": "f386e8710c12c870a0ec74f09364811142050a5266ca53d36c11e369343a5e092c3247e1d7fcf2bef09a0c6e771c44fe922f36deb5726998c89f7816323bc373022338be69855ad2a280ab5ed67fb04cd96691841241dbb4873ca776adc60d1c930022576b449b09abeb68d5f6c56082b0c2f560c636bff4f0af3b44b6377045201b545598d319af3122041f06e3ab86371bff6c0727557c77d20efeb9a0b9f24573e3646735eeebed45e741d11d0120741af27b04c2716eb6bdfe950daff937cfcae8569e",
-    "export_key": "96b95891f06c7f02ab9c508f30e1a82ddea25e2f4fc4ffdafeb199ee65e24e418b2648a201e889eaf84301a1a8d0c3b7fea0ec8d4611686e6daee12430f60c05",
-    "session_key": "b6202f265ed814df39f446486197e1c6091ec6b74200f18df5eef59813ff7f245d69b34e8843be496630921601ab784b1f3ccbfe2ff014ea132199c5c76deda7"
+    "registration_request": "86115e7b95618fbd5015765d2f212494d5d68e770b96da153d0bb9a00bc5f54d",
+    "registration_response": "42538263dcf753f1255c85eb66b558c32bd593f3787d284eb126787393d586330020ce16950ab0939c9827479b7f7c94662f2aad8149a47260b4e9a36f3013472924",
+    "registration_upload": "002088a330a73dd4b166307c5efc6e7a0a30d9b36ff6cc13cdb7f4e9adb9308a763702a2c8292a03df900668a81badb1003c80bacbb9a4776228997a264d58e7b2a2c60022fe0b9953fd5e784a3f47ed9b1ea1a33a39231dff88e930edebd1d437b850972a2a1c51bcf77483a4315eeb5db1cb61e7dbd874194f893daaf32006de7502a0e33860cadcfec6e038662e8484e9f488efa1f336bf10a125409d20bce6a6cb22a70d8e",
+    "credential_request": "86115e7b95618fbd5015765d2f212494d5d68e770b96da153d0bb9a00bc5f54dd54b0fb476f66a3c5ac93647c462590431594e63f8b21aeb371cb0f835841a400005696e666f31782e5d1fba5fc5127f56d026a0796320670260a58007b0c7b8e2c4591a6c2441",
+    "credential_response": "42538263dcf753f1255c85eb66b558c32bd593f3787d284eb126787393d586330020ce16950ab0939c9827479b7f7c94662f2aad8149a47260b4e9a36f301347292402a2c8292a03df900668a81badb1003c80bacbb9a4776228997a264d58e7b2a2c60022fe0b9953fd5e784a3f47ed9b1ea1a33a39231dff88e930edebd1d437b850972a2a1c51bcf77483a4315eeb5db1cb61e7dbd874194f893daaf32006de7502a0e33860cadcfec6e038662e8484e9f488efa1f336bf10a125409d20bce6a6cb22a70d8e458b1ca0d48d3d04e6a21127db53ae4208cd5c6ae0aa6b0e2db3146022725c45f8f1a6de4b3708baec68ea94f47b9577f3d36458e82e36f431ba8ce77e2d2e110006ded053c5cfa292afbc005f84f965ca179800aba13974d7c96ae5c386207bc631dc9f70030ebdbf19503e40d45944d0bdc7cb01d3d44701a582d12a2a807648b6763b7c8b7ca4",
+    "credential_finalization": "afa7239945acc304e0c40a6a9e594d7978aaff24565a44fcb5bc62b577211e854be9cb3f55261f1e34a8ebac192f98625ec59d54ce5c64346e1f9afa18facda3",
+    "client_registration_state": "7691a5530384fae7ce5d118b770900b38d523d0ea62f7328410718cdc26a570770617373776f7264",
+    "client_login_state": "7691a5530384fae7ce5d118b770900b38d523d0ea62f7328410718cdc26a5707006786115e7b95618fbd5015765d2f212494d5d68e770b96da153d0bb9a00bc5f54dd54b0fb476f66a3c5ac93647c462590431594e63f8b21aeb371cb0f835841a400005696e666f31782e5d1fba5fc5127f56d026a0796320670260a58007b0c7b8e2c4591a6c24410040117dbea41b3a73f38af6ec5e94f4addcb157fafd01db5640a782cbd205af1c01d54b0fb476f66a3c5ac93647c462590431594e63f8b21aeb371cb0f835841a4070617373776f7264",
+    "server_registration_state": "c66dc3992fbcbb969647fe94390db974c4a5c6c46457373f28385c8898e9fb07",
+    "server_login_state": "e05749068700eec7d07c4e2e6e5e63336e41cc1f3c0ddf3c635b46c6d53deffed876378fc1eb32dcfd1d7e35a63c52e638c0b8da7977269143be95f88024ab0735fac1d0b2dce50a5c19e6500c73aa055fabff9f548720dd1cacaa21566b7afde7a9b97fbc4da0482aaf2063c627926bbeeab98356b151881973460c4fad531f13721b6f004e8f73c8d2010df34700717c74350c9275fb29991f6296c85f7d1dd931f784f47ccd6bc2866423cc200fb3872a1cb29a47088b6f6750432e3f6c72",
+    "password_file": "c66dc3992fbcbb969647fe94390db974c4a5c6c46457373f28385c8898e9fb0788a330a73dd4b166307c5efc6e7a0a30d9b36ff6cc13cdb7f4e9adb9308a763702a2c8292a03df900668a81badb1003c80bacbb9a4776228997a264d58e7b2a2c60022fe0b9953fd5e784a3f47ed9b1ea1a33a39231dff88e930edebd1d437b850972a2a1c51bcf77483a4315eeb5db1cb61e7dbd874194f893daaf32006de7502a0e33860cadcfec6e038662e8484e9f488efa1f336bf10a125409d20bce6a6cb22a70d8e",
+    "export_key": "aa2cdeaa4281a834bda57d4fff88702cba1a22d556790e812bdfd408162ba3b6a17305c576ea9549523592470ef3047aa8ace4be71f92d71f0b5cc6465dfc9e4",
+    "session_key": "13721b6f004e8f73c8d2010df34700717c74350c9275fb29991f6296c85f7d1dd931f784f47ccd6bc2866423cc200fb3872a1cb29a47088b6f6750432e3f6c72"
 }
 "#;
 
diff --git a/src/tests/opaque_test_vectors.rs b/src/tests/opaque_test_vectors.rs
index 7c1f741..eb2c9e6 100644
--- a/src/tests/opaque_test_vectors.rs
+++ b/src/tests/opaque_test_vectors.rs
@@ -67,93 +67,93 @@ EnvelopeMode: 01
 OPRF: 0001
 SlowHash: Identity
 Hash: SHA512
-server_nonce: a4997137a8fa0d4baf7052a499bf877057f9404e03c889d641a0d7c
-807b6a518
+server_nonce: 0ef5dc5c619b5a58eecb1c8fba63ae5e723e059552bb067bc460efd
+910ff58af
 oprf_key: 5ed895206bfc53316d307b23e46ecc6623afb3086da74189a416012be03
 7e50b
 password: 436f7272656374486f72736542617474657279537461706c65
 blind_login: ed8366feb6b1d05d1f46acb727061e43aadfafe9c10e5a64e7518d63
 e3263503
-server_private_keyshare: 31587dff30b8001d9d43584decc22e358fa7f9d6e606
-29fb1223081c3bae7103
-client_nonce: 75a1ad27ab77578bc08b44c4318f09b31d53145c9ba3b42abf0ea08
-a781277a6
+server_private_keyshare: ac56b748ee205ea817e823697857b4b40ad758328074
+6897e9eb9192636db704
+client_nonce: d0298cebb277efb5af53932af6bb10180b2ac35e5f69b55ad4c4191
+4d579add6
 server_info: 6772656574696e677320616c696365
 client_info: 68656c6c6f20626f62
-client_private_keyshare: fbbf4ad24119f08a35bf999f8ae0c779ed7b3e266bf3
-3f793f6bf9ebf4578005
-envelope_nonce: 6c6bb9021b9833c788dd25994d3ce7f3811338744fd6dc556e037
-585783444c0
-server_keyshare: 82be40ef93bf7c6edd43d4ed9f52fa19827649b819de39c52a22
-43e985b75d62
+client_private_keyshare: 46244633cd475d25f3db6a6eb8304e2fe02e2a006805
+3efee984e49b7f4ff60e
+envelope_nonce: 9a87511fa84547961a5467f96caba559fb15f3a203146e4041bb4
+b2179e83594
+server_keyshare: a83ddbb1abf9e8e8c73fe39d3c18da434dd3f6fd52f01279028f
+086126893d7f
 blind_registration: c604c785ada70d77a5256ae21767de8c3304115237d262134
 f5e46e512cf8e03
-client_public_key: b2d1b10f3741a8efef3139f4d2889f2b11f776b79b9aa2c3ef
-caba4f1c4ae861
-client_private_key: f0f56cfb488649fe28691dd9aa5dc9ff4c0e6028075baa3c5
-615398a2cb12304
-client_keyshare: 484e47e31b3132f4ee512e41805a1690891111a7b885bc526198
-22c14cabf360
-server_public_key: 5442a6f57333a332b4c6f07308f6fa846bde3ed27425820cdc
-eeeb935924a903
-server_private_key: d63d709e3a739a128929a9f289ff263fdcbc457f2f47f7c43
-ccafbbfee72290c
-auth_key: 22198da4ad73b1d35cd8bb875e64ce1a9fc2edeb073d760e114d1d7a2f8
-6d47411caf1787907e2ff96cd3190b14d101101d74cff234259d9f19a18f2cfe29d0b
-server_mac_key: 9de28e2f7107afe266570934c033dd6a403fb2b09a9f1a1357a81
-9fb072d25e6651626638d77bd7f0adf4b2b715d0a0bee2ac531fd0f7da699aba6e9ed
-717466
-envelope: 016c6bb9021b9833c788dd25994d3ce7f3811338744fd6dc556e0375857
-83444c00022e9b28440a1dc99cca7513e8eb754d427caf8515642b45a92c73838c043
-fc316deeb83deface81589bc8e5c2c767b5ab79218834fbf4fa4f87cf23775aa54633
-ed75665cd88f451e044cac1b282d890269476d1ac18ff9a4c0cb832e1143ffa7d447a
-prk: 732303f65e76c39f30876aec31af1f5bcd8861626c922baa2e842209c7d5bf2e
-024912db2d6cac00b1260c437d34ec588a664a55fc7a0a40251915d2b15d8ec9
-client_mac_key: 1536168d48218d08dcbed3438e897d98eff566894240d8d136be0
-4ba46b2c788883fd165ce7614c52a6a9c926bf55d249e6c29bc4a23d5a1775ad294a7
-858922
-pseudorandom_pad: e99274b5cd27d14aeeaf16e7aa8d7e7a03071d58229c5dc96d0
-46ed57a761ddccdbc
-handshake_encrypt_key: c646def7a8ca75282ac1a0ad15630834cba2772837d7a3
-a26d00b36923e55b3f5d065679c715e4c799654f261c865f1a55bc94cabc29a6e2e72
-296dfc494a984
-handshake_secret: cc887e128c28064106d4101ac3de633e9096e170f2c4a9913d3
-50f306274b1665a5b251f761672c12db4c403a615c22cee96adb3539fa62662a17f2e
-18cd5fed
+client_public_key: dec9d1223019c1aaaaac7397355016f8ea099b949fb5bcf5de
+3b9b0b1b298301
+client_private_key: f141e91e7006c583b615261f9d13e1807d811f6d108bbbab8
+f44ab092c8cb206
+client_keyshare: e00213e806c74d73509c68860d75620d09665f1a5030e485ff85
+172d8ea54f54
+server_public_key: 3881fefba6d687143ecaaec0d8658eb7fa247555f05fedb075
+7866d49ea9883e
+server_private_key: bc778d1c50714f8f2e7d1378650b5aaf8d61c003f07081ad3
+93317506168c004
+auth_key: 974ae6360db0593766490b4a95592552ae08fd3e611af028d82be4bde95
+b39e2c5a68818fa5ca6be687fb7ec5f26d7c178fd81f7b61056959e88d339a13f560d
+server_mac_key: cc7ee1c4d12a2693dc6358b91a1a97bb4e0bffab50bd19aa4a169
+9584ed540baea9fa95f2139a0c9aa4d763be5eb5d7984acfecec65363f690c8058e09
+5e96f7
+envelope: 019a87511fa84547961a5467f96caba559fb15f3a203146e4041bb4b217
+9e83594002262a8d608d300886f5a2bd8b9abe76da19af847755fda0541a1729bfd57
+e94fbd79be8c03267be7f578b1a017eaff6f23a667f378ac41c516591d04681db9556
+09ac4a200b398d0ea88faaa4a74f0291f462119a5cd51491c0935171d75a6421c4b62
+prk: c2b586d349c6b573c59d85656958218a187862bd8ae2e06bf3e1e5500182b87d
+44e5bb443e6593076934730f9a38a13c5d79f037d9e3e351dbc57f943ac23f29
+client_mac_key: b2b2cb96dd005f8b4f52e3bcd9a8258ec39503b371d882ff99e08
+7f9860aebfadab51fef9c7edb64318fe3b1bda1250bfd77edd98e8e18a7350ad09b8a
+08c45c
+pseudorandom_pad: 628827493a1ef8699fa86eac8df8f0b27b783af440b715ca1ad
+914b9fce06331cbb8
+handshake_encrypt_key: e5a1bc0dffdf22ba837cef7df4db164acc56eab7ba6796
+e1a7caab9fce21485560a20f64b217f1c0ebea53b1bde1006860fa9907ca3b8ff1a48
+0803664c30458
+handshake_secret: 994ae04565986a5b3783488b3e299670a69f55274a6344d6afe
+665907dd66750f594e59b40effb99806630766a74bd5bde6a45d26fc4f017d1b73a41
+4f523502
 registration_response: 1867301bcc67bdf8e640b7d6edcbe2a65488446417b50d
-30cdba66ccb379e57200205442a6f57333a332b4c6f07308f6fa846bde3ed27425820
-cdceeeb935924a903
-export_key: 6ca2c344763e5bc9e3d2bbfe3d982b826b709da597e28e85f9594ec54
-2a20c697d55de277ccce1d1af7c48ab7fea1467ac1e3a99c71dcf6326a909d280bd2f
-6f
-registration_upload: 0020b2d1b10f3741a8efef3139f4d2889f2b11f776b79b9a
-a2c3efcaba4f1c4ae861016c6bb9021b9833c788dd25994d3ce7f3811338744fd6dc5
-56e037585783444c00022e9b28440a1dc99cca7513e8eb754d427caf8515642b45a92
-c73838c043fc316deeb83deface81589bc8e5c2c767b5ab79218834fbf4fa4f87cf23
-775aa54633ed75665cd88f451e044cac1b282d890269476d1ac18ff9a4c0cb832e114
-3ffa7d447a
+30cdba66ccb379e57200203881fefba6d687143ecaaec0d8658eb7fa247555f05fedb
+0757866d49ea9883e
+export_key: 93c48fa650a6c2b9fddc27c9697be2f259b0083515b650a7b1520af92
+e631c85946fb811b22d636d137ef97380bf9322606b5d97452ca262e9136284d23467
+76
+registration_upload: 0020dec9d1223019c1aaaaac7397355016f8ea099b949fb5
+bcf5de3b9b0b1b298301019a87511fa84547961a5467f96caba559fb15f3a203146e4
+041bb4b2179e83594002262a8d608d300886f5a2bd8b9abe76da19af847755fda0541
+a1729bfd57e94fbd79be8c03267be7f578b1a017eaff6f23a667f378ac41c516591d0
+4681db955609ac4a200b398d0ea88faaa4a74f0291f462119a5cd51491c0935171d75
+a6421c4b62
 registration_request: 241b621c417c0705b5ea7a8b7cdd5039fd61e6b63effe2a
 44418164c4d49003e
-session_key: ee9f1ef224d498858f6c9b3a121016a38bad7816055c452b1c7edf3d
-d439c42a4cc78cbd672e985a20910df14f8f1af4ce5793303ffe6954ff5f1a264e3fd
-515
-KE3: e771daf28bc5e8068dead67c3db19f9ad03ee919e52f6c7a6e79cf1085bd7448
-1e76512c77f37762578eb2faff8fe98e4185ca2d01957216c556d33a6fba3028
+session_key: f058bc490684af7833743104168cabe0357ffb648fd0104aae507d59
+b9dfdde1a26ab0dc6f7d03a2ea4feb2d2aea04bfc9a1fbd89e309362082c13edc1598
+f97
+KE3: 290e6fd07a3c225810e88234402879e0d6ed0791f8a3446cf80ac4fbd7e23afc
+3b539d926edc9983edacee08c285e82c46b48cb055c983d3cc2c629586dfe99d
 KE2: e83812f06568d57b8cdfdcc90fe91454e21bd25dd2a1c32dd1599a2e4a4b6c35
-00205442a6f57333a332b4c6f07308f6fa846bde3ed27425820cdceeeb935924a9030
-16c6bb9021b9833c788dd25994d3ce7f3811338744fd6dc556e037585783444c00022
-e9b28440a1dc99cca7513e8eb754d427caf8515642b45a92c73838c043fc316deeb83
-deface81589bc8e5c2c767b5ab79218834fbf4fa4f87cf23775aa54633ed75665cd88
-f451e044cac1b282d890269476d1ac18ff9a4c0cb832e1143ffa7d447aa4997137a8f
-a0d4baf7052a499bf877057f9404e03c889d641a0d7c807b6a51882be40ef93bf7c6e
-dd43d4ed9f52fa19827649b819de39c52a2243e985b75d62000f13aed85ae30aee2f8
-9ac5e1c5dd53609b890267ef2d765bb56000bc704c2ba4e4256107befee6655cdb084
-64e6c75d8b251642e0d721b3fce38f245568b50e7f6c98825d54cc1a26d6eafadcc1d
-344
+00203881fefba6d687143ecaaec0d8658eb7fa247555f05fedb0757866d49ea9883e0
+19a87511fa84547961a5467f96caba559fb15f3a203146e4041bb4b2179e835940022
+62a8d608d300886f5a2bd8b9abe76da19af847755fda0541a1729bfd57e94fbd79be8
+c03267be7f578b1a017eaff6f23a667f378ac41c516591d04681db955609ac4a200b3
+98d0ea88faaa4a74f0291f462119a5cd51491c0935171d75a6421c4b620ef5dc5c619
+b5a58eecb1c8fba63ae5e723e059552bb067bc460efd910ff58afa83ddbb1abf9e8e8
+c73fe39d3c18da434dd3f6fd52f01279028f086126893d7f000ffa4ba765e84dd8080
+c061267b2604326ed135cef21f36407f3bc15609f9693c8eedbe73f2bf8c22c84b295
+b3181b074ced2cc9f66a4776401336b7b43d50bed3188593e9e8fb310ff9e6660e44e
+d2f
 KE1: b68e0e356f8490fa9c3bed952e16cc02db21eda686b3c484f3d9d912caa41f76
-75a1ad27ab77578bc08b44c4318f09b31d53145c9ba3b42abf0ea08a781277a600096
-8656c6c6f20626f62484e47e31b3132f4ee512e41805a1690891111a7b885bc526198
-22c14cabf360
+d0298cebb277efb5af53932af6bb10180b2ac35e5f69b55ad4c41914d579add600096
+8656c6c6f20626f62e00213e806c74d73509c68860d75620d09665f1a5030e485ff85
+172d8ea54f54
 "#,
     r#"
 Group: ristretto255
@@ -161,97 +161,97 @@ EnvelopeMode: 02
 OPRF: 0001
 SlowHash: Identity
 Hash: SHA512
-server_nonce: 0f3a6da8b667bc7a383c987586bee749c5f2787691baca68757e78b
-6128b0a0f
+server_nonce: 2bf0d250ba1b4ee89929fcb6f91c521551ad52cdd6ef1ab438cc024
+e94d6a8c9
 oprf_key: 89c61a42c8191a5ca41f2fe959843d333bcf43173b7de4c5c119e0e0d8b
 0e707
 password: 436f7272656374486f72736542617474657279537461706c65
 blind_login: e6d0f1d89ad552e383d6c6f4e8598cc3037d6e274d22da3089e7afbd
 4171ea02
-server_private_keyshare: 70c944dcb7f4dddde168ecb48dd9488c62b6fc7e9bb4
-2a16d291afca9dd25b07
-client_nonce: 480917b09c6720680b4a7a0ba9f54b69d870f640a4a7994b47ad07d
-1a95c984f
+server_private_keyshare: 7447dd29f57e61d9a67e25cf840b359b605e54eb8bc6
+67fcd7fe18fdb47a0100
+client_nonce: c1162f56eb58419746bb66e1113d401edb0302d894ee962f7e79ae1
+2821bdefd
 server_info: 6772656574696e677320616c696365
-server_identity: 5442a6f57333a332b4c6f07308f6fa846bde3ed27425820cdcee
-eb935924a903
+server_identity: 3881fefba6d687143ecaaec0d8658eb7fa247555f05fedb07578
+66d49ea9883e
 client_info: 68656c6c6f20626f62
-client_private_keyshare: a4ba6cb7e16ab76eccdb4c0b9261eedd426d7863f00b
-fc4a0e09476d3121e70c
-envelope_nonce: e38fb444afe3df13ae05e6876d10eca7661196375518eb66d7dee
-b8cfb42d13f
-server_public_key: 5442a6f57333a332b4c6f07308f6fa846bde3ed27425820cdc
-eeeb935924a903
-client_identity: b2d1b10f3741a8efef3139f4d2889f2b11f776b79b9aa2c3efca
-ba4f1c4ae861
+client_private_keyshare: b08950a66fc7f2845f3c0e8f6027a8cd843103c560a2
+0e8390457c9a705d1304
+envelope_nonce: 6757226024757abf5c42c9d4451a31c90317bcf54741bb9d9e426
+41aab0d0fbd
+server_public_key: 3881fefba6d687143ecaaec0d8658eb7fa247555f05fedb075
+7866d49ea9883e
+client_identity: dec9d1223019c1aaaaac7397355016f8ea099b949fb5bcf5de3b
+9b0b1b298301
 blind_registration: 019cbd1d7420292528f8cdd62f339fdabb602f04a95dac9db
 cec831b8c681a09
-client_public_key: b2d1b10f3741a8efef3139f4d2889f2b11f776b79b9aa2c3ef
-caba4f1c4ae861
-client_private_key: f0f56cfb488649fe28691dd9aa5dc9ff4c0e6028075baa3c5
-615398a2cb12304
-client_keyshare: 4ae7d50bb80cc8f5034d36c1c27edc30caca0983677a941bc0ac
-e5e10b18300a
-server_keyshare: a2e9e0809b270a1d5c8208f3498a3188538265e6a9e6b274cb38
-c4c5d9b1792d
-server_private_key: d63d709e3a739a128929a9f289ff263fdcbc457f2f47f7c43
-ccafbbfee72290c
-auth_key: 4c7c0ae950ad7e9c518266f953d4a01bd2232695f92fb028aa6c124996e
-31a205f621305fd4997edf8a5fce04a51252ba8430227c134b81d7093a58e01c70752
-server_mac_key: 974bde939ef1d30ba29f9ec2addcaff1eeb105a1f534e04113f9f
-0b5c3b9a0797e3fa5f7006e63dfb2b0ce74d002bd1161767c361507bfb1fa0fed5063
-1cdcb7
-envelope: 02e38fb444afe3df13ae05e6876d10eca7661196375518eb66d7deeb8cf
-b42d13f00227ed4654d4452340f26c6304dceeeb1fddb142fcd91b3b26ecd566d7688
-095f9478a721e5a592be9dd3bda76ed97421819aca4a30752813223d33bc7ea443be9
-76754605116278c7fffda4de142674ed154f540bd3285080637eb4b929e1378336b11
-prk: e3bb74ca5f88a95571578e921489e1b6119b438e4efce6e955ae9b6453f24aa4
-e3a34fa22bc5f470cfc134ca0784a9cd7df64be46ff3b325fc19f4009979bf2e
-client_mac_key: 1c55ecba64d98dc2db8f45faa72b8fdd63cad8677b8665cc575cf
-8ad36ef38ec63c9dfc5552007573215983f55d8f5cfa1651da8417e3f27094dde5254
-7f5b89
-pseudorandom_pad: 7ef495b828a97c896f381824d3371ba012eb63c3f19bb535676
-a3b63b18373255ba3
-handshake_encrypt_key: 0852fb826109073be6e7c065b6e2d1f872c16f9977c177
-cd2f945b26bb933fe6252f226f40483f7aa52f545f801d1e4430f30f80fd42070494e
-a77fdcecd6595
-handshake_secret: bfd3bfbe451520880975d0e568cbd3b5155b23c02de504fccb9
-dd5a8195266cd94d49d040530b3d6b0a585d542eb24da708a2b6f6dc34dee4652d0c1
-c62c4e59
+client_public_key: dec9d1223019c1aaaaac7397355016f8ea099b949fb5bcf5de
+3b9b0b1b298301
+client_private_key: f141e91e7006c583b615261f9d13e1807d811f6d108bbbab8
+f44ab092c8cb206
+client_keyshare: 9a5fd96f24fea1d99183cfdbaf559a5eb8083ebba2b066bc5d1e
+b511896a5417
+server_keyshare: 1a6074e0cc3d156865ebecbe371777078d7eccd6ceddae09bec2
+65d77f3d0301
+server_private_key: bc778d1c50714f8f2e7d1378650b5aaf8d61c003f07081ad3
+93317506168c004
+auth_key: 8c66139db274252b21b83791f53883406d057b19f75637f9d891d1d982d
+ceab86549900fdd3952d3d16ed6c874b15de2229f5d0b6c09e1b42dbb3bb985884e6f
+server_mac_key: 64b39a39691023fceb04e5c13c40d50fc4ca5a71d0315e30e86f9
+116a4c7edc91398745186155e2ceee26f82c48939c24299263eb1c88644a17536196f
+981207
+envelope: 026757226024757abf5c42c9d4451a31c90317bcf54741bb9d9e42641aa
+b0d0fbd0022b82a0432f3d9c24998d3c74e4b824ea7b835067fedb21d21fafec27968
+09853e0d5da9109493ed080c98752f92ecd39353d785a84c63f623920b24f2683f76a
+c44ecd0a289b260507d90773502ef3e3fa03ab2e4a6cc54c15eca358ab8ebfc097cb8
+prk: cfd0673e7df8668da7873319036876c00d3ca13920318352336cd2a6f9a0b6be
+f69a5ad94f42bcf506d7014444fd59b35270131c9383c11199a3cb60c086ffbf
+client_mac_key: 106910daa6f98b40af2b99c6e277be37d57cdee8e623e08c04a91
+ce77817338976bd9d91c70aa094e7132338c0b86312315a2648dd8be36f46dc85066b
+d789fc
+pseudorandom_pad: b80af5731ac7b24f5d50715b6d9dd3b459b57bfef2df0daa415
+54d3dc300a9b2bf5b
+handshake_encrypt_key: 62c52174d46d3ddcb34849d0706b0c08ecbc5b5add858e
+d74d037f6696e2fc8fa772ad8871b104f6cddbc72f4b478ef35cc662c1ae5c303fc03
+92c288ca87a16
+handshake_secret: 5c2dc6c992daa89f2d881a3f0fd56e88a633330134efbe3910f
+e7f7c521f0c98f70439acbb0dd3d3ebba735d26ccbdf92299dc95042c4dbd628d3e89
+83828712
 registration_response: 088ac01ebf5700f0c96bc2988509343cb7e2dd6f0df820
-d0fb807faa11a26f5600205442a6f57333a332b4c6f07308f6fa846bde3ed27425820
-cdceeeb935924a903
-export_key: 0effa605dc47ba4fe565c423b782b8b6697b26ee2ede7059b0e17510d
-f8b11554ce053409671480a56ffbe77b91edc95205c213caeaf9dcb0841790ff834a0
-09
-registration_upload: 0020b2d1b10f3741a8efef3139f4d2889f2b11f776b79b9a
-a2c3efcaba4f1c4ae86102e38fb444afe3df13ae05e6876d10eca7661196375518eb6
-6d7deeb8cfb42d13f00227ed4654d4452340f26c6304dceeeb1fddb142fcd91b3b26e
-cd566d7688095f9478a721e5a592be9dd3bda76ed97421819aca4a30752813223d33b
-c7ea443be976754605116278c7fffda4de142674ed154f540bd3285080637eb4b929e
-1378336b11
+d0fb807faa11a26f5600203881fefba6d687143ecaaec0d8658eb7fa247555f05fedb
+0757866d49ea9883e
+export_key: 12114bfdd23ba4c7c9abedf72cf068f5bf14a6e8c39c28eb536fe46f3
+80fa2276328f15fe89f1147462d84c3114bc734bbbc6acaa240f33d3e230d10c563d1
+8b
+registration_upload: 0020dec9d1223019c1aaaaac7397355016f8ea099b949fb5
+bcf5de3b9b0b1b298301026757226024757abf5c42c9d4451a31c90317bcf54741bb9
+d9e42641aab0d0fbd0022b82a0432f3d9c24998d3c74e4b824ea7b835067fedb21d21
+fafec2796809853e0d5da9109493ed080c98752f92ecd39353d785a84c63f623920b2
+4f2683f76ac44ecd0a289b260507d90773502ef3e3fa03ab2e4a6cc54c15eca358ab8
+ebfc097cb8
 registration_request: c8d2e9ba503bf3f8821226653314427edb1ec8a3ecc94a5
 dfbbe33d59d07b645
-session_key: 8dc21ff264f2774de95955d35544ba314e92d07f4a3b32c89ead5e70
-c83ac4c0221deadd34ed11d43fc4d3651aec612d696c63979c96bf1ddd1ee44da5d0c
-d68
-KE3: c178e45ed9b314653685cdbf5f7730e3e40f8652ceb9b10f47d1c784fdd75dd1
-07c4ae3f7683de5a692359178c8f13f41a043fc1dcfc14b1fb7cb411514efc6c
+session_key: 818d3e379a3ffef7b2707ca760d4b47c91daaa1d67131305116318bf
+43266da203b890129a9117da5e1214c537989c3b91cc71549280b55d27e9594e80856
+eba
+KE3: 3944b13ec8812a9fc9206b215afd6b8f81af4ba85fee2d3ac9c55e088d18f5a0
+126c423ac44a1992703d4c68b9784abf2862f80726e1c5d0677e61453f72a108
 KE2: 5079b16709b195b3b63257b419efb752bd0603170160fa72b828ce9ff9209c0c
-00205442a6f57333a332b4c6f07308f6fa846bde3ed27425820cdceeeb935924a9030
-2e38fb444afe3df13ae05e6876d10eca7661196375518eb66d7deeb8cfb42d13f0022
-7ed4654d4452340f26c6304dceeeb1fddb142fcd91b3b26ecd566d7688095f9478a72
-1e5a592be9dd3bda76ed97421819aca4a30752813223d33bc7ea443be976754605116
-278c7fffda4de142674ed154f540bd3285080637eb4b929e1378336b110f3a6da8b66
-7bc7a383c987586bee749c5f2787691baca68757e78b6128b0a0fa2e9e0809b270a1d
-5c8208f3498a3188538265e6a9e6b274cb38c4c5d9b1792d000f5a1a0b34573bf728b
-14f53485f3bf62fd91154dc9ca01b21945b2204f96adc87bd80e8283ecf3522b6d893
-7527f2e9b9782a94fedab0fa304590d1d4f03d72fb1664fca1523a3be95f6c3a97d0a
-2ed
+00203881fefba6d687143ecaaec0d8658eb7fa247555f05fedb0757866d49ea9883e0
+26757226024757abf5c42c9d4451a31c90317bcf54741bb9d9e42641aab0d0fbd0022
+b82a0432f3d9c24998d3c74e4b824ea7b835067fedb21d21fafec2796809853e0d5da
+9109493ed080c98752f92ecd39353d785a84c63f623920b24f2683f76ac44ecd0a289
+b260507d90773502ef3e3fa03ab2e4a6cc54c15eca358ab8ebfc097cb82bf0d250ba1
+b4ee89929fcb6f91c521551ad52cdd6ef1ab438cc024e94d6a8c91a6074e0cc3d1568
+65ebecbe371777078d7eccd6ceddae09bec265d77f3d0301000fba6a857cb74713bd0
+fd39f363bcc71a6f30218ca78126c553840bb4207237a2379fd803a6e6a25fb77806f
+0b05eb477322931cffcad25ac5e78571ac0d2f56627ddb1a136121bea8c01d869266a
+435
 KE1: 7024ca0d5423176294fbb9ca968d8ce3fc879a231f1ceef69e672c89e02ded59
-480917b09c6720680b4a7a0ba9f54b69d870f640a4a7994b47ad07d1a95c984f00096
-8656c6c6f20626f624ae7d50bb80cc8f5034d36c1c27edc30caca0983677a941bc0ac
-e5e10b18300a
+c1162f56eb58419746bb66e1113d401edb0302d894ee962f7e79ae12821bdefd00096
+8656c6c6f20626f629a5fd96f24fea1d99183cfdbaf559a5eb8083ebba2b066bc5d1e
+b511896a5417
 "#,
 ];