1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include <stdlib.h> 12e1051a39Sopenharmony_ci#include <string.h> 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ci#include "internal/nelem.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include <openssl/bio.h> 17e1051a39Sopenharmony_ci#include <openssl/bn.h> 18e1051a39Sopenharmony_ci#include <openssl/rand.h> 19e1051a39Sopenharmony_ci#include <openssl/err.h> 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_ci#include "testutil.h" 22e1051a39Sopenharmony_ci 23e1051a39Sopenharmony_ci#define NUM_BITS (BN_BITS2 * 4) 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_ci#define BN_print_var(v) test_output_bignum(#v, v) 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci/* 28e1051a39Sopenharmony_ci * Test that r == 0 in test_exp_mod_zero(). Returns one on success, 29e1051a39Sopenharmony_ci * returns zero and prints debug output otherwise. 30e1051a39Sopenharmony_ci */ 31e1051a39Sopenharmony_cistatic int a_is_zero_mod_one(const char *method, const BIGNUM *r, 32e1051a39Sopenharmony_ci const BIGNUM *a) 33e1051a39Sopenharmony_ci{ 34e1051a39Sopenharmony_ci if (!BN_is_zero(r)) { 35e1051a39Sopenharmony_ci TEST_error("%s failed: a ** 0 mod 1 = r (should be 0)", method); 36e1051a39Sopenharmony_ci BN_print_var(a); 37e1051a39Sopenharmony_ci BN_print_var(r); 38e1051a39Sopenharmony_ci return 0; 39e1051a39Sopenharmony_ci } 40e1051a39Sopenharmony_ci return 1; 41e1051a39Sopenharmony_ci} 42e1051a39Sopenharmony_ci 43e1051a39Sopenharmony_ci/* 44e1051a39Sopenharmony_ci * test_mod_exp_zero tests that x**0 mod 1 == 0. It returns zero on success. 45e1051a39Sopenharmony_ci */ 46e1051a39Sopenharmony_cistatic int test_mod_exp_zero(void) 47e1051a39Sopenharmony_ci{ 48e1051a39Sopenharmony_ci BIGNUM *a = NULL, *p = NULL, *m = NULL; 49e1051a39Sopenharmony_ci BIGNUM *r = NULL; 50e1051a39Sopenharmony_ci BN_ULONG one_word = 1; 51e1051a39Sopenharmony_ci BN_CTX *ctx = BN_CTX_new(); 52e1051a39Sopenharmony_ci int ret = 0, failed = 0; 53e1051a39Sopenharmony_ci BN_MONT_CTX *mont = NULL; 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci if (!TEST_ptr(m = BN_new()) 56e1051a39Sopenharmony_ci || !TEST_ptr(a = BN_new()) 57e1051a39Sopenharmony_ci || !TEST_ptr(p = BN_new()) 58e1051a39Sopenharmony_ci || !TEST_ptr(r = BN_new())) 59e1051a39Sopenharmony_ci goto err; 60e1051a39Sopenharmony_ci 61e1051a39Sopenharmony_ci BN_one(m); 62e1051a39Sopenharmony_ci BN_one(a); 63e1051a39Sopenharmony_ci BN_zero(p); 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ci if (!TEST_true(BN_rand(a, 1024, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))) 66e1051a39Sopenharmony_ci goto err; 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp(r, a, p, m, ctx))) 69e1051a39Sopenharmony_ci goto err; 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp", r, a))) 72e1051a39Sopenharmony_ci failed = 1; 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_recp(r, a, p, m, ctx))) 75e1051a39Sopenharmony_ci goto err; 76e1051a39Sopenharmony_ci 77e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_recp", r, a))) 78e1051a39Sopenharmony_ci failed = 1; 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_simple(r, a, p, m, ctx))) 81e1051a39Sopenharmony_ci goto err; 82e1051a39Sopenharmony_ci 83e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_simple", r, a))) 84e1051a39Sopenharmony_ci failed = 1; 85e1051a39Sopenharmony_ci 86e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_mont(r, a, p, m, ctx, NULL))) 87e1051a39Sopenharmony_ci goto err; 88e1051a39Sopenharmony_ci 89e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont", r, a))) 90e1051a39Sopenharmony_ci failed = 1; 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_mont_consttime(r, a, p, m, ctx, NULL))) 93e1051a39Sopenharmony_ci goto err; 94e1051a39Sopenharmony_ci 95e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont_consttime", r, a))) 96e1051a39Sopenharmony_ci failed = 1; 97e1051a39Sopenharmony_ci 98e1051a39Sopenharmony_ci if (!TEST_ptr(mont = BN_MONT_CTX_new())) 99e1051a39Sopenharmony_ci goto err; 100e1051a39Sopenharmony_ci 101e1051a39Sopenharmony_ci ERR_set_mark(); 102e1051a39Sopenharmony_ci /* mont is not set but passed in */ 103e1051a39Sopenharmony_ci if (!TEST_false(BN_mod_exp_mont_consttime(r, p, a, m, ctx, mont))) 104e1051a39Sopenharmony_ci goto err; 105e1051a39Sopenharmony_ci if (!TEST_false(BN_mod_exp_mont(r, p, a, m, ctx, mont))) 106e1051a39Sopenharmony_ci goto err; 107e1051a39Sopenharmony_ci ERR_pop_to_mark(); 108e1051a39Sopenharmony_ci 109e1051a39Sopenharmony_ci if (!TEST_true(BN_MONT_CTX_set(mont, m, ctx))) 110e1051a39Sopenharmony_ci goto err; 111e1051a39Sopenharmony_ci 112e1051a39Sopenharmony_ci /* we compute 0 ** a mod 1 here, to execute code that uses mont */ 113e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_mont_consttime(r, p, a, m, ctx, mont))) 114e1051a39Sopenharmony_ci goto err; 115e1051a39Sopenharmony_ci 116e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont_consttime", r, a))) 117e1051a39Sopenharmony_ci failed = 1; 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_mont(r, p, a, m, ctx, mont))) 120e1051a39Sopenharmony_ci goto err; 121e1051a39Sopenharmony_ci 122e1051a39Sopenharmony_ci if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont", r, a))) 123e1051a39Sopenharmony_ci failed = 1; 124e1051a39Sopenharmony_ci 125e1051a39Sopenharmony_ci /* 126e1051a39Sopenharmony_ci * A different codepath exists for single word multiplication 127e1051a39Sopenharmony_ci * in non-constant-time only. 128e1051a39Sopenharmony_ci */ 129e1051a39Sopenharmony_ci if (!TEST_true(BN_mod_exp_mont_word(r, one_word, p, m, ctx, NULL))) 130e1051a39Sopenharmony_ci goto err; 131e1051a39Sopenharmony_ci 132e1051a39Sopenharmony_ci if (!TEST_BN_eq_zero(r)) { 133e1051a39Sopenharmony_ci TEST_error("BN_mod_exp_mont_word failed: " 134e1051a39Sopenharmony_ci "1 ** 0 mod 1 = r (should be 0)"); 135e1051a39Sopenharmony_ci BN_print_var(r); 136e1051a39Sopenharmony_ci goto err; 137e1051a39Sopenharmony_ci } 138e1051a39Sopenharmony_ci 139e1051a39Sopenharmony_ci ret = !failed; 140e1051a39Sopenharmony_ci err: 141e1051a39Sopenharmony_ci BN_free(r); 142e1051a39Sopenharmony_ci BN_free(a); 143e1051a39Sopenharmony_ci BN_free(p); 144e1051a39Sopenharmony_ci BN_free(m); 145e1051a39Sopenharmony_ci BN_MONT_CTX_free(mont); 146e1051a39Sopenharmony_ci BN_CTX_free(ctx); 147e1051a39Sopenharmony_ci 148e1051a39Sopenharmony_ci return ret; 149e1051a39Sopenharmony_ci} 150e1051a39Sopenharmony_ci 151e1051a39Sopenharmony_cistatic int test_mod_exp(int round) 152e1051a39Sopenharmony_ci{ 153e1051a39Sopenharmony_ci BN_CTX *ctx; 154e1051a39Sopenharmony_ci unsigned char c; 155e1051a39Sopenharmony_ci int ret = 0; 156e1051a39Sopenharmony_ci BIGNUM *r_mont = NULL; 157e1051a39Sopenharmony_ci BIGNUM *r_mont_const = NULL; 158e1051a39Sopenharmony_ci BIGNUM *r_recp = NULL; 159e1051a39Sopenharmony_ci BIGNUM *r_simple = NULL; 160e1051a39Sopenharmony_ci BIGNUM *a = NULL; 161e1051a39Sopenharmony_ci BIGNUM *b = NULL; 162e1051a39Sopenharmony_ci BIGNUM *m = NULL; 163e1051a39Sopenharmony_ci 164e1051a39Sopenharmony_ci if (!TEST_ptr(ctx = BN_CTX_new())) 165e1051a39Sopenharmony_ci goto err; 166e1051a39Sopenharmony_ci 167e1051a39Sopenharmony_ci if (!TEST_ptr(r_mont = BN_new()) 168e1051a39Sopenharmony_ci || !TEST_ptr(r_mont_const = BN_new()) 169e1051a39Sopenharmony_ci || !TEST_ptr(r_recp = BN_new()) 170e1051a39Sopenharmony_ci || !TEST_ptr(r_simple = BN_new()) 171e1051a39Sopenharmony_ci || !TEST_ptr(a = BN_new()) 172e1051a39Sopenharmony_ci || !TEST_ptr(b = BN_new()) 173e1051a39Sopenharmony_ci || !TEST_ptr(m = BN_new())) 174e1051a39Sopenharmony_ci goto err; 175e1051a39Sopenharmony_ci 176e1051a39Sopenharmony_ci if (!TEST_int_gt(RAND_bytes(&c, 1), 0)) 177e1051a39Sopenharmony_ci goto err; 178e1051a39Sopenharmony_ci c = (c % BN_BITS) - BN_BITS2; 179e1051a39Sopenharmony_ci if (!TEST_true(BN_rand(a, NUM_BITS + c, BN_RAND_TOP_ONE, 180e1051a39Sopenharmony_ci BN_RAND_BOTTOM_ANY))) 181e1051a39Sopenharmony_ci goto err; 182e1051a39Sopenharmony_ci 183e1051a39Sopenharmony_ci if (!TEST_int_gt(RAND_bytes(&c, 1), 0)) 184e1051a39Sopenharmony_ci goto err; 185e1051a39Sopenharmony_ci c = (c % BN_BITS) - BN_BITS2; 186e1051a39Sopenharmony_ci if (!TEST_true(BN_rand(b, NUM_BITS + c, BN_RAND_TOP_ONE, 187e1051a39Sopenharmony_ci BN_RAND_BOTTOM_ANY))) 188e1051a39Sopenharmony_ci goto err; 189e1051a39Sopenharmony_ci 190e1051a39Sopenharmony_ci if (!TEST_int_gt(RAND_bytes(&c, 1), 0)) 191e1051a39Sopenharmony_ci goto err; 192e1051a39Sopenharmony_ci c = (c % BN_BITS) - BN_BITS2; 193e1051a39Sopenharmony_ci if (!TEST_true(BN_rand(m, NUM_BITS + c, BN_RAND_TOP_ONE, 194e1051a39Sopenharmony_ci BN_RAND_BOTTOM_ODD))) 195e1051a39Sopenharmony_ci goto err; 196e1051a39Sopenharmony_ci 197e1051a39Sopenharmony_ci if (!TEST_true(BN_mod(a, a, m, ctx)) 198e1051a39Sopenharmony_ci || !TEST_true(BN_mod(b, b, m, ctx)) 199e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_mont(r_mont, a, b, m, ctx, NULL)) 200e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_recp(r_recp, a, b, m, ctx)) 201e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_simple(r_simple, a, b, m, ctx)) 202e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_mont_consttime(r_mont_const, a, b, m, ctx, NULL))) 203e1051a39Sopenharmony_ci goto err; 204e1051a39Sopenharmony_ci 205e1051a39Sopenharmony_ci if (!TEST_BN_eq(r_simple, r_mont) 206e1051a39Sopenharmony_ci || !TEST_BN_eq(r_simple, r_recp) 207e1051a39Sopenharmony_ci || !TEST_BN_eq(r_simple, r_mont_const)) { 208e1051a39Sopenharmony_ci if (BN_cmp(r_simple, r_mont) != 0) 209e1051a39Sopenharmony_ci TEST_info("simple and mont results differ"); 210e1051a39Sopenharmony_ci if (BN_cmp(r_simple, r_mont_const) != 0) 211e1051a39Sopenharmony_ci TEST_info("simple and mont const time results differ"); 212e1051a39Sopenharmony_ci if (BN_cmp(r_simple, r_recp) != 0) 213e1051a39Sopenharmony_ci TEST_info("simple and recp results differ"); 214e1051a39Sopenharmony_ci 215e1051a39Sopenharmony_ci BN_print_var(a); 216e1051a39Sopenharmony_ci BN_print_var(b); 217e1051a39Sopenharmony_ci BN_print_var(m); 218e1051a39Sopenharmony_ci BN_print_var(r_simple); 219e1051a39Sopenharmony_ci BN_print_var(r_recp); 220e1051a39Sopenharmony_ci BN_print_var(r_mont); 221e1051a39Sopenharmony_ci BN_print_var(r_mont_const); 222e1051a39Sopenharmony_ci goto err; 223e1051a39Sopenharmony_ci } 224e1051a39Sopenharmony_ci 225e1051a39Sopenharmony_ci ret = 1; 226e1051a39Sopenharmony_ci err: 227e1051a39Sopenharmony_ci BN_free(r_mont); 228e1051a39Sopenharmony_ci BN_free(r_mont_const); 229e1051a39Sopenharmony_ci BN_free(r_recp); 230e1051a39Sopenharmony_ci BN_free(r_simple); 231e1051a39Sopenharmony_ci BN_free(a); 232e1051a39Sopenharmony_ci BN_free(b); 233e1051a39Sopenharmony_ci BN_free(m); 234e1051a39Sopenharmony_ci BN_CTX_free(ctx); 235e1051a39Sopenharmony_ci 236e1051a39Sopenharmony_ci return ret; 237e1051a39Sopenharmony_ci} 238e1051a39Sopenharmony_ci 239e1051a39Sopenharmony_cistatic int test_mod_exp_x2(int idx) 240e1051a39Sopenharmony_ci{ 241e1051a39Sopenharmony_ci BN_CTX *ctx; 242e1051a39Sopenharmony_ci int ret = 0; 243e1051a39Sopenharmony_ci BIGNUM *r_mont_const_x2_1 = NULL; 244e1051a39Sopenharmony_ci BIGNUM *r_mont_const_x2_2 = NULL; 245e1051a39Sopenharmony_ci BIGNUM *r_simple1 = NULL; 246e1051a39Sopenharmony_ci BIGNUM *r_simple2 = NULL; 247e1051a39Sopenharmony_ci BIGNUM *a1 = NULL; 248e1051a39Sopenharmony_ci BIGNUM *b1 = NULL; 249e1051a39Sopenharmony_ci BIGNUM *m1 = NULL; 250e1051a39Sopenharmony_ci BIGNUM *a2 = NULL; 251e1051a39Sopenharmony_ci BIGNUM *b2 = NULL; 252e1051a39Sopenharmony_ci BIGNUM *m2 = NULL; 253e1051a39Sopenharmony_ci int factor_size = 0; 254e1051a39Sopenharmony_ci 255e1051a39Sopenharmony_ci /* 256e1051a39Sopenharmony_ci * Currently only 1024-bit factor size is supported. 257e1051a39Sopenharmony_ci */ 258e1051a39Sopenharmony_ci if (idx <= 100) 259e1051a39Sopenharmony_ci factor_size = 1024; 260e1051a39Sopenharmony_ci 261e1051a39Sopenharmony_ci if (!TEST_ptr(ctx = BN_CTX_new())) 262e1051a39Sopenharmony_ci goto err; 263e1051a39Sopenharmony_ci 264e1051a39Sopenharmony_ci if (!TEST_ptr(r_mont_const_x2_1 = BN_new()) 265e1051a39Sopenharmony_ci || !TEST_ptr(r_mont_const_x2_2 = BN_new()) 266e1051a39Sopenharmony_ci || !TEST_ptr(r_simple1 = BN_new()) 267e1051a39Sopenharmony_ci || !TEST_ptr(r_simple2 = BN_new()) 268e1051a39Sopenharmony_ci || !TEST_ptr(a1 = BN_new()) 269e1051a39Sopenharmony_ci || !TEST_ptr(b1 = BN_new()) 270e1051a39Sopenharmony_ci || !TEST_ptr(m1 = BN_new()) 271e1051a39Sopenharmony_ci || !TEST_ptr(a2 = BN_new()) 272e1051a39Sopenharmony_ci || !TEST_ptr(b2 = BN_new()) 273e1051a39Sopenharmony_ci || !TEST_ptr(m2 = BN_new())) 274e1051a39Sopenharmony_ci goto err; 275e1051a39Sopenharmony_ci 276e1051a39Sopenharmony_ci BN_rand(a1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); 277e1051a39Sopenharmony_ci BN_rand(b1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); 278e1051a39Sopenharmony_ci BN_rand(m1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD); 279e1051a39Sopenharmony_ci BN_rand(a2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); 280e1051a39Sopenharmony_ci BN_rand(b2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); 281e1051a39Sopenharmony_ci BN_rand(m2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD); 282e1051a39Sopenharmony_ci 283e1051a39Sopenharmony_ci if (!TEST_true(BN_mod(a1, a1, m1, ctx)) 284e1051a39Sopenharmony_ci || !TEST_true(BN_mod(b1, b1, m1, ctx)) 285e1051a39Sopenharmony_ci || !TEST_true(BN_mod(a2, a2, m2, ctx)) 286e1051a39Sopenharmony_ci || !TEST_true(BN_mod(b2, b2, m2, ctx)) 287e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_simple(r_simple1, a1, b1, m1, ctx)) 288e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_simple(r_simple2, a2, b2, m2, ctx)) 289e1051a39Sopenharmony_ci || !TEST_true(BN_mod_exp_mont_consttime_x2(r_mont_const_x2_1, a1, b1, m1, NULL, 290e1051a39Sopenharmony_ci r_mont_const_x2_2, a2, b2, m2, NULL, 291e1051a39Sopenharmony_ci ctx))) 292e1051a39Sopenharmony_ci goto err; 293e1051a39Sopenharmony_ci 294e1051a39Sopenharmony_ci if (!TEST_BN_eq(r_simple1, r_mont_const_x2_1) 295e1051a39Sopenharmony_ci || !TEST_BN_eq(r_simple2, r_mont_const_x2_2)) { 296e1051a39Sopenharmony_ci if (BN_cmp(r_simple1, r_mont_const_x2_1) != 0) 297e1051a39Sopenharmony_ci TEST_info("simple and mont const time x2 (#1) results differ"); 298e1051a39Sopenharmony_ci if (BN_cmp(r_simple2, r_mont_const_x2_2) != 0) 299e1051a39Sopenharmony_ci TEST_info("simple and mont const time x2 (#2) results differ"); 300e1051a39Sopenharmony_ci 301e1051a39Sopenharmony_ci BN_print_var(a1); 302e1051a39Sopenharmony_ci BN_print_var(b1); 303e1051a39Sopenharmony_ci BN_print_var(m1); 304e1051a39Sopenharmony_ci BN_print_var(a2); 305e1051a39Sopenharmony_ci BN_print_var(b2); 306e1051a39Sopenharmony_ci BN_print_var(m2); 307e1051a39Sopenharmony_ci BN_print_var(r_simple1); 308e1051a39Sopenharmony_ci BN_print_var(r_simple2); 309e1051a39Sopenharmony_ci BN_print_var(r_mont_const_x2_1); 310e1051a39Sopenharmony_ci BN_print_var(r_mont_const_x2_2); 311e1051a39Sopenharmony_ci goto err; 312e1051a39Sopenharmony_ci } 313e1051a39Sopenharmony_ci 314e1051a39Sopenharmony_ci ret = 1; 315e1051a39Sopenharmony_ci err: 316e1051a39Sopenharmony_ci BN_free(r_mont_const_x2_1); 317e1051a39Sopenharmony_ci BN_free(r_mont_const_x2_2); 318e1051a39Sopenharmony_ci BN_free(r_simple1); 319e1051a39Sopenharmony_ci BN_free(r_simple2); 320e1051a39Sopenharmony_ci BN_free(a1); 321e1051a39Sopenharmony_ci BN_free(b1); 322e1051a39Sopenharmony_ci BN_free(m1); 323e1051a39Sopenharmony_ci BN_free(a2); 324e1051a39Sopenharmony_ci BN_free(b2); 325e1051a39Sopenharmony_ci BN_free(m2); 326e1051a39Sopenharmony_ci BN_CTX_free(ctx); 327e1051a39Sopenharmony_ci 328e1051a39Sopenharmony_ci return ret; 329e1051a39Sopenharmony_ci} 330e1051a39Sopenharmony_ci 331e1051a39Sopenharmony_ciint setup_tests(void) 332e1051a39Sopenharmony_ci{ 333e1051a39Sopenharmony_ci ADD_TEST(test_mod_exp_zero); 334e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_mod_exp, 200); 335e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_mod_exp_x2, 100); 336e1051a39Sopenharmony_ci return 1; 337e1051a39Sopenharmony_ci} 338