UNPKG

@tangle-js/ld-proofs

Version:

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

58 lines 5.29 kB
/* eslint-disable jsdoc/require-jsdoc */ import { MethodScope } from "@iota/identity-wasm/node/identity_wasm.js"; import bs58 from "bs58"; import pkg from "elliptic"; import LdProofError from "../errors/ldProofError.mjs"; import LdProofErrorNames from "../errors/ldProofErrorNames.mjs"; import DidService from "./didService.mjs"; // eslint-disable-next-line @typescript-eslint/naming-convention const { eddsa: EdDSA } = pkg; export default class SigningService { /** * Signs the message using the identity and method specified. * * It uses the Ed25519 as the signature algorithm and the hash algorithm passed as parameter. * * @param request Signing Request. * @returns The signature details. */ static async sign(request) { const didDocument = request.didDocument; // eslint-disable-next-line new-cap const scope = MethodScope.VerificationMethod(); const methodDocument = didDocument.resolveMethod(`${didDocument.id()}#${request.method}`, scope); if (!methodDocument) { throw new LdProofError(LdProofErrorNames.VERIFICATION_METHOD_NOT_FOUND, "The verification method has not been found on the DID Document"); } if (methodDocument.type().toString() !== "Ed25519VerificationKey2018") { throw new LdProofError(LdProofErrorNames.INVALID_VERIFICATION_METHOD, "Only 'Ed25519VerificationKey2018' verification methods are allowed"); } const proofedOwnership = await DidService.verifyOwnership(request.didDocument, request.method, request.secret); if (!proofedOwnership) { throw new LdProofError(LdProofErrorNames.INVALID_SIGNING_KEY, "The secret key supplied does not correspond to the verification method"); } const signatureValue = this.calculateSignature(request.secret, request.message); const response = { created: new Date().toISOString(), verificationMethod: `${didDocument.id()}#${request.method}`, signatureValue }; return response; } /** * Calculates the signature. * @param privateKey Private key. * @param message Message to be signed. * @returns The signature value. */ static calculateSignature(privateKey, message) { const ed25519 = new EdDSA("ed25519"); const ecKey = ed25519.keyFromSecret(Buffer.from(privateKey).toString("hex"), "hex"); const signatureHex = ecKey.sign(message).toHex(); // Final conversion to B58 // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const signature = bs58.encode(Buffer.from(signatureHex, "hex")); return signature; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmluZ1NlcnZpY2UubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3NpZ25pbmdTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdDQUF3QztBQUV4QyxPQUFPLEVBQTJCLFdBQVcsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pHLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDM0IsT0FBTyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxpQkFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUc1RCxPQUFPLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFFdEMsZ0VBQWdFO0FBQ2hFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBRTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sY0FBYztJQUMvQjs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBd0I7UUFDN0MsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUV4QyxtQ0FBbUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxjQUFjLEdBQXVCLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JILElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDakIsTUFBTSxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsRUFDbEUsZ0VBQWdFLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLDRCQUE0QixFQUFFO1lBQ25FLE1BQU0sSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLEVBQ2hFLG9FQUFvRSxDQUFDLENBQUM7U0FDN0U7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sVUFBVSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUN6RSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFDeEQsd0VBQXdFLENBQUMsQ0FBQztTQUNqRjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVoRixNQUFNLFFBQVEsR0FBbUI7WUFDN0IsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2pDLGtCQUFrQixFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDM0QsY0FBYztTQUNqQixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLGtCQUFrQixDQUFDLFVBQXNCLEVBQUUsT0FBZTtRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBGLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFakQsMEJBQTBCO1FBQzFCLGlFQUFpRTtRQUNqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEUsT0FBTyxTQUFtQixDQUFDO0lBQy9CLENBQUM7Q0FDSiJ9