Skip to content

Commit 009a515

Browse files
committed
Add tests for the cmov implementations
1 parent 30b40d7 commit 009a515

File tree

1 file changed

+165
-1
lines changed

1 file changed

+165
-1
lines changed

src/tests.c

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3129,7 +3129,7 @@ void test_ecmult_multi_batching(void) {
31293129
data.pt = pt;
31303130
secp256k1_gej_neg(&r2, &r2);
31313131

3132-
/* Test with empty scratch space. It should compute the correct result using
3132+
/* Test with empty scratch space. It should compute the correct result using
31333133
* ecmult_mult_simple algorithm which doesn't require a scratch space. */
31343134
scratch = secp256k1_scratch_create(&ctx->error_callback, 0);
31353135
CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, &ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
@@ -5303,6 +5303,168 @@ void run_memczero_test(void) {
53035303
CHECK(memcmp(buf1, buf2, sizeof(buf1)) == 0);
53045304
}
53055305

5306+
void int_cmov_test(void) {
5307+
int r = INT_MIN;
5308+
int a = 0;
5309+
5310+
secp256k1_int_cmov(&r, &a, 0);
5311+
CHECK(r == INT_MIN);
5312+
5313+
r = 0; a = INT_MIN;
5314+
secp256k1_int_cmov(&r, &a, 1);
5315+
CHECK(r == INT_MIN);
5316+
5317+
a = INT_MAX;
5318+
secp256k1_int_cmov(&r, &a, 1);
5319+
CHECK(r == INT_MAX);
5320+
5321+
a = 0;
5322+
secp256k1_int_cmov(&r, &a, 0);
5323+
CHECK(r == INT_MAX);
5324+
5325+
secp256k1_int_cmov(&r, &a, 1);
5326+
CHECK(r == 0);
5327+
5328+
a = 1;
5329+
secp256k1_int_cmov(&r, &a, 1);
5330+
CHECK(r == 1);
5331+
5332+
r = 1; a = 0;
5333+
secp256k1_int_cmov(&r, &a, 0);
5334+
CHECK(r == 1);
5335+
5336+
}
5337+
5338+
void fe_cmov_test(void) {
5339+
static const secp256k1_fe zero = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
5340+
static const secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
5341+
static const secp256k1_fe max = SECP256K1_FE_CONST(
5342+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5343+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
5344+
);
5345+
secp256k1_fe r = max;
5346+
secp256k1_fe a = zero;
5347+
5348+
secp256k1_fe_cmov(&r, &a, 0);
5349+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5350+
5351+
r = zero; a = max;
5352+
secp256k1_fe_cmov(&r, &a, 1);
5353+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5354+
5355+
a = zero;
5356+
secp256k1_fe_cmov(&r, &a, 1);
5357+
CHECK(memcmp(&r, &zero, sizeof(r)) == 0);
5358+
5359+
a = one;
5360+
secp256k1_fe_cmov(&r, &a, 1);
5361+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5362+
5363+
r = one; a = zero;
5364+
secp256k1_fe_cmov(&r, &a, 0);
5365+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5366+
}
5367+
5368+
void fe_storage_cmov_test(void) {
5369+
static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
5370+
static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
5371+
static const secp256k1_fe_storage max = SECP256K1_FE_STORAGE_CONST(
5372+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5373+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
5374+
);
5375+
secp256k1_fe_storage r = max;
5376+
secp256k1_fe_storage a = zero;
5377+
5378+
secp256k1_fe_storage_cmov(&r, &a, 0);
5379+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5380+
5381+
r = zero; a = max;
5382+
secp256k1_fe_storage_cmov(&r, &a, 1);
5383+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5384+
5385+
a = zero;
5386+
secp256k1_fe_storage_cmov(&r, &a, 1);
5387+
CHECK(memcmp(&r, &zero, sizeof(r)) == 0);
5388+
5389+
a = one;
5390+
secp256k1_fe_storage_cmov(&r, &a, 1);
5391+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5392+
5393+
r = one; a = zero;
5394+
secp256k1_fe_storage_cmov(&r, &a, 0);
5395+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5396+
}
5397+
5398+
void scalar_cmov_test(void) {
5399+
static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
5400+
static const secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
5401+
static const secp256k1_scalar max = SECP256K1_SCALAR_CONST(
5402+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5403+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
5404+
);
5405+
secp256k1_scalar r = max;
5406+
secp256k1_scalar a = zero;
5407+
5408+
secp256k1_scalar_cmov(&r, &a, 0);
5409+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5410+
5411+
r = zero; a = max;
5412+
secp256k1_scalar_cmov(&r, &a, 1);
5413+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5414+
5415+
a = zero;
5416+
secp256k1_scalar_cmov(&r, &a, 1);
5417+
CHECK(memcmp(&r, &zero, sizeof(r)) == 0);
5418+
5419+
a = one;
5420+
secp256k1_scalar_cmov(&r, &a, 1);
5421+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5422+
5423+
r = one; a = zero;
5424+
secp256k1_scalar_cmov(&r, &a, 0);
5425+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5426+
}
5427+
5428+
void ge_storage_cmov_test(void) {
5429+
static const secp256k1_ge_storage zero = SECP256K1_GE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
5430+
static const secp256k1_ge_storage one = SECP256K1_GE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1);
5431+
static const secp256k1_ge_storage max = SECP256K1_GE_STORAGE_CONST(
5432+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5433+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5434+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
5435+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
5436+
);
5437+
secp256k1_ge_storage r = max;
5438+
secp256k1_ge_storage a = zero;
5439+
5440+
secp256k1_ge_storage_cmov(&r, &a, 0);
5441+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5442+
5443+
r = zero; a = max;
5444+
secp256k1_ge_storage_cmov(&r, &a, 1);
5445+
CHECK(memcmp(&r, &max, sizeof(r)) == 0);
5446+
5447+
a = zero;
5448+
secp256k1_ge_storage_cmov(&r, &a, 1);
5449+
CHECK(memcmp(&r, &zero, sizeof(r)) == 0);
5450+
5451+
a = one;
5452+
secp256k1_ge_storage_cmov(&r, &a, 1);
5453+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5454+
5455+
r = one; a = zero;
5456+
secp256k1_ge_storage_cmov(&r, &a, 0);
5457+
CHECK(memcmp(&r, &one, sizeof(r)) == 0);
5458+
}
5459+
5460+
void run_cmov_tests(void) {
5461+
int_cmov_test();
5462+
fe_cmov_test();
5463+
fe_storage_cmov_test();
5464+
scalar_cmov_test();
5465+
ge_storage_cmov_test();
5466+
}
5467+
53065468
int main(int argc, char **argv) {
53075469
unsigned char seed16[16] = {0};
53085470
unsigned char run32[32] = {0};
@@ -5442,6 +5604,8 @@ int main(int argc, char **argv) {
54425604
/* util tests */
54435605
run_memczero_test();
54445606

5607+
run_cmov_tests();
5608+
54455609
secp256k1_rand256(run32);
54465610
printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]);
54475611

0 commit comments

Comments
 (0)