| 3784 | } |
| 3785 | |
| 3786 | static void test_ge(void) { |
| 3787 | int i, i1; |
| 3788 | int runs = 6; |
| 3789 | /* 25 points are used: |
| 3790 | * - infinity |
| 3791 | * - for each of four random points p1 p2 p3 p4, we add the point, its |
| 3792 | * negation, and then those two again but with randomized Z coordinate. |
| 3793 | * - The same is then done for lambda*p1 and lambda^2*p1. |
| 3794 | */ |
| 3795 | secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&CTX->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs)); |
| 3796 | secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&CTX->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs)); |
| 3797 | secp256k1_fe zf, r; |
| 3798 | secp256k1_fe zfi2, zfi3; |
| 3799 | |
| 3800 | secp256k1_gej_set_infinity(&gej[0]); |
| 3801 | secp256k1_ge_clear(&ge[0]); |
| 3802 | secp256k1_ge_set_gej_var(&ge[0], &gej[0]); |
| 3803 | for (i = 0; i < runs; i++) { |
| 3804 | int j; |
| 3805 | secp256k1_ge g; |
| 3806 | random_group_element_test(&g); |
| 3807 | if (i >= runs - 2) { |
| 3808 | secp256k1_ge_mul_lambda(&g, &ge[1]); |
| 3809 | } |
| 3810 | if (i >= runs - 1) { |
| 3811 | secp256k1_ge_mul_lambda(&g, &g); |
| 3812 | } |
| 3813 | ge[1 + 4 * i] = g; |
| 3814 | ge[2 + 4 * i] = g; |
| 3815 | secp256k1_ge_neg(&ge[3 + 4 * i], &g); |
| 3816 | secp256k1_ge_neg(&ge[4 + 4 * i], &g); |
| 3817 | secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); |
| 3818 | random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); |
| 3819 | secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); |
| 3820 | random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); |
| 3821 | for (j = 0; j < 4; j++) { |
| 3822 | random_field_element_magnitude(&ge[1 + j + 4 * i].x); |
| 3823 | random_field_element_magnitude(&ge[1 + j + 4 * i].y); |
| 3824 | random_field_element_magnitude(&gej[1 + j + 4 * i].x); |
| 3825 | random_field_element_magnitude(&gej[1 + j + 4 * i].y); |
| 3826 | random_field_element_magnitude(&gej[1 + j + 4 * i].z); |
| 3827 | } |
| 3828 | } |
| 3829 | |
| 3830 | /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ |
| 3831 | random_fe_non_zero_test(&zf); |
| 3832 | random_field_element_magnitude(&zf); |
| 3833 | secp256k1_fe_inv_var(&zfi3, &zf); |
| 3834 | secp256k1_fe_sqr(&zfi2, &zfi3); |
| 3835 | secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); |
| 3836 | |
| 3837 | /* Generate random r */ |
| 3838 | random_fe_non_zero_test(&r); |
| 3839 | |
| 3840 | for (i1 = 0; i1 < 1 + 4 * runs; i1++) { |
| 3841 | int i2; |
| 3842 | for (i2 = 0; i2 < 1 + 4 * runs; i2++) { |
| 3843 | /* Compute reference result using gej + gej (var). */ |
no test coverage detected