| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- "use strict";
- import { EC } from "./elliptic";
- import { arrayify, hexlify, hexZeroPad, splitSignature } from "@ethersproject/bytes";
- import { defineReadOnly } from "@ethersproject/properties";
- import { Logger } from "@ethersproject/logger";
- import { version } from "./_version";
- const logger = new Logger(version);
- let _curve = null;
- function getCurve() {
- if (!_curve) {
- _curve = new EC("secp256k1");
- }
- return _curve;
- }
- export class SigningKey {
- constructor(privateKey) {
- defineReadOnly(this, "curve", "secp256k1");
- defineReadOnly(this, "privateKey", hexlify(privateKey));
- const keyPair = getCurve().keyFromPrivate(arrayify(this.privateKey));
- defineReadOnly(this, "publicKey", "0x" + keyPair.getPublic(false, "hex"));
- defineReadOnly(this, "compressedPublicKey", "0x" + keyPair.getPublic(true, "hex"));
- defineReadOnly(this, "_isSigningKey", true);
- }
- _addPoint(other) {
- const p0 = getCurve().keyFromPublic(arrayify(this.publicKey));
- const p1 = getCurve().keyFromPublic(arrayify(other));
- return "0x" + p0.pub.add(p1.pub).encodeCompressed("hex");
- }
- signDigest(digest) {
- const keyPair = getCurve().keyFromPrivate(arrayify(this.privateKey));
- const digestBytes = arrayify(digest);
- if (digestBytes.length !== 32) {
- logger.throwArgumentError("bad digest length", "digest", digest);
- }
- const signature = keyPair.sign(digestBytes, { canonical: true });
- return splitSignature({
- recoveryParam: signature.recoveryParam,
- r: hexZeroPad("0x" + signature.r.toString(16), 32),
- s: hexZeroPad("0x" + signature.s.toString(16), 32),
- });
- }
- computeSharedSecret(otherKey) {
- const keyPair = getCurve().keyFromPrivate(arrayify(this.privateKey));
- const otherKeyPair = getCurve().keyFromPublic(arrayify(computePublicKey(otherKey)));
- return hexZeroPad("0x" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32);
- }
- static isSigningKey(value) {
- return !!(value && value._isSigningKey);
- }
- }
- export function recoverPublicKey(digest, signature) {
- const sig = splitSignature(signature);
- const rs = { r: arrayify(sig.r), s: arrayify(sig.s) };
- return "0x" + getCurve().recoverPubKey(arrayify(digest), rs, sig.recoveryParam).encode("hex", false);
- }
- export function computePublicKey(key, compressed) {
- const bytes = arrayify(key);
- if (bytes.length === 32) {
- const signingKey = new SigningKey(bytes);
- if (compressed) {
- return "0x" + getCurve().keyFromPrivate(bytes).getPublic(true, "hex");
- }
- return signingKey.publicKey;
- }
- else if (bytes.length === 33) {
- if (compressed) {
- return hexlify(bytes);
- }
- return "0x" + getCurve().keyFromPublic(bytes).getPublic(false, "hex");
- }
- else if (bytes.length === 65) {
- if (!compressed) {
- return hexlify(bytes);
- }
- return "0x" + getCurve().keyFromPublic(bytes).getPublic(true, "hex");
- }
- return logger.throwArgumentError("invalid public or private key", "key", "[REDACTED]");
- }
- //# sourceMappingURL=index.js.map
|