@tangle-js/ld-proofs
Version:
Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams
97 lines • 7.76 kB
JavaScript
/* eslint-disable jsdoc/require-jsdoc */
import { VerificationMethod, MethodScope, ProofOptions, VerifierOptions } from "@iota/identity-wasm/node/identity_wasm.js";
import { SeedHelper } from "@tangle-js/anchors";
import LdProofError from "../errors/ldProofError.mjs";
import LdProofErrorNames from "../errors/ldProofErrorNames.mjs";
import { IdentityHelper } from "../helpers/identityHelper.mjs";
export default class DidService {
/**
* Resolves the DID.
* @param node Node against the DID is resolved.
* @param did DID to be resolved.
* @returns The DID Document resolved from Tangle.
*/
static async resolve(node, did) {
let doc;
try {
const identityClient = await IdentityHelper.getClient(node);
const resolution = await identityClient.resolve(did);
doc = resolution.document();
}
catch {
throw new LdProofError(LdProofErrorNames.DID_NOT_FOUND, "DID cannot be resolved");
}
try {
doc.verifyDocument(doc);
}
catch {
throw new LdProofError(LdProofErrorNames.DID_NOT_VERIFIED, "DID cannot be verified");
}
return doc;
}
/**
* Resolves the DID verification method.
* @param node Node against the DID is resolved.
* @param didMethod DID method to be resolved. It must include a hash fragment.
* @returns The DID Document resolved from Tangle.
*/
static async resolveMethod(node, didMethod) {
let didDocument;
try {
didDocument = await this.resolve(node, didMethod.split("#")[0]);
}
catch {
throw new LdProofError(LdProofErrorNames.DID_NOT_FOUND, "DID cannot be resolved");
}
// eslint-disable-next-line new-cap
const method = didDocument.resolveMethod(didMethod, MethodScope.VerificationMethod());
if (!method) {
throw new LdProofError(LdProofErrorNames.VERIFICATION_METHOD_NOT_FOUND, "Verification Method cannot be found");
}
return method;
}
/**
* Verifies that the secret really corresponds to the verification method.
*
* @param didDocument DID document.
* @param method The method (expressed as a fragment identifier).
* @param secret The private key.
* @returns True if verified false if not.
*/
static async verifyOwnership(didDocument, method, secret) {
// First we verify if the method really exists on the DID
// eslint-disable-next-line new-cap
const scope = MethodScope.VerificationMethod();
const methodObj = didDocument.resolveMethod(`${didDocument.id()}#${method}`, scope);
if (!methodObj) {
throw new LdProofError(LdProofErrorNames.VERIFICATION_METHOD_NOT_FOUND, "The DID verification method supplied has not been found");
}
try {
const verificationData = { "testData": SeedHelper.generateSeed(10) };
const signature = await didDocument.signData(verificationData, secret, `${didDocument.id()}#${method}`, ProofOptions.default());
return didDocument.verifyData(signature, VerifierOptions.default());
}
catch {
throw new LdProofError(LdProofErrorNames.INVALID_SIGNING_KEY, "The key supplied is not valid");
}
}
/**
* Extracts the public key from the verification method.
* Only tolerates Base58 public keys.
* @param verificationMethod The Verification Method.
* @returns The public key in Base 58.
* @throws LdProofError if Verification Method does not comply.
*/
static extractPublicKey(verificationMethod) {
const verMethod = verificationMethod.toJSON();
const publicKeyMultibase = verMethod.publicKeyMultibase;
if (!publicKeyMultibase) {
throw new LdProofError(LdProofErrorNames.INVALID_VERIFICATION_METHOD, "Only multibase keys are supported");
}
if (!publicKeyMultibase.startsWith("z")) {
throw new LdProofError(LdProofErrorNames.INVALID_VERIFICATION_METHOD, "Only multibase keys Base 58 are supported");
}
return publicKeyMultibase.slice(1);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlkU2VydmljZS5tanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZGlkU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFFeEMsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLGlCQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRCxNQUFNLENBQUMsT0FBTyxPQUFPLFVBQVU7SUFDM0I7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUNqRCxJQUFJLEdBQWdCLENBQUM7UUFDckIsSUFBSTtZQUNBLE1BQU0sY0FBYyxHQUFHLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU1RCxNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckQsR0FBRyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUMvQjtRQUFDLE1BQU07WUFDSixNQUFNLElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFDbEQsd0JBQXdCLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUk7WUFDQSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBQUMsTUFBTTtZQUNKLE1BQU0sSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQ3JELHdCQUF3QixDQUFDLENBQUM7U0FDakM7UUFDRCxPQUFPLEdBQUcs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