Skip to content

Commit a8c689e

Browse files
committed
feat: make new errors also accessible to python
1 parent 5668f8d commit a8c689e

File tree

5 files changed

+38
-22
lines changed

5 files changed

+38
-22
lines changed

ead/lakers-ead-authz/src/device.rs

+17
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,23 @@ fn encode_ead_1_value(
132132
output
133133
}
134134

135+
pub(crate) fn verify_voucher<Crypto: CryptoTrait>(
136+
crypto: &mut Crypto,
137+
received_voucher: &BytesEncodedVoucher,
138+
h_message_1: &BytesHashLen,
139+
cred_v: &[u8],
140+
prk: &BytesHashLen,
141+
) -> Result<BytesMac, ZeroTouchError> {
142+
let prepared_voucher = &prepare_voucher(crypto, h_message_1, cred_v, prk);
143+
if received_voucher == prepared_voucher {
144+
let mut voucher_mac: BytesMac = Default::default();
145+
voucher_mac[..MAC_LENGTH].copy_from_slice(&prepared_voucher[1..1 + MAC_LENGTH]);
146+
return Ok(voucher_mac);
147+
} else {
148+
return Err(ZeroTouchError::VoucherVerificationFailed);
149+
}
150+
}
151+
135152
#[cfg(test)]
136153
mod test_device {
137154
use super::*;

ead/lakers-ead-authz/src/shared.rs

-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use lakers_shared::{Crypto as CryptoTrait, *};
22

3-
use crate::ZeroTouchError;
4-
53
pub(crate) fn compute_prk<Crypto: CryptoTrait>(
64
crypto: &mut Crypto,
75
a: &BytesP256ElemLen,
@@ -24,23 +22,6 @@ pub(crate) fn compute_prk_from_secret<Crypto: CryptoTrait>(
2422
crypto.hkdf_extract(&salt, &g_ab)
2523
}
2624

27-
pub(crate) fn verify_voucher<Crypto: CryptoTrait>(
28-
crypto: &mut Crypto,
29-
received_voucher: &BytesEncodedVoucher,
30-
h_message_1: &BytesHashLen,
31-
cred_v: &[u8],
32-
prk: &BytesHashLen,
33-
) -> Result<BytesMac, ZeroTouchError> {
34-
let prepared_voucher = &prepare_voucher(crypto, h_message_1, cred_v, prk);
35-
if received_voucher == prepared_voucher {
36-
let mut voucher_mac: BytesMac = Default::default();
37-
voucher_mac[..MAC_LENGTH].copy_from_slice(&prepared_voucher[1..1 + MAC_LENGTH]);
38-
return Ok(voucher_mac);
39-
} else {
40-
return Err(ZeroTouchError::VoucherVerificationFailed);
41-
}
42-
}
43-
4425
pub(crate) fn prepare_voucher<Crypto: CryptoTrait>(
4526
crypto: &mut Crypto,
4627
h_message_1: &BytesHashLen,

lakers-python/src/initiator.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl PyEdhocInitiator {
6161
&mut self,
6262
message_2: Vec<u8>,
6363
) -> PyResult<(u8, Vec<u8>, Option<EADItem>)> {
64-
let message_2 = EdhocMessageBuffer::new_from_slice(message_2.as_slice()).unwrap(); // FIXME: avoid unwrap
64+
let message_2 = EdhocMessageBuffer::new_from_slice(message_2.as_slice())?; // FIXME: avoid unwrap
6565

6666
match i_parse_message_2(&self.wait_m2, &mut default_crypto(), &message_2) {
6767
Ok((state, c_r, id_cred_r, ead_2)) => {

lakers-python/test/test_lakers.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,14 @@ def test_handshake():
6262
r_prk_out_new = responder.edhoc_key_update(CONTEXT)
6363
assert i_prk_out_new == r_prk_out_new
6464

65-
def test_error():
65+
def test_edhoc_error():
6666
responder = lakers.EdhocResponder(R, CRED_R)
6767
with pytest.raises(ValueError) as err:
68-
_ead_1 = responder.process_message_1([1, 2, 3])
68+
_ = responder.process_message_1([1, 2, 3])
6969
assert str(err.value) == "EDHOCError::ParsingError"
70+
71+
def test_buffer_error():
72+
initiator = lakers.EdhocInitiator()
73+
with pytest.raises(ValueError) as err:
74+
_ = initiator.parse_message_2([1] * 1000)
75+
assert str(err.value) == "MessageBufferError::SliceTooLong"

shared/src/python_bindings.rs

+12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ impl From<EDHOCError> for PyErr {
1818
}
1919
}
2020

21+
impl fmt::Display for MessageBufferError {
22+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23+
write!(f, "MessageBufferError::{:?}", self)
24+
}
25+
}
26+
27+
impl From<MessageBufferError> for PyErr {
28+
fn from(error: MessageBufferError) -> Self {
29+
PyValueError::new_err(error.to_string())
30+
}
31+
}
32+
2133
#[pymethods]
2234
impl EADItem {
2335
#[new]

0 commit comments

Comments
 (0)