Skip to content

Commit 2860950

Browse files
committed
Add tests for the cmov implementations
1 parent 73596a8 commit 2860950

File tree

1 file changed

+158
-1
lines changed

1 file changed

+158
-1
lines changed

src/tests.c

Lines changed: 158 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3118,7 +3118,7 @@ void test_ecmult_multi_batching(void) {
31183118
data.pt = pt;
31193119
secp256k1_gej_neg(&r2, &r2);
31203120

3121-
/* Test with empty scratch space. It should compute the correct result using
3121+
/* Test with empty scratch space. It should compute the correct result using
31223122
* ecmult_mult_simple algorithm which doesn't require a scratch space. */
31233123
scratch = secp256k1_scratch_create(&ctx->error_callback, 0);
31243124
CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, &ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
@@ -5292,6 +5292,161 @@ void run_memczero_test(void) {
52925292
CHECK(memcmp(buf1, buf2, sizeof(buf1)) == 0);
52935293
}
52945294

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

5589+
run_cmov_tests();
5590+
54345591
secp256k1_rand256(run32);
54355592
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]);
54365593

0 commit comments

Comments
 (0)