Gitignores
Some checks failed
CI / rustfmt (push) Has been cancelled
CI / clippy (push) Has been cancelled
CI / test (push) Has been cancelled
CI / wasm build (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled

This commit is contained in:
Alex Emmet 2026-06-27 02:00:42 +02:00
commit 43f028a1f6
13 changed files with 1914 additions and 15 deletions

15
.gitignore vendored
View file

@ -1,18 +1,3 @@
**target/
*.pem
*.key
example-usage/dev-cert/
# The root Cargo.lock and the example-usage workspace lockfile are committed:
# the workspace ships binaries (example-usage/*) and a committed lockfile keeps
# their builds reproducible. Workspace members do not own a lockfile (the root
# one governs them); ignore any stray per-member lockfiles so they are not
# committed by accident.
/client/Cargo.lock
/codec/Cargo.lock
/common/Cargo.lock
/crypto/Cargo.lock
/host/Cargo.lock
/transport/Cargo.lock
/type-map/Cargo.lock
/wasm/Cargo.lock

7
client/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "client"
version = "0.1.0"

91
codec/Cargo.lock generated Normal file
View file

@ -0,0 +1,91 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chacha20"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
dependencies = [
"cfg-if",
"cpufeatures",
"rand_core",
]
[[package]]
name = "cpufeatures"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
dependencies = [
"libc",
]
[[package]]
name = "getrandom"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"rand_core",
]
[[package]]
name = "libc"
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "mtp-codec"
version = "0.1.0"
dependencies = [
"base64",
"byteorder",
"rand",
]
[[package]]
name = "r-efi"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "rand"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
dependencies = [
"chacha20",
"getrandom",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"

16
common/Cargo.lock generated Normal file
View file

@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "common"
version = "0.1.0"
quinn = { version = "0.11.9", default-features = false, features = [
"rustls-aws-lc-rs",
"rustls",
] }
wtransport = { version = "0.7.1", default-features = false, features = [
"aws-lc-rs",
"quinn",
"self-signed",
] }

7
crypto/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "crypto"
version = "0.1.0"

7
host/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "host"
version = "0.1.0"

7
transport/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "transport"
version = "0.1.0"

7
type-map/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "type-map"
version = "0.1.0"

282
wasm/pkg/mtp_wasm.d.ts vendored Normal file
View file

@ -0,0 +1,282 @@
/* tslint:disable */
/* eslint-disable */
export class ConnectionConfig {
free(): void;
[Symbol.dispose](): void;
constructor(url: string);
client_id: bigint;
set server_certificate_hashes(value: string[]);
readonly url: string;
}
export enum ConnectionState {
Disconnected = 0,
Connecting = 1,
Connected = 2,
Failed = 3,
}
export class WasmChaCha20Poly1305 {
free(): void;
[Symbol.dispose](): void;
/**
* Decrypt `nonce || ciphertext` with `aad`.
*/
decrypt(ciphertext: Uint8Array, aad: Uint8Array): Uint8Array;
/**
* Encrypt `plaintext` with `aad`.
* Returns `nonce || ciphertext`.
*/
encrypt(plaintext: Uint8Array, aad: Uint8Array): Uint8Array;
/**
* Create a new cipher with a 32-byte key.
*/
constructor(key: Uint8Array);
}
export class WasmClient {
free(): void;
[Symbol.dispose](): void;
/**
* Authenticated login with an existing client ID.
* Exchanges Identification + signatures and verifies the host response.
*
* - `host_public_key_bytes`: serialized PublicKeyBundle from the server
* - `keyring_bytes`: serialized Keyring of this client (must match `client_id`)
* - `client_id`: previously assigned client ID
*
* Returns the confirmed (same) client ID on success.
*/
auth_connect(config: ConnectionConfig, host_public_key_bytes: Uint8Array, keyring_bytes: Uint8Array, client_id: bigint): Promise<bigint>;
/**
* Authenticated registration with a fresh keyring.
* The server assigns a new client ID.
*
* - `host_public_key_bytes`: serialized PublicKeyBundle from the server
* - `keyring_bytes`: serialized Keyring (must include ed25519 secret key)
*
* Returns the newly assigned client ID.
*/
auth_register(config: ConnectionConfig, host_public_key_bytes: Uint8Array, keyring_bytes: Uint8Array): Promise<bigint>;
/**
* Unauthenticated connect (sends basic Identification, enables receive loop).
*/
connect(config: ConnectionConfig): Promise<void>;
disconnect(): void;
static is_supported(): boolean;
constructor(on_state_change: Function, on_message: Function, on_error: Function);
send(frame: Uint8Array): Promise<void>;
readonly state: number;
}
export class WasmEd25519Signer {
free(): void;
[Symbol.dispose](): void;
/**
* Load a signer from its 32-byte secret key.
*/
constructor(secret_key: Uint8Array);
/**
* Sign `message` and return the signature bytes.
*/
sign(message: Uint8Array): Uint8Array;
/**
* Verify `signature` against `message`.
*/
verify(message: Uint8Array, signature: Uint8Array): void;
}
export class WasmKeyring {
private constructor();
free(): void;
[Symbol.dispose](): void;
/**
* Deserialise a keyring from bytes.
*/
static from_bytes(bytes: Uint8Array): WasmKeyring;
/**
* Return the public half of this keyring as a bundle.
*/
public_key_bundle(): WasmPublicKeyBundle;
/**
* Serialise the keyring to bytes.
*/
to_bytes(): Uint8Array;
}
export class WasmPublicKeyBundle {
private constructor();
free(): void;
[Symbol.dispose](): void;
static from_bytes(bytes: Uint8Array): WasmPublicKeyBundle;
to_bytes(): Uint8Array;
readonly kem_public_key: Uint8Array;
readonly sig_cl_public_key: Uint8Array;
readonly sig_pq_public_key: Uint8Array;
}
/**
* Build a demo Ping frame with encrypted and signed containers
* (mirrors the Rust client example but uses only reserved data types).
*/
export function build_demo_message(client_id: bigint, keyring_bytes: Uint8Array, host_bundle_bytes: Uint8Array): Uint8Array;
/**
* Build a simple Ping frame with description, timestamp, and optional data.
*/
export function build_ping_frame(client_id: bigint, description: string, timestamp: bigint, data: Uint8Array): Uint8Array;
/**
* Build a request frame with the given communication type name, request ID, and JSON data.
*
* - `comm_type`: communication type name (e.g. "get_model", "rank_models") or PascalCase
* - `id`: request ID for response correlation
* - `json_data`: JSON-stringified request payload
*/
export function build_request_frame(comm_type: string, id: number, json_data: string): Uint8Array;
/**
* Generate a fresh Ed25519 keypair.
*
* Returns `{ signer: WasmEd25519Signer, secretKey: Uint8Array, publicKey: Uint8Array }`.
*/
export function ed25519_generate(): any;
/**
* Standalone Ed25519 signature verification.
*/
export function ed25519_verify(public_key: Uint8Array, message: Uint8Array, signature: Uint8Array): void;
/**
* Parse any MTP frame into the human-readable CommunicationValue display form.
*/
export function format_frame(frame: Uint8Array): string;
/**
* Build a [`Keyring`] containing only an Ed25519 keypair (no KEM, no ML-DSA).
*
* Takes the Ed25519 secret key and public key, each 32 bytes.
* Returns the serialised keyring bytes, suitable for passing to `WasmClient.auth_register`.
*/
export function keyring_from_ed25519(secret_key: Uint8Array, public_key: Uint8Array): Uint8Array;
export function main(): void;
/**
* Parse an auth response frame into a JS object.
*/
export function parse_auth_response(response: Uint8Array): any;
/**
* Parse a response frame into a JSON string containing `_id`, `_type`, and data fields.
*/
export function parse_response_frame(frame: Uint8Array): string;
/**
* Derive a 32-byte encryption key from `ikm` with `salt` and `context`.
*/
export function wasm_derive_encryption_key(ikm: Uint8Array, salt: Uint8Array, context: Uint8Array): Uint8Array;
/**
* HKDF-expand: derive `len` bytes from `ikm` with `salt` and `info`.
*/
export function wasm_hkdf_expand(ikm: Uint8Array, salt: Uint8Array, info: Uint8Array, len: number): Uint8Array;
/**
* SHA-256 digest.
*/
export function wasm_sha256(data: Uint8Array): Uint8Array;
/**
* Double SHA-256 (SHA-256 applied twice).
*/
export function wasm_sha256_double(data: Uint8Array): Uint8Array;
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly __wbg_wasmchacha20poly1305_free: (a: number, b: number) => void;
readonly __wbg_wasmed25519signer_free: (a: number, b: number) => void;
readonly __wbg_wasmkeyring_free: (a: number, b: number) => void;
readonly __wbg_wasmpublickeybundle_free: (a: number, b: number) => void;
readonly ed25519_generate: () => [number, number, number];
readonly ed25519_verify: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
readonly keyring_from_ed25519: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly wasm_derive_encryption_key: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly wasm_hkdf_expand: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
readonly wasm_sha256: (a: number, b: number) => [number, number];
readonly wasm_sha256_double: (a: number, b: number) => [number, number];
readonly wasmchacha20poly1305_decrypt: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
readonly wasmchacha20poly1305_encrypt: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
readonly wasmchacha20poly1305_new: (a: number, b: number) => [number, number, number];
readonly wasmed25519signer_new: (a: number, b: number) => [number, number, number];
readonly wasmed25519signer_sign: (a: number, b: number, c: number) => [number, number, number, number];
readonly wasmed25519signer_verify: (a: number, b: number, c: number, d: number, e: number) => [number, number];
readonly wasmkeyring_from_bytes: (a: number, b: number) => [number, number, number];
readonly wasmkeyring_public_key_bundle: (a: number) => number;
readonly wasmkeyring_to_bytes: (a: number) => [number, number];
readonly wasmpublickeybundle_from_bytes: (a: number, b: number) => [number, number, number];
readonly wasmpublickeybundle_kem_public_key: (a: number) => [number, number];
readonly wasmpublickeybundle_sig_cl_public_key: (a: number) => [number, number];
readonly wasmpublickeybundle_sig_pq_public_key: (a: number) => [number, number];
readonly wasmpublickeybundle_to_bytes: (a: number) => [number, number];
readonly build_demo_message: (a: bigint, b: number, c: number, d: number, e: number) => [number, number, number, number];
readonly build_ping_frame: (a: bigint, b: number, c: number, d: bigint, e: number, f: number) => [number, number, number, number];
readonly build_request_frame: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
readonly format_frame: (a: number, b: number) => [number, number, number, number];
readonly parse_auth_response: (a: number, b: number) => [number, number, number];
readonly parse_response_frame: (a: number, b: number) => [number, number, number, number];
readonly main: () => void;
readonly __wbg_connectionconfig_free: (a: number, b: number) => void;
readonly __wbg_wasmclient_free: (a: number, b: number) => void;
readonly connectionconfig_client_id: (a: number) => bigint;
readonly connectionconfig_new: (a: number, b: number) => number;
readonly connectionconfig_set_client_id: (a: number, b: bigint) => void;
readonly connectionconfig_set_server_certificate_hashes: (a: number, b: number, c: number) => void;
readonly connectionconfig_url: (a: number) => [number, number];
readonly wasmclient_auth_connect: (a: number, b: number, c: number, d: number, e: number, f: number, g: bigint) => any;
readonly wasmclient_auth_register: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
readonly wasmclient_connect: (a: number, b: number) => any;
readonly wasmclient_disconnect: (a: number) => void;
readonly wasmclient_is_supported: () => number;
readonly wasmclient_new: (a: any, b: any, c: any) => number;
readonly wasmclient_send: (a: number, b: number, c: number) => any;
readonly wasmclient_state: (a: number) => number;
readonly wasm_bindgen__convert__closures_____invoke__h6588d25cdde23584: (a: number, b: number, c: any) => [number, number];
readonly wasm_bindgen__convert__closures_____invoke__h5c81efa430e34369: (a: number, b: number, c: any) => [number, number];
readonly wasm_bindgen__convert__closures_____invoke__h5c81efa430e34369_2: (a: number, b: number, c: any) => [number, number];
readonly wasm_bindgen__convert__closures_____invoke__h4bf2427f775cf424: (a: number, b: number, c: any, d: any) => void;
readonly __wbindgen_malloc: (a: number, b: number) => number;
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
readonly __wbindgen_exn_store: (a: number) => void;
readonly __externref_table_alloc: () => number;
readonly __wbindgen_externrefs: WebAssembly.Table;
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
readonly __wbindgen_destroy_closure: (a: number, b: number) => void;
readonly __externref_table_dealloc: (a: number) => void;
readonly __wbindgen_start: () => void;
}
export type SyncInitInput = BufferSource | WebAssembly.Module;
/**
* Instantiates the given `module`, which can either be bytes or
* a precompiled `WebAssembly.Module`.
*
* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
*
* @returns {InitOutput}
*/
export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
/**
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
* for everything else, calls `WebAssembly.instantiate` directly.
*
* @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
*
* @returns {Promise<InitOutput>}
*/
export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;

1412
wasm/pkg/mtp_wasm.js Normal file

File diff suppressed because it is too large Load diff

BIN
wasm/pkg/mtp_wasm_bg.wasm Normal file

Binary file not shown.

63
wasm/pkg/mtp_wasm_bg.wasm.d.ts vendored Normal file
View file

@ -0,0 +1,63 @@
/* tslint:disable */
/* eslint-disable */
export const memory: WebAssembly.Memory;
export const __wbg_wasmchacha20poly1305_free: (a: number, b: number) => void;
export const __wbg_wasmed25519signer_free: (a: number, b: number) => void;
export const __wbg_wasmkeyring_free: (a: number, b: number) => void;
export const __wbg_wasmpublickeybundle_free: (a: number, b: number) => void;
export const ed25519_generate: () => [number, number, number];
export const ed25519_verify: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
export const keyring_from_ed25519: (a: number, b: number, c: number, d: number) => [number, number, number, number];
export const wasm_derive_encryption_key: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
export const wasm_hkdf_expand: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
export const wasm_sha256: (a: number, b: number) => [number, number];
export const wasm_sha256_double: (a: number, b: number) => [number, number];
export const wasmchacha20poly1305_decrypt: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
export const wasmchacha20poly1305_encrypt: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
export const wasmchacha20poly1305_new: (a: number, b: number) => [number, number, number];
export const wasmed25519signer_new: (a: number, b: number) => [number, number, number];
export const wasmed25519signer_sign: (a: number, b: number, c: number) => [number, number, number, number];
export const wasmed25519signer_verify: (a: number, b: number, c: number, d: number, e: number) => [number, number];
export const wasmkeyring_from_bytes: (a: number, b: number) => [number, number, number];
export const wasmkeyring_public_key_bundle: (a: number) => number;
export const wasmkeyring_to_bytes: (a: number) => [number, number];
export const wasmpublickeybundle_from_bytes: (a: number, b: number) => [number, number, number];
export const wasmpublickeybundle_kem_public_key: (a: number) => [number, number];
export const wasmpublickeybundle_sig_cl_public_key: (a: number) => [number, number];
export const wasmpublickeybundle_sig_pq_public_key: (a: number) => [number, number];
export const wasmpublickeybundle_to_bytes: (a: number) => [number, number];
export const build_demo_message: (a: bigint, b: number, c: number, d: number, e: number) => [number, number, number, number];
export const build_ping_frame: (a: bigint, b: number, c: number, d: bigint, e: number, f: number) => [number, number, number, number];
export const build_request_frame: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
export const format_frame: (a: number, b: number) => [number, number, number, number];
export const parse_auth_response: (a: number, b: number) => [number, number, number];
export const parse_response_frame: (a: number, b: number) => [number, number, number, number];
export const main: () => void;
export const __wbg_connectionconfig_free: (a: number, b: number) => void;
export const __wbg_wasmclient_free: (a: number, b: number) => void;
export const connectionconfig_client_id: (a: number) => bigint;
export const connectionconfig_new: (a: number, b: number) => number;
export const connectionconfig_set_client_id: (a: number, b: bigint) => void;
export const connectionconfig_set_server_certificate_hashes: (a: number, b: number, c: number) => void;
export const connectionconfig_url: (a: number) => [number, number];
export const wasmclient_auth_connect: (a: number, b: number, c: number, d: number, e: number, f: number, g: bigint) => any;
export const wasmclient_auth_register: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
export const wasmclient_connect: (a: number, b: number) => any;
export const wasmclient_disconnect: (a: number) => void;
export const wasmclient_is_supported: () => number;
export const wasmclient_new: (a: any, b: any, c: any) => number;
export const wasmclient_send: (a: number, b: number, c: number) => any;
export const wasmclient_state: (a: number) => number;
export const wasm_bindgen__convert__closures_____invoke__h6588d25cdde23584: (a: number, b: number, c: any) => [number, number];
export const wasm_bindgen__convert__closures_____invoke__h5c81efa430e34369: (a: number, b: number, c: any) => [number, number];
export const wasm_bindgen__convert__closures_____invoke__h5c81efa430e34369_2: (a: number, b: number, c: any) => [number, number];
export const wasm_bindgen__convert__closures_____invoke__h4bf2427f775cf424: (a: number, b: number, c: any, d: any) => void;
export const __wbindgen_malloc: (a: number, b: number) => number;
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
export const __wbindgen_exn_store: (a: number) => void;
export const __externref_table_alloc: () => number;
export const __wbindgen_externrefs: WebAssembly.Table;
export const __wbindgen_free: (a: number, b: number, c: number) => void;
export const __wbindgen_destroy_closure: (a: number, b: number) => void;
export const __externref_table_dealloc: (a: number) => void;
export const __wbindgen_start: () => void;

15
wasm/pkg/package.json Normal file
View file

@ -0,0 +1,15 @@
{
"name": "mtp-wasm",
"type": "module",
"version": "0.1.0",
"files": [
"mtp_wasm_bg.wasm",
"mtp_wasm.js",
"mtp_wasm.d.ts"
],
"main": "mtp_wasm.js",
"types": "mtp_wasm.d.ts",
"sideEffects": [
"./snippets/*"
]
}