did:key
methodThis crate is intended to provide basic support for did:key
methods. It has no external dependencies and can be compiled for any target.
It was originally designed for use with DIDComm Extension for gRPC, but we recognized it may be useful if this was an independent library.
Originally donated to DIF by Trinsic. Ongoing management and governance done through the Identifier and Discovery WG.
rust
did-key = "0.0.4"
To resolve a did formatted URI:
```rust use did_key::*;
let key = resolve("did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL").unwrap();
```
Generate new key:
```rust
let key = generate::
println!("{}", key.fingerprint()); ```
Sign and verify:
```rust
let key = generate::
let signature = key.sign(Payload::Buffer(message.tovec())); let valid = key.verify(Payload::Buffer(message.tovec()), &signature);
assert!(valid); ```
Create DID Document
```rust
let key = generate::
let docjson = serdejson::tostringpretty(&did_doc).unwrap(); ```
The default json format for key data is JSON-LD. To serialize a document using JOSE key format (using JWK), configure the input
parameter or use one of the static configurations ex. CONFIG_JOSE_PUBLIC
.
```rust let diddoc = key.getdiddocument(Config { usejoseformat: true, // toggle to switch between LD and JOSE key format serializesecrets: false // toggle to serialize private keys });
// or use predefined configs
let diddoc = key.getdiddocument(CONFIGJOSE_PUBLIC); ```
Example JSON-LD output
json
{
"@context": "https://www.w3.org/ns/did/v1",
"id": "did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL",
"assertionMethod": [
"did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL"
],
"authentication": [
"did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL"
],
"capabilityDelegation": [
"did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL"
],
"capabilityInvocation": [
"did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL"
],
"keyAgreement": [
"did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6LSrdqo4M24WRDJj1h2hXxgtDTyzjjKCiyapYVgrhwZAySn"
],
"verificationMethod": [
{
"id": "did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL",
"type": "Ed25519VerificationKey2018",
"controller": "did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL",
"publicKeyBase58": "6fioC1zcDPyPEL19pXRS2E4iJ46zH7xP6uSgAaPdwDrx"
},
{
"id": "did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL#z6LSrdqo4M24WRDJj1h2hXxgtDTyzjjKCiyapYVgrhwZAySn",
"type": "X25519KeyAgreementKey2019",
"controller": "did:key:z6Mkk7yqnGF3YwTrLpqrW6PGsKci7dNqh1CjnvMbzrMerSeL",
"publicKeyBase58": "FxfdY3DCQxVZddKGAtSjZdFW9bCCW7oRwZn1NFJ2Tbg2"
}
]
}
Example JSON output
json
{
"@context": "https://www.w3.org/ns/did/v1",
"id": "did:key:z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2",
"keyAgreement": [
"did:key:z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2#z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2"
],
"verificationMethod": [
{
"id": "did:key:z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2#z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2",
"controller": "did:key:z6LSfaBhhoYmAMX11m9xYCaeaU99KPtYnzHpsWD6iNWbJDr2",
"type": "JsonWebKey2020",
"publicKeyJwk": {
"kty": "OKP",
"crv": "X25519",
"x": "OeXe54Y0Dnk0WNWsQ6PqKUBB2x6bos0DZ_WkdFNdt3M"
}
}
]
}
Crate includes some basic benchmarks for key generation and exchange comparison, using criterion
. To run the benchmarks:
bash
cargo bench
...are most welcome! 🙌