vetKD API
View this sample's code on GitHub
This repository provides a canister (src/system_api
) that offers the vetKD system API proposed in https://github.com/dfinity/interface-spec/pull/158, implemented in an unsafe manner for demonstration purposes.
Additionally, the repository provides:
An example app backend canister (
src/app_backend
) implemented in Motoko that makes use of this system API in order to provide caller-specific symmetric keys that can be used for AES encryption and decryption.An example frontend (
src/app_frontend_js
) that uses the backend from Javascript in the browser.The frontend uses the ic-vetkd-utils to create a transport key pair that is used to obtain a verifiably encrypted key from the system API, to decrypt this key, and to derive a symmetric key to be used for AES encryption/decryption.
Because the
ic-vetkd-utils
are not yet published as NPM package at npmjs.com, a respective package file (ic-vetkd-utils-0.1.0.tgz
) is included in this repository.
Disclaimer
The implementation of the proposed vetKD system API used in this example is unsafe, e.g., we hard-code a master secret key, rather than using a master secret key that is distributed among sufficiently many Internet Computer nodes through distributed key generation. Do not use this in production or for sensitive data! This example is solely provided for demonstration purposes to collect feedback on the mentioned vetKD system API. See also the respective disclaimer in the system API canister implementation.
Prerequisites
- Install the IC SDK.
- Install Node.js.
- Install Rust, and add Wasm as a target (
rustup target add wasm32-unknown-unknown
). Note that Rust is only needed for compiling the (insecure) canister offering the vetKD system API, which later would be directly integrated into ICP. - Clone the example dapp project:
git clone https://github.com/dfinity/examples
Running locally
Step 1: Start a local replica:
dfx start
Step 2: Open a new terminal window.
Step 3: Ensure
dfx
uses the canister IDs that are hard-coded in the Rust source code:
cd examples/motoko/vetkd
dfx canister create system_api --specified-id s55qq-oqaaa-aaaaa-aaakq-cai
Without this, dfx
may use different canister IDs for the system_api
and app_backend
canisters in your local environment.
Step 4: Ensure that the required node modules are available in your project directory, if needed, by running the following command:
npm install
Step 5: Register, build, and deploy the project:
dfx deploy
This command should finish successfully with output similar to the following one:
Deployed canisters.
URLs:
Frontend canister via browser
app_frontend_js: http://127.0.0.1:4943/?canisterId=by6od-j4aaa-aaaaa-qaadq-cai
Backend canister via Candid interface:
app_backend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=tcvdh-niaaa-aaaaa-aaaoa-cai
app_frontend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=b77ix-eeaaa-aaaaa-qaada-cai
system_api: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=s55qq-oqaaa-aaaaa-aaakq-cai
Step 6: Open the printed URL for the
app_frontend_js
in your browser.