Skip to content

Commit 60f3613

Browse files
committed
[wip] showcase
1 parent 40fcd1a commit 60f3613

File tree

3 files changed

+123
-4
lines changed

3 files changed

+123
-4
lines changed

src/library/plugin/pluginType.ts

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,71 @@
1+
import { json } from "body-parser";
2+
import { PublicKeyInput } from "crypto";
3+
import { RequestHandler } from "express";
14
import { JsonProof } from "o1js";
5+
import { initialize } from "passport";
26

37
export type PluginType = {
48
compile: () => Promise<string>;
59
getInputs: () => Promise<string[]>;
610
verify: (
7-
jsonProof: JsonProof,
8-
verificationKey: string,
11+
jsonProof: JsonProof,
12+
verificationKey: string,
913
) => Promise<[string | boolean | undefined, string]>;
1014
prove: (inputs: string[]) => Promise<undefined | JsonProof>;
11-
};
15+
};
16+
17+
export interface IMinAuthPlugin<PublicInputsArgs, Output> {
18+
verifyAndGetOutput(
19+
publicInputArgs: PublicInputsArgs,
20+
serializedProof: JsonProof): Promise<undefined | Output>;
21+
22+
readonly customRoutes: Map<string, RequestHandler>;
23+
24+
readonly verificationKey: string;
25+
}
26+
27+
export interface IMinAuthPluginFactory<
28+
T extends IMinAuthPlugin<PublicInputsArgs, Output>,
29+
Configuration, PublicInputsArgs, Output> {
30+
initialize(cfg: Configuration): Promise<T>;
31+
}
32+
33+
export abstract class MinAuthPlugin<Configuration, PublicInputsArgs, Output> {
34+
abstract initialize(configuration: Configuration): Promise<string/*The verification key*/>;
35+
36+
abstract verifyAndGetOutput(
37+
publicInputArgs: PublicInputsArgs,
38+
serializedProof: JsonProof): Promise<undefined | Output>;
39+
40+
abstract readonly customRoutes: Map<string, RequestHandler>;
41+
}
42+
43+
export abstract class MinAuthProver<Configuration, PublicInputsArgs, PublicInput, PrivateInput> {
44+
abstract initialize(configuration: Configuration): Promise<void>;
45+
46+
abstract prove(publicInput: PublicInput, secretInput: PrivateInput):
47+
Promise<undefined | JsonProof>;
48+
49+
abstract fetchPublicInputs(args: PublicInputsArgs): Promise<PublicInput>;
50+
}
51+
52+
53+
export function mkUntypedPlugin<
54+
T extends IMinAuthPlugin<PublicInputsArgs, Output>,
55+
Configuration, PublicInputsArgs, Output>(
56+
type: IMinAuthPluginFactory<T, Configuration, PublicInputsArgs, Output>,
57+
): // Oh please let me use haskell
58+
((_: any) => Promise<IMinAuthPlugin<any, any>>) {
59+
return async (cfg: any): Promise<IMinAuthPlugin<any, any>> => {
60+
const obj = await type.initialize(cfg as Configuration);
61+
62+
return {
63+
verifyAndGetOutput: async (
64+
publicInputArgs: string,
65+
serializedProof: JsonProof): Promise<undefined | any> =>
66+
await obj.verifyAndGetOutput(publicInputArgs as PublicInputsArgs, serializedProof),
67+
customRoutes: obj.customRoutes,
68+
verificationKey: obj.verificationKey
69+
};
70+
};
71+
}

src/plugins/passwordTree/plugin/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,4 @@ export const SimplePasswordTree: PluginType = {
8989
}
9090

9191
export default SimplePasswordTree;
92+

src/plugins/simplePreimage/plugin/index.ts

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { verify, Proof, Field, JsonProof, Experimental } from 'o1js';
2-
import { PluginType } from 'plugin/pluginType';
2+
import { IMinAuthPlugin, IMinAuthPluginFactory, MinAuthPlugin, PluginType } from 'plugin/pluginType';
33
import ProvePreimageProgram, { ProvePreimageProofClass } from './hashPreimageProof';
4+
import { RequestHandler } from 'express';
45

56

67
const roleMapping: Record<string, string> = {
@@ -54,3 +55,60 @@ export const SimplePreimage: PluginType = {
5455
};
5556

5657
export default SimplePreimage;
58+
59+
class SimplePreimagePlugin extends MinAuthPlugin<{ roles: Record<string, string> }, [], string>{
60+
private roles: Record<string, string> = {};
61+
62+
async initialize(configuration: { roles: Record<string, string> }): Promise<string> {
63+
64+
const { verificationKey } = await ProvePreimageProgram.compile();
65+
66+
this.roles = configuration.roles;
67+
68+
return verificationKey;
69+
};
70+
71+
async verifyAndGetOutput(_: [], serializedProof: JsonProof):
72+
Promise<undefined | string> {
73+
const proof = ProvePreimageProofClass.fromJSON(serializedProof);
74+
const role = roleMapping[proof.publicOutput.toString()];
75+
return role;
76+
};
77+
78+
get customRoutes(): Map<string, RequestHandler> {
79+
return new Map([["/roles", (_, res) => {
80+
res.status(200).json(this.roles);
81+
}]]);
82+
}
83+
}
84+
85+
class SimplePreimagePlugin_ implements IMinAuthPlugin<[], string>{
86+
readonly verificationKey: string;
87+
private readonly roles: Record<string, string>;
88+
89+
async verifyAndGetOutput(_: [], serializedProof: JsonProof):
90+
Promise<undefined | string> {
91+
const proof = ProvePreimageProofClass.fromJSON(serializedProof);
92+
const role = roleMapping[proof.publicOutput.toString()];
93+
return role;
94+
};
95+
96+
get customRoutes(): Map<string, RequestHandler> {
97+
return new Map([["/roles", (_, res) => {
98+
res.status(200).json(this.roles);
99+
}]]);
100+
}
101+
102+
constructor(verificationKey: string, roles: Record<string, string>) {
103+
this.verificationKey = verificationKey;
104+
this.roles = roles;
105+
}
106+
107+
static async initialize(configuration: { roles: Record<string, string> })
108+
: Promise<SimplePreimagePlugin_> {
109+
const { verificationKey } = await ProvePreimageProgram.compile();
110+
return new SimplePreimagePlugin_(verificationKey, configuration.roles);
111+
};
112+
}
113+
114+
SimplePreimagePlugin_ satisfies IMinAuthPluginFactory<SimplePreimagePlugin_, { roles: Record<string, string> }, [], string>;

0 commit comments

Comments
 (0)