Some checks failed
CI / rustfmt (push) Successful in 17s
CI / clippy (push) Failing after 1m16s
CI / wasm build (push) Successful in 1m17s
CI / example (push) Successful in 1m29s
CI / test (push) Successful in 1m49s
CI / duplicate code (push) Successful in 12s
CI / web client (push) Failing after 27s
CI / cargo-machete (push) Successful in 1m10s
CI / cargo-deny (push) Failing after 2m20s
(feat): add the example's web-client dist folder to a gitignore (fix): format issues (fix): a lot of duplicate code
96 lines
3.4 KiB
Rust
96 lines
3.4 KiB
Rust
use mtp::client::MTPConnection;
|
|
use mtp::codec::{CommunicationType, CommunicationValue, DataType, DataValue};
|
|
use mtp::crypto::{Ed25519Signer, EncryptionType, Keyring, PublicKeyBundle, SigAlgorithm};
|
|
use mtp::type_map::TypeMap;
|
|
|
|
pub fn build_demo_message(
|
|
client_id: u64,
|
|
keyring: &Keyring,
|
|
server_bundle: &PublicKeyBundle,
|
|
) -> CommunicationValue {
|
|
// Encrypt to the server's KEM public key; the server decrypts with its keyring.
|
|
let enc_type = EncryptionType::MlKemChaCha20Poly1305;
|
|
let signer = Ed25519Signer::new(&keyring.sig_cl_secret_key)
|
|
.expect("Ed25519 signer from keyring");
|
|
|
|
let tm = TypeMap::latest();
|
|
|
|
let inner_enc = DataValue::Container(vec![
|
|
(DataType::Version.to_id(&tm), DataValue::Str("secret inner data".into())),
|
|
(DataType::Id.to_id(&tm), DataValue::UnsignedNumber(42)),
|
|
]);
|
|
let mut dv_enc = inner_enc;
|
|
dv_enc.encrypt_container(enc_type, server_bundle, b"demo-aad");
|
|
|
|
let inner_sig = DataValue::Container(vec![
|
|
(DataType::Version.to_id(&tm), DataValue::Str("signed by client".into())),
|
|
(DataType::Id.to_id(&tm), DataValue::UnsignedNumber(99)),
|
|
]);
|
|
let mut dv_sig = inner_sig;
|
|
dv_sig.sign_container(SigAlgorithm::ED25519, &signer);
|
|
|
|
let inner_sec = DataValue::Container(vec![
|
|
(
|
|
DataType::Version.to_id(&tm),
|
|
DataValue::Str("signed+encrypted payload".into()),
|
|
),
|
|
(DataType::Id.to_id(&tm), DataValue::UnsignedNumber(7)),
|
|
]);
|
|
let mut dv_sec = inner_sec;
|
|
dv_sec.sign_and_encrypt_container(SigAlgorithm::ED25519, &signer, enc_type, server_bundle, b"demo-aad");
|
|
|
|
let timestamp = std::time::SystemTime::now()
|
|
.duration_since(std::time::UNIX_EPOCH)
|
|
.unwrap()
|
|
.as_secs();
|
|
|
|
let msg = CommunicationValue::new(CommunicationType::Ping)
|
|
.add_typed_default(
|
|
DataType::Description,
|
|
DataValue::Str("MTP Data Type Demo".into()),
|
|
)
|
|
.add_typed_default(
|
|
DataType::Timestamp,
|
|
DataValue::UnsignedNumber(timestamp as u128),
|
|
)
|
|
.add_typed_default(DataType::Data, DataValue::Str("Hello, MTP!".into()))
|
|
.add_typed_default(DataType::Flags, DataValue::BoolTrue)
|
|
.add_typed_default(DataType::Value, DataValue::Float(2, 12345))
|
|
.add_typed_default(
|
|
DataType::BinaryData,
|
|
DataValue::Bytes(vec![0xDE, 0xAD, 0xBE, 0xEF, 0x42]),
|
|
)
|
|
.add_typed_default(
|
|
DataType::Items,
|
|
DataValue::Array(vec![
|
|
DataValue::Str("alpha".into()),
|
|
DataValue::Str("beta".into()),
|
|
DataValue::Str("gamma".into()),
|
|
]),
|
|
)
|
|
.add_typed_default(DataType::EncryptedPayload, dv_enc)
|
|
.add_typed_default(DataType::SignedPayload, dv_sig)
|
|
.add_typed_default(DataType::SecurePayload, dv_sec)
|
|
.with_sender(client_id);
|
|
msg
|
|
}
|
|
|
|
pub async fn send_and_receive(
|
|
conn: &MTPConnection,
|
|
keyring: &Keyring,
|
|
server_bundle: &PublicKeyBundle,
|
|
) -> Result<(), Box<dyn std::error::Error>> {
|
|
let msg = build_demo_message(conn.client_id, keyring, server_bundle);
|
|
println!("Sending: {msg}");
|
|
conn.sender.send(&msg).await?;
|
|
|
|
match conn.receiver.receive().await {
|
|
Ok(resp) => {
|
|
println!("Received: {resp}");
|
|
}
|
|
Err(e) => eprintln!("Receive error: {e}"),
|
|
}
|
|
|
|
conn.sender.close();
|
|
Ok(())
|
|
}
|