Commit 5f972fbf20 for openssl.org

commit 5f972fbf20a59d8bdd089995965b1669a6e8a87d
Author: Jakub Zelenka <jakub.zelenka@openssl.foundation>
Date:   Sat Aug 29 14:00:47 2026 +0200

    apps: cover the gendsa error cases and verbose mode in the test recipe

    Cover the bad option failures (missing and extra arguments, unknown
    cipher and invalid password argument) as well as the failures when
    loading a nonexistent, invalid or non-DSA parameters file, verifying
    the error messages printed to stderr.  Also extend the -verbose test
    to check the reported progress output and cover the -quiet option.

    Assisted-by: Claude:claude-fable-5
    Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
    Reviewed-by: Tomas Mraz <tomas@openssl.foundation>
    Merge-date: Mon Sep  7 14:15:51 2026
    Merged-from: https://github.com/openssl/openssl/pull/32592

diff --git a/test/recipes/15-test_gendsa.t b/test/recipes/15-test_gendsa.t
index cd331c4cfc..56ba16b6f4 100644
--- a/test/recipes/15-test_gendsa.t
+++ b/test/recipes/15-test_gendsa.t
@@ -11,7 +11,8 @@ use strict;
 use warnings;

 use File::Spec;
-use OpenSSL::Test qw/:DEFAULT srctop_file srctop_dir bldtop_dir bldtop_file/;
+use OpenSSL::Test qw/:DEFAULT srctop_file srctop_dir bldtop_dir bldtop_file
+                     app_fails slurp_file/;
 use OpenSSL::Test::Utils;

 BEGIN {
@@ -28,7 +29,7 @@ my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);

 plan tests =>
     ($no_fips ? 0 : 2)          # FIPS related tests
-    + 18;
+    + 19;

 ok(run(app([ 'openssl', 'genpkey', '-genparam',
              '-algorithm', 'DSA',
@@ -107,14 +108,63 @@ ok(!run(app([ 'openssl', 'genpkey',
               '-algorithm', 'DSA'])),
    "genpkey DSA with no params should fail");

-ok(run(app(["openssl", "gendsa", "-verbose",
-            'dsagen.pem'])),
-    "gendsa with -verbose option and dsagen parameter");
+subtest "gendsa verbose mode" => sub {
+    plan tests => 4;
+
+    my $stderr_file = "gendsa_verbose.txt";
+
+    ok(run(app(['openssl', 'gendsa', '-verbose',
+                '-out', 'gendsatest-verbose.pem', 'dsagen.pem'],
+               stderr => $stderr_file)),
+       "gendsa -verbose generates a key");
+    my $err = slurp_file($stderr_file);
+    ok($err =~ qr/Generating DSA key with \d+ bits/,
+       "-verbose reports the key generation");
+
+    ok(run(app(['openssl', 'gendsa', '-quiet',
+                '-out', 'gendsatest-quiet.pem', 'dsagen.pem'],
+               stderr => $stderr_file)),
+       "gendsa -quiet generates a key");
+    $err = slurp_file($stderr_file);
+    ok($err !~ qr/Generating DSA key/,
+       "-quiet does not report the key generation");
+    unlink($stderr_file) if -f $stderr_file;
+};

 ok(!run(app(["openssl", "gendsa",
              'dsagen.pem', "-verbose"])),
    "gendsa with extra parameter (at end) should fail");

+subtest "gendsa error cases" => sub {
+    plan tests => 14;
+
+    app_fails('gendsa', "missing params file argument should fail",
+              qr/Missing argument: params file/);
+    app_fails('gendsa', "extra positional argument should fail",
+              qr/Extra argument after params file: "extra"/,
+              'dsagen.pem', 'extra');
+    app_fails('gendsa', "unknown cipher option should fail",
+              qr/Unknown option or cipher: badcipher/,
+              '-badcipher', 'dsagen.pem');
+    app_fails('gendsa', "invalid passout argument should fail",
+              qr/Error getting password/,
+              '-passout', 'bad:pass', 'dsagen.pem');
+    app_fails('gendsa', "nonexistent params file should fail",
+              qr/Could not open file or uri for loading key parameters/,
+              'nonexistent.pem');
+
+    my $garbage = "garbage.pem";
+    open(my $fh, '>', $garbage) or die "Cannot write $garbage: $!";
+    print $fh "not a valid DSA params file\n";
+    close($fh);
+    app_fails('gendsa', "garbage params file should fail",
+              qr/Could not find or decode key parameters/,
+              $garbage);
+    app_fails('gendsa', "non-DSA params file should fail",
+              qr/Could not find or decode key parameters of DSA parameters/,
+              srctop_file("test", "testrsa.pem"));
+};
+
 # test key generation with dsaparam tool
 ok(run(app([ 'openssl', 'dsaparam',
              '-genkey',