From 28bbd32ad5729e902e688b0f94e6fdca23ab4c0b Mon Sep 17 00:00:00 2001 From: bdim1 Date: Thu, 20 Jan 2022 16:56:15 +0100 Subject: [PATCH] fix: identity multipart secret updates & nrln tests Former-commit-id: 5f8da156540d55af49f5f8c7cf21057ea3d95d0d [formerly 878bc652fda259f9b6e9fe92d7dac0c7c98d24ea] [formerly 345eaf93038b53f23076dc0e82ac8285e5b83c69 [formerly 9574347e0a1dc06a9197a73b30bbdce1910cec65]] Former-commit-id: 619baf96d5aed6f96f7abdf5b8c8f1b6b044d181 [formerly 50fa55ae0392267aee25919cdfaac6f4b8781ef0] Former-commit-id: 7c2b81f3913c31ce47dfdb7959df6cc2c7ed739d --- packages/identity/src/identity.ts | 28 ++++++++++++++------------- packages/protocols/tests/nrln.test.ts | 17 ++++++---------- zkeyFiles.zip.REMOVED.git-id | 2 +- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/identity/src/identity.ts b/packages/identity/src/identity.ts index ae3e19b..0a2a60f 100644 --- a/packages/identity/src/identity.ts +++ b/packages/identity/src/identity.ts @@ -15,6 +15,7 @@ export default class ZkIdentity { private _secret: bigint[] = [] private _multipartSecret: bigint[] = [] + private _defaultMultipartSecret: bigint[] = [] /** * Generates new ZkIdentity. @@ -30,7 +31,7 @@ export default class ZkIdentity { this._identityTrapdoor = identityTrapdoor this._identityNullifier = identityNullifier this._secret = [this._identityNullifier, this._identityTrapdoor] - this.genMultipartSecret() + this._genMultipartSecret() break } @@ -40,7 +41,7 @@ export default class ZkIdentity { this._identityTrapdoor = identityTrapdoor this._identityNullifier = identityNullifier this._secret = [this._identityNullifier, this._identityTrapdoor] - this.genMultipartSecret() + this._genMultipartSecret() break } @@ -59,6 +60,7 @@ export default class ZkIdentity { this._identityTrapdoor = hexToBigint(identityTrapdoor) this._secret = secret.map((item) => hexToBigint(item)) this._multipartSecret = multipartSecret.map((item) => hexToBigint(item)) + this._defaultMultipartSecret = this._multipartSecret.slice(0, 2); break } @@ -69,19 +71,18 @@ export default class ZkIdentity { /** * Generate multipart secret. To be used by RLN related apps. - * @param parts The number of parts that the secret should be composed of, - * corresponding to the spam threshold of the protocol */ - public genMultipartSecret(parts = 2): void { - if (parts < 2) throw new Error("Invalid number of parts") + private _genMultipartSecret(): void { const initialComponent = Fq.pow(this._identityTrapdoor, this._identityNullifier) this._multipartSecret = [initialComponent] - for (let i = 1; i < parts; i += 1) { + for (let i = 1; i < 16; i+=1) { this._multipartSecret.push(Fq.pow(initialComponent, BigInt(i + 1))) } + + this._defaultMultipartSecret = this._multipartSecret.slice(0, 2); } /** @@ -103,16 +104,17 @@ export default class ZkIdentity { return this._secret } - public getMultipartSecret(): bigint[] { - return this._multipartSecret + public getMultipartSecret(secretParts: number = 2): bigint[] { + return secretParts === 2 ? this._defaultMultipartSecret : this._multipartSecret.slice(0, secretParts); } public getSecretHash(): bigint { return poseidon(this._secret) } - public getMultipartSecretHash(): bigint { - return poseidon(this._multipartSecret) + public getMultipartSecretHash(secretParts: number = 2): bigint { + const multipartSecret = this.getMultipartSecret(secretParts); + return poseidon(multipartSecret) } /** @@ -120,12 +122,12 @@ export default class ZkIdentity { * @param secretType The secret type for which to generate identity commitment * @returns identity commitment */ - public genIdentityCommitment(secretType: SecretType = SecretType.GENERIC): bigint { + public genIdentityCommitment(secretType: SecretType = SecretType.GENERIC, secretParts: number = 2): bigint { switch (secretType) { case SecretType.GENERIC: return poseidon([this.getSecretHash()]) case SecretType.MULTIPART_SECRET: - return poseidon([this.getMultipartSecretHash()]) + return poseidon([this.getMultipartSecretHash(secretParts)]) default: throw new Error("Provided secret type is not supported") } diff --git a/packages/protocols/tests/nrln.test.ts b/packages/protocols/tests/nrln.test.ts index 42dc6d6..2aaa1e8 100644 --- a/packages/protocols/tests/nrln.test.ts +++ b/packages/protocols/tests/nrln.test.ts @@ -13,8 +13,7 @@ beforeAll(() => { for (let i = 0; i < leafIndex; i += 1) { const tmpIdentity = new ZkIdentity() - tmpIdentity.genMultipartSecret(SPAM_TRESHOLD) - const tmpCommitment: bigint = tmpIdentity.genIdentityCommitment(SecretType.MULTIPART_SECRET) + const tmpCommitment: bigint = tmpIdentity.genIdentityCommitment(SecretType.MULTIPART_SECRET, SPAM_TRESHOLD) identityCommitments.push(tmpCommitment) } }) @@ -23,10 +22,9 @@ describe("NRLN", () => { describe("NRLN features", () => { it("Generate NRLN witness", () => { const identity: ZkIdentity = new ZkIdentity() - identity.genMultipartSecret(SPAM_TRESHOLD) - const identityCommitment: bigint = identity.genIdentityCommitment(SecretType.MULTIPART_SECRET) - const identitySecret: bigint[] = identity.getMultipartSecret() + const identityCommitment: bigint = identity.genIdentityCommitment(SecretType.MULTIPART_SECRET, SPAM_TRESHOLD) + const identitySecret: bigint[] = identity.getMultipartSecret(SPAM_TRESHOLD) const commitments: Array = Object.assign([], identityCommitments) commitments.push(identityCommitment) @@ -45,11 +43,9 @@ describe("NRLN", () => { * Compiled RLN circuits are needed to run this test so it's being skipped in hooks */ const identity: ZkIdentity = new ZkIdentity() - identity.genMultipartSecret(SPAM_TRESHOLD) - - const identityCommitment: bigint = identity.genIdentityCommitment(SecretType.MULTIPART_SECRET) - const identitySecret: bigint[] = identity.getMultipartSecret() + const identityCommitment: bigint = identity.genIdentityCommitment(SecretType.MULTIPART_SECRET, SPAM_TRESHOLD) + const identitySecret: bigint[] = identity.getMultipartSecret(SPAM_TRESHOLD) const commitments: Array = Object.assign([], identityCommitments) commitments.push(identityCommitment) @@ -83,9 +79,8 @@ describe("NRLN", () => { }, 30000) it("Should retrieve user secret after spaming", () => { const identity: ZkIdentity = new ZkIdentity() - identity.genMultipartSecret(SPAM_TRESHOLD) - const identitySecret: bigint[] = identity.getMultipartSecret() + const identitySecret: bigint[] = identity.getMultipartSecret(SPAM_TRESHOLD) const signal1 = "hey 1" const signalHash1 = genSignalHash(signal1) diff --git a/zkeyFiles.zip.REMOVED.git-id b/zkeyFiles.zip.REMOVED.git-id index eb7e3a1..174f00e 100644 --- a/zkeyFiles.zip.REMOVED.git-id +++ b/zkeyFiles.zip.REMOVED.git-id @@ -1 +1 @@ -84e86da6e86f333fb01d6cd1576b7b3657dca3e6 \ No newline at end of file +a70254b53a6a13e3a41991a4b375cbd3edf42d89 \ No newline at end of file