| 
									
										
										
										
											2016-05-18 02:20:24 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-04-08 20:04:41 +08:00
										 |  |  |  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:05:25 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:20:24 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2002-11-29 02:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:35:43 +08:00
										 |  |  | #include "internal/nelem.h"
 | 
					
						
							| 
									
										
										
										
											2002-11-29 02:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-24 06:13:45 +08:00
										 |  |  | #include <openssl/bio.h>
 | 
					
						
							|  |  |  | #include <openssl/bn.h>
 | 
					
						
							|  |  |  | #include <openssl/rand.h>
 | 
					
						
							|  |  |  | #include <openssl/err.h>
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | #include "testutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-28 23:13:21 +08:00
										 |  |  | #define NUM_BITS        (BN_BITS2 * 4)
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-12 08:01:17 +08:00
										 |  |  | #define BN_print_var(v) test_output_bignum(#v, v)
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Test that r == 0 in test_exp_mod_zero(). Returns one on success, | 
					
						
							|  |  |  |  * returns zero and prints debug output otherwise. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static int a_is_zero_mod_one(const char *method, const BIGNUM *r, | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |                              const BIGNUM *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |     if (!BN_is_zero(r)) { | 
					
						
							| 
									
										
										
										
											2017-06-12 08:01:17 +08:00
										 |  |  |         TEST_error("%s failed: a ** 0 mod 1 = r (should be 0)", method); | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         BN_print_var(a); | 
					
						
							|  |  |  |         BN_print_var(r); | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |  * test_mod_exp_zero tests that x**0 mod 1 == 0. It returns zero on success. | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-08-16 05:39:03 +08:00
										 |  |  | static int test_mod_exp_zero(void) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     BIGNUM *a = NULL, *p = NULL, *m = NULL; | 
					
						
							|  |  |  |     BIGNUM *r = NULL; | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |     BN_ULONG one_word = 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     BN_CTX *ctx = BN_CTX_new(); | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |     int ret = 1, failed = 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_ptr(m = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(a = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(p = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r = BN_new())) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     BN_one(m); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     BN_one(a); | 
					
						
							|  |  |  |     BN_zero(p); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_rand(a, 1024, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp(r, a, p, m, ctx))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp", r, a))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         failed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp_recp(r, a, p, m, ctx))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_recp", r, a))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         failed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp_simple(r, a, p, m, ctx))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_simple", r, a))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         failed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp_mont(r, a, p, m, ctx, NULL))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont", r, a))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         failed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp_mont_consttime(r, a, p, m, ctx, NULL))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont_consttime", r, a))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         failed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * A different codepath exists for single word multiplication | 
					
						
							|  |  |  |      * in non-constant-time only. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     if (!TEST_true(BN_mod_exp_mont_word(r, one_word, p, m, ctx, NULL))) | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-08 10:09:41 +08:00
										 |  |  |     if (!TEST_BN_eq_zero(r)) { | 
					
						
							| 
									
										
										
										
											2017-06-12 08:01:17 +08:00
										 |  |  |         TEST_error("BN_mod_exp_mont_word failed: " | 
					
						
							|  |  |  |                    "1 ** 0 mod 1 = r (should be 0)"); | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         BN_print_var(r); | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     ret = !failed; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |  err: | 
					
						
							|  |  |  |     BN_free(r); | 
					
						
							|  |  |  |     BN_free(a); | 
					
						
							|  |  |  |     BN_free(p); | 
					
						
							|  |  |  |     BN_free(m); | 
					
						
							| 
									
										
										
										
											2015-12-14 23:38:15 +08:00
										 |  |  |     BN_CTX_free(ctx); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							| 
									
										
										
										
											2013-04-24 00:13:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | static int test_mod_exp(int round) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     BN_CTX *ctx; | 
					
						
							|  |  |  |     unsigned char c; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     int ret = 0; | 
					
						
							|  |  |  |     BIGNUM *r_mont = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_mont_const = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_recp = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_simple = NULL; | 
					
						
							|  |  |  |     BIGNUM *a = NULL; | 
					
						
							|  |  |  |     BIGNUM *b = NULL; | 
					
						
							|  |  |  |     BIGNUM *m = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_ptr(ctx = BN_CTX_new())) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_ptr(r_mont = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_mont_const = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_recp = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_simple = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(a = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(b = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(m = BN_new())) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(RAND_bytes(&c, 1))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     c = (c % BN_BITS) - BN_BITS2; | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(BN_rand(a, NUM_BITS + c, BN_RAND_TOP_ONE, | 
					
						
							|  |  |  |                            BN_RAND_BOTTOM_ANY))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(RAND_bytes(&c, 1))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     c = (c % BN_BITS) - BN_BITS2; | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(BN_rand(b, NUM_BITS + c, BN_RAND_TOP_ONE, | 
					
						
							|  |  |  |                            BN_RAND_BOTTOM_ANY))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(RAND_bytes(&c, 1))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     c = (c % BN_BITS) - BN_BITS2; | 
					
						
							| 
									
										
										
										
											2021-03-19 07:14:40 +08:00
										 |  |  |     if (!TEST_true(BN_rand(m, NUM_BITS + c, BN_RAND_TOP_ONE, | 
					
						
							|  |  |  |                            BN_RAND_BOTTOM_ODD))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-06 07:10:28 +08:00
										 |  |  |     if (!TEST_true(BN_mod(a, a, m, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod(b, b, m, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_mont(r_mont, a, b, m, ctx, NULL)) | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         || !TEST_true(BN_mod_exp_recp(r_recp, a, b, m, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_simple(r_simple, a, b, m, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_mont_consttime(r_mont_const, a, b, m, ctx, NULL))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-08 10:09:41 +08:00
										 |  |  |     if (!TEST_BN_eq(r_simple, r_mont) | 
					
						
							|  |  |  |         || !TEST_BN_eq(r_simple, r_recp) | 
					
						
							|  |  |  |         || !TEST_BN_eq(r_simple, r_mont_const)) { | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         if (BN_cmp(r_simple, r_mont) != 0) | 
					
						
							| 
									
										
										
										
											2017-05-08 10:09:41 +08:00
										 |  |  |             TEST_info("simple and mont results differ"); | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         if (BN_cmp(r_simple, r_mont_const) != 0) | 
					
						
							| 
									
										
										
										
											2017-05-08 10:09:41 +08:00
										 |  |  |             TEST_info("simple and mont const time results differ"); | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |         if (BN_cmp(r_simple, r_recp) != 0) | 
					
						
							| 
									
										
										
										
											2017-05-08 10:09:41 +08:00
										 |  |  |             TEST_info("simple and recp results differ"); | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BN_print_var(a); | 
					
						
							|  |  |  |         BN_print_var(b); | 
					
						
							|  |  |  |         BN_print_var(m); | 
					
						
							|  |  |  |         BN_print_var(r_simple); | 
					
						
							|  |  |  |         BN_print_var(r_recp); | 
					
						
							|  |  |  |         BN_print_var(r_mont); | 
					
						
							|  |  |  |         BN_print_var(r_mont_const); | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ret = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     BN_free(r_mont); | 
					
						
							|  |  |  |     BN_free(r_mont_const); | 
					
						
							|  |  |  |     BN_free(r_recp); | 
					
						
							|  |  |  |     BN_free(r_simple); | 
					
						
							|  |  |  |     BN_free(a); | 
					
						
							|  |  |  |     BN_free(b); | 
					
						
							|  |  |  |     BN_free(m); | 
					
						
							|  |  |  |     BN_CTX_free(ctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:45:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 03:53:39 +08:00
										 |  |  | static int test_mod_exp_x2(int idx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BN_CTX *ctx; | 
					
						
							|  |  |  |     int ret = 0; | 
					
						
							|  |  |  |     BIGNUM *r_mont_const_x2_1 = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_mont_const_x2_2 = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_simple1 = NULL; | 
					
						
							|  |  |  |     BIGNUM *r_simple2 = NULL; | 
					
						
							|  |  |  |     BIGNUM *a1 = NULL; | 
					
						
							|  |  |  |     BIGNUM *b1 = NULL; | 
					
						
							|  |  |  |     BIGNUM *m1 = NULL; | 
					
						
							|  |  |  |     BIGNUM *a2 = NULL; | 
					
						
							|  |  |  |     BIGNUM *b2 = NULL; | 
					
						
							|  |  |  |     BIGNUM *m2 = NULL; | 
					
						
							|  |  |  |     int factor_size = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Currently only 1024-bit factor size is supported. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     if (idx <= 100) | 
					
						
							|  |  |  |         factor_size = 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_ptr(ctx = BN_CTX_new())) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_ptr(r_mont_const_x2_1 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_mont_const_x2_2 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_simple1 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(r_simple2 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(a1 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(b1 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(m1 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(a2 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(b2 = BN_new()) | 
					
						
							|  |  |  |         || !TEST_ptr(m2 = BN_new())) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BN_rand(a1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); | 
					
						
							|  |  |  |     BN_rand(b1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); | 
					
						
							|  |  |  |     BN_rand(m1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD); | 
					
						
							|  |  |  |     BN_rand(a2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); | 
					
						
							|  |  |  |     BN_rand(b2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY); | 
					
						
							|  |  |  |     BN_rand(m2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_true(BN_mod(a1, a1, m1, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod(b1, b1, m1, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod(a2, a2, m2, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod(b2, b2, m2, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_simple(r_simple1, a1, b1, m1, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_simple(r_simple2, a2, b2, m2, ctx)) | 
					
						
							|  |  |  |         || !TEST_true(BN_mod_exp_mont_consttime_x2(r_mont_const_x2_1, a1, b1, m1, NULL, | 
					
						
							|  |  |  |                                                    r_mont_const_x2_2, a2, b2, m2, NULL, | 
					
						
							|  |  |  |                                                    ctx))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_BN_eq(r_simple1, r_mont_const_x2_1) | 
					
						
							|  |  |  |         || !TEST_BN_eq(r_simple2, r_mont_const_x2_2)) { | 
					
						
							|  |  |  |         if (BN_cmp(r_simple1, r_mont_const_x2_1) != 0) | 
					
						
							|  |  |  |             TEST_info("simple and mont const time x2 (#1) results differ"); | 
					
						
							|  |  |  |         if (BN_cmp(r_simple2, r_mont_const_x2_2) != 0) | 
					
						
							|  |  |  |             TEST_info("simple and mont const time x2 (#2) results differ"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BN_print_var(a1); | 
					
						
							|  |  |  |         BN_print_var(b1); | 
					
						
							|  |  |  |         BN_print_var(m1); | 
					
						
							|  |  |  |         BN_print_var(a2); | 
					
						
							|  |  |  |         BN_print_var(b2); | 
					
						
							|  |  |  |         BN_print_var(m2); | 
					
						
							|  |  |  |         BN_print_var(r_simple1); | 
					
						
							|  |  |  |         BN_print_var(r_simple2); | 
					
						
							|  |  |  |         BN_print_var(r_mont_const_x2_1); | 
					
						
							|  |  |  |         BN_print_var(r_mont_const_x2_2); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							|  |  |  |     BN_free(r_mont_const_x2_1); | 
					
						
							|  |  |  |     BN_free(r_mont_const_x2_2); | 
					
						
							|  |  |  |     BN_free(r_simple1); | 
					
						
							|  |  |  |     BN_free(r_simple2); | 
					
						
							|  |  |  |     BN_free(a1); | 
					
						
							|  |  |  |     BN_free(b1); | 
					
						
							|  |  |  |     BN_free(m1); | 
					
						
							|  |  |  |     BN_free(a2); | 
					
						
							|  |  |  |     BN_free(b2); | 
					
						
							|  |  |  |     BN_free(m2); | 
					
						
							|  |  |  |     BN_CTX_free(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  | int setup_tests(void) | 
					
						
							| 
									
										
										
										
											2017-04-26 21:11:50 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ADD_TEST(test_mod_exp_zero); | 
					
						
							|  |  |  |     ADD_ALL_TESTS(test_mod_exp, 200); | 
					
						
							| 
									
										
										
										
											2020-12-09 03:53:39 +08:00
										 |  |  |     ADD_ALL_TESTS(test_mod_exp_x2, 100); | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } |