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;
+}