@tangle-js/ld-proofs
Version:
Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams
158 lines (125 loc) • 6.09 kB
Markdown
`ld-proofs` enables Linked Data Proofs on the Tangle. Powered by [IOTA Identity](https://github.com/iotaledger/identity.rs) and [IOTA Streams](https://github.com/iotaledger/streams). This library also works on the Browser so that you can verify data locally.
Please check the [web examples](../../examples/web).
[](https://github.com/iotaledger/tangle.js/actions/workflows/proofs-test.yaml)
[](https://www.npmjs.com/package/@tangle-js/ld-proofs)
```sh
npm install @tangle-js/ld-proofs
```
Aligned with the [W3C Linked Data Proofs](https://w3c-ccg.github.io/ld-proofs/) proposed specification this library allows the generation and verification of Linked Data Proofs associated to plain messages or JSON(-LD) documents. Different kinds of Linked Data Proofs can be generated:
* EdDSA (Ed25519) Signatures over plain messages
* Linked Data Signatures for JSON-LD Documents [Ed25519Signature2018](https://w3c-ccg.github.io/lds-ed25519-2018/)
* Linked Data Signatures for JSON Documents [JcsEd25519Signature2020](https://identity.foundation/JcsEd25519Signature2020/)
* Linked Data Proofs anchored to the Tangle (using the [anchors](../anchors) library). The proof's type is `IotaLinkedDataProof2021`. This type of proof anchors to the Tangle a Linked Data Signature together with a reference to the signed document.
The identities and their corresponding public key materials follow the [W3C DID](https://www.w3.org/TR/did-core/) specification.
## API
### Linked Data Signature generation (Ed25519 over JSON(-LD))
```ts
const did = "did:iota:2pu42SstXrg7uMEGHS5qkBDEJ1hrbrYtWQReMUvkCrDP";
// Default node is IF Chrysalis Nodes
const signer = await IotaSigner.create(did, node?);
const jsonLdDocument = {
"@context": "https://schema.org",
"type": "Organization",
"name": "IOTA Foundation"
};
const options: ISigningOptions = {
// The verification method must exist within the "verificationMethod" scope of the DID
verificationMethod,
// Secret can be Uint8Array or Base58 string
secret: privateKey,
signatureType: SignatureTypes.ED25519_2018
};
// Obtains a Linked Data Signature
const ldSignature = signer.signJson(jsonLdDocument, options);
```
```ts
// The document includes the former document and the Linked Data Signature
const signedDoc = {
"@context": "https://schema.org",
"type": "Organization",
"name": "IOTA Foundation",
"proof": {
"proofValue": "3JTS3UaJc2aS2rxkQ1Z4GEs9HjvASnm3e2s5VT5pS8voGEBodWBBd6P7YUmq8eN92H9v1u2gmqER7Y6wXhgcywYX",
"type": "Ed25519Signature2018",
"verificationMethod": "did:iota:2pu42SstXrg7uMEGHS5qkBDEJ1hrbrYtWQReMUvkCrDP#key",
"proofPurpose": "dataVerification",
"created": "2021-06-21T13:29:25.976Z"
}
};
// True if verified. False otherwise.
const verified = await IotaVerifier.verifyJson(signedDoc);
```
See the [anchors](../anchors) library and the `IotaSigner` class.
```ts
const anchorChannel = /* Instantiate an anchoring channel */
const signer = /* Instantiate a signer */
const proofGenerator = IotaLdProofGenerator.create(anchoringChannel, signer);
// Generates the Linked Data Signature and anchors it to the Tangle generating
// an Iota proof
const tangleProof = await proofGenerator.generate(jsonLdDocument, {
// The verification method must exist within the "verificationMethod" scope of the DID
verificationMethod,
// Secret can be Base58 string o Uint8Array
secret,
signatureType: SignatureTypes.ED25519_2018,
anchorageID: anchoringChannel.firstAnchorageID
});
```
```ts
const anchoredDoc = {
"@context": "https://schema.org",
"type": "Organization",
"name": "IOTA Foundation",
"proof": {
"type": "IotaLinkedDataProof2021",
"verificationMethod": "did:iota:yUxEqDGgL2WF4sQq2TEzdmDjDkRsHKL5TcLWrdAjmb4",
"proofPurpose": "dataVerification",
"proofValue": {
"channelID": "1761e16e50dd6c95f7155979b5691b0a4390559f6ff0287a297cc2ae818312c40000000000000000:7bc48fb8fe5dccdb81dd5dcd",
"anchorageID": "e7b123ed4c6a803538a52233",
"msgID": "1fa6dde995dd6320bc0f7958",
"msgIDL1": "e5b1edf2935329e6dd04692e9ec37581b9fcc5954e5f8450e7f9306933a6e2d5"
},
"created": "2021-07-01T10:21:50.338Z"
}
};
const verified = await IotaLdProofVerifier.verifyJson(anchoredDoc);
```
Only EdDSA (Ed25519) is supported.
```ts
// The node is optional and by default will be IF mainnet nodes
const node = "https://chrysalis-nodes.iota.org";
// The DID contains the public cryptographic materials used by the signer
const did = "did:iota:2pu42SstXrg7uMEGHS5qkBDEJ1hrbrYtWQReMUvkCrDP";
const signer = await IotaSigner.create(did);
// Plain message to be signed
const message = "hello";
// Method declared on the signer's concerned DID document
const method = "key";
// Private Key in base58. Also it is accepted as Uint8Array
const privateKey = "privateKeybase58";
const options: ISigningOptions = {
signatureType: SignatureTypes.PLAIN_ED25519,
// The verification method must exist within the "verificationMethod" scope of the DID
verificationMethod: method,
secret: privateKey
};
const signingResult = await signer.sign(Buffer.from(message), options);
console.log("Signature: ", signingResult.signatureValue);
```
```ts
const options: IVerificationOptions = {
verificationMethod: "did:iota:2pu42SstXrg7uMEGHS5qkBDEJ1hrbrYtWQReMUvkCrDP#key",
// Node is optional and it is IOTA's mainnet by default
node: "https://chrysalis-nodes.iota.org"
};
const verified = await IotaVerifier.verify(message, signatureValue, options);
```