{"version":3,"file":"index.mjs","names":[],"sources":["../../src/keys.ts","../../src/uuid.ts","../../src/validator.ts","../../src/verify.ts"],"sourcesContent":["//\n// Copyright 2020 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { type KeyPair, PUBLIC_KEY_LENGTH, PublicKey, type PublicKeyLike, SECRET_KEY_LENGTH } from '@dxos/keys';\nimport crypto from '@dxos/vendor-hypercore/hypercore-crypto';\n\nexport const SIGNATURE_LENGTH = 64;\n\n/**\n * @deprecated\n */\n// TODO(burdon): Remove.\nexport const createId = (): string => PublicKey.stringify(randomBytes(32));\n\nexport const createKeyPair = (seed?: Buffer): KeyPair => {\n  if (seed) {\n    invariant(seed.length >= 32, 'Seedphrase too sort. Expecting length of 32.');\n    return crypto.keyPair(seed.slice(0, 32));\n  }\n\n  // TODO(burdon): Enable seed for debugging.\n  return crypto.keyPair();\n};\n\n// TODO(burdon): Buffer.\nexport const validateKeyPair = (publicKey: PublicKey, secretKey: Buffer) =>\n  crypto.validateKeyPair({ publicKey: publicKey.asBuffer(), secretKey });\n\n// TODO(dmaretskyi): Slicing because webcrypto keys are too long.\nexport const discoveryKey = (key: PublicKeyLike): Buffer =>\n  crypto.discoveryKey(PublicKey.from(key).asBuffer().slice(1));\n\n/**\n * Return random bytes of length.\n * @param [length=32]\n * @return {Buffer}\n */\nexport const randomBytes = (length = 32): Buffer => crypto.randomBytes(length);\n\n/**\n * Sign the contents of message with secret_key\n * @param {Buffer} message\n * @param {Buffer} secretKey\n * @returns {Buffer} signature\n */\nexport const sign = (message: Buffer, secretKey: Buffer): Buffer => {\n  invariant(Buffer.isBuffer(message));\n  invariant(Buffer.isBuffer(secretKey) && secretKey.length === SECRET_KEY_LENGTH);\n\n  return crypto.sign(message, secretKey);\n};\n\n/**\n * Verifies the signature against the message and public_key.\n * @param {Buffer} message\n * @param {Buffer} publicKey\n * @param {Buffer} signature\n * @return {boolean}\n */\nexport const verify = (message: Buffer, signature: Buffer, publicKey: Buffer): boolean => {\n  invariant(Buffer.isBuffer(message));\n  invariant(Buffer.isBuffer(signature) && signature.length === SIGNATURE_LENGTH);\n  invariant(Buffer.isBuffer(publicKey) && publicKey.length === PUBLIC_KEY_LENGTH);\n\n  return crypto.verify(message, signature, publicKey);\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { webcrypto } from '#subtle';\n\nexport const randomUUID = (): string => {\n  return webcrypto.randomUUID();\n};\n","//\n// Copyright 2020 DXOS.org\n//\n\nimport { PublicKey } from '@dxos/keys';\nimport { verify } from '@dxos/vendor-hypercore/hypercore-crypto';\n\n/**\n * Generator for signature validation function.\n * @param {String} publicKey\n */\nexport const getSignatureValidator = (publicKey: string) => (message: Buffer, signature: Buffer) =>\n  verify(message, signature, PublicKey.bufferize(publicKey));\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type PublicKey } from '@dxos/keys';\n\nimport { subtleCrypto } from '#subtle';\n\n/**\n * Verify a signature with the given key.\n */\nexport const verifySignature = async (\n  key: PublicKey,\n  message: Uint8Array,\n  signature: Uint8Array,\n  algorithm: { name: string; namedCurve?: string } = { name: 'ECDSA', namedCurve: 'P-256' },\n): Promise<boolean> => {\n  let publicKey!: CryptoKey;\n\n  try {\n    publicKey = await subtleCrypto.importKey('raw', key.asUint8Array() as Uint8Array<ArrayBuffer>, algorithm, true, [\n      'verify',\n    ]);\n  } catch {\n    return false;\n  }\n\n  return subtleCrypto.verify(\n    {\n      name: algorithm.name,\n      hash: 'SHA-256',\n    },\n    publicKey,\n    signature as Uint8Array<ArrayBuffer>,\n    message as Uint8Array<ArrayBuffer>,\n  );\n};\n"],"mappings":";;;;;;;AAQA,IAAa,mBAAmB;;;;AAMhC,IAAa,iBAAyB,UAAU,UAAU,YAAY,EAAE,CAAC;AAEzE,IAAa,iBAAiB,SAA2B;CACvD,IAAI,MAAM;EACR,UAAU,KAAK,UAAU,IAAI,gDAA6C;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,KAAA;GAAA,GAAA,CAAA,qBAAA,gDAAA;EAAA,CAAC;EAC3E,OAAO,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;CACzC;CAGA,OAAO,OAAO,QAAQ;AACxB;AAGA,IAAa,mBAAmB,WAAsB,cACpD,OAAO,gBAAgB;CAAE,WAAW,UAAU,SAAS;CAAG;AAAU,CAAC;AAGvE,IAAa,gBAAgB,QAC3B,OAAO,aAAa,UAAU,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;;;;;;AAO7D,IAAa,eAAe,SAAS,OAAe,OAAO,YAAY,MAAM;;;;;;;AAQ7E,IAAa,QAAQ,SAAiB,cAA8B;CAClE,UAAU,OAAO,SAAS,OAAO,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,4BAAA,EAAA;CAAA,CAAC;CAClC,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAW,mBAAgB,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,wEAAA,EAAA;CAAA,CAAC;CAE9E,OAAO,OAAO,KAAK,SAAS,SAAS;AACvC;;;;;;;;AASA,IAAa,UAAU,SAAiB,WAAmB,cAA+B;CACxF,UAAU,OAAO,SAAS,OAAO,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,4BAAA,EAAA;CAAA,CAAC;CAClC,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAA,IAA0B,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,uEAAA,EAAA;CAAA,CAAC;CAC7E,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAW,mBAAgB,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,wEAAA,EAAA;CAAA,CAAC;CAE9E,OAAO,OAAO,OAAO,SAAS,WAAW,SAAS;AACpD;;;AC7DA,IAAa,mBAA2B;CACtC,OAAO,UAAU,WAAW;AAC9B;;;;;;;ACGA,IAAa,yBAAyB,eAAuB,SAAiB,cAC5E,SAAO,SAAS,WAAW,UAAU,UAAU,SAAS,CAAC;;;;;;ACD3D,IAAa,kBAAkB,OAC7B,KACA,SACA,WACA,YAAmD;CAAE,MAAM;CAAS,YAAY;AAAQ,MACnE;CACrB,IAAI;CAEJ,IAAI;EACF,YAAY,MAAM,aAAa,UAAU,OAAO,IAAI,aAAa,GAA8B,WAAW,MAAM,CAC9G,QACF,CAAC;CACH,QAAQ;EACN,OAAO;CACT;CAEA,OAAO,aAAa,OAClB;EACE,MAAM,UAAU;EAChB,MAAM;CACR,GACA,WACA,WACA,OACF;AACF"}