UNPKG

@tangle-js/ld-proofs

Version:

Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams

97 lines 7.76 kB
/* 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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