Commit 518e7ede45 for openssl.org
commit 518e7ede45cda59427f41af8d521380f4bc12ca2
Author: Jakub Zelenka <jakub.zelenka@openssl.foundation>
Date: Fri Aug 28 16:39:56 2026 +0200
apps: cover the prime -generate option in the test recipe
Add tests generating a prime in decimal and hex output, verifying the
result is reported prime by feeding it back for primality checking,
checking the -safe option produces p with (p-1)/2 also prime, and
covering the error cases of a missing -bits and a trailing number
argument.
Assisted-by: Claude:claude-fable-5
Reviewed-by: Daniel Kubec <kubec@openssl.foundation>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Merge-date: Mon Sep 7 14:12:35 2026
Merged-from: https://github.com/openssl/openssl/pull/32580
diff --git a/test/recipes/20-test_prime.t b/test/recipes/20-test_prime.t
index a44cdf0862..b66b981154 100644
--- a/test/recipes/20-test_prime.t
+++ b/test/recipes/20-test_prime.t
@@ -9,12 +9,14 @@
use strict;
use warnings;
+use Math::BigInt;
+
use OpenSSL::Test qw(:DEFAULT data_file);
use OpenSSL::Test;
setup("test_prime");
-plan tests => 10;
+plan tests => 19;
my $prime_file = data_file("prime.txt");
my $composite_file = data_file("composite.txt");
@@ -54,4 +56,53 @@ ok(run(app(["openssl", "prime", "-in", $prime_file, $composite_file, $long_numbe
"Run openssl prime with multiple -in files");
ok(run(app(["openssl", "prime", "-in", "does_not_exist.txt"])),
- "Run openssl prime with -in file that does not exist");
\ No newline at end of file
+ "Run openssl prime with -in file that does not exist");
+
+my @generated = run(app(["openssl", "prime", "-generate", "-bits", "128"]),
+ capture => 1);
+chomp @generated;
+
+ok(@generated == 1 && $generated[0] =~ /^\d+$/,
+ "Run openssl prime -generate with decimal output");
+
+ok(is_reported_prime($generated[0]),
+ "Generated decimal number is prime");
+
+@generated = run(app(["openssl", "prime", "-generate", "-bits", "128", "-hex"]),
+ capture => 1);
+chomp @generated;
+
+ok(@generated == 1 && $generated[0] =~ /^[89A-F][0-9A-F]{31}$/,
+ "Run openssl prime -generate with 128 bit hex output");
+
+ok(is_reported_prime($generated[0], "-hex"),
+ "Generated hex number is prime");
+
+@generated = run(app(["openssl", "prime", "-generate", "-bits", "128", "-safe"]),
+ capture => 1);
+chomp @generated;
+
+ok(@generated == 1 && $generated[0] =~ /^\d+$/,
+ "Run openssl prime -generate with -safe");
+
+ok(is_reported_prime($generated[0]),
+ "Generated safe prime is prime");
+
+my $q = @generated == 1
+ ? Math::BigInt->new($generated[0])->bsub(1)->bdiv(2)->bstr() : "0";
+ok(is_reported_prime($q),
+ "Generated safe prime (p-1)/2 is prime");
+
+ok(!run(app(["openssl", "prime", "-generate"])),
+ "Run openssl prime -generate without -bits fails");
+
+ok(!run(app(["openssl", "prime", "-generate", "-bits", "128", "42"])),
+ "Run openssl prime -generate with a number argument fails");
+
+# Check that the app reports the given number as prime.
+sub is_reported_prime {
+ my ($num, @flags) = @_;
+ my @out = run(app(["openssl", "prime", @flags, $num // "0"]),
+ capture => 1);
+ return scalar grep { / is prime$/ } @out;
+}