summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2023-06-21 07:18:10 +0000
committerjsing <>2023-06-21 07:18:10 +0000
commit66de59424a5c1e76a91fc81a1b29df9eb1801d46 (patch)
tree2f649e3f5d497090c895685da8ae5b87246da2df /src
parentab364c1560a1e039e94cfadf760950862d9e6962 (diff)
downloadopenbsd-66de59424a5c1e76a91fc81a1b29df9eb1801d46.tar.gz
openbsd-66de59424a5c1e76a91fc81a1b29df9eb1801d46.tar.bz2
openbsd-66de59424a5c1e76a91fc81a1b29df9eb1801d46.zip
Add tests for BN_sqr() corner cases.
Test BN_sqr() with a newly allocated BN, a BN explicitly set to zero and small values that fit in a single BN_ULONG.
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libcrypto/bn/bn_mul_div.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/bn/bn_mul_div.c b/src/regress/lib/libcrypto/bn/bn_mul_div.c
index 810c7cde19..625d5e318e 100644
--- a/src/regress/lib/libcrypto/bn/bn_mul_div.c
+++ b/src/regress/lib/libcrypto/bn/bn_mul_div.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_mul_div.c,v 1.6 2023/04/11 05:53:53 jsing Exp $ */ 1/* $OpenBSD: bn_mul_div.c,v 1.7 2023/06/21 07:18:10 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -405,6 +405,84 @@ benchmark_bn_mul_sqr(void)
405 } 405 }
406} 406}
407 407
408static int
409test_bn_sqr(void)
410{
411 BN_CTX *bn_ctx = NULL;
412 BIGNUM *a, *r;
413 int failed = 1;
414
415 if ((bn_ctx = BN_CTX_new()) == NULL)
416 errx(1, "BN_CTX_new");
417
418 BN_CTX_start(bn_ctx);
419
420 if ((a = BN_CTX_get(bn_ctx)) == NULL)
421 errx(1, "BN_new");
422 if ((r = BN_CTX_get(bn_ctx)) == NULL)
423 errx(1, "BN_new");
424
425 /* Square of a new BN. */
426 if (!BN_sqr(r, a, bn_ctx)) {
427 fprintf(stderr, "FAIL: BN_sqr() on new BN failed\n");
428 goto failure;
429 }
430 if (!BN_is_zero(r)) {
431 fprintf(stderr, "FAIL: BN_sqr() on new BN is not zero\n");
432 goto failure;
433 }
434
435 /* Square of BN that is explicitly set to zero. */
436 if (!BN_set_word(a, 0)) {
437 fprintf(stderr, "FAIL: BN_set_word(0) failed\n");
438 goto failure;
439 }
440 if (!BN_sqr(r, a, bn_ctx)) {
441 fprintf(stderr, "FAIL: BN_sqr(0) failed\n");
442 goto failure;
443 }
444 if (!BN_is_zero(r)) {
445 fprintf(stderr, "FAIL: BN_sqr(0) != 0\n");
446 goto failure;
447 }
448
449 /* Square of BN with value one. */
450 if (!BN_set_word(a, 1)) {
451 fprintf(stderr, "FAIL: BN_set_word(1) failed\n");
452 goto failure;
453 }
454 if (!BN_sqr(r, a, bn_ctx)) {
455 fprintf(stderr, "FAIL: BN_sqr(1) failed\n");
456 goto failure;
457 }
458 if (BN_get_word(r) != 1) {
459 fprintf(stderr, "FAIL: BN_sqr(1) != 1\n");
460 goto failure;
461 }
462
463 /* Square of BN with value two. */
464 if (!BN_set_word(a, 2)) {
465 fprintf(stderr, "FAIL: BN_set_word(2) failed\n");
466 goto failure;
467 }
468 if (!BN_sqr(r, a, bn_ctx)) {
469 fprintf(stderr, "FAIL: BN_sqr(2) failed\n");
470 goto failure;
471 }
472 if (BN_get_word(r) != 4) {
473 fprintf(stderr, "FAIL: BN_sqr(2) != 4\n");
474 goto failure;
475 }
476
477 failed = 0;
478
479 failure:
480 BN_CTX_end(bn_ctx);
481 BN_CTX_free(bn_ctx);
482
483 return failed;
484}
485
408int 486int
409main(int argc, char **argv) 487main(int argc, char **argv)
410{ 488{
@@ -413,6 +491,8 @@ main(int argc, char **argv)
413 if (argc == 2 && strcmp(argv[1], "--benchmark") == 0) 491 if (argc == 2 && strcmp(argv[1], "--benchmark") == 0)
414 benchmark = 1; 492 benchmark = 1;
415 493
494 failed |= test_bn_sqr();
495
416 if (benchmark && !failed) 496 if (benchmark && !failed)
417 benchmark_bn_mul_sqr(); 497 benchmark_bn_mul_sqr();
418 498