{"_id":"@taceo/oprf-core","_rev":"2-b49d9f4492b893de14f1cd6bc7f965d5","name":"@taceo/oprf-core","dist-tags":{"latest":"0.4.0"},"versions":{"0.4.0":{"name":"@taceo/oprf-core","version":"0.4.0","keywords":["oprf","babyjubjub","zkp","threshold","chaum-pedersen","frost","cryptography"],"license":"MIT","_id":"@taceo/oprf-core@0.4.0","maintainers":[{"name":"fgruber","email":"gruber@taceo.io"},{"name":"dkales","email":"kales@taceo.io"}],"homepage":"https://github.com/TaceoLabs/oprf-client-js#readme","bugs":{"url":"https://github.com/TaceoLabs/oprf-client-js/issues"},"dist":{"shasum":"27aa0fca35e7df54f30ca9688dce03f4ab1921bb","tarball":"https://registry.npmjs.org/@taceo/oprf-core/-/oprf-core-0.4.0.tgz","fileCount":9,"integrity":"sha512-Mlo2pjb8O9HDGvjpcun06ZWrW7oBblQESr9EDhW1WvHLDkKDgdlKdx43EVzJMGHcFXaVT4/1MnC1De/5KTQTNg==","signatures":[{"sig":"MEQCIBmqKrNXlt9RxWU5EEvinBnCaZquAwWn5WRX7DFZMuWlAiA9cae3NBw56+haBCpOhFAro6SXeIvFsC597wvanfjGsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147303},"main":"./dist/index.cjs","type":"module","_from":"file:taceo-oprf-core-0.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"lint":"eslint src test","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"dkales","email":"kales@taceo.io"},"_resolved":"/tmp/30899c898d34a9ac3fba44eefded50c9/taceo-oprf-core-0.4.0.tgz","_integrity":"sha512-Mlo2pjb8O9HDGvjpcun06ZWrW7oBblQESr9EDhW1WvHLDkKDgdlKdx43EVzJMGHcFXaVT4/1MnC1De/5KTQTNg==","repository":{"url":"git+https://github.com/TaceoLabs/oprf-client-js.git","type":"git","directory":"packages/oprf-core"},"_npmVersion":"11.5.1","description":"Threshold OPRF client core: BabyJubJub, hash-to-curve, Chaum-Pedersen ZKP, FROST-style distributed proofs","directories":{},"sideEffects":false,"_nodeVersion":"24.6.0","dependencies":{"@noble/curves":"^2.0.1","@noble/hashes":"^2.0.1","@taceo/poseidon2":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^4.0.18","typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/oprf-core_0.4.0_1773066845582_0.292621503022761","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-03-09T14:34:05.496Z","modified":"2026-07-23T09:35:23.495Z","0.4.0":"2026-03-09T14:34:05.773Z"},"bugs":{"url":"https://github.com/TaceoLabs/oprf-client-js/issues"},"license":"MIT","homepage":"https://github.com/TaceoLabs/oprf-client-js#readme","keywords":["oprf","babyjubjub","zkp","threshold","chaum-pedersen","frost","cryptography"],"repository":{"url":"git+https://github.com/TaceoLabs/oprf-client-js.git","type":"git","directory":"packages/oprf-core"},"description":"Threshold OPRF client core: BabyJubJub, hash-to-curve, Chaum-Pedersen ZKP, FROST-style distributed proofs","maintainers":[{"email":"gruber@taceo.io","name":"fgruber"},{"email":"kales@taceo.io","name":"dkales"},{"email":"nieddu@taceo.io","name":"0xthemis"}],"readme":"# @taceo/oprf-core\n\nThreshold OPRF client core: BabyJubJub curve, hash-to-curve, Chaum-Pedersen ZKP, and FROST-style distributed proofs.\n\nThis package provides the cryptographic primitives for building oblivious pseudo-random function (OPRF) clients in the TACEO threshold OPRF protocol.\n\n## Installation\n\n```bash\npnpm add @taceo/oprf-core\n```\n\n## Usage\n\n### Basic OPRF Operations\n\n```ts\nimport {\n  blindQuery,\n  unblindResponse,\n  finalizeOutput,\n  randomBlindingFactor,\n  prepareBlindingFactor,\n} from '@taceo/oprf-core';\n\n// 1. Generate a random blinding factor\nconst beta = randomBlindingFactor();\n\n// 2. Blind the query before sending to server\nconst query = 12345n;\nconst blindedQuery = blindQuery(query, beta);\n\n// 3. [Server evaluates OPRF and returns blindedResponse]\n\n// 4. Unblind the server response\nconst prepared = prepareBlindingFactor(beta);\nconst unblinded = unblindResponse(blindedResponse, prepared);\n\n// 5. Finalize the OPRF output\nconst domainSeparator = 0n;\nconst output = finalizeOutput(domainSeparator, query, unblinded);\n```\n\n### Hash-to-Curve\n\n```ts\nimport { encodeToCurve } from '@taceo/oprf-core';\n\n// Maps a field element to a BabyJubJub curve point\nconst point = encodeToCurve(12345n);\n```\n\n### DLog Equality Proofs (Chaum-Pedersen)\n\n```ts\nimport {\n  dlogEqualityProof,\n  dlogEqualityVerify,\n  BABYJUBJUB_SUBGROUP_GENERATOR_AFFINE,\n} from '@taceo/oprf-core';\n\n// Prove that log_G(pk) = log_B(R) without revealing the secret\nconst proof = dlogEqualityProof(secretKey, baseG, publicKey, baseB, responseR);\ndlogEqualityVerify(proof, publicKey, baseB, responseR, baseG);\n```\n\n### Distributed DLog (FROST-style)\n\n```ts\nimport { DLogCommitmentsShamir, DLogSessionShamir } from '@taceo/oprf-core';\n\n// Combine commitments from multiple parties\nconst combined = DLogCommitmentsShamir.combineCommitments(\n  commitments,\n  contributingParties\n);\n\n// Combine proof shares into a single verifiable proof\nconst proof = combined.combineProofs(requestId, proofShares, publicKey, base);\n```\n\n### Shamir Secret Sharing\n\n```ts\nimport { lagrangeFromCoeff, reconstruct } from '@taceo/oprf-core';\n\n// Compute Lagrange coefficients for interpolation\nconst coeffs = lagrangeFromCoeff(contributingParties);\n\n// Reconstruct a secret from shares\nconst secret = reconstruct(shares, contributingParties);\n```\n\n## API\n\n### OPRF Operations (`oprfClient`)\n\n- **`randomBlindingFactor(): BlindingFactor`** — sample random non-zero scalar\n- **`prepareBlindingFactor(beta): PreparedBlindingFactor`** — compute inverse for unblinding\n- **`blindQuery(query, beta): AffinePoint`** — blind query as `encode_to_curve(query) × β`\n- **`unblindResponse(response, prepared): AffinePoint`** — unblind as `response × β⁻¹`\n- **`finalizeOutput(domainSeparator, query, unblinded): bigint`** — hash via Poseidon2 (2Hash-DH)\n- **`finalizeQuery(query, response, beta, domainSeparator): bigint`** — convenience: unblind + finalize\n\n### Curve & Field\n\n- **`babyjubjub`** — BabyJubJub twisted Edwards curve from `@noble/curves`\n- **`G`** — prime-order subgroup generator\n- **`Fr`** — scalar field (subgroup order)\n- **`Fq`** — base field\n- **`BABYJUBJUB_SUBGROUP_GENERATOR_AFFINE`** — generator as affine point\n- **`encodeToCurve(input): Point`** — hash-to-curve via Elligator2 + rational map\n- **`babyJubJubAffineToCompressedBytes(point): Uint8Array`** — compressed serialization\n\n### DLog Equality\n\n- **`dlogEqualityProof(...): DLogEqualityProof`** — create Chaum-Pedersen proof\n- **`dlogEqualityVerify(...): void`** — verify proof (throws `InvalidProofError`)\n- **`challengeHash(...): bigint`** — Fiat-Shamir challenge via Blake3\n\n### Distributed DLog (Shamir)\n\n- **`DLogCommitmentsShamir`** — combines partial commitments from threshold parties\n- **`DLogSessionShamir`** — manages a distributed proof session\n- **`lagrangeFromCoeff(parties): bigint[]`** — Lagrange interpolation coefficients\n- **`reconstruct(shares, parties): bigint`** — reconstruct secret from shares\n\n## License\n\nMIT\n","readmeFilename":"README.md"}