{
  "version": 3,
  "sources": ["../src/ecdh.ts", "../src/helpers/hex-to-bytes.ts", "../src/constants.ts", "../src/helpers/validators.ts", "../src/ecdsa.ts", "../src/helpers/util.ts"],
  "sourcesContent": ["import { Point, etc } from \"@noble/secp256k1\";\nimport { checkPrivateKey, checkPublicKey } from \"./helpers/validators\";\nimport { decompress } from \"./ecdsa\";\n\n/**\n * Derives a shared secret using ECDH over secp256k1.\n * @param privateKeyA Local private key (32 bytes).\n * @param publicKeyB Remote public key (compressed or uncompressed SEC1 format).\n * @returns 32-byte x coordinate of the shared point.\n */\nexport function derive(\n  privateKeyA: Uint8Array,\n  publicKeyB: Uint8Array\n): Uint8Array {\n  checkPrivateKey(privateKeyA);\n  checkPublicKey(publicKeyB);\n  const pub = decompress(publicKeyB);\n  const affine = Point.fromBytes(pub)\n    .multiply(etc.secretKeyToScalar(privateKeyA))\n    .toAffine();\n  return etc.numberToBytesBE(affine.x);\n}\n", "/**\n * Hex string \u2192 byte values `0..255`. Odd length implies a leading `0` nibble (unlike {@link hexToBuffer}).\n *\n * @param hex Contiguous hex digits (no `0x` stripping).\n * @returns `number[]` of byte values.\n */\nexport function hexToBytes(hex: string): number[] {\n  const clean = hex.length % 2 ? `0${hex}` : hex;\n  const out: number[] = [];\n  for (let i = 0; i < clean.length; i += 2) {\n    out.push(Number.parseInt(clean.slice(i, i + 2), 16));\n  }\n  return out;\n}\n", "import { hexToBytes } from \"./helpers/hex-to-bytes\";\n\nexport const HEX_ENC = \"hex\";\nexport const UTF8_ENC = \"utf8\";\nexport const BINARY_ENC = \"binary\";\n\nexport const ENCRYPT_OP = \"encrypt\";\nexport const DECRYPT_OP = \"decrypt\";\n\nexport const SIGN_OP = \"sign\";\nexport const VERIFY_OP = \"verify\";\n\nexport const LENGTH_0 = 0;\nexport const LENGTH_1 = 1;\nexport const LENGTH_12 = 12;\nexport const LENGTH_16 = 16;\nexport const LENGTH_32 = 32;\nexport const LENGTH_64 = 64;\nexport const LENGTH_128 = 128;\nexport const LENGTH_256 = 256;\nexport const LENGTH_512 = 512;\nexport const LENGTH_1024 = 1024;\n\nexport const AES_LENGTH = LENGTH_256;\nexport const HMAC_LENGTH = LENGTH_256;\n\nexport const AES_BROWSER_ALGO = \"AES-CBC\";\nexport const HMAC_BROWSER_ALGO = `SHA-${AES_LENGTH}`;\nexport const HMAC_BROWSER = \"HMAC\";\n\nexport const SHA256_BROWSER_ALGO = \"SHA-256\";\nexport const SHA512_BROWSER_ALGO = \"SHA-512\";\n\nexport const AES_NODE_ALGO = `aes-${AES_LENGTH}-cbc`;\nexport const HMAC_NODE_ALGO = `sha${HMAC_LENGTH}`;\n\nexport const SHA256_NODE_ALGO = \"sha256\";\nexport const SHA512_NODE_ALGO = \"sha512\";\nexport const RIPEMD160_NODE_ALGO = \"ripemd160\";\n\nexport const PBKDF2_DIGEST_SHA256 = SHA256_NODE_ALGO;\nexport const PBKDF2_DIGEST_SHA512 = SHA512_NODE_ALGO;\n\nexport const PREFIX_LENGTH = LENGTH_1;\nexport const KEY_LENGTH = LENGTH_32;\nexport const IV_LENGTH = LENGTH_16;\nexport const AES_GCM_NONCE_LENGTH = LENGTH_12;\nexport const AES_GCM_ENVELOPE_NONCE_MAX_LENGTH = LENGTH_128;\nexport const AES_GCM_TAG_LENGTH = LENGTH_16;\nexport const MAC_LENGTH = LENGTH_32;\nexport const DECOMPRESSED_LENGTH = LENGTH_64;\n\nexport const PREFIXED_KEY_LENGTH = KEY_LENGTH + PREFIX_LENGTH;\nexport const PREFIXED_DECOMPRESSED_LENGTH = DECOMPRESSED_LENGTH + PREFIX_LENGTH;\n\nexport const ECIES_SERIALIZED_MIN_LENGTH =\n  IV_LENGTH + PREFIXED_KEY_LENGTH + MAC_LENGTH;\n\nexport const MAX_KEY_LENGTH = LENGTH_1024;\nexport const PBKDF2_DEFAULT_ITERATIONS = 210_000;\nexport const MAX_MSG_LENGTH = LENGTH_32;\n\nexport const EMPTY_BUFFER = new Uint8Array(LENGTH_0);\n\nexport const EC_GROUP_ORDER = new Uint8Array(\n  hexToBytes(\n    \"fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\"\n  )\n);\n\nexport const ZERO32 = new Uint8Array(LENGTH_32).fill(LENGTH_0);\n\nexport const ERROR_BAD_MAC = \"Bad MAC\";\nexport const ERROR_BAD_SIGNATURE = \"Bad signature\";\nexport const ERROR_BAD_PRIVATE_KEY = \"Bad private key\";\nexport const ERROR_BAD_PUBLIC_KEY = \"Bad public key\";\nexport const ERROR_ECIES_SERIALIZED_LENGTH =\n  \"ECIES deserialize: buffer shorter than minimum serialized length\";\n\nexport const ERROR_EMPTY_MESSAGE = \"Message should not be empty\";\nexport const ERROR_MESSAGE_TOO_LONG = \"Message is too long\";\n\nexport const ERROR_BAD_EPHEM_PRIVATE_KEY = \"Invalid ephemeral private key\";\n\nexport const ERROR_AES_IV_LENGTH = \"AES-CBC: IV must be 16 bytes\";\nexport const ERROR_AES_KEY_LENGTH = \"AES-CBC: key must be 32 bytes\";\n\nexport const ERROR_AES_GCM_KEY_LENGTH =\n  \"AES-GCM: key must be 16, 24, or 32 bytes\";\nexport const ERROR_AES_GCM_NONCE_LENGTH =\n  \"AES-GCM: nonce must be at least 8 bytes\";\nexport const ERROR_AES_GCM_CIPHERTEXT_LENGTH =\n  \"AES-GCM: ciphertext must be longer than the authentication tag\";\n", "import {\n  EC_GROUP_ORDER,\n  ERROR_BAD_PRIVATE_KEY,\n  ERROR_BAD_PUBLIC_KEY,\n  ERROR_EMPTY_MESSAGE,\n  ERROR_MESSAGE_TOO_LONG,\n  KEY_LENGTH,\n  LENGTH_0,\n  MAX_KEY_LENGTH,\n  MAX_MSG_LENGTH,\n  PREFIXED_DECOMPRESSED_LENGTH,\n  PREFIXED_KEY_LENGTH,\n  ZERO32,\n} from \"../constants\";\n\n/**\n * Asserts a condition and throws when it fails.\n * @param condition Condition to evaluate.\n * @param message Error message when condition fails.\n */\nexport function assert(condition: boolean, message: string): void {\n  if (!condition) {\n    throw new Error(message || \"Assertion failed\");\n  }\n}\n\n/**\n * Checks whether input is a 32-byte scalar.\n * @param x Input bytes.\n * @returns True when input is a scalar.\n */\nexport function isScalar(x: Uint8Array): boolean {\n  return x instanceof Uint8Array && x.length === 32;\n}\n\n/**\n * Validates a secp256k1 private key range.\n * @param privateKey Private key bytes.\n * @returns True when key is valid.\n */\nexport function isValidPrivateKey(privateKey: Uint8Array): boolean {\n  if (!isScalar(privateKey)) {\n    return false;\n  }\n  return (\n    compareBuffers(privateKey, ZERO32) > 0 &&\n    compareBuffers(privateKey, EC_GROUP_ORDER) < 0\n  );\n}\n\n/**\n * Compares two byte arrays lexicographically.\n * @param a First byte array.\n * @param b Second byte array.\n * @returns -1, 0, or 1 depending on comparison result.\n */\nexport function compareBuffers(a: Uint8Array, b: Uint8Array): number {\n  const len = Math.max(a.length, b.length);\n  for (let i = 0; i < len; i++) {\n    const av = a[i] ?? 0;\n    const bv = b[i] ?? 0;\n    if (av !== bv) {\n      return av < bv ? -1 : 1;\n    }\n  }\n  return 0;\n}\n\n/**\n * Compares two byte arrays in constant time.\n * @param b1 First byte array.\n * @param b2 Second byte array.\n * @returns True when arrays are equal.\n */\nexport function equalConstTime(b1: Uint8Array, b2: Uint8Array): boolean {\n  if (b1.length !== b2.length) {\n    return false;\n  }\n  let res = 0;\n  for (let i = 0; i < b1.length; i++) {\n    res |= b1[i] ^ b2[i];\n  }\n  return res === 0;\n}\n\n/**\n * Validates random key length constraints.\n * @param length Requested length.\n * @returns True when length is valid.\n */\nexport function isValidKeyLength(length: number): boolean {\n  return !(\n    length <= LENGTH_0 ||\n    length > MAX_KEY_LENGTH ||\n    Number.parseInt(String(length), 10) !== length\n  );\n}\n\n/**\n * Validates a private key and throws when invalid.\n * @param privateKey Private key bytes.\n */\nexport function checkPrivateKey(privateKey: Uint8Array): void {\n  assert(privateKey.length === KEY_LENGTH, ERROR_BAD_PRIVATE_KEY);\n  assert(isValidPrivateKey(privateKey), ERROR_BAD_PRIVATE_KEY);\n}\n\n/**\n * Validates a public key and throws when invalid.\n * @param publicKey Public key bytes.\n */\nexport function checkPublicKey(publicKey: Uint8Array): void {\n  assert(\n    publicKey.length === PREFIXED_DECOMPRESSED_LENGTH ||\n      publicKey.length === PREFIXED_KEY_LENGTH,\n    ERROR_BAD_PUBLIC_KEY\n  );\n  if (publicKey.length === PREFIXED_DECOMPRESSED_LENGTH) {\n    assert(publicKey[0] === 4, ERROR_BAD_PUBLIC_KEY);\n  }\n  if (publicKey.length === PREFIXED_KEY_LENGTH) {\n    assert(publicKey[0] === 2 || publicKey[0] === 3, ERROR_BAD_PUBLIC_KEY);\n  }\n}\n\n/**\n * Validates message bytes and throws when invalid.\n * @param msg Message bytes.\n */\nexport function checkMessage(msg: Uint8Array): void {\n  assert(msg.length > 0, ERROR_EMPTY_MESSAGE);\n  assert(msg.length <= MAX_MSG_LENGTH, ERROR_MESSAGE_TOO_LONG);\n}\n", "import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport * as secp from \"@noble/secp256k1\";\nimport {\n  ERROR_BAD_SIGNATURE,\n  PREFIXED_DECOMPRESSED_LENGTH,\n  PREFIXED_KEY_LENGTH,\n} from \"./constants\";\nimport { derDecodeEcdsaSignature, derEncodeEcdsaSignature } from \"./internal/der\";\nimport type { KeyPair } from \"./helpers/types\";\nimport {\n  isCompressed,\n  isDecompressed,\n  isValidDERSignature,\n} from \"./helpers/util\";\nimport {\n  checkMessage,\n  checkPrivateKey,\n  checkPublicKey,\n} from \"./helpers/validators\";\n\nsecp.hashes.sha256 = sha256;\nsecp.hashes.hmacSha256 = (key: Uint8Array, msg: Uint8Array) =>\n  hmac(sha256, key, msg);\n\n/**\n * Generates a random secp256k1 private key.\n * @returns Private key bytes (32 bytes).\n */\nexport function generatePrivate(): Uint8Array {\n  return secp.utils.randomSecretKey();\n}\n\n/**\n * Converts a public key to compressed SEC1 format.\n * @param publicKey Public key bytes.\n * @returns Compressed public key bytes.\n */\nexport function compress(publicKey: Uint8Array): Uint8Array {\n  if (isCompressed(publicKey)) {\n    checkPublicKey(publicKey);\n    return publicKey;\n  }\n  if (publicKey.length === PREFIXED_DECOMPRESSED_LENGTH) {\n    checkPublicKey(publicKey);\n  }\n  return secp.Point.fromBytes(publicKey).toBytes(true);\n}\n\n/**\n * Converts a public key to uncompressed SEC1 format.\n * @param publicKey Public key bytes.\n * @returns Uncompressed public key bytes.\n */\nexport function decompress(publicKey: Uint8Array): Uint8Array {\n  if (isDecompressed(publicKey)) {\n    if (publicKey.length === PREFIXED_DECOMPRESSED_LENGTH) {\n      checkPublicKey(publicKey);\n    }\n    return publicKey;\n  }\n  if (publicKey.length === PREFIXED_KEY_LENGTH) {\n    checkPublicKey(publicKey);\n  }\n  return secp.Point.fromBytes(publicKey).toBytes(false);\n}\n\n/**\n * Derives an uncompressed public key from a private key.\n * @param privateKey Private key bytes (32 bytes).\n * @returns Uncompressed public key bytes.\n */\nexport function getPublic(privateKey: Uint8Array): Uint8Array {\n  checkPrivateKey(privateKey);\n  return secp.getPublicKey(privateKey, false);\n}\n\n/**\n * Derives a compressed public key from a private key.\n * @param privateKey Private key bytes (32 bytes).\n * @returns Compressed public key bytes.\n */\nexport function getPublicCompressed(privateKey: Uint8Array): Uint8Array {\n  checkPrivateKey(privateKey);\n  return secp.getPublicKey(privateKey, true);\n}\n\n/**\n * Generates a secp256k1 key pair.\n * @returns Object with private and public key bytes.\n */\nexport function generateKeyPair(): KeyPair {\n  const privateKey = generatePrivate();\n  const publicKey = getPublic(privateKey);\n  return { privateKey, publicKey };\n}\n\n/**\n * Converts a compact signature to DER format when needed.\n * @param sig Signature bytes in DER, compact, or recovered format.\n * @returns DER-encoded signature bytes.\n */\nexport function signatureExport(sig: Uint8Array): Uint8Array {\n  if (isValidDERSignature(sig)) {\n    return sig;\n  }\n  const compact = sig.length === 65 ? sig.slice(0, 64) : sig;\n  if (compact.length !== 64) {\n    throw new Error(\"signatureExport: invalid compact signature\");\n  }\n  return derEncodeEcdsaSignature(compact);\n}\n\n/**\n * Signs a message digest with ECDSA.\n * @param privateKey Private key bytes (32 bytes).\n * @param msg Message digest bytes.\n * @param rsvSig If true, returns recovered format (65 bytes); otherwise compact format (64 bytes).\n * @returns Signature bytes.\n */\nexport function sign(\n  privateKey: Uint8Array,\n  msg: Uint8Array,\n  rsvSig = false\n): Uint8Array {\n  checkPrivateKey(privateKey);\n  checkMessage(msg);\n  return secp.sign(msg, privateKey, {\n    prehash: false,\n    format: rsvSig ? \"recovered\" : \"compact\",\n    lowS: false,\n  });\n}\n\n/**\n * Recovers a public key from a signature and message digest.\n * @param msg Message digest bytes.\n * @param sig Recovered signature bytes.\n * @param compressed If true, returns compressed public key format.\n * @returns Recovered public key bytes.\n */\nexport function recover(\n  msg: Uint8Array,\n  sig: Uint8Array,\n  compressed = false\n): Uint8Array {\n  checkMessage(msg);\n  const pub = secp.recoverPublicKey(sig, msg, { prehash: false });\n  return secp.Point.fromBytes(pub).toBytes(compressed);\n}\n\n/**\n * Verifies an ECDSA signature.\n * @param publicKey Public key bytes.\n * @param msg Message digest bytes.\n * @param sig Signature bytes in DER, compact, or recovered format.\n * @throws Error when signature is invalid.\n */\nexport function verify(\n  publicKey: Uint8Array,\n  msg: Uint8Array,\n  sig: Uint8Array\n): void {\n  checkPublicKey(publicKey);\n  checkMessage(msg);\n\n  let sigBytes: Uint8Array;\n  let format: \"compact\" | \"recovered\";\n  if (sig.length === 64) {\n    sigBytes = sig;\n    format = \"compact\";\n  } else if (sig[0] === 0x30) {\n    sigBytes = derDecodeEcdsaSignature(sig);\n    format = \"compact\";\n  } else {\n    sigBytes = sig;\n    format = sig.length === 65 ? \"recovered\" : \"compact\";\n  }\n\n  const ok = secp.verify(sigBytes, msg, publicKey, {\n    prehash: false,\n    format,\n    lowS: false,\n  });\n  if (!ok) throw new Error(ERROR_BAD_SIGNATURE);\n}\n", "import {\n  DECOMPRESSED_LENGTH,\n  KEY_LENGTH,\n  PREFIXED_DECOMPRESSED_LENGTH,\n  PREFIXED_KEY_LENGTH,\n} from \"../constants\";\nimport type { Signature, SignResult } from \"./types\";\nimport {\n  bufferToHex,\n  concatBuffers,\n  hexToBuffer,\n  hexToNumber,\n  removeHexLeadingZeros,\n  sanitizeHex,\n} from \"./encoding\";\n\n/**\n * Checks whether a public key is in compressed format.\n * @param publicKey Public key bytes.\n * @returns True when key is compressed.\n */\nexport function isCompressed(publicKey: Uint8Array): boolean {\n  return (\n    publicKey.length === KEY_LENGTH || publicKey.length === PREFIXED_KEY_LENGTH\n  );\n}\n\n/**\n * Checks whether a public key is in uncompressed format.\n * @param publicKey Public key bytes.\n * @returns True when key is uncompressed.\n */\nexport function isDecompressed(publicKey: Uint8Array): boolean {\n  return (\n    publicKey.length === DECOMPRESSED_LENGTH ||\n    publicKey.length === PREFIXED_DECOMPRESSED_LENGTH\n  );\n}\n\n/**\n * Checks whether a public key has SEC1 prefix byte.\n * @param publicKey Public key bytes.\n * @returns True when key includes prefix.\n */\nexport function isPrefixed(publicKey: Uint8Array): boolean {\n  if (isCompressed(publicKey)) {\n    return publicKey.length === PREFIXED_KEY_LENGTH;\n  }\n  return publicKey.length === PREFIXED_DECOMPRESSED_LENGTH;\n}\n\n/**\n * Ensures a public key is SEC1-prefixed.\n * @param publicKey Public key bytes.\n * @returns Prefixed public key bytes.\n */\nexport function sanitizePublicKey(publicKey: Uint8Array): Uint8Array {\n  return isPrefixed(publicKey)\n    ? publicKey\n    : concatBuffers(hexToBuffer(\"04\"), publicKey);\n}\n\n/**\n * Converts recovery id to Ethereum-style recovery byte.\n * @param recoveryParam Recovery id.\n * @returns Recovery byte as Uint8Array.\n */\nexport function exportRecoveryParam(recoveryParam: number): Uint8Array {\n  return hexToBuffer(sanitizeHex((recoveryParam + 27).toString(16)));\n}\n\n/**\n * Converts recovery byte to recovery id.\n * @param v Recovery byte.\n * @returns Recovery id.\n */\nexport function importRecoveryParam(v: Uint8Array): number {\n  return hexToNumber(removeHexLeadingZeros(bufferToHex(v))) - 27;\n}\n\n/**\n * Splits compact signature bytes into r, s, and v components.\n * @param sig Signature bytes.\n * @returns Signature object with r, s, and v.\n */\nexport function splitSignature(sig: Uint8Array): Signature {\n  return {\n    r: sig.slice(0, 32),\n    s: sig.slice(32, 64),\n    v: sig.slice(64, 65),\n  };\n}\n\n/**\n * Joins r, s, and v signature components into byte array.\n * @param sig Signature object.\n * @returns Signature bytes.\n */\nexport function joinSignature(sig: Signature): Uint8Array {\n  return concatBuffers(sig.r, sig.s, sig.v);\n}\n\n/**\n * Checks whether signature bytes look like DER format.\n * @param sig Signature bytes.\n * @returns True when signature appears DER-encoded.\n */\nexport function isValidDERSignature(sig: Uint8Array): boolean {\n  return sig.length > 65 && sig[0] === 0x30;\n}\n\n/**\n * Converts recovered signature bytes into signature and recovery id.\n * @param sig Recovered signature bytes.\n * @returns Signature bytes and recovery id.\n */\nexport function sanitizeRSVSignature(sig: Uint8Array): SignResult {\n  return {\n    signature: sig.slice(0, 64),\n    recovery: importRecoveryParam(sig.slice(64, 65)),\n  };\n}\n"],
  "mappings": "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",
  "names": ["Point", "Point"]
}
