@tangle-js/ld-proofs
Version:
Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams
58 lines • 5.29 kB
JavaScript
/* 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