{
  "version": 3,
  "sources": ["../../src/ed25519.ts", "../../src/utils.ts"],
  "sourcesContent": ["import type { KeyPair, Jwk, PublicKeyJwk, PrivateKeyJwk, KeyPairJwk } from './types.js';\n\nimport nacl from 'tweetnacl';\nimport ed2curve from 'ed2curve';\nimport { base64UrlToBytes, bytesToBase64Url } from './utils.js';\n\n// TODO: (not important) decide if we want to use tweetnacl or @noble/ed25519. is there a functional difference?\n//       dwn-sdk-js also has ed25519 cryptosuite stuff\n\nexport function generateKeyPair(): KeyPair {\n  const ed25519KeyPair = nacl.sign.keyPair();\n\n  return { publicKey: ed25519KeyPair.publicKey, privateKey: ed25519KeyPair.secretKey };\n}\n\nexport function deriveX25519KeyPair(ed25519KeyPair: KeyPair): KeyPair {\n  // for some reason tweetnacl chose the term `secretKey` instead of `privateKey` even though ed25519 is asymmetric\n  const x25519KeyPair = ed2curve.convertKeyPair({ publicKey: ed25519KeyPair.publicKey, secretKey: ed25519KeyPair.privateKey });\n\n  // apparently the return value of `convertKeyPair` can return null\n  if (!x25519KeyPair) {\n    throw new Error('failed to derive x25519 key pair.');\n  }\n\n  return { publicKey: x25519KeyPair.publicKey, privateKey: x25519KeyPair.secretKey };\n}\n\nexport type JwkOverrides = { crv: 'Ed25519' | 'X25519' };\n\nexport function keyPairToJwk(keyPair: KeyPair, kid: string, overrides: JwkOverrides = { crv: 'Ed25519' }): KeyPairJwk {\n  const jwk: Jwk = { kty: 'OKP', crv: overrides.crv, kid };\n\n  const encodedPublicKey = bytesToBase64Url(keyPair.publicKey);\n  const publicKeyJwk: PublicKeyJwk = { ...jwk, x: encodedPublicKey };\n\n  const encodedSecretKey = bytesToBase64Url(keyPair.privateKey);\n  const privateKeyJwk: PrivateKeyJwk = { ...publicKeyJwk, d: encodedSecretKey };\n\n  return { publicKeyJwk, privateKeyJwk };\n}\n\nexport type SignOptions = {\n  /** the data being signed */\n  payload: Uint8Array;\n  /** the key being used to sign */\n  privateKeyJwk: PrivateKeyJwk;\n};\n\nexport function sign(options: SignOptions) {\n  const { payload, privateKeyJwk } = options;\n  const privateKeyBytes = base64UrlToBytes(privateKeyJwk.d);\n\n  if (privateKeyJwk.crv !== 'Ed25519') {\n    throw new Error('crv must be Ed25519');\n  }\n\n  const signedData = nacl.sign(payload, privateKeyBytes);\n\n  return signedData.slice(0, nacl.sign.signatureLength);\n}\n\nexport type VerifyOptions = {\n  /** the signature to verify */\n  signature: Uint8Array;\n  /** the payload that was signed */\n  payload: Uint8Array;\n  /** the key to verify the signature with */\n  publicKeyJwk: PublicKeyJwk;\n}\n\nexport async function verify(options: VerifyOptions) {\n  const { signature, payload, publicKeyJwk } = options;\n  const publicKeyBytes = base64UrlToBytes(publicKeyJwk.x);\n\n  if (publicKeyJwk.crv !== 'Ed25519') {\n    throw new Error('crv must be Ed25519');\n  }\n\n  const signedData = new Uint8Array(signature.length + payload.length);\n  signedData.set(signature);\n  signedData.set(payload, signature.length);\n\n  const result = nacl.sign.open(signedData, publicKeyBytes);\n\n\n  return !!result;\n}", "import { base64url } from 'multiformats/bases/base64';\nimport { base58btc } from 'multiformats/bases/base58';\n\n\n// See https://github.com/multiformats/multicodec/blob/master/table.csv\nexport const MULTICODEC_HEADERS = {\n  ED25519: {\n    PUB  : new Uint8Array([0xed, 0x01]),\n    PRIV : new Uint8Array([0x80, 0x26])\n  },\n  X25519: {\n    PUB  : new Uint8Array([0xec, 0x01]),\n    PRIV : new Uint8Array([0x82, 0x26])\n  },\n  NOOP: new Uint8Array([])\n};\n\n\nexport function bytesToBase64Url(bytes: Uint8Array): string {\n  return base64url.baseEncode(bytes);\n}\n\nexport function base64UrlToBytes(base64urlString: string): Uint8Array {\n  return base64url.baseDecode(base64urlString);\n}\n\nexport function bytesToBase58btcMultibase(header: Uint8Array, bytes: Uint8Array): string {\n  const multibaseBytes = new Uint8Array(header.length + bytes.length);\n  multibaseBytes.set(header);\n  multibaseBytes.set(bytes, header.length);\n\n  return base58btc.encode(multibaseBytes);\n}"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,OAAO,UAAU;AACjB,OAAO,cAAc;;;ACHrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAInB,IAAM,qBAAqB;AAAA,EAChC,SAAS;AAAA,IACP,KAAO,IAAI,WAAW,CAAC,KAAM,CAAI,CAAC;AAAA,IAClC,MAAO,IAAI,WAAW,CAAC,KAAM,EAAI,CAAC;AAAA,EACpC;AAAA,EACA,QAAQ;AAAA,IACN,KAAO,IAAI,WAAW,CAAC,KAAM,CAAI,CAAC;AAAA,IAClC,MAAO,IAAI,WAAW,CAAC,KAAM,EAAI,CAAC;AAAA,EACpC;AAAA,EACA,MAAM,IAAI,WAAW,CAAC,CAAC;AACzB;AAGO,SAAS,iBAAiB,OAA2B;AAC1D,SAAO,UAAU,WAAW,KAAK;AACnC;AAEO,SAAS,iBAAiB,iBAAqC;AACpE,SAAO,UAAU,WAAW,eAAe;AAC7C;AAEO,SAAS,0BAA0B,QAAoB,OAA2B;AACvF,QAAM,iBAAiB,IAAI,WAAW,OAAO,SAAS,MAAM,MAAM;AAClE,iBAAe,IAAI,MAAM;AACzB,iBAAe,IAAI,OAAO,OAAO,MAAM;AAEvC,SAAO,UAAU,OAAO,cAAc;AACxC;;;ADvBO,SAAS,kBAA2B;AACzC,QAAM,iBAAiB,KAAK,KAAK,QAAQ;AAEzC,SAAO,EAAE,WAAW,eAAe,WAAW,YAAY,eAAe,UAAU;AACrF;AAEO,SAAS,oBAAoB,gBAAkC;AAEpE,QAAM,gBAAgB,SAAS,eAAe,EAAE,WAAW,eAAe,WAAW,WAAW,eAAe,WAAW,CAAC;AAG3H,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,SAAO,EAAE,WAAW,cAAc,WAAW,YAAY,cAAc,UAAU;AACnF;AAIO,SAAS,aAAa,SAAkB,KAAa,YAA0B,EAAE,KAAK,UAAU,GAAe;AACpH,QAAM,MAAW,EAAE,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI;AAEvD,QAAM,mBAAmB,iBAAiB,QAAQ,SAAS;AAC3D,QAAM,eAA6B,iCAAK,MAAL,EAAU,GAAG,iBAAiB;AAEjE,QAAM,mBAAmB,iBAAiB,QAAQ,UAAU;AAC5D,QAAM,gBAA+B,iCAAK,eAAL,EAAmB,GAAG,iBAAiB;AAE5E,SAAO,EAAE,cAAc,cAAc;AACvC;AASO,SAAS,KAAK,SAAsB;AACzC,QAAM,EAAE,SAAS,cAAc,IAAI;AACnC,QAAM,kBAAkB,iBAAiB,cAAc,CAAC;AAExD,MAAI,cAAc,QAAQ,WAAW;AACnC,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,QAAM,aAAa,KAAK,KAAK,SAAS,eAAe;AAErD,SAAO,WAAW,MAAM,GAAG,KAAK,KAAK,eAAe;AACtD;AAWA,SAAsB,OAAO,SAAwB;AAAA;AACnD,UAAM,EAAE,WAAW,SAAS,aAAa,IAAI;AAC7C,UAAM,iBAAiB,iBAAiB,aAAa,CAAC;AAEtD,QAAI,aAAa,QAAQ,WAAW;AAClC,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AAEA,UAAM,aAAa,IAAI,WAAW,UAAU,SAAS,QAAQ,MAAM;AACnE,eAAW,IAAI,SAAS;AACxB,eAAW,IAAI,SAAS,UAAU,MAAM;AAExC,UAAM,SAAS,KAAK,KAAK,KAAK,YAAY,cAAc;AAGxD,WAAO,CAAC,CAAC;AAAA,EACX;AAAA;",
  "names": []
}
