Skip to content

Commit

Permalink
Merge pull request #101 from chrysn-pull-requests/api-u8-instead-of-hex
Browse files Browse the repository at this point in the history
API: Use u8 instead of hex str
  • Loading branch information
geonnave authored Oct 5, 2023
2 parents 5fe2756 + 67057cd commit 7853302
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 232 deletions.
20 changes: 10 additions & 10 deletions examples/c-wrapper-riot/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
extern void mbedtls_memory_buffer_alloc_init(uint8_t *buf, size_t len);
#endif

static const uint8_t ID_CRED_I[] = "a104412b";
static const uint8_t ID_CRED_R[] = "a104410a";
static const uint8_t CRED_I[] = "A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8";
static const uint8_t G_I[] = "ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6";
static const uint8_t CRED_R[] = "A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072";
static const uint8_t R[] = "72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac";
static const uint8_t I[] = "fb13adeb6518cee5f88417660841142e830a81fe334380a953406a1305e8706b";
static const uint8_t G_R[] = "bbc34960526ea4d32e940cad2a234148ddc21791a12afbcbac93622046dd44f0";
static const uint8_t ID_CRED_I[] = {0xa1, 0x04, 0x41, 0x2b};
static const uint8_t ID_CRED_R[] = {0xa1, 0x04, 0x41, 0x0a};
static const uint8_t CRED_I[] = {0xA2, 0x02, 0x77, 0x34, 0x32, 0x2D, 0x35, 0x30, 0x2D, 0x33, 0x31, 0x2D, 0x46, 0x46, 0x2D, 0x45, 0x46, 0x2D, 0x33, 0x37, 0x2D, 0x33, 0x32, 0x2D, 0x33, 0x39, 0x08, 0xA1, 0x01, 0xA5, 0x01, 0x02, 0x02, 0x41, 0x2B, 0x20, 0x01, 0x21, 0x58, 0x20, 0xAC, 0x75, 0xE9, 0xEC, 0xE3, 0xE5, 0x0B, 0xFC, 0x8E, 0xD6, 0x03, 0x99, 0x88, 0x95, 0x22, 0x40, 0x5C, 0x47, 0xBF, 0x16, 0xDF, 0x96, 0x66, 0x0A, 0x41, 0x29, 0x8C, 0xB4, 0x30, 0x7F, 0x7E, 0xB6, 0x22, 0x58, 0x20, 0x6E, 0x5D, 0xE6, 0x11, 0x38, 0x8A, 0x4B, 0x8A, 0x82, 0x11, 0x33, 0x4A, 0xC7, 0xD3, 0x7E, 0xCB, 0x52, 0xA3, 0x87, 0xD2, 0x57, 0xE6, 0xDB, 0x3C, 0x2A, 0x93, 0xDF, 0x21, 0xFF, 0x3A, 0xFF, 0xC8};
static const uint8_t G_I[] = {0xac, 0x75, 0xe9, 0xec, 0xe3, 0xe5, 0x0b, 0xfc, 0x8e, 0xd6, 0x03, 0x99, 0x88, 0x95, 0x22, 0x40, 0x5c, 0x47, 0xbf, 0x16, 0xdf, 0x96, 0x66, 0x0a, 0x41, 0x29, 0x8c, 0xb4, 0x30, 0x7f, 0x7e, 0xb6};
static const uint8_t CRED_R[] = {0xA2, 0x02, 0x60, 0x08, 0xA1, 0x01, 0xA5, 0x01, 0x02, 0x02, 0x41, 0x0A, 0x20, 0x01, 0x21, 0x58, 0x20, 0xBB, 0xC3, 0x49, 0x60, 0x52, 0x6E, 0xA4, 0xD3, 0x2E, 0x94, 0x0C, 0xAD, 0x2A, 0x23, 0x41, 0x48, 0xDD, 0xC2, 0x17, 0x91, 0xA1, 0x2A, 0xFB, 0xCB, 0xAC, 0x93, 0x62, 0x20, 0x46, 0xDD, 0x44, 0xF0, 0x22, 0x58, 0x20, 0x45, 0x19, 0xE2, 0x57, 0x23, 0x6B, 0x2A, 0x0C, 0xE2, 0x02, 0x3F, 0x09, 0x31, 0xF1, 0xF3, 0x86, 0xCA, 0x7A, 0xFD, 0xA6, 0x4F, 0xCD, 0xE0, 0x10, 0x8C, 0x22, 0x4C, 0x51, 0xEA, 0xBF, 0x60, 0x72};
static const uint8_t R[] = {0x72, 0xcc, 0x47, 0x61, 0xdb, 0xd4, 0xc7, 0x8f, 0x75, 0x89, 0x31, 0xaa, 0x58, 0x9d, 0x34, 0x8d, 0x1e, 0xf8, 0x74, 0xa7, 0xe3, 0x03, 0xed, 0xe2, 0xf1, 0x40, 0xdc, 0xf3, 0xe6, 0xaa, 0x4a, 0xac};
static const uint8_t I[] = {0xfb, 0x13, 0xad, 0xeb, 0x65, 0x18, 0xce, 0xe5, 0xf8, 0x84, 0x17, 0x66, 0x08, 0x41, 0x14, 0x2e, 0x83, 0x0a, 0x81, 0xfe, 0x33, 0x43, 0x80, 0xa9, 0x53, 0x40, 0x6a, 0x13, 0x05, 0xe8, 0x70, 0x6b};
static const uint8_t G_R[] = {0xbb, 0xc3, 0x49, 0x60, 0x52, 0x6e, 0xa4, 0xd3, 0x2e, 0x94, 0x0c, 0xad, 0x2a, 0x23, 0x41, 0x48, 0xdd, 0xc2, 0x17, 0x91, 0xa1, 0x2a, 0xfb, 0xcb, 0xac, 0x93, 0x62, 0x20, 0x46, 0xdd, 0x44, 0xf0};

int main(void)
{
Expand All @@ -35,8 +35,8 @@ int main(void)
od_hex_dump(out_public_key, 32, OD_WIDTH_DEFAULT);

puts("Begin test: edhoc handshake.");
EdhocInitiatorC initiator = initiator_new(I, 32*2, G_R, 32*2, ID_CRED_I, 4*2, CRED_I, 107*2, ID_CRED_R, 4*2, CRED_R, 84*2);
EdhocResponderC responder = responder_new(R, 32*2, G_I, 32*2, ID_CRED_I, 4*2, CRED_I, 107*2, ID_CRED_R, 4*2, CRED_R, 84*2);
EdhocInitiatorC initiator = initiator_new(I, 32, G_R, 32, ID_CRED_I, 4, CRED_I, 107, ID_CRED_R, 4, CRED_R, 84);
EdhocResponderC responder = responder_new(R, 32, G_I, 32, ID_CRED_I, 4, CRED_I, 107, ID_CRED_R, 4, CRED_R, 84);

EdhocMessageBuffer message_1;
initiator_prepare_message_1(&initiator, &message_1);
Expand Down
1 change: 1 addition & 0 deletions examples/coap/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ edition = "2021"

[dependencies]
edhoc-rs = { path = "../../lib", features = [ "crypto-psa" ] }
hexlit = "0.5.3"
coap = { version = "0.13" }
coap-lite = { version = "0.11.3" }
19 changes: 11 additions & 8 deletions examples/coap/src/bin/coapclient.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
use coap::CoAPClient;
use coap_lite::ResponseType;
use edhoc_rs::*;
use hexlit::hex;
use std::time::Duration;

const ID_CRED_I: &str = "a104412b";
const ID_CRED_R: &str = "a104410a";
const CRED_I: &str = "A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8";
const I: &str = "fb13adeb6518cee5f88417660841142e830a81fe334380a953406a1305e8706b";
const _G_I_X_COORD: &str = "ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"; // not used
const _G_I_Y_COORD: &str = "6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"; // not used
const CRED_R: &str = "A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072";
const G_R: &str = "bbc34960526ea4d32e940cad2a234148ddc21791a12afbcbac93622046dd44f0";
const ID_CRED_I: &[u8] = &hex!("a104412b");
const ID_CRED_R: &[u8] = &hex!("a104410a");
const CRED_I: &[u8] = &hex!("A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8");
const I: &[u8] = &hex!("fb13adeb6518cee5f88417660841142e830a81fe334380a953406a1305e8706b");
const _G_I_X_COORD: &[u8] =
&hex!("ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"); // not used
const _G_I_Y_COORD: &[u8] =
&hex!("6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"); // not used
const CRED_R: &[u8] = &hex!("A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072");
const G_R: &[u8] = &hex!("bbc34960526ea4d32e940cad2a234148ddc21791a12afbcbac93622046dd44f0");

fn main() {
let url = "coap://127.0.0.1:5683/.well-known/edhoc";
Expand Down
16 changes: 9 additions & 7 deletions examples/coap/src/bin/coapserver.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
use coap_lite::{CoapRequest, Packet, ResponseType};
use edhoc_rs::*;
use hexlit::hex;
use std::net::UdpSocket;

const ID_CRED_I: &str = "a104412b";
const ID_CRED_R: &str = "a104410a";
const CRED_I: &str = "A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8";
const G_I: &str = "ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"; // not used
const _G_I_Y_COORD: &str = "6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"; // not used
const CRED_R: &str = "A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072";
const R: &str = "72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac";
const ID_CRED_I: &[u8] = &hex!("a104412b");
const ID_CRED_R: &[u8] = &hex!("a104410a");
const CRED_I: &[u8] = &hex!("A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8");
const G_I: &[u8] = &hex!("ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"); // not used
const _G_I_Y_COORD: &[u8] =
&hex!("6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"); // not used
const CRED_R: &[u8] = &hex!("A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072");
const R: &[u8] = &hex!("72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac");

fn main() {
let mut buf = [0; 100];
Expand Down
19 changes: 10 additions & 9 deletions examples/edhoc-rs-no_std/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,16 @@ fn main() -> ! {
// edhoc-rs test code
use hexlit::hex;

const ID_CRED_I: &str = "a104412b";
const ID_CRED_R: &str = "a104410a";
const CRED_I: &str = "A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8";
const I: &str = "fb13adeb6518cee5f88417660841142e830a81fe334380a953406a1305e8706b";
const R: &str = "72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac";
const G_I: &str = "ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"; // used
const _G_I_Y_COORD: &str = "6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"; // not used
const CRED_R: &str = "A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072";
const G_R: &str = "bbc34960526ea4d32e940cad2a234148ddc21791a12afbcbac93622046dd44f0";
const ID_CRED_I: &[u8] = &hex!("a104412b");
const ID_CRED_R: &[u8] = &hex!("a104410a");
const CRED_I: &[u8] = &hex!("A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8");
const I: &[u8] = &hex!("fb13adeb6518cee5f88417660841142e830a81fe334380a953406a1305e8706b");
const R: &[u8] = &hex!("72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac");
const G_I: &[u8] = &hex!("ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6"); // used
const _G_I_Y_COORD: &[u8] =
&hex!("6e5de611388a4b8a8211334ac7d37ecb52a387d257e6db3c2a93df21ff3affc8"); // not used
const CRED_R: &[u8] = &hex!("A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072");
const G_R: &[u8] = &hex!("bbc34960526ea4d32e940cad2a234148ddc21791a12afbcbac93622046dd44f0");
const C_R_TV: [u8; 1] = hex!("27");

fn test_new_initiator() {
Expand Down
78 changes: 31 additions & 47 deletions lib/src/c_wrapper.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::*;
use core::{slice, str};
use edhoc_consts::*;
use hexlit::hex;

// Panic handler for cortex-m targets
#[cfg(any(feature = "crypto-cryptocell310", feature = "crypto-psa-baremetal"))]
Expand Down Expand Up @@ -40,20 +41,12 @@ impl EdhocInitiatorC {
pub fn to_rust(&self) -> EdhocInitiator {
EdhocInitiator::new(
self.state,
unsafe { str::from_utf8_unchecked(slice::from_raw_parts(self.i, self.i_len)) },
unsafe { str::from_utf8_unchecked(slice::from_raw_parts(self.g_r, self.g_r_len)) },
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.id_cred_i, self.id_cred_i_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.cred_i, self.cred_i_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.id_cred_r, self.id_cred_r_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.cred_r, self.cred_r_len))
},
unsafe { slice::from_raw_parts(self.i, self.i_len) },
unsafe { slice::from_raw_parts(self.g_r, self.g_r_len) },
unsafe { slice::from_raw_parts(self.id_cred_i, self.id_cred_i_len) },
unsafe { slice::from_raw_parts(self.cred_i, self.cred_i_len) },
unsafe { slice::from_raw_parts(self.id_cred_r, self.id_cred_r_len) },
unsafe { slice::from_raw_parts(self.cred_r, self.cred_r_len) },
)
}
}
Expand All @@ -79,20 +72,12 @@ impl EdhocResponderC {
pub fn to_rust(&self) -> EdhocResponder {
EdhocResponder::new(
self.state,
unsafe { str::from_utf8_unchecked(slice::from_raw_parts(self.r, self.r_len)) },
unsafe { str::from_utf8_unchecked(slice::from_raw_parts(self.g_i, self.g_i_len)) },
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.id_cred_i, self.id_cred_i_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.cred_i, self.cred_i_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.id_cred_r, self.id_cred_r_len))
},
unsafe {
str::from_utf8_unchecked(slice::from_raw_parts(self.cred_r, self.cred_r_len))
},
unsafe { slice::from_raw_parts(self.r, self.r_len) },
unsafe { slice::from_raw_parts(self.g_i, self.g_i_len) },
unsafe { slice::from_raw_parts(self.id_cred_i, self.id_cred_i_len) },
unsafe { slice::from_raw_parts(self.cred_i, self.cred_i_len) },
unsafe { slice::from_raw_parts(self.id_cred_r, self.id_cred_r_len) },
unsafe { slice::from_raw_parts(self.cred_r, self.cred_r_len) },
)
}
}
Expand All @@ -114,12 +99,12 @@ pub unsafe extern "C" fn responder_new(
) -> EdhocResponderC {
EdhocResponder::new(
State::default(),
str::from_utf8_unchecked(slice::from_raw_parts(r, r_len)),
str::from_utf8_unchecked(slice::from_raw_parts(g_i, g_i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(id_cred_i, id_cred_i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(cred_i, cred_i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(id_cred_r, id_cred_r_len)),
str::from_utf8_unchecked(slice::from_raw_parts(cred_r, cred_r_len)),
slice::from_raw_parts(r, r_len),
slice::from_raw_parts(g_i, g_i_len),
slice::from_raw_parts(id_cred_i, id_cred_i_len),
slice::from_raw_parts(cred_i, cred_i_len),
slice::from_raw_parts(id_cred_r, id_cred_r_len),
slice::from_raw_parts(cred_r, cred_r_len),
)
.to_c()
}
Expand All @@ -141,12 +126,12 @@ pub unsafe extern "C" fn initiator_new(
) -> EdhocInitiatorC {
EdhocInitiator::new(
State::default(),
str::from_utf8_unchecked(slice::from_raw_parts(i, i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(g_r, g_r_len)),
str::from_utf8_unchecked(slice::from_raw_parts(id_cred_i, id_cred_i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(cred_i, cred_i_len)),
str::from_utf8_unchecked(slice::from_raw_parts(id_cred_r, id_cred_r_len)),
str::from_utf8_unchecked(slice::from_raw_parts(cred_r, cred_r_len)),
slice::from_raw_parts(i, i_len),
slice::from_raw_parts(g_r, g_r_len),
slice::from_raw_parts(id_cred_i, id_cred_i_len),
slice::from_raw_parts(cred_i, cred_i_len),
slice::from_raw_parts(id_cred_r, id_cred_r_len),
slice::from_raw_parts(cred_r, cred_r_len),
)
.to_c()
}
Expand Down Expand Up @@ -282,14 +267,13 @@ mod test_c {

#[test]
fn test_new_responder() {
const ID_CRED_I: &[u8] = "a104412b".as_bytes();
const ID_CRED_R: &[u8] = "a104410a".as_bytes();
const CRED_I: &[u8] = "A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8".as_bytes();
const ID_CRED_I: &[u8] = &hex!("a104412b");
const ID_CRED_R: &[u8] = &hex!("a104410a");
const CRED_I: &[u8] = &hex!("A2027734322D35302D33312D46462D45462D33372D33322D333908A101A5010202412B2001215820AC75E9ECE3E50BFC8ED60399889522405C47BF16DF96660A41298CB4307F7EB62258206E5DE611388A4B8A8211334AC7D37ECB52A387D257E6DB3C2A93DF21FF3AFFC8");
const G_I: &[u8] =
"ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6".as_bytes();
const CRED_R: &[u8] = "A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072".as_bytes();
const R: &[u8] =
"72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac".as_bytes();
&hex!("ac75e9ece3e50bfc8ed60399889522405c47bf16df96660a41298cb4307f7eb6");
const CRED_R: &[u8] = &hex!("A2026008A101A5010202410A2001215820BBC34960526EA4D32E940CAD2A234148DDC21791A12AFBCBAC93622046DD44F02258204519E257236B2A0CE2023F0931F1F386CA7AFDA64FCDE0108C224C51EABF6072");
const R: &[u8] = &hex!("72cc4761dbd4c78f758931aa589d348d1ef874a7e303ede2f140dcf3e6aa4aac");

let resp = unsafe {
responder_new(
Expand Down
Loading

0 comments on commit 7853302

Please sign in to comment.