From 9273a2e58ca20179586ce913aadde75eaef7b6cb Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 3 Oct 2023 18:03:38 +0900 Subject: [PATCH] Improve negation and support non-English chars. --- .../circuits/common/email_addr_regex.circom | 462 ++++--- .../circuits/common/email_addr_with_name.json | 2 +- .../common/email_addr_with_name_regex.circom | 682 ++++++---- .../circuits/common/email_domain_regex.circom | 2 +- .../circom/circuits/common/from_addr.json | 2 +- packages/circom/circuits/common/from_all.json | 2 +- .../circuits/common/from_all_regex.circom | 274 ++++ .../circom/circuits/common/subject_all.json | 2 +- .../circuits/common/subject_all_regex.circom | 290 ++--- .../circom/circuits/common/timestamp.json | 6 +- .../circuits/common/timestamp_regex.circom | 1122 ++++++----------- packages/circom/tests/circuits/negate1.json | 4 +- .../tests/circuits/negate1_regex.circom | 144 ++- packages/circom/tests/from_addr.test.ts | 110 ++ packages/circom/tests/negate_regex.test.ts | 10 +- packages/circom/tests/subject_all.test.ts | 23 + packages/circom/tests/timestamp.test.ts | 21 + packages/compiler/src/gen_circom.js | 158 ++- packages/compiler/src/lib.rs | 57 +- packages/compiler/src/regex.js | 99 +- 20 files changed, 1996 insertions(+), 1476 deletions(-) create mode 100644 packages/circom/circuits/common/from_all_regex.circom diff --git a/packages/circom/circuits/common/email_addr_regex.circom b/packages/circom/circuits/common/email_addr_regex.circom index 7c16768..cd632a2 100644 --- a/packages/circom/circuits/common/email_addr_regex.circom +++ b/packages/circom/circuits/common/email_addr_regex.circom @@ -8,14 +8,14 @@ template EmailAddrRegex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } - component eq[17][num_bytes]; - component lt[24][num_bytes]; - component and[17][num_bytes]; + component eq[57][num_bytes]; + component lt[16][num_bytes]; + component and[13][num_bytes]; component multi_or[6][num_bytes]; signal states[num_bytes+1][4]; component state_changed[num_bytes]; @@ -27,33 +27,24 @@ template EmailAddrRegex(msg_bytes) { for (var i = 0; i < num_bytes; i++) { state_changed[i] = MultiOR(3); - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 47; + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 65; lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); + lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 58; + 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] = LessThan(8); - lt[2][i].in[0] <== 64; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 97; lt[2][i].in[1] <== in[i]; - lt[3][i] = LessThan(8); + lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 91; + 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; - lt[4][i] = LessThan(8); - lt[4][i].in[0] <== 96; - lt[4][i].in[1] <== in[i]; - lt[5][i] = LessThan(8); - lt[5][i].in[0] <== in[i]; - lt[5][i].in[1] <== 123; - 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] <== 37; @@ -68,181 +59,310 @@ template EmailAddrRegex(msg_bytes) { eq[3][i].in[1] <== 46; eq[4][i] = IsEqual(); eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 61; + eq[4][i].in[1] <== 48; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 95; - and[3][i] = AND(); - and[3][i].a <== states[i][0]; - multi_or[0][i] = MultiOR(9); - 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; - multi_or[0][i].in[4] <== eq[1][i].out; - multi_or[0][i].in[5] <== eq[2][i].out; - multi_or[0][i].in[6] <== eq[3][i].out; - multi_or[0][i].in[7] <== eq[4][i].out; - multi_or[0][i].in[8] <== eq[5][i].out; - and[3][i].b <== multi_or[0][i].out; - lt[6][i] = LessThan(8); - lt[6][i].in[0] <== 47; - lt[6][i].in[1] <== in[i]; - lt[7][i] = LessThan(8); - lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 58; - 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] <== 64; - lt[8][i].in[1] <== in[i]; - lt[9][i] = LessThan(8); - lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 91; - 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] <== 96; - lt[10][i].in[1] <== in[i]; - lt[11][i] = LessThan(8); - lt[11][i].in[0] <== in[i]; - lt[11][i].in[1] <== 123; - and[6][i] = AND(); - and[6][i].a <== lt[10][i].out; - and[6][i].b <== lt[11][i].out; + eq[5][i].in[1] <== 49; eq[6][i] = IsEqual(); eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 37; + eq[6][i].in[1] <== 50; eq[7][i] = IsEqual(); eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 43; + eq[7][i].in[1] <== 51; eq[8][i] = IsEqual(); eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 45; + eq[8][i].in[1] <== 52; eq[9][i] = IsEqual(); eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 46; + eq[9][i].in[1] <== 53; eq[10][i] = IsEqual(); eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 61; + eq[10][i].in[1] <== 54; eq[11][i] = IsEqual(); eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 95; - and[7][i] = AND(); - and[7][i].a <== states[i][1]; - multi_or[1][i] = MultiOR(9); - 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[6][i].out; - multi_or[1][i].in[4] <== eq[7][i].out; - multi_or[1][i].in[5] <== eq[8][i].out; - multi_or[1][i].in[6] <== eq[9][i].out; - multi_or[1][i].in[7] <== eq[10][i].out; - multi_or[1][i].in[8] <== eq[11][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; - state_changed[i].in[0] <== states[i+1][1]; + eq[11][i].in[1] <== 55; eq[12][i] = IsEqual(); eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 64; - and[8][i] = AND(); - and[8][i].a <== states[i][1]; - and[8][i].b <== eq[12][i].out; - states[i+1][2] <== and[8][i].out; - state_changed[i].in[1] <== states[i+1][2]; - lt[12][i] = LessThan(8); - lt[12][i].in[0] <== 47; - lt[12][i].in[1] <== in[i]; - lt[13][i] = LessThan(8); - lt[13][i].in[0] <== in[i]; - lt[13][i].in[1] <== 58; - and[9][i] = AND(); - and[9][i].a <== lt[12][i].out; - and[9][i].b <== lt[13][i].out; - lt[14][i] = LessThan(8); - lt[14][i].in[0] <== 64; - lt[14][i].in[1] <== in[i]; - lt[15][i] = LessThan(8); - lt[15][i].in[0] <== in[i]; - lt[15][i].in[1] <== 91; - and[10][i] = AND(); - and[10][i].a <== lt[14][i].out; - and[10][i].b <== lt[15][i].out; - lt[16][i] = LessThan(8); - lt[16][i].in[0] <== 96; - lt[16][i].in[1] <== in[i]; - lt[17][i] = LessThan(8); - lt[17][i].in[0] <== in[i]; - lt[17][i].in[1] <== 123; - and[11][i] = AND(); - and[11][i].a <== lt[16][i].out; - and[11][i].b <== lt[17][i].out; + eq[12][i].in[1] <== 56; eq[13][i] = IsEqual(); eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 45; + eq[13][i].in[1] <== 57; eq[14][i] = IsEqual(); eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 46; - and[12][i] = AND(); - and[12][i].a <== states[i][2]; - multi_or[3][i] = MultiOR(5); - multi_or[3][i].in[0] <== and[9][i].out; - multi_or[3][i].in[1] <== and[10][i].out; - multi_or[3][i].in[2] <== and[11][i].out; - multi_or[3][i].in[3] <== eq[13][i].out; - multi_or[3][i].in[4] <== eq[14][i].out; - and[12][i].b <== multi_or[3][i].out; - lt[18][i] = LessThan(8); - lt[18][i].in[0] <== 47; - lt[18][i].in[1] <== in[i]; - lt[19][i] = LessThan(8); - lt[19][i].in[0] <== in[i]; - lt[19][i].in[1] <== 58; - and[13][i] = AND(); - and[13][i].a <== lt[18][i].out; - and[13][i].b <== lt[19][i].out; - lt[20][i] = LessThan(8); - lt[20][i].in[0] <== 64; - lt[20][i].in[1] <== in[i]; - lt[21][i] = LessThan(8); - lt[21][i].in[0] <== in[i]; - lt[21][i].in[1] <== 91; - and[14][i] = AND(); - and[14][i].a <== lt[20][i].out; - and[14][i].b <== lt[21][i].out; - lt[22][i] = LessThan(8); - lt[22][i].in[0] <== 96; - lt[22][i].in[1] <== in[i]; - lt[23][i] = LessThan(8); - lt[23][i].in[0] <== in[i]; - lt[23][i].in[1] <== 123; - and[15][i] = AND(); - and[15][i].a <== lt[22][i].out; - and[15][i].b <== lt[23][i].out; + eq[14][i].in[1] <== 61; eq[15][i] = IsEqual(); eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 45; + eq[15][i].in[1] <== 95; + and[2][i] = AND(); + and[2][i].a <== states[i][0]; + multi_or[0][i] = MultiOR(18); + 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; + multi_or[0][i].in[13] <== eq[11][i].out; + multi_or[0][i].in[14] <== eq[12][i].out; + multi_or[0][i].in[15] <== eq[13][i].out; + multi_or[0][i].in[16] <== eq[14][i].out; + multi_or[0][i].in[17] <== eq[15][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[16][i] = IsEqual(); eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 46; - and[16][i] = AND(); - and[16][i].a <== states[i][3]; - multi_or[4][i] = MultiOR(5); - multi_or[4][i].in[0] <== and[13][i].out; - multi_or[4][i].in[1] <== and[14][i].out; - multi_or[4][i].in[2] <== and[15][i].out; - multi_or[4][i].in[3] <== eq[15][i].out; - multi_or[4][i].in[4] <== eq[16][i].out; - and[16][i].b <== multi_or[4][i].out; + eq[16][i].in[1] <== 37; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 43; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 45; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 46; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 48; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 49; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 50; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 51; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 52; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 53; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 54; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 55; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 56; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 57; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 61; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 95; + and[5][i] = AND(); + and[5][i].a <== states[i][1]; + multi_or[1][i] = MultiOR(18); + 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[16][i].out; + multi_or[1][i].in[3] <== eq[17][i].out; + multi_or[1][i].in[4] <== eq[18][i].out; + multi_or[1][i].in[5] <== eq[19][i].out; + multi_or[1][i].in[6] <== eq[20][i].out; + multi_or[1][i].in[7] <== eq[21][i].out; + multi_or[1][i].in[8] <== eq[22][i].out; + multi_or[1][i].in[9] <== eq[23][i].out; + multi_or[1][i].in[10] <== eq[24][i].out; + multi_or[1][i].in[11] <== eq[25][i].out; + multi_or[1][i].in[12] <== eq[26][i].out; + multi_or[1][i].in[13] <== eq[27][i].out; + multi_or[1][i].in[14] <== eq[28][i].out; + multi_or[1][i].in[15] <== eq[29][i].out; + multi_or[1][i].in[16] <== eq[30][i].out; + multi_or[1][i].in[17] <== eq[31][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[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 64; + and[6][i] = AND(); + and[6][i].a <== states[i][1]; + and[6][i].b <== eq[32][i].out; + states[i+1][2] <== and[6][i].out; + state_changed[i].in[1] <== states[i+1][2]; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 65; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 90; + and[7][i] = AND(); + and[7][i].a <== lt[8][i].out; + and[7][i].b <== lt[9][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 97; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 122; + and[8][i] = AND(); + and[8][i].a <== lt[10][i].out; + and[8][i].b <== lt[11][i].out; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 45; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 46; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 48; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 49; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 50; + eq[38][i] = IsEqual(); + eq[38][i].in[0] <== in[i]; + eq[38][i].in[1] <== 51; + eq[39][i] = IsEqual(); + eq[39][i].in[0] <== in[i]; + eq[39][i].in[1] <== 52; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 53; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 54; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 55; + eq[43][i] = IsEqual(); + eq[43][i].in[0] <== in[i]; + eq[43][i].in[1] <== 56; + eq[44][i] = IsEqual(); + eq[44][i].in[0] <== in[i]; + eq[44][i].in[1] <== 57; + and[9][i] = AND(); + and[9][i].a <== states[i][2]; + multi_or[3][i] = MultiOR(14); + multi_or[3][i].in[0] <== and[7][i].out; + multi_or[3][i].in[1] <== and[8][i].out; + multi_or[3][i].in[2] <== eq[33][i].out; + multi_or[3][i].in[3] <== eq[34][i].out; + multi_or[3][i].in[4] <== eq[35][i].out; + multi_or[3][i].in[5] <== eq[36][i].out; + multi_or[3][i].in[6] <== eq[37][i].out; + multi_or[3][i].in[7] <== eq[38][i].out; + multi_or[3][i].in[8] <== eq[39][i].out; + multi_or[3][i].in[9] <== eq[40][i].out; + multi_or[3][i].in[10] <== eq[41][i].out; + multi_or[3][i].in[11] <== eq[42][i].out; + multi_or[3][i].in[12] <== eq[43][i].out; + multi_or[3][i].in[13] <== eq[44][i].out; + and[9][i].b <== multi_or[3][i].out; + lt[12][i] = LessEqThan(8); + lt[12][i].in[0] <== 65; + lt[12][i].in[1] <== in[i]; + lt[13][i] = LessEqThan(8); + lt[13][i].in[0] <== in[i]; + lt[13][i].in[1] <== 90; + and[10][i] = AND(); + and[10][i].a <== lt[12][i].out; + and[10][i].b <== lt[13][i].out; + lt[14][i] = LessEqThan(8); + lt[14][i].in[0] <== 97; + lt[14][i].in[1] <== in[i]; + lt[15][i] = LessEqThan(8); + lt[15][i].in[0] <== in[i]; + lt[15][i].in[1] <== 122; + and[11][i] = AND(); + and[11][i].a <== lt[14][i].out; + and[11][i].b <== lt[15][i].out; + eq[45][i] = IsEqual(); + eq[45][i].in[0] <== in[i]; + eq[45][i].in[1] <== 45; + eq[46][i] = IsEqual(); + eq[46][i].in[0] <== in[i]; + eq[46][i].in[1] <== 46; + eq[47][i] = IsEqual(); + eq[47][i].in[0] <== in[i]; + eq[47][i].in[1] <== 48; + eq[48][i] = IsEqual(); + eq[48][i].in[0] <== in[i]; + eq[48][i].in[1] <== 49; + eq[49][i] = IsEqual(); + eq[49][i].in[0] <== in[i]; + eq[49][i].in[1] <== 50; + eq[50][i] = IsEqual(); + eq[50][i].in[0] <== in[i]; + eq[50][i].in[1] <== 51; + eq[51][i] = IsEqual(); + eq[51][i].in[0] <== in[i]; + eq[51][i].in[1] <== 52; + eq[52][i] = IsEqual(); + eq[52][i].in[0] <== in[i]; + eq[52][i].in[1] <== 53; + eq[53][i] = IsEqual(); + eq[53][i].in[0] <== in[i]; + eq[53][i].in[1] <== 54; + eq[54][i] = IsEqual(); + eq[54][i].in[0] <== in[i]; + eq[54][i].in[1] <== 55; + eq[55][i] = IsEqual(); + eq[55][i].in[0] <== in[i]; + eq[55][i].in[1] <== 56; + eq[56][i] = IsEqual(); + eq[56][i].in[0] <== in[i]; + eq[56][i].in[1] <== 57; + and[12][i] = AND(); + and[12][i].a <== states[i][3]; + multi_or[4][i] = MultiOR(14); + multi_or[4][i].in[0] <== and[10][i].out; + multi_or[4][i].in[1] <== and[11][i].out; + multi_or[4][i].in[2] <== eq[45][i].out; + multi_or[4][i].in[3] <== eq[46][i].out; + multi_or[4][i].in[4] <== eq[47][i].out; + multi_or[4][i].in[5] <== eq[48][i].out; + multi_or[4][i].in[6] <== eq[49][i].out; + multi_or[4][i].in[7] <== eq[50][i].out; + multi_or[4][i].in[8] <== eq[51][i].out; + multi_or[4][i].in[9] <== eq[52][i].out; + multi_or[4][i].in[10] <== eq[53][i].out; + multi_or[4][i].in[11] <== eq[54][i].out; + multi_or[4][i].in[12] <== eq[55][i].out; + multi_or[4][i].in[13] <== eq[56][i].out; + and[12][i].b <== multi_or[4][i].out; multi_or[5][i] = MultiOR(2); - multi_or[5][i].in[0] <== and[12][i].out; - multi_or[5][i].in[1] <== and[16][i].out; + multi_or[5][i].in[0] <== and[9][i].out; + multi_or[5][i].in[1] <== and[12][i].out; states[i+1][3] <== multi_or[5][i].out; state_changed[i].in[2] <== states[i+1][3]; states[i+1][0] <== 1 - state_changed[i].out; diff --git a/packages/circom/circuits/common/email_addr_with_name.json b/packages/circom/circuits/common/email_addr_with_name.json index 527a4d9..e1efafe 100644 --- a/packages/circom/circuits/common/email_addr_with_name.json +++ b/packages/circom/circuits/common/email_addr_with_name.json @@ -3,7 +3,7 @@ "parts": [ { "is_public": false, - "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|_|\\.|\"| |@)+<", + "regex_def": "[^\r\n<]+<", "max_size": 256 }, { diff --git a/packages/circom/circuits/common/email_addr_with_name_regex.circom b/packages/circom/circuits/common/email_addr_with_name_regex.circom index 8e09d72..c8d4c6e 100644 --- a/packages/circom/circuits/common/email_addr_with_name_regex.circom +++ b/packages/circom/circuits/common/email_addr_with_name_regex.circom @@ -8,14 +8,14 @@ template EmailAddrWithNameRegex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } - component eq[25][num_bytes]; - component lt[36][num_bytes]; - component and[27][num_bytes]; + component eq[80][num_bytes]; + component lt[32][num_bytes]; + component and[25][num_bytes]; component multi_or[9][num_bytes]; signal states[num_bytes+1][7]; component state_changed[num_bytes]; @@ -27,51 +27,75 @@ template EmailAddrWithNameRegex(msg_bytes) { for (var i = 0; i < num_bytes; i++) { state_changed[i] = MultiOR(6); - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 47; + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 14; lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); + lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 58; + lt[1][i].in[1] <== 59; 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] <== 64; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 61; lt[2][i].in[1] <== in[i]; - lt[3][i] = LessThan(8); + lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 91; + lt[3][i].in[1] <== 93; 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] <== 96; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 95; lt[4][i].in[1] <== in[i]; - lt[5][i] = LessThan(8); + lt[5][i] = LessEqThan(8); lt[5][i].in[0] <== in[i]; - lt[5][i].in[1] <== 123; + lt[5][i].in[1] <== 254; 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] <== 32; + eq[0][i].in[1] <== 0; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 34; + eq[1][i].in[1] <== 1; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 46; + eq[2][i].in[1] <== 2; eq[3][i] = IsEqual(); eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 64; + eq[3][i].in[1] <== 3; eq[4][i] = IsEqual(); eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 95; + eq[4][i].in[1] <== 4; + eq[5][i] = IsEqual(); + eq[5][i].in[0] <== in[i]; + eq[5][i].in[1] <== 5; + eq[6][i] = IsEqual(); + eq[6][i].in[0] <== in[i]; + eq[6][i].in[1] <== 6; + eq[7][i] = IsEqual(); + eq[7][i].in[0] <== in[i]; + eq[7][i].in[1] <== 7; + eq[8][i] = IsEqual(); + eq[8][i].in[0] <== in[i]; + eq[8][i].in[1] <== 8; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 9; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 11; + eq[11][i] = IsEqual(); + eq[11][i].in[0] <== in[i]; + eq[11][i].in[1] <== 12; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 255; and[3][i] = AND(); and[3][i].a <== states[i][0]; - multi_or[0][i] = MultiOR(8); + multi_or[0][i] = MultiOR(16); 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; @@ -80,297 +104,473 @@ template EmailAddrWithNameRegex(msg_bytes) { multi_or[0][i].in[5] <== eq[2][i].out; multi_or[0][i].in[6] <== eq[3][i].out; multi_or[0][i].in[7] <== eq[4][i].out; + multi_or[0][i].in[8] <== eq[5][i].out; + multi_or[0][i].in[9] <== eq[6][i].out; + multi_or[0][i].in[10] <== eq[7][i].out; + multi_or[0][i].in[11] <== eq[8][i].out; + multi_or[0][i].in[12] <== eq[9][i].out; + multi_or[0][i].in[13] <== eq[10][i].out; + multi_or[0][i].in[14] <== eq[11][i].out; + multi_or[0][i].in[15] <== eq[12][i].out; and[3][i].b <== multi_or[0][i].out; - lt[6][i] = LessThan(8); - lt[6][i].in[0] <== 47; + lt[6][i] = LessEqThan(8); + lt[6][i].in[0] <== 14; lt[6][i].in[1] <== in[i]; - lt[7][i] = LessThan(8); + lt[7][i] = LessEqThan(8); lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 58; + lt[7][i].in[1] <== 59; 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] <== 64; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 61; lt[8][i].in[1] <== in[i]; - lt[9][i] = LessThan(8); + lt[9][i] = LessEqThan(8); lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 91; + lt[9][i].in[1] <== 254; 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] <== 96; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 14; lt[10][i].in[1] <== in[i]; - lt[11][i] = LessThan(8); + lt[11][i] = LessEqThan(8); lt[11][i].in[0] <== in[i]; - lt[11][i].in[1] <== 123; + lt[11][i].in[1] <== 59; and[6][i] = AND(); and[6][i].a <== lt[10][i].out; and[6][i].b <== lt[11][i].out; - eq[5][i] = IsEqual(); - eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 32; - eq[6][i] = IsEqual(); - eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 34; - eq[7][i] = IsEqual(); - eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 46; - eq[8][i] = IsEqual(); - eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 64; - eq[9][i] = IsEqual(); - eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 95; + lt[12][i] = LessEqThan(8); + lt[12][i].in[0] <== 61; + lt[12][i].in[1] <== in[i]; + lt[13][i] = LessEqThan(8); + lt[13][i].in[0] <== in[i]; + lt[13][i].in[1] <== 93; and[7][i] = AND(); - and[7][i].a <== states[i][1]; - multi_or[1][i] = MultiOR(8); + and[7][i].a <== lt[12][i].out; + and[7][i].b <== lt[13][i].out; + lt[14][i] = LessEqThan(8); + lt[14][i].in[0] <== 95; + lt[14][i].in[1] <== in[i]; + lt[15][i] = LessEqThan(8); + lt[15][i].in[0] <== in[i]; + lt[15][i].in[1] <== 254; + and[8][i] = AND(); + and[8][i].a <== lt[14][i].out; + and[8][i].b <== lt[15][i].out; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 0; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 1; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 2; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 3; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 4; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 5; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 6; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 7; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 8; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 9; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 11; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 12; + and[9][i] = AND(); + and[9][i].a <== states[i][1]; + multi_or[1][i] = MultiOR(17); 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[5][i].out; - multi_or[1][i].in[4] <== eq[6][i].out; - multi_or[1][i].in[5] <== eq[7][i].out; - multi_or[1][i].in[6] <== eq[8][i].out; - multi_or[1][i].in[7] <== eq[9][i].out; - and[7][i].b <== multi_or[1][i].out; + multi_or[1][i].in[3] <== and[7][i].out; + multi_or[1][i].in[4] <== and[8][i].out; + multi_or[1][i].in[5] <== eq[13][i].out; + multi_or[1][i].in[6] <== eq[14][i].out; + multi_or[1][i].in[7] <== eq[15][i].out; + multi_or[1][i].in[8] <== eq[16][i].out; + multi_or[1][i].in[9] <== eq[17][i].out; + multi_or[1][i].in[10] <== eq[18][i].out; + multi_or[1][i].in[11] <== eq[19][i].out; + multi_or[1][i].in[12] <== eq[20][i].out; + multi_or[1][i].in[13] <== eq[21][i].out; + multi_or[1][i].in[14] <== eq[22][i].out; + multi_or[1][i].in[15] <== eq[23][i].out; + multi_or[1][i].in[16] <== eq[24][i].out; + and[9][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; + multi_or[2][i].in[1] <== and[9][i].out; states[i+1][1] <== multi_or[2][i].out; state_changed[i].in[0] <== states[i+1][1]; - eq[10][i] = IsEqual(); - eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 60; - and[8][i] = AND(); - and[8][i].a <== states[i][1]; - and[8][i].b <== eq[10][i].out; - states[i+1][2] <== and[8][i].out; - state_changed[i].in[1] <== states[i+1][2]; - lt[12][i] = LessThan(8); - lt[12][i].in[0] <== 47; - lt[12][i].in[1] <== in[i]; - lt[13][i] = LessThan(8); - lt[13][i].in[0] <== in[i]; - lt[13][i].in[1] <== 58; - and[9][i] = AND(); - and[9][i].a <== lt[12][i].out; - and[9][i].b <== lt[13][i].out; - lt[14][i] = LessThan(8); - lt[14][i].in[0] <== 64; - lt[14][i].in[1] <== in[i]; - lt[15][i] = LessThan(8); - lt[15][i].in[0] <== in[i]; - lt[15][i].in[1] <== 91; - and[10][i] = AND(); - and[10][i].a <== lt[14][i].out; - and[10][i].b <== lt[15][i].out; - lt[16][i] = LessThan(8); - lt[16][i].in[0] <== 96; + lt[16][i] = LessEqThan(8); + lt[16][i].in[0] <== 65; lt[16][i].in[1] <== in[i]; - lt[17][i] = LessThan(8); + lt[17][i] = LessEqThan(8); lt[17][i].in[0] <== in[i]; - lt[17][i].in[1] <== 123; + lt[17][i].in[1] <== 90; + and[10][i] = AND(); + and[10][i].a <== lt[16][i].out; + and[10][i].b <== lt[17][i].out; + lt[18][i] = LessEqThan(8); + lt[18][i].in[0] <== 97; + lt[18][i].in[1] <== in[i]; + lt[19][i] = LessEqThan(8); + lt[19][i].in[0] <== in[i]; + lt[19][i].in[1] <== 122; and[11][i] = AND(); - and[11][i].a <== lt[16][i].out; - and[11][i].b <== lt[17][i].out; - eq[11][i] = IsEqual(); - eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 45; - eq[12][i] = IsEqual(); - eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 46; - eq[13][i] = IsEqual(); - eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 95; + and[11][i].a <== lt[18][i].out; + and[11][i].b <== lt[19][i].out; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 45; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 46; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 48; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 49; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 50; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 51; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 52; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 53; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 54; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 55; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 56; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 57; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 95; and[12][i] = AND(); and[12][i].a <== states[i][2]; - multi_or[3][i] = MultiOR(6); - multi_or[3][i].in[0] <== and[9][i].out; - multi_or[3][i].in[1] <== and[10][i].out; - multi_or[3][i].in[2] <== and[11][i].out; - multi_or[3][i].in[3] <== eq[11][i].out; - multi_or[3][i].in[4] <== eq[12][i].out; - multi_or[3][i].in[5] <== eq[13][i].out; + multi_or[3][i] = MultiOR(15); + multi_or[3][i].in[0] <== and[10][i].out; + multi_or[3][i].in[1] <== and[11][i].out; + multi_or[3][i].in[2] <== eq[25][i].out; + multi_or[3][i].in[3] <== eq[26][i].out; + multi_or[3][i].in[4] <== eq[27][i].out; + multi_or[3][i].in[5] <== eq[28][i].out; + multi_or[3][i].in[6] <== eq[29][i].out; + multi_or[3][i].in[7] <== eq[30][i].out; + multi_or[3][i].in[8] <== eq[31][i].out; + multi_or[3][i].in[9] <== eq[32][i].out; + multi_or[3][i].in[10] <== eq[33][i].out; + multi_or[3][i].in[11] <== eq[34][i].out; + multi_or[3][i].in[12] <== eq[35][i].out; + multi_or[3][i].in[13] <== eq[36][i].out; + multi_or[3][i].in[14] <== eq[37][i].out; and[12][i].b <== multi_or[3][i].out; - lt[18][i] = LessThan(8); - lt[18][i].in[0] <== 47; - lt[18][i].in[1] <== in[i]; - lt[19][i] = LessThan(8); - lt[19][i].in[0] <== in[i]; - lt[19][i].in[1] <== 58; - and[13][i] = AND(); - and[13][i].a <== lt[18][i].out; - and[13][i].b <== lt[19][i].out; - lt[20][i] = LessThan(8); - lt[20][i].in[0] <== 64; + lt[20][i] = LessEqThan(8); + lt[20][i].in[0] <== 65; lt[20][i].in[1] <== in[i]; - lt[21][i] = LessThan(8); + lt[21][i] = LessEqThan(8); lt[21][i].in[0] <== in[i]; - lt[21][i].in[1] <== 91; - and[14][i] = AND(); - and[14][i].a <== lt[20][i].out; - and[14][i].b <== lt[21][i].out; - lt[22][i] = LessThan(8); - lt[22][i].in[0] <== 96; + lt[21][i].in[1] <== 90; + and[13][i] = AND(); + and[13][i].a <== lt[20][i].out; + and[13][i].b <== lt[21][i].out; + lt[22][i] = LessEqThan(8); + lt[22][i].in[0] <== 97; lt[22][i].in[1] <== in[i]; - lt[23][i] = LessThan(8); + lt[23][i] = LessEqThan(8); lt[23][i].in[0] <== in[i]; - lt[23][i].in[1] <== 123; + lt[23][i].in[1] <== 122; + and[14][i] = AND(); + and[14][i].a <== lt[22][i].out; + and[14][i].b <== lt[23][i].out; + eq[38][i] = IsEqual(); + eq[38][i].in[0] <== in[i]; + eq[38][i].in[1] <== 45; + eq[39][i] = IsEqual(); + eq[39][i].in[0] <== in[i]; + eq[39][i].in[1] <== 46; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 48; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 49; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 50; + eq[43][i] = IsEqual(); + eq[43][i].in[0] <== in[i]; + eq[43][i].in[1] <== 51; + eq[44][i] = IsEqual(); + eq[44][i].in[0] <== in[i]; + eq[44][i].in[1] <== 52; + eq[45][i] = IsEqual(); + eq[45][i].in[0] <== in[i]; + eq[45][i].in[1] <== 53; + eq[46][i] = IsEqual(); + eq[46][i].in[0] <== in[i]; + eq[46][i].in[1] <== 54; + eq[47][i] = IsEqual(); + eq[47][i].in[0] <== in[i]; + eq[47][i].in[1] <== 55; + eq[48][i] = IsEqual(); + eq[48][i].in[0] <== in[i]; + eq[48][i].in[1] <== 56; + eq[49][i] = IsEqual(); + eq[49][i].in[0] <== in[i]; + eq[49][i].in[1] <== 57; + eq[50][i] = IsEqual(); + eq[50][i].in[0] <== in[i]; + eq[50][i].in[1] <== 95; and[15][i] = AND(); - and[15][i].a <== lt[22][i].out; - and[15][i].b <== lt[23][i].out; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 45; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 46; - eq[16][i] = IsEqual(); - eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 95; - and[16][i] = AND(); - and[16][i].a <== states[i][3]; - multi_or[4][i] = MultiOR(6); + and[15][i].a <== states[i][6]; + multi_or[4][i] = MultiOR(15); multi_or[4][i].in[0] <== and[13][i].out; multi_or[4][i].in[1] <== and[14][i].out; - multi_or[4][i].in[2] <== and[15][i].out; - multi_or[4][i].in[3] <== eq[14][i].out; - multi_or[4][i].in[4] <== eq[15][i].out; - multi_or[4][i].in[5] <== eq[16][i].out; - and[16][i].b <== multi_or[4][i].out; + multi_or[4][i].in[2] <== eq[38][i].out; + multi_or[4][i].in[3] <== eq[39][i].out; + multi_or[4][i].in[4] <== eq[40][i].out; + multi_or[4][i].in[5] <== eq[41][i].out; + multi_or[4][i].in[6] <== eq[42][i].out; + multi_or[4][i].in[7] <== eq[43][i].out; + multi_or[4][i].in[8] <== eq[44][i].out; + multi_or[4][i].in[9] <== eq[45][i].out; + multi_or[4][i].in[10] <== eq[46][i].out; + multi_or[4][i].in[11] <== eq[47][i].out; + multi_or[4][i].in[12] <== eq[48][i].out; + multi_or[4][i].in[13] <== eq[49][i].out; + multi_or[4][i].in[14] <== eq[50][i].out; + and[15][i].b <== multi_or[4][i].out; multi_or[5][i] = MultiOR(2); multi_or[5][i].in[0] <== and[12][i].out; - multi_or[5][i].in[1] <== and[16][i].out; - states[i+1][3] <== multi_or[5][i].out; + multi_or[5][i].in[1] <== and[15][i].out; + states[i+1][2] <== multi_or[5][i].out; + state_changed[i].in[1] <== states[i+1][2]; + eq[51][i] = IsEqual(); + eq[51][i].in[0] <== in[i]; + eq[51][i].in[1] <== 62; + and[16][i] = AND(); + and[16][i].a <== states[i][2]; + and[16][i].b <== eq[51][i].out; + states[i+1][3] <== and[16][i].out; state_changed[i].in[2] <== states[i+1][3]; - eq[17][i] = IsEqual(); - eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 64; + eq[52][i] = IsEqual(); + eq[52][i].in[0] <== in[i]; + eq[52][i].in[1] <== 60; and[17][i] = AND(); - and[17][i].a <== states[i][3]; - and[17][i].b <== eq[17][i].out; + and[17][i].a <== states[i][1]; + and[17][i].b <== eq[52][i].out; states[i+1][4] <== and[17][i].out; state_changed[i].in[3] <== states[i+1][4]; - lt[24][i] = LessThan(8); - lt[24][i].in[0] <== 47; + lt[24][i] = LessEqThan(8); + lt[24][i].in[0] <== 65; lt[24][i].in[1] <== in[i]; - lt[25][i] = LessThan(8); + lt[25][i] = LessEqThan(8); lt[25][i].in[0] <== in[i]; - lt[25][i].in[1] <== 58; + lt[25][i].in[1] <== 90; and[18][i] = AND(); and[18][i].a <== lt[24][i].out; and[18][i].b <== lt[25][i].out; - lt[26][i] = LessThan(8); - lt[26][i].in[0] <== 64; + lt[26][i] = LessEqThan(8); + lt[26][i].in[0] <== 97; lt[26][i].in[1] <== in[i]; - lt[27][i] = LessThan(8); + lt[27][i] = LessEqThan(8); lt[27][i].in[0] <== in[i]; - lt[27][i].in[1] <== 91; + lt[27][i].in[1] <== 122; and[19][i] = AND(); and[19][i].a <== lt[26][i].out; and[19][i].b <== lt[27][i].out; - lt[28][i] = LessThan(8); - lt[28][i].in[0] <== 96; - lt[28][i].in[1] <== in[i]; - lt[29][i] = LessThan(8); - lt[29][i].in[0] <== in[i]; - lt[29][i].in[1] <== 123; + eq[53][i] = IsEqual(); + eq[53][i].in[0] <== in[i]; + eq[53][i].in[1] <== 45; + eq[54][i] = IsEqual(); + eq[54][i].in[0] <== in[i]; + eq[54][i].in[1] <== 46; + eq[55][i] = IsEqual(); + eq[55][i].in[0] <== in[i]; + eq[55][i].in[1] <== 48; + eq[56][i] = IsEqual(); + eq[56][i].in[0] <== in[i]; + eq[56][i].in[1] <== 49; + eq[57][i] = IsEqual(); + eq[57][i].in[0] <== in[i]; + eq[57][i].in[1] <== 50; + eq[58][i] = IsEqual(); + eq[58][i].in[0] <== in[i]; + eq[58][i].in[1] <== 51; + eq[59][i] = IsEqual(); + eq[59][i].in[0] <== in[i]; + eq[59][i].in[1] <== 52; + eq[60][i] = IsEqual(); + eq[60][i].in[0] <== in[i]; + eq[60][i].in[1] <== 53; + eq[61][i] = IsEqual(); + eq[61][i].in[0] <== in[i]; + eq[61][i].in[1] <== 54; + eq[62][i] = IsEqual(); + eq[62][i].in[0] <== in[i]; + eq[62][i].in[1] <== 55; + eq[63][i] = IsEqual(); + eq[63][i].in[0] <== in[i]; + eq[63][i].in[1] <== 56; + eq[64][i] = IsEqual(); + eq[64][i].in[0] <== in[i]; + eq[64][i].in[1] <== 57; + eq[65][i] = IsEqual(); + eq[65][i].in[0] <== in[i]; + eq[65][i].in[1] <== 95; and[20][i] = AND(); - and[20][i].a <== lt[28][i].out; - and[20][i].b <== lt[29][i].out; - eq[18][i] = IsEqual(); - eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 45; - eq[19][i] = IsEqual(); - eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 46; - eq[20][i] = IsEqual(); - eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 95; - and[21][i] = AND(); - and[21][i].a <== states[i][4]; - multi_or[6][i] = MultiOR(6); + and[20][i].a <== states[i][4]; + multi_or[6][i] = MultiOR(15); multi_or[6][i].in[0] <== and[18][i].out; multi_or[6][i].in[1] <== and[19][i].out; - multi_or[6][i].in[2] <== and[20][i].out; - multi_or[6][i].in[3] <== eq[18][i].out; - multi_or[6][i].in[4] <== eq[19][i].out; - multi_or[6][i].in[5] <== eq[20][i].out; - and[21][i].b <== multi_or[6][i].out; - lt[30][i] = LessThan(8); - lt[30][i].in[0] <== 47; + multi_or[6][i].in[2] <== eq[53][i].out; + multi_or[6][i].in[3] <== eq[54][i].out; + multi_or[6][i].in[4] <== eq[55][i].out; + multi_or[6][i].in[5] <== eq[56][i].out; + multi_or[6][i].in[6] <== eq[57][i].out; + multi_or[6][i].in[7] <== eq[58][i].out; + multi_or[6][i].in[8] <== eq[59][i].out; + multi_or[6][i].in[9] <== eq[60][i].out; + multi_or[6][i].in[10] <== eq[61][i].out; + multi_or[6][i].in[11] <== eq[62][i].out; + multi_or[6][i].in[12] <== eq[63][i].out; + multi_or[6][i].in[13] <== eq[64][i].out; + multi_or[6][i].in[14] <== eq[65][i].out; + and[20][i].b <== multi_or[6][i].out; + lt[28][i] = LessEqThan(8); + lt[28][i].in[0] <== 65; + lt[28][i].in[1] <== in[i]; + lt[29][i] = LessEqThan(8); + lt[29][i].in[0] <== in[i]; + lt[29][i].in[1] <== 90; + and[21][i] = AND(); + and[21][i].a <== lt[28][i].out; + and[21][i].b <== lt[29][i].out; + lt[30][i] = LessEqThan(8); + lt[30][i].in[0] <== 97; lt[30][i].in[1] <== in[i]; - lt[31][i] = LessThan(8); + lt[31][i] = LessEqThan(8); lt[31][i].in[0] <== in[i]; - lt[31][i].in[1] <== 58; + lt[31][i].in[1] <== 122; and[22][i] = AND(); and[22][i].a <== lt[30][i].out; and[22][i].b <== lt[31][i].out; - lt[32][i] = LessThan(8); - lt[32][i].in[0] <== 64; - lt[32][i].in[1] <== in[i]; - lt[33][i] = LessThan(8); - lt[33][i].in[0] <== in[i]; - lt[33][i].in[1] <== 91; + eq[66][i] = IsEqual(); + eq[66][i].in[0] <== in[i]; + eq[66][i].in[1] <== 45; + eq[67][i] = IsEqual(); + eq[67][i].in[0] <== in[i]; + eq[67][i].in[1] <== 46; + eq[68][i] = IsEqual(); + eq[68][i].in[0] <== in[i]; + eq[68][i].in[1] <== 48; + eq[69][i] = IsEqual(); + eq[69][i].in[0] <== in[i]; + eq[69][i].in[1] <== 49; + eq[70][i] = IsEqual(); + eq[70][i].in[0] <== in[i]; + eq[70][i].in[1] <== 50; + eq[71][i] = IsEqual(); + eq[71][i].in[0] <== in[i]; + eq[71][i].in[1] <== 51; + eq[72][i] = IsEqual(); + eq[72][i].in[0] <== in[i]; + eq[72][i].in[1] <== 52; + eq[73][i] = IsEqual(); + eq[73][i].in[0] <== in[i]; + eq[73][i].in[1] <== 53; + eq[74][i] = IsEqual(); + eq[74][i].in[0] <== in[i]; + eq[74][i].in[1] <== 54; + eq[75][i] = IsEqual(); + eq[75][i].in[0] <== in[i]; + eq[75][i].in[1] <== 55; + eq[76][i] = IsEqual(); + eq[76][i].in[0] <== in[i]; + eq[76][i].in[1] <== 56; + eq[77][i] = IsEqual(); + eq[77][i].in[0] <== in[i]; + eq[77][i].in[1] <== 57; + eq[78][i] = IsEqual(); + eq[78][i].in[0] <== in[i]; + eq[78][i].in[1] <== 95; and[23][i] = AND(); - and[23][i].a <== lt[32][i].out; - and[23][i].b <== lt[33][i].out; - lt[34][i] = LessThan(8); - lt[34][i].in[0] <== 96; - lt[34][i].in[1] <== in[i]; - lt[35][i] = LessThan(8); - lt[35][i].in[0] <== in[i]; - lt[35][i].in[1] <== 123; - and[24][i] = AND(); - and[24][i].a <== lt[34][i].out; - and[24][i].b <== lt[35][i].out; - eq[21][i] = IsEqual(); - eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 45; - eq[22][i] = IsEqual(); - eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 46; - eq[23][i] = IsEqual(); - eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 95; - and[25][i] = AND(); - and[25][i].a <== states[i][5]; - multi_or[7][i] = MultiOR(6); - multi_or[7][i].in[0] <== and[22][i].out; - multi_or[7][i].in[1] <== and[23][i].out; - multi_or[7][i].in[2] <== and[24][i].out; - multi_or[7][i].in[3] <== eq[21][i].out; - multi_or[7][i].in[4] <== eq[22][i].out; - multi_or[7][i].in[5] <== eq[23][i].out; - and[25][i].b <== multi_or[7][i].out; + and[23][i].a <== states[i][5]; + multi_or[7][i] = MultiOR(15); + multi_or[7][i].in[0] <== and[21][i].out; + multi_or[7][i].in[1] <== and[22][i].out; + multi_or[7][i].in[2] <== eq[66][i].out; + multi_or[7][i].in[3] <== eq[67][i].out; + multi_or[7][i].in[4] <== eq[68][i].out; + multi_or[7][i].in[5] <== eq[69][i].out; + multi_or[7][i].in[6] <== eq[70][i].out; + multi_or[7][i].in[7] <== eq[71][i].out; + multi_or[7][i].in[8] <== eq[72][i].out; + multi_or[7][i].in[9] <== eq[73][i].out; + multi_or[7][i].in[10] <== eq[74][i].out; + multi_or[7][i].in[11] <== eq[75][i].out; + multi_or[7][i].in[12] <== eq[76][i].out; + multi_or[7][i].in[13] <== eq[77][i].out; + multi_or[7][i].in[14] <== eq[78][i].out; + and[23][i].b <== multi_or[7][i].out; multi_or[8][i] = MultiOR(2); - multi_or[8][i].in[0] <== and[21][i].out; - multi_or[8][i].in[1] <== and[25][i].out; + multi_or[8][i].in[0] <== and[20][i].out; + multi_or[8][i].in[1] <== and[23][i].out; states[i+1][5] <== multi_or[8][i].out; state_changed[i].in[4] <== states[i+1][5]; - eq[24][i] = IsEqual(); - eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 62; - and[26][i] = AND(); - and[26][i].a <== states[i][5]; - and[26][i].b <== eq[24][i].out; - states[i+1][6] <== and[26][i].out; + eq[79][i] = IsEqual(); + eq[79][i].in[0] <== in[i]; + eq[79][i].in[1] <== 64; + and[24][i] = AND(); + and[24][i].a <== states[i][5]; + and[24][i].b <== eq[79][i].out; + states[i+1][6] <== and[24][i].out; state_changed[i].in[5] <== states[i+1][6]; states[i+1][0] <== 1 - state_changed[i].out; } component final_state_result = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - final_state_result.in[i] <== states[i][6]; + final_state_result.in[i] <== states[i][3]; } out <== final_state_result.out; 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][6] * (1 - is_consecutive[msg_bytes-i][1]) + is_consecutive[msg_bytes-i][1]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][3] * (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][6]; @@ -378,11 +578,11 @@ template EmailAddrWithNameRegex(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][2] * states[i+2][3]; - is_substr0[i][2] <== is_substr0[i][1] + states[i+1][3] * states[i+2][3]; - is_substr0[i][3] <== is_substr0[i][2] + states[i+1][3] * states[i+2][4]; - is_substr0[i][4] <== is_substr0[i][3] + states[i+1][4] * states[i+2][5]; - is_substr0[i][5] <== is_substr0[i][4] + states[i+1][5] * states[i+2][5]; + is_substr0[i][1] <== is_substr0[i][0] + states[i+1][2] * states[i+2][2]; + is_substr0[i][2] <== is_substr0[i][1] + states[i+1][4] * states[i+2][5]; + is_substr0[i][3] <== is_substr0[i][2] + states[i+1][5] * states[i+2][5]; + is_substr0[i][4] <== is_substr0[i][3] + states[i+1][5] * states[i+2][6]; + is_substr0[i][5] <== is_substr0[i][4] + states[i+1][6] * states[i+2][2]; is_reveal0[i] <== is_substr0[i][5] * is_consecutive[i][1]; reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/circom/circuits/common/email_domain_regex.circom b/packages/circom/circuits/common/email_domain_regex.circom index 1979cdf..a98a58f 100644 --- a/packages/circom/circuits/common/email_domain_regex.circom +++ b/packages/circom/circuits/common/email_domain_regex.circom @@ -8,7 +8,7 @@ template EmailDomainRegex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } diff --git a/packages/circom/circuits/common/from_addr.json b/packages/circom/circuits/common/from_addr.json index 07fa259..ca024f0 100644 --- a/packages/circom/circuits/common/from_addr.json +++ b/packages/circom/circuits/common/from_addr.json @@ -8,7 +8,7 @@ }, { "is_public": false, - "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|_|\\.|\"| |@)+<)?", + "regex_def": "([^\r\n<]+<)?", "max_size": 256 }, { diff --git a/packages/circom/circuits/common/from_all.json b/packages/circom/circuits/common/from_all.json index d7902be..f300c6a 100644 --- a/packages/circom/circuits/common/from_all.json +++ b/packages/circom/circuits/common/from_all.json @@ -8,7 +8,7 @@ }, { "is_public": true, - "regex_def": "(0|1|2|3|4|5|6|7|8|9|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|!|\"|#|\\$|%|&|\\'|\\(|\\)|\\*|\\+|,|-|\\.|/|:|;|<|=|>|\\?|@|\\[|\\\\|\\]|\\^|_|`|{|\\||}|~| |\t)+", + "regex_def": "[^\r\n]+", "max_size": 512 }, { diff --git a/packages/circom/circuits/common/from_all_regex.circom b/packages/circom/circuits/common/from_all_regex.circom new file mode 100644 index 0000000..8c51931 --- /dev/null +++ b/packages/circom/circuits/common/from_all_regex.circom @@ -0,0 +1,274 @@ +pragma circom 2.1.5; + +include "zk-regex-circom/circuits/regex_helpers.circom"; + +template FromAllRegex(msg_bytes) { + signal input msg[msg_bytes]; + signal output out; + + 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[35][num_bytes]; + component lt[4][num_bytes]; + component and[15][num_bytes]; + component multi_or[5][num_bytes]; + signal states[num_bytes+1][11]; + component state_changed[num_bytes]; + + states[0][0] <== 1; + for (var i = 1; i < 11; i++) { + states[0][i] <== 0; + } + + for (var i = 0; i < num_bytes; i++) { + state_changed[i] = MultiOR(10); + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 14; + lt[0][i].in[1] <== in[i]; + lt[1][i] = LessEqThan(8); + lt[1][i].in[0] <== in[i]; + lt[1][i].in[1] <== 254; + and[0][i] = AND(); + and[0][i].a <== lt[0][i].out; + and[0][i].b <== lt[1][i].out; + eq[0][i] = IsEqual(); + eq[0][i].in[0] <== in[i]; + eq[0][i].in[1] <== 0; + eq[1][i] = IsEqual(); + eq[1][i].in[0] <== in[i]; + eq[1][i].in[1] <== 1; + eq[2][i] = IsEqual(); + eq[2][i].in[0] <== in[i]; + eq[2][i].in[1] <== 2; + eq[3][i] = IsEqual(); + eq[3][i].in[0] <== in[i]; + eq[3][i].in[1] <== 3; + eq[4][i] = IsEqual(); + eq[4][i].in[0] <== in[i]; + eq[4][i].in[1] <== 4; + eq[5][i] = IsEqual(); + eq[5][i].in[0] <== in[i]; + eq[5][i].in[1] <== 5; + eq[6][i] = IsEqual(); + eq[6][i].in[0] <== in[i]; + eq[6][i].in[1] <== 6; + eq[7][i] = IsEqual(); + eq[7][i].in[0] <== in[i]; + eq[7][i].in[1] <== 7; + eq[8][i] = IsEqual(); + eq[8][i].in[0] <== in[i]; + eq[8][i].in[1] <== 8; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 9; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 11; + eq[11][i] = IsEqual(); + eq[11][i].in[0] <== in[i]; + eq[11][i].in[1] <== 12; + and[1][i] = AND(); + and[1][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] <== eq[0][i].out; + multi_or[0][i].in[2] <== eq[1][i].out; + multi_or[0][i].in[3] <== eq[2][i].out; + multi_or[0][i].in[4] <== eq[3][i].out; + multi_or[0][i].in[5] <== eq[4][i].out; + multi_or[0][i].in[6] <== eq[5][i].out; + multi_or[0][i].in[7] <== eq[6][i].out; + multi_or[0][i].in[8] <== eq[7][i].out; + multi_or[0][i].in[9] <== eq[8][i].out; + multi_or[0][i].in[10] <== eq[9][i].out; + multi_or[0][i].in[11] <== eq[10][i].out; + multi_or[0][i].in[12] <== eq[11][i].out; + and[1][i].b <== multi_or[0][i].out; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 14; + lt[2][i].in[1] <== in[i]; + lt[3][i] = LessEqThan(8); + lt[3][i].in[0] <== in[i]; + lt[3][i].in[1] <== 254; + and[2][i] = AND(); + and[2][i].a <== lt[2][i].out; + and[2][i].b <== lt[3][i].out; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 0; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 1; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 2; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 3; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 4; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 5; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 6; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 7; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 8; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 9; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 11; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 12; + and[3][i] = AND(); + and[3][i].a <== states[i][8]; + multi_or[1][i] = MultiOR(13); + multi_or[1][i].in[0] <== and[2][i].out; + multi_or[1][i].in[1] <== eq[12][i].out; + multi_or[1][i].in[2] <== eq[13][i].out; + multi_or[1][i].in[3] <== eq[14][i].out; + multi_or[1][i].in[4] <== eq[15][i].out; + multi_or[1][i].in[5] <== eq[16][i].out; + multi_or[1][i].in[6] <== eq[17][i].out; + multi_or[1][i].in[7] <== eq[18][i].out; + multi_or[1][i].in[8] <== eq[19][i].out; + multi_or[1][i].in[9] <== eq[20][i].out; + multi_or[1][i].in[10] <== eq[21][i].out; + multi_or[1][i].in[11] <== eq[22][i].out; + multi_or[1][i].in[12] <== eq[23][i].out; + and[3][i].b <== multi_or[1][i].out; + multi_or[2][i] = MultiOR(2); + multi_or[2][i].in[0] <== and[1][i].out; + multi_or[2][i].in[1] <== and[3][i].out; + states[i+1][1] <== multi_or[2][i].out; + state_changed[i].in[0] <== states[i+1][1]; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 13; + and[4][i] = AND(); + and[4][i].a <== states[i][0]; + and[4][i].b <== eq[24][i].out; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 13; + and[5][i] = AND(); + and[5][i].a <== states[i][3]; + and[5][i].b <== eq[25][i].out; + multi_or[3][i] = MultiOR(2); + multi_or[3][i].in[0] <== and[4][i].out; + multi_or[3][i].in[1] <== and[5][i].out; + states[i+1][2] <== multi_or[3][i].out; + state_changed[i].in[1] <== states[i+1][2]; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 255; + and[6][i] = AND(); + and[6][i].a <== states[i][0]; + and[6][i].b <== eq[26][i].out; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 10; + and[7][i] = AND(); + and[7][i].a <== states[i][2]; + and[7][i].b <== eq[27][i].out; + multi_or[4][i] = MultiOR(2); + multi_or[4][i].in[0] <== and[6][i].out; + multi_or[4][i].in[1] <== and[7][i].out; + states[i+1][3] <== multi_or[4][i].out; + state_changed[i].in[2] <== states[i+1][3]; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 102; + and[8][i] = AND(); + and[8][i].a <== states[i][3]; + and[8][i].b <== eq[28][i].out; + states[i+1][4] <== and[8][i].out; + state_changed[i].in[3] <== states[i+1][4]; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 114; + and[9][i] = AND(); + and[9][i].a <== states[i][4]; + and[9][i].b <== eq[29][i].out; + states[i+1][5] <== and[9][i].out; + state_changed[i].in[4] <== states[i+1][5]; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 111; + and[10][i] = AND(); + and[10][i].a <== states[i][5]; + and[10][i].b <== eq[30][i].out; + states[i+1][6] <== and[10][i].out; + state_changed[i].in[5] <== states[i+1][6]; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 109; + and[11][i] = AND(); + and[11][i].a <== states[i][6]; + and[11][i].b <== eq[31][i].out; + states[i+1][7] <== and[11][i].out; + state_changed[i].in[6] <== states[i+1][7]; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 58; + and[12][i] = AND(); + and[12][i].a <== states[i][7]; + and[12][i].b <== eq[32][i].out; + states[i+1][8] <== and[12][i].out; + state_changed[i].in[7] <== states[i+1][8]; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 13; + and[13][i] = AND(); + and[13][i].a <== states[i][1]; + and[13][i].b <== eq[33][i].out; + states[i+1][9] <== and[13][i].out; + state_changed[i].in[8] <== states[i+1][9]; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 10; + and[14][i] = AND(); + and[14][i].a <== states[i][9]; + and[14][i].b <== eq[34][i].out; + states[i+1][10] <== and[14][i].out; + state_changed[i].in[9] <== states[i+1][10]; + states[i+1][0] <== 1 - state_changed[i].out; + } + + component final_state_result = MultiOR(num_bytes+1); + for (var i = 0; i <= num_bytes; i++) { + final_state_result.in[i] <== states[i][10]; + } + out <== final_state_result.out; + + 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][10] * (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][8] * 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/circom/circuits/common/subject_all.json b/packages/circom/circuits/common/subject_all.json index 044245e..21b0295 100644 --- a/packages/circom/circuits/common/subject_all.json +++ b/packages/circom/circuits/common/subject_all.json @@ -8,7 +8,7 @@ }, { "is_public": true, - "regex_def": "(0|1|2|3|4|5|6|7|8|9|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|!|\"|#|\\$|%|&|\\'|\\(|\\)|\\*|\\+|,|-|\\.|/|:|;|<|=|>|\\?|@|\\[|\\\\|\\]|\\^|_|`|{|\\||}|~| |\t)+", + "regex_def": "[^\r\n]+", "max_size": 1024 }, { diff --git a/packages/circom/circuits/common/subject_all_regex.circom b/packages/circom/circuits/common/subject_all_regex.circom index 733afd0..579a9fd 100644 --- a/packages/circom/circuits/common/subject_all_regex.circom +++ b/packages/circom/circuits/common/subject_all_regex.circom @@ -8,12 +8,12 @@ template SubjectAllRegex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } - component eq[48][num_bytes]; + component eq[38][num_bytes]; component lt[4][num_bytes]; component and[18][num_bytes]; component multi_or[5][num_bytes]; @@ -27,69 +27,54 @@ template SubjectAllRegex(msg_bytes) { for (var i = 0; i < num_bytes; i++) { state_changed[i] = MultiOR(13); - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 47; + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 14; lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); + lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 127; + lt[1][i].in[1] <== 254; and[0][i] = AND(); and[0][i].a <== lt[0][i].out; and[0][i].b <== lt[1][i].out; eq[0][i] = IsEqual(); eq[0][i].in[0] <== in[i]; - eq[0][i].in[1] <== 9; + eq[0][i].in[1] <== 0; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 32; + eq[1][i].in[1] <== 1; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 33; + eq[2][i].in[1] <== 2; eq[3][i] = IsEqual(); eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 34; + eq[3][i].in[1] <== 3; eq[4][i] = IsEqual(); eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 35; + eq[4][i].in[1] <== 4; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 36; + eq[5][i].in[1] <== 5; eq[6][i] = IsEqual(); eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 37; + eq[6][i].in[1] <== 6; eq[7][i] = IsEqual(); eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 38; + eq[7][i].in[1] <== 7; eq[8][i] = IsEqual(); eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 39; + eq[8][i].in[1] <== 8; eq[9][i] = IsEqual(); eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 40; + eq[9][i].in[1] <== 9; eq[10][i] = IsEqual(); eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 41; + eq[10][i].in[1] <== 11; eq[11][i] = IsEqual(); eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 42; - eq[12][i] = IsEqual(); - eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 43; - eq[13][i] = IsEqual(); - eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 44; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 45; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 46; - eq[16][i] = IsEqual(); - eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 47; + eq[11][i].in[1] <== 12; and[1][i] = AND(); and[1][i].a <== states[i][1]; - multi_or[0][i] = MultiOR(18); + multi_or[0][i] = MultiOR(13); multi_or[0][i].in[0] <== and[0][i].out; multi_or[0][i].in[1] <== eq[0][i].out; multi_or[0][i].in[2] <== eq[1][i].out; @@ -103,211 +88,186 @@ template SubjectAllRegex(msg_bytes) { multi_or[0][i].in[10] <== eq[9][i].out; multi_or[0][i].in[11] <== eq[10][i].out; multi_or[0][i].in[12] <== eq[11][i].out; - multi_or[0][i].in[13] <== eq[12][i].out; - multi_or[0][i].in[14] <== eq[13][i].out; - multi_or[0][i].in[15] <== eq[14][i].out; - multi_or[0][i].in[16] <== eq[15][i].out; - multi_or[0][i].in[17] <== eq[16][i].out; and[1][i].b <== multi_or[0][i].out; - lt[2][i] = LessThan(8); - lt[2][i].in[0] <== 47; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 14; lt[2][i].in[1] <== in[i]; - lt[3][i] = LessThan(8); + lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 127; + lt[3][i].in[1] <== 254; and[2][i] = AND(); and[2][i].a <== lt[2][i].out; and[2][i].b <== lt[3][i].out; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 0; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 1; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 2; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 3; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 4; eq[17][i] = IsEqual(); eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 9; + eq[17][i].in[1] <== 5; eq[18][i] = IsEqual(); eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 32; + eq[18][i].in[1] <== 6; eq[19][i] = IsEqual(); eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 33; + eq[19][i].in[1] <== 7; eq[20][i] = IsEqual(); eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 34; + eq[20][i].in[1] <== 8; eq[21][i] = IsEqual(); eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 35; + eq[21][i].in[1] <== 9; eq[22][i] = IsEqual(); eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 36; + eq[22][i].in[1] <== 11; eq[23][i] = IsEqual(); eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 37; - eq[24][i] = IsEqual(); - eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 38; - eq[25][i] = IsEqual(); - eq[25][i].in[0] <== in[i]; - eq[25][i].in[1] <== 39; - eq[26][i] = IsEqual(); - eq[26][i].in[0] <== in[i]; - eq[26][i].in[1] <== 40; - eq[27][i] = IsEqual(); - eq[27][i].in[0] <== in[i]; - eq[27][i].in[1] <== 41; - eq[28][i] = IsEqual(); - eq[28][i].in[0] <== in[i]; - eq[28][i].in[1] <== 42; - eq[29][i] = IsEqual(); - eq[29][i].in[0] <== in[i]; - eq[29][i].in[1] <== 43; - eq[30][i] = IsEqual(); - eq[30][i].in[0] <== in[i]; - eq[30][i].in[1] <== 44; - eq[31][i] = IsEqual(); - eq[31][i].in[0] <== in[i]; - eq[31][i].in[1] <== 45; - eq[32][i] = IsEqual(); - eq[32][i].in[0] <== in[i]; - eq[32][i].in[1] <== 46; - eq[33][i] = IsEqual(); - eq[33][i].in[0] <== in[i]; - eq[33][i].in[1] <== 47; + eq[23][i].in[1] <== 12; and[3][i] = AND(); - and[3][i].a <== states[i][13]; - multi_or[1][i] = MultiOR(18); + and[3][i].a <== states[i][12]; + multi_or[1][i] = MultiOR(13); multi_or[1][i].in[0] <== and[2][i].out; - multi_or[1][i].in[1] <== eq[17][i].out; - multi_or[1][i].in[2] <== eq[18][i].out; - multi_or[1][i].in[3] <== eq[19][i].out; - multi_or[1][i].in[4] <== eq[20][i].out; - multi_or[1][i].in[5] <== eq[21][i].out; - multi_or[1][i].in[6] <== eq[22][i].out; - multi_or[1][i].in[7] <== eq[23][i].out; - multi_or[1][i].in[8] <== eq[24][i].out; - multi_or[1][i].in[9] <== eq[25][i].out; - multi_or[1][i].in[10] <== eq[26][i].out; - multi_or[1][i].in[11] <== eq[27][i].out; - multi_or[1][i].in[12] <== eq[28][i].out; - multi_or[1][i].in[13] <== eq[29][i].out; - multi_or[1][i].in[14] <== eq[30][i].out; - multi_or[1][i].in[15] <== eq[31][i].out; - multi_or[1][i].in[16] <== eq[32][i].out; - multi_or[1][i].in[17] <== eq[33][i].out; + multi_or[1][i].in[1] <== eq[12][i].out; + multi_or[1][i].in[2] <== eq[13][i].out; + multi_or[1][i].in[3] <== eq[14][i].out; + multi_or[1][i].in[4] <== eq[15][i].out; + multi_or[1][i].in[5] <== eq[16][i].out; + multi_or[1][i].in[6] <== eq[17][i].out; + multi_or[1][i].in[7] <== eq[18][i].out; + multi_or[1][i].in[8] <== eq[19][i].out; + multi_or[1][i].in[9] <== eq[20][i].out; + multi_or[1][i].in[10] <== eq[21][i].out; + multi_or[1][i].in[11] <== eq[22][i].out; + multi_or[1][i].in[12] <== eq[23][i].out; and[3][i].b <== multi_or[1][i].out; multi_or[2][i] = MultiOR(2); multi_or[2][i].in[0] <== and[1][i].out; multi_or[2][i].in[1] <== and[3][i].out; states[i+1][1] <== multi_or[2][i].out; state_changed[i].in[0] <== states[i+1][1]; - eq[34][i] = IsEqual(); - eq[34][i].in[0] <== in[i]; - eq[34][i].in[1] <== 13; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 13; and[4][i] = AND(); and[4][i].a <== states[i][0]; - and[4][i].b <== eq[34][i].out; - eq[35][i] = IsEqual(); - eq[35][i].in[0] <== in[i]; - eq[35][i].in[1] <== 13; + and[4][i].b <== eq[24][i].out; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 13; and[5][i] = AND(); and[5][i].a <== states[i][3]; - and[5][i].b <== eq[35][i].out; + and[5][i].b <== eq[25][i].out; multi_or[3][i] = MultiOR(2); multi_or[3][i].in[0] <== and[4][i].out; multi_or[3][i].in[1] <== and[5][i].out; states[i+1][2] <== multi_or[3][i].out; state_changed[i].in[1] <== states[i+1][2]; - eq[36][i] = IsEqual(); - eq[36][i].in[0] <== in[i]; - eq[36][i].in[1] <== 128; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 255; and[6][i] = AND(); and[6][i].a <== states[i][0]; - and[6][i].b <== eq[36][i].out; - eq[37][i] = IsEqual(); - eq[37][i].in[0] <== in[i]; - eq[37][i].in[1] <== 10; + and[6][i].b <== eq[26][i].out; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 10; and[7][i] = AND(); and[7][i].a <== states[i][2]; - and[7][i].b <== eq[37][i].out; + and[7][i].b <== eq[27][i].out; multi_or[4][i] = MultiOR(2); multi_or[4][i].in[0] <== and[6][i].out; multi_or[4][i].in[1] <== and[7][i].out; states[i+1][3] <== multi_or[4][i].out; state_changed[i].in[2] <== states[i+1][3]; - eq[38][i] = IsEqual(); - eq[38][i].in[0] <== in[i]; - eq[38][i].in[1] <== 13; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 115; and[8][i] = AND(); - and[8][i].a <== states[i][1]; - and[8][i].b <== eq[38][i].out; + and[8][i].a <== states[i][3]; + and[8][i].b <== eq[28][i].out; states[i+1][4] <== and[8][i].out; state_changed[i].in[3] <== states[i+1][4]; - eq[39][i] = IsEqual(); - eq[39][i].in[0] <== in[i]; - eq[39][i].in[1] <== 115; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 117; and[9][i] = AND(); - and[9][i].a <== states[i][3]; - and[9][i].b <== eq[39][i].out; + and[9][i].a <== states[i][4]; + and[9][i].b <== eq[29][i].out; states[i+1][5] <== and[9][i].out; state_changed[i].in[4] <== states[i+1][5]; - eq[40][i] = IsEqual(); - eq[40][i].in[0] <== in[i]; - eq[40][i].in[1] <== 117; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 98; and[10][i] = AND(); and[10][i].a <== states[i][5]; - and[10][i].b <== eq[40][i].out; + and[10][i].b <== eq[30][i].out; states[i+1][6] <== and[10][i].out; state_changed[i].in[5] <== states[i+1][6]; - eq[41][i] = IsEqual(); - eq[41][i].in[0] <== in[i]; - eq[41][i].in[1] <== 98; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 106; and[11][i] = AND(); and[11][i].a <== states[i][6]; - and[11][i].b <== eq[41][i].out; + and[11][i].b <== eq[31][i].out; states[i+1][7] <== and[11][i].out; state_changed[i].in[6] <== states[i+1][7]; - eq[42][i] = IsEqual(); - eq[42][i].in[0] <== in[i]; - eq[42][i].in[1] <== 10; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 101; and[12][i] = AND(); - and[12][i].a <== states[i][4]; - and[12][i].b <== eq[42][i].out; + and[12][i].a <== states[i][7]; + and[12][i].b <== eq[32][i].out; states[i+1][8] <== and[12][i].out; state_changed[i].in[7] <== states[i+1][8]; - eq[43][i] = IsEqual(); - eq[43][i].in[0] <== in[i]; - eq[43][i].in[1] <== 106; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 99; and[13][i] = AND(); - and[13][i].a <== states[i][7]; - and[13][i].b <== eq[43][i].out; + and[13][i].a <== states[i][8]; + and[13][i].b <== eq[33][i].out; states[i+1][9] <== and[13][i].out; state_changed[i].in[8] <== states[i+1][9]; - eq[44][i] = IsEqual(); - eq[44][i].in[0] <== in[i]; - eq[44][i].in[1] <== 101; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 13; and[14][i] = AND(); - and[14][i].a <== states[i][9]; - and[14][i].b <== eq[44][i].out; + and[14][i].a <== states[i][1]; + and[14][i].b <== eq[34][i].out; states[i+1][10] <== and[14][i].out; state_changed[i].in[9] <== states[i+1][10]; - eq[45][i] = IsEqual(); - eq[45][i].in[0] <== in[i]; - eq[45][i].in[1] <== 99; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 116; and[15][i] = AND(); - and[15][i].a <== states[i][10]; - and[15][i].b <== eq[45][i].out; + and[15][i].a <== states[i][9]; + and[15][i].b <== eq[35][i].out; states[i+1][11] <== and[15][i].out; state_changed[i].in[10] <== states[i+1][11]; - eq[46][i] = IsEqual(); - eq[46][i].in[0] <== in[i]; - eq[46][i].in[1] <== 116; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 58; and[16][i] = AND(); and[16][i].a <== states[i][11]; - and[16][i].b <== eq[46][i].out; + and[16][i].b <== eq[36][i].out; states[i+1][12] <== and[16][i].out; state_changed[i].in[11] <== states[i+1][12]; - eq[47][i] = IsEqual(); - eq[47][i].in[0] <== in[i]; - eq[47][i].in[1] <== 58; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 10; and[17][i] = AND(); - and[17][i].a <== states[i][12]; - and[17][i].b <== eq[47][i].out; + and[17][i].a <== states[i][10]; + and[17][i].b <== eq[37][i].out; states[i+1][13] <== and[17][i].out; state_changed[i].in[12] <== states[i+1][13]; states[i+1][0] <== 1 - state_changed[i].out; @@ -315,14 +275,14 @@ template SubjectAllRegex(msg_bytes) { component final_state_result = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - final_state_result.in[i] <== states[i][8]; + final_state_result.in[i] <== states[i][13]; } out <== final_state_result.out; 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][8] * (1 - is_consecutive[msg_bytes-i][1]) + is_consecutive[msg_bytes-i][1]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][13] * (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]; @@ -331,7 +291,7 @@ template SubjectAllRegex(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][13] * states[i+2][1]; + is_substr0[i][2] <== is_substr0[i][1] + states[i+1][12] * states[i+2][1]; is_reveal0[i] <== is_substr0[i][2] * is_consecutive[i][1]; reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/circom/circuits/common/timestamp.json b/packages/circom/circuits/common/timestamp.json index f68e2c2..d922a5e 100644 --- a/packages/circom/circuits/common/timestamp.json +++ b/packages/circom/circuits/common/timestamp.json @@ -3,12 +3,12 @@ "parts": [ { "is_public": false, - "regex_def": "dkim-signature:", - "max_size": 15 + "regex_def": "((\r\n)|^)dkim-signature:", + "max_size": 17 }, { "is_public": false, - "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)+=(0|1|2|3|4|5|6|7|8|9|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|!|\"|#|$|%|&|\\'|\\(|\\)|\\*|\\+|,|-|\\.|\\/|:|<|=|>|\\?|@|\\[|\\\\|\\]|\\^|_|`|{|\\||}|~| |\t|\n|\r|\\x0b|\\x0c)+; )+t=", + "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)+=[^;]+; )+t=", "max_size": 1024 }, { diff --git a/packages/circom/circuits/common/timestamp_regex.circom b/packages/circom/circuits/common/timestamp_regex.circom index bc5e99a..3f50d70 100644 --- a/packages/circom/circuits/common/timestamp_regex.circom +++ b/packages/circom/circuits/common/timestamp_regex.circom @@ -8,874 +8,534 @@ template TimestampRegex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } - component eq[147][num_bytes]; - component lt[22][num_bytes]; - component and[43][num_bytes]; - component multi_or[9][num_bytes]; - signal states[num_bytes+1][25]; + component eq[54][num_bytes]; + component lt[24][num_bytes]; + component and[48][num_bytes]; + component multi_or[13][num_bytes]; + signal states[num_bytes+1][27]; component state_changed[num_bytes]; states[0][0] <== 1; - for (var i = 1; i < 25; i++) { + for (var i = 1; i < 27; i++) { states[0][i] <== 0; } for (var i = 0; i < num_bytes; i++) { - state_changed[i] = MultiOR(24); - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 96; + state_changed[i] = MultiOR(26); + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 97; lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); + lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 123; + lt[1][i].in[1] <== 122; and[0][i] = AND(); and[0][i].a <== lt[0][i].out; and[0][i].b <== lt[1][i].out; and[1][i] = AND(); and[1][i].a <== states[i][1]; and[1][i].b <== and[0][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] <== 115; + and[2][i] = AND(); + and[2][i].a <== lt[2][i].out; + and[2][i].b <== lt[3][i].out; eq[0][i] = IsEqual(); eq[0][i].in[0] <== in[i]; - eq[0][i].in[1] <== 97; + eq[0][i].in[1] <== 117; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 98; + eq[1][i].in[1] <== 118; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 99; + eq[2][i].in[1] <== 119; eq[3][i] = IsEqual(); eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 100; + eq[3][i].in[1] <== 120; eq[4][i] = IsEqual(); eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 101; + eq[4][i].in[1] <== 121; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 102; + eq[5][i].in[1] <== 122; + and[3][i] = AND(); + and[3][i].a <== states[i][6]; + multi_or[0][i] = MultiOR(7); + multi_or[0][i].in[0] <== and[2][i].out; + multi_or[0][i].in[1] <== eq[0][i].out; + multi_or[0][i].in[2] <== eq[1][i].out; + multi_or[0][i].in[3] <== eq[2][i].out; + multi_or[0][i].in[4] <== eq[3][i].out; + multi_or[0][i].in[5] <== eq[4][i].out; + multi_or[0][i].in[6] <== eq[5][i].out; + and[3][i].b <== multi_or[0][i].out; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 97; + lt[4][i].in[1] <== in[i]; + lt[5][i] = LessEqThan(8); + lt[5][i].in[0] <== in[i]; + lt[5][i].in[1] <== 122; + and[4][i] = AND(); + and[4][i].a <== lt[4][i].out; + and[4][i].b <== lt[5][i].out; + and[5][i] = AND(); + and[5][i].a <== states[i][24]; + and[5][i].b <== and[4][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[6][i] = AND(); + and[6][i].a <== lt[6][i].out; + and[6][i].b <== lt[7][i].out; + and[7][i] = AND(); + and[7][i].a <== states[i][25]; + and[7][i].b <== and[6][i].out; + multi_or[1][i] = MultiOR(4); + multi_or[1][i].in[0] <== and[1][i].out; + multi_or[1][i].in[1] <== and[3][i].out; + multi_or[1][i].in[2] <== and[5][i].out; + multi_or[1][i].in[3] <== and[7][i].out; + states[i+1][1] <== multi_or[1][i].out; + state_changed[i].in[0] <== states[i+1][1]; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 0; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 58; + and[8][i] = AND(); + and[8][i].a <== lt[8][i].out; + and[8][i].b <== lt[9][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 60; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 254; + and[9][i] = AND(); + and[9][i].a <== lt[10][i].out; + and[9][i].b <== lt[11][i].out; + and[10][i] = AND(); + and[10][i].a <== states[i][2]; + multi_or[2][i] = MultiOR(2); + multi_or[2][i].in[0] <== and[8][i].out; + multi_or[2][i].in[1] <== and[9][i].out; + and[10][i].b <== multi_or[2][i].out; + lt[12][i] = LessEqThan(8); + lt[12][i].in[0] <== 0; + lt[12][i].in[1] <== in[i]; + lt[13][i] = LessEqThan(8); + lt[13][i].in[0] <== in[i]; + lt[13][i].in[1] <== 47; + and[11][i] = AND(); + and[11][i].a <== lt[12][i].out; + and[11][i].b <== lt[13][i].out; + lt[14][i] = LessEqThan(8); + lt[14][i].in[0] <== 60; + lt[14][i].in[1] <== in[i]; + lt[15][i] = LessEqThan(8); + lt[15][i].in[0] <== in[i]; + lt[15][i].in[1] <== 254; + and[12][i] = AND(); + and[12][i].a <== lt[14][i].out; + and[12][i].b <== lt[15][i].out; eq[6][i] = IsEqual(); eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 103; + eq[6][i].in[1] <== 58; + and[13][i] = AND(); + and[13][i].a <== states[i][3]; + multi_or[3][i] = MultiOR(3); + multi_or[3][i].in[0] <== and[11][i].out; + multi_or[3][i].in[1] <== and[12][i].out; + multi_or[3][i].in[2] <== eq[6][i].out; + and[13][i].b <== multi_or[3][i].out; + lt[16][i] = LessEqThan(8); + lt[16][i].in[0] <== 0; + lt[16][i].in[1] <== in[i]; + lt[17][i] = LessEqThan(8); + lt[17][i].in[0] <== in[i]; + lt[17][i].in[1] <== 58; + and[14][i] = AND(); + and[14][i].a <== lt[16][i].out; + and[14][i].b <== lt[17][i].out; + lt[18][i] = LessEqThan(8); + lt[18][i].in[0] <== 60; + lt[18][i].in[1] <== in[i]; + lt[19][i] = LessEqThan(8); + lt[19][i].in[0] <== in[i]; + lt[19][i].in[1] <== 254; + and[15][i] = AND(); + and[15][i].a <== lt[18][i].out; + and[15][i].b <== lt[19][i].out; + and[16][i] = AND(); + and[16][i].a <== states[i][7]; + multi_or[4][i] = MultiOR(2); + multi_or[4][i].in[0] <== and[14][i].out; + multi_or[4][i].in[1] <== and[15][i].out; + and[16][i].b <== multi_or[4][i].out; + lt[20][i] = LessEqThan(8); + lt[20][i].in[0] <== 0; + lt[20][i].in[1] <== in[i]; + lt[21][i] = LessEqThan(8); + lt[21][i].in[0] <== in[i]; + lt[21][i].in[1] <== 47; + and[17][i] = AND(); + and[17][i].a <== lt[20][i].out; + and[17][i].b <== lt[21][i].out; + lt[22][i] = LessEqThan(8); + lt[22][i].in[0] <== 60; + lt[22][i].in[1] <== in[i]; + lt[23][i] = LessEqThan(8); + lt[23][i].in[0] <== in[i]; + lt[23][i].in[1] <== 254; + and[18][i] = AND(); + and[18][i].a <== lt[22][i].out; + and[18][i].b <== lt[23][i].out; eq[7][i] = IsEqual(); eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 104; + eq[7][i].in[1] <== 58; + and[19][i] = AND(); + and[19][i].a <== states[i][26]; + multi_or[5][i] = MultiOR(3); + multi_or[5][i].in[0] <== and[17][i].out; + multi_or[5][i].in[1] <== and[18][i].out; + multi_or[5][i].in[2] <== eq[7][i].out; + and[19][i].b <== multi_or[5][i].out; + multi_or[6][i] = MultiOR(4); + multi_or[6][i].in[0] <== and[10][i].out; + multi_or[6][i].in[1] <== and[13][i].out; + multi_or[6][i].in[2] <== and[16][i].out; + multi_or[6][i].in[3] <== and[19][i].out; + states[i+1][2] <== multi_or[6][i].out; + state_changed[i].in[1] <== states[i+1][2]; eq[8][i] = IsEqual(); eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 105; + eq[8][i].in[1] <== 48; eq[9][i] = IsEqual(); eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 106; + eq[9][i].in[1] <== 49; eq[10][i] = IsEqual(); eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 107; + eq[10][i].in[1] <== 50; eq[11][i] = IsEqual(); eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 108; + eq[11][i].in[1] <== 51; eq[12][i] = IsEqual(); eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 109; + eq[12][i].in[1] <== 52; eq[13][i] = IsEqual(); eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 110; + eq[13][i].in[1] <== 53; eq[14][i] = IsEqual(); eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 111; + eq[14][i].in[1] <== 54; eq[15][i] = IsEqual(); eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 112; + eq[15][i].in[1] <== 55; eq[16][i] = IsEqual(); eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 113; + eq[16][i].in[1] <== 56; eq[17][i] = IsEqual(); eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 114; + eq[17][i].in[1] <== 57; + and[20][i] = AND(); + and[20][i].a <== states[i][3]; + multi_or[7][i] = MultiOR(10); + multi_or[7][i].in[0] <== eq[8][i].out; + multi_or[7][i].in[1] <== eq[9][i].out; + multi_or[7][i].in[2] <== eq[10][i].out; + multi_or[7][i].in[3] <== eq[11][i].out; + multi_or[7][i].in[4] <== eq[12][i].out; + multi_or[7][i].in[5] <== eq[13][i].out; + multi_or[7][i].in[6] <== eq[14][i].out; + multi_or[7][i].in[7] <== eq[15][i].out; + multi_or[7][i].in[8] <== eq[16][i].out; + multi_or[7][i].in[9] <== eq[17][i].out; + and[20][i].b <== multi_or[7][i].out; eq[18][i] = IsEqual(); eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 115; + eq[18][i].in[1] <== 48; eq[19][i] = IsEqual(); eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 117; + eq[19][i].in[1] <== 49; eq[20][i] = IsEqual(); eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 118; + eq[20][i].in[1] <== 50; eq[21][i] = IsEqual(); eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 119; + eq[21][i].in[1] <== 51; eq[22][i] = IsEqual(); eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 120; + eq[22][i].in[1] <== 52; eq[23][i] = IsEqual(); eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 121; + eq[23][i].in[1] <== 53; eq[24][i] = IsEqual(); eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 122; - and[2][i] = AND(); - and[2][i].a <== states[i][14]; - multi_or[0][i] = MultiOR(25); - multi_or[0][i].in[0] <== eq[0][i].out; - multi_or[0][i].in[1] <== eq[1][i].out; - multi_or[0][i].in[2] <== eq[2][i].out; - multi_or[0][i].in[3] <== eq[3][i].out; - multi_or[0][i].in[4] <== eq[4][i].out; - multi_or[0][i].in[5] <== eq[5][i].out; - multi_or[0][i].in[6] <== eq[6][i].out; - multi_or[0][i].in[7] <== eq[7][i].out; - multi_or[0][i].in[8] <== eq[8][i].out; - multi_or[0][i].in[9] <== eq[9][i].out; - multi_or[0][i].in[10] <== eq[10][i].out; - multi_or[0][i].in[11] <== eq[11][i].out; - multi_or[0][i].in[12] <== eq[12][i].out; - multi_or[0][i].in[13] <== eq[13][i].out; - multi_or[0][i].in[14] <== eq[14][i].out; - multi_or[0][i].in[15] <== eq[15][i].out; - multi_or[0][i].in[16] <== eq[16][i].out; - multi_or[0][i].in[17] <== eq[17][i].out; - multi_or[0][i].in[18] <== eq[18][i].out; - multi_or[0][i].in[19] <== eq[19][i].out; - multi_or[0][i].in[20] <== eq[20][i].out; - multi_or[0][i].in[21] <== eq[21][i].out; - multi_or[0][i].in[22] <== eq[22][i].out; - multi_or[0][i].in[23] <== eq[23][i].out; - multi_or[0][i].in[24] <== eq[24][i].out; - and[2][i].b <== multi_or[0][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[3][i] = AND(); - and[3][i].a <== lt[2][i].out; - and[3][i].b <== lt[3][i].out; - and[4][i] = AND(); - and[4][i].a <== states[i][16]; - and[4][i].b <== and[3][i].out; - lt[4][i] = LessThan(8); - lt[4][i].in[0] <== 96; - lt[4][i].in[1] <== in[i]; - lt[5][i] = LessThan(8); - lt[5][i].in[0] <== in[i]; - lt[5][i].in[1] <== 123; - and[5][i] = AND(); - and[5][i].a <== lt[4][i].out; - and[5][i].b <== lt[5][i].out; - and[6][i] = AND(); - and[6][i].a <== states[i][22]; - and[6][i].b <== and[5][i].out; - multi_or[1][i] = MultiOR(4); - multi_or[1][i].in[0] <== and[1][i].out; - multi_or[1][i].in[1] <== and[2][i].out; - multi_or[1][i].in[2] <== and[4][i].out; - multi_or[1][i].in[3] <== and[6][i].out; - states[i+1][1] <== multi_or[1][i].out; - state_changed[i].in[0] <== states[i+1][1]; + eq[24][i].in[1] <== 54; eq[25][i] = IsEqual(); eq[25][i].in[0] <== in[i]; - eq[25][i].in[1] <== 61; - and[7][i] = AND(); - and[7][i].a <== states[i][1]; - and[7][i].b <== eq[25][i].out; - states[i+1][2] <== and[7][i].out; - state_changed[i].in[1] <== states[i+1][2]; + eq[25][i].in[1] <== 55; eq[26][i] = IsEqual(); eq[26][i].in[0] <== in[i]; - eq[26][i].in[1] <== 100; - and[8][i] = AND(); - and[8][i].a <== states[i][0]; - and[8][i].b <== eq[26][i].out; - states[i+1][3] <== and[8][i].out; - state_changed[i].in[2] <== states[i+1][3]; - lt[6][i] = LessThan(8); - lt[6][i].in[0] <== 47; - lt[6][i].in[1] <== in[i]; - lt[7][i] = LessThan(8); - lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 58; - and[9][i] = AND(); - and[9][i].a <== lt[6][i].out; - and[9][i].b <== lt[7][i].out; - lt[8][i] = LessThan(8); - lt[8][i].in[0] <== 64; - lt[8][i].in[1] <== in[i]; - lt[9][i] = LessThan(8); - lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 127; - and[10][i] = AND(); - and[10][i].a <== lt[8][i].out; - and[10][i].b <== lt[9][i].out; + eq[26][i].in[1] <== 56; eq[27][i] = IsEqual(); eq[27][i].in[0] <== in[i]; - eq[27][i].in[1] <== 9; + eq[27][i].in[1] <== 57; + and[21][i] = AND(); + and[21][i].a <== states[i][26]; + multi_or[8][i] = MultiOR(10); + multi_or[8][i].in[0] <== eq[18][i].out; + multi_or[8][i].in[1] <== eq[19][i].out; + multi_or[8][i].in[2] <== eq[20][i].out; + multi_or[8][i].in[3] <== eq[21][i].out; + multi_or[8][i].in[4] <== eq[22][i].out; + multi_or[8][i].in[5] <== eq[23][i].out; + multi_or[8][i].in[6] <== eq[24][i].out; + multi_or[8][i].in[7] <== eq[25][i].out; + multi_or[8][i].in[8] <== eq[26][i].out; + multi_or[8][i].in[9] <== eq[27][i].out; + and[21][i].b <== multi_or[8][i].out; + multi_or[9][i] = MultiOR(2); + multi_or[9][i].in[0] <== and[20][i].out; + multi_or[9][i].in[1] <== and[21][i].out; + states[i+1][3] <== multi_or[9][i].out; + state_changed[i].in[2] <== states[i+1][3]; eq[28][i] = IsEqual(); eq[28][i].in[0] <== in[i]; - eq[28][i].in[1] <== 10; + eq[28][i].in[1] <== 59; + and[22][i] = AND(); + and[22][i].a <== states[i][2]; + and[22][i].b <== eq[28][i].out; + states[i+1][4] <== and[22][i].out; + state_changed[i].in[3] <== states[i+1][4]; eq[29][i] = IsEqual(); eq[29][i].in[0] <== in[i]; - eq[29][i].in[1] <== 13; + eq[29][i].in[1] <== 59; + and[23][i] = AND(); + and[23][i].a <== states[i][3]; + and[23][i].b <== eq[29][i].out; + states[i+1][5] <== and[23][i].out; + state_changed[i].in[4] <== states[i+1][5]; eq[30][i] = IsEqual(); eq[30][i].in[0] <== in[i]; eq[30][i].in[1] <== 32; + and[24][i] = AND(); + and[24][i].a <== states[i][4]; + and[24][i].b <== eq[30][i].out; eq[31][i] = IsEqual(); eq[31][i].in[0] <== in[i]; - eq[31][i].in[1] <== 33; + eq[31][i].in[1] <== 32; + and[25][i] = AND(); + and[25][i].a <== states[i][5]; + and[25][i].b <== eq[31][i].out; + multi_or[10][i] = MultiOR(2); + multi_or[10][i].in[0] <== and[24][i].out; + multi_or[10][i].in[1] <== and[25][i].out; + states[i+1][6] <== multi_or[10][i].out; + state_changed[i].in[5] <== states[i+1][6]; eq[32][i] = IsEqual(); eq[32][i].in[0] <== in[i]; - eq[32][i].in[1] <== 34; + eq[32][i].in[1] <== 61; + and[26][i] = AND(); + and[26][i].a <== states[i][1]; + and[26][i].b <== eq[32][i].out; + states[i+1][7] <== and[26][i].out; + state_changed[i].in[6] <== states[i+1][7]; eq[33][i] = IsEqual(); eq[33][i].in[0] <== in[i]; - eq[33][i].in[1] <== 35; + eq[33][i].in[1] <== 13; + and[27][i] = AND(); + and[27][i].a <== states[i][0]; + and[27][i].b <== eq[33][i].out; eq[34][i] = IsEqual(); eq[34][i].in[0] <== in[i]; - eq[34][i].in[1] <== 36; + eq[34][i].in[1] <== 13; + and[28][i] = AND(); + and[28][i].a <== states[i][9]; + and[28][i].b <== eq[34][i].out; + multi_or[11][i] = MultiOR(2); + multi_or[11][i].in[0] <== and[27][i].out; + multi_or[11][i].in[1] <== and[28][i].out; + states[i+1][8] <== multi_or[11][i].out; + state_changed[i].in[7] <== states[i+1][8]; eq[35][i] = IsEqual(); eq[35][i].in[0] <== in[i]; - eq[35][i].in[1] <== 37; + eq[35][i].in[1] <== 255; + and[29][i] = AND(); + and[29][i].a <== states[i][0]; + and[29][i].b <== eq[35][i].out; eq[36][i] = IsEqual(); eq[36][i].in[0] <== in[i]; - eq[36][i].in[1] <== 38; + eq[36][i].in[1] <== 10; + and[30][i] = AND(); + and[30][i].a <== states[i][8]; + and[30][i].b <== eq[36][i].out; + multi_or[12][i] = MultiOR(2); + multi_or[12][i].in[0] <== and[29][i].out; + multi_or[12][i].in[1] <== and[30][i].out; + states[i+1][9] <== multi_or[12][i].out; + state_changed[i].in[8] <== states[i+1][9]; eq[37][i] = IsEqual(); eq[37][i].in[0] <== in[i]; - eq[37][i].in[1] <== 39; + eq[37][i].in[1] <== 100; + and[31][i] = AND(); + and[31][i].a <== states[i][9]; + and[31][i].b <== eq[37][i].out; + states[i+1][10] <== and[31][i].out; + state_changed[i].in[9] <== states[i+1][10]; eq[38][i] = IsEqual(); eq[38][i].in[0] <== in[i]; - eq[38][i].in[1] <== 40; + eq[38][i].in[1] <== 107; + and[32][i] = AND(); + and[32][i].a <== states[i][10]; + and[32][i].b <== eq[38][i].out; + states[i+1][11] <== and[32][i].out; + state_changed[i].in[10] <== states[i+1][11]; eq[39][i] = IsEqual(); eq[39][i].in[0] <== in[i]; - eq[39][i].in[1] <== 41; + eq[39][i].in[1] <== 105; + and[33][i] = AND(); + and[33][i].a <== states[i][11]; + and[33][i].b <== eq[39][i].out; + states[i+1][12] <== and[33][i].out; + state_changed[i].in[11] <== states[i+1][12]; eq[40][i] = IsEqual(); eq[40][i].in[0] <== in[i]; - eq[40][i].in[1] <== 42; + eq[40][i].in[1] <== 109; + and[34][i] = AND(); + and[34][i].a <== states[i][12]; + and[34][i].b <== eq[40][i].out; + states[i+1][13] <== and[34][i].out; + state_changed[i].in[12] <== states[i+1][13]; eq[41][i] = IsEqual(); eq[41][i].in[0] <== in[i]; - eq[41][i].in[1] <== 43; + eq[41][i].in[1] <== 45; + and[35][i] = AND(); + and[35][i].a <== states[i][13]; + and[35][i].b <== eq[41][i].out; + states[i+1][14] <== and[35][i].out; + state_changed[i].in[13] <== states[i+1][14]; eq[42][i] = IsEqual(); eq[42][i].in[0] <== in[i]; - eq[42][i].in[1] <== 44; + eq[42][i].in[1] <== 115; + and[36][i] = AND(); + and[36][i].a <== states[i][14]; + and[36][i].b <== eq[42][i].out; + states[i+1][15] <== and[36][i].out; + state_changed[i].in[14] <== states[i+1][15]; eq[43][i] = IsEqual(); eq[43][i].in[0] <== in[i]; - eq[43][i].in[1] <== 45; + eq[43][i].in[1] <== 105; + and[37][i] = AND(); + and[37][i].a <== states[i][15]; + and[37][i].b <== eq[43][i].out; + states[i+1][16] <== and[37][i].out; + state_changed[i].in[15] <== states[i+1][16]; eq[44][i] = IsEqual(); eq[44][i].in[0] <== in[i]; - eq[44][i].in[1] <== 46; + eq[44][i].in[1] <== 103; + and[38][i] = AND(); + and[38][i].a <== states[i][16]; + and[38][i].b <== eq[44][i].out; + states[i+1][17] <== and[38][i].out; + state_changed[i].in[16] <== states[i+1][17]; eq[45][i] = IsEqual(); eq[45][i].in[0] <== in[i]; - eq[45][i].in[1] <== 47; + eq[45][i].in[1] <== 110; + and[39][i] = AND(); + and[39][i].a <== states[i][17]; + and[39][i].b <== eq[45][i].out; + states[i+1][18] <== and[39][i].out; + state_changed[i].in[17] <== states[i+1][18]; eq[46][i] = IsEqual(); eq[46][i].in[0] <== in[i]; - eq[46][i].in[1] <== 58; + eq[46][i].in[1] <== 97; + and[40][i] = AND(); + and[40][i].a <== states[i][18]; + and[40][i].b <== eq[46][i].out; + states[i+1][19] <== and[40][i].out; + state_changed[i].in[18] <== states[i+1][19]; eq[47][i] = IsEqual(); eq[47][i].in[0] <== in[i]; - eq[47][i].in[1] <== 60; + eq[47][i].in[1] <== 116; + and[41][i] = AND(); + and[41][i].a <== states[i][19]; + and[41][i].b <== eq[47][i].out; + states[i+1][20] <== and[41][i].out; + state_changed[i].in[19] <== states[i+1][20]; eq[48][i] = IsEqual(); eq[48][i].in[0] <== in[i]; - eq[48][i].in[1] <== 61; + eq[48][i].in[1] <== 117; + and[42][i] = AND(); + and[42][i].a <== states[i][20]; + and[42][i].b <== eq[48][i].out; + states[i+1][21] <== and[42][i].out; + state_changed[i].in[20] <== states[i+1][21]; eq[49][i] = IsEqual(); eq[49][i].in[0] <== in[i]; - eq[49][i].in[1] <== 62; + eq[49][i].in[1] <== 114; + and[43][i] = AND(); + and[43][i].a <== states[i][21]; + and[43][i].b <== eq[49][i].out; + states[i+1][22] <== and[43][i].out; + state_changed[i].in[21] <== states[i+1][22]; eq[50][i] = IsEqual(); eq[50][i].in[0] <== in[i]; - eq[50][i].in[1] <== 63; + eq[50][i].in[1] <== 101; + and[44][i] = AND(); + and[44][i].a <== states[i][22]; + and[44][i].b <== eq[50][i].out; + states[i+1][23] <== and[44][i].out; + state_changed[i].in[22] <== states[i+1][23]; eq[51][i] = IsEqual(); eq[51][i].in[0] <== in[i]; - eq[51][i].in[1] <== 64; - and[11][i] = AND(); - and[11][i].a <== states[i][2]; - multi_or[2][i] = MultiOR(27); - multi_or[2][i].in[0] <== and[9][i].out; - multi_or[2][i].in[1] <== and[10][i].out; - multi_or[2][i].in[2] <== eq[27][i].out; - multi_or[2][i].in[3] <== eq[28][i].out; - multi_or[2][i].in[4] <== eq[29][i].out; - multi_or[2][i].in[5] <== eq[30][i].out; - multi_or[2][i].in[6] <== eq[31][i].out; - multi_or[2][i].in[7] <== eq[32][i].out; - multi_or[2][i].in[8] <== eq[33][i].out; - multi_or[2][i].in[9] <== eq[34][i].out; - multi_or[2][i].in[10] <== eq[35][i].out; - multi_or[2][i].in[11] <== eq[36][i].out; - multi_or[2][i].in[12] <== eq[37][i].out; - multi_or[2][i].in[13] <== eq[38][i].out; - multi_or[2][i].in[14] <== eq[39][i].out; - multi_or[2][i].in[15] <== eq[40][i].out; - multi_or[2][i].in[16] <== eq[41][i].out; - multi_or[2][i].in[17] <== eq[42][i].out; - multi_or[2][i].in[18] <== eq[43][i].out; - multi_or[2][i].in[19] <== eq[44][i].out; - multi_or[2][i].in[20] <== eq[45][i].out; - multi_or[2][i].in[21] <== eq[46][i].out; - multi_or[2][i].in[22] <== eq[47][i].out; - multi_or[2][i].in[23] <== eq[48][i].out; - multi_or[2][i].in[24] <== eq[49][i].out; - multi_or[2][i].in[25] <== eq[50][i].out; - multi_or[2][i].in[26] <== eq[51][i].out; - and[11][i].b <== multi_or[2][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[12][i] = AND(); - and[12][i].a <== lt[10][i].out; - and[12][i].b <== lt[11][i].out; - lt[12][i] = LessThan(8); - lt[12][i].in[0] <== 64; - lt[12][i].in[1] <== in[i]; - lt[13][i] = LessThan(8); - lt[13][i].in[0] <== in[i]; - lt[13][i].in[1] <== 127; - and[13][i] = AND(); - and[13][i].a <== lt[12][i].out; - and[13][i].b <== lt[13][i].out; + eq[51][i].in[1] <== 58; + and[45][i] = AND(); + and[45][i].a <== states[i][23]; + and[45][i].b <== eq[51][i].out; + states[i+1][24] <== and[45][i].out; + state_changed[i].in[23] <== states[i+1][24]; eq[52][i] = IsEqual(); eq[52][i].in[0] <== in[i]; - eq[52][i].in[1] <== 9; + eq[52][i].in[1] <== 116; + and[46][i] = AND(); + and[46][i].a <== states[i][6]; + and[46][i].b <== eq[52][i].out; + states[i+1][25] <== and[46][i].out; + state_changed[i].in[24] <== states[i+1][25]; eq[53][i] = IsEqual(); eq[53][i].in[0] <== in[i]; - eq[53][i].in[1] <== 10; - eq[54][i] = IsEqual(); - eq[54][i].in[0] <== in[i]; - eq[54][i].in[1] <== 13; - eq[55][i] = IsEqual(); - eq[55][i].in[0] <== in[i]; - eq[55][i].in[1] <== 32; - eq[56][i] = IsEqual(); - eq[56][i].in[0] <== in[i]; - eq[56][i].in[1] <== 33; - eq[57][i] = IsEqual(); - eq[57][i].in[0] <== in[i]; - eq[57][i].in[1] <== 34; - eq[58][i] = IsEqual(); - eq[58][i].in[0] <== in[i]; - eq[58][i].in[1] <== 35; - eq[59][i] = IsEqual(); - eq[59][i].in[0] <== in[i]; - eq[59][i].in[1] <== 36; - eq[60][i] = IsEqual(); - eq[60][i].in[0] <== in[i]; - eq[60][i].in[1] <== 37; - eq[61][i] = IsEqual(); - eq[61][i].in[0] <== in[i]; - eq[61][i].in[1] <== 38; - eq[62][i] = IsEqual(); - eq[62][i].in[0] <== in[i]; - eq[62][i].in[1] <== 39; - eq[63][i] = IsEqual(); - eq[63][i].in[0] <== in[i]; - eq[63][i].in[1] <== 40; - eq[64][i] = IsEqual(); - eq[64][i].in[0] <== in[i]; - eq[64][i].in[1] <== 41; - eq[65][i] = IsEqual(); - eq[65][i].in[0] <== in[i]; - eq[65][i].in[1] <== 42; - eq[66][i] = IsEqual(); - eq[66][i].in[0] <== in[i]; - eq[66][i].in[1] <== 43; - eq[67][i] = IsEqual(); - eq[67][i].in[0] <== in[i]; - eq[67][i].in[1] <== 44; - eq[68][i] = IsEqual(); - eq[68][i].in[0] <== in[i]; - eq[68][i].in[1] <== 45; - eq[69][i] = IsEqual(); - eq[69][i].in[0] <== in[i]; - eq[69][i].in[1] <== 46; - eq[70][i] = IsEqual(); - eq[70][i].in[0] <== in[i]; - eq[70][i].in[1] <== 47; - eq[71][i] = IsEqual(); - eq[71][i].in[0] <== in[i]; - eq[71][i].in[1] <== 58; - eq[72][i] = IsEqual(); - eq[72][i].in[0] <== in[i]; - eq[72][i].in[1] <== 60; - eq[73][i] = IsEqual(); - eq[73][i].in[0] <== in[i]; - eq[73][i].in[1] <== 61; - eq[74][i] = IsEqual(); - eq[74][i].in[0] <== in[i]; - eq[74][i].in[1] <== 62; - eq[75][i] = IsEqual(); - eq[75][i].in[0] <== in[i]; - eq[75][i].in[1] <== 63; - eq[76][i] = IsEqual(); - eq[76][i].in[0] <== in[i]; - eq[76][i].in[1] <== 64; - and[14][i] = AND(); - and[14][i].a <== states[i][4]; - multi_or[3][i] = MultiOR(27); - multi_or[3][i].in[0] <== and[12][i].out; - multi_or[3][i].in[1] <== and[13][i].out; - multi_or[3][i].in[2] <== eq[52][i].out; - multi_or[3][i].in[3] <== eq[53][i].out; - multi_or[3][i].in[4] <== eq[54][i].out; - multi_or[3][i].in[5] <== eq[55][i].out; - multi_or[3][i].in[6] <== eq[56][i].out; - multi_or[3][i].in[7] <== eq[57][i].out; - multi_or[3][i].in[8] <== eq[58][i].out; - multi_or[3][i].in[9] <== eq[59][i].out; - multi_or[3][i].in[10] <== eq[60][i].out; - multi_or[3][i].in[11] <== eq[61][i].out; - multi_or[3][i].in[12] <== eq[62][i].out; - multi_or[3][i].in[13] <== eq[63][i].out; - multi_or[3][i].in[14] <== eq[64][i].out; - multi_or[3][i].in[15] <== eq[65][i].out; - multi_or[3][i].in[16] <== eq[66][i].out; - multi_or[3][i].in[17] <== eq[67][i].out; - multi_or[3][i].in[18] <== eq[68][i].out; - multi_or[3][i].in[19] <== eq[69][i].out; - multi_or[3][i].in[20] <== eq[70][i].out; - multi_or[3][i].in[21] <== eq[71][i].out; - multi_or[3][i].in[22] <== eq[72][i].out; - multi_or[3][i].in[23] <== eq[73][i].out; - multi_or[3][i].in[24] <== eq[74][i].out; - multi_or[3][i].in[25] <== eq[75][i].out; - multi_or[3][i].in[26] <== eq[76][i].out; - and[14][i].b <== multi_or[3][i].out; - lt[14][i] = LessThan(8); - lt[14][i].in[0] <== 64; - lt[14][i].in[1] <== in[i]; - lt[15][i] = LessThan(8); - lt[15][i].in[0] <== in[i]; - lt[15][i].in[1] <== 127; - and[15][i] = AND(); - and[15][i].a <== lt[14][i].out; - and[15][i].b <== lt[15][i].out; - eq[77][i] = IsEqual(); - eq[77][i].in[0] <== in[i]; - eq[77][i].in[1] <== 9; - eq[78][i] = IsEqual(); - eq[78][i].in[0] <== in[i]; - eq[78][i].in[1] <== 10; - eq[79][i] = IsEqual(); - eq[79][i].in[0] <== in[i]; - eq[79][i].in[1] <== 13; - eq[80][i] = IsEqual(); - eq[80][i].in[0] <== in[i]; - eq[80][i].in[1] <== 32; - eq[81][i] = IsEqual(); - eq[81][i].in[0] <== in[i]; - eq[81][i].in[1] <== 33; - eq[82][i] = IsEqual(); - eq[82][i].in[0] <== in[i]; - eq[82][i].in[1] <== 34; - eq[83][i] = IsEqual(); - eq[83][i].in[0] <== in[i]; - eq[83][i].in[1] <== 35; - eq[84][i] = IsEqual(); - eq[84][i].in[0] <== in[i]; - eq[84][i].in[1] <== 36; - eq[85][i] = IsEqual(); - eq[85][i].in[0] <== in[i]; - eq[85][i].in[1] <== 37; - eq[86][i] = IsEqual(); - eq[86][i].in[0] <== in[i]; - eq[86][i].in[1] <== 38; - eq[87][i] = IsEqual(); - eq[87][i].in[0] <== in[i]; - eq[87][i].in[1] <== 39; - eq[88][i] = IsEqual(); - eq[88][i].in[0] <== in[i]; - eq[88][i].in[1] <== 40; - eq[89][i] = IsEqual(); - eq[89][i].in[0] <== in[i]; - eq[89][i].in[1] <== 41; - eq[90][i] = IsEqual(); - eq[90][i].in[0] <== in[i]; - eq[90][i].in[1] <== 42; - eq[91][i] = IsEqual(); - eq[91][i].in[0] <== in[i]; - eq[91][i].in[1] <== 43; - eq[92][i] = IsEqual(); - eq[92][i].in[0] <== in[i]; - eq[92][i].in[1] <== 44; - eq[93][i] = IsEqual(); - eq[93][i].in[0] <== in[i]; - eq[93][i].in[1] <== 45; - eq[94][i] = IsEqual(); - eq[94][i].in[0] <== in[i]; - eq[94][i].in[1] <== 46; - eq[95][i] = IsEqual(); - eq[95][i].in[0] <== in[i]; - eq[95][i].in[1] <== 47; - eq[96][i] = IsEqual(); - eq[96][i].in[0] <== in[i]; - eq[96][i].in[1] <== 58; - eq[97][i] = IsEqual(); - eq[97][i].in[0] <== in[i]; - eq[97][i].in[1] <== 60; - eq[98][i] = IsEqual(); - eq[98][i].in[0] <== in[i]; - eq[98][i].in[1] <== 61; - eq[99][i] = IsEqual(); - eq[99][i].in[0] <== in[i]; - eq[99][i].in[1] <== 62; - eq[100][i] = IsEqual(); - eq[100][i].in[0] <== in[i]; - eq[100][i].in[1] <== 63; - eq[101][i] = IsEqual(); - eq[101][i].in[0] <== in[i]; - eq[101][i].in[1] <== 64; - and[16][i] = AND(); - and[16][i].a <== states[i][18]; - multi_or[4][i] = MultiOR(26); - multi_or[4][i].in[0] <== and[15][i].out; - multi_or[4][i].in[1] <== eq[77][i].out; - multi_or[4][i].in[2] <== eq[78][i].out; - multi_or[4][i].in[3] <== eq[79][i].out; - multi_or[4][i].in[4] <== eq[80][i].out; - multi_or[4][i].in[5] <== eq[81][i].out; - multi_or[4][i].in[6] <== eq[82][i].out; - multi_or[4][i].in[7] <== eq[83][i].out; - multi_or[4][i].in[8] <== eq[84][i].out; - multi_or[4][i].in[9] <== eq[85][i].out; - multi_or[4][i].in[10] <== eq[86][i].out; - multi_or[4][i].in[11] <== eq[87][i].out; - multi_or[4][i].in[12] <== eq[88][i].out; - multi_or[4][i].in[13] <== eq[89][i].out; - multi_or[4][i].in[14] <== eq[90][i].out; - multi_or[4][i].in[15] <== eq[91][i].out; - multi_or[4][i].in[16] <== eq[92][i].out; - multi_or[4][i].in[17] <== eq[93][i].out; - multi_or[4][i].in[18] <== eq[94][i].out; - multi_or[4][i].in[19] <== eq[95][i].out; - multi_or[4][i].in[20] <== eq[96][i].out; - multi_or[4][i].in[21] <== eq[97][i].out; - multi_or[4][i].in[22] <== eq[98][i].out; - multi_or[4][i].in[23] <== eq[99][i].out; - multi_or[4][i].in[24] <== eq[100][i].out; - multi_or[4][i].in[25] <== eq[101][i].out; - and[16][i].b <== multi_or[4][i].out; - lt[16][i] = LessThan(8); - lt[16][i].in[0] <== 64; - lt[16][i].in[1] <== in[i]; - lt[17][i] = LessThan(8); - lt[17][i].in[0] <== in[i]; - lt[17][i].in[1] <== 127; - and[17][i] = AND(); - and[17][i].a <== lt[16][i].out; - and[17][i].b <== lt[17][i].out; - eq[102][i] = IsEqual(); - eq[102][i].in[0] <== in[i]; - eq[102][i].in[1] <== 9; - eq[103][i] = IsEqual(); - eq[103][i].in[0] <== in[i]; - eq[103][i].in[1] <== 10; - eq[104][i] = IsEqual(); - eq[104][i].in[0] <== in[i]; - eq[104][i].in[1] <== 13; - eq[105][i] = IsEqual(); - eq[105][i].in[0] <== in[i]; - eq[105][i].in[1] <== 32; - eq[106][i] = IsEqual(); - eq[106][i].in[0] <== in[i]; - eq[106][i].in[1] <== 33; - eq[107][i] = IsEqual(); - eq[107][i].in[0] <== in[i]; - eq[107][i].in[1] <== 34; - eq[108][i] = IsEqual(); - eq[108][i].in[0] <== in[i]; - eq[108][i].in[1] <== 35; - eq[109][i] = IsEqual(); - eq[109][i].in[0] <== in[i]; - eq[109][i].in[1] <== 36; - eq[110][i] = IsEqual(); - eq[110][i].in[0] <== in[i]; - eq[110][i].in[1] <== 37; - eq[111][i] = IsEqual(); - eq[111][i].in[0] <== in[i]; - eq[111][i].in[1] <== 38; - eq[112][i] = IsEqual(); - eq[112][i].in[0] <== in[i]; - eq[112][i].in[1] <== 39; - eq[113][i] = IsEqual(); - eq[113][i].in[0] <== in[i]; - eq[113][i].in[1] <== 40; - eq[114][i] = IsEqual(); - eq[114][i].in[0] <== in[i]; - eq[114][i].in[1] <== 41; - eq[115][i] = IsEqual(); - eq[115][i].in[0] <== in[i]; - eq[115][i].in[1] <== 42; - eq[116][i] = IsEqual(); - eq[116][i].in[0] <== in[i]; - eq[116][i].in[1] <== 43; - eq[117][i] = IsEqual(); - eq[117][i].in[0] <== in[i]; - eq[117][i].in[1] <== 44; - eq[118][i] = IsEqual(); - eq[118][i].in[0] <== in[i]; - eq[118][i].in[1] <== 45; - eq[119][i] = IsEqual(); - eq[119][i].in[0] <== in[i]; - eq[119][i].in[1] <== 46; - eq[120][i] = IsEqual(); - eq[120][i].in[0] <== in[i]; - eq[120][i].in[1] <== 47; - eq[121][i] = IsEqual(); - eq[121][i].in[0] <== in[i]; - eq[121][i].in[1] <== 58; - eq[122][i] = IsEqual(); - eq[122][i].in[0] <== in[i]; - eq[122][i].in[1] <== 60; - eq[123][i] = IsEqual(); - eq[123][i].in[0] <== in[i]; - eq[123][i].in[1] <== 61; - eq[124][i] = IsEqual(); - eq[124][i].in[0] <== in[i]; - eq[124][i].in[1] <== 62; - eq[125][i] = IsEqual(); - eq[125][i].in[0] <== in[i]; - eq[125][i].in[1] <== 63; - eq[126][i] = IsEqual(); - eq[126][i].in[0] <== in[i]; - eq[126][i].in[1] <== 64; - and[18][i] = AND(); - and[18][i].a <== states[i][23]; - multi_or[5][i] = MultiOR(26); - multi_or[5][i].in[0] <== and[17][i].out; - multi_or[5][i].in[1] <== eq[102][i].out; - multi_or[5][i].in[2] <== eq[103][i].out; - multi_or[5][i].in[3] <== eq[104][i].out; - multi_or[5][i].in[4] <== eq[105][i].out; - multi_or[5][i].in[5] <== eq[106][i].out; - multi_or[5][i].in[6] <== eq[107][i].out; - multi_or[5][i].in[7] <== eq[108][i].out; - multi_or[5][i].in[8] <== eq[109][i].out; - multi_or[5][i].in[9] <== eq[110][i].out; - multi_or[5][i].in[10] <== eq[111][i].out; - multi_or[5][i].in[11] <== eq[112][i].out; - multi_or[5][i].in[12] <== eq[113][i].out; - multi_or[5][i].in[13] <== eq[114][i].out; - multi_or[5][i].in[14] <== eq[115][i].out; - multi_or[5][i].in[15] <== eq[116][i].out; - multi_or[5][i].in[16] <== eq[117][i].out; - multi_or[5][i].in[17] <== eq[118][i].out; - multi_or[5][i].in[18] <== eq[119][i].out; - multi_or[5][i].in[19] <== eq[120][i].out; - multi_or[5][i].in[20] <== eq[121][i].out; - multi_or[5][i].in[21] <== eq[122][i].out; - multi_or[5][i].in[22] <== eq[123][i].out; - multi_or[5][i].in[23] <== eq[124][i].out; - multi_or[5][i].in[24] <== eq[125][i].out; - multi_or[5][i].in[25] <== eq[126][i].out; - and[18][i].b <== multi_or[5][i].out; - multi_or[6][i] = MultiOR(4); - multi_or[6][i].in[0] <== and[11][i].out; - multi_or[6][i].in[1] <== and[14][i].out; - multi_or[6][i].in[2] <== and[16][i].out; - multi_or[6][i].in[3] <== and[18][i].out; - states[i+1][4] <== multi_or[6][i].out; - state_changed[i].in[3] <== states[i+1][4]; - eq[127][i] = IsEqual(); - eq[127][i].in[0] <== in[i]; - eq[127][i].in[1] <== 107; - and[19][i] = AND(); - and[19][i].a <== states[i][3]; - and[19][i].b <== eq[127][i].out; - states[i+1][5] <== and[19][i].out; - state_changed[i].in[4] <== states[i+1][5]; - eq[128][i] = IsEqual(); - eq[128][i].in[0] <== in[i]; - eq[128][i].in[1] <== 105; - and[20][i] = AND(); - and[20][i].a <== states[i][5]; - and[20][i].b <== eq[128][i].out; - states[i+1][6] <== and[20][i].out; - state_changed[i].in[5] <== states[i+1][6]; - eq[129][i] = IsEqual(); - eq[129][i].in[0] <== in[i]; - eq[129][i].in[1] <== 109; - and[21][i] = AND(); - and[21][i].a <== states[i][6]; - and[21][i].b <== eq[129][i].out; - states[i+1][7] <== and[21][i].out; - state_changed[i].in[6] <== states[i+1][7]; - eq[130][i] = IsEqual(); - eq[130][i].in[0] <== in[i]; - eq[130][i].in[1] <== 45; - and[22][i] = AND(); - and[22][i].a <== states[i][7]; - and[22][i].b <== eq[130][i].out; - states[i+1][8] <== and[22][i].out; - state_changed[i].in[7] <== states[i+1][8]; - eq[131][i] = IsEqual(); - eq[131][i].in[0] <== in[i]; - eq[131][i].in[1] <== 115; - and[23][i] = AND(); - and[23][i].a <== states[i][8]; - and[23][i].b <== eq[131][i].out; - states[i+1][9] <== and[23][i].out; - state_changed[i].in[8] <== states[i+1][9]; - eq[132][i] = IsEqual(); - eq[132][i].in[0] <== in[i]; - eq[132][i].in[1] <== 59; - and[24][i] = AND(); - and[24][i].a <== states[i][4]; - and[24][i].b <== eq[132][i].out; - states[i+1][10] <== and[24][i].out; - state_changed[i].in[9] <== states[i+1][10]; - eq[133][i] = IsEqual(); - eq[133][i].in[0] <== in[i]; - eq[133][i].in[1] <== 105; - and[25][i] = AND(); - and[25][i].a <== states[i][9]; - and[25][i].b <== eq[133][i].out; - states[i+1][11] <== and[25][i].out; - state_changed[i].in[10] <== states[i+1][11]; - eq[134][i] = IsEqual(); - eq[134][i].in[0] <== in[i]; - eq[134][i].in[1] <== 103; - and[26][i] = AND(); - and[26][i].a <== states[i][11]; - and[26][i].b <== eq[134][i].out; - states[i+1][12] <== and[26][i].out; - state_changed[i].in[11] <== states[i+1][12]; - eq[135][i] = IsEqual(); - eq[135][i].in[0] <== in[i]; - eq[135][i].in[1] <== 110; - and[27][i] = AND(); - and[27][i].a <== states[i][12]; - and[27][i].b <== eq[135][i].out; - states[i+1][13] <== and[27][i].out; - state_changed[i].in[12] <== states[i+1][13]; - eq[136][i] = IsEqual(); - eq[136][i].in[0] <== in[i]; - eq[136][i].in[1] <== 32; - and[28][i] = AND(); - and[28][i].a <== states[i][10]; - and[28][i].b <== eq[136][i].out; - eq[137][i] = IsEqual(); - eq[137][i].in[0] <== in[i]; - eq[137][i].in[1] <== 32; - and[29][i] = AND(); - and[29][i].a <== states[i][24]; - and[29][i].b <== eq[137][i].out; - multi_or[7][i] = MultiOR(2); - multi_or[7][i].in[0] <== and[28][i].out; - multi_or[7][i].in[1] <== and[29][i].out; - states[i+1][14] <== multi_or[7][i].out; - state_changed[i].in[13] <== states[i+1][14]; - eq[138][i] = IsEqual(); - eq[138][i].in[0] <== in[i]; - eq[138][i].in[1] <== 97; - and[30][i] = AND(); - and[30][i].a <== states[i][13]; - and[30][i].b <== eq[138][i].out; - states[i+1][15] <== and[30][i].out; - state_changed[i].in[14] <== states[i+1][15]; - eq[139][i] = IsEqual(); - eq[139][i].in[0] <== in[i]; - eq[139][i].in[1] <== 116; - and[31][i] = AND(); - and[31][i].a <== states[i][14]; - and[31][i].b <== eq[139][i].out; - states[i+1][16] <== and[31][i].out; - state_changed[i].in[15] <== states[i+1][16]; - eq[140][i] = IsEqual(); - eq[140][i].in[0] <== in[i]; - eq[140][i].in[1] <== 116; - and[32][i] = AND(); - and[32][i].a <== states[i][15]; - and[32][i].b <== eq[140][i].out; - states[i+1][17] <== and[32][i].out; - state_changed[i].in[16] <== states[i+1][17]; - eq[141][i] = IsEqual(); - eq[141][i].in[0] <== in[i]; - eq[141][i].in[1] <== 61; - and[33][i] = AND(); - and[33][i].a <== states[i][16]; - and[33][i].b <== eq[141][i].out; - states[i+1][18] <== and[33][i].out; - state_changed[i].in[17] <== states[i+1][18]; - eq[142][i] = IsEqual(); - eq[142][i].in[0] <== in[i]; - eq[142][i].in[1] <== 117; - and[34][i] = AND(); - and[34][i].a <== states[i][17]; - and[34][i].b <== eq[142][i].out; - states[i+1][19] <== and[34][i].out; - state_changed[i].in[18] <== states[i+1][19]; - eq[143][i] = IsEqual(); - eq[143][i].in[0] <== in[i]; - eq[143][i].in[1] <== 114; - and[35][i] = AND(); - and[35][i].a <== states[i][19]; - and[35][i].b <== eq[143][i].out; - states[i+1][20] <== and[35][i].out; - state_changed[i].in[19] <== states[i+1][20]; - eq[144][i] = IsEqual(); - eq[144][i].in[0] <== in[i]; - eq[144][i].in[1] <== 101; - and[36][i] = AND(); - and[36][i].a <== states[i][20]; - and[36][i].b <== eq[144][i].out; - states[i+1][21] <== and[36][i].out; - state_changed[i].in[20] <== states[i+1][21]; - eq[145][i] = IsEqual(); - eq[145][i].in[0] <== in[i]; - eq[145][i].in[1] <== 58; - and[37][i] = AND(); - and[37][i].a <== states[i][21]; - and[37][i].b <== eq[145][i].out; - states[i+1][22] <== and[37][i].out; - state_changed[i].in[21] <== states[i+1][22]; - lt[18][i] = LessThan(8); - lt[18][i].in[0] <== 47; - lt[18][i].in[1] <== in[i]; - lt[19][i] = LessThan(8); - lt[19][i].in[0] <== in[i]; - lt[19][i].in[1] <== 58; - and[38][i] = AND(); - and[38][i].a <== lt[18][i].out; - and[38][i].b <== lt[19][i].out; - and[39][i] = AND(); - and[39][i].a <== states[i][18]; - and[39][i].b <== and[38][i].out; - lt[20][i] = LessThan(8); - lt[20][i].in[0] <== 47; - lt[20][i].in[1] <== in[i]; - lt[21][i] = LessThan(8); - lt[21][i].in[0] <== in[i]; - lt[21][i].in[1] <== 58; - and[40][i] = AND(); - and[40][i].a <== lt[20][i].out; - and[40][i].b <== lt[21][i].out; - and[41][i] = AND(); - and[41][i].a <== states[i][23]; - and[41][i].b <== and[40][i].out; - multi_or[8][i] = MultiOR(2); - multi_or[8][i].in[0] <== and[39][i].out; - multi_or[8][i].in[1] <== and[41][i].out; - states[i+1][23] <== multi_or[8][i].out; - state_changed[i].in[22] <== states[i+1][23]; - eq[146][i] = IsEqual(); - eq[146][i].in[0] <== in[i]; - eq[146][i].in[1] <== 59; - and[42][i] = AND(); - and[42][i].a <== states[i][23]; - and[42][i].b <== eq[146][i].out; - states[i+1][24] <== and[42][i].out; - state_changed[i].in[23] <== states[i+1][24]; + eq[53][i].in[1] <== 61; + and[47][i] = AND(); + and[47][i].a <== states[i][25]; + and[47][i].b <== eq[53][i].out; + states[i+1][26] <== and[47][i].out; + state_changed[i].in[25] <== states[i+1][26]; states[i+1][0] <== 1 - state_changed[i].out; } component final_state_result = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - final_state_result.in[i] <== states[i][24]; + final_state_result.in[i] <== states[i][5]; } out <== final_state_result.out; 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][24] * (1 - is_consecutive[msg_bytes-i][1]) + is_consecutive[msg_bytes-i][1]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][5] * (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]; @@ -883,8 +543,8 @@ template TimestampRegex(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][18] * states[i+2][23]; - is_substr0[i][2] <== is_substr0[i][1] + states[i+1][23] * states[i+2][23]; + is_substr0[i][1] <== is_substr0[i][0] + states[i+1][3] * states[i+2][3]; + is_substr0[i][2] <== is_substr0[i][1] + states[i+1][26] * states[i+2][3]; is_reveal0[i] <== is_substr0[i][2] * is_consecutive[i][1]; reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/circom/tests/circuits/negate1.json b/packages/circom/tests/circuits/negate1.json index 551b70b..b9fb0a1 100644 --- a/packages/circom/tests/circuits/negate1.json +++ b/packages/circom/tests/circuits/negate1.json @@ -8,12 +8,12 @@ }, { "is_public": true, - "regex_def": "[^abcdefghijklmnopqrstuvwxyz]+", + "regex_def": "[^abcdefghijklmnopqrstuvwxyz\\.]+", "max_size": 128 }, { "is_public": false, - "regex_def": ".", + "regex_def": "\\.", "max_size": 1 } ] diff --git a/packages/circom/tests/circuits/negate1_regex.circom b/packages/circom/tests/circuits/negate1_regex.circom index da56d7e..9c7f5bf 100644 --- a/packages/circom/tests/circuits/negate1_regex.circom +++ b/packages/circom/tests/circuits/negate1_regex.circom @@ -8,15 +8,15 @@ template Negate1Regex(msg_bytes) { var num_bytes = msg_bytes+1; signal in[num_bytes]; - in[0]<==128; + in[0]<==255; for (var i = 0; i < msg_bytes; i++) { in[i+1] <== msg[i]; } - component eq[4][num_bytes]; - component lt[4][num_bytes]; - component and[7][num_bytes]; - component multi_or[2][num_bytes]; + component eq[3][num_bytes]; + component lt[12][num_bytes]; + component and[11][num_bytes]; + component multi_or[3][num_bytes]; signal states[num_bytes+1][5]; component state_changed[num_bytes]; @@ -27,78 +27,116 @@ template Negate1Regex(msg_bytes) { for (var i = 0; i < num_bytes; i++) { state_changed[i] = MultiOR(4); - lt[0][i] = LessThan(8); - lt[0][i].in[0] <== 96; + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 0; lt[0][i].in[1] <== in[i]; - lt[1][i] = LessThan(8); + lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 123; + lt[1][i].in[1] <== 45; and[0][i] = AND(); and[0][i].a <== lt[0][i].out; and[0][i].b <== lt[1][i].out; - eq[0][i] = IsEqual(); - eq[0][i].in[0] <== in[i]; - eq[0][i].in[1] <== 46; - and[1][i] = AND(); - and[1][i].a <== states[i][1]; - multi_or[0][i] = MultiOR(2); - multi_or[0][i].in[0] <== and[0][i].out; - multi_or[0][i].in[1] <== eq[0][i].out; - and[1][i].b <== 1 - multi_or[0][i].out; - lt[2][i] = LessThan(8); - lt[2][i].in[0] <== 96; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 47; lt[2][i].in[1] <== in[i]; - lt[3][i] = LessThan(8); + lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 123; + lt[3][i].in[1] <== 96; + and[1][i] = AND(); + and[1][i].a <== lt[2][i].out; + and[1][i].b <== lt[3][i].out; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 123; + lt[4][i].in[1] <== in[i]; + lt[5][i] = LessEqThan(8); + lt[5][i].in[0] <== in[i]; + lt[5][i].in[1] <== 254; and[2][i] = AND(); - and[2][i].a <== lt[2][i].out; - and[2][i].b <== lt[3][i].out; + and[2][i].a <== lt[4][i].out; + and[2][i].b <== lt[5][i].out; and[3][i] = AND(); - and[3][i].a <== states[i][4]; - and[3][i].b <== 1 - and[2][i].out; - multi_or[1][i] = MultiOR(2); - multi_or[1][i].in[0] <== and[1][i].out; - multi_or[1][i].in[1] <== and[3][i].out; - states[i+1][1] <== multi_or[1][i].out; + and[3][i].a <== states[i][1]; + multi_or[0][i] = MultiOR(3); + 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; + and[3][i].b <== multi_or[0][i].out; + lt[6][i] = LessEqThan(8); + lt[6][i].in[0] <== 0; + lt[6][i].in[1] <== in[i]; + lt[7][i] = LessEqThan(8); + lt[7][i].in[0] <== in[i]; + lt[7][i].in[1] <== 45; + and[4][i] = AND(); + and[4][i].a <== lt[6][i].out; + and[4][i].b <== lt[7][i].out; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 47; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 96; + and[5][i] = AND(); + and[5][i].a <== lt[8][i].out; + and[5][i].b <== lt[9][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 123; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 254; + and[6][i] = AND(); + and[6][i].a <== lt[10][i].out; + and[6][i].b <== lt[11][i].out; + and[7][i] = AND(); + and[7][i].a <== states[i][3]; + multi_or[1][i] = MultiOR(3); + 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; + 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; state_changed[i].in[0] <== states[i+1][1]; + eq[0][i] = IsEqual(); + eq[0][i].in[0] <== in[i]; + eq[0][i].in[1] <== 97; + and[8][i] = AND(); + and[8][i].a <== states[i][0]; + and[8][i].b <== eq[0][i].out; + states[i+1][2] <== and[8][i].out; + state_changed[i].in[1] <== states[i+1][2]; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 46; - and[4][i] = AND(); - and[4][i].a <== states[i][1]; - and[4][i].b <== eq[1][i].out; - states[i+1][2] <== and[4][i].out; - state_changed[i].in[1] <== states[i+1][2]; + eq[1][i].in[1] <== 58; + and[9][i] = AND(); + and[9][i].a <== states[i][2]; + and[9][i].b <== eq[1][i].out; + states[i+1][3] <== and[9][i].out; + state_changed[i].in[2] <== states[i+1][3]; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 97; - and[5][i] = AND(); - and[5][i].a <== states[i][0]; - and[5][i].b <== eq[2][i].out; - states[i+1][3] <== and[5][i].out; - state_changed[i].in[2] <== states[i+1][3]; - eq[3][i] = IsEqual(); - eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 58; - and[6][i] = AND(); - and[6][i].a <== states[i][3]; - and[6][i].b <== eq[3][i].out; - states[i+1][4] <== and[6][i].out; + eq[2][i].in[1] <== 46; + and[10][i] = AND(); + and[10][i].a <== states[i][1]; + and[10][i].b <== eq[2][i].out; + states[i+1][4] <== and[10][i].out; state_changed[i].in[3] <== states[i+1][4]; states[i+1][0] <== 1 - state_changed[i].out; } component final_state_result = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - final_state_result.in[i] <== states[i][2]; + final_state_result.in[i] <== states[i][4]; } out <== final_state_result.out; 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][2] * (1 - is_consecutive[msg_bytes-i][1]) + is_consecutive[msg_bytes-i][1]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][4] * (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]; @@ -106,8 +144,8 @@ template Negate1Regex(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][4] * states[i+2][1]; - is_substr0[i][2] <== is_substr0[i][1] + states[i+1][1] * states[i+2][1]; + 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][3] * states[i+2][1]; is_reveal0[i] <== is_substr0[i][2] * is_consecutive[i][1]; reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/circom/tests/from_addr.test.ts b/packages/circom/tests/from_addr.test.ts index b4d41a6..bf4edd8 100644 --- a/packages/circom/tests/from_addr.test.ts +++ b/packages/circom/tests/from_addr.test.ts @@ -55,6 +55,7 @@ describe("From Addr Regex", () => { } }); + it("from field from beginning case 2", async () => { const fromStr = "from:Sora Suegami \r\n"; // const revealed = "suegamisora@gmail.com"; @@ -82,6 +83,60 @@ describe("From Addr Regex", () => { } }); + it("from field from beginning case 3 (email address as a name)", async () => { + const fromStr = "from:suegamisora@gmail.com\r\n"; + // const revealed = "suegamisora@gmail.com"; + // const prefixLen = "from:Sora Suegami <".length; + const paddedStr = apis.padString(fromStr, 1024); + const circuitInputs = { + msg: paddedStr, + }; + // const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_from_addr_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + // console.log(paddedStr); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(fromStr, readFileSync(path.join(__dirname, "../circuits/common/from_addr.json"), "utf8"))[0]; + // for (let idx = 0; idx < revealed.length; ++idx) { + // expect(BigInt(paddedStr[prefixIdx + idx])).toEqual(witness[2 + prefixIdx + idx]); + // } + for (let idx = 0; idx < 1024; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); + + it("from field from beginning case 4 (non-English string is used as a name)", async () => { + const fromStr = "from: \"末神奏宙\" \r\n"; + // const revealed = "suegamisora@gmail.com"; + // const prefixLen = "from:Sora Suegami <".length; + const paddedStr = apis.padString(fromStr, 1024); + const circuitInputs = { + msg: paddedStr, + }; + // const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_from_addr_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + // console.log(paddedStr); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(fromStr, readFileSync(path.join(__dirname, "../circuits/common/from_addr.json"), "utf8"))[0]; + // for (let idx = 0; idx < revealed.length; ++idx) { + // expect(BigInt(paddedStr[prefixIdx + idx])).toEqual(witness[2 + prefixIdx + idx]); + // } + for (let idx = 0; idx < 1024; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); + it("from field after new line case 1", async () => { const fromStr = "dummy\r\nfrom:suegamisora@gmail.com\r\n"; const revealed = "suegamisora@gmail.com"; @@ -133,4 +188,59 @@ describe("From Addr Regex", () => { } } }); + + it("from field after new line case 3 (email address as a name)", async () => { + const fromStr = "dummy\r\nfrom:suegamisora@gmail.com\r\n"; + // const revealed = "suegamisora@gmail.com"; + // const prefixLen = "from:Sora Suegami <".length; + const paddedStr = apis.padString(fromStr, 1024); + const circuitInputs = { + msg: paddedStr, + }; + // const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_from_addr_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + // console.log(paddedStr); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(fromStr, readFileSync(path.join(__dirname, "../circuits/common/from_addr.json"), "utf8"))[0]; + // for (let idx = 0; idx < revealed.length; ++idx) { + // expect(BigInt(paddedStr[prefixIdx + idx])).toEqual(witness[2 + prefixIdx + idx]); + // } + for (let idx = 0; idx < 1024; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); + + it("from field after new line case 4 (non-English string is used as a name)", async () => { + const fromStr = "dummy\r\nfrom: \"末神奏宙\" \r\n"; + // const revealed = "suegamisora@gmail.com"; + // const prefixLen = "from:Sora Suegami <".length; + const paddedStr = apis.padString(fromStr, 1024); + const circuitInputs = { + msg: paddedStr, + }; + // const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_from_addr_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + // console.log(paddedStr); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(fromStr, readFileSync(path.join(__dirname, "../circuits/common/from_addr.json"), "utf8"))[0]; + // for (let idx = 0; idx < revealed.length; ++idx) { + // expect(BigInt(paddedStr[prefixIdx + idx])).toEqual(witness[2 + prefixIdx + idx]); + // } + for (let idx = 0; idx < 1024; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); + }); \ No newline at end of file diff --git a/packages/circom/tests/negate_regex.test.ts b/packages/circom/tests/negate_regex.test.ts index c7b5f23..891deba 100644 --- a/packages/circom/tests/negate_regex.test.ts +++ b/packages/circom/tests/negate_regex.test.ts @@ -15,11 +15,11 @@ jest.setTimeout(120000); describe("Negate Regex", () => { let circuit; beforeAll(async () => { - compiler.genFromDecomposed(path.join(__dirname, "./circuits/negate1.json"), { - circomFilePath: path.join(__dirname, "../circuits/negate1_regex.circom"), - templateName: "Negate1Regex", - genSubstrs: true - }); + // compiler.genFromDecomposed(path.join(__dirname, "./circuits/negate1.json"), { + // circomFilePath: path.join(__dirname, "./circuits/negate1_regex.circom"), + // templateName: "Negate1Regex", + // genSubstrs: true + // }); circuit = await wasm_tester(path.join(__dirname, "./circuits/test_negate1_regex.circom"), option); }); diff --git a/packages/circom/tests/subject_all.test.ts b/packages/circom/tests/subject_all.test.ts index 793e15d..cd1cdcc 100644 --- a/packages/circom/tests/subject_all.test.ts +++ b/packages/circom/tests/subject_all.test.ts @@ -70,4 +70,27 @@ describe("Subject All Regex", () => { } } }); + + it("subject from beginning and non-English case", async () => { + const subjectStr = "subject:これはテストです。\r\n"; + // const revealed = "This is a test."; + // const prefixLen = "subject:".length; + const paddedStr = apis.padString(subjectStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + // const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_subject_all_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(subjectStr, readFileSync(path.join(__dirname, "../circuits/common/subject_all.json"), "utf8"))[0]; + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); }); \ No newline at end of file diff --git a/packages/circom/tests/timestamp.test.ts b/packages/circom/tests/timestamp.test.ts index 2cde26b..e2a7840 100644 --- a/packages/circom/tests/timestamp.test.ts +++ b/packages/circom/tests/timestamp.test.ts @@ -45,4 +45,25 @@ describe("Timestamp Regex", () => { } } }); + + it("timestamp after new line", async () => { + const signatureField = `\r\ndkim-signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1694989812; x=1695594612; dara=google.com; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=BWETwQ9JDReS4GyR2v2TTR8Bpzj9ayumsWQJ3q7vehs=; b=`; + // const revealed = "1694989812"; + const paddedStr = apis.padString(signatureField, 1024); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester(path.join(__dirname, "./circuits/test_timestamp_regex.circom"), option); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = apis.extractSubstrIdxes(signatureField, readFileSync(path.join(__dirname, "../circuits/common/timestamp.json"), "utf8"))[0]; + for (let idx = 0; idx < 1024; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); }); \ No newline at end of file diff --git a/packages/compiler/src/gen_circom.js b/packages/compiler/src/gen_circom.js index 57f28a5..f4d477f 100644 --- a/packages/compiler/src/gen_circom.js +++ b/packages/compiler/src/gen_circom.js @@ -1,5 +1,6 @@ function genCircomAllstr(graph_json, template_name) { const N = graph_json.length; + // console.log(JSON.stringify(graph_json, null, 2)); // const graph = Array(N).fill({}); const rev_graph = []; const to_init_graph = []; @@ -17,10 +18,10 @@ function genCircomAllstr(graph_json, template_name) { const index = rev_graph[v][i].indexOf(94); if (index !== -1) { init_going_state = v; - rev_graph[v][i][index] = 128; + rev_graph[v][i][index] = 255; } for (let j = 0; j < rev_graph[v][i].length; j++) { - if (rev_graph[v][i][j] == 128) { + if (rev_graph[v][i][j] == 255) { continue; } to_init_graph[v].push(rev_graph[v][i][j]); @@ -59,78 +60,103 @@ function genCircomAllstr(graph_json, template_name) { let lines = []; lines.push("\tfor (var i = 0; i < num_bytes; i++) {"); - const uppercase = new Set(Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ").map(c => c.charCodeAt())); - const lowercase = new Set(Array.from("abcdefghijklmnopqrstuvwxyz").map(c => c.charCodeAt())); - const digits = new Set(Array.from("0123456789").map(c => c.charCodeAt())); - const symbols1 = new Set([":", ";", "<", "=", ">", "?", "@"].map(c => c.charCodeAt())); - const symbols2 = new Set(["[", "\\", "]", "^", "_", "`"].map(c => c.charCodeAt())); - const symbols3 = new Set(["{", "|", "}", "~"].map(c => c.charCodeAt())); + // const uppercase = new Set(Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ").map(c => c.charCodeAt())); + // const lowercase = new Set(Array.from("abcdefghijklmnopqrstuvwxyz").map(c => c.charCodeAt())); + // const digits = new Set(Array.from("0123456789").map(c => c.charCodeAt())); + // const symbols1 = new Set([":", ";", "<", "=", ">", "?", "@"].map(c => c.charCodeAt())); + // const symbols2 = new Set(["[", "\\", "]", "^", "_", "`"].map(c => c.charCodeAt())); + // const symbols3 = new Set(["{", "|", "}", "~"].map(c => c.charCodeAt())); lines.push(`\t\tstate_changed[i] = MultiOR(${N - 1});`); for (let i = 1; i < N; i++) { const outputs = []; // let is_negates = []; for (let prev_i of Object.keys(rev_graph[i])) { const k = rev_graph[i][prev_i]; + k.sort((a, b) => { + Number(a) - Number(b); + }); const eq_outputs = []; let vals = new Set(k); - let is_negate = false; - if (vals.has(0xff)) { - vals.delete(0xff); - is_negate = true; - } + // let is_negate = false; + // if (vals.has(0xff)) { + // vals.delete(0xff); + // is_negate = true; + // } if (vals.size === 0) { continue; } - if (is_negate === true) { - for (let another_i = 1; another_i < N; another_i++) { - if (i === another_i) { - continue; - } - if (rev_graph[another_i][prev_i] === null) { - continue; - } - const another_vals = new Set(rev_graph[another_i][prev_i]); - if (another_vals.size === 0) { - continue; - } - for (let another_val of another_vals) { - vals.add(another_val); + // if (is_negate === true) { + // for (let another_i = 1; another_i < N; another_i++) { + // if (i === another_i) { + // continue; + // } + // if (rev_graph[another_i][prev_i] === null) { + // continue; + // } + // const another_vals = new Set(rev_graph[another_i][prev_i]); + // if (another_vals.size === 0) { + // continue; + // } + // for (let another_val of another_vals) { + // vals.add(another_val); + // } + // } + // } + const min_maxes = []; + let cur_min = k[0]; + let cur_max = k[0]; + for (let idx = 1; idx < k.length; ++idx) { + if (cur_max + 1 === k[idx]) { + cur_max += 1; + } else { + if (cur_max - cur_min >= 16) { + min_maxes.push([cur_min, cur_max]); } + cur_min = k[idx]; + cur_max = k[idx]; } } - const min_maxs = []; - for (let subsets of [ - [digits, 47, 58], - [symbols1, 57, 65], - [uppercase, 64, 91], - [symbols2, 90, 97], - [lowercase, 96, 123], - [symbols3, 122, 127] - ]) { - const subset = subsets[0]; - const min = subsets[1]; - const max = subsets[2]; - if (vals.isSuperset(subset)) { - vals.difference(subset); - if (min_maxs.length == 0) { - min_maxs.push([min, max]); - } else { - const last = min_maxs[min_maxs.length - 1]; - if (last[1] - 1 == min) { - min_maxs[min_maxs.length - 1][1] = max; - } else { - min_maxs.push([min, max]); - } - } + if (cur_max - cur_min >= 16) { + min_maxes.push([cur_min, cur_max]); + } + for (const min_max of min_maxes) { + for (let code = min_max[0]; code <= min_max[1]; ++code) { + vals.delete(code); } } - for (let min_max of min_maxs) { - lines.push(`\t\tlt[${lt_i}][i] = LessThan(8);`); + // for (let subsets of [ + // [digits, 47, 58], + // [symbols1, 57, 65], + // [uppercase, 64, 91], + // [symbols2, 90, 97], + // [lowercase, 96, 123], + // [symbols3, 122, 127] + // ]) { + // const subset = subsets[0]; + // const min = subsets[1]; + // const max = subsets[2]; + // if (vals.isSuperset(subset)) { + // vals.difference(subset); + // if (min_maxs.length == 0) { + // min_maxs.push([min, max]); + // } else { + // const last = min_maxs[min_maxs.length - 1]; + // if (last[1] - 1 == min) { + // min_maxs[min_maxs.length - 1][1] = max; + // } else { + // min_maxs.push([min, max]); + // } + // } + // } + // } + + for (let min_max of min_maxes) { + lines.push(`\t\tlt[${lt_i}][i] = LessEqThan(8);`); lines.push(`\t\tlt[${lt_i}][i].in[0] <== ${min_max[0]};`); lines.push(`\t\tlt[${lt_i}][i].in[1] <== in[i];`); - lines.push(`\t\tlt[${lt_i + 1}][i] = LessThan(8);`); + lines.push(`\t\tlt[${lt_i + 1}][i] = LessEqThan(8);`); lines.push(`\t\tlt[${lt_i + 1}][i].in[0] <== in[i];`); lines.push(`\t\tlt[${lt_i + 1}][i].in[1] <== ${min_max[1]};`); @@ -154,21 +180,23 @@ function genCircomAllstr(graph_json, template_name) { lines.push(`\t\tand[${and_i}][i] = AND();`); lines.push(`\t\tand[${and_i}][i].a <== states[i][${prev_i}];`); if (eq_outputs.length === 1) { - if (is_negate) { - lines.push(`\t\tand[${and_i}][i].b <== 1 - ${eq_outputs[0][0]}[${eq_outputs[0][1]}][i].out;`); - } else { - lines.push(`\t\tand[${and_i}][i].b <== ${eq_outputs[0][0]}[${eq_outputs[0][1]}][i].out;`); - } + // if (is_negate) { + // lines.push(`\t\tand[${and_i}][i].b <== 1 - ${eq_outputs[0][0]}[${eq_outputs[0][1]}][i].out;`); + // } else { + // lines.push(`\t\tand[${and_i}][i].b <== ${eq_outputs[0][0]}[${eq_outputs[0][1]}][i].out;`); + // } + lines.push(`\t\tand[${and_i}][i].b <== ${eq_outputs[0][0]}[${eq_outputs[0][1]}][i].out;`); } else if (eq_outputs.length > 1) { lines.push(`\t\tmulti_or[${multi_or_i}][i] = MultiOR(${eq_outputs.length});`); for (let output_i = 0; output_i < eq_outputs.length; output_i++) { lines.push(`\t\tmulti_or[${multi_or_i}][i].in[${output_i}] <== ${eq_outputs[output_i][0]}[${eq_outputs[output_i][1]}][i].out;`); } - if (is_negate) { - lines.push(`\t\tand[${and_i}][i].b <== 1 - multi_or[${multi_or_i}][i].out;`); - } else { - lines.push(`\t\tand[${and_i}][i].b <== multi_or[${multi_or_i}][i].out;`); - } + // if (is_negate) { + // lines.push(`\t\tand[${and_i}][i].b <== 1 - multi_or[${multi_or_i}][i].out;`); + // } else { + // lines.push(`\t\tand[${and_i}][i].b <== multi_or[${multi_or_i}][i].out;`); + // } + lines.push(`\t\tand[${and_i}][i].b <== multi_or[${multi_or_i}][i].out;`); multi_or_i += 1 } @@ -201,7 +229,7 @@ function genCircomAllstr(graph_json, template_name) { declarations.push(`\tsignal output out;\n`); declarations.push(`\tvar num_bytes = msg_bytes+1;`); declarations.push(`\tsignal in[num_bytes];`); - declarations.push(`\tin[0]<==128;`); + declarations.push(`\tin[0]<==255;`); declarations.push(`\tfor (var i = 0; i < msg_bytes; i++) {`); declarations.push(`\t\tin[i+1] <== msg[i];`); declarations.push(`\t}\n`); diff --git a/packages/compiler/src/lib.rs b/packages/compiler/src/lib.rs index 24e1b90..9c7f146 100644 --- a/packages/compiler/src/lib.rs +++ b/packages/compiler/src/lib.rs @@ -144,7 +144,43 @@ impl DecomposedRegexConfig { if config.is_public { public_config_indexes.push(idx); } - let this_regex = config.regex_def.replace("^", "\\^").replace("[^", "["); + let mut this_regex = config.regex_def.to_string(); + if let Some(mut idx) = this_regex.find("[^") { + let mut new_regex = this_regex[0..idx].to_string(); + new_regex += "["; + idx += 2; + let end = this_regex.find("]").unwrap(); + let mut chars_in_brancket = vec![]; + while idx < end { + let char = this_regex.chars().nth(idx).unwrap(); + if char == '\\' { + chars_in_brancket + .push(format!("\\{}", this_regex.chars().nth(idx + 1).unwrap())); + idx += 2; + } else { + chars_in_brancket.push(char.to_string()); + idx += 1; + } + } + for code in 0..255 { + let code_char = char::from_u32(code).unwrap(); + let mut code_str = code_char.to_string(); + if [ + '(', ')', '*', '+', '.', '?', '[', '\\', ']', '^', '`', '|', '-', + ] + .contains(&code_char) + { + code_str = format!("\\{}", code_char); + } + if chars_in_brancket.contains(&code_str) { + continue; + } + new_regex += &code_str; + } + new_regex += &this_regex[end..].to_string(); + this_regex = new_regex; + } + this_regex = this_regex.replace("^", "\\^"); if idx == 0 { part_regexes.push(Regex::new(&this_regex)?); } else { @@ -254,7 +290,10 @@ impl DecomposedRegexConfig { let index_ends = part_regexes .iter() .map(|regex| { + // println!("regex {}", regex); + // println!("concat_str {}", concat_str); let found = regex.find(&concat_str).unwrap().unwrap(); + // println!("found {:?}", found); if found.start() == found.end() { found.end() + 1 } else { @@ -458,15 +497,25 @@ pub(crate) fn add_graph_nodes( // assert!(key_char.len() == 1); // // key_str += key_char; // } - // println!("key_list {:?}", key_list); if key_list.len() == 0 { continue; } - assert_eq!(key_list[0].as_bytes().len(), 1); + let mut key = None; + for key_idx in 0..key_list.len() { + let char = key_list[key_idx].chars().nth(0).unwrap(); + if (char as u8) < 10 || (char as u8) > 127 { + continue; + } + if key_list[key_idx].as_bytes().len() == 1 { + key = Some(char); + break; + } + } + // assert_eq!(key_list[key_idx].as_bytes().len(), 1); graph.add_edge( NodeIndex::from(next_node), NodeIndex::from(i), - key_list[0].as_bytes()[0] as char, + key.expect("there is no representative character."), ); } } diff --git a/packages/compiler/src/regex.js b/packages/compiler/src/regex.js index eba66cd..0dae1bf 100644 --- a/packages/compiler/src/regex.js +++ b/packages/compiler/src/regex.js @@ -55,9 +55,9 @@ function parseRegex(text) { } parts.push(sub); last = i + 1; - } else if (text[i] === '(' || text[i] === '[') { + } else if (text[i] === '(') { stack += 1; - } else if (text[i] === ')' || text[i] === ']') { + } else if (text[i] === ')') { stack -= 1; } } @@ -91,30 +91,30 @@ function parseRegex(text) { sub.begin -= 1; sub.end += 1; parts.push(sub); - } else if (text[i] === '[') { - last = i + 1; - i += 1; - if (text[i] === '^') { - text[i] = '\u{ff}'; - } - stack = 1; - while (i < text.length && stack !== 0) { - if (text[i] === ']') { - stack -= 1; - } - i += 1; - } - if (stack !== 0) { - return 'Error: missing right brakets for ' + (begin + last) + '.'; - } - i -= 1; - sub = parseSub(text.slice(last, i), begin + last, begin + i, true); - if (typeof sub === 'string') { - return sub; - } - sub.begin -= 1; - sub.end += 1; - parts.push(sub); + // } else if (text[i] === '[') { + // last = i + 1; + // i += 1; + // if (text[i] === '^') { + // text[i] = '\u{ff}'; + // } + // stack = 1; + // while (i < text.length && stack !== 0) { + // if (text[i] === ']') { + // stack -= 1; + // } + // i += 1; + // } + // if (stack !== 0) { + // return 'Error: missing right brakets for ' + (begin + last) + '.'; + // } + // i -= 1; + // sub = parseSub(text.slice(last, i), begin + last, begin + i, true); + // if (typeof sub === 'string') { + // return sub; + // } + // sub.begin -= 1; + // sub.end += 1; + // parts.push(sub); } else if (text[i] === '*') { if (parts.length === 0) { return 'Error: unexpected * at ' + (begin + i) + '.'; @@ -175,6 +175,7 @@ function parseRegex(text) { let new_text = []; let i = 0; let is_in_brancket = false; + let brancket_text = []; while (i < text.length) { char = text[i]; if (text[i] == '\\') { @@ -188,15 +189,51 @@ function parseRegex(text) { return `Error: unexpected [ at ${i}.`; } is_in_brancket = true; - new_text.push(char); + brancket_text = []; + // new_text.push(char); i += 1; } else if (char === ']') { if (!is_in_brancket) { return `Error: unexpected ] at ${i}.`; } is_in_brancket = false; + if (brancket_text[0] === '^') { + brancket_text.shift(); + let rev_text = []; + let code_char = ''; + const brancket_text_jsons = brancket_text.map(val => JSON.stringify(val)); + for (let idx = 0; idx < 255; idx++) { + code_char = String.fromCodePoint(idx); + if ([ + '(', + ')', + '*', + '+', + '.', + '?', + '[', + '\\', + ']', + '^', + '`', + '|', + '-' + ].indexOf(code_char) != -1) { + code_char = [code_char]; + } + if (brancket_text_jsons.indexOf(JSON.stringify(code_char)) === -1) { + rev_text.push(code_char); + } + } + brancket_text = rev_text; + } + new_text.push('('); + for (const c of brancket_text) { + new_text.push(c); + new_text.push('|'); + } new_text.pop(); - new_text.push(char); + new_text.push(')'); i += 1; } else if (is_in_brancket) { if (!Array.isArray(char) && ['(', ')', '[', '*', '+', '?', 'ϵ'].includes(char)) { @@ -205,8 +242,9 @@ function parseRegex(text) { if (char === '^' && text[i - 1] !== '[') { return 'Error: unexpected ^ at ' + i + '.'; } - new_text.push(char); - new_text.push('|'); + // new_text.push(char); + // new_text.push('|'); + brancket_text.push(char); i += 1; } else { new_text.push(char); @@ -307,7 +345,6 @@ function nfaToDfa(nfa) { top = stack.pop(); // If top is of type string and starts with "Error" then return error if (typeof top === 'string' && top[0] === 'E') { - console.log(top); continue; } for (i = 0; i < top.edges.length; i += 1) {