blob: 2d92276ec38d4077d50d734305c645c429e8486e [file] [log] [blame]
David Benjamina5974bf2015-03-25 23:49:37 -04001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.]
56 */
57/* ====================================================================
58 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
59 *
60 * Portions of the attached software ("Contribution") are developed by
61 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
62 *
63 * The Contribution is licensed pursuant to the Eric Young open source
64 * license provided above.
65 *
66 * The binary polynomial arithmetic software is originally written by
67 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems
68 * Laboratories. */
69
David Benjamin3ba2ae02016-09-18 20:11:15 -040070/* Per C99, various stdint.h and inttypes.h macros (the latter used by bn.h) are
71 * unavailable in C++ unless some macros are defined. C++11 overruled this
72 * decision, but older Android NDKs still require it. */
73#if !defined(__STDC_CONSTANT_MACROS)
74#define __STDC_CONSTANT_MACROS
75#endif
David Benjaminc561aa62015-05-09 01:38:06 -040076#if !defined(__STDC_FORMAT_MACROS)
77#define __STDC_FORMAT_MACROS
78#endif
79
David Benjamin8b66fef2016-06-26 17:58:55 -040080#include <assert.h>
David Benjamin15eaafb2015-05-27 14:51:51 -040081#include <errno.h>
David Benjamin5e9bdc12016-06-26 16:56:29 -040082#include <limits.h>
David Benjamina5974bf2015-03-25 23:49:37 -040083#include <stdio.h>
84#include <string.h>
85
David Benjaminef14b2d2015-11-11 14:01:27 -080086#include <utility>
87
David Benjamina5974bf2015-03-25 23:49:37 -040088#include <openssl/bn.h>
Matt Braithwaited17d74d2016-08-17 20:10:28 -070089#include <openssl/bytestring.h>
David Benjamina5974bf2015-03-25 23:49:37 -040090#include <openssl/crypto.h>
91#include <openssl/err.h>
92#include <openssl/mem.h>
93
Steven Valdezcb966542016-08-17 16:56:14 -040094#include "../internal.h"
95#include "../test/file_test.h"
Steven Valdezcb966542016-08-17 16:56:14 -040096#include "../test/test_util.h"
David Benjamina5974bf2015-03-25 23:49:37 -040097
98
Matt Braithwaited17d74d2016-08-17 20:10:28 -070099static int HexToBIGNUM(bssl::UniquePtr<BIGNUM> *out, const char *in) {
David Benjamine701f162015-12-03 11:04:24 -0500100 BIGNUM *raw = NULL;
101 int ret = BN_hex2bn(&raw, in);
102 out->reset(raw);
103 return ret;
104}
105
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700106static bssl::UniquePtr<BIGNUM> GetBIGNUM(FileTest *t, const char *attribute) {
David Benjamin80137ba2016-06-26 15:03:41 -0400107 std::string hex;
108 if (!t->GetAttribute(&hex, attribute)) {
109 return nullptr;
110 }
111
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700112 bssl::UniquePtr<BIGNUM> ret;
David Benjamin80137ba2016-06-26 15:03:41 -0400113 if (HexToBIGNUM(&ret, hex.c_str()) != static_cast<int>(hex.size())) {
114 t->PrintLine("Could not decode '%s'.", hex.c_str());
115 return nullptr;
116 }
117 return ret;
118}
119
David Benjamin5e9bdc12016-06-26 16:56:29 -0400120static bool GetInt(FileTest *t, int *out, const char *attribute) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700121 bssl::UniquePtr<BIGNUM> ret = GetBIGNUM(t, attribute);
David Benjamin5e9bdc12016-06-26 16:56:29 -0400122 if (!ret) {
123 return false;
124 }
125
126 BN_ULONG word = BN_get_word(ret.get());
127 if (word > INT_MAX) {
128 return false;
129 }
130
131 *out = static_cast<int>(word);
132 return true;
133}
134
David Benjamin80137ba2016-06-26 15:03:41 -0400135static bool ExpectBIGNUMsEqual(FileTest *t, const char *operation,
136 const BIGNUM *expected, const BIGNUM *actual) {
137 if (BN_cmp(expected, actual) == 0) {
138 return true;
139 }
140
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700141 bssl::UniquePtr<char> expected_str(BN_bn2hex(expected));
142 bssl::UniquePtr<char> actual_str(BN_bn2hex(actual));
David Benjamin80137ba2016-06-26 15:03:41 -0400143 if (!expected_str || !actual_str) {
David Benjamina5974bf2015-03-25 23:49:37 -0400144 return false;
145 }
146
David Benjamin80137ba2016-06-26 15:03:41 -0400147 t->PrintLine("Got %s =", operation);
148 t->PrintLine("\t%s", actual_str.get());
149 t->PrintLine("wanted:");
150 t->PrintLine("\t%s", expected_str.get());
151 return false;
152}
153
David Benjamin30581032016-06-26 15:18:28 -0400154static bool TestSum(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700155 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
156 bssl::UniquePtr<BIGNUM> b = GetBIGNUM(t, "B");
157 bssl::UniquePtr<BIGNUM> sum = GetBIGNUM(t, "Sum");
David Benjamin80137ba2016-06-26 15:03:41 -0400158 if (!a || !b || !sum) {
159 return false;
David Benjamina5974bf2015-03-25 23:49:37 -0400160 }
David Benjamin80137ba2016-06-26 15:03:41 -0400161
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700162 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin80137ba2016-06-26 15:03:41 -0400163 if (!ret ||
164 !BN_add(ret.get(), a.get(), b.get()) ||
165 !ExpectBIGNUMsEqual(t, "A + B", sum.get(), ret.get()) ||
166 !BN_sub(ret.get(), sum.get(), a.get()) ||
167 !ExpectBIGNUMsEqual(t, "Sum - A", b.get(), ret.get()) ||
168 !BN_sub(ret.get(), sum.get(), b.get()) ||
169 !ExpectBIGNUMsEqual(t, "Sum - B", a.get(), ret.get())) {
170 return false;
171 }
172
Brian Smithe4bf8b32016-07-01 13:36:06 -1000173 // Test that the functions work when |r| and |a| point to the same |BIGNUM|,
174 // or when |r| and |b| point to the same |BIGNUM|. TODO: Test the case where
175 // all of |r|, |a|, and |b| point to the same |BIGNUM|.
176 if (!BN_copy(ret.get(), a.get()) ||
177 !BN_add(ret.get(), ret.get(), b.get()) ||
178 !ExpectBIGNUMsEqual(t, "A + B (r is a)", sum.get(), ret.get()) ||
179 !BN_copy(ret.get(), b.get()) ||
180 !BN_add(ret.get(), a.get(), ret.get()) ||
181 !ExpectBIGNUMsEqual(t, "A + B (r is b)", sum.get(), ret.get()) ||
182 !BN_copy(ret.get(), sum.get()) ||
183 !BN_sub(ret.get(), ret.get(), a.get()) ||
184 !ExpectBIGNUMsEqual(t, "Sum - A (r is a)", b.get(), ret.get()) ||
185 !BN_copy(ret.get(), a.get()) ||
186 !BN_sub(ret.get(), sum.get(), ret.get()) ||
187 !ExpectBIGNUMsEqual(t, "Sum - A (r is b)", b.get(), ret.get()) ||
188 !BN_copy(ret.get(), sum.get()) ||
189 !BN_sub(ret.get(), ret.get(), b.get()) ||
190 !ExpectBIGNUMsEqual(t, "Sum - B (r is a)", a.get(), ret.get()) ||
191 !BN_copy(ret.get(), b.get()) ||
192 !BN_sub(ret.get(), sum.get(), ret.get()) ||
193 !ExpectBIGNUMsEqual(t, "Sum - B (r is b)", a.get(), ret.get())) {
194 return false;
195 }
196
Brian Smith3d4030b2016-07-01 14:12:40 -1000197 // Test |BN_uadd| and |BN_usub| with the prerequisites they are documented as
198 // having. Note that these functions are frequently used when the
199 // prerequisites don't hold. In those cases, they are supposed to work as if
200 // the prerequisite hold, but we don't test that yet. TODO: test that.
201 if (!BN_is_negative(a.get()) &&
202 !BN_is_negative(b.get()) && BN_cmp(a.get(), b.get()) >= 0) {
203 if (!BN_uadd(ret.get(), a.get(), b.get()) ||
204 !ExpectBIGNUMsEqual(t, "A +u B", sum.get(), ret.get()) ||
205 !BN_usub(ret.get(), sum.get(), a.get()) ||
206 !ExpectBIGNUMsEqual(t, "Sum -u A", b.get(), ret.get()) ||
207 !BN_usub(ret.get(), sum.get(), b.get()) ||
208 !ExpectBIGNUMsEqual(t, "Sum -u B", a.get(), ret.get())) {
209 return false;
210 }
211
212 // Test that the functions work when |r| and |a| point to the same |BIGNUM|,
213 // or when |r| and |b| point to the same |BIGNUM|. TODO: Test the case where
214 // all of |r|, |a|, and |b| point to the same |BIGNUM|.
215 if (!BN_copy(ret.get(), a.get()) ||
216 !BN_uadd(ret.get(), ret.get(), b.get()) ||
217 !ExpectBIGNUMsEqual(t, "A +u B (r is a)", sum.get(), ret.get()) ||
218 !BN_copy(ret.get(), b.get()) ||
219 !BN_uadd(ret.get(), a.get(), ret.get()) ||
220 !ExpectBIGNUMsEqual(t, "A +u B (r is b)", sum.get(), ret.get()) ||
221 !BN_copy(ret.get(), sum.get()) ||
222 !BN_usub(ret.get(), ret.get(), a.get()) ||
223 !ExpectBIGNUMsEqual(t, "Sum -u A (r is a)", b.get(), ret.get()) ||
224 !BN_copy(ret.get(), a.get()) ||
225 !BN_usub(ret.get(), sum.get(), ret.get()) ||
226 !ExpectBIGNUMsEqual(t, "Sum -u A (r is b)", b.get(), ret.get()) ||
227 !BN_copy(ret.get(), sum.get()) ||
228 !BN_usub(ret.get(), ret.get(), b.get()) ||
229 !ExpectBIGNUMsEqual(t, "Sum -u B (r is a)", a.get(), ret.get()) ||
230 !BN_copy(ret.get(), b.get()) ||
231 !BN_usub(ret.get(), sum.get(), ret.get()) ||
232 !ExpectBIGNUMsEqual(t, "Sum -u B (r is b)", a.get(), ret.get())) {
233 return false;
234 }
235 }
236
Brian Smithfe47ba22016-07-01 11:46:21 -1000237 // Test with |BN_add_word| and |BN_sub_word| if |b| is small enough.
238 BN_ULONG b_word = BN_get_word(b.get());
239 if (!BN_is_negative(b.get()) && b_word != (BN_ULONG)-1) {
240 if (!BN_copy(ret.get(), a.get()) ||
241 !BN_add_word(ret.get(), b_word) ||
242 !ExpectBIGNUMsEqual(t, "A + B (word)", sum.get(), ret.get()) ||
243 !BN_copy(ret.get(), sum.get()) ||
244 !BN_sub_word(ret.get(), b_word) ||
245 !ExpectBIGNUMsEqual(t, "Sum - B (word)", a.get(), ret.get())) {
246 return false;
247 }
248 }
249
David Benjamina5974bf2015-03-25 23:49:37 -0400250 return true;
251}
252
David Benjamin30581032016-06-26 15:18:28 -0400253static bool TestLShift1(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700254 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
255 bssl::UniquePtr<BIGNUM> lshift1 = GetBIGNUM(t, "LShift1");
256 bssl::UniquePtr<BIGNUM> zero(BN_new());
David Benjamine1caf392016-06-26 17:12:23 -0400257 if (!a || !lshift1 || !zero) {
David Benjamin30581032016-06-26 15:18:28 -0400258 return false;
259 }
260
David Benjamine1caf392016-06-26 17:12:23 -0400261 BN_zero(zero.get());
262
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700263 bssl::UniquePtr<BIGNUM> ret(BN_new()), two(BN_new()), remainder(BN_new());
David Benjamine1caf392016-06-26 17:12:23 -0400264 if (!ret || !two || !remainder ||
David Benjamin30581032016-06-26 15:18:28 -0400265 !BN_set_word(two.get(), 2) ||
266 !BN_add(ret.get(), a.get(), a.get()) ||
267 !ExpectBIGNUMsEqual(t, "A + A", lshift1.get(), ret.get()) ||
268 !BN_mul(ret.get(), a.get(), two.get(), ctx) ||
269 !ExpectBIGNUMsEqual(t, "A * 2", lshift1.get(), ret.get()) ||
David Benjamine1caf392016-06-26 17:12:23 -0400270 !BN_div(ret.get(), remainder.get(), lshift1.get(), two.get(), ctx) ||
David Benjamin30581032016-06-26 15:18:28 -0400271 !ExpectBIGNUMsEqual(t, "LShift1 / 2", a.get(), ret.get()) ||
David Benjamine1caf392016-06-26 17:12:23 -0400272 !ExpectBIGNUMsEqual(t, "LShift1 % 2", zero.get(), remainder.get()) ||
David Benjamin30581032016-06-26 15:18:28 -0400273 !BN_lshift1(ret.get(), a.get()) ||
274 !ExpectBIGNUMsEqual(t, "A << 1", lshift1.get(), ret.get()) ||
275 !BN_rshift1(ret.get(), lshift1.get()) ||
276 !ExpectBIGNUMsEqual(t, "LShift >> 1", a.get(), ret.get()) ||
277 !BN_rshift1(ret.get(), lshift1.get()) ||
278 !ExpectBIGNUMsEqual(t, "LShift >> 1", a.get(), ret.get())) {
279 return false;
280 }
281
282 // Set the LSB to 1 and test rshift1 again.
David Benjamin56cbbe5b2016-07-02 14:24:30 -0400283 if (!BN_set_bit(lshift1.get(), 0) ||
284 !BN_div(ret.get(), nullptr /* rem */, lshift1.get(), two.get(), ctx) ||
David Benjamin30581032016-06-26 15:18:28 -0400285 !ExpectBIGNUMsEqual(t, "(LShift1 | 1) / 2", a.get(), ret.get()) ||
286 !BN_rshift1(ret.get(), lshift1.get()) ||
287 !ExpectBIGNUMsEqual(t, "(LShift | 1) >> 1", a.get(), ret.get())) {
288 return false;
289 }
290
291 return true;
292}
293
David Benjamin5e9bdc12016-06-26 16:56:29 -0400294static bool TestLShift(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700295 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
296 bssl::UniquePtr<BIGNUM> lshift = GetBIGNUM(t, "LShift");
Adam Langleyd42e4b22016-06-27 15:57:57 -0700297 int n = 0;
David Benjamin5e9bdc12016-06-26 16:56:29 -0400298 if (!a || !lshift || !GetInt(t, &n, "N")) {
299 return false;
300 }
301
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700302 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin5e9bdc12016-06-26 16:56:29 -0400303 if (!ret ||
304 !BN_lshift(ret.get(), a.get(), n) ||
305 !ExpectBIGNUMsEqual(t, "A << N", lshift.get(), ret.get()) ||
306 !BN_rshift(ret.get(), lshift.get(), n) ||
307 !ExpectBIGNUMsEqual(t, "A >> N", a.get(), ret.get())) {
308 return false;
309 }
310
311 return true;
312}
313
314static bool TestRShift(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700315 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
316 bssl::UniquePtr<BIGNUM> rshift = GetBIGNUM(t, "RShift");
Adam Langleyd42e4b22016-06-27 15:57:57 -0700317 int n = 0;
David Benjamin5e9bdc12016-06-26 16:56:29 -0400318 if (!a || !rshift || !GetInt(t, &n, "N")) {
319 return false;
320 }
321
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700322 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin5e9bdc12016-06-26 16:56:29 -0400323 if (!ret ||
324 !BN_rshift(ret.get(), a.get(), n) ||
325 !ExpectBIGNUMsEqual(t, "A >> N", rshift.get(), ret.get())) {
326 return false;
327 }
328
329 return true;
330}
331
David Benjamine1caf392016-06-26 17:12:23 -0400332static bool TestSquare(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700333 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
334 bssl::UniquePtr<BIGNUM> square = GetBIGNUM(t, "Square");
335 bssl::UniquePtr<BIGNUM> zero(BN_new());
David Benjamine1caf392016-06-26 17:12:23 -0400336 if (!a || !square || !zero) {
337 return false;
338 }
339
340 BN_zero(zero.get());
341
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700342 bssl::UniquePtr<BIGNUM> ret(BN_new()), remainder(BN_new());
David Benjamin08387212016-09-29 20:18:38 -0400343 if (!ret || !remainder ||
David Benjamine1caf392016-06-26 17:12:23 -0400344 !BN_sqr(ret.get(), a.get(), ctx) ||
345 !ExpectBIGNUMsEqual(t, "A^2", square.get(), ret.get()) ||
346 !BN_mul(ret.get(), a.get(), a.get(), ctx) ||
347 !ExpectBIGNUMsEqual(t, "A * A", square.get(), ret.get()) ||
348 !BN_div(ret.get(), remainder.get(), square.get(), a.get(), ctx) ||
349 !ExpectBIGNUMsEqual(t, "Square / A", a.get(), ret.get()) ||
350 !ExpectBIGNUMsEqual(t, "Square % A", zero.get(), remainder.get())) {
351 return false;
352 }
353
354 BN_set_negative(a.get(), 0);
355 if (!BN_sqrt(ret.get(), square.get(), ctx) ||
356 !ExpectBIGNUMsEqual(t, "sqrt(Square)", a.get(), ret.get())) {
357 return false;
358 }
359
David Benjamin28a8c2f2016-07-02 20:48:45 -0400360 // BN_sqrt should fail on non-squares and negative numbers.
361 if (!BN_is_zero(square.get())) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700362 bssl::UniquePtr<BIGNUM> tmp(BN_new());
David Benjamin28a8c2f2016-07-02 20:48:45 -0400363 if (!tmp || !BN_copy(tmp.get(), square.get())) {
364 return false;
365 }
366 BN_set_negative(tmp.get(), 1);
367
368 if (BN_sqrt(ret.get(), tmp.get(), ctx)) {
369 t->PrintLine("BN_sqrt succeeded on a negative number");
370 return false;
371 }
372 ERR_clear_error();
373
374 BN_set_negative(tmp.get(), 0);
375 if (!BN_add(tmp.get(), tmp.get(), BN_value_one())) {
376 return false;
377 }
378 if (BN_sqrt(ret.get(), tmp.get(), ctx)) {
379 t->PrintLine("BN_sqrt succeeded on a non-square");
380 return false;
381 }
382 ERR_clear_error();
383 }
384
David Benjamine1caf392016-06-26 17:12:23 -0400385 return true;
386}
387
David Benjamincca1c112016-06-26 17:28:55 -0400388static bool TestProduct(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700389 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
390 bssl::UniquePtr<BIGNUM> b = GetBIGNUM(t, "B");
391 bssl::UniquePtr<BIGNUM> product = GetBIGNUM(t, "Product");
392 bssl::UniquePtr<BIGNUM> zero(BN_new());
David Benjamincca1c112016-06-26 17:28:55 -0400393 if (!a || !b || !product || !zero) {
394 return false;
395 }
396
397 BN_zero(zero.get());
398
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700399 bssl::UniquePtr<BIGNUM> ret(BN_new()), remainder(BN_new());
David Benjamincca1c112016-06-26 17:28:55 -0400400 if (!ret || !remainder ||
401 !BN_mul(ret.get(), a.get(), b.get(), ctx) ||
402 !ExpectBIGNUMsEqual(t, "A * B", product.get(), ret.get()) ||
403 !BN_div(ret.get(), remainder.get(), product.get(), a.get(), ctx) ||
404 !ExpectBIGNUMsEqual(t, "Product / A", b.get(), ret.get()) ||
405 !ExpectBIGNUMsEqual(t, "Product % A", zero.get(), remainder.get()) ||
406 !BN_div(ret.get(), remainder.get(), product.get(), b.get(), ctx) ||
407 !ExpectBIGNUMsEqual(t, "Product / B", a.get(), ret.get()) ||
408 !ExpectBIGNUMsEqual(t, "Product % B", zero.get(), remainder.get())) {
409 return false;
410 }
411
412 return true;
413}
414
David Benjamin8b66fef2016-06-26 17:58:55 -0400415static bool TestQuotient(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700416 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
417 bssl::UniquePtr<BIGNUM> b = GetBIGNUM(t, "B");
418 bssl::UniquePtr<BIGNUM> quotient = GetBIGNUM(t, "Quotient");
419 bssl::UniquePtr<BIGNUM> remainder = GetBIGNUM(t, "Remainder");
David Benjamin8b66fef2016-06-26 17:58:55 -0400420 if (!a || !b || !quotient || !remainder) {
421 return false;
422 }
423
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700424 bssl::UniquePtr<BIGNUM> ret(BN_new()), ret2(BN_new());
David Benjamin8b66fef2016-06-26 17:58:55 -0400425 if (!ret || !ret2 ||
426 !BN_div(ret.get(), ret2.get(), a.get(), b.get(), ctx) ||
427 !ExpectBIGNUMsEqual(t, "A / B", quotient.get(), ret.get()) ||
428 !ExpectBIGNUMsEqual(t, "A % B", remainder.get(), ret2.get()) ||
429 !BN_mul(ret.get(), quotient.get(), b.get(), ctx) ||
430 !BN_add(ret.get(), ret.get(), remainder.get()) ||
431 !ExpectBIGNUMsEqual(t, "Quotient * B + Remainder", a.get(), ret.get())) {
432 return false;
433 }
434
435 // Test with |BN_mod_word| and |BN_div_word| if the divisor is small enough.
436 BN_ULONG b_word = BN_get_word(b.get());
437 if (!BN_is_negative(b.get()) && b_word != (BN_ULONG)-1) {
438 BN_ULONG remainder_word = BN_get_word(remainder.get());
439 assert(remainder_word != (BN_ULONG)-1);
440 if (!BN_copy(ret.get(), a.get())) {
441 return false;
442 }
443 BN_ULONG ret_word = BN_div_word(ret.get(), b_word);
444 if (ret_word != remainder_word) {
445 t->PrintLine("Got A %% B (word) = " BN_HEX_FMT1 ", wanted " BN_HEX_FMT1
446 "\n",
447 ret_word, remainder_word);
448 return false;
449 }
450 if (!ExpectBIGNUMsEqual(t, "A / B (word)", quotient.get(), ret.get())) {
451 return false;
452 }
453
454 ret_word = BN_mod_word(a.get(), b_word);
455 if (ret_word != remainder_word) {
456 t->PrintLine("Got A %% B (word) = " BN_HEX_FMT1 ", wanted " BN_HEX_FMT1
457 "\n",
458 ret_word, remainder_word);
459 return false;
460 }
461 }
462
David Benjamine8317a52016-07-02 20:14:30 -0400463 // Test BN_nnmod.
464 if (!BN_is_negative(b.get())) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700465 bssl::UniquePtr<BIGNUM> nnmod(BN_new());
David Benjamine8317a52016-07-02 20:14:30 -0400466 if (!nnmod ||
467 !BN_copy(nnmod.get(), remainder.get()) ||
468 (BN_is_negative(nnmod.get()) &&
469 !BN_add(nnmod.get(), nnmod.get(), b.get())) ||
470 !BN_nnmod(ret.get(), a.get(), b.get(), ctx) ||
471 !ExpectBIGNUMsEqual(t, "A % B (non-negative)", nnmod.get(),
472 ret.get())) {
473 return false;
474 }
475 }
476
David Benjamin8b66fef2016-06-26 17:58:55 -0400477 return true;
478}
479
David Benjamin5a13e402016-07-02 20:33:07 -0400480static bool TestModMul(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700481 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
482 bssl::UniquePtr<BIGNUM> b = GetBIGNUM(t, "B");
483 bssl::UniquePtr<BIGNUM> m = GetBIGNUM(t, "M");
484 bssl::UniquePtr<BIGNUM> mod_mul = GetBIGNUM(t, "ModMul");
David Benjamin5a13e402016-07-02 20:33:07 -0400485 if (!a || !b || !m || !mod_mul) {
486 return false;
487 }
488
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700489 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin5a13e402016-07-02 20:33:07 -0400490 if (!ret ||
491 !BN_mod_mul(ret.get(), a.get(), b.get(), m.get(), ctx) ||
492 !ExpectBIGNUMsEqual(t, "A * B (mod M)", mod_mul.get(), ret.get())) {
493 return false;
494 }
495
496 if (BN_is_odd(m.get())) {
497 // Reduce |a| and |b| and test the Montgomery version.
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700498 bssl::UniquePtr<BN_MONT_CTX> mont(BN_MONT_CTX_new());
499 bssl::UniquePtr<BIGNUM> a_tmp(BN_new()), b_tmp(BN_new());
David Benjamin5a13e402016-07-02 20:33:07 -0400500 if (!mont || !a_tmp || !b_tmp ||
501 !BN_MONT_CTX_set(mont.get(), m.get(), ctx) ||
502 !BN_nnmod(a_tmp.get(), a.get(), m.get(), ctx) ||
503 !BN_nnmod(b_tmp.get(), b.get(), m.get(), ctx) ||
504 !BN_to_montgomery(a_tmp.get(), a_tmp.get(), mont.get(), ctx) ||
505 !BN_to_montgomery(b_tmp.get(), b_tmp.get(), mont.get(), ctx) ||
506 !BN_mod_mul_montgomery(ret.get(), a_tmp.get(), b_tmp.get(), mont.get(),
507 ctx) ||
508 !BN_from_montgomery(ret.get(), ret.get(), mont.get(), ctx) ||
509 !ExpectBIGNUMsEqual(t, "A * B (mod M) (Montgomery)",
510 mod_mul.get(), ret.get())) {
511 return false;
512 }
513 }
514
515 return true;
516}
517
David Benjamind1036162017-01-26 09:55:07 -0500518static bool TestModSquare(FileTest *t, BN_CTX *ctx) {
519 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
520 bssl::UniquePtr<BIGNUM> m = GetBIGNUM(t, "M");
521 bssl::UniquePtr<BIGNUM> mod_square = GetBIGNUM(t, "ModSquare");
522 if (!a || !m || !mod_square) {
523 return false;
524 }
525
526 bssl::UniquePtr<BIGNUM> a_copy(BN_new());
527 bssl::UniquePtr<BIGNUM> ret(BN_new());
528 if (!ret || !a_copy ||
529 !BN_mod_mul(ret.get(), a.get(), a.get(), m.get(), ctx) ||
530 !ExpectBIGNUMsEqual(t, "A * A (mod M)", mod_square.get(), ret.get()) ||
531 // Repeat the operation with |a_copy|.
532 !BN_copy(a_copy.get(), a.get()) ||
533 !BN_mod_mul(ret.get(), a.get(), a_copy.get(), m.get(), ctx) ||
534 !ExpectBIGNUMsEqual(t, "A * A_copy (mod M)", mod_square.get(),
535 ret.get())) {
536 return false;
537 }
538
539 if (BN_is_odd(m.get())) {
540 // Reduce |a| and test the Montgomery version.
541 bssl::UniquePtr<BN_MONT_CTX> mont(BN_MONT_CTX_new());
542 bssl::UniquePtr<BIGNUM> a_tmp(BN_new());
543 if (!mont || !a_tmp ||
544 !BN_MONT_CTX_set(mont.get(), m.get(), ctx) ||
545 !BN_nnmod(a_tmp.get(), a.get(), m.get(), ctx) ||
546 !BN_to_montgomery(a_tmp.get(), a_tmp.get(), mont.get(), ctx) ||
547 !BN_mod_mul_montgomery(ret.get(), a_tmp.get(), a_tmp.get(), mont.get(),
548 ctx) ||
549 !BN_from_montgomery(ret.get(), ret.get(), mont.get(), ctx) ||
550 !ExpectBIGNUMsEqual(t, "A * A (mod M) (Montgomery)",
551 mod_square.get(), ret.get()) ||
552 // Repeat the operation with |a_copy|.
553 !BN_copy(a_copy.get(), a_tmp.get()) ||
554 !BN_mod_mul_montgomery(ret.get(), a_tmp.get(), a_copy.get(), mont.get(),
555 ctx) ||
556 !BN_from_montgomery(ret.get(), ret.get(), mont.get(), ctx) ||
557 !ExpectBIGNUMsEqual(t, "A * A_copy (mod M) (Montgomery)",
558 mod_square.get(), ret.get())) {
559 return false;
560 }
561 }
562
563 return true;
564}
565
David Benjamin45a8c8a2016-07-03 10:05:56 -0400566static bool TestModExp(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700567 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
568 bssl::UniquePtr<BIGNUM> e = GetBIGNUM(t, "E");
569 bssl::UniquePtr<BIGNUM> m = GetBIGNUM(t, "M");
570 bssl::UniquePtr<BIGNUM> mod_exp = GetBIGNUM(t, "ModExp");
David Benjamin45a8c8a2016-07-03 10:05:56 -0400571 if (!a || !e || !m || !mod_exp) {
572 return false;
573 }
574
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700575 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin45a8c8a2016-07-03 10:05:56 -0400576 if (!ret ||
577 !BN_mod_exp(ret.get(), a.get(), e.get(), m.get(), ctx) ||
578 !ExpectBIGNUMsEqual(t, "A ^ E (mod M)", mod_exp.get(), ret.get())) {
579 return false;
580 }
581
582 if (BN_is_odd(m.get())) {
583 if (!BN_mod_exp_mont(ret.get(), a.get(), e.get(), m.get(), ctx, NULL) ||
584 !ExpectBIGNUMsEqual(t, "A ^ E (mod M) (Montgomery)", mod_exp.get(),
585 ret.get()) ||
586 !BN_mod_exp_mont_consttime(ret.get(), a.get(), e.get(), m.get(), ctx,
587 NULL) ||
588 !ExpectBIGNUMsEqual(t, "A ^ E (mod M) (constant-time)", mod_exp.get(),
589 ret.get())) {
590 return false;
591 }
592 }
593
594 return true;
595}
596
David Benjamin4cb00ba2016-07-03 11:52:58 -0400597static bool TestExp(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700598 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
599 bssl::UniquePtr<BIGNUM> e = GetBIGNUM(t, "E");
600 bssl::UniquePtr<BIGNUM> exp = GetBIGNUM(t, "Exp");
David Benjamin4cb00ba2016-07-03 11:52:58 -0400601 if (!a || !e || !exp) {
602 return false;
603 }
604
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700605 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjamin4cb00ba2016-07-03 11:52:58 -0400606 if (!ret ||
607 !BN_exp(ret.get(), a.get(), e.get(), ctx) ||
608 !ExpectBIGNUMsEqual(t, "A ^ E", exp.get(), ret.get())) {
609 return false;
610 }
611
612 return true;
613}
614
David Benjaminffb7adc2016-07-03 15:19:20 -0400615static bool TestModSqrt(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700616 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
617 bssl::UniquePtr<BIGNUM> p = GetBIGNUM(t, "P");
618 bssl::UniquePtr<BIGNUM> mod_sqrt = GetBIGNUM(t, "ModSqrt");
David Benjamin55a1ecc2016-11-25 08:56:15 -0500619 bssl::UniquePtr<BIGNUM> mod_sqrt2(BN_new());
620 if (!a || !p || !mod_sqrt || !mod_sqrt2 ||
621 // There are two possible answers.
622 !BN_sub(mod_sqrt2.get(), p.get(), mod_sqrt.get())) {
David Benjaminffb7adc2016-07-03 15:19:20 -0400623 return false;
624 }
625
David Benjamin55a1ecc2016-11-25 08:56:15 -0500626 // -0 is 0, not P.
627 if (BN_is_zero(mod_sqrt.get())) {
628 BN_zero(mod_sqrt2.get());
629 }
630
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700631 bssl::UniquePtr<BIGNUM> ret(BN_new());
David Benjaminffb7adc2016-07-03 15:19:20 -0400632 if (!ret ||
David Benjamin55a1ecc2016-11-25 08:56:15 -0500633 !BN_mod_sqrt(ret.get(), a.get(), p.get(), ctx)) {
David Benjaminffb7adc2016-07-03 15:19:20 -0400634 return false;
635 }
636
David Benjamin55a1ecc2016-11-25 08:56:15 -0500637 if (BN_cmp(ret.get(), mod_sqrt2.get()) != 0 &&
David Benjaminffb7adc2016-07-03 15:19:20 -0400638 !ExpectBIGNUMsEqual(t, "sqrt(A) (mod P)", mod_sqrt.get(), ret.get())) {
639 return false;
640 }
641
642 return true;
643}
644
David Benjaminbd691752016-11-25 15:10:17 -0500645static bool TestNotModSquare(FileTest *t, BN_CTX *ctx) {
646 bssl::UniquePtr<BIGNUM> not_mod_square = GetBIGNUM(t, "NotModSquare");
647 bssl::UniquePtr<BIGNUM> p = GetBIGNUM(t, "P");
648 bssl::UniquePtr<BIGNUM> ret(BN_new());
649 if (!not_mod_square || !p || !ret) {
650 return false;
651 }
652
653 if (BN_mod_sqrt(ret.get(), not_mod_square.get(), p.get(), ctx)) {
654 t->PrintLine("BN_mod_sqrt unexpectedly succeeded.");
655 return false;
656 }
657
658 uint32_t err = ERR_peek_error();
659 if (ERR_GET_LIB(err) == ERR_LIB_BN &&
660 ERR_GET_REASON(err) == BN_R_NOT_A_SQUARE) {
661 ERR_clear_error();
662 return true;
663 }
664
665 return false;
666}
667
Brian Smith286fbf22016-07-25 14:20:32 -1000668static bool TestModInv(FileTest *t, BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700669 bssl::UniquePtr<BIGNUM> a = GetBIGNUM(t, "A");
670 bssl::UniquePtr<BIGNUM> m = GetBIGNUM(t, "M");
671 bssl::UniquePtr<BIGNUM> mod_inv = GetBIGNUM(t, "ModInv");
Brian Smith286fbf22016-07-25 14:20:32 -1000672 if (!a || !m || !mod_inv) {
673 return false;
674 }
675
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700676 bssl::UniquePtr<BIGNUM> ret(BN_new());
Brian Smith286fbf22016-07-25 14:20:32 -1000677 if (!ret ||
678 !BN_mod_inverse(ret.get(), a.get(), m.get(), ctx) ||
679 !ExpectBIGNUMsEqual(t, "inv(A) (mod M)", mod_inv.get(), ret.get())) {
680 return false;
681 }
682
Brian Smith286fbf22016-07-25 14:20:32 -1000683 return true;
684}
685
David Benjamin80137ba2016-06-26 15:03:41 -0400686struct Test {
687 const char *name;
David Benjamin30581032016-06-26 15:18:28 -0400688 bool (*func)(FileTest *t, BN_CTX *ctx);
David Benjamin80137ba2016-06-26 15:03:41 -0400689};
David Benjamina5974bf2015-03-25 23:49:37 -0400690
David Benjamin80137ba2016-06-26 15:03:41 -0400691static const Test kTests[] = {
692 {"Sum", TestSum},
David Benjamin30581032016-06-26 15:18:28 -0400693 {"LShift1", TestLShift1},
David Benjamin5e9bdc12016-06-26 16:56:29 -0400694 {"LShift", TestLShift},
695 {"RShift", TestRShift},
David Benjamine1caf392016-06-26 17:12:23 -0400696 {"Square", TestSquare},
David Benjamincca1c112016-06-26 17:28:55 -0400697 {"Product", TestProduct},
David Benjamin8b66fef2016-06-26 17:58:55 -0400698 {"Quotient", TestQuotient},
David Benjamin5a13e402016-07-02 20:33:07 -0400699 {"ModMul", TestModMul},
David Benjamind1036162017-01-26 09:55:07 -0500700 {"ModSquare", TestModSquare},
David Benjamin45a8c8a2016-07-03 10:05:56 -0400701 {"ModExp", TestModExp},
David Benjamin4cb00ba2016-07-03 11:52:58 -0400702 {"Exp", TestExp},
David Benjaminffb7adc2016-07-03 15:19:20 -0400703 {"ModSqrt", TestModSqrt},
David Benjaminbd691752016-11-25 15:10:17 -0500704 {"NotModSquare", TestNotModSquare},
Brian Smith286fbf22016-07-25 14:20:32 -1000705 {"ModInv", TestModInv},
David Benjamin80137ba2016-06-26 15:03:41 -0400706};
707
708static bool RunTest(FileTest *t, void *arg) {
David Benjamin30581032016-06-26 15:18:28 -0400709 BN_CTX *ctx = reinterpret_cast<BN_CTX *>(arg);
David Benjamin80137ba2016-06-26 15:03:41 -0400710 for (const Test &test : kTests) {
711 if (t->GetType() != test.name) {
712 continue;
David Benjamina5974bf2015-03-25 23:49:37 -0400713 }
David Benjamin30581032016-06-26 15:18:28 -0400714 return test.func(t, ctx);
David Benjamina5974bf2015-03-25 23:49:37 -0400715 }
David Benjamin80137ba2016-06-26 15:03:41 -0400716 t->PrintLine("Unknown test type: %s", t->GetType().c_str());
717 return false;
David Benjamina5974bf2015-03-25 23:49:37 -0400718}
719
David Benjamin96f94472016-06-26 17:31:02 -0400720static bool TestBN2BinPadded(BN_CTX *ctx) {
David Benjamina5974bf2015-03-25 23:49:37 -0400721 uint8_t zeros[256], out[256], reference[128];
722
David Benjamin17cf2cb2016-12-13 01:07:13 -0500723 OPENSSL_memset(zeros, 0, sizeof(zeros));
David Benjamina5974bf2015-03-25 23:49:37 -0400724
725 // Test edge case at 0.
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700726 bssl::UniquePtr<BIGNUM> n(BN_new());
David Benjamina5974bf2015-03-25 23:49:37 -0400727 if (!n || !BN_bn2bin_padded(NULL, 0, n.get())) {
728 fprintf(stderr,
729 "BN_bn2bin_padded failed to encode 0 in an empty buffer.\n");
730 return false;
731 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500732 OPENSSL_memset(out, -1, sizeof(out));
David Benjamina5974bf2015-03-25 23:49:37 -0400733 if (!BN_bn2bin_padded(out, sizeof(out), n.get())) {
734 fprintf(stderr,
735 "BN_bn2bin_padded failed to encode 0 in a non-empty buffer.\n");
736 return false;
737 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500738 if (OPENSSL_memcmp(zeros, out, sizeof(out))) {
David Benjamina5974bf2015-03-25 23:49:37 -0400739 fprintf(stderr, "BN_bn2bin_padded did not zero buffer.\n");
740 return false;
741 }
742
743 // Test a random numbers at various byte lengths.
744 for (size_t bytes = 128 - 7; bytes <= 128; bytes++) {
David Benjamind224d522016-08-16 10:03:45 -0400745 if (!BN_rand(n.get(), bytes * 8, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY)) {
Brian Smith83a82982015-04-09 16:21:10 -1000746 ERR_print_errors_fp(stderr);
David Benjamina5974bf2015-03-25 23:49:37 -0400747 return false;
748 }
749 if (BN_num_bytes(n.get()) != bytes ||
750 BN_bn2bin(n.get(), reference) != bytes) {
751 fprintf(stderr, "Bad result from BN_rand; bytes.\n");
752 return false;
753 }
754 // Empty buffer should fail.
755 if (BN_bn2bin_padded(NULL, 0, n.get())) {
756 fprintf(stderr,
757 "BN_bn2bin_padded incorrectly succeeded on empty buffer.\n");
758 return false;
759 }
760 // One byte short should fail.
761 if (BN_bn2bin_padded(out, bytes - 1, n.get())) {
762 fprintf(stderr, "BN_bn2bin_padded incorrectly succeeded on short.\n");
763 return false;
764 }
765 // Exactly right size should encode.
766 if (!BN_bn2bin_padded(out, bytes, n.get()) ||
David Benjamin17cf2cb2016-12-13 01:07:13 -0500767 OPENSSL_memcmp(out, reference, bytes) != 0) {
David Benjamina5974bf2015-03-25 23:49:37 -0400768 fprintf(stderr, "BN_bn2bin_padded gave a bad result.\n");
769 return false;
770 }
771 // Pad up one byte extra.
772 if (!BN_bn2bin_padded(out, bytes + 1, n.get()) ||
David Benjamin17cf2cb2016-12-13 01:07:13 -0500773 OPENSSL_memcmp(out + 1, reference, bytes) ||
774 OPENSSL_memcmp(out, zeros, 1)) {
David Benjamina5974bf2015-03-25 23:49:37 -0400775 fprintf(stderr, "BN_bn2bin_padded gave a bad result.\n");
776 return false;
777 }
778 // Pad up to 256.
779 if (!BN_bn2bin_padded(out, sizeof(out), n.get()) ||
David Benjamin17cf2cb2016-12-13 01:07:13 -0500780 OPENSSL_memcmp(out + sizeof(out) - bytes, reference, bytes) ||
781 OPENSSL_memcmp(out, zeros, sizeof(out) - bytes)) {
David Benjamina5974bf2015-03-25 23:49:37 -0400782 fprintf(stderr, "BN_bn2bin_padded gave a bad result.\n");
783 return false;
784 }
785 }
786
787 return true;
788}
David Benjaminc85573c2015-04-20 19:52:31 -0400789
Rob Sloan45573cc2016-12-07 20:53:22 -0800790static bool TestLittleEndian() {
791 bssl::UniquePtr<BIGNUM> x(BN_new());
792 bssl::UniquePtr<BIGNUM> y(BN_new());
793 if (!x || !y) {
794 fprintf(stderr, "BN_new failed to malloc.\n");
795 return false;
796 }
797
798 // Test edge case at 0. Fill |out| with garbage to ensure |BN_bn2le_padded|
799 // wrote the result.
800 uint8_t out[256], zeros[256];
801 OPENSSL_memset(out, -1, sizeof(out));
802 OPENSSL_memset(zeros, 0, sizeof(zeros));
803 if (!BN_bn2le_padded(out, sizeof(out), x.get()) ||
804 OPENSSL_memcmp(zeros, out, sizeof(out))) {
805 fprintf(stderr, "BN_bn2le_padded failed to encode 0.\n");
806 return false;
807 }
808
809 if (!BN_le2bn(out, sizeof(out), y.get()) ||
810 BN_cmp(x.get(), y.get()) != 0) {
811 fprintf(stderr, "BN_le2bn failed to decode 0 correctly.\n");
812 return false;
813 }
814
815 // Test random numbers at various byte lengths.
816 for (size_t bytes = 128 - 7; bytes <= 128; bytes++) {
817 if (!BN_rand(x.get(), bytes * 8, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY)) {
818 ERR_print_errors_fp(stderr);
819 return false;
820 }
821
822 // Fill |out| with garbage to ensure |BN_bn2le_padded| wrote the result.
823 OPENSSL_memset(out, -1, sizeof(out));
824 if (!BN_bn2le_padded(out, sizeof(out), x.get())) {
825 fprintf(stderr, "BN_bn2le_padded failed to encode random value.\n");
826 return false;
827 }
828
829 // Compute the expected value by reversing the big-endian output.
830 uint8_t expected[sizeof(out)];
831 if (!BN_bn2bin_padded(expected, sizeof(expected), x.get())) {
832 return false;
833 }
834 for (size_t i = 0; i < sizeof(expected) / 2; i++) {
835 uint8_t tmp = expected[i];
836 expected[i] = expected[sizeof(expected) - 1 - i];
837 expected[sizeof(expected) - 1 - i] = tmp;
838 }
839
840 if (OPENSSL_memcmp(expected, out, sizeof(out))) {
841 fprintf(stderr, "BN_bn2le_padded failed to encode value correctly.\n");
842 hexdump(stderr, "Expected: ", expected, sizeof(expected));
843 hexdump(stderr, "Got: ", out, sizeof(out));
844 return false;
845 }
846
847 // Make sure the decoding produces the same BIGNUM.
848 if (!BN_le2bn(out, bytes, y.get()) ||
849 BN_cmp(x.get(), y.get()) != 0) {
850 bssl::UniquePtr<char> x_hex(BN_bn2hex(x.get())),
851 y_hex(BN_bn2hex(y.get()));
852 if (!x_hex || !y_hex) {
853 return false;
854 }
855 fprintf(stderr, "BN_le2bn failed to decode value correctly.\n");
856 fprintf(stderr, "Expected: %s\n", x_hex.get());
857 hexdump(stderr, "Encoding: ", out, bytes);
858 fprintf(stderr, "Got: %s\n", y_hex.get());
859 return false;
860 }
861 }
862
863 return true;
864}
865
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700866static int DecimalToBIGNUM(bssl::UniquePtr<BIGNUM> *out, const char *in) {
David Benjaminc85573c2015-04-20 19:52:31 -0400867 BIGNUM *raw = NULL;
868 int ret = BN_dec2bn(&raw, in);
869 out->reset(raw);
870 return ret;
871}
872
David Benjamin96f94472016-06-26 17:31:02 -0400873static bool TestDec2BN(BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700874 bssl::UniquePtr<BIGNUM> bn;
David Benjaminc85573c2015-04-20 19:52:31 -0400875 int ret = DecimalToBIGNUM(&bn, "0");
876 if (ret != 1 || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
877 fprintf(stderr, "BN_dec2bn gave a bad result.\n");
878 return false;
879 }
880
881 ret = DecimalToBIGNUM(&bn, "256");
882 if (ret != 3 || !BN_is_word(bn.get(), 256) || BN_is_negative(bn.get())) {
883 fprintf(stderr, "BN_dec2bn gave a bad result.\n");
884 return false;
885 }
886
887 ret = DecimalToBIGNUM(&bn, "-42");
888 if (ret != 3 || !BN_abs_is_word(bn.get(), 42) || !BN_is_negative(bn.get())) {
889 fprintf(stderr, "BN_dec2bn gave a bad result.\n");
890 return false;
891 }
892
893 ret = DecimalToBIGNUM(&bn, "-0");
894 if (ret != 2 || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
895 fprintf(stderr, "BN_dec2bn gave a bad result.\n");
896 return false;
897 }
898
899 ret = DecimalToBIGNUM(&bn, "42trailing garbage is ignored");
900 if (ret != 2 || !BN_abs_is_word(bn.get(), 42) || BN_is_negative(bn.get())) {
901 fprintf(stderr, "BN_dec2bn gave a bad result.\n");
902 return false;
903 }
904
905 return true;
906}
907
David Benjamin96f94472016-06-26 17:31:02 -0400908static bool TestHex2BN(BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700909 bssl::UniquePtr<BIGNUM> bn;
David Benjaminc85573c2015-04-20 19:52:31 -0400910 int ret = HexToBIGNUM(&bn, "0");
911 if (ret != 1 || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
912 fprintf(stderr, "BN_hex2bn gave a bad result.\n");
913 return false;
914 }
915
916 ret = HexToBIGNUM(&bn, "256");
917 if (ret != 3 || !BN_is_word(bn.get(), 0x256) || BN_is_negative(bn.get())) {
918 fprintf(stderr, "BN_hex2bn gave a bad result.\n");
919 return false;
920 }
921
922 ret = HexToBIGNUM(&bn, "-42");
923 if (ret != 3 || !BN_abs_is_word(bn.get(), 0x42) || !BN_is_negative(bn.get())) {
924 fprintf(stderr, "BN_hex2bn gave a bad result.\n");
925 return false;
926 }
927
928 ret = HexToBIGNUM(&bn, "-0");
929 if (ret != 2 || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
930 fprintf(stderr, "BN_hex2bn gave a bad result.\n");
931 return false;
932 }
933
934 ret = HexToBIGNUM(&bn, "abctrailing garbage is ignored");
935 if (ret != 3 || !BN_is_word(bn.get(), 0xabc) || BN_is_negative(bn.get())) {
936 fprintf(stderr, "BN_hex2bn gave a bad result.\n");
937 return false;
938 }
939
940 return true;
941}
942
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700943static bssl::UniquePtr<BIGNUM> ASCIIToBIGNUM(const char *in) {
David Benjaminc85573c2015-04-20 19:52:31 -0400944 BIGNUM *raw = NULL;
945 if (!BN_asc2bn(&raw, in)) {
946 return nullptr;
947 }
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700948 return bssl::UniquePtr<BIGNUM>(raw);
David Benjaminc85573c2015-04-20 19:52:31 -0400949}
950
David Benjamin96f94472016-06-26 17:31:02 -0400951static bool TestASC2BN(BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700952 bssl::UniquePtr<BIGNUM> bn = ASCIIToBIGNUM("0");
David Benjaminc85573c2015-04-20 19:52:31 -0400953 if (!bn || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
954 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
955 return false;
956 }
957
958 bn = ASCIIToBIGNUM("256");
959 if (!bn || !BN_is_word(bn.get(), 256) || BN_is_negative(bn.get())) {
960 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
961 return false;
962 }
963
964 bn = ASCIIToBIGNUM("-42");
965 if (!bn || !BN_abs_is_word(bn.get(), 42) || !BN_is_negative(bn.get())) {
966 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
967 return false;
968 }
969
970 bn = ASCIIToBIGNUM("0x1234");
971 if (!bn || !BN_is_word(bn.get(), 0x1234) || BN_is_negative(bn.get())) {
972 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
973 return false;
974 }
975
976 bn = ASCIIToBIGNUM("0X1234");
977 if (!bn || !BN_is_word(bn.get(), 0x1234) || BN_is_negative(bn.get())) {
978 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
979 return false;
980 }
981
982 bn = ASCIIToBIGNUM("-0xabcd");
983 if (!bn || !BN_abs_is_word(bn.get(), 0xabcd) || !BN_is_negative(bn.get())) {
984 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
985 return false;
986 }
987
988 bn = ASCIIToBIGNUM("-0");
989 if (!bn || !BN_is_zero(bn.get()) || BN_is_negative(bn.get())) {
990 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
991 return false;
992 }
993
994 bn = ASCIIToBIGNUM("123trailing garbage is ignored");
995 if (!bn || !BN_is_word(bn.get(), 123) || BN_is_negative(bn.get())) {
996 fprintf(stderr, "BN_asc2bn gave a bad result.\n");
997 return false;
998 }
999
1000 return true;
1001}
David Benjaminb3a7b512015-05-26 18:35:28 -04001002
Matt Braithwaite64887252015-08-11 17:17:28 -07001003struct MPITest {
1004 const char *base10;
1005 const char *mpi;
1006 size_t mpi_len;
1007};
1008
1009static const MPITest kMPITests[] = {
1010 { "0", "\x00\x00\x00\x00", 4 },
1011 { "1", "\x00\x00\x00\x01\x01", 5 },
1012 { "-1", "\x00\x00\x00\x01\x81", 5 },
1013 { "128", "\x00\x00\x00\x02\x00\x80", 6 },
1014 { "256", "\x00\x00\x00\x02\x01\x00", 6 },
1015 { "-256", "\x00\x00\x00\x02\x81\x00", 6 },
1016};
1017
David Benjamin96f94472016-06-26 17:31:02 -04001018static bool TestMPI() {
Matt Braithwaite64887252015-08-11 17:17:28 -07001019 uint8_t scratch[8];
1020
Steven Valdezcb966542016-08-17 16:56:14 -04001021 for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kMPITests); i++) {
Matt Braithwaite64887252015-08-11 17:17:28 -07001022 const MPITest &test = kMPITests[i];
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001023 bssl::UniquePtr<BIGNUM> bn(ASCIIToBIGNUM(test.base10));
David Benjamin08387212016-09-29 20:18:38 -04001024 if (!bn) {
1025 return false;
1026 }
1027
Matt Braithwaite64887252015-08-11 17:17:28 -07001028 const size_t mpi_len = BN_bn2mpi(bn.get(), NULL);
1029 if (mpi_len > sizeof(scratch)) {
1030 fprintf(stderr, "MPI test #%u: MPI size is too large to test.\n",
1031 (unsigned)i);
1032 return false;
1033 }
1034
1035 const size_t mpi_len2 = BN_bn2mpi(bn.get(), scratch);
1036 if (mpi_len != mpi_len2) {
1037 fprintf(stderr, "MPI test #%u: length changes.\n", (unsigned)i);
1038 return false;
1039 }
1040
1041 if (mpi_len != test.mpi_len ||
David Benjamin17cf2cb2016-12-13 01:07:13 -05001042 OPENSSL_memcmp(test.mpi, scratch, mpi_len) != 0) {
Matt Braithwaite64887252015-08-11 17:17:28 -07001043 fprintf(stderr, "MPI test #%u failed:\n", (unsigned)i);
1044 hexdump(stderr, "Expected: ", test.mpi, test.mpi_len);
1045 hexdump(stderr, "Got: ", scratch, mpi_len);
1046 return false;
1047 }
1048
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001049 bssl::UniquePtr<BIGNUM> bn2(BN_mpi2bn(scratch, mpi_len, NULL));
Matt Braithwaite64887252015-08-11 17:17:28 -07001050 if (bn2.get() == nullptr) {
1051 fprintf(stderr, "MPI test #%u: failed to parse\n", (unsigned)i);
1052 return false;
1053 }
1054
1055 if (BN_cmp(bn.get(), bn2.get()) != 0) {
1056 fprintf(stderr, "MPI test #%u: wrong result\n", (unsigned)i);
1057 return false;
1058 }
1059 }
1060
1061 return true;
1062}
1063
David Benjamin96f94472016-06-26 17:31:02 -04001064static bool TestRand() {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001065 bssl::UniquePtr<BIGNUM> bn(BN_new());
David Benjaminb3a7b512015-05-26 18:35:28 -04001066 if (!bn) {
1067 return false;
1068 }
1069
1070 // Test BN_rand accounts for degenerate cases with |top| and |bottom|
1071 // parameters.
David Benjamind224d522016-08-16 10:03:45 -04001072 if (!BN_rand(bn.get(), 0, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001073 !BN_is_zero(bn.get())) {
1074 fprintf(stderr, "BN_rand gave a bad result.\n");
1075 return false;
1076 }
David Benjamind224d522016-08-16 10:03:45 -04001077 if (!BN_rand(bn.get(), 0, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ODD) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001078 !BN_is_zero(bn.get())) {
1079 fprintf(stderr, "BN_rand gave a bad result.\n");
1080 return false;
1081 }
1082
David Benjamind224d522016-08-16 10:03:45 -04001083 if (!BN_rand(bn.get(), 1, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001084 !BN_is_word(bn.get(), 1)) {
1085 fprintf(stderr, "BN_rand gave a bad result.\n");
1086 return false;
1087 }
David Benjamind224d522016-08-16 10:03:45 -04001088 if (!BN_rand(bn.get(), 1, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ANY) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001089 !BN_is_word(bn.get(), 1)) {
1090 fprintf(stderr, "BN_rand gave a bad result.\n");
1091 return false;
1092 }
David Benjamind224d522016-08-16 10:03:45 -04001093 if (!BN_rand(bn.get(), 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ODD) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001094 !BN_is_word(bn.get(), 1)) {
1095 fprintf(stderr, "BN_rand gave a bad result.\n");
1096 return false;
1097 }
1098
David Benjamind224d522016-08-16 10:03:45 -04001099 if (!BN_rand(bn.get(), 2, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ANY) ||
David Benjaminb3a7b512015-05-26 18:35:28 -04001100 !BN_is_word(bn.get(), 3)) {
1101 fprintf(stderr, "BN_rand gave a bad result.\n");
1102 return false;
1103 }
1104
1105 return true;
1106}
David Benjaminb9c579d2015-06-11 22:52:07 -04001107
David Benjaminbc6a76b2017-04-13 16:43:43 -04001108static bool TestRandRange() {
1109 bssl::UniquePtr<BIGNUM> bn(BN_new()), six(BN_new());
1110 if (!bn || !six ||
1111 !BN_set_word(six.get(), 6)) {
1112 return false;
1113 }
1114
1115 // Generate 1,000 random numbers and ensure they all stay in range. This check
1116 // may flakily pass when it should have failed but will not flakily fail.
1117 bool seen[6] = {false, false, false, false, false};
1118 for (unsigned i = 0; i < 1000; i++) {
1119 if (!BN_rand_range_ex(bn.get(), 1, six.get())) {
1120 return false;
1121 }
1122
1123 BN_ULONG word = BN_get_word(bn.get());
1124 if (BN_is_negative(bn.get()) ||
1125 word < 1 ||
1126 word >= 6) {
1127 fprintf(stderr,
1128 "BN_rand_range_ex generated invalid value: " BN_DEC_FMT1 "\n",
1129 word);
1130 return false;
1131 }
1132
1133 seen[word] = true;
1134 }
1135
1136 // Test that all numbers were accounted for. Note this test is probabilistic
1137 // and may flakily fail when it should have passed. As an upper-bound on the
1138 // failure probability, we'll never see any one number with probability
1139 // (4/5)^1000, so the probability of failure is at most 5*(4/5)^1000. This is
1140 // around 1 in 2^320.
1141 for (unsigned i = 1; i < 6; i++) {
1142 if (!seen[i]) {
1143 fprintf(stderr, "BN_rand_range failed to generate %u.\n", i);
1144 return false;
1145 }
1146 }
1147
1148 return true;
1149}
1150
David Benjaminb9c579d2015-06-11 22:52:07 -04001151struct ASN1Test {
1152 const char *value_ascii;
1153 const char *der;
1154 size_t der_len;
1155};
1156
1157static const ASN1Test kASN1Tests[] = {
1158 {"0", "\x02\x01\x00", 3},
1159 {"1", "\x02\x01\x01", 3},
1160 {"127", "\x02\x01\x7f", 3},
1161 {"128", "\x02\x02\x00\x80", 4},
1162 {"0xdeadbeef", "\x02\x05\x00\xde\xad\xbe\xef", 7},
1163 {"0x0102030405060708",
1164 "\x02\x08\x01\x02\x03\x04\x05\x06\x07\x08", 10},
1165 {"0xffffffffffffffff",
1166 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff", 11},
1167};
1168
1169struct ASN1InvalidTest {
1170 const char *der;
1171 size_t der_len;
1172};
1173
1174static const ASN1InvalidTest kASN1InvalidTests[] = {
1175 // Bad tag.
1176 {"\x03\x01\x00", 3},
1177 // Empty contents.
1178 {"\x02\x00", 2},
David Benjaminb9c579d2015-06-11 22:52:07 -04001179};
1180
Adam Langleydd31c4e2016-02-02 08:49:30 -08001181// kASN1BuggyTests contains incorrect encodings and the corresponding, expected
1182// results of |BN_parse_asn1_unsigned_buggy| given that input.
David Benjamin4c60d352015-09-23 12:23:01 -04001183static const ASN1Test kASN1BuggyTests[] = {
1184 // Negative numbers.
David Benjamin231cb822015-09-15 16:47:35 -04001185 {"128", "\x02\x01\x80", 3},
1186 {"255", "\x02\x01\xff", 3},
David Benjamin4c60d352015-09-23 12:23:01 -04001187 // Unnecessary leading zeros.
1188 {"1", "\x02\x02\x00\x01", 4},
David Benjamin231cb822015-09-15 16:47:35 -04001189};
1190
David Benjamin96f94472016-06-26 17:31:02 -04001191static bool TestASN1() {
David Benjaminb9c579d2015-06-11 22:52:07 -04001192 for (const ASN1Test &test : kASN1Tests) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001193 bssl::UniquePtr<BIGNUM> bn = ASCIIToBIGNUM(test.value_ascii);
David Benjaminb9c579d2015-06-11 22:52:07 -04001194 if (!bn) {
1195 return false;
1196 }
1197
1198 // Test that the input is correctly parsed.
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001199 bssl::UniquePtr<BIGNUM> bn2(BN_new());
David Benjaminb9c579d2015-06-11 22:52:07 -04001200 if (!bn2) {
1201 return false;
1202 }
1203 CBS cbs;
1204 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001205 if (!BN_parse_asn1_unsigned(&cbs, bn2.get()) || CBS_len(&cbs) != 0) {
David Benjaminb9c579d2015-06-11 22:52:07 -04001206 fprintf(stderr, "Parsing ASN.1 INTEGER failed.\n");
1207 return false;
1208 }
1209 if (BN_cmp(bn.get(), bn2.get()) != 0) {
1210 fprintf(stderr, "Bad parse.\n");
1211 return false;
1212 }
1213
1214 // Test the value serializes correctly.
David Benjamina7f56f02016-10-23 13:05:02 -04001215 bssl::ScopedCBB cbb;
David Benjaminb9c579d2015-06-11 22:52:07 -04001216 uint8_t *der;
1217 size_t der_len;
David Benjamina7f56f02016-10-23 13:05:02 -04001218 if (!CBB_init(cbb.get(), 0) ||
1219 !BN_marshal_asn1(cbb.get(), bn.get()) ||
1220 !CBB_finish(cbb.get(), &der, &der_len)) {
David Benjaminb9c579d2015-06-11 22:52:07 -04001221 return false;
1222 }
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001223 bssl::UniquePtr<uint8_t> delete_der(der);
David Benjaminb9c579d2015-06-11 22:52:07 -04001224 if (der_len != test.der_len ||
David Benjamin17cf2cb2016-12-13 01:07:13 -05001225 OPENSSL_memcmp(der, reinterpret_cast<const uint8_t *>(test.der),
1226 der_len) != 0) {
David Benjaminb9c579d2015-06-11 22:52:07 -04001227 fprintf(stderr, "Bad serialization.\n");
1228 return false;
1229 }
David Benjamin231cb822015-09-15 16:47:35 -04001230
Adam Langleydd31c4e2016-02-02 08:49:30 -08001231 // |BN_parse_asn1_unsigned_buggy| parses all valid input.
David Benjamin231cb822015-09-15 16:47:35 -04001232 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001233 if (!BN_parse_asn1_unsigned_buggy(&cbs, bn2.get()) || CBS_len(&cbs) != 0) {
David Benjamin231cb822015-09-15 16:47:35 -04001234 fprintf(stderr, "Parsing ASN.1 INTEGER failed.\n");
1235 return false;
1236 }
1237 if (BN_cmp(bn.get(), bn2.get()) != 0) {
1238 fprintf(stderr, "Bad parse.\n");
1239 return false;
1240 }
David Benjaminb9c579d2015-06-11 22:52:07 -04001241 }
1242
1243 for (const ASN1InvalidTest &test : kASN1InvalidTests) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001244 bssl::UniquePtr<BIGNUM> bn(BN_new());
David Benjaminb9c579d2015-06-11 22:52:07 -04001245 if (!bn) {
1246 return false;
1247 }
1248 CBS cbs;
1249 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001250 if (BN_parse_asn1_unsigned(&cbs, bn.get())) {
David Benjaminb9c579d2015-06-11 22:52:07 -04001251 fprintf(stderr, "Parsed invalid input.\n");
1252 return false;
1253 }
1254 ERR_clear_error();
David Benjamin231cb822015-09-15 16:47:35 -04001255
1256 // All tests in kASN1InvalidTests are also rejected by
Adam Langleydd31c4e2016-02-02 08:49:30 -08001257 // |BN_parse_asn1_unsigned_buggy|.
David Benjamin231cb822015-09-15 16:47:35 -04001258 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001259 if (BN_parse_asn1_unsigned_buggy(&cbs, bn.get())) {
David Benjamin231cb822015-09-15 16:47:35 -04001260 fprintf(stderr, "Parsed invalid input.\n");
1261 return false;
1262 }
1263 ERR_clear_error();
1264 }
1265
David Benjamin4c60d352015-09-23 12:23:01 -04001266 for (const ASN1Test &test : kASN1BuggyTests) {
Adam Langleydd31c4e2016-02-02 08:49:30 -08001267 // These broken encodings are rejected by |BN_parse_asn1_unsigned|.
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001268 bssl::UniquePtr<BIGNUM> bn(BN_new());
David Benjamin231cb822015-09-15 16:47:35 -04001269 if (!bn) {
1270 return false;
1271 }
1272
1273 CBS cbs;
1274 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001275 if (BN_parse_asn1_unsigned(&cbs, bn.get())) {
David Benjamin231cb822015-09-15 16:47:35 -04001276 fprintf(stderr, "Parsed invalid input.\n");
1277 return false;
1278 }
1279 ERR_clear_error();
1280
Adam Langleydd31c4e2016-02-02 08:49:30 -08001281 // However |BN_parse_asn1_unsigned_buggy| accepts them.
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001282 bssl::UniquePtr<BIGNUM> bn2 = ASCIIToBIGNUM(test.value_ascii);
David Benjamin231cb822015-09-15 16:47:35 -04001283 if (!bn2) {
1284 return false;
1285 }
1286
1287 CBS_init(&cbs, reinterpret_cast<const uint8_t*>(test.der), test.der_len);
David Benjaminacb24512015-12-22 15:02:01 -05001288 if (!BN_parse_asn1_unsigned_buggy(&cbs, bn.get()) || CBS_len(&cbs) != 0) {
David Benjamin231cb822015-09-15 16:47:35 -04001289 fprintf(stderr, "Parsing (invalid) ASN.1 INTEGER failed.\n");
1290 return false;
1291 }
1292
1293 if (BN_cmp(bn.get(), bn2.get()) != 0) {
1294 fprintf(stderr, "\"Bad\" parse.\n");
1295 return false;
1296 }
David Benjaminb9c579d2015-06-11 22:52:07 -04001297 }
1298
1299 // Serializing negative numbers is not supported.
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001300 bssl::UniquePtr<BIGNUM> bn = ASCIIToBIGNUM("-1");
David Benjaminb9c579d2015-06-11 22:52:07 -04001301 if (!bn) {
1302 return false;
1303 }
David Benjamina7f56f02016-10-23 13:05:02 -04001304 bssl::ScopedCBB cbb;
1305 if (!CBB_init(cbb.get(), 0) ||
1306 BN_marshal_asn1(cbb.get(), bn.get())) {
David Benjaminb9c579d2015-06-11 22:52:07 -04001307 fprintf(stderr, "Serialized negative number.\n");
David Benjaminb9c579d2015-06-11 22:52:07 -04001308 return false;
1309 }
David Benjamin8b66fef2016-06-26 17:58:55 -04001310 ERR_clear_error();
David Benjaminb9c579d2015-06-11 22:52:07 -04001311
1312 return true;
1313}
David Benjamincca1c112016-06-26 17:28:55 -04001314
David Benjamin8b66fef2016-06-26 17:58:55 -04001315static bool TestNegativeZero(BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001316 bssl::UniquePtr<BIGNUM> a(BN_new());
1317 bssl::UniquePtr<BIGNUM> b(BN_new());
1318 bssl::UniquePtr<BIGNUM> c(BN_new());
David Benjamin899b9b12016-08-02 13:09:19 -04001319 if (!a || !b || !c) {
David Benjamincca1c112016-06-26 17:28:55 -04001320 return false;
1321 }
1322
1323 // Test that BN_mul never gives negative zero.
1324 if (!BN_set_word(a.get(), 1)) {
1325 return false;
1326 }
1327 BN_set_negative(a.get(), 1);
1328 BN_zero(b.get());
David Benjamin8b66fef2016-06-26 17:58:55 -04001329 if (!BN_mul(c.get(), a.get(), b.get(), ctx)) {
David Benjamincca1c112016-06-26 17:28:55 -04001330 return false;
1331 }
1332 if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001333 fprintf(stderr, "Multiplication test failed.\n");
David Benjamincca1c112016-06-26 17:28:55 -04001334 return false;
1335 }
1336
Brian Smith9f05de42016-08-02 18:21:18 -10001337 bssl::UniquePtr<BIGNUM> numerator(BN_new()), denominator(BN_new());
1338 if (!numerator || !denominator) {
1339 return false;
1340 }
David Benjamin8b66fef2016-06-26 17:58:55 -04001341
Brian Smith9f05de42016-08-02 18:21:18 -10001342 // Test that BN_div never gives negative zero in the quotient.
1343 if (!BN_set_word(numerator.get(), 1) ||
1344 !BN_set_word(denominator.get(), 2)) {
1345 return false;
1346 }
1347 BN_set_negative(numerator.get(), 1);
1348 if (!BN_div(a.get(), b.get(), numerator.get(), denominator.get(), ctx)) {
1349 return false;
1350 }
1351 if (!BN_is_zero(a.get()) || BN_is_negative(a.get())) {
1352 fprintf(stderr, "Incorrect quotient.\n");
1353 return false;
1354 }
David Benjamin899b9b12016-08-02 13:09:19 -04001355
Brian Smith9f05de42016-08-02 18:21:18 -10001356 // Test that BN_div never gives negative zero in the remainder.
1357 if (!BN_set_word(denominator.get(), 1)) {
1358 return false;
1359 }
1360 if (!BN_div(a.get(), b.get(), numerator.get(), denominator.get(), ctx)) {
1361 return false;
1362 }
1363 if (!BN_is_zero(b.get()) || BN_is_negative(b.get())) {
1364 fprintf(stderr, "Incorrect remainder.\n");
1365 return false;
David Benjamin2b314fa2016-08-02 12:49:38 -04001366 }
1367
1368 // Test that BN_set_negative will not produce a negative zero.
1369 BN_zero(a.get());
1370 BN_set_negative(a.get(), 1);
1371 if (BN_is_negative(a.get())) {
1372 fprintf(stderr, "BN_set_negative produced a negative zero.\n");
1373 return false;
1374 }
1375
1376 // Test that forcibly creating a negative zero does not break |BN_bn2hex| or
1377 // |BN_bn2dec|.
1378 a->neg = 1;
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001379 bssl::UniquePtr<char> dec(BN_bn2dec(a.get()));
1380 bssl::UniquePtr<char> hex(BN_bn2hex(a.get()));
David Benjamin2b314fa2016-08-02 12:49:38 -04001381 if (!dec || !hex ||
1382 strcmp(dec.get(), "-0") != 0 ||
1383 strcmp(hex.get(), "-0") != 0) {
1384 fprintf(stderr, "BN_bn2dec or BN_bn2hex failed with negative zero.\n");
David Benjamin8b66fef2016-06-26 17:58:55 -04001385 return false;
1386 }
1387
David Benjamin4008c7a2016-11-16 22:56:39 +09001388 // Test that |BN_rshift| and |BN_rshift1| will not produce a negative zero.
1389 if (!BN_set_word(a.get(), 1)) {
1390 return false;
1391 }
1392
1393 BN_set_negative(a.get(), 1);
1394 if (!BN_rshift(b.get(), a.get(), 1) ||
1395 !BN_rshift1(c.get(), a.get())) {
1396 return false;
1397 }
1398
1399 if (!BN_is_zero(b.get()) || BN_is_negative(b.get())) {
1400 fprintf(stderr, "BN_rshift(-1, 1) produced the wrong result.\n");
1401 return false;
1402 }
1403
1404 if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) {
1405 fprintf(stderr, "BN_rshift1(-1) produced the wrong result.\n");
1406 return false;
1407 }
1408
1409 // Test that |BN_div_word| will not produce a negative zero.
1410 if (BN_div_word(a.get(), 2) == (BN_ULONG)-1) {
1411 return false;
1412 }
1413
1414 if (!BN_is_zero(a.get()) || BN_is_negative(a.get())) {
1415 fprintf(stderr, "BN_div_word(-1, 2) produced the wrong result.\n");
1416 return false;
1417 }
1418
David Benjamin8b66fef2016-06-26 17:58:55 -04001419 return true;
1420}
1421
David Benjamindcc55312016-06-26 18:15:12 -04001422static bool TestBadModulus(BN_CTX *ctx) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001423 bssl::UniquePtr<BIGNUM> a(BN_new());
1424 bssl::UniquePtr<BIGNUM> b(BN_new());
1425 bssl::UniquePtr<BIGNUM> zero(BN_new());
1426 bssl::UniquePtr<BN_MONT_CTX> mont(BN_MONT_CTX_new());
David Benjamindcc55312016-06-26 18:15:12 -04001427 if (!a || !b || !zero || !mont) {
David Benjamin8b66fef2016-06-26 17:58:55 -04001428 return false;
1429 }
1430
1431 BN_zero(zero.get());
1432
1433 if (BN_div(a.get(), b.get(), BN_value_one(), zero.get(), ctx)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001434 fprintf(stderr, "Division by zero unexpectedly succeeded.\n");
David Benjamin8b66fef2016-06-26 17:58:55 -04001435 return false;
1436 }
1437 ERR_clear_error();
1438
David Benjamindcc55312016-06-26 18:15:12 -04001439 if (BN_mod_mul(a.get(), BN_value_one(), BN_value_one(), zero.get(), ctx)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001440 fprintf(stderr, "BN_mod_mul with zero modulus unexpectedly succeeded.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001441 return false;
1442 }
1443 ERR_clear_error();
1444
1445 if (BN_mod_exp(a.get(), BN_value_one(), BN_value_one(), zero.get(), ctx)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001446 fprintf(stderr, "BN_mod_exp with zero modulus unexpectedly succeeded.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001447 return 0;
1448 }
1449 ERR_clear_error();
1450
Brian Smithb72f66f2016-07-01 11:34:10 -10001451 if (BN_mod_exp_mont(a.get(), BN_value_one(), BN_value_one(), zero.get(), ctx,
1452 NULL)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001453 fprintf(stderr,
1454 "BN_mod_exp_mont with zero modulus unexpectedly succeeded.\n");
Brian Smithb72f66f2016-07-01 11:34:10 -10001455 return 0;
1456 }
1457 ERR_clear_error();
1458
David Benjamindcc55312016-06-26 18:15:12 -04001459 if (BN_mod_exp_mont_consttime(a.get(), BN_value_one(), BN_value_one(),
1460 zero.get(), ctx, nullptr)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001461 fprintf(stderr,
1462 "BN_mod_exp_mont_consttime with zero modulus unexpectedly "
1463 "succeeded.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001464 return 0;
1465 }
1466 ERR_clear_error();
1467
1468 if (BN_MONT_CTX_set(mont.get(), zero.get(), ctx)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001469 fprintf(stderr,
1470 "BN_MONT_CTX_set unexpectedly succeeded for zero modulus.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001471 return false;
1472 }
1473 ERR_clear_error();
1474
1475 // Some operations also may not be used with an even modulus.
1476
1477 if (!BN_set_word(b.get(), 16)) {
1478 return false;
1479 }
1480
1481 if (BN_MONT_CTX_set(mont.get(), b.get(), ctx)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001482 fprintf(stderr,
1483 "BN_MONT_CTX_set unexpectedly succeeded for even modulus.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001484 return false;
1485 }
1486 ERR_clear_error();
1487
Brian Smithb72f66f2016-07-01 11:34:10 -10001488 if (BN_mod_exp_mont(a.get(), BN_value_one(), BN_value_one(), b.get(), ctx,
1489 NULL)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001490 fprintf(stderr,
1491 "BN_mod_exp_mont with even modulus unexpectedly succeeded.\n");
Brian Smithb72f66f2016-07-01 11:34:10 -10001492 return 0;
1493 }
1494 ERR_clear_error();
1495
David Benjamindcc55312016-06-26 18:15:12 -04001496 if (BN_mod_exp_mont_consttime(a.get(), BN_value_one(), BN_value_one(),
1497 b.get(), ctx, nullptr)) {
David Benjamin2b314fa2016-08-02 12:49:38 -04001498 fprintf(stderr,
1499 "BN_mod_exp_mont_consttime with even modulus unexpectedly "
1500 "succeeded.\n");
David Benjamindcc55312016-06-26 18:15:12 -04001501 return 0;
1502 }
1503 ERR_clear_error();
1504
David Benjamincca1c112016-06-26 17:28:55 -04001505 return true;
1506}
David Benjamin32a37802016-06-26 18:17:31 -04001507
1508// TestExpModZero tests that 1**0 mod 1 == 0.
1509static bool TestExpModZero() {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001510 bssl::UniquePtr<BIGNUM> zero(BN_new()), a(BN_new()), r(BN_new());
David Benjamind224d522016-08-16 10:03:45 -04001511 if (!zero || !a || !r ||
1512 !BN_rand(a.get(), 1024, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY)) {
David Benjamin32a37802016-06-26 18:17:31 -04001513 return false;
1514 }
1515 BN_zero(zero.get());
1516
1517 if (!BN_mod_exp(r.get(), a.get(), zero.get(), BN_value_one(), nullptr) ||
1518 !BN_is_zero(r.get()) ||
1519 !BN_mod_exp_mont(r.get(), a.get(), zero.get(), BN_value_one(), nullptr,
1520 nullptr) ||
1521 !BN_is_zero(r.get()) ||
1522 !BN_mod_exp_mont_consttime(r.get(), a.get(), zero.get(), BN_value_one(),
1523 nullptr, nullptr) ||
1524 !BN_is_zero(r.get()) ||
1525 !BN_mod_exp_mont_word(r.get(), 42, zero.get(), BN_value_one(), nullptr,
1526 nullptr) ||
1527 !BN_is_zero(r.get())) {
1528 return false;
1529 }
1530
1531 return true;
1532}
1533
1534static bool TestSmallPrime(BN_CTX *ctx) {
1535 static const unsigned kBits = 10;
1536
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001537 bssl::UniquePtr<BIGNUM> r(BN_new());
David Benjamin32a37802016-06-26 18:17:31 -04001538 if (!r || !BN_generate_prime_ex(r.get(), static_cast<int>(kBits), 0, NULL,
1539 NULL, NULL)) {
1540 return false;
1541 }
1542 if (BN_num_bits(r.get()) != kBits) {
1543 fprintf(stderr, "Expected %u bit prime, got %u bit number\n", kBits,
1544 BN_num_bits(r.get()));
1545 return false;
1546 }
1547
1548 return true;
1549}
David Benjamin47489442016-07-09 15:22:50 -07001550
David Benjaminccd511e2016-07-29 12:11:34 -04001551static bool TestCmpWord() {
1552 static const BN_ULONG kMaxWord = (BN_ULONG)-1;
1553
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001554 bssl::UniquePtr<BIGNUM> r(BN_new());
David Benjaminccd511e2016-07-29 12:11:34 -04001555 if (!r ||
1556 !BN_set_word(r.get(), 0)) {
1557 return false;
1558 }
1559
1560 if (BN_cmp_word(r.get(), 0) != 0 ||
1561 BN_cmp_word(r.get(), 1) >= 0 ||
1562 BN_cmp_word(r.get(), kMaxWord) >= 0) {
1563 fprintf(stderr, "BN_cmp_word compared against 0 incorrectly.\n");
1564 return false;
1565 }
1566
1567 if (!BN_set_word(r.get(), 100)) {
1568 return false;
1569 }
1570
1571 if (BN_cmp_word(r.get(), 0) <= 0 ||
1572 BN_cmp_word(r.get(), 99) <= 0 ||
1573 BN_cmp_word(r.get(), 100) != 0 ||
1574 BN_cmp_word(r.get(), 101) >= 0 ||
1575 BN_cmp_word(r.get(), kMaxWord) >= 0) {
1576 fprintf(stderr, "BN_cmp_word compared against 100 incorrectly.\n");
1577 return false;
1578 }
1579
1580 BN_set_negative(r.get(), 1);
1581
1582 if (BN_cmp_word(r.get(), 0) >= 0 ||
1583 BN_cmp_word(r.get(), 100) >= 0 ||
1584 BN_cmp_word(r.get(), kMaxWord) >= 0) {
1585 fprintf(stderr, "BN_cmp_word compared against -100 incorrectly.\n");
1586 return false;
1587 }
1588
1589 if (!BN_set_word(r.get(), kMaxWord)) {
1590 return false;
1591 }
1592
1593 if (BN_cmp_word(r.get(), 0) <= 0 ||
1594 BN_cmp_word(r.get(), kMaxWord - 1) <= 0 ||
1595 BN_cmp_word(r.get(), kMaxWord) != 0) {
1596 fprintf(stderr, "BN_cmp_word compared against kMaxWord incorrectly.\n");
1597 return false;
1598 }
1599
1600 if (!BN_add(r.get(), r.get(), BN_value_one())) {
1601 return false;
1602 }
1603
1604 if (BN_cmp_word(r.get(), 0) <= 0 ||
1605 BN_cmp_word(r.get(), kMaxWord) <= 0) {
1606 fprintf(stderr, "BN_cmp_word compared against kMaxWord + 1 incorrectly.\n");
1607 return false;
1608 }
1609
1610 BN_set_negative(r.get(), 1);
1611
1612 if (BN_cmp_word(r.get(), 0) >= 0 ||
1613 BN_cmp_word(r.get(), kMaxWord) >= 0) {
1614 fprintf(stderr,
1615 "BN_cmp_word compared against -kMaxWord - 1 incorrectly.\n");
1616 return false;
1617 }
1618
1619 return true;
1620}
1621
David Benjamin7c040752016-08-22 22:19:01 -07001622static bool TestBN2Dec() {
1623 static const char *kBN2DecTests[] = {
1624 "0",
1625 "1",
1626 "-1",
1627 "100",
1628 "-100",
1629 "123456789012345678901234567890",
1630 "-123456789012345678901234567890",
1631 "123456789012345678901234567890123456789012345678901234567890",
1632 "-123456789012345678901234567890123456789012345678901234567890",
1633 };
1634
1635 for (const char *test : kBN2DecTests) {
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001636 bssl::UniquePtr<BIGNUM> bn;
David Benjamin7c040752016-08-22 22:19:01 -07001637 int ret = DecimalToBIGNUM(&bn, test);
1638 if (ret == 0) {
1639 return false;
1640 }
1641
Matt Braithwaited17d74d2016-08-17 20:10:28 -07001642 bssl::UniquePtr<char> dec(BN_bn2dec(bn.get()));
David Benjamin7c040752016-08-22 22:19:01 -07001643 if (!dec) {
1644 fprintf(stderr, "BN_bn2dec failed on %s.\n", test);
1645 return false;
1646 }
1647
1648 if (strcmp(dec.get(), test) != 0) {
1649 fprintf(stderr, "BN_bn2dec gave %s, wanted %s.\n", dec.get(), test);
1650 return false;
1651 }
1652 }
1653
1654 return true;
1655}
1656
Rob Sloan2ee1edf2016-12-15 16:28:44 -08001657static bool TestBNSetGetU64() {
David Benjamin40a63112016-08-23 20:53:12 -07001658 static const struct {
1659 const char *hex;
1660 uint64_t value;
1661 } kU64Tests[] = {
1662 {"0", UINT64_C(0x0)},
1663 {"1", UINT64_C(0x1)},
1664 {"ffffffff", UINT64_C(0xffffffff)},
1665 {"100000000", UINT64_C(0x100000000)},
1666 {"ffffffffffffffff", UINT64_C(0xffffffffffffffff)},
1667 };
1668
1669 for (const auto& test : kU64Tests) {
1670 bssl::UniquePtr<BIGNUM> bn(BN_new()), expected;
1671 if (!bn ||
1672 !BN_set_u64(bn.get(), test.value) ||
1673 !HexToBIGNUM(&expected, test.hex) ||
1674 BN_cmp(bn.get(), expected.get()) != 0) {
1675 fprintf(stderr, "BN_set_u64 test failed for 0x%s.\n", test.hex);
1676 ERR_print_errors_fp(stderr);
1677 return false;
1678 }
Rob Sloan2ee1edf2016-12-15 16:28:44 -08001679
1680 uint64_t tmp;
1681 if (!BN_get_u64(bn.get(), &tmp) || tmp != test.value) {
1682 fprintf(stderr, "BN_get_u64 test failed for 0x%s.\n", test.hex);
1683 return false;
1684 }
1685
1686 BN_set_negative(bn.get(), 1);
1687 if (!BN_get_u64(bn.get(), &tmp) || tmp != test.value) {
1688 fprintf(stderr, "BN_get_u64 test failed for -0x%s.\n", test.hex);
1689 return false;
1690 }
1691 }
1692
1693 // Test that BN_get_u64 fails on large numbers.
1694 bssl::UniquePtr<BIGNUM> bn(BN_new());
1695 if (!BN_lshift(bn.get(), BN_value_one(), 64)) {
1696 return false;
1697 }
1698
1699 uint64_t tmp;
1700 if (BN_get_u64(bn.get(), &tmp)) {
1701 fprintf(stderr, "BN_get_u64 of 2^64 unexpectedly succeeded.\n");
1702 return false;
1703 }
1704
1705 BN_set_negative(bn.get(), 1);
1706 if (BN_get_u64(bn.get(), &tmp)) {
1707 fprintf(stderr, "BN_get_u64 of -2^64 unexpectedly succeeded.\n");
1708 return false;
David Benjamin40a63112016-08-23 20:53:12 -07001709 }
1710
1711 return true;
1712}
1713
Rob Sloanb9873552017-01-30 11:52:27 -08001714static bool TestBNPow2(BN_CTX *ctx) {
1715 bssl::UniquePtr<BIGNUM>
1716 power_of_two(BN_new()),
1717 random(BN_new()),
1718 expected(BN_new()),
1719 actual(BN_new());
1720
1721 if (!power_of_two.get() ||
1722 !random.get() ||
1723 !expected.get() ||
1724 !actual.get()) {
1725 return false;
1726 }
1727
1728 // Choose an exponent.
1729 for (size_t e = 3; e < 512; e += 11) {
1730 // Choose a bit length for our randoms.
1731 for (int len = 3; len < 512; len += 23) {
1732 // Set power_of_two = 2^e.
1733 if (!BN_lshift(power_of_two.get(), BN_value_one(), (int) e)) {
1734 fprintf(stderr, "Failed to shiftl.\n");
1735 return false;
1736 }
1737
1738 // Test BN_is_pow2 on power_of_two.
1739 if (!BN_is_pow2(power_of_two.get())) {
1740 fprintf(stderr, "BN_is_pow2 returned false for a power of two.\n");
1741 hexdump(stderr, "Arg: ", power_of_two->d,
1742 power_of_two->top * sizeof(BN_ULONG));
1743 return false;
1744 }
1745
1746 // Pick a large random value, ensuring it isn't a power of two.
1747 if (!BN_rand(random.get(), len, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ANY)) {
1748 fprintf(stderr, "Failed to generate random in TestBNPow2.\n");
1749 return false;
1750 }
1751
1752 // Test BN_is_pow2 on |r|.
1753 if (BN_is_pow2(random.get())) {
1754 fprintf(stderr, "BN_is_pow2 returned true for a non-power of two.\n");
1755 hexdump(stderr, "Arg: ", random->d, random->top * sizeof(BN_ULONG));
1756 return false;
1757 }
1758
1759 // Test BN_mod_pow2 on |r|.
1760 if (!BN_mod(expected.get(), random.get(), power_of_two.get(), ctx) ||
1761 !BN_mod_pow2(actual.get(), random.get(), e) ||
1762 BN_cmp(actual.get(), expected.get())) {
1763 fprintf(stderr, "BN_mod_pow2 returned the wrong value:\n");
1764 hexdump(stderr, "Expected: ", expected->d,
1765 expected->top * sizeof(BN_ULONG));
1766 hexdump(stderr, "Got: ", actual->d,
1767 actual->top * sizeof(BN_ULONG));
1768 return false;
1769 }
1770
1771 // Test BN_nnmod_pow2 on |r|.
1772 if (!BN_nnmod(expected.get(), random.get(), power_of_two.get(), ctx) ||
1773 !BN_nnmod_pow2(actual.get(), random.get(), e) ||
1774 BN_cmp(actual.get(), expected.get())) {
1775 fprintf(stderr, "BN_nnmod_pow2 failed on positive input:\n");
1776 hexdump(stderr, "Expected: ", expected->d,
1777 expected->top * sizeof(BN_ULONG));
1778 hexdump(stderr, "Got: ", actual->d,
1779 actual->top * sizeof(BN_ULONG));
1780 return false;
1781 }
1782
1783 // Test BN_nnmod_pow2 on -|r|.
1784 BN_set_negative(random.get(), 1);
1785 if (!BN_nnmod(expected.get(), random.get(), power_of_two.get(), ctx) ||
1786 !BN_nnmod_pow2(actual.get(), random.get(), e) ||
1787 BN_cmp(actual.get(), expected.get())) {
1788 fprintf(stderr, "BN_nnmod_pow2 failed on negative input:\n");
1789 hexdump(stderr, "Expected: ", expected->d,
1790 expected->top * sizeof(BN_ULONG));
1791 hexdump(stderr, "Got: ", actual->d,
1792 actual->top * sizeof(BN_ULONG));
1793 return false;
1794 }
1795 }
1796 }
1797
1798 return true;
1799}
1800
Adam Langley696b6b52017-04-19 16:40:08 -07001801static const int kPrimes[10000] = {
1802 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
1803 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
1804 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
1805 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
1806 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419,
1807 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
1808 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
1809 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
1810 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811,
1811 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
1812 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013,
1813 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
1814 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181,
1815 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
1816 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361,
1817 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
1818 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531,
1819 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609,
1820 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699,
1821 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
1822 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889,
1823 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
1824 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083,
1825 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,
1826 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273,
1827 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
1828 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441,
1829 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
1830 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663,
1831 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
1832 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819,
1833 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917,
1834 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023,
1835 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137,
1836 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251,
1837 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
1838 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449,
1839 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533,
1840 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617,
1841 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
1842 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
1843 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917,
1844 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013,
1845 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111,
1846 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219,
1847 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
1848 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423,
1849 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519,
1850 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639,
1851 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
1852 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831,
1853 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951,
1854 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023,
1855 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147,
1856 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261,
1857 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387,
1858 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471,
1859 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563,
1860 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659,
1861 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779,
1862 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
1863 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981,
1864 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089,
1865 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199,
1866 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287,
1867 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367,
1868 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491,
1869 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607,
1870 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709,
1871 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827,
1872 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917,
1873 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013,
1874 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129,
1875 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243,
1876 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369,
1877 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499,
1878 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577,
1879 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681,
1880 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789,
1881 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901,
1882 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017,
1883 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123,
1884 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237,
1885 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353,
1886 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461,
1887 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597,
1888 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689,
1889 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779,
1890 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867,
1891 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001,
1892 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109,
1893 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209,
1894 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323,
1895 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421,
1896 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511,
1897 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631,
1898 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743,
1899 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839,
1900 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941,
1901 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079,
1902 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163,
1903 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267,
1904 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343,
1905 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463,
1906 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597,
1907 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687,
1908 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789,
1909 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891,
1910 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003,
1911 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117,
1912 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239,
1913 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321,
1914 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443,
1915 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549,
1916 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681,
1917 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789,
1918 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887,
1919 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969,
1920 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073,
1921 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163,
1922 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277,
1923 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391,
1924 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487,
1925 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569,
1926 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653,
1927 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763,
1928 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893,
1929 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973,
1930 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063,
1931 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171,
1932 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291,
1933 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399,
1934 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499,
1935 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627,
1936 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711,
1937 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807,
1938 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907,
1939 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029,
1940 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153,
1941 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293,
1942 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407,
1943 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503,
1944 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593,
1945 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713,
1946 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779,
1947 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879,
1948 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983,
1949 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107,
1950 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217,
1951 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299,
1952 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383,
1953 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493,
1954 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607,
1955 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683,
1956 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791,
1957 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901,
1958 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007,
1959 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103,
1960 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229,
1961 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361,
1962 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453,
1963 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573,
1964 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691,
1965 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823,
1966 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927,
1967 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027,
1968 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123,
1969 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239,
1970 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359,
1971 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449,
1972 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551,
1973 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659,
1974 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783,
1975 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903,
1976 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981,
1977 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089,
1978 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191,
1979 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287,
1980 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379,
1981 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481,
1982 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593,
1983 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743,
1984 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899,
1985 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013,
1986 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141,
1987 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249,
1988 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381,
1989 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447,
1990 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541,
1991 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681,
1992 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763,
1993 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889,
1994 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991,
1995 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089,
1996 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173,
1997 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297,
1998 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393,
1999 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509,
2000 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639,
2001 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749,
2002 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879,
2003 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981,
2004 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067,
2005 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179,
2006 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313,
2007 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401,
2008 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517,
2009 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599,
2010 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713,
2011 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817,
2012 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929,
2013 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037,
2014 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123,
2015 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247,
2016 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349,
2017 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469,
2018 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573,
2019 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697,
2020 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783,
2021 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907,
2022 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021,
2023 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087,
2024 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203,
2025 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327,
2026 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473,
2027 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581,
2028 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671,
2029 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773,
2030 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879,
2031 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981,
2032 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077,
2033 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151,
2034 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281,
2035 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419,
2036 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533,
2037 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683,
2038 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809,
2039 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923,
2040 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037,
2041 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163,
2042 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261,
2043 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373,
2044 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471,
2045 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609,
2046 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717,
2047 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841,
2048 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939,
2049 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041,
2050 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171,
2051 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263,
2052 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387,
2053 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489,
2054 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633,
2055 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713,
2056 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821,
2057 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921,
2058 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031,
2059 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127,
2060 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277,
2061 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427,
2062 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539,
2063 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689,
2064 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767,
2065 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847,
2066 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961,
2067 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081,
2068 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201,
2069 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319,
2070 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447,
2071 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559,
2072 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631,
2073 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723,
2074 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837,
2075 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949,
2076 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077,
2077 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191,
2078 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303,
2079 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401,
2080 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531,
2081 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641,
2082 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789,
2083 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917,
2084 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059,
2085 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139,
2086 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259,
2087 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389,
2088 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509,
2089 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643,
2090 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757,
2091 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853,
2092 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971,
2093 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081,
2094 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183,
2095 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267,
2096 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387,
2097 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531,
2098 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649,
2099 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751,
2100 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891,
2101 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051,
2102 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141,
2103 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251,
2104 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353,
2105 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429,
2106 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537,
2107 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633,
2108 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779,
2109 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887,
2110 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987,
2111 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083,
2112 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199,
2113 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331,
2114 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427,
2115 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547,
2116 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619,
2117 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749,
2118 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829,
2119 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941,
2120 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127,
2121 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231,
2122 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319,
2123 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439,
2124 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537,
2125 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651,
2126 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757,
2127 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877,
2128 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027,
2129 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117,
2130 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257,
2131 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363,
2132 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491,
2133 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591,
2134 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759,
2135 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869,
2136 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983,
2137 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083,
2138 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217,
2139 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319,
2140 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469,
2141 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563,
2142 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677,
2143 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779,
2144 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877,
2145 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973,
2146 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087,
2147 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217,
2148 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339,
2149 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463,
2150 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549,
2151 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643,
2152 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799,
2153 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907,
2154 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047,
2155 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189,
2156 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299,
2157 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431,
2158 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569,
2159 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677,
2160 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767,
2161 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891,
2162 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019,
2163 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119,
2164 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227,
2165 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341,
2166 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443,
2167 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569,
2168 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709,
2169 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827,
2170 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901,
2171 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037,
2172 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153,
2173 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277,
2174 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433,
2175 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543,
2176 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697,
2177 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819,
2178 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903,
2179 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039,
2180 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149,
2181 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231,
2182 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357,
2183 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491,
2184 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603,
2185 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681,
2186 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813,
2187 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927,
2188 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017,
2189 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139,
2190 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227,
2191 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349,
2192 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443,
2193 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533,
2194 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677,
2195 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751,
2196 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859,
2197 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979,
2198 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103,
2199 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261,
2200 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403,
2201 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543,
2202 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649,
2203 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781,
2204 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933,
2205 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021,
2206 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119,
2207 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221,
2208 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357,
2209 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501,
2210 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617,
2211 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701,
2212 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819,
2213 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939,
2214 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077,
2215 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191,
2216 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319,
2217 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433,
2218 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569,
2219 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691,
2220 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823,
2221 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953,
2222 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091,
2223 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187,
2224 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309,
2225 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451,
2226 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567,
2227 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679,
2228 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771,
2229 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889,
2230 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059,
2231 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161,
2232 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303,
2233 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417,
2234 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527,
2235 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639,
2236 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741,
2237 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857,
2238 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969,
2239 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119,
2240 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247,
2241 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383,
2242 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487,
2243 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593,
2244 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733,
2245 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821,
2246 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953,
2247 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057,
2248 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171,
2249 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279,
2250 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409,
2251 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523,
2252 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633,
2253 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747,
2254 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853,
2255 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991,
2256 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087,
2257 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177,
2258 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321,
2259 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423,
2260 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551,
2261 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707,
2262 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849,
2263 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969,
2264 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109,
2265 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217,
2266 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343,
2267 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437,
2268 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521,
2269 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637,
2270 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767,
2271 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869,
2272 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977,
2273 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121,
2274 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237,
2275 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363,
2276 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517,
2277 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627,
2278 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733,
2279 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879,
2280 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973,
2281 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093,
2282 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197,
2283 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323,
2284 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441,
2285 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597,
2286 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693,
2287 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819,
2288 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923,
2289 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049,
2290 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181,
2291 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331,
2292 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421,
2293 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539,
2294 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629,
2295 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767,
2296 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907,
2297 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021,
2298 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147,
2299 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259,
2300 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399,
2301 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547,
2302 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663,
2303 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787,
2304 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849,
2305 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967,
2306 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099,
2307 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209,
2308 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369,
2309 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473,
2310 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543,
2311 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681,
2312 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783,
2313 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897,
2314 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989,
2315 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107,
2316 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203,
2317 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329,
2318 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457,
2319 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593,
2320 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713,
2321 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803,
2322 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923,
2323 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057,
2324 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169,
2325 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243,
2326 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393,
2327 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511,
2328 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657,
2329 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763,
2330 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921,
2331 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023,
2332 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119,
2333 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221,
2334 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359,
2335 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447,
2336 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567,
2337 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671,
2338 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791,
2339 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971,
2340 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091,
2341 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209,
2342 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337,
2343 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493,
2344 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623,
2345 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727,
2346 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859,
2347 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943,
2348 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099,
2349 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261,
2350 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381,
2351 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507,
2352 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613,
2353 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703,
2354 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861,
2355 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987,
2356 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099,
2357 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207,
2358 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347,
2359 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497,
2360 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617,
2361 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743,
2362 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873,
2363 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987,
2364 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127,
2365 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299,
2366 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389,
2367 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487,
2368 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599,
2369 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689,
2370 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781,
2371 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901,
2372 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037,
2373 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187,
2374 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319,
2375 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483,
2376 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613,
2377 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747,
2378 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879,
2379 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011,
2380 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119,
2381 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213,
2382 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357,
2383 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479,
2384 65497, 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581,
2385 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, 65687,
2386 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, 65777, 65789,
2387 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, 65881, 65899, 65921,
2388 65927, 65929, 65951, 65957, 65963, 65981, 65983, 65993, 66029, 66037, 66041,
2389 66047, 66067, 66071, 66083, 66089, 66103, 66107, 66109, 66137, 66161, 66169,
2390 66173, 66179, 66191, 66221, 66239, 66271, 66293, 66301, 66337, 66343, 66347,
2391 66359, 66361, 66373, 66377, 66383, 66403, 66413, 66431, 66449, 66457, 66463,
2392 66467, 66491, 66499, 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571,
2393 66587, 66593, 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713,
2394 66721, 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841,
2395 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, 66947,
2396 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, 67057, 67061,
2397 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, 67157, 67169, 67181,
2398 67187, 67189, 67211, 67213, 67217, 67219, 67231, 67247, 67261, 67271, 67273,
2399 67289, 67307, 67339, 67343, 67349, 67369, 67391, 67399, 67409, 67411, 67421,
2400 67427, 67429, 67433, 67447, 67453, 67477, 67481, 67489, 67493, 67499, 67511,
2401 67523, 67531, 67537, 67547, 67559, 67567, 67577, 67579, 67589, 67601, 67607,
2402 67619, 67631, 67651, 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757,
2403 67759, 67763, 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853,
2404 67867, 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961,
2405 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, 68099,
2406 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, 68219, 68227,
2407 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, 68389, 68399, 68437,
2408 68443, 68447, 68449, 68473, 68477, 68483, 68489, 68491, 68501, 68507, 68521,
2409 68531, 68539, 68543, 68567, 68581, 68597, 68611, 68633, 68639, 68659, 68669,
2410 68683, 68687, 68699, 68711, 68713, 68729, 68737, 68743, 68749, 68767, 68771,
2411 68777, 68791, 68813, 68819, 68821, 68863, 68879, 68881, 68891, 68897, 68899,
2412 68903, 68909, 68917, 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029,
2413 69031, 69061, 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163,
2414 69191, 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263,
2415 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, 69427,
2416 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, 69497, 69499,
2417 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, 69697, 69709, 69737,
2418 69739, 69761, 69763, 69767, 69779, 69809, 69821, 69827, 69829, 69833, 69847,
2419 69857, 69859, 69877, 69899, 69911, 69929, 69931, 69941, 69959, 69991, 69997,
2420 70001, 70003, 70009, 70019, 70039, 70051, 70061, 70067, 70079, 70099, 70111,
2421 70117, 70121, 70123, 70139, 70141, 70157, 70163, 70177, 70181, 70183, 70199,
2422 70201, 70207, 70223, 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309,
2423 70313, 70321, 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439,
2424 70451, 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549,
2425 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, 70663,
2426 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, 70823, 70841,
2427 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, 70913, 70919, 70921,
2428 70937, 70949, 70951, 70957, 70969, 70979, 70981, 70991, 70997, 70999, 71011,
2429 71023, 71039, 71059, 71069, 71081, 71089, 71119, 71129, 71143, 71147, 71153,
2430 71161, 71167, 71171, 71191, 71209, 71233, 71237, 71249, 71257, 71261, 71263,
2431 71287, 71293, 71317, 71327, 71329, 71333, 71339, 71341, 71347, 71353, 71359,
2432 71363, 71387, 71389, 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453,
2433 71471, 71473, 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569,
2434 71593, 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713,
2435 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, 71849,
2436 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, 71941, 71947,
2437 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, 72043, 72047, 72053,
2438 72073, 72077, 72089, 72091, 72101, 72103, 72109, 72139, 72161, 72167, 72169,
2439 72173, 72211, 72221, 72223, 72227, 72229, 72251, 72253, 72269, 72271, 72277,
2440 72287, 72307, 72313, 72337, 72341, 72353, 72367, 72379, 72383, 72421, 72431,
2441 72461, 72467, 72469, 72481, 72493, 72497, 72503, 72533, 72547, 72551, 72559,
2442 72577, 72613, 72617, 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679,
2443 72689, 72701, 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817,
2444 72823, 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923,
2445 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, 73019,
2446 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, 73133, 73141,
2447 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, 73309, 73327, 73331,
2448 73351, 73361, 73363, 73369, 73379, 73387, 73417, 73421, 73433, 73453, 73459,
2449 73471, 73477, 73483, 73517, 73523, 73529, 73547, 73553, 73561, 73571, 73583,
2450 73589, 73597, 73607, 73609, 73613, 73637, 73643, 73651, 73673, 73679, 73681,
2451 73693, 73699, 73709, 73721, 73727, 73751, 73757, 73771, 73783, 73819, 73823,
2452 73847, 73849, 73859, 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951,
2453 73961, 73973, 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093,
2454 74099, 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197,
2455 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, 74311,
2456 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, 74413, 74419,
2457 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, 74527, 74531, 74551,
2458 74561, 74567, 74573, 74587, 74597, 74609, 74611, 74623, 74653, 74687, 74699,
2459 74707, 74713, 74717, 74719, 74729, 74731, 74747, 74759, 74761, 74771, 74779,
2460 74797, 74821, 74827, 74831, 74843, 74857, 74861, 74869, 74873, 74887, 74891,
2461 74897, 74903, 74923, 74929, 74933, 74941, 74959, 75011, 75013, 75017, 75029,
2462 75037, 75041, 75079, 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181,
2463 75193, 75209, 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289,
2464 75307, 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401,
2465 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, 75539,
2466 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, 75629, 75641,
2467 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, 75721, 75731, 75743,
2468 75767, 75773, 75781, 75787, 75793, 75797, 75821, 75833, 75853, 75869, 75883,
2469 75913, 75931, 75937, 75941, 75967, 75979, 75983, 75989, 75991, 75997, 76001,
2470 76003, 76031, 76039, 76079, 76081, 76091, 76099, 76103, 76123, 76129, 76147,
2471 76157, 76159, 76163, 76207, 76213, 76231, 76243, 76249, 76253, 76259, 76261,
2472 76283, 76289, 76303, 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421,
2473 76423, 76441, 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537,
2474 76541, 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667,
2475 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, 76801,
2476 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, 76913, 76919,
2477 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, 77029, 77041, 77047,
2478 77069, 77081, 77093, 77101, 77137, 77141, 77153, 77167, 77171, 77191, 77201,
2479 77213, 77237, 77239, 77243, 77249, 77261, 77263, 77267, 77269, 77279, 77291,
2480 77317, 77323, 77339, 77347, 77351, 77359, 77369, 77377, 77383, 77417, 77419,
2481 77431, 77447, 77471, 77477, 77479, 77489, 77491, 77509, 77513, 77521, 77527,
2482 77543, 77549, 77551, 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617,
2483 77621, 77641, 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719,
2484 77723, 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839,
2485 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, 77983,
2486 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, 78121, 78137,
2487 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, 78203, 78229, 78233,
2488 78241, 78259, 78277, 78283, 78301, 78307, 78311, 78317, 78341, 78347, 78367,
2489 78401, 78427, 78437, 78439, 78467, 78479, 78487, 78497, 78509, 78511, 78517,
2490 78539, 78541, 78553, 78569, 78571, 78577, 78583, 78593, 78607, 78623, 78643,
2491 78649, 78653, 78691, 78697, 78707, 78713, 78721, 78737, 78779, 78781, 78787,
2492 78791, 78797, 78803, 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889,
2493 78893, 78901, 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043,
2494 79063, 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181,
2495 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, 79301,
2496 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, 79397, 79399,
2497 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, 79537, 79549, 79559,
2498 79561, 79579, 79589, 79601, 79609, 79613, 79621, 79627, 79631, 79633, 79657,
2499 79669, 79687, 79691, 79693, 79697, 79699, 79757, 79769, 79777, 79801, 79811,
2500 79813, 79817, 79823, 79829, 79841, 79843, 79847, 79861, 79867, 79873, 79889,
2501 79901, 79903, 79907, 79939, 79943, 79967, 79973, 79979, 79987, 79997, 79999,
2502 80021, 80039, 80051, 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153,
2503 80167, 80173, 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251,
2504 80263, 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369,
2505 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, 80527,
2506 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, 80651, 80657,
2507 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, 80737, 80747, 80749,
2508 80761, 80777, 80779, 80783, 80789, 80803, 80809, 80819, 80831, 80833, 80849,
2509 80863, 80897, 80909, 80911, 80917, 80923, 80929, 80933, 80953, 80963, 80989,
2510 81001, 81013, 81017, 81019, 81023, 81031, 81041, 81043, 81047, 81049, 81071,
2511 81077, 81083, 81097, 81101, 81119, 81131, 81157, 81163, 81173, 81181, 81197,
2512 81199, 81203, 81223, 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331,
2513 81343, 81349, 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457,
2514 81463, 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569,
2515 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, 81701,
2516 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, 81817, 81839,
2517 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, 81931, 81937, 81943,
2518 81953, 81967, 81971, 81973, 82003, 82007, 82009, 82013, 82021, 82031, 82037,
2519 82039, 82051, 82067, 82073, 82129, 82139, 82141, 82153, 82163, 82171, 82183,
2520 82189, 82193, 82207, 82217, 82219, 82223, 82231, 82237, 82241, 82261, 82267,
2521 82279, 82301, 82307, 82339, 82349, 82351, 82361, 82373, 82387, 82393, 82421,
2522 82457, 82463, 82469, 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531,
2523 82549, 82559, 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633,
2524 82651, 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781,
2525 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, 82903,
2526 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, 83059, 83063,
2527 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, 83203, 83207, 83219,
2528 83221, 83227, 83231, 83233, 83243, 83257, 83267, 83269, 83273, 83299, 83311,
2529 83339, 83341, 83357, 83383, 83389, 83399, 83401, 83407, 83417, 83423, 83431,
2530 83437, 83443, 83449, 83459, 83471, 83477, 83497, 83537, 83557, 83561, 83563,
2531 83579, 83591, 83597, 83609, 83617, 83621, 83639, 83641, 83653, 83663, 83689,
2532 83701, 83717, 83719, 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843,
2533 83857, 83869, 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983,
2534 83987, 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127,
2535 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, 84223,
2536 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, 84347, 84349,
2537 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, 84443, 84449, 84457,
2538 84463, 84467, 84481, 84499, 84503, 84509, 84521, 84523, 84533, 84551, 84559,
2539 84589, 84629, 84631, 84649, 84653, 84659, 84673, 84691, 84697, 84701, 84713,
2540 84719, 84731, 84737, 84751, 84761, 84787, 84793, 84809, 84811, 84827, 84857,
2541 84859, 84869, 84871, 84913, 84919, 84947, 84961, 84967, 84977, 84979, 84991,
2542 85009, 85021, 85027, 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103,
2543 85109, 85121, 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229,
2544 85237, 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363,
2545 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, 85487,
2546 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, 85607, 85619,
2547 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, 85703, 85711, 85717,
2548 85733, 85751, 85781, 85793, 85817, 85819, 85829, 85831, 85837, 85843, 85847,
2549 85853, 85889, 85903, 85909, 85931, 85933, 85991, 85999, 86011, 86017, 86027,
2550 86029, 86069, 86077, 86083, 86111, 86113, 86117, 86131, 86137, 86143, 86161,
2551 86171, 86179, 86183, 86197, 86201, 86209, 86239, 86243, 86249, 86257, 86263,
2552 86269, 86287, 86291, 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357,
2553 86369, 86371, 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467,
2554 86477, 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587,
2555 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, 86753,
2556 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, 86869, 86923,
2557 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, 87011, 87013, 87037,
2558 87041, 87049, 87071, 87083, 87103, 87107, 87119, 87121, 87133, 87149, 87151,
2559 87179, 87181, 87187, 87211, 87221, 87223, 87251, 87253, 87257, 87277, 87281,
2560 87293, 87299, 87313, 87317, 87323, 87337, 87359, 87383, 87403, 87407, 87421,
2561 87427, 87433, 87443, 87473, 87481, 87491, 87509, 87511, 87517, 87523, 87539,
2562 87541, 87547, 87553, 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629,
2563 87631, 87641, 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719,
2564 87721, 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853,
2565 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, 87973,
2566 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, 88093, 88117,
2567 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, 88261, 88289, 88301,
2568 88321, 88327, 88337, 88339, 88379, 88397, 88411, 88423, 88427, 88463, 88469,
2569 88471, 88493, 88499, 88513, 88523, 88547, 88589, 88591, 88607, 88609, 88643,
2570 88651, 88657, 88661, 88663, 88667, 88681, 88721, 88729, 88741, 88747, 88771,
2571 88789, 88793, 88799, 88801, 88807, 88811, 88813, 88817, 88819, 88843, 88853,
2572 88861, 88867, 88873, 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993,
2573 88997, 89003, 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083,
2574 89087, 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209,
2575 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, 89329,
2576 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, 89443, 89449,
2577 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, 89533, 89561, 89563,
2578 89567, 89591, 89597, 89599, 89603, 89611, 89627, 89633, 89653, 89657, 89659,
2579 89669, 89671, 89681, 89689, 89753, 89759, 89767, 89779, 89783, 89797, 89809,
2580 89819, 89821, 89833, 89839, 89849, 89867, 89891, 89897, 89899, 89909, 89917,
2581 89923, 89939, 89959, 89963, 89977, 89983, 89989, 90001, 90007, 90011, 90017,
2582 90019, 90023, 90031, 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121,
2583 90127, 90149, 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227,
2584 90239, 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373,
2585 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, 90499,
2586 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, 90619, 90631,
2587 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, 90731, 90749, 90787,
2588 90793, 90803, 90821, 90823, 90833, 90841, 90847, 90863, 90887, 90901, 90907,
2589 90911, 90917, 90931, 90947, 90971, 90977, 90989, 90997, 91009, 91019, 91033,
2590 91079, 91081, 91097, 91099, 91121, 91127, 91129, 91139, 91141, 91151, 91153,
2591 91159, 91163, 91183, 91193, 91199, 91229, 91237, 91243, 91249, 91253, 91283,
2592 91291, 91297, 91303, 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393,
2593 91397, 91411, 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513,
2594 91529, 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673,
2595 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, 91811,
2596 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, 91943, 91951,
2597 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, 92041, 92051, 92077,
2598 92083, 92107, 92111, 92119, 92143, 92153, 92173, 92177, 92179, 92189, 92203,
2599 92219, 92221, 92227, 92233, 92237, 92243, 92251, 92269, 92297, 92311, 92317,
2600 92333, 92347, 92353, 92357, 92363, 92369, 92377, 92381, 92383, 92387, 92399,
2601 92401, 92413, 92419, 92431, 92459, 92461, 92467, 92479, 92489, 92503, 92507,
2602 92551, 92557, 92567, 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647,
2603 92657, 92669, 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737,
2604 92753, 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849,
2605 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, 92957,
2606 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, 93089, 93097,
2607 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, 93187, 93199, 93229,
2608 93239, 93241, 93251, 93253, 93257, 93263, 93281, 93283, 93287, 93307, 93319,
2609 93323, 93329, 93337, 93371, 93377, 93383, 93407, 93419, 93427, 93463, 93479,
2610 93481, 93487, 93491, 93493, 93497, 93503, 93523, 93529, 93553, 93557, 93559,
2611 93563, 93581, 93601, 93607, 93629, 93637, 93683, 93701, 93703, 93719, 93739,
2612 93761, 93763, 93787, 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893,
2613 93901, 93911, 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983,
2614 93997, 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111,
2615 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, 94261,
2616 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, 94351, 94379,
2617 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, 94463, 94477, 94483,
2618 94513, 94529, 94531, 94541, 94543, 94547, 94559, 94561, 94573, 94583, 94597,
2619 94603, 94613, 94621, 94649, 94651, 94687, 94693, 94709, 94723, 94727, 94747,
2620 94771, 94777, 94781, 94789, 94793, 94811, 94819, 94823, 94837, 94841, 94847,
2621 94849, 94873, 94889, 94903, 94907, 94933, 94949, 94951, 94961, 94993, 94999,
2622 95003, 95009, 95021, 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101,
2623 95107, 95111, 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219,
2624 95231, 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317,
2625 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, 95443,
2626 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, 95549, 95561,
2627 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, 95651, 95701, 95707,
2628 95713, 95717, 95723, 95731, 95737, 95747, 95773, 95783, 95789, 95791, 95801,
2629 95803, 95813, 95819, 95857, 95869, 95873, 95881, 95891, 95911, 95917, 95923,
2630 95929, 95947, 95957, 95959, 95971, 95987, 95989, 96001, 96013, 96017, 96043,
2631 96053, 96059, 96079, 96097, 96137, 96149, 96157, 96167, 96179, 96181, 96199,
2632 96211, 96221, 96223, 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323,
2633 96329, 96331, 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457,
2634 96461, 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581,
2635 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, 96737,
2636 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, 96821, 96823,
2637 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, 96953, 96959, 96973,
2638 96979, 96989, 96997, 97001, 97003, 97007, 97021, 97039, 97073, 97081, 97103,
2639 97117, 97127, 97151, 97157, 97159, 97169, 97171, 97177, 97187, 97213, 97231,
2640 97241, 97259, 97283, 97301, 97303, 97327, 97367, 97369, 97373, 97379, 97381,
2641 97387, 97397, 97423, 97429, 97441, 97453, 97459, 97463, 97499, 97501, 97511,
2642 97523, 97547, 97549, 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609,
2643 97613, 97649, 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789,
2644 97813, 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883,
2645 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, 98017,
2646 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, 98207, 98213,
2647 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, 98321, 98323, 98327,
2648 98347, 98369, 98377, 98387, 98389, 98407, 98411, 98419, 98429, 98443, 98453,
2649 98459, 98467, 98473, 98479, 98491, 98507, 98519, 98533, 98543, 98561, 98563,
2650 98573, 98597, 98621, 98627, 98639, 98641, 98663, 98669, 98689, 98711, 98713,
2651 98717, 98729, 98731, 98737, 98773, 98779, 98801, 98807, 98809, 98837, 98849,
2652 98867, 98869, 98873, 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929,
2653 98939, 98947, 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041,
2654 99053, 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139,
2655 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, 99277,
2656 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, 99401, 99409,
2657 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, 99551, 99559, 99563,
2658 99571, 99577, 99581, 99607, 99611, 99623, 99643, 99661, 99667, 99679, 99689,
2659 99707, 99709, 99713, 99719, 99721, 99733, 99761, 99767, 99787, 99793, 99809,
2660 99817, 99823, 99829, 99833, 99839, 99859, 99871, 99877, 99881, 99901, 99907,
2661 99923, 99929, 99961, 99971, 99989, 99991, 100003, 100019, 100043, 100049,
2662 100057, 100069, 100103, 100109, 100129, 100151, 100153, 100169, 100183,
2663 100189, 100193, 100207, 100213, 100237, 100267, 100271, 100279, 100291,
2664 100297, 100313, 100333, 100343, 100357, 100361, 100363, 100379, 100391,
2665 100393, 100403, 100411, 100417, 100447, 100459, 100469, 100483, 100493,
2666 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, 100559,
2667 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699,
2668 100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811,
2669 100823, 100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937,
2670 100943, 100957, 100981, 100987, 100999, 101009, 101021, 101027, 101051,
2671 101063, 101081, 101089, 101107, 101111, 101113, 101117, 101119, 101141,
2672 101149, 101159, 101161, 101173, 101183, 101197, 101203, 101207, 101209,
2673 101221, 101267, 101273, 101279, 101281, 101287, 101293, 101323, 101333,
2674 101341, 101347, 101359, 101363, 101377, 101383, 101399, 101411, 101419,
2675 101429, 101449, 101467, 101477, 101483, 101489, 101501, 101503, 101513,
2676 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, 101603,
2677 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719,
2678 101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807,
2679 101833, 101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917,
2680 101921, 101929, 101939, 101957, 101963, 101977, 101987, 101999, 102001,
2681 102013, 102019, 102023, 102031, 102043, 102059, 102061, 102071, 102077,
2682 102079, 102101, 102103, 102107, 102121, 102139, 102149, 102161, 102181,
2683 102191, 102197, 102199, 102203, 102217, 102229, 102233, 102241, 102251,
2684 102253, 102259, 102293, 102299, 102301, 102317, 102329, 102337, 102359,
2685 102367, 102397, 102407, 102409, 102433, 102437, 102451, 102461, 102481,
2686 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, 102559,
2687 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667,
2688 102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797,
2689 102811, 102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913,
2690 102929, 102931, 102953, 102967, 102983, 103001, 103007, 103043, 103049,
2691 103067, 103069, 103079, 103087, 103091, 103093, 103099, 103123, 103141,
2692 103171, 103177, 103183, 103217, 103231, 103237, 103289, 103291, 103307,
2693 103319, 103333, 103349, 103357, 103387, 103391, 103393, 103399, 103409,
2694 103421, 103423, 103451, 103457, 103471, 103483, 103511, 103529, 103549,
2695 103553, 103561, 103567, 103573, 103577, 103583, 103591, 103613, 103619,
2696 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, 103723,
2697 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867,
2698 103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979,
2699 103981, 103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047,
2700 104053, 104059, 104087, 104089, 104107, 104113, 104119, 104123, 104147,
2701 104149, 104161, 104173, 104179, 104183, 104207, 104231, 104233, 104239,
2702 104243, 104281, 104287, 104297, 104309, 104311, 104323, 104327, 104347,
2703 104369, 104381, 104383, 104393, 104399, 104417, 104459, 104471, 104473,
2704 104479, 104491, 104513, 104527, 104537, 104543, 104549, 104551, 104561,
2705 104579, 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
2706 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
2707};
2708
2709static bool TestPrimeChecking(BN_CTX *ctx) {
2710 bssl::UniquePtr<BIGNUM> p(BN_new());
2711 int is_probably_prime_1 = 0, is_probably_prime_2 = 0;
2712
2713 const int max_prime = kPrimes[OPENSSL_ARRAY_SIZE(kPrimes)-1];
2714 size_t next_prime_index = 0;
2715
2716 for (int i = 0; i <= max_prime; i++) {
2717 bool is_prime = false;
2718
2719 if (i == kPrimes[next_prime_index]) {
2720 is_prime = true;
2721 next_prime_index++;
2722 }
2723
2724 if (!BN_set_word(p.get(), i) ||
2725 !BN_primality_test(&is_probably_prime_1, p.get(), BN_prime_checks, ctx,
2726 false /* do_trial_division */,
2727 nullptr /* callback */) ||
2728 is_probably_prime_1 != (is_prime ? 1 : 0) ||
2729 !BN_primality_test(&is_probably_prime_2, p.get(), BN_prime_checks, ctx,
2730 true /* do_trial_division */,
2731 nullptr /* callback */) ||
2732 is_probably_prime_2 != (is_prime ? 1 : 0)) {
2733 fprintf(stderr,
2734 "TestPrimeChecking failed for %d (is_prime: %d vs %d without "
2735 "trial division vs %d with it)\n",
2736 i, static_cast<int>(is_prime), is_probably_prime_1,
2737 is_probably_prime_2);
2738 return false;
2739 }
2740 }
2741
David Benjamin6c679e12017-04-21 11:49:34 -04002742 // Negative numbers are not prime.
2743 if (!BN_set_word(p.get(), 7)) {
2744 return false;
2745 }
2746 BN_set_negative(p.get(), 1);
2747 if (!BN_primality_test(&is_probably_prime_1, p.get(), BN_prime_checks, ctx,
2748 false /* do_trial_division */,
2749 nullptr /* callback */) ||
2750 is_probably_prime_1 != 0 ||
2751 !BN_primality_test(&is_probably_prime_2, p.get(), BN_prime_checks, ctx,
2752 true /* do_trial_division */,
2753 nullptr /* callback */) ||
2754 is_probably_prime_2 != 0) {
2755 fprintf(stderr,
2756 "TestPrimeChecking failed for -7 (is_prime: 0 vs %d without "
2757 "trial division vs %d with it)\n",
2758 is_probably_prime_1, is_probably_prime_2);
2759 return false;
2760 }
2761
Adam Langley696b6b52017-04-19 16:40:08 -07002762 return true;
2763}
2764
David Benjamin47489442016-07-09 15:22:50 -07002765int main(int argc, char *argv[]) {
2766 CRYPTO_library_init();
2767
2768 if (argc != 2) {
2769 fprintf(stderr, "%s TEST_FILE\n", argv[0]);
2770 return 1;
2771 }
2772
Matt Braithwaited17d74d2016-08-17 20:10:28 -07002773 bssl::UniquePtr<BN_CTX> ctx(BN_CTX_new());
David Benjamin47489442016-07-09 15:22:50 -07002774 if (!ctx) {
2775 return 1;
2776 }
2777
Adam Langley10f97f32016-07-12 08:09:33 -07002778 if (!TestBN2BinPadded(ctx.get()) ||
2779 !TestDec2BN(ctx.get()) ||
2780 !TestHex2BN(ctx.get()) ||
2781 !TestASC2BN(ctx.get()) ||
Rob Sloan45573cc2016-12-07 20:53:22 -08002782 !TestLittleEndian() ||
Adam Langley10f97f32016-07-12 08:09:33 -07002783 !TestMPI() ||
2784 !TestRand() ||
David Benjaminbc6a76b2017-04-13 16:43:43 -04002785 !TestRandRange() ||
Adam Langley10f97f32016-07-12 08:09:33 -07002786 !TestASN1() ||
2787 !TestNegativeZero(ctx.get()) ||
2788 !TestBadModulus(ctx.get()) ||
2789 !TestExpModZero() ||
David Benjaminccd511e2016-07-29 12:11:34 -04002790 !TestSmallPrime(ctx.get()) ||
David Benjamin7c040752016-08-22 22:19:01 -07002791 !TestCmpWord() ||
David Benjamin40a63112016-08-23 20:53:12 -07002792 !TestBN2Dec() ||
Rob Sloanb9873552017-01-30 11:52:27 -08002793 !TestBNSetGetU64() ||
Adam Langley696b6b52017-04-19 16:40:08 -07002794 !TestBNPow2(ctx.get()) ||
2795 !TestPrimeChecking(ctx.get())) {
David Benjaminbc6a76b2017-04-13 16:43:43 -04002796 ERR_print_errors_fp(stderr);
David Benjamin47489442016-07-09 15:22:50 -07002797 return 1;
2798 }
2799
Adam Langley10f97f32016-07-12 08:09:33 -07002800 return FileTestMain(RunTest, ctx.get(), argv[1]);
David Benjamin47489442016-07-09 15:22:50 -07002801}