Skip to content

Instantly share code, notes, and snippets.

@Green-Sky
Last active September 22, 2025 12:12
Show Gist options
  • Select an option

  • Save Green-Sky/6986a615300547f332d28cd5415958da to your computer and use it in GitHub Desktop.

Select an option

Save Green-Sky/6986a615300547f332d28cd5415958da to your computer and use it in GitHub Desktop.
secure comparator test vectors, without extra verifications (unsafe)
diff --git a/src/themis/secure_comparator.c b/src/themis/secure_comparator.c
index 3a8906fd..09d3c2a3 100644
--- a/src/themis/secure_comparator.c
+++ b/src/themis/secure_comparator.c
@@ -86,6 +86,20 @@ static themis_status_t secure_comparator_alice_step5(secure_comparator_t* comp_c
#define HASH_LENGTH 64 // for sha512
#define TEMP_BUFFER_LENGTH ((ED25519_GE_LENGTH > HASH_LENGTH) ? ED25519_GE_LENGTH : HASH_LENGTH)
+static void dump_var32(const char* str, uint8_t* var) {
+ printf("%s", str);
+ for (size_t i = 0; i < 32; i++) {
+ printf("%02X", var[i]);
+ }
+ printf("\n");
+}
+
+static void dump_p3(const char* str, const ge_p3* p3) {
+ uint8_t output[32];
+ ge_p3_tobytes(output, p3);
+ dump_var32(str, output);
+}
+
static bool ge_is_zero(const ge_p3* ge)
{
uint8_t y[ED25519_GE_LENGTH];
@@ -557,13 +571,19 @@ static themis_status_t secure_comparator_alice_step1(secure_comparator_t* comp_c
return THEMIS_FAIL;
}
+ dump_var32("as1:secret:", comp_ctx->secret);
clip_random_32(comp_ctx->secret);
+ dump_var32("as1:secret_clipped:", comp_ctx->secret);
generate_random_32(comp_ctx->rand2);
+ dump_var32("as1:rand2:", comp_ctx->rand2);
generate_random_32(comp_ctx->rand3);
+ dump_var32("as1:rand3:", comp_ctx->rand3);
ge_scalarmult_base(&g2a, comp_ctx->rand2);
+ dump_p3("as1:g2a:", &g2a);
ge_scalarmult_base(&g3a, comp_ctx->rand3);
+ dump_p3("as1:g3a:", &g3a);
/* Copy G2a (1 group element) as byte array to output */
ge_p3_tobytes((unsigned char*)output, &g2a);
@@ -656,26 +676,37 @@ static themis_status_t secure_comparator_bob_step2(secure_comparator_t* comp_ctx
return THEMIS_FAIL;
}
+ dump_var32("bs2:secret:", comp_ctx->secret);
clip_random_32(comp_ctx->secret);
+ dump_var32("bs2:secret_clipped:", comp_ctx->secret);
generate_random_32(comp_ctx->rand2);
+ dump_var32("bs2:rand2:", comp_ctx->rand2);
generate_random_32(comp_ctx->rand3);
+ dump_var32("bs2:rand3:", comp_ctx->rand3);
ge_scalarmult_base(&g2b, comp_ctx->rand2);
+ dump_p3("bs2:g2b:", &g2b);
ge_scalarmult_base(&g3b, comp_ctx->rand3);
+ dump_p3("bs2:g3b:", &g3b);
ge_scalarmult_blinded(&(comp_ctx->g2), comp_ctx->rand2, &g2a);
+ dump_p3("bs2:g2:", &(comp_ctx->g2));
ge_scalarmult_blinded(&(comp_ctx->g3), comp_ctx->rand3, &(comp_ctx->g3p));
+ dump_p3("bs2:g3:", &(comp_ctx->g3));
if (ge_is_zero(&(comp_ctx->g2)) || ge_is_zero(&(comp_ctx->g3))) {
comp_ctx->result = THEMIS_SCOMPARE_NO_MATCH;
}
generate_random_32(comp_ctx->rand);
+ dump_var32("bs2:rand:", comp_ctx->rand);
ge_scalarmult_blinded(&(comp_ctx->P), comp_ctx->rand, &(comp_ctx->g3));
+ dump_p3("bs2:Pb:", &(comp_ctx->P));
ge_double_scalarmult_vartime((ge_p2*)&(comp_ctx->Q), comp_ctx->secret, &(comp_ctx->g2), comp_ctx->rand);
ge_p2_to_p3(&(comp_ctx->Q), (const ge_p2*)&(comp_ctx->Q));
+ dump_p3("bs2:Qb:", &(comp_ctx->Q));
/* Copy G2b (1 group element) as byte array to output */
ge_p3_tobytes((unsigned char*)output, &g2b);
@@ -782,7 +813,9 @@ static themis_status_t secure_comparator_alice_step3(secure_comparator_t* comp_c
*output_length = 8 * ED25519_GE_LENGTH;
ge_scalarmult_blinded(&(comp_ctx->g2), comp_ctx->rand2, &g2b);
+ dump_p3("as3:g2:", &(comp_ctx->g2));
ge_scalarmult_blinded(&(comp_ctx->g3), comp_ctx->rand3, &(comp_ctx->g3p));
+ dump_p3("as3:g3:", &(comp_ctx->g3));
if (ge_is_zero(&(comp_ctx->g2)) || ge_is_zero(&(comp_ctx->g3))) {
comp_ctx->result = THEMIS_SCOMPARE_NO_MATCH;
@@ -802,13 +835,18 @@ static themis_status_t secure_comparator_alice_step3(secure_comparator_t* comp_c
}
generate_random_32(comp_ctx->rand);
+ dump_var32("as3:rand:", comp_ctx->rand);
ge_scalarmult_blinded(&(comp_ctx->P), comp_ctx->rand, &(comp_ctx->g3));
+ dump_p3("as3:Pa:", &(comp_ctx->P));
ge_double_scalarmult_vartime((ge_p2*)&(comp_ctx->Q), comp_ctx->secret, &(comp_ctx->g2), comp_ctx->rand);
ge_p2_to_p3(&(comp_ctx->Q), (const ge_p2*)&(comp_ctx->Q));
+ dump_p3("as3:Qa:", &(comp_ctx->Q));
ge_p3_sub(&(comp_ctx->Qa_Qb), &(comp_ctx->Q), &Qb);
+ dump_p3("as3:Qa-Qb:", &(comp_ctx->Qa_Qb));
ge_scalarmult_blinded(&R, comp_ctx->rand3, &(comp_ctx->Qa_Qb));
+ dump_p3("as3:Ra:", &R);
/* Copy Pa (1 group element) to output */
ge_p3_tobytes((unsigned char*)output, &(comp_ctx->P));
@@ -905,6 +943,9 @@ static themis_status_t secure_comparator_bob_step4(secure_comparator_t* comp_ctx
}
ge_p3_sub(&Qa, &Qa, &(comp_ctx->Q));
+ // HUH?
+ //dump_p3("bs4:Qa-Qb:", &(comp_ctx->Qa_Qb));
+ dump_p3("bs4:Qa-Qb:", &Qa);
/* Verification of Ra signature */
themis_status = ed_point_verify(7,
@@ -919,13 +960,16 @@ static themis_status_t secure_comparator_bob_step4(secure_comparator_t* comp_ctx
}
ge_scalarmult_blinded(&R, comp_ctx->rand3, &Qa);
+ dump_p3("bs4:Rb:", &R);
ge_scalarmult_blinded(&Rab, comp_ctx->rand3, &Ra);
+ dump_p3("bs4:Rab:", &Rab);
if (ge_is_zero(&Rab)) {
comp_ctx->result = THEMIS_SCOMPARE_NO_MATCH;
}
ge_p3_sub(&Pa_Pb, &Pa, &(comp_ctx->P));
+ dump_p3("bs4:Pa-Pb:", &Pa_Pb);
/* Bob finishes */
if (THEMIS_SCOMPARE_NOT_READY == comp_ctx->result) {
@@ -997,12 +1041,14 @@ static themis_status_t secure_comparator_alice_step5(secure_comparator_t* comp_c
}
ge_scalarmult_blinded(&Rab, comp_ctx->rand3, &Rb);
+ dump_p3("as5:Rab:", &Rab);
if (ge_is_zero(&Rab)) {
comp_ctx->result = THEMIS_SCOMPARE_NO_MATCH;
}
/* Alice finishes */
ge_p3_sub(&Pa_Pb, &(comp_ctx->P), &(comp_ctx->Pp));
+ dump_p3("as5:Pa-Pb:", &Pa_Pb);
if (THEMIS_SCOMPARE_NOT_READY == comp_ctx->result) {
comp_ctx->result = ge_cmp(&Rab, &Pa_Pb) ? THEMIS_SCOMPARE_NO_MATCH : THEMIS_SCOMPARE_MATCH;

This is the instrumented test log. There are 2 tests run, so it is 2 sets of test vectors.

== Entering suite #8, "ThemisPP secure comparator test" ==

as1:secret:EF4B06A3E0EA70E6E7895A53E2D9BDD190852D7836821CD5A23545DFD3534212
as1:secret_clipped:E84B06A3E0EA70E6E7895A53E2D9BDD190852D7836821CD5A23545DFD3534252
as1:rand2:005975F2960C0E88B5F336D61310B5E4695068C7391B9ECFB242E16DAF35396D
as1:rand3:38C7C40DFBF12D4DE7A09ACA42ED99B16151969829A9AB2C9E068ABE0F271E48
as1:g2a:991F89A0E0D026BC2620D4EEE825DA81212AC1B231EB93B56038F1F6281B8FA0
as1:g3a:F81C74AA74A1CA7580699A51F428C47714A443EA0D51926633129A61F6606AC4
bs2:secret:EF4B06A3E0EA70E6E7895A53E2D9BDD190852D7836821CD5A23545DFD3534212
bs2:secret_clipped:E84B06A3E0EA70E6E7895A53E2D9BDD190852D7836821CD5A23545DFD3534252
bs2:rand2:48340BFE5A692732183FC1F59BCC60827288678AFFAFEC23C56225320B134F6B
bs2:rand3:8044FBCDBB2798EFE9AE3C78993F993B0B911BD405285887014630AF7EAE1048
bs2:g2b:4F1A4797287123A7FC950CF8A23687E8F7337385EB08D61476336618358934AF
bs2:g3b:FA8397CECD0930F4D2A3C945DD5AF3996E31C2730C53EA91FADAE6393C8A0B5A
bs2:g2:6CFA640E272BCD38B266EF9ED997147672A923EC01032474FEDDB71F989FC18B
bs2:g3:347A493A3338478AC6479E08585EDD830FA9BB7B4315EEFEEB20AF325B3AB496
bs2:rand:E8F7A373ABD4F807D6A92555F55210B82AC01A2B596DA2253DD3B6DAFCA0FE53
bs2:Pb:A0F2E127722E5B05C8C88A9D013637835EF831EB343FA9E11A4ECF41C4B3CC41
bs2:Qb:F0DB1441452F8ED374BF95B88DD6DDE1CA79B81E6307672B4054A28B7BFB9E9E
as3:g2:6CFA640E272BCD38B266EF9ED997147672A923EC01032474FEDDB71F989FC18B
as3:g3:347A493A3338478AC6479E08585EDD830FA9BB7B4315EEFEEB20AF325B3AB496
as3:rand:E0E3942D88D12E2AFAA4554118DE9FCCBB7AB84E3275956FBA6317D684C9AB65
as3:Pa:FB532A80FB858E7D0D0DAD46EE4A6A353957F046727541D7151747992BA4A3DE
as3:Qa:530D0E21037BC871A05BF81356B4C80836F41B00D325497A0BE4F29054A2C95B
as3:Qa-Qb:345884CA9F1051358A1DD27BB91CFDA643B25E88E4C93AF641FB695C69EE26F3
as3:Ra:D18A8736AAA67951CB72D520659AC86075BBF7C9C564F5C2F845B54413C7A7D5
bs4:Qa-Qb:345884CA9F1051358A1DD27BB91CFDA643B25E88E4C93AF641FB695C69EE26F3
bs4:Rb:010BADC999911297EBFBBED5261EC48C0325AE13CD992C0209FAD0C734DDA9AC
bs4:Rab:A812CB11B83407411F46DD7A66B5A2526E584A844F0A0F9FD3FB528357F35E59
bs4:Pa-Pb:A812CB11B83407411F46DD7A66B5A2526E584A844F0A0F9FD3FB528357F35E59
as5:Rab:A812CB11B83407411F46DD7A66B5A2526E584A844F0A0F9FD3FB528357F35E59
as5:Pa-Pb:A812CB11B83407411F46DD7A66B5A2526E584A844F0A0F9FD3FB528357F35E59
[8:1]  secure_comparator_test:#1  "a ready"  pass
[8:2]  secure_comparator_test:#2  "b ready"  pass
as1:secret:4FD420CC54DE1AE991B42725486CFAECF24D5ABADDEA0F55D64A43736C14591E
as1:secret_clipped:48D420CC54DE1AE991B42725486CFAECF24D5ABADDEA0F55D64A43736C14595E
as1:rand2:A84351C6D79EAB5133EE8B9D8C261707B33C53B272944D1D92A4C948A21C1D7E
as1:rand3:60D3867BE36D3D9087380F6C531FDB9E2C2CCDD432D6B21160E5377998B15875
as1:g2a:60221457BF69AA28539F4974F58E5C2392F9C788E8D051CFBD5FB109450287CA
as1:g3a:850F5C45D9EDA4960E798A5C7284E377D840668884F1ED9B8165FE5E2F9B9B7C
bs2:secret:8907E334A1C7FA1F4269E0F18A3C2E6464476887DC9A26691E5C521C96907121
bs2:secret_clipped:8807E334A1C7FA1F4269E0F18A3C2E6464476887DC9A26691E5C521C96907161
bs2:rand2:186BF814377F02C03DA583BC9727844A91592F707F49DC1BF0258407A593F967
bs2:rand3:10B5EC4EFE7E430EB41D885E335A21879741C441B5FFD014164D9B1A0A714155
bs2:g2b:C3BA8B64DC4BD16B68B1212F9B1B094ABD057FE2D27244F94CCCF1018D2389F8
bs2:g3b:F3EC190D7975F8BD202C4F0DF8F108884AC593F88D9B118D52C2E166D1CAA957
bs2:g2:8450FE2D9F6298DDACD420AE833FD5C9F380B17AAD46E10B55B5B77C3A969894
bs2:g3:B42230D03C092DFB2193212CAC402FB99F912B06D9DA0F7B784EEC17940974C3
bs2:rand:20E3DF06D42161136C4B07AAFB07A5644935933F8A743761C54DD13781BD0567
bs2:Pb:0E638711DC30D1A5A4631BE5D7A68C19AE6B4DA2A904D23CE85ACB64DE3EF685
bs2:Qb:2EE39B8086BE3C2C8624171D6DE1352BFE7ED8724E522AC1043E22796134E6F7
as3:g2:8450FE2D9F6298DDACD420AE833FD5C9F380B17AAD46E10B55B5B77C3A969894
as3:g3:B42230D03C092DFB2193212CAC402FB99F912B06D9DA0F7B784EEC17940974C3
as3:rand:C014BC2DC8FC33CC7D196D3C9171F2570E427632475FB57280878D7F5FDEB476
as3:Pa:4B28497F8C9E8E993F93FAF71A01418D45F80719E510FE5DF16AA7CFAF859493
as3:Qa:7C6A5683A0944250A18218CC70E1BF4AFB89CF55529760DD1E27BA884C795FEF
as3:Qa-Qb:9FC6E969FAADC382E744BB8A371982E7E8882087702477D98FC624B42B66E651
as3:Ra:4D542F76C94CDD6C8D626AEAB3EDC2EFF842010F860A88D66792121501935681
bs4:Qa-Qb:9FC6E969FAADC382E744BB8A371982E7E8882087702477D98FC624B42B66E651
bs4:Rb:CEA42A60D20C980454CAFCD60A214D1C3E78B67F913AC0AFCE96600342619820
bs4:Rab:65B98DC1EAF1D81079377413A53DDD634A9795C04CDA0D9B28AE88870D4FC604
bs4:Pa-Pb:73C87FDEC20F0DEC2AABF1FB75E0C9D9B8EA3424F5014BB1A0B070DDAE284BDA
as5:Rab:65B98DC1EAF1D81079377413A53DDD634A9795C04CDA0D9B28AE88870D4FC604
as5:Pa-Pb:73C87FDEC20F0DEC2AABF1FB75E0C9D9B8EA3424F5014BB1A0B070DDAE284BDA
[8:3]  secure_comparator_test:#3  "c ready"  pass
[8:4]  secure_comparator_test:#4  "d ready"  pass

--> 4 check(s), 4 ok, 0 failed (0.00%)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment