Skip to content

Commit 099f887

Browse files
authored
Applying envelope simplified construction and km3 mac changes (#128)
1 parent 9d3963f commit 099f887

File tree

5 files changed

+513
-384
lines changed

5 files changed

+513
-384
lines changed

src/envelope.rs

+13-29
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use rand_core::{CryptoRng, RngCore};
1616
use std::convert::TryFrom;
1717

1818
// Constant string used as salt for HKDF computation
19-
const STR_RWDU: &[u8] = b"rwdU";
2019
const STR_PAD: &[u8] = b"Pad";
2120
const STR_AUTH_KEY: &[u8] = b"AuthKey";
2221
const STR_EXPORT_KEY: &[u8] = b"ExportKey";
@@ -191,23 +190,17 @@ impl<D: Hash> Envelope<D> {
191190
let mut nonce = vec![0u8; NONCE_LEN];
192191
rng.fill_bytes(&mut nonce);
193192

194-
let h = Hkdf::<D>::new(Some(STR_RWDU), &key);
193+
let h = Hkdf::<D>::new(Some(&nonce), &key);
195194
let mut xor_key = vec![0u8; plaintext.len()];
196195
let mut hmac_key = vec![0u8; Self::hmac_key_size()];
197196
let mut export_key = vec![0u8; Self::export_key_size()];
198197

199-
h.expand(&[nonce.clone(), STR_PAD.to_vec()].concat(), &mut xor_key)
198+
h.expand(STR_PAD, &mut xor_key)
199+
.map_err(|_| InternalPakeError::HkdfError)?;
200+
h.expand(STR_AUTH_KEY, &mut hmac_key)
201+
.map_err(|_| InternalPakeError::HkdfError)?;
202+
h.expand(STR_EXPORT_KEY, &mut export_key)
200203
.map_err(|_| InternalPakeError::HkdfError)?;
201-
h.expand(
202-
&[nonce.clone(), STR_AUTH_KEY.to_vec()].concat(),
203-
&mut hmac_key,
204-
)
205-
.map_err(|_| InternalPakeError::HkdfError)?;
206-
h.expand(
207-
&[nonce.clone(), STR_EXPORT_KEY.to_vec()].concat(),
208-
&mut export_key,
209-
)
210-
.map_err(|_| InternalPakeError::HkdfError)?;
211204

212205
let ciphertext: Vec<u8> = xor_key
213206
.iter()
@@ -271,26 +264,17 @@ impl<D: Hash> Envelope<D> {
271264
key: &[u8],
272265
aad: &[u8],
273266
) -> Result<OpenedInnerEnvelope<D>, InternalPakeError> {
274-
let h = Hkdf::<D>::new(Some(STR_RWDU), &key);
267+
let h = Hkdf::<D>::new(Some(&self.inner_envelope.nonce), &key);
275268
let mut xor_key = vec![0u8; self.inner_envelope.ciphertext.len()];
276269
let mut hmac_key = vec![0u8; Self::hmac_key_size()];
277270
let mut export_key = vec![0u8; Self::export_key_size()];
278271

279-
h.expand(
280-
&[self.inner_envelope.nonce.clone(), STR_PAD.to_vec()].concat(),
281-
&mut xor_key,
282-
)
283-
.map_err(|_| InternalPakeError::HkdfError)?;
284-
h.expand(
285-
&[self.inner_envelope.nonce.clone(), STR_AUTH_KEY.to_vec()].concat(),
286-
&mut hmac_key,
287-
)
288-
.map_err(|_| InternalPakeError::HkdfError)?;
289-
h.expand(
290-
&[self.inner_envelope.nonce.clone(), STR_EXPORT_KEY.to_vec()].concat(),
291-
&mut export_key,
292-
)
293-
.map_err(|_| InternalPakeError::HkdfError)?;
272+
h.expand(STR_PAD, &mut xor_key)
273+
.map_err(|_| InternalPakeError::HkdfError)?;
274+
h.expand(STR_AUTH_KEY, &mut hmac_key)
275+
.map_err(|_| InternalPakeError::HkdfError)?;
276+
h.expand(STR_EXPORT_KEY, &mut export_key)
277+
.map_err(|_| InternalPakeError::HkdfError)?;
294278

295279
let mut hmac =
296280
Hmac::<D>::new_varkey(&hmac_key).map_err(|_| InternalPakeError::HmacError)?;

src/key_exchange/tripledh.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static STR_3DH: &[u8] = b"3DH keys";
3434
static STR_CLIENT_MAC: &[u8] = b"client mac";
3535
static STR_HANDSHAKE_SECRET: &[u8] = b"handshake secret";
3636
static STR_SERVER_MAC: &[u8] = b"server mac";
37-
static STR_SERVER_ENC: &[u8] = b"server enc";
37+
static STR_SERVER_ENC: &[u8] = b"handshake enc";
3838
static STR_ENCRYPTION_PAD: &[u8] = b"encryption pad";
3939
static STR_SESSION_SECRET: &[u8] = b"session secret";
4040
static STR_OPAQUE: &[u8] = b"OPAQUE ";
@@ -140,6 +140,7 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
140140

141141
let mut hasher3 = D::new();
142142
hasher3.update(&transcript2);
143+
hasher3.update(&mac);
143144
let hashed_transcript = hasher3.finalize();
144145

145146
Ok((
@@ -207,7 +208,7 @@ impl<D: Hash, G: Group> KeyExchange<D, G> for TripleDH {
207208

208209
let mut hasher2 = D::new();
209210
hasher2.update(transcript);
210-
// hasher2.update(ke2_message.mac.to_vec()); // FIXME, sync with @caw on including this
211+
hasher2.update(ke2_message.mac.to_vec());
211212
let hashed_transcript = hasher2.finalize();
212213

213214
let mut client_mac =

src/opaque.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use rand_core::{CryptoRng, RngCore};
2727
use std::{convert::TryFrom, marker::PhantomData};
2828
use zeroize::Zeroize;
2929

30-
static STR_OPAQUE_VERSION: &[u8] = b"OPAQUE01";
30+
static STR_OPAQUE_VERSION: &[u8] = b"OPAQUE";
3131

3232
// Registration
3333
// ============

src/tests/full_test.rs

+26-26
Original file line numberDiff line numberDiff line change
@@ -68,37 +68,37 @@ pub struct TestVectorParameters {
6868

6969
static TEST_VECTOR: &str = r#"
7070
{
71-
"client_s_pk": "ba8c7e239ed64ea1e6068b52cbd5a34ba6f55d635d20a4593884dc271865ea63",
72-
"client_s_sk": "edb5e886441ddcd4fdd80593d9ea7b7f82f284fcc1d565b802e99997457b960a",
73-
"client_e_pk": "08973113b27d6f2291aaaeb92f34a8438d279a48b1b412bddbf2785be660e479",
74-
"client_e_sk": "28fb3aadbc2716844d8de562d35e61914da734dcea0fa6ebd79603ef9eff4e01",
75-
"server_s_pk": "b67d948b98eecfb516a626fab94170e490ccd90da05fce94a016c4d5d6b7136a",
76-
"server_s_sk": "52350a684c353e39bbaadeb042b2de94226a493f6ae172b7fc45408bbfda6401",
77-
"server_e_pk": "42103d44b03f3886fe3e419b1b96521fa5a706bb1a4e003907daa381960d664a",
78-
"server_e_sk": "564e113d5b2784fcf3a55d5ca48512a2fd5c3c393753f6cfd157cb712b317c04",
71+
"client_s_pk": "3a776afc0ba554a731cc8e2c8fef1ba3e9110195a7902d9b15ecc1352867833e",
72+
"client_s_sk": "bd42afe22725696df96e193ff4d0580e565ad8b769ea718f343245ea83625505",
73+
"client_e_pk": "c22c46082bae3fcb2e5690c0c9a27fa59f752ff9a78ad5c41a18f7f665a3da05",
74+
"client_e_sk": "21616ff86563a235ab01eb7e13f057b1cae8533dc7a4e99076e56d29f948c40b",
75+
"server_s_pk": "d685d935664b0f8175456c9594cb3205329352970a560a4efedb5bfb39335811",
76+
"server_s_sk": "5e37d39ed0c5880c748818b834d97fd8235f4b77a7e06287664c02e5bafd6407",
77+
"server_e_pk": "0202a269a71da47901e071eab4702d92288e9e3ac12b77cc9eae1a6a3be5bf25",
78+
"server_e_sk": "055453a054b87b50c8e9f2ae4eac6e56348ec82b3e3271d843a958b0f634ed0b",
7979
"id_u": "696455",
8080
"id_s": "696453",
8181
"password": "70617373776f7264",
82-
"blinding_factor": "a70b37951d84ed312a0a8e025b71eafdd362b4e7db872881762d506a271b6e07",
83-
"oprf_key": "1eaf3cdd64da67e17e3364182f00ed0c323bfb44b20a1b7e0025a0334ab6d40d",
84-
"envelope_nonce": "5dba53e994e82b6d76353341102791cdfb1c2b460e1f913c5741a9c8cf2017c9",
85-
"client_nonce": "488244dbf75f86ebaa30307773d3e0eabccb91be349abef8a69c458dbf236e4c",
86-
"server_nonce": "13cc5ceb7687d80293005e7f9452ce104d1bac6598dd2265f184cacd558d6b31",
82+
"blinding_factor": "67c5f74c953923c950c978b332f306454a8dc7ae7888449281b9d550ab05e204",
83+
"oprf_key": "94ddb3f439fb4d69ac31b3220604066316b370b4402403d04f9efece28d6a00f",
84+
"envelope_nonce": "c2956142808696bc993b1b1424166afcf0e7de8ba45d8348cd5ff0fbbf528485",
85+
"client_nonce": "b61c639342a00e60652c0567423bc332fc7af6558da4651bd53b89f688fc1274",
86+
"server_nonce": "ebb9dcbbfe8776aa3831763a4172f6e95cec5714d08a0e0a03151f561135c416",
8787
"info1": "696e666f31",
8888
"einfo2": "65696e666f32",
89-
"registration_request": "ecf819ef83351e4c75e016ef845b62a12c14f397328960574935a42e04e0fa42",
90-
"registration_response": "2e9bf80e5c101ee2d391ff2aec06af97af17f443fc93a5cc98189681cb943d700020b67d948b98eecfb516a626fab94170e490ccd90da05fce94a016c4d5d6b7136a",
91-
"registration_upload": "0020ba8c7e239ed64ea1e6068b52cbd5a34ba6f55d635d20a4593884dc271865ea63015dba53e994e82b6d76353341102791cdfb1c2b460e1f913c5741a9c8cf2017c90022f11b89b207eb0735f2bdb2a9968bc9d7c1c962fd0274b4fc1fff2466c769d3710586a3a21ac8ecf13aafe2dc5460eb2f52d8f760396a17beeaf1ef3d1e4e50dd906555832fc51fc474554cb9ff063f6685f9043efc08fd6816666833d68d3b0eb6d9",
92-
"credential_request": "ecf819ef83351e4c75e016ef845b62a12c14f397328960574935a42e04e0fa42488244dbf75f86ebaa30307773d3e0eabccb91be349abef8a69c458dbf236e4c0005696e666f3108973113b27d6f2291aaaeb92f34a8438d279a48b1b412bddbf2785be660e479",
93-
"credential_response": "2e9bf80e5c101ee2d391ff2aec06af97af17f443fc93a5cc98189681cb943d700020b67d948b98eecfb516a626fab94170e490ccd90da05fce94a016c4d5d6b7136a015dba53e994e82b6d76353341102791cdfb1c2b460e1f913c5741a9c8cf2017c90022f11b89b207eb0735f2bdb2a9968bc9d7c1c962fd0274b4fc1fff2466c769d3710586a3a21ac8ecf13aafe2dc5460eb2f52d8f760396a17beeaf1ef3d1e4e50dd906555832fc51fc474554cb9ff063f6685f9043efc08fd6816666833d68d3b0eb6d913cc5ceb7687d80293005e7f9452ce104d1bac6598dd2265f184cacd558d6b3142103d44b03f3886fe3e419b1b96521fa5a706bb1a4e003907daa381960d664a0006a0f4de671e13c37b24e29138ff9d3df3d55c3b822fedee8dcefd643a1deab7cda5aa1c20f31a0c2a1823c8de3e793f50b257833788b75609fb6c5c4a9cad225f3a981c4ff7b2",
94-
"credential_finalization": "0640114ec21fbad6da11c61dfa77a48026646a2a1bd091ef5c9dc46b45f9e53c72f5d714e026d808b6de8911947eef437e9f6a6e969e1ea13f2f4880adc7c879",
95-
"client_registration_state": "a70b37951d84ed312a0a8e025b71eafdd362b4e7db872881762d506a271b6e0770617373776f7264",
96-
"client_login_state": "a70b37951d84ed312a0a8e025b71eafdd362b4e7db872881762d506a271b6e070067ecf819ef83351e4c75e016ef845b62a12c14f397328960574935a42e04e0fa42488244dbf75f86ebaa30307773d3e0eabccb91be349abef8a69c458dbf236e4c0005696e666f3108973113b27d6f2291aaaeb92f34a8438d279a48b1b412bddbf2785be660e479004028fb3aadbc2716844d8de562d35e61914da734dcea0fa6ebd79603ef9eff4e01488244dbf75f86ebaa30307773d3e0eabccb91be349abef8a69c458dbf236e4c70617373776f7264",
97-
"server_registration_state": "1eaf3cdd64da67e17e3364182f00ed0c323bfb44b20a1b7e0025a0334ab6d40d",
98-
"server_login_state": "4952acf61167e6d0e799572827724fdf8c80bda8c62ac28deb68d125661dade2cc1136e634d5fb93f1de4d170ae3e2f5885e333ac3b72d630ab56618c2247fa4d5968eefd69cd270ed14fbcb39627fea9a93cd18175e1b5cfceb06f705bbcb5ecddcd0602aacd7cb358f3273b1099895210bf8baa37d2fab5ed8c092fe9e5739bc6c50cf08ca7d4f4107d48057507480e0c9534b4f04d77cd5156cbd112565d8a2d5beaa473003dcf8dd82d4046648a701c72afeed0f627fcb782627dfaed3ca",
99-
"password_file": "1eaf3cdd64da67e17e3364182f00ed0c323bfb44b20a1b7e0025a0334ab6d40dba8c7e239ed64ea1e6068b52cbd5a34ba6f55d635d20a4593884dc271865ea63015dba53e994e82b6d76353341102791cdfb1c2b460e1f913c5741a9c8cf2017c90022f11b89b207eb0735f2bdb2a9968bc9d7c1c962fd0274b4fc1fff2466c769d3710586a3a21ac8ecf13aafe2dc5460eb2f52d8f760396a17beeaf1ef3d1e4e50dd906555832fc51fc474554cb9ff063f6685f9043efc08fd6816666833d68d3b0eb6d9",
100-
"export_key": "2b86667de895e4d2c15b93bc70f0aa2df67b83987fa53deac9473697e2fade045e0fd0e4af478ccff52165c1467272993da34dcb3baa45aa59cf9d817e6c6bcb",
101-
"shared_secret": "bc6c50cf08ca7d4f4107d48057507480e0c9534b4f04d77cd5156cbd112565d8a2d5beaa473003dcf8dd82d4046648a701c72afeed0f627fcb782627dfaed3ca"
89+
"registration_request": "5ea0a0a57a2882691c3fc8e0dfe09bf05b130723b24371f8ac03b9c75d0d5b79",
90+
"registration_response": "c0ebf6cc43f92c2da075f93da39cb37d7571e61c26bfab69bbcdb35a0a313e260020d685d935664b0f8175456c9594cb3205329352970a560a4efedb5bfb39335811",
91+
"registration_upload": "00203a776afc0ba554a731cc8e2c8fef1ba3e9110195a7902d9b15ecc1352867833e01c2956142808696bc993b1b1424166afcf0e7de8ba45d8348cd5ff0fbbf52848500223b28798f911bb2f0c6cc626f27daf055271234dc1c1e32df59e864cffe946dfb02795cc53d6bcadf5e9535341c473f72b7ea88f4ff87fe941c0dace9f9975fa8887ac0bb7c84a5028fcdd10b41f9216523ba3513c95eb127437155feb0c022469334",
92+
"credential_request": "5ea0a0a57a2882691c3fc8e0dfe09bf05b130723b24371f8ac03b9c75d0d5b79b61c639342a00e60652c0567423bc332fc7af6558da4651bd53b89f688fc12740005696e666f31c22c46082bae3fcb2e5690c0c9a27fa59f752ff9a78ad5c41a18f7f665a3da05",
93+
"credential_response": "c0ebf6cc43f92c2da075f93da39cb37d7571e61c26bfab69bbcdb35a0a313e260020d685d935664b0f8175456c9594cb3205329352970a560a4efedb5bfb3933581101c2956142808696bc993b1b1424166afcf0e7de8ba45d8348cd5ff0fbbf52848500223b28798f911bb2f0c6cc626f27daf055271234dc1c1e32df59e864cffe946dfb02795cc53d6bcadf5e9535341c473f72b7ea88f4ff87fe941c0dace9f9975fa8887ac0bb7c84a5028fcdd10b41f9216523ba3513c95eb127437155feb0c022469334ebb9dcbbfe8776aa3831763a4172f6e95cec5714d08a0e0a03151f561135c4160202a269a71da47901e071eab4702d92288e9e3ac12b77cc9eae1a6a3be5bf250006148cc6985fd9c04245efa02487d25a5e4ffa64fdb7f7fd627839ca70f29da495e59489891e14b7122656edcf2bfc788f92bf458fac31d4b0ddd6b6aa764e08c56d16e803e919",
94+
"credential_finalization": "c6c0ccf4e5155b2cecabc61efc289824e00eb2e5d3c15d508100d35d8f0d3ba317797270af96cd4610b954ec21898f2e9df02411c21352a3220259034c711487",
95+
"client_registration_state": "67c5f74c953923c950c978b332f306454a8dc7ae7888449281b9d550ab05e20470617373776f7264",
96+
"client_login_state": "67c5f74c953923c950c978b332f306454a8dc7ae7888449281b9d550ab05e20400675ea0a0a57a2882691c3fc8e0dfe09bf05b130723b24371f8ac03b9c75d0d5b79b61c639342a00e60652c0567423bc332fc7af6558da4651bd53b89f688fc12740005696e666f31c22c46082bae3fcb2e5690c0c9a27fa59f752ff9a78ad5c41a18f7f665a3da05004021616ff86563a235ab01eb7e13f057b1cae8533dc7a4e99076e56d29f948c40bb61c639342a00e60652c0567423bc332fc7af6558da4651bd53b89f688fc127470617373776f7264",
97+
"server_registration_state": "94ddb3f439fb4d69ac31b3220604066316b370b4402403d04f9efece28d6a00f",
98+
"server_login_state": "fa7795f9a3a3f93e950d4d902689157f98cdf839fe64847b9b24dc2c7d07e9d674cdcb3db4c7653dcf133c49eadbf2b3a0665e19c37461352a8bdce781cefd5d8c8153b0b60a3abbb9cc2a34fe3c53541b1e7df3216d3bac1e8280fa697db9ee6b2468e585f9912bd227c51b702671691b6d6a3542db4597c18013fbae903b5c9d5ff920b8a7231d717155af4475b3591973245b9dd26cf956383e8145fa3e8c1e508b72f3e3c42e3d116611b676780628591acf37757c74ad297f71a0b54b39",
99+
"password_file": "94ddb3f439fb4d69ac31b3220604066316b370b4402403d04f9efece28d6a00f3a776afc0ba554a731cc8e2c8fef1ba3e9110195a7902d9b15ecc1352867833e01c2956142808696bc993b1b1424166afcf0e7de8ba45d8348cd5ff0fbbf52848500223b28798f911bb2f0c6cc626f27daf055271234dc1c1e32df59e864cffe946dfb02795cc53d6bcadf5e9535341c473f72b7ea88f4ff87fe941c0dace9f9975fa8887ac0bb7c84a5028fcdd10b41f9216523ba3513c95eb127437155feb0c022469334",
100+
"export_key": "c250b23ac69b71bcc246db97398487198c94c73c84e1256b57c3ceb32a76fdc7547a8953bfc94b530e5b660f559faa53572f98ec0168e378087017b9a7393f57",
101+
"shared_secret": "9d5ff920b8a7231d717155af4475b3591973245b9dd26cf956383e8145fa3e8c1e508b72f3e3c42e3d116611b676780628591acf37757c74ad297f71a0b54b39"
102102
}
103103
"#;
104104

0 commit comments

Comments
 (0)