UNPKG

@zkpersona/noir-social-verify

Version:

A library that provides a simple way to verify ownership of social accounts by proving e-mails.

138 lines (135 loc) 15.5 kB
'use strict'; var zkemailNr = require('@zk-email/zkemail-nr'); var bb_js = require('@aztec/bb.js'); var noir_js = require('@noir-lang/noir_js'); // src/helpers.ts var circuitParams = { google: { maxHeadersLength: 576, maxBodyLength: 16384, extractFrom: true, extractTo: true }, x: { maxHeadersLength: 576, maxBodyLength: 16384, extractFrom: true, extractTo: true } }; var createProver = (circuit, backend) => { const prover = new ZKEmailProver(circuit, backend); return prover; }; var generateCircuitInputs = async (emailContent, circuitType) => { const inputs = await zkemailNr.generateEmailVerifierInputs( emailContent, circuitParams[circuitType] ); return inputs; }; var ZKEmailProver = class { plonk; honk; noir; provingBackend; constructor(circuit, provingBackend) { const acirBytecode = circuit.bytecode; if (provingBackend.type === "plonk" || provingBackend.type === "all") { this.plonk = new bb_js.UltraPlonkBackend( acirBytecode, provingBackend.options, provingBackend.circuitOptions ); } if (provingBackend.type === "honk" || provingBackend.type === "all") { this.honk = new bb_js.UltraHonkBackend( acirBytecode, provingBackend.options, provingBackend.circuitOptions ); } this.provingBackend = provingBackend; this.noir = new noir_js.Noir(circuit); } /** * Compute the witness for a given input to the circuit without generating a proof * * @param input - the input that should produce a satisfying witness for the circuit * @returns - the witness for the input and the output of the circuit if satisfiable */ async simulateWitness(input) { return await this.noir.execute(input); } /** * Generate a proof of a satisfying input to the circuit using a provided witness * * @param input - a satisfying witness for the circuit * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns proof of valid execution of the circuit */ async prove(witness, provingBackend) { const backend = this.getProvingBackend(provingBackend?.type); return await backend.generateProof(witness); } /** * Simulate the witness for a given input and generate a proof * * @param input - the input that should produce a satisfying witness for the circuit * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns proof of valid execution of the circuit */ async fullProve(input, provingBackend) { const { witness } = await this.simulateWitness(input); return this.prove(witness, provingBackend); } /** * Verify a proof of a satisfying input to the circuit for a given proving scheme * * @param proof - the proof to verify * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns true if the proof is valid, false otherwise */ async verify(proof, provingBackend) { const backend = this.getProvingBackend(provingBackend?.type); return await backend.verifyProof(proof); } /** * End the prover wasm instance(s) and clean up resources */ async destroy() { if (this.plonk) { await this.plonk.destroy(); } if (this.honk) { await this.honk.destroy(); } } getProvingBackend(backendType) { let type; if (backendType === "plonk" || this.provingBackend.type === "plonk") { type = "plonk"; } else if (backendType === "honk" || this.provingBackend.type === "honk") { type = "honk"; } else { throw new Error( 'Specify a proving backend from either "plonk" or "honk"' ); } let backend; if (type === "plonk" && this.plonk) { backend = this.plonk; } else if (type === "honk" && this.honk) { backend = this.honk; } else { throw new Error(`Proving backend ${type} not initialized`); } return backend; } }; exports.ZKEmailProver = ZKEmailProver; exports.circuitParams = circuitParams; exports.createProver = createProver; exports.generateCircuitInputs = generateCircuitInputs; //# sourceMappingURL=index.js.map //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIiwiLi4vc3JjL3Byb3Zlci50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUVtYWlsVmVyaWZpZXJJbnB1dHMiLCJVbHRyYVBsb25rQmFja2VuZCIsIlVsdHJhSG9ua0JhY2tlbmQiLCJOb2lyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUU8sSUFBTSxhQUEwRCxHQUFBO0FBQUEsRUFDckUsTUFBUSxFQUFBO0FBQUEsSUFDTixnQkFBa0IsRUFBQSxHQUFBO0FBQUEsSUFDbEIsYUFBZSxFQUFBLEtBQUE7QUFBQSxJQUNmLFdBQWEsRUFBQSxJQUFBO0FBQUEsSUFDYixTQUFXLEVBQUE7QUFBQSxHQUNiO0FBQUEsRUFDQSxDQUFHLEVBQUE7QUFBQSxJQUNELGdCQUFrQixFQUFBLEdBQUE7QUFBQSxJQUNsQixhQUFlLEVBQUEsS0FBQTtBQUFBLElBQ2YsV0FBYSxFQUFBLElBQUE7QUFBQSxJQUNiLFNBQVcsRUFBQTtBQUFBO0FBRWY7QUFFYSxJQUFBLFlBQUEsR0FBZSxDQUMxQixPQUFBLEVBQ0EsT0FDRyxLQUFBO0FBQ0gsRUFBQSxNQUFNLE1BQVMsR0FBQSxJQUFJLGFBQWMsQ0FBQSxPQUFBLEVBQVMsT0FBTyxDQUFBO0FBQ2pELEVBQU8sT0FBQSxNQUFBO0FBQ1Q7QUFFYSxJQUFBLHFCQUFBLEdBQXdCLE9BQ25DLFlBQUEsRUFDQSxXQUNHLEtBQUE7QUFDSCxFQUFBLE1BQU0sU0FBUyxNQUFNQSxxQ0FBQTtBQUFBLElBQ25CLFlBQUE7QUFBQSxJQUNBLGNBQWMsV0FBVztBQUFBLEdBQzNCO0FBRUEsRUFBTyxPQUFBLE1BQUE7QUFDVDtBQ3JCTyxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFDekIsS0FBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsY0FBQTtBQUFBLEVBRUEsV0FBQSxDQUFZLFNBQTBCLGNBQWdDLEVBQUE7QUFDcEUsSUFBQSxNQUFNLGVBQWUsT0FBUSxDQUFBLFFBQUE7QUFDN0IsSUFBQSxJ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LEdBQVUsSUFBSyxDQUFBLEtBQUE7QUFBQSxLQUNOLE1BQUEsSUFBQSxJQUFBLEtBQVMsTUFBVSxJQUFBLElBQUEsQ0FBSyxJQUFNLEVBQUE7QUFDdkMsTUFBQSxPQUFBLEdBQVUsSUFBSyxDQUFBLElBQUE7QUFBQSxLQUNWLE1BQUE7QUFDTCxNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBbUIsZ0JBQUEsRUFBQSxJQUFJLENBQWtCLGdCQUFBLENBQUEsQ0FBQTtBQUFBO0FBRzNELElBQU8sT0FBQSxPQUFBO0FBQUE7QUFFWCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcGlsZWRDaXJjdWl0IH0gZnJvbSAnQG5vaXItbGFuZy9ub2lyX2pzJztcbmltcG9ydCB7XG4gIHR5cGUgSW5wdXRHZW5lcmF0aW9uQXJncyxcbiAgZ2VuZXJhdGVFbWFpbFZlcmlmaWVySW5wdXRzLFxufSBmcm9tICdAemstZW1haWwvemtlbWFpbC1ucic7XG5pbXBvcnQgeyB0eXBlIFByb3ZpbmdCYWNrZW5kLCBaS0VtYWlsUHJvdmVyIH0gZnJvbSAnLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgQ2lyY3VpdElucHV0TWFwLCBDaXJjdWl0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgY2lyY3VpdFBhcmFtczogUmVjb3JkPENpcmN1aXRUeXBlLCBJbnB1dEdlbmVyYXRpb25BcmdzPiA9IHtcbiAgZ29vZ2xlOiB7XG4gICAgbWF4SGVhZGVyc0xlbmd0aDogNTc2LFxuICAgIG1heEJvZHlMZW5ndGg6IDE2Mzg0LFxuICAgIGV4dHJhY3RGcm9tOiB0cnVlLFxuICAgIGV4dHJhY3RUbzogdHJ1ZSxcbiAgfSxcbiAgeDoge1xuICAgIG1heEhlYWRlcnNMZW5ndGg6IDU3NixcbiAgICBtYXhCb2R5TGVuZ3RoOiAxNjM4NCxcbiAgICBleHRyYWN0RnJvbTogdHJ1ZSxcbiAgICBleHRyYWN0VG86IHRydWUsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvdmVyID0gKFxuICBjaXJjdWl0OiBDb21waWxlZENpcmN1aXQsXG4gIGJhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kXG4pID0+IHtcbiAgY29uc3QgcHJvdmVyID0gbmV3IFpLRW1haWxQcm92ZXIoY2lyY3VpdCwgYmFja2VuZCk7XG4gIHJldHVybiBwcm92ZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVDaXJjdWl0SW5wdXRzID0gYXN5bmMgPFQgZXh0ZW5kcyBDaXJjdWl0VHlwZT4oXG4gIGVtYWlsQ29udGVudDogQnVmZmVyIHwgc3RyaW5nLFxuICBjaXJjdWl0VHlwZTogVFxuKSA9PiB7XG4gIGNvbnN0IGlucHV0cyA9IGF3YWl0IGdlbmVyYXRlRW1haWxWZXJpZmllcklucHV0cyhcbiAgICBlbWFpbENvbnRlbnQsXG4gICAgY2lyY3VpdFBhcmFtc1tjaXJjdWl0VHlwZV1cbiAgKTtcblxuICByZXR1cm4gaW5wdXRzIGFzIENpcmN1aXRJbnB1dE1hcFtUXTtcbn07XG4iLCJpbXBvcnQge1xuICB0eXBlIEJhY2tlbmRPcHRpb25zLFxuICB0eXBlIFByb29mRGF0YSxcbiAgVWx0cmFIb25rQmFja2VuZCxcbiAgVWx0cmFQbG9ua0JhY2tlbmQsXG59IGZyb20gJ0BhenRlYy9iYi5qcyc7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVkQ2lyY3VpdCwgdHlwZSBJbnB1dE1hcCwgTm9pciB9IGZyb20gJ0Bub2lyLWxhbmcvbm9pcl9qcyc7XG50eXBlIElucHV0VmFsdWUgPSBJbnB1dE1hcFtzdHJpbmddO1xuXG50eXBlIENpcmN1aXRPcHRpb25zID0ge1xuICAvKiogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gcHJvZHVjZSBTTkFSSyBmcmllbmRseSBwcm9vZnMgKi9cbiAgcmVjdXJzaXZlOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvdmluZ0JhY2tlbmQgPSB7XG4gIHR5cGU6ICdob25rJyB8ICdwbG9uaycgfCAnYWxsJztcbiAgb3B0aW9ucz86IEJhY2tlbmRPcHRpb25zO1xuICBjaXJjdWl0T3B0aW9ucz86IENpcmN1aXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGNsYXNzIFpLRW1haWxQcm92ZXIge1xuICBwbG9uaz86IFVsdHJhUGxvbmtCYWNrZW5kO1xuICBob25rPzogVWx0cmFIb25rQmFja2VuZDtcbiAgbm9pcjogTm9pcjtcbiAgcHJvdmluZ0JhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kO1xuXG4gIGNvbnN0cnVjdG9yKGNpcmN1aXQ6IENvbXBpbGVkQ2lyY3VpdCwgcHJvdmluZ0JhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kKSB7XG4gICAgY29uc3QgYWNpckJ5dGVjb2RlID0gY2lyY3VpdC5ieXRlY29kZTtcbiAgICBpZiAocHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ3Bsb25rJyB8fCBwcm92aW5nQmFja2VuZC50eXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy5wbG9uayA9IG5ldyBVbHRyYVBsb25rQmFja2VuZChcbiAgICAgICAgYWNpckJ5dGVjb2RlLFxuICAgICAgICBwcm92aW5nQmFja2VuZC5vcHRpb25zLFxuICAgICAgICBwcm92aW5nQmFja2VuZC5jaXJjdWl0T3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3ZpbmdCYWNrZW5kLnR5cGUgPT09ICdob25rJyB8fCBwcm92aW5nQmFja2VuZC50eXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy5ob25rID0gbmV3IFVsdHJhSG9ua0JhY2tlbmQoXG4gICAgICAgIGFjaXJCeXRlY29kZSxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQub3B0aW9ucyxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQuY2lyY3VpdE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucHJvdmluZ0JhY2tlbmQgPSBwcm92aW5nQmFja2VuZDtcbiAgICB0aGlzLm5vaXIgPSBuZXcgTm9pcihjaXJjdWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB3aXRuZXNzIGZvciBhIGdpdmVuIGlucHV0IHRvIHRoZSBjaXJjdWl0IHdpdGhvdXQgZ2VuZXJhdGluZyBhIHByb29mXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIHRoZSBpbnB1dCB0aGF0IHNob3VsZCBwcm9kdWNlIGEgc2F0aXNmeWluZyB3aXRuZXNzIGZvciB0aGUgY2lyY3VpdFxuICAgKiBAcmV0dXJucyAtIHRoZSB3aXRuZXNzIGZvciB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgb2YgdGhlIGNpcmN1aXQgaWYgc2F0aXNmaWFibGVcbiAgICovXG4gIGFzeW5jIHNpbXVsYXRlV2l0bmVzcyhcbiAgICBpbnB1dDogSW5wdXRNYXBcbiAgKTogUHJvbWlzZTx7IHdpdG5lc3M6IFVpbnQ4QXJyYXk7IHJldHVyblZhbHVlOiBJbnB1dFZhbHVlIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ub2lyLmV4ZWN1dGUoaW5wdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgcHJvb2Ygb2YgYSBzYXRpc2Z5aW5nIGlucHV0IHRvIHRoZSBjaXJjdWl0IHVzaW5nIGEgcHJvdmlkZWQgd2l0bmVzc1xuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBhIHNhdGlzZnlpbmcgd2l0bmVzcyBmb3IgdGhlIGNpcmN1aXRcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgcHJvb2Ygb2YgdmFsaWQgZXhlY3V0aW9uIG9mIHRoZSBjaXJjdWl0XG4gICAqL1xuICBhc3luYyBwcm92ZShcbiAgICB3aXRuZXNzOiBVaW50OEFycmF5LFxuICAgIHByb3ZpbmdCYWNrZW5kPzogUHJvdmluZ0JhY2tlbmRcbiAgKTogUHJvbWlzZTxQcm9vZkRhdGE+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5nZXRQcm92aW5nQmFja2VuZChwcm92aW5nQmFja2VuZD8udHlwZSk7XG4gICAgcmV0dXJuIGF3YWl0IGJhY2tlbmQuZ2VuZXJhdGVQcm9vZih3aXRuZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB0aGUgd2l0bmVzcyBmb3IgYSBnaXZlbiBpbnB1dCBhbmQgZ2VuZXJhdGUgYSBwcm9vZlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSB0aGUgaW5wdXQgdGhhdCBzaG91bGQgcHJvZHVjZSBhIHNhdGlzZnlpbmcgd2l0bmVzcyBmb3IgdGhlIGNpcmN1aXRcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgcHJvb2Ygb2YgdmFsaWQgZXhlY3V0aW9uIG9mIHRoZSBjaXJjdWl0XG4gICAqL1xuICBhc3luYyBmdWxsUHJvdmUoXG4gICAgaW5wdXQ6IElucHV0TWFwLFxuICAgIHByb3ZpbmdCYWNrZW5kPzogUHJvdmluZ0JhY2tlbmRcbiAgKTogUHJvbWlzZTxQcm9vZkRhdGE+IHtcbiAgICBjb25zdCB7IHdpdG5lc3MgfSA9IGF3YWl0IHRoaXMuc2ltdWxhdGVXaXRuZXNzKGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5wcm92ZSh3aXRuZXNzLCBwcm92aW5nQmFja2VuZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGEgcHJvb2Ygb2YgYSBzYXRpc2Z5aW5nIGlucHV0IHRvIHRoZSBjaXJjdWl0IGZvciBhIGdpdmVuIHByb3Zpbmcgc2NoZW1lXG4gICAqXG4gICAqIEBwYXJhbSBwcm9vZiAtIHRoZSBwcm9vZiB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvb2YgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5KFxuICAgIHByb29mOiBQcm9vZkRhdGEsXG4gICAgcHJvdmluZ0JhY2tlbmQ/OiBQcm92aW5nQmFja2VuZFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5nZXRQcm92aW5nQmFja2VuZChwcm92aW5nQmFja2VuZD8udHlwZSk7XG4gICAgcmV0dXJuIGF3YWl0IGJhY2tlbmQudmVyaWZ5UHJvb2YocHJvb2YpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgcHJvdmVyIHdhc20gaW5zdGFuY2UocykgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5wbG9uaykge1xuICAgICAgYXdhaXQgdGhpcy5wbG9uay5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhvbmspIHtcbiAgICAgIGF3YWl0IHRoaXMuaG9uay5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm92aW5nQmFja2VuZChiYWNrZW5kVHlwZT86IFByb3ZpbmdCYWNrZW5kWyd0eXBlJ10pIHtcbiAgICBsZXQgdHlwZTogJ3Bsb25rJyB8ICdob25rJztcbiAgICBpZiAoYmFja2VuZFR5cGUgPT09ICdwbG9uaycgfHwgdGhpcy5wcm92aW5nQmFja2VuZC50eXBlID09PSAncGxvbmsnKSB7XG4gICAgICB0eXBlID0gJ3Bsb25rJztcbiAgICB9IGVsc2UgaWYgKGJhY2tlbmRUeXBlID09PSAnaG9uaycgfHwgdGhpcy5wcm92aW5nQmFja2VuZC50eXBlID09PSAnaG9uaycpIHtcbiAgICAgIHR5cGUgPSAnaG9uayc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1NwZWNpZnkgYSBwcm92aW5nIGJhY2tlbmQgZnJvbSBlaXRoZXIgXCJwbG9ua1wiIG9yIFwiaG9ua1wiJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYmFja2VuZDogVWx0cmFQbG9ua0JhY2tlbmQgfCBVbHRyYUhvbmtCYWNrZW5kO1xuICAgIGlmICh0eXBlID09PSAncGxvbmsnICYmIHRoaXMucGxvbmspIHtcbiAgICAgIGJhY2tlbmQgPSB0aGlzLnBsb25rO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2hvbmsnICYmIHRoaXMuaG9uaykge1xuICAgICAgYmFja2VuZCA9IHRoaXMuaG9uaztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aW5nIGJhY2tlbmQgJHt0eXBlfSBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFja2VuZDtcbiAgfVxufVxuIl19