diff --git a/packages/twitter-verifier-circuits/components/twitter_reset.json b/packages/twitter-verifier-circuits/components/twitter_reset.json new file mode 100644 index 000000000..df9a41733 --- /dev/null +++ b/packages/twitter-verifier-circuits/components/twitter_reset.json @@ -0,0 +1,12 @@ +{ + "parts": [ + { + "is_public": false, + "regex_def": "email was meant for @" + }, + { + "is_public": true, + "regex_def": "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|0|1|2|3|4|5|6|7|8|9|_)+" + } + ] +} \ No newline at end of file diff --git a/packages/twitter-verifier-circuits/components/twitter_reset_regex.circom b/packages/twitter-verifier-circuits/components/twitter_reset_regex.circom index f503058c1..05f67274d 100644 --- a/packages/twitter-verifier-circuits/components/twitter_reset_regex.circom +++ b/packages/twitter-verifier-circuits/components/twitter_reset_regex.circom @@ -1,272 +1,364 @@ pragma circom 2.1.5; -include "../../../node_modules/@zk-email/circuits/regexes/regex_helpers.circom"; +include "@zk-email/zk-regex-circom/circuits/regex_helpers.circom"; -template TwitterResetRegex (msg_bytes) { - signal input msg[msg_bytes]; - signal output out; +template TwitterResetRegex(msg_bytes) { + signal input msg[msg_bytes]; + signal output out; - var num_bytes = msg_bytes; - signal in[num_bytes]; - for (var i = 0; i < msg_bytes; i++) { - in[i] <== msg[i]; - } + var num_bytes = msg_bytes+1; + signal in[num_bytes]; + in[0]<==255; + for (var i = 0; i < msg_bytes; i++) { + in[i+1] <== msg[i]; + } - component eq[23][num_bytes]; - component lt[12][num_bytes]; - component and[29][num_bytes]; - component multi_or[3][num_bytes]; - signal states[num_bytes+1][23]; + component eq[43][num_bytes]; + component lt[8][num_bytes]; + component and[27][num_bytes]; + component multi_or[3][num_bytes]; + signal states[num_bytes+1][23]; + component state_changed[num_bytes]; - for (var i = 0; i < num_bytes; i++) { - states[i][0] <== 1; - } - for (var i = 1; i < 23; i++) { - states[0][i] <== 0; - } + states[0][0] <== 1; + for (var i = 1; i < 23; i++) { + states[0][i] <== 0; + } - for (var i = 0; i < num_bytes; i++) { - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 64; - lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); - lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 91; - and[0][i] = AND(); - and[0][i].a <== lt[0][i].out; - and[0][i].b <== lt[1][i].out; - lt[2][i] = LessThan(8); - lt[2][i].in[0] <== 96; - lt[2][i].in[1] <== in[i]; - lt[3][i] = LessThan(8); - lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 123; - and[1][i] = AND(); - and[1][i].a <== lt[2][i].out; - and[1][i].b <== lt[3][i].out; - lt[4][i] = LessThan(8); - lt[4][i].in[0] <== 47; - lt[4][i].in[1] <== in[i]; - lt[5][i] = LessThan(8); - lt[5][i].in[0] <== in[i]; - lt[5][i].in[1] <== 58; - and[2][i] = AND(); - and[2][i].a <== lt[4][i].out; - and[2][i].b <== lt[5][i].out; - eq[0][i] = IsEqual(); - eq[0][i].in[0] <== in[i]; - eq[0][i].in[1] <== 95; - and[3][i] = AND(); - and[3][i].a <== states[i][1]; - multi_or[0][i] = MultiOR(4); - multi_or[0][i].in[0] <== and[0][i].out; - multi_or[0][i].in[1] <== and[1][i].out; - multi_or[0][i].in[2] <== and[2][i].out; - multi_or[0][i].in[3] <== eq[0][i].out; - and[3][i].b <== multi_or[0][i].out; - lt[6][i] = LessThan(8); - lt[6][i].in[0] <== 64; - lt[6][i].in[1] <== in[i]; - lt[7][i] = LessThan(8); - lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 91; - and[4][i] = AND(); - and[4][i].a <== lt[6][i].out; - and[4][i].b <== lt[7][i].out; - lt[8][i] = LessThan(8); - lt[8][i].in[0] <== 96; - lt[8][i].in[1] <== in[i]; - lt[9][i] = LessThan(8); - lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 123; - and[5][i] = AND(); - and[5][i].a <== lt[8][i].out; - and[5][i].b <== lt[9][i].out; - lt[10][i] = LessThan(8); - lt[10][i].in[0] <== 47; - lt[10][i].in[1] <== in[i]; - lt[11][i] = LessThan(8); - lt[11][i].in[0] <== in[i]; - lt[11][i].in[1] <== 58; - and[6][i] = AND(); - and[6][i].a <== lt[10][i].out; - and[6][i].b <== lt[11][i].out; - eq[1][i] = IsEqual(); - eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 95; - and[7][i] = AND(); - and[7][i].a <== states[i][22]; - multi_or[1][i] = MultiOR(4); - multi_or[1][i].in[0] <== and[4][i].out; - multi_or[1][i].in[1] <== and[5][i].out; - multi_or[1][i].in[2] <== and[6][i].out; - multi_or[1][i].in[3] <== eq[1][i].out; - and[7][i].b <== multi_or[1][i].out; - multi_or[2][i] = MultiOR(2); - multi_or[2][i].in[0] <== and[3][i].out; - multi_or[2][i].in[1] <== and[7][i].out; - states[i+1][1] <== multi_or[2][i].out; - eq[2][i] = IsEqual(); - eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 101; - and[8][i] = AND(); - and[8][i].a <== states[i][0]; - and[8][i].b <== eq[2][i].out; - states[i+1][2] <== and[8][i].out; - eq[3][i] = IsEqual(); - eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 109; - and[9][i] = AND(); - and[9][i].a <== states[i][2]; - and[9][i].b <== eq[3][i].out; - states[i+1][3] <== and[9][i].out; - eq[4][i] = IsEqual(); - eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 97; - and[10][i] = AND(); - and[10][i].a <== states[i][3]; - and[10][i].b <== eq[4][i].out; - states[i+1][4] <== and[10][i].out; - eq[5][i] = IsEqual(); - eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 105; - and[11][i] = AND(); - and[11][i].a <== states[i][4]; - and[11][i].b <== eq[5][i].out; - states[i+1][5] <== and[11][i].out; - eq[6][i] = IsEqual(); - eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 108; - and[12][i] = AND(); - and[12][i].a <== states[i][5]; - and[12][i].b <== eq[6][i].out; - states[i+1][6] <== and[12][i].out; - eq[7][i] = IsEqual(); - eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 32; - and[13][i] = AND(); - and[13][i].a <== states[i][6]; - and[13][i].b <== eq[7][i].out; - states[i+1][7] <== and[13][i].out; - eq[8][i] = IsEqual(); - eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 119; - and[14][i] = AND(); - and[14][i].a <== states[i][7]; - and[14][i].b <== eq[8][i].out; - states[i+1][8] <== and[14][i].out; - eq[9][i] = IsEqual(); - eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 97; - and[15][i] = AND(); - and[15][i].a <== states[i][8]; - and[15][i].b <== eq[9][i].out; - states[i+1][9] <== and[15][i].out; - eq[10][i] = IsEqual(); - eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 115; - and[16][i] = AND(); - and[16][i].a <== states[i][9]; - and[16][i].b <== eq[10][i].out; - states[i+1][10] <== and[16][i].out; - eq[11][i] = IsEqual(); - eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 32; - and[17][i] = AND(); - and[17][i].a <== states[i][10]; - and[17][i].b <== eq[11][i].out; - states[i+1][11] <== and[17][i].out; - eq[12][i] = IsEqual(); - eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 109; - and[18][i] = AND(); - and[18][i].a <== states[i][11]; - and[18][i].b <== eq[12][i].out; - states[i+1][12] <== and[18][i].out; - eq[13][i] = IsEqual(); - eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 101; - and[19][i] = AND(); - and[19][i].a <== states[i][12]; - and[19][i].b <== eq[13][i].out; - states[i+1][13] <== and[19][i].out; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 97; - and[20][i] = AND(); - and[20][i].a <== states[i][13]; - and[20][i].b <== eq[14][i].out; - states[i+1][14] <== and[20][i].out; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 110; - and[21][i] = AND(); - and[21][i].a <== states[i][14]; - and[21][i].b <== eq[15][i].out; - states[i+1][15] <== and[21][i].out; - eq[16][i] = IsEqual(); - eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 116; - and[22][i] = AND(); - and[22][i].a <== states[i][15]; - and[22][i].b <== eq[16][i].out; - states[i+1][16] <== and[22][i].out; - eq[17][i] = IsEqual(); - eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 32; - and[23][i] = AND(); - and[23][i].a <== states[i][16]; - and[23][i].b <== eq[17][i].out; - states[i+1][17] <== and[23][i].out; - eq[18][i] = IsEqual(); - eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 102; - and[24][i] = AND(); - and[24][i].a <== states[i][17]; - and[24][i].b <== eq[18][i].out; - states[i+1][18] <== and[24][i].out; - eq[19][i] = IsEqual(); - eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 111; - and[25][i] = AND(); - and[25][i].a <== states[i][18]; - and[25][i].b <== eq[19][i].out; - states[i+1][19] <== and[25][i].out; - eq[20][i] = IsEqual(); - eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 114; - and[26][i] = AND(); - and[26][i].a <== states[i][19]; - and[26][i].b <== eq[20][i].out; - states[i+1][20] <== and[26][i].out; - eq[21][i] = IsEqual(); - eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 32; - and[27][i] = AND(); - and[27][i].a <== states[i][20]; - and[27][i].b <== eq[21][i].out; - states[i+1][21] <== and[27][i].out; - eq[22][i] = IsEqual(); - eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 64; - and[28][i] = AND(); - and[28][i].a <== states[i][21]; - and[28][i].b <== eq[22][i].out; - states[i+1][22] <== and[28][i].out; - } + for (var i = 0; i < num_bytes; i++) { + state_changed[i] = MultiOR(22); + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 65; + lt[0][i].in[1] <== in[i]; + lt[1][i] = LessEqThan(8); + lt[1][i].in[0] <== in[i]; + lt[1][i].in[1] <== 90; + and[0][i] = AND(); + and[0][i].a <== lt[0][i].out; + and[0][i].b <== lt[1][i].out; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 97; + lt[2][i].in[1] <== in[i]; + lt[3][i] = LessEqThan(8); + lt[3][i].in[0] <== in[i]; + lt[3][i].in[1] <== 122; + and[1][i] = AND(); + and[1][i].a <== lt[2][i].out; + and[1][i].b <== lt[3][i].out; + eq[0][i] = IsEqual(); + eq[0][i].in[0] <== in[i]; + eq[0][i].in[1] <== 48; + eq[1][i] = IsEqual(); + eq[1][i].in[0] <== in[i]; + eq[1][i].in[1] <== 49; + eq[2][i] = IsEqual(); + eq[2][i].in[0] <== in[i]; + eq[2][i].in[1] <== 50; + eq[3][i] = IsEqual(); + eq[3][i].in[0] <== in[i]; + eq[3][i].in[1] <== 51; + eq[4][i] = IsEqual(); + eq[4][i].in[0] <== in[i]; + eq[4][i].in[1] <== 52; + eq[5][i] = IsEqual(); + eq[5][i].in[0] <== in[i]; + eq[5][i].in[1] <== 53; + eq[6][i] = IsEqual(); + eq[6][i].in[0] <== in[i]; + eq[6][i].in[1] <== 54; + eq[7][i] = IsEqual(); + eq[7][i].in[0] <== in[i]; + eq[7][i].in[1] <== 55; + eq[8][i] = IsEqual(); + eq[8][i].in[0] <== in[i]; + eq[8][i].in[1] <== 56; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 57; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 95; + and[2][i] = AND(); + and[2][i].a <== states[i][1]; + multi_or[0][i] = MultiOR(13); + multi_or[0][i].in[0] <== and[0][i].out; + multi_or[0][i].in[1] <== and[1][i].out; + multi_or[0][i].in[2] <== eq[0][i].out; + multi_or[0][i].in[3] <== eq[1][i].out; + multi_or[0][i].in[4] <== eq[2][i].out; + multi_or[0][i].in[5] <== eq[3][i].out; + multi_or[0][i].in[6] <== eq[4][i].out; + multi_or[0][i].in[7] <== eq[5][i].out; + multi_or[0][i].in[8] <== eq[6][i].out; + multi_or[0][i].in[9] <== eq[7][i].out; + multi_or[0][i].in[10] <== eq[8][i].out; + multi_or[0][i].in[11] <== eq[9][i].out; + multi_or[0][i].in[12] <== eq[10][i].out; + and[2][i].b <== multi_or[0][i].out; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 65; + lt[4][i].in[1] <== in[i]; + lt[5][i] = LessEqThan(8); + lt[5][i].in[0] <== in[i]; + lt[5][i].in[1] <== 90; + and[3][i] = AND(); + and[3][i].a <== lt[4][i].out; + and[3][i].b <== lt[5][i].out; + lt[6][i] = LessEqThan(8); + lt[6][i].in[0] <== 97; + lt[6][i].in[1] <== in[i]; + lt[7][i] = LessEqThan(8); + lt[7][i].in[0] <== in[i]; + lt[7][i].in[1] <== 122; + and[4][i] = AND(); + and[4][i].a <== lt[6][i].out; + and[4][i].b <== lt[7][i].out; + eq[11][i] = IsEqual(); + eq[11][i].in[0] <== in[i]; + eq[11][i].in[1] <== 48; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 49; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 50; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 51; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 52; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 53; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 54; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 55; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 56; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 57; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 95; + and[5][i] = AND(); + and[5][i].a <== states[i][22]; + multi_or[1][i] = MultiOR(13); + multi_or[1][i].in[0] <== and[3][i].out; + multi_or[1][i].in[1] <== and[4][i].out; + multi_or[1][i].in[2] <== eq[11][i].out; + multi_or[1][i].in[3] <== eq[12][i].out; + multi_or[1][i].in[4] <== eq[13][i].out; + multi_or[1][i].in[5] <== eq[14][i].out; + multi_or[1][i].in[6] <== eq[15][i].out; + multi_or[1][i].in[7] <== eq[16][i].out; + multi_or[1][i].in[8] <== eq[17][i].out; + multi_or[1][i].in[9] <== eq[18][i].out; + multi_or[1][i].in[10] <== eq[19][i].out; + multi_or[1][i].in[11] <== eq[20][i].out; + multi_or[1][i].in[12] <== eq[21][i].out; + and[5][i].b <== multi_or[1][i].out; + multi_or[2][i] = MultiOR(2); + multi_or[2][i].in[0] <== and[2][i].out; + multi_or[2][i].in[1] <== and[5][i].out; + states[i+1][1] <== multi_or[2][i].out; + state_changed[i].in[0] <== states[i+1][1]; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 101; + and[6][i] = AND(); + and[6][i].a <== states[i][0]; + and[6][i].b <== eq[22][i].out; + states[i+1][2] <== and[6][i].out; + state_changed[i].in[1] <== states[i+1][2]; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 109; + and[7][i] = AND(); + and[7][i].a <== states[i][2]; + and[7][i].b <== eq[23][i].out; + states[i+1][3] <== and[7][i].out; + state_changed[i].in[2] <== states[i+1][3]; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 97; + and[8][i] = AND(); + and[8][i].a <== states[i][3]; + and[8][i].b <== eq[24][i].out; + states[i+1][4] <== and[8][i].out; + state_changed[i].in[3] <== states[i+1][4]; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 105; + and[9][i] = AND(); + and[9][i].a <== states[i][4]; + and[9][i].b <== eq[25][i].out; + states[i+1][5] <== and[9][i].out; + state_changed[i].in[4] <== states[i+1][5]; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 108; + and[10][i] = AND(); + and[10][i].a <== states[i][5]; + and[10][i].b <== eq[26][i].out; + states[i+1][6] <== and[10][i].out; + state_changed[i].in[5] <== states[i+1][6]; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 32; + and[11][i] = AND(); + and[11][i].a <== states[i][6]; + and[11][i].b <== eq[27][i].out; + states[i+1][7] <== and[11][i].out; + state_changed[i].in[6] <== states[i+1][7]; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 119; + and[12][i] = AND(); + and[12][i].a <== states[i][7]; + and[12][i].b <== eq[28][i].out; + states[i+1][8] <== and[12][i].out; + state_changed[i].in[7] <== states[i+1][8]; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 97; + and[13][i] = AND(); + and[13][i].a <== states[i][8]; + and[13][i].b <== eq[29][i].out; + states[i+1][9] <== and[13][i].out; + state_changed[i].in[8] <== states[i+1][9]; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 115; + and[14][i] = AND(); + and[14][i].a <== states[i][9]; + and[14][i].b <== eq[30][i].out; + states[i+1][10] <== and[14][i].out; + state_changed[i].in[9] <== states[i+1][10]; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 32; + and[15][i] = AND(); + and[15][i].a <== states[i][10]; + and[15][i].b <== eq[31][i].out; + states[i+1][11] <== and[15][i].out; + state_changed[i].in[10] <== states[i+1][11]; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 109; + and[16][i] = AND(); + and[16][i].a <== states[i][11]; + and[16][i].b <== eq[32][i].out; + states[i+1][12] <== and[16][i].out; + state_changed[i].in[11] <== states[i+1][12]; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 101; + and[17][i] = AND(); + and[17][i].a <== states[i][12]; + and[17][i].b <== eq[33][i].out; + states[i+1][13] <== and[17][i].out; + state_changed[i].in[12] <== states[i+1][13]; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 97; + and[18][i] = AND(); + and[18][i].a <== states[i][13]; + and[18][i].b <== eq[34][i].out; + states[i+1][14] <== and[18][i].out; + state_changed[i].in[13] <== states[i+1][14]; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 110; + and[19][i] = AND(); + and[19][i].a <== states[i][14]; + and[19][i].b <== eq[35][i].out; + states[i+1][15] <== and[19][i].out; + state_changed[i].in[14] <== states[i+1][15]; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 116; + and[20][i] = AND(); + and[20][i].a <== states[i][15]; + and[20][i].b <== eq[36][i].out; + states[i+1][16] <== and[20][i].out; + state_changed[i].in[15] <== states[i+1][16]; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 32; + and[21][i] = AND(); + and[21][i].a <== states[i][16]; + and[21][i].b <== eq[37][i].out; + states[i+1][17] <== and[21][i].out; + state_changed[i].in[16] <== states[i+1][17]; + eq[38][i] = IsEqual(); + eq[38][i].in[0] <== in[i]; + eq[38][i].in[1] <== 102; + and[22][i] = AND(); + and[22][i].a <== states[i][17]; + and[22][i].b <== eq[38][i].out; + states[i+1][18] <== and[22][i].out; + state_changed[i].in[17] <== states[i+1][18]; + eq[39][i] = IsEqual(); + eq[39][i].in[0] <== in[i]; + eq[39][i].in[1] <== 111; + and[23][i] = AND(); + and[23][i].a <== states[i][18]; + and[23][i].b <== eq[39][i].out; + states[i+1][19] <== and[23][i].out; + state_changed[i].in[18] <== states[i+1][19]; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 114; + and[24][i] = AND(); + and[24][i].a <== states[i][19]; + and[24][i].b <== eq[40][i].out; + states[i+1][20] <== and[24][i].out; + state_changed[i].in[19] <== states[i+1][20]; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 32; + and[25][i] = AND(); + and[25][i].a <== states[i][20]; + and[25][i].b <== eq[41][i].out; + states[i+1][21] <== and[25][i].out; + state_changed[i].in[20] <== states[i+1][21]; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 64; + and[26][i] = AND(); + and[26][i].a <== states[i][21]; + and[26][i].b <== eq[42][i].out; + states[i+1][22] <== and[26][i].out; + state_changed[i].in[21] <== states[i+1][22]; + states[i+1][0] <== 1 - state_changed[i].out; + } - // The number of times the regex matches so far; in this case, the start of a twitter username - // Should be 0 for invalid emails and 1 for valid emails, we should never see a 2 or more - signal final_state_sum[num_bytes+1]; - final_state_sum[0] <== states[0][1]; - for (var i = 1; i <= num_bytes; i++) { - final_state_sum[i] <== final_state_sum[i-1] + states[i][1]; - } - out <== final_state_sum[num_bytes]; + component final_state_result = MultiOR(num_bytes+1); + for (var i = 0; i <= num_bytes; i++) { + final_state_result.in[i] <== states[i][1]; + } + out <== final_state_result.out; - // Vector that masks the email with mostly 0s, but reveals the twitter username - signal output reveal[num_bytes]; - for (var i = 0; i < num_bytes; i++) { - reveal[i] <== in[i] * states[i+1][1]; - } -} + signal is_consecutive[msg_bytes+1][2]; + is_consecutive[msg_bytes][1] <== 1; + for (var i = 0; i < msg_bytes; i++) { + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][1] * (1 - is_consecutive[msg_bytes-i][1]) + is_consecutive[msg_bytes-i][1]; + is_consecutive[msg_bytes-1-i][1] <== state_changed[msg_bytes-i].out * is_consecutive[msg_bytes-1-i][0]; + } + signal is_substr0[msg_bytes][3]; + signal is_reveal0[msg_bytes]; + signal output reveal0[msg_bytes]; + for (var i = 0; i < msg_bytes; i++) { + is_substr0[i][0] <== 0; + is_substr0[i][1] <== is_substr0[i][0] + states[i+1][1] * states[i+2][1]; + is_substr0[i][2] <== is_substr0[i][1] + states[i+1][22] * states[i+2][1]; + is_reveal0[i] <== is_substr0[i][2] * is_consecutive[i][1]; + reveal0[i] <== in[i+1] * is_reveal0[i]; + } +} \ No newline at end of file diff --git a/packages/twitter-verifier-circuits/package.json b/packages/twitter-verifier-circuits/package.json index 923aa9847..63163c811 100644 --- a/packages/twitter-verifier-circuits/package.json +++ b/packages/twitter-verifier-circuits/package.json @@ -8,7 +8,8 @@ "@zk-email/circuits": "workspace:^", "@zk-email/helpers": "workspace:^", "big-integer": "^1.6.51", - "snarkjs": "git+https://github.com/vb7401/snarkjs.git#24981febe8826b6ab76ae4d76cf7f9142919d2b8" + "snarkjs": "git+https://github.com/vb7401/snarkjs.git#24981febe8826b6ab76ae4d76cf7f9142919d2b8", + "@zk-email/zk-regex-circom": "^1.1.0" }, "devDependencies": { "chai": "^4.3.7", @@ -19,4 +20,4 @@ "jest": "^29.5.0", "mocha": "^10.2.0" } -} +} \ No newline at end of file diff --git a/packages/twitter-verifier-circuits/twitter.circom b/packages/twitter-verifier-circuits/twitter.circom index 155b66135..8b44a65a7 100644 --- a/packages/twitter-verifier-circuits/twitter.circom +++ b/packages/twitter-verifier-circuits/twitter.circom @@ -1,6 +1,7 @@ pragma circom 2.1.5; -include "@zk-email/circuits/regexes/from_regex.circom"; +// include "@zk-email/circuits/regexes/from_regex.circom"; +include "@zk-email/zk-regex-circom/circuits/common/from_addr_regex.circom"; include "@zk-email/circuits/email-verifier.circom"; include "./components/twitter_reset_regex.circom"; @@ -41,7 +42,7 @@ template TwitterVerifier(max_header_bytes, max_body_bytes, n, k, pack_size, expo pubkey_hash <== EV.pubkey_hash; - // FROM HEADER REGEX: 736,553 constraints + // FROM HEADER REGEX // This extracts the from email, and the precise regex format can be viewed in the README if(expose_from){ var max_email_from_len = 30; @@ -51,7 +52,7 @@ template TwitterVerifier(max_header_bytes, max_body_bytes, n, k, pack_size, expo signal input email_from_idx; signal output reveal_email_from_packed[max_email_from_packed_bytes]; // packed into 7-bytes. TODO: make this rotate to take up even less space - signal (from_regex_out, from_regex_reveal[max_header_bytes]) <== FromRegex(max_header_bytes)(in_padded); + signal (from_regex_out, from_regex_reveal[max_header_bytes]) <== FromAddrRegex(max_header_bytes)(in_padded); log(from_regex_out); from_regex_out === 1; reveal_email_from_packed <== ShiftAndPack(max_header_bytes, max_email_from_len, pack_size)(from_regex_reveal, email_from_idx);