Date: Sat, 2 Dec 2023 10:29:57 +0000
Subject: [PATCH 08/18] docs(eddsa-poseidon): update README.md
---
packages/eddsa-poseidon/README.md | 73 ++++++++++++++++++++++++++++++-
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/packages/eddsa-poseidon/README.md b/packages/eddsa-poseidon/README.md
index 9a2f5be2f..de45a2511 100644
--- a/packages/eddsa-poseidon/README.md
+++ b/packages/eddsa-poseidon/README.md
@@ -2,7 +2,7 @@
EdDSA Poseidon
- A JavaScript EdDSA library for secure signing and verification using the Baby Jubjub elliptic curve.
+ A JavaScript EdDSA library for secure signing and verification using Poseidon and the Baby Jubjub elliptic curve.
@@ -41,6 +41,18 @@
+| This package offers a simplified JavaScript codebase essential for creating and validating digital signatures using EdDSA and Poseidon. It's built upon the Baby Jubjub elliptic curve, ensuring seamless integration with [Circom](https://github.com/iden3/circom) and enhancing the developer experience. |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+
+- Super lightweight: [**~33kB**](https://bundlephobia.com/package/@zk-kit/eddsa-poseidon@0.1.0) (minified)
+- Compatible with browsers and NodeJS
+- TS type support
+- Comprehensive code [documentation](https://zkkit.pse.dev/modules/_zk_kit_eddsa_poseidon.html)
+- Full test coverage
+
+> [!WARNING]
+> This library has **not** been audited.
+
## 🛠 Install
### npm or yarn
@@ -56,3 +68,62 @@ or yarn:
```bash
yarn add @zk-kit/eddsa-poseidon
```
+
+## 📜 Usage
+
+\# **derivePublicKey**(privateKey: _BigNumberish_): _Point\_
+
+```typescript
+import { derivePublicKey } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = "secret"
+const publicKey = derivePublicKey(privateKey)
+
+console.log(publicKey)
+/*
+[
+ '17191193026255111087474416516591393721975640005415762645730433950079177536248',
+ '13751717961795090314625781035919035073474308127816403910435238282697898234143'
+]
+*/
+```
+
+\# **signMessage**(privateKey: _BigNumberish_, message: _BigNumberish_): _Signature\_
+
+```typescript
+import { derivePublicKey, signMessage } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = "secret"
+const publicKey = derivePublicKey(privateKey)
+
+const message = "message"
+const signature = signMessage(privateKey, message)
+
+console.log(signature)
+/*
+{
+ R8: [
+ '12949573675545142400102669657964360005184873166024880859462384824349649539693',
+ '18253636630408169174294927826710424418689461166073329946402765380454102840608'
+ ],
+ S: '701803947557694254685424075312408605924670918868054593580245088593184746870'
+}
+*/
+```
+
+
+\# **verifySignature**(message: _BigNumberish_, signature: _Signature_, publicKey: _Point_): _boolean_
+
+```typescript
+import { derivePublicKey, signMessage, verifySignature } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = "secret"
+const publicKey = derivePublicKey(privateKey)
+
+const message = "message"
+const signature = signMessage(privateKey, message)
+
+const response = verifySignature(message, signature, publicKey)
+
+console.log(response) // true
+```
From d1a576e584a3ab001ccf29fac7a1e84744444c88 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 10:31:04 +0000
Subject: [PATCH 09/18] chore(eddsa-poseidon): update package description
---
packages/eddsa-poseidon/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/eddsa-poseidon/package.json b/packages/eddsa-poseidon/package.json
index 772501184..549ef3832 100644
--- a/packages/eddsa-poseidon/package.json
+++ b/packages/eddsa-poseidon/package.json
@@ -1,7 +1,7 @@
{
"name": "@zk-kit/eddsa-poseidon",
"version": "0.1.0",
- "description": "A JavaScript EdDSA library for secure signing and verification using the Baby Jubjub elliptic curve.",
+ "description": "A JavaScript EdDSA library for secure signing and verification using Poseidon the Baby Jubjub elliptic curve.",
"license": "MIT",
"main": "dist/index.node.js",
"exports": {
From 7c424a51ef4aca158a663031890250b5d5048015 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 10:31:23 +0000
Subject: [PATCH 10/18] style(eddsa-poseidon): update function name
---
packages/eddsa-poseidon/src/eddsa-poseidon.ts | 4 +--
packages/eddsa-poseidon/tests/index.test.ts | 28 +++++++++----------
2 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/packages/eddsa-poseidon/src/eddsa-poseidon.ts b/packages/eddsa-poseidon/src/eddsa-poseidon.ts
index 6ab1c05a9..7c1a8096d 100644
--- a/packages/eddsa-poseidon/src/eddsa-poseidon.ts
+++ b/packages/eddsa-poseidon/src/eddsa-poseidon.ts
@@ -7,7 +7,7 @@ import { BigNumberish, Point, Signature } from "./types"
import * as utils from "./utils"
/**
- * Generates a public key from a given private key using the
+ * Derives a public key from a given private key using the
* {@link https://eips.ethereum.org/EIPS/eip-2494|Baby Jubjub} elliptic curve.
* This function utilizes the Baby Jubjub elliptic curve for cryptographic operations.
* The private key should be securely stored and managed, and it should never be exposed
@@ -15,7 +15,7 @@ import * as utils from "./utils"
* @param privateKey - The private key used for generating the public key.
* @returns The derived public key.
*/
-export function generatePublicKey(privateKey: BigNumberish | string): Point {
+export function derivePublicKey(privateKey: BigNumberish): Point {
// Convert the private key to buffer.
privateKey = utils.checkPrivateKey(privateKey)
diff --git a/packages/eddsa-poseidon/tests/index.test.ts b/packages/eddsa-poseidon/tests/index.test.ts
index 3fe01b52d..ccd178705 100644
--- a/packages/eddsa-poseidon/tests/index.test.ts
+++ b/packages/eddsa-poseidon/tests/index.test.ts
@@ -1,13 +1,13 @@
import { eddsa } from "circomlibjs"
import crypto from "crypto"
-import { generatePublicKey, signMessage, verifySignature } from "../src"
+import { derivePublicKey, signMessage, verifySignature } from "../src"
describe("EdDSAPoseidon", () => {
const privateKey = "secret"
const message = BigInt(2)
it("Should derive a public key from a private key (string)", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(privateKey)
@@ -18,7 +18,7 @@ describe("EdDSAPoseidon", () => {
it("Should derive a public key from a private key (hexadecimal)", async () => {
const privateKey = "0x12"
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(Buffer.from(privateKey.slice(2), "hex"))
@@ -29,7 +29,7 @@ describe("EdDSAPoseidon", () => {
it("Should derive a public key from a private key (buffer)", async () => {
const privateKey = Buffer.from("secret")
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(privateKey)
@@ -40,7 +40,7 @@ describe("EdDSAPoseidon", () => {
it("Should derive a public key from a private key (bigint)", async () => {
const privateKey = BigInt(22)
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(Buffer.from(privateKey.toString(16), "hex"))
@@ -51,7 +51,7 @@ describe("EdDSAPoseidon", () => {
it("Should derive a public key from a private key (number)", async () => {
const privateKey = 22
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(Buffer.from(privateKey.toString(16), "hex"))
@@ -62,7 +62,7 @@ describe("EdDSAPoseidon", () => {
it("Should throw an error if the secret type is not supported", async () => {
const privateKey = true
- const fun = () => generatePublicKey(privateKey as any)
+ const fun = () => derivePublicKey(privateKey as any)
expect(fun).toThrow("Invalid private key type.")
})
@@ -134,14 +134,14 @@ describe("EdDSAPoseidon", () => {
})
it("Should verify a signature", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
expect(verifySignature(message, signature, publicKey)).toBeTruthy()
})
it("Should not verify a signature if the public key is malformed", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
publicKey[1] = 3 as any
@@ -150,7 +150,7 @@ describe("EdDSAPoseidon", () => {
})
it("Should not verify a signature if the signature is malformed", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
signature.S = 3 as any
@@ -159,7 +159,7 @@ describe("EdDSAPoseidon", () => {
})
it("Should not verify a signature if the signature is not on the curve", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
signature.R8[1] = BigInt(3).toString()
@@ -168,7 +168,7 @@ describe("EdDSAPoseidon", () => {
})
it("Should not verify a signature if the public key is not on the curve", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
publicKey[1] = BigInt(3).toString()
@@ -177,7 +177,7 @@ describe("EdDSAPoseidon", () => {
})
it("Should not verify a signature S value exceeds the predefined sub order", async () => {
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const signature = signMessage(privateKey, message)
signature.S = "3421888242871839275222246405745257275088614511777268538073601725287587578984328"
@@ -189,7 +189,7 @@ describe("EdDSAPoseidon", () => {
for (let i = 0, len = 10; i < len; i += 1) {
const privateKey = crypto.randomBytes(32)
- const publicKey = generatePublicKey(privateKey)
+ const publicKey = derivePublicKey(privateKey)
const circomlibPublicKey = eddsa.prv2pub(privateKey)
From 3619d8182587e78f672cac60ec8c52120e27eb62 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 10:34:23 +0000
Subject: [PATCH 11/18] chore(eddsa-poseidon): remove comments
---
packages/eddsa-poseidon/src/field1.ts | 10 ----------
packages/eddsa-poseidon/src/scalar.ts | 8 --------
2 files changed, 18 deletions(-)
diff --git a/packages/eddsa-poseidon/src/field1.ts b/packages/eddsa-poseidon/src/field1.ts
index 0457b3baf..945e1d57f 100644
--- a/packages/eddsa-poseidon/src/field1.ts
+++ b/packages/eddsa-poseidon/src/field1.ts
@@ -9,14 +9,6 @@ export default class Field1 {
}
e(res: bigint): bigint {
- // if (res < 0) {
- // let nres = -res
-
- // if (nres >= this._order) nres %= this._order
-
- // return this._order - nres
- // }
-
return res >= this._order ? res % this._order : res
}
@@ -35,8 +27,6 @@ export default class Field1 {
}
inv(a: bigint): bigint {
- // if (!a) throw new Error("Division by zero")
-
let t = this.zero
let r = this._order
let newt = this.one
diff --git a/packages/eddsa-poseidon/src/scalar.ts b/packages/eddsa-poseidon/src/scalar.ts
index 8e54d4eb5..e77d7f02d 100644
--- a/packages/eddsa-poseidon/src/scalar.ts
+++ b/packages/eddsa-poseidon/src/scalar.ts
@@ -1,5 +1,3 @@
-// const hexLen = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4]
-
export function isZero(a: bigint): boolean {
return !a
}
@@ -12,12 +10,6 @@ export function shiftRight(a: bigint, n: bigint): bigint {
return a >> n
}
-// export function bitLength(a: bigint): number {
-// const aS = a.toString(16)
-
-// return (aS.length - 1) * 4 + hexLen[parseInt(aS[0], 16)]
-// }
-
export function mul(a: bigint, b: bigint): bigint {
return a * b
}
From 460db7456b4838174163c2c2d30008d4def41cd3 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 11:15:14 +0000
Subject: [PATCH 12/18] chore(eddsa-poseidon): add iife bundle with polyfills
---
packages/eddsa-poseidon/package.json | 17 ++++--
packages/eddsa-poseidon/rollup.config.ts | 1 +
packages/eddsa-poseidon/rollup.iife.config.ts | 47 +++++++++++++++
packages/eddsa-poseidon/tsconfig.json | 2 +-
yarn.lock | 57 ++++++++++++++-----
5 files changed, 103 insertions(+), 21 deletions(-)
create mode 100644 packages/eddsa-poseidon/rollup.iife.config.ts
diff --git a/packages/eddsa-poseidon/package.json b/packages/eddsa-poseidon/package.json
index 549ef3832..35020e0c0 100644
--- a/packages/eddsa-poseidon/package.json
+++ b/packages/eddsa-poseidon/package.json
@@ -3,10 +3,14 @@
"version": "0.1.0",
"description": "A JavaScript EdDSA library for secure signing and verification using Poseidon the Baby Jubjub elliptic curve.",
"license": "MIT",
+ "iife": "dist/index.js",
+ "unpkg": "dist/index.min.js",
+ "jsdelivr": "dist/index.min.js",
"main": "dist/index.node.js",
"exports": {
"import": "./dist/index.mjs",
- "require": "./dist/index.node.js"
+ "require": "./dist/index.node.js",
+ "types": "./dist/types/index.d.ts"
},
"types": "dist/types/index.d.ts",
"files": [
@@ -21,8 +25,8 @@
"url": "https://github.com/privacy-scaling-explorations/zk-kit.git/issues"
},
"scripts": {
- "build:watch": "rollup -c rollup.config.ts -w --configPlugin typescript",
- "build": "rimraf dist && rollup -c rollup.config.ts --configPlugin typescript",
+ "build": "rimraf dist && rollup -c rollup.config.ts --configPlugin typescript && yarn build:iife",
+ "build:iife": "rollup -c rollup.iife.config.ts --configPlugin typescript",
"prepublishOnly": "yarn build"
},
"publishConfig": {
@@ -31,11 +35,12 @@
"devDependencies": {
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
+ "blake-hash": "2.0.0",
"circomlibjs": "0.0.8",
+ "poseidon-lite": "0.2.0",
"rollup-plugin-cleanup": "^3.2.1",
+ "rollup-plugin-polyfill-node": "^0.13.0",
+ "rollup-plugin-terser": "^7.0.2",
"rollup-plugin-typescript2": "^0.31.2"
- },
- "dependencies": {
- "poseidon-lite": "^0.2.0"
}
}
diff --git a/packages/eddsa-poseidon/rollup.config.ts b/packages/eddsa-poseidon/rollup.config.ts
index 0b77ecf79..7d2994bd6 100644
--- a/packages/eddsa-poseidon/rollup.config.ts
+++ b/packages/eddsa-poseidon/rollup.config.ts
@@ -20,6 +20,7 @@ export default {
{ file: pkg.exports.require, format: "cjs", banner },
{ file: pkg.exports.import, format: "es", banner }
],
+ external: [],
plugins: [
typescript({ tsconfig: "./build.tsconfig.json", useTsconfigDeclarationDir: true }),
commonjs(),
diff --git a/packages/eddsa-poseidon/rollup.iife.config.ts b/packages/eddsa-poseidon/rollup.iife.config.ts
new file mode 100644
index 000000000..f7936620a
--- /dev/null
+++ b/packages/eddsa-poseidon/rollup.iife.config.ts
@@ -0,0 +1,47 @@
+import commonjs from "@rollup/plugin-commonjs"
+import { nodeResolve } from "@rollup/plugin-node-resolve"
+import fs from "fs"
+import nodePolyfills from "rollup-plugin-polyfill-node"
+import cleanup from "rollup-plugin-cleanup"
+import { terser } from "rollup-plugin-terser"
+import typescript from "rollup-plugin-typescript2"
+
+const pkg = JSON.parse(fs.readFileSync("./package.json", "utf8"))
+const banner = `/**
+ * @module ${pkg.name}
+ * @version ${pkg.version}
+ * @file ${pkg.description}
+ * @copyright Ethereum Foundation ${new Date().getFullYear()}
+ * @license ${pkg.license}
+ * @see [Github]{@link ${pkg.homepage}}
+*/`
+
+const name = pkg.name.split("/")[1].replace(/[-/]./g, (x: string) => x.toUpperCase()[1])
+
+export default {
+ input: "src/index.ts",
+ output: [
+ {
+ file: pkg.iife,
+ name,
+ format: "iife",
+ banner
+ },
+ {
+ file: pkg.unpkg,
+ name,
+ format: "iife",
+ plugins: [terser({ output: { preamble: banner } })]
+ }
+ ],
+ external: [],
+ plugins: [
+ typescript({ tsconfig: "./build.tsconfig.json", useTsconfigDeclarationDir: true }),
+ commonjs(),
+ nodeResolve({
+ preferBuiltins: true
+ }),
+ nodePolyfills({ include: null }),
+ cleanup({ comments: "jsdoc" })
+ ]
+}
diff --git a/packages/eddsa-poseidon/tsconfig.json b/packages/eddsa-poseidon/tsconfig.json
index 71510a096..81e592a16 100644
--- a/packages/eddsa-poseidon/tsconfig.json
+++ b/packages/eddsa-poseidon/tsconfig.json
@@ -1,4 +1,4 @@
{
"extends": "../../tsconfig.json",
- "include": ["src", "tests", "rollup.config.ts"]
+ "include": ["src", "tests", "rollup.config.ts", "rollup.iife.config.ts"]
}
diff --git a/yarn.lock b/yarn.lock
index 443913e6d..710c2ee35 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3324,6 +3324,22 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/plugin-inject@npm:^5.0.4":
+ version: 5.0.5
+ resolution: "@rollup/plugin-inject@npm:5.0.5"
+ dependencies:
+ "@rollup/pluginutils": ^5.0.1
+ estree-walker: ^2.0.2
+ magic-string: ^0.30.3
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ checksum: 22cb772fd6f7178308b2ece95cdde5f8615f6257197832166294552a7e4c0d3976dc996cbfa6470af3151d8b86c00091aa93da5f4db6ec563f11b6db29fd1b63
+ languageName: node
+ linkType: hard
+
"@rollup/plugin-json@npm:^5.0.1":
version: 5.0.2
resolution: "@rollup/plugin-json@npm:5.0.2"
@@ -4426,9 +4442,11 @@ __metadata:
dependencies:
"@rollup/plugin-commonjs": ^25.0.7
"@rollup/plugin-node-resolve": ^15.2.3
+ blake-hash: 2.0.0
circomlibjs: 0.0.8
- poseidon-lite: ^0.2.0
+ poseidon-lite: 0.2.0
rollup-plugin-cleanup: ^3.2.1
+ rollup-plugin-polyfill-node: ^0.13.0
rollup-plugin-terser: ^7.0.2
rollup-plugin-typescript2: ^0.31.2
languageName: unknown
@@ -5526,6 +5544,18 @@ __metadata:
languageName: node
linkType: hard
+"blake-hash@npm:2.0.0, blake-hash@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "blake-hash@npm:2.0.0"
+ dependencies:
+ node-addon-api: ^3.0.0
+ node-gyp: latest
+ node-gyp-build: ^4.2.2
+ readable-stream: ^3.6.0
+ checksum: a0d9a8f3953b986d3b30a741a6c000dedcc9a03b1318f52cc01ae62d18829ba6cb1a4d8cbe74785abfdc952a21db410984523bd457764aca716162cfd3ca8ea4
+ languageName: node
+ linkType: hard
+
"blake-hash@npm:^1.1.0":
version: 1.1.1
resolution: "blake-hash@npm:1.1.1"
@@ -5538,18 +5568,6 @@ __metadata:
languageName: node
linkType: hard
-"blake-hash@npm:^2.0.0":
- version: 2.0.0
- resolution: "blake-hash@npm:2.0.0"
- dependencies:
- node-addon-api: ^3.0.0
- node-gyp: latest
- node-gyp-build: ^4.2.2
- readable-stream: ^3.6.0
- checksum: a0d9a8f3953b986d3b30a741a6c000dedcc9a03b1318f52cc01ae62d18829ba6cb1a4d8cbe74785abfdc952a21db410984523bd457764aca716162cfd3ca8ea4
- languageName: node
- linkType: hard
-
"blake2b-wasm@git+https://github.com/jbaylina/blake2b-wasm.git":
version: 2.1.0
resolution: "blake2b-wasm@https://github.com/jbaylina/blake2b-wasm.git#commit=0d5f024b212429c7f50a7f533aa3a2406b5b42b3"
@@ -15235,7 +15253,7 @@ __metadata:
languageName: node
linkType: hard
-"poseidon-lite@npm:^0.2.0":
+"poseidon-lite@npm:0.2.0, poseidon-lite@npm:^0.2.0":
version: 0.2.0
resolution: "poseidon-lite@npm:0.2.0"
checksum: c47c6fd0a29a78ca1f7cf6ccb8b0c4f4e72930d944e63425e36f60c15d37fb0aeca30b8a22a30640ed68d631142282c0b8308da83b1a2b2bb92b87f5a2432c93
@@ -16133,6 +16151,17 @@ __metadata:
languageName: node
linkType: hard
+"rollup-plugin-polyfill-node@npm:^0.13.0":
+ version: 0.13.0
+ resolution: "rollup-plugin-polyfill-node@npm:0.13.0"
+ dependencies:
+ "@rollup/plugin-inject": ^5.0.4
+ peerDependencies:
+ rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
+ checksum: 73c5b9086955afa108c940c13205fab4cece149d020a3faa696c5711bbb391d11aecd4c913ad2cc5ac24f9d43a4969ad8d087d085dd8d423dece45b6be4039bb
+ languageName: node
+ linkType: hard
+
"rollup-plugin-terser@npm:^7.0.2":
version: 7.0.2
resolution: "rollup-plugin-terser@npm:7.0.2"
From c77a6033540bafcde95c1fea7aace386c62002d0 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 11:16:27 +0000
Subject: [PATCH 13/18] docs(eddsa-poseidon): add cdn references to readme
---
packages/eddsa-poseidon/README.md | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/packages/eddsa-poseidon/README.md b/packages/eddsa-poseidon/README.md
index de45a2511..11c7dacb0 100644
--- a/packages/eddsa-poseidon/README.md
+++ b/packages/eddsa-poseidon/README.md
@@ -42,7 +42,7 @@
| This package offers a simplified JavaScript codebase essential for creating and validating digital signatures using EdDSA and Poseidon. It's built upon the Baby Jubjub elliptic curve, ensuring seamless integration with [Circom](https://github.com/iden3/circom) and enhancing the developer experience. |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
- Super lightweight: [**~33kB**](https://bundlephobia.com/package/@zk-kit/eddsa-poseidon@0.1.0) (minified)
- Compatible with browsers and NodeJS
@@ -69,6 +69,20 @@ or yarn:
yarn add @zk-kit/eddsa-poseidon
```
+### CDN
+
+You can also load it using a `script` tag using [unpkg](https://unpkg.com/):
+
+```html
+
+```
+
+or [JSDelivr](https://www.jsdelivr.com/):
+
+```html
+
+```
+
## 📜 Usage
\# **derivePublicKey**(privateKey: _BigNumberish_): _Point\_
@@ -111,7 +125,6 @@ console.log(signature)
*/
```
-
\# **verifySignature**(message: _BigNumberish_, signature: _Signature_, publicKey: _Point_): _boolean_
```typescript
From 53772d46d839cd0a825408bd43180deeda62a092 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 11:16:54 +0000
Subject: [PATCH 14/18] chore(eddsa-poseidon): v0.2.0
---
packages/eddsa-poseidon/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/eddsa-poseidon/package.json b/packages/eddsa-poseidon/package.json
index 35020e0c0..65ec53e8b 100644
--- a/packages/eddsa-poseidon/package.json
+++ b/packages/eddsa-poseidon/package.json
@@ -1,6 +1,6 @@
{
"name": "@zk-kit/eddsa-poseidon",
- "version": "0.1.0",
+ "version": "0.2.0",
"description": "A JavaScript EdDSA library for secure signing and verification using Poseidon the Baby Jubjub elliptic curve.",
"license": "MIT",
"iife": "dist/index.js",
From b67c32503d4c0613615015076df5fde4b89bb77c Mon Sep 17 00:00:00 2001
From: Cedoor
Date: Sat, 2 Dec 2023 11:34:07 +0000
Subject: [PATCH 15/18] docs: update README.md
---
packages/eddsa-poseidon/README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/packages/eddsa-poseidon/README.md b/packages/eddsa-poseidon/README.md
index 11c7dacb0..c18b6d8f1 100644
--- a/packages/eddsa-poseidon/README.md
+++ b/packages/eddsa-poseidon/README.md
@@ -44,12 +44,14 @@
| This package offers a simplified JavaScript codebase essential for creating and validating digital signatures using EdDSA and Poseidon. It's built upon the Baby Jubjub elliptic curve, ensuring seamless integration with [Circom](https://github.com/iden3/circom) and enhancing the developer experience. |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-- Super lightweight: [**~33kB**](https://bundlephobia.com/package/@zk-kit/eddsa-poseidon@0.1.0) (minified)
+- Super lightweight: [**~33kB**](https://bundlephobia.com/package/@zk-kit/eddsa-poseidon) (minified)
- Compatible with browsers and NodeJS
- TS type support
- Comprehensive code [documentation](https://zkkit.pse.dev/modules/_zk_kit_eddsa_poseidon.html)
- Full test coverage
+👾 Would you like to try it now? Explore it now on [Ceditor](https://ceditor.cedoor.dev/52787e4ad57d2f2076648d509efc3448)!
+
> [!WARNING]
> This library has **not** been audited.
From d1b4244bef6d9242665225086a3d1d7eee1cfa1d Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 11:38:40 +0000
Subject: [PATCH 16/18] docs(eddsa-poseidon): add package to root readme
---
README.md | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/README.md b/README.md
index f99200140..48c4b0979 100644
--- a/README.md
+++ b/README.md
@@ -86,6 +86,34 @@
|
+
+
+
+ @zk-kit/eddsa-poseidon
+
+
+ (docs)
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+ |
+
From 221dacaea7f323b986d1690de06472708bc06817 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 11:46:28 +0000
Subject: [PATCH 17/18] chore: update npm build scripts
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 1db55cece..a1216580c 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"bugs": "https://github.com/privacy-scaling-explorations/zk-kit/issues",
"private": true,
"scripts": {
- "build": "yarn build:js && yarn compile:sol",
+ "build": "yarn build:libraries && yarn compile:contracts",
"build:libraries": "yarn workspaces foreach --no-private run build",
"compile:contracts": "yarn workspaces foreach run compile",
"test": "yarn test:libraries && yarn test:contracts && yarn test:circuits",
From 23314a7b123fa2ce2ca53d266f9b24478bc2fc36 Mon Sep 17 00:00:00 2001
From: cedoor
Date: Sat, 2 Dec 2023 22:38:04 +0000
Subject: [PATCH 18/18] docs(eddsa-poseidon): add doc to baby jubjub functions
---
packages/eddsa-poseidon/src/babyjub.ts | 79 ++++++++++++++-----
packages/eddsa-poseidon/src/eddsa-poseidon.ts | 6 +-
.../src/{field1.ts => field.ts} | 2 +-
3 files changed, 63 insertions(+), 24 deletions(-)
rename packages/eddsa-poseidon/src/{field1.ts => field.ts} (97%)
diff --git a/packages/eddsa-poseidon/src/babyjub.ts b/packages/eddsa-poseidon/src/babyjub.ts
index c85b21bb1..749fb3ee5 100644
--- a/packages/eddsa-poseidon/src/babyjub.ts
+++ b/packages/eddsa-poseidon/src/babyjub.ts
@@ -1,36 +1,75 @@
-import Field1 from "./field1"
+import Field from "./field"
import * as scalar from "./scalar"
import { Point } from "./types"
-export const F = new Field1(BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"))
+// Spec: https://eips.ethereum.org/EIPS/eip-2494
+// 'r' is the alt_bn128 prime order.
+export const r = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")
+
+// 'F' (F_r) is the prime finite field with r elements.
+export const Fr = new Field(r)
+
+// Base8 is the base point used to generate other points on the curve.
export const Base8: Point = [
- F.e(BigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553")),
- F.e(BigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203"))
+ Fr.e(BigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553")),
+ Fr.e(BigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203"))
]
+// Let E be the twisted Edwards elliptic curve defined over 'F_r'
+// described by the equation 'ax^2 + y^2 = 1 + dx^2y^2'.
+
+// 'a' and 'd' are the parameters of the equation:
+const a = Fr.e(BigInt("168700"))
+const d = Fr.e(BigInt("168696"))
+
+// We call Baby Jubjub the curve 'E(F_r)', that is, the subgroup of 'F_r'-rational points of 'E'.
+
+// 'order' is order of the elliptic curve 'E'.
export const order = BigInt("21888242871839275222246405745257275088614511777268538073601725287587578984328")
export const subOrder = scalar.shiftRight(order, BigInt(3))
-const A = F.e(BigInt("168700"))
-const D = F.e(BigInt("168696"))
-
-export function addPoint(a: Point, b: Point): Point {
- const beta = F.mul(a[0], b[1])
- const gamma = F.mul(a[1], b[0])
- const delta = F.mul(F.sub(a[1], F.mul(A, a[0])), F.add(b[0], b[1]))
+/**
+ * Performs point addition on the Baby Jubjub elliptic curve,
+ * calculating a third point from two given points.
+ * Let P1 = (x1, y1) and P2 = (x2, y2) be two arbitrary points of the curve.
+ * Then P1 + P2 = (x3, y3) is calculated in the following way:
+ * x3 = (x1*y2 + y1*x2)/(1 + d*x1*x2*y1*y2)
+ * y3 = (y1*y2 - a*x1*x2)/(1 - d*x1*x2*y1*y2)
+ * @param p1 - First point on the curve.
+ * @param p2 - Second point on the curve.
+ * @returns Resultant third point on the curve.
+ */
+export function addPoint(p1: Point, p2: Point): Point {
+ // beta = x1*y2
+ const beta = Fr.mul(p1[0], p2[1])
+ // gamma = y1*x2
+ const gamma = Fr.mul(p1[1], p2[0])
+ // delta = (y1-(a*x1))*(x2+y2)
+ const delta = Fr.mul(Fr.sub(p1[1], Fr.mul(a, p1[0])), Fr.add(p2[0], p2[1]))
- const tau = F.mul(beta, gamma)
- const dtau = F.mul(D, tau)
+ // x1*x2*y1*y2
+ const tau = Fr.mul(beta, gamma)
+ // d*x1*x2*y1*y2
+ const dtau = Fr.mul(d, tau)
- const x = F.div(F.add(beta, gamma), F.add(F.one, dtau))
- const y = F.div(F.add(delta, F.sub(F.mul(A, beta), gamma)), F.sub(F.one, dtau))
+ // x3 = (x1*y2 + y1*x2)/(1 + d*x1*x2*y1*y2)
+ const p3x = Fr.div(Fr.add(beta, gamma), Fr.add(Fr.one, dtau))
+ // y3 = (y1*y2 - a*x1*x2)/(1 - d*x1*x2*y1*y2)
+ const p3y = Fr.div(Fr.add(delta, Fr.sub(Fr.mul(a, beta), gamma)), Fr.sub(Fr.one, dtau))
- return [x, y]
+ return [p3x, p3y]
}
+/**
+ * Performs a scalar multiplication by starting from the 'base' point and 'adding'
+ * it to itself 'e' times.
+ * @param base - The base point used as a starting point.
+ * @param e - A secret number representing the private key.
+ * @returns The resulting point representing the public key.
+ */
export function mulPointEscalar(base: Point, e: bigint): Point {
- let res: Point = [F.e(BigInt(0)), F.e(BigInt(1))]
+ let res: Point = [Fr.e(BigInt(0)), Fr.e(BigInt(1))]
let rem: bigint = e
let exp: Point = base
@@ -50,8 +89,8 @@ export function inCurve(p: Point) {
p[0] = BigInt(p[0])
p[1] = BigInt(p[1])
- const x2 = F.square(p[0])
- const y2 = F.square(p[1])
+ const x2 = Fr.square(p[0])
+ const y2 = Fr.square(p[1])
- return F.eq(F.add(F.mul(A, x2), y2), F.add(F.one, F.mul(F.mul(x2, y2), D)))
+ return Fr.eq(Fr.add(Fr.mul(a, x2), y2), Fr.add(Fr.one, Fr.mul(Fr.mul(x2, y2), d)))
}
diff --git a/packages/eddsa-poseidon/src/eddsa-poseidon.ts b/packages/eddsa-poseidon/src/eddsa-poseidon.ts
index 7c1a8096d..cc85c4625 100644
--- a/packages/eddsa-poseidon/src/eddsa-poseidon.ts
+++ b/packages/eddsa-poseidon/src/eddsa-poseidon.ts
@@ -1,7 +1,7 @@
import { poseidon5 } from "poseidon-lite/poseidon5"
import * as babyjub from "./babyjub"
import blake from "./blake"
-import Field1 from "./field1"
+import Field from "./field"
import * as scalar from "./scalar"
import { BigNumberish, Point, Signature } from "./types"
import * as utils from "./utils"
@@ -53,7 +53,7 @@ export function signMessage(privateKey: BigNumberish, message: BigNumberish): Si
const rBuff = blake(Buffer.concat([hash.slice(32, 64), msgBuff]))
- const Fr = new Field1(babyjub.subOrder)
+ const Fr = new Field(babyjub.subOrder)
const r = Fr.e(utils.leBuff2int(rBuff))
const R8 = babyjub.mulPointEscalar(babyjub.Base8, r)
@@ -104,5 +104,5 @@ export function verifySignature(message: BigNumberish, signature: Signature, pub
pRight = babyjub.addPoint(_signature.R8, pRight)
// Return true if the points match.
- return babyjub.F.eq(BigInt(pLeft[0]), pRight[0]) && babyjub.F.eq(pLeft[1], pRight[1])
+ return babyjub.Fr.eq(BigInt(pLeft[0]), pRight[0]) && babyjub.Fr.eq(pLeft[1], pRight[1])
}
diff --git a/packages/eddsa-poseidon/src/field1.ts b/packages/eddsa-poseidon/src/field.ts
similarity index 97%
rename from packages/eddsa-poseidon/src/field1.ts
rename to packages/eddsa-poseidon/src/field.ts
index 945e1d57f..660bdcd74 100644
--- a/packages/eddsa-poseidon/src/field1.ts
+++ b/packages/eddsa-poseidon/src/field.ts
@@ -1,4 +1,4 @@
-export default class Field1 {
+export default class Field {
one = BigInt(1)
zero = BigInt(0)
|