Add a test for fetching various non-evp objects
[openssl.git] / test / recipes / 20-test_dhparam.t
1 #! /usr/bin/env perl
2 # Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the Apache License 2.0 (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9
10 use strict;
11 use warnings;
12
13 use OpenSSL::Test qw(:DEFAULT data_file);
14 use OpenSSL::Test::Utils;
15
16 #Tests for the dhparam CLI application
17
18 setup("test_dhparam");
19
20 plan skip_all => "DH is not supported in this build"
21     if disabled("dh");
22 plan tests => 17;
23
24 sub checkdhparams {
25     my $file = shift; #Filename containing params
26     my $type = shift; #PKCS3 or X9.42?
27     my $gen = shift; #2, 5 or something else (0 is "something else")?
28     my $format = shift; #DER or PEM?
29     my $bits = shift; #Number of bits in p
30     my $pemtype;
31     my $readtype;
32     my $readbits = 0;
33     my $genline;
34
35     if (-T $file) {
36         #Text file. Check it looks like PEM
37         open(PEMFILE, '<', $file) or die $!;
38         if (my $firstline = <PEMFILE>) {
39             $firstline =~ s/\R$//;
40             if ($firstline eq "-----BEGIN DH PARAMETERS-----") {
41                 $pemtype = "PKCS3";
42             } elsif ($firstline eq "-----BEGIN X9.42 DH PARAMETERS-----") {
43                 $pemtype = "X9.42";
44             } else {
45                 $pemtype = "";
46             }
47         } else {
48             $pemtype = "";
49         }
50         close(PEMFILE);
51         ok(($format eq "PEM") && defined $pemtype, "Checking format is PEM");
52     } else {
53         ok($format eq "DER", "Checking format is DER");
54         #No PEM type in this case, so we just set the pemtype to the expected
55         #type so that we never fail that part of the test
56         $pemtype = $type;
57     }
58     my @textdata = run(app(['openssl', 'dhparam', '-in', $file, '-noout',
59                             '-text', '-inform', $format]), capture => 1);
60     chomp(@textdata);
61     #Trim trailing whitespace
62     @textdata = grep { s/\s*$//g } @textdata;
63     if (grep { $_ =~ 'Q:' } @textdata) {
64         $readtype = "X9.42";
65     } else {
66         $readtype = "PKCS3";
67     }
68     ok(($type eq $pemtype) && ($type eq $readtype),
69        "Checking parameter type is ".$type." ($pemtype, $readtype)");
70
71     if (defined $textdata[0] && $textdata[0] =~ /DH Parameters: \((\d+) bit\)/) {
72         $readbits = $1;
73     }
74     ok($bits == $readbits, "Checking number of bits is $bits");
75     if ($gen == 2 || $gen == 5) {
76         #For generators 2 and 5 the value appears on the same line
77         $genline = "G:    $gen (0x$gen)";
78     } else {
79         #For any other generator the value appears on the following line
80         $genline = "G:";
81     }
82
83     ok((grep { (index($_, $genline) + length ($genline)) == length ($_)} @textdata),
84        "Checking generator is correct");
85 }
86
87 #Test some "known good" parameter files to check that we can read them
88 subtest "Read: 1024 bit PKCS3 params, generator 2, PEM file" => sub {
89     plan tests => 4;
90     checkdhparams(data_file("pkcs3-2-1024.pem"), "PKCS3", 2, "PEM", 1024);
91 };
92 subtest "Read: 1024 bit PKCS3 params, generator 5, PEM file" => sub {
93     plan tests => 4;
94     checkdhparams(data_file("pkcs3-5-1024.pem"), "PKCS3", 5, "PEM", 1024);
95 };
96 subtest "Read: 2048 bit PKCS3 params, generator 2, PEM file" => sub {
97     plan tests => 4;
98     checkdhparams(data_file("pkcs3-2-2048.pem"), "PKCS3", 2, "PEM", 2048);
99 };
100 subtest "Read: 1024 bit X9.42 params, PEM file" => sub {
101     plan tests => 4;
102     checkdhparams(data_file("x942-0-1024.pem"), "X9.42", 0, "PEM", 1024);
103 };
104 subtest "Read: 1024 bit PKCS3 params, generator 2, DER file" => sub {
105     plan tests => 4;
106     checkdhparams(data_file("pkcs3-2-1024.der"), "PKCS3", 2, "DER", 1024);
107 };
108 subtest "Read: 1024 bit PKCS3 params, generator 5, DER file" => sub {
109     plan tests => 4;
110     checkdhparams(data_file("pkcs3-5-1024.der"), "PKCS3", 5, "DER", 1024);
111 };
112 subtest "Read: 2048 bit PKCS3 params, generator 2, DER file" => sub {
113     plan tests => 4;
114     checkdhparams(data_file("pkcs3-2-2048.der"), "PKCS3", 2, "DER", 2048);
115 };
116 subtest "Read: 1024 bit X9.42 params, DER file" => sub {
117     checkdhparams(data_file("x942-0-1024.der"), "X9.42", 0, "DER", 1024);
118 };
119
120 #Test that generating parameters of different types creates what we expect. We
121 #use 512 for the size for speed reasons. Don't use this in real applications!
122 subtest "Generate: 512 bit PKCS3 params, generator 2, PEM file" => sub {
123     plan tests => 5;
124     ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-pkcs3-2-512.pem',
125                  '512' ])));
126     checkdhparams("gen-pkcs3-2-512.pem", "PKCS3", 2, "PEM", 512);
127 };
128 subtest "Generate: 512 bit PKCS3 params, explicit generator 2, PEM file" => sub {
129     plan tests => 5;
130     ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-pkcs3-exp2-512.pem', '-2',
131                  '512' ])));
132     checkdhparams("gen-pkcs3-exp2-512.pem", "PKCS3", 2, "PEM", 512);
133 };
134 subtest "Generate: 512 bit PKCS3 params, generator 5, PEM file" => sub {
135     plan tests => 5;
136     ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-pkcs3-5-512.pem', '-5',
137                  '512' ])));
138     checkdhparams("gen-pkcs3-5-512.pem", "PKCS3", 5, "PEM", 512);
139 };
140 subtest "Generate: 512 bit PKCS3 params, generator 2, explicit PEM file" => sub {
141     plan tests => 5;
142     ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-pkcs3-2-512.exp.pem',
143                  '-outform', 'PEM', '512' ])));
144     checkdhparams("gen-pkcs3-2-512.exp.pem", "PKCS3", 2, "PEM", 512);
145 };
146 SKIP: {
147     skip "Skipping tests that require DSA", 4 if disabled("dsa");
148
149     subtest "Generate: 512 bit X9.42 params, generator 0, PEM file" => sub {
150         plan tests => 5;
151         ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-x942-0-512.pem',
152                     '-dsaparam', '512' ])));
153         checkdhparams("gen-x942-0-512.pem", "X9.42", 0, "PEM", 512);
154     };
155     subtest "Generate: 512 bit X9.42 params, explicit generator 2, PEM file" => sub {
156         plan tests => 1;
157         #Expected to fail - you cannot select a generator with '-dsaparam'
158         ok(!run(app([ 'openssl', 'dhparam', '-out', 'gen-x942-exp2-512.pem', '-2',
159                     '-dsaparam', '512' ])));
160     };
161     subtest "Generate: 512 bit X9.42 params, generator 5, PEM file" => sub {
162         plan tests => 1;
163         #Expected to fail - you cannot select a generator with '-dsaparam'
164         ok(!run(app([ 'openssl', 'dhparam', '-out', 'gen-x942-5-512.pem',
165                     '-5', '-dsaparam', '512' ])));
166     };
167     subtest "Generate: 512 bit X9.42 params, generator 0, DER file" => sub {
168         plan tests => 5;
169         ok(run(app([ 'openssl', 'dhparam', '-out', 'gen-x942-0-512.der',
170                     '-dsaparam', '-outform', 'DER', '512' ])));
171         checkdhparams("gen-x942-0-512.der", "X9.42", 0, "DER", 512);
172     };
173 }
174
175 ok(run(app(["openssl", "dhparam", "-noout", "-text"],
176            stdin => data_file("pkcs3-2-1024.pem"))),
177    "stdinbuffer input test that uses BIO_gets");