index.js 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.computePublicKey = exports.recoverPublicKey = exports.SigningKey = void 0;
  4. var elliptic_1 = require("./elliptic");
  5. var bytes_1 = require("@ethersproject/bytes");
  6. var properties_1 = require("@ethersproject/properties");
  7. var logger_1 = require("@ethersproject/logger");
  8. var _version_1 = require("./_version");
  9. var logger = new logger_1.Logger(_version_1.version);
  10. var _curve = null;
  11. function getCurve() {
  12. if (!_curve) {
  13. _curve = new elliptic_1.EC("secp256k1");
  14. }
  15. return _curve;
  16. }
  17. var SigningKey = /** @class */ (function () {
  18. function SigningKey(privateKey) {
  19. (0, properties_1.defineReadOnly)(this, "curve", "secp256k1");
  20. (0, properties_1.defineReadOnly)(this, "privateKey", (0, bytes_1.hexlify)(privateKey));
  21. var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));
  22. (0, properties_1.defineReadOnly)(this, "publicKey", "0x" + keyPair.getPublic(false, "hex"));
  23. (0, properties_1.defineReadOnly)(this, "compressedPublicKey", "0x" + keyPair.getPublic(true, "hex"));
  24. (0, properties_1.defineReadOnly)(this, "_isSigningKey", true);
  25. }
  26. SigningKey.prototype._addPoint = function (other) {
  27. var p0 = getCurve().keyFromPublic((0, bytes_1.arrayify)(this.publicKey));
  28. var p1 = getCurve().keyFromPublic((0, bytes_1.arrayify)(other));
  29. return "0x" + p0.pub.add(p1.pub).encodeCompressed("hex");
  30. };
  31. SigningKey.prototype.signDigest = function (digest) {
  32. var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));
  33. var digestBytes = (0, bytes_1.arrayify)(digest);
  34. if (digestBytes.length !== 32) {
  35. logger.throwArgumentError("bad digest length", "digest", digest);
  36. }
  37. var signature = keyPair.sign(digestBytes, { canonical: true });
  38. return (0, bytes_1.splitSignature)({
  39. recoveryParam: signature.recoveryParam,
  40. r: (0, bytes_1.hexZeroPad)("0x" + signature.r.toString(16), 32),
  41. s: (0, bytes_1.hexZeroPad)("0x" + signature.s.toString(16), 32),
  42. });
  43. };
  44. SigningKey.prototype.computeSharedSecret = function (otherKey) {
  45. var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));
  46. var otherKeyPair = getCurve().keyFromPublic((0, bytes_1.arrayify)(computePublicKey(otherKey)));
  47. return (0, bytes_1.hexZeroPad)("0x" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32);
  48. };
  49. SigningKey.isSigningKey = function (value) {
  50. return !!(value && value._isSigningKey);
  51. };
  52. return SigningKey;
  53. }());
  54. exports.SigningKey = SigningKey;
  55. function recoverPublicKey(digest, signature) {
  56. var sig = (0, bytes_1.splitSignature)(signature);
  57. var rs = { r: (0, bytes_1.arrayify)(sig.r), s: (0, bytes_1.arrayify)(sig.s) };
  58. return "0x" + getCurve().recoverPubKey((0, bytes_1.arrayify)(digest), rs, sig.recoveryParam).encode("hex", false);
  59. }
  60. exports.recoverPublicKey = recoverPublicKey;
  61. function computePublicKey(key, compressed) {
  62. var bytes = (0, bytes_1.arrayify)(key);
  63. if (bytes.length === 32) {
  64. var signingKey = new SigningKey(bytes);
  65. if (compressed) {
  66. return "0x" + getCurve().keyFromPrivate(bytes).getPublic(true, "hex");
  67. }
  68. return signingKey.publicKey;
  69. }
  70. else if (bytes.length === 33) {
  71. if (compressed) {
  72. return (0, bytes_1.hexlify)(bytes);
  73. }
  74. return "0x" + getCurve().keyFromPublic(bytes).getPublic(false, "hex");
  75. }
  76. else if (bytes.length === 65) {
  77. if (!compressed) {
  78. return (0, bytes_1.hexlify)(bytes);
  79. }
  80. return "0x" + getCurve().keyFromPublic(bytes).getPublic(true, "hex");
  81. }
  82. return logger.throwArgumentError("invalid public or private key", "key", "[REDACTED]");
  83. }
  84. exports.computePublicKey = computePublicKey;
  85. //# sourceMappingURL=index.js.map