• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3    return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.Key = void 0;
7const util_1 = __importDefault(require("util"));
8const error_1 = require("./error");
9const utils_1 = require("./utils");
10const key_1 = require("./utils/key");
11// A container class representing the public portion of a Key.
12class Key {
13    constructor(options) {
14        const { keyID, keyType, scheme, keyVal, unrecognizedFields } = options;
15        this.keyID = keyID;
16        this.keyType = keyType;
17        this.scheme = scheme;
18        this.keyVal = keyVal;
19        this.unrecognizedFields = unrecognizedFields || {};
20    }
21    // Verifies the that the metadata.signatures contains a signature made with
22    // this key and is correctly signed.
23    verifySignature(metadata) {
24        const signature = metadata.signatures[this.keyID];
25        if (!signature)
26            throw new error_1.UnsignedMetadataError('no signature for key found in metadata');
27        if (!this.keyVal.public)
28            throw new error_1.UnsignedMetadataError('no public key found');
29        const publicKey = (0, key_1.getPublicKey)({
30            keyType: this.keyType,
31            scheme: this.scheme,
32            keyVal: this.keyVal.public,
33        });
34        const signedData = metadata.signed.toJSON();
35        try {
36            if (!utils_1.crypto.verifySignature(signedData, publicKey, signature.sig)) {
37                throw new error_1.UnsignedMetadataError(`failed to verify ${this.keyID} signature`);
38            }
39        }
40        catch (error) {
41            if (error instanceof error_1.UnsignedMetadataError) {
42                throw error;
43            }
44            throw new error_1.UnsignedMetadataError(`failed to verify ${this.keyID} signature`);
45        }
46    }
47    equals(other) {
48        if (!(other instanceof Key)) {
49            return false;
50        }
51        return (this.keyID === other.keyID &&
52            this.keyType === other.keyType &&
53            this.scheme === other.scheme &&
54            util_1.default.isDeepStrictEqual(this.keyVal, other.keyVal) &&
55            util_1.default.isDeepStrictEqual(this.unrecognizedFields, other.unrecognizedFields));
56    }
57    toJSON() {
58        return {
59            keytype: this.keyType,
60            scheme: this.scheme,
61            keyval: this.keyVal,
62            ...this.unrecognizedFields,
63        };
64    }
65    static fromJSON(keyID, data) {
66        const { keytype, scheme, keyval, ...rest } = data;
67        if (typeof keytype !== 'string') {
68            throw new TypeError('keytype must be a string');
69        }
70        if (typeof scheme !== 'string') {
71            throw new TypeError('scheme must be a string');
72        }
73        if (!utils_1.guard.isStringRecord(keyval)) {
74            throw new TypeError('keyval must be a string record');
75        }
76        return new Key({
77            keyID,
78            keyType: keytype,
79            scheme,
80            keyVal: keyval,
81            unrecognizedFields: rest,
82        });
83    }
84}
85exports.Key = Key;
86