Skip to content

Commit 85b6ce4

Browse files
authored
Merge pull request #43 from Foundation-Devices/replay-attack-fixes
prevent panic and better seal api
2 parents 4c8ec3a + c8c0a52 commit 85b6ce4

File tree

1 file changed

+37
-13
lines changed

1 file changed

+37
-13
lines changed

api/src/api/quantum_link.rs

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,21 @@ pub trait QuantumLink<C>: minicbor::Encode<C> {
9797
Ok(message)
9898
}
9999

100-
fn seal(&self, sender: QuantumLinkIdentity, recipient: QuantumLinkIdentity) -> Envelope
100+
fn seal(
101+
&self,
102+
(sender_pk, sender_xid): (&PrivateKeys, &XIDDocument),
103+
recipient: &XIDDocument,
104+
) -> Envelope
101105
where
102106
Self: minicbor::Encode<()>,
103107
{
104108
let valid_until = Date::with_duration_from_now(EXPIRATION_DURATION);
105109

106110
let event: SealedEvent<Expression> =
107-
SealedEvent::new(QuantumLink::encode(self), ARID::new(), sender.xid_document)
111+
SealedEvent::new(QuantumLink::encode(self), ARID::new(), sender_xid)
108112
.with_date(&valid_until);
109113
event
110-
.to_envelope(
111-
Some(&valid_until),
112-
Some(&sender.private_keys.unwrap()),
113-
Some(&recipient.xid_document),
114-
)
114+
.to_envelope(Some(&valid_until), Some(sender_pk), Some(recipient))
115115
.unwrap()
116116
}
117117

@@ -142,7 +142,10 @@ pub trait QuantumLink<C>: minicbor::Encode<C> {
142142

143143
// Check for replay attack
144144
let arid = event.id();
145-
let event_date = event.date().unwrap().datetime();
145+
let event_date = event
146+
.date()
147+
.ok_or_else(|| anyhow::anyhow!("event missing date"))?
148+
.datetime();
146149
if arid_cache.check_and_store(arid, event_date, now) {
147150
bail!("Replay attack detected: ARID has been seen before");
148151
}
@@ -285,7 +288,11 @@ mod tests {
285288
};
286289

287290
// Seal the message
288-
let envelope = QuantumLink::seal(&original_message, envoy.clone(), passport.clone());
291+
let envelope = QuantumLink::seal(
292+
&original_message,
293+
(envoy.private_keys.as_ref().unwrap(), &envoy.xid_document),
294+
&passport.xid_document,
295+
);
289296

290297
// Decode the message
291298
let decoded_message =
@@ -327,7 +334,11 @@ mod tests {
327334
};
328335

329336
// Seal the message
330-
let envelope = QuantumLink::seal(&original_message, envoy.clone(), passport.clone());
337+
let envelope = QuantumLink::seal(
338+
&original_message,
339+
(envoy.private_keys.as_ref().unwrap(), &envoy.xid_document),
340+
&passport.xid_document,
341+
);
331342

332343
// First unseal should succeed
333344
let result1 = EnvoyMessage::unseal_envoy_message_with_replay_check(
@@ -367,8 +378,17 @@ mod tests {
367378
timestamp: 123457,
368379
};
369380

370-
let envelope1 = QuantumLink::seal(&message1, envoy.clone(), passport.clone());
371-
let envelope2 = QuantumLink::seal(&message2, envoy.clone(), passport.clone());
381+
let envelope1 = QuantumLink::seal(
382+
&message1,
383+
(envoy.private_keys.as_ref().unwrap(), &envoy.xid_document),
384+
&passport.xid_document,
385+
);
386+
387+
let envelope2 = QuantumLink::seal(
388+
&message2,
389+
(envoy.private_keys.as_ref().unwrap(), &envoy.xid_document),
390+
&passport.xid_document,
391+
);
372392

373393
// Unseal both messages
374394
let _result1 = EnvoyMessage::unseal_envoy_message_with_replay_check(
@@ -427,7 +447,11 @@ fn test_replay_check() {
427447
timestamp: 123456,
428448
};
429449

430-
let envelope = QuantumLink::seal(&message, envoy.clone(), passport.clone());
450+
let envelope = QuantumLink::seal(
451+
&message,
452+
(envoy.private_keys.as_ref().unwrap(), &envoy.xid_document),
453+
&passport.xid_document,
454+
);
431455

432456
let result1 = EnvoyMessage::unseal_envoy_message_with_replay_check(
433457
&envelope,

0 commit comments

Comments
 (0)