xref: /freebsd/crypto/openssl/test/recipes/20-test_pkeyutl.t (revision e0c4386e7e71d93b0edc0c8fa156263fc4a8b0b6)
1*e0c4386eSCy Schubert#! /usr/bin/env perl
2*e0c4386eSCy Schubert# Copyright 2018-2023 The OpenSSL Project Authors. All Rights Reserved.
3*e0c4386eSCy Schubert#
4*e0c4386eSCy Schubert# Licensed under the Apache License 2.0 (the "License").  You may not use
5*e0c4386eSCy Schubert# this file except in compliance with the License.  You can obtain a copy
6*e0c4386eSCy Schubert# in the file LICENSE in the source distribution or at
7*e0c4386eSCy Schubert# https://www.openssl.org/source/license.html
8*e0c4386eSCy Schubert
9*e0c4386eSCy Schubertuse strict;
10*e0c4386eSCy Schubertuse warnings;
11*e0c4386eSCy Schubert
12*e0c4386eSCy Schubertuse File::Spec;
13*e0c4386eSCy Schubertuse File::Basename;
14*e0c4386eSCy Schubertuse OpenSSL::Test qw/:DEFAULT srctop_file ok_nofips/;
15*e0c4386eSCy Schubertuse OpenSSL::Test::Utils;
16*e0c4386eSCy Schubertuse File::Compare qw/compare_text/;
17*e0c4386eSCy Schubert
18*e0c4386eSCy Schubertsetup("test_pkeyutl");
19*e0c4386eSCy Schubert
20*e0c4386eSCy Schubertplan tests => 14;
21*e0c4386eSCy Schubert
22*e0c4386eSCy Schubert# For the tests below we use the cert itself as the TBS file
23*e0c4386eSCy Schubert
24*e0c4386eSCy SchubertSKIP: {
25*e0c4386eSCy Schubert    skip "Skipping tests that require EC, SM2 or SM3", 4
26*e0c4386eSCy Schubert        if disabled("ec") || disabled("sm2") || disabled("sm3");
27*e0c4386eSCy Schubert
28*e0c4386eSCy Schubert    # SM2
29*e0c4386eSCy Schubert    ok_nofips(run(app(([ 'openssl', 'pkeyutl', '-sign',
30*e0c4386eSCy Schubert                      '-in', srctop_file('test', 'certs', 'sm2.pem'),
31*e0c4386eSCy Schubert                      '-inkey', srctop_file('test', 'certs', 'sm2.key'),
32*e0c4386eSCy Schubert                      '-out', 'sm2.sig', '-rawin',
33*e0c4386eSCy Schubert                      '-digest', 'sm3', '-pkeyopt', 'distid:someid']))),
34*e0c4386eSCy Schubert                      "Sign a piece of data using SM2");
35*e0c4386eSCy Schubert    ok_nofips(run(app(([ 'openssl', 'pkeyutl',
36*e0c4386eSCy Schubert                      '-verify', '-certin',
37*e0c4386eSCy Schubert                      '-in', srctop_file('test', 'certs', 'sm2.pem'),
38*e0c4386eSCy Schubert                      '-inkey', srctop_file('test', 'certs', 'sm2.pem'),
39*e0c4386eSCy Schubert                      '-sigfile', 'sm2.sig', '-rawin',
40*e0c4386eSCy Schubert                      '-digest', 'sm3', '-pkeyopt', 'distid:someid']))),
41*e0c4386eSCy Schubert                      "Verify an SM2 signature against a piece of data");
42*e0c4386eSCy Schubert    ok_nofips(run(app(([ 'openssl', 'pkeyutl', '-encrypt',
43*e0c4386eSCy Schubert                      '-in', srctop_file('test', 'data2.bin'),
44*e0c4386eSCy Schubert                      '-inkey', srctop_file('test', 'certs', 'sm2-pub.key'),
45*e0c4386eSCy Schubert                      '-pubin', '-out', 'sm2.enc']))),
46*e0c4386eSCy Schubert                      "Encrypt a piece of data using SM2");
47*e0c4386eSCy Schubert    ok_nofips(run(app(([ 'openssl', 'pkeyutl', '-decrypt',
48*e0c4386eSCy Schubert                      '-in', 'sm2.enc',
49*e0c4386eSCy Schubert                      '-inkey', srctop_file('test', 'certs', 'sm2.key'),
50*e0c4386eSCy Schubert                      '-out', 'sm2.dat'])))
51*e0c4386eSCy Schubert                      && compare_text('sm2.dat',
52*e0c4386eSCy Schubert                                      srctop_file('test', 'data2.bin')) == 0,
53*e0c4386eSCy Schubert                      "Decrypt a piece of data using SM2");
54*e0c4386eSCy Schubert}
55*e0c4386eSCy Schubert
56*e0c4386eSCy SchubertSKIP: {
57*e0c4386eSCy Schubert    skip "Skipping tests that require EC", 4
58*e0c4386eSCy Schubert        if disabled("ec");
59*e0c4386eSCy Schubert
60*e0c4386eSCy Schubert    # Ed25519
61*e0c4386eSCy Schubert    ok(run(app(([ 'openssl', 'pkeyutl', '-sign', '-in',
62*e0c4386eSCy Schubert                  srctop_file('test', 'certs', 'server-ed25519-cert.pem'),
63*e0c4386eSCy Schubert                  '-inkey', srctop_file('test', 'certs', 'server-ed25519-key.pem'),
64*e0c4386eSCy Schubert                  '-out', 'Ed25519.sig', '-rawin']))),
65*e0c4386eSCy Schubert                  "Sign a piece of data using Ed25519");
66*e0c4386eSCy Schubert    ok(run(app(([ 'openssl', 'pkeyutl', '-verify', '-certin', '-in',
67*e0c4386eSCy Schubert                  srctop_file('test', 'certs', 'server-ed25519-cert.pem'),
68*e0c4386eSCy Schubert                  '-inkey', srctop_file('test', 'certs', 'server-ed25519-cert.pem'),
69*e0c4386eSCy Schubert                  '-sigfile', 'Ed25519.sig', '-rawin']))),
70*e0c4386eSCy Schubert                  "Verify an Ed25519 signature against a piece of data");
71*e0c4386eSCy Schubert
72*e0c4386eSCy Schubert    # Ed448
73*e0c4386eSCy Schubert    ok(run(app(([ 'openssl', 'pkeyutl', '-sign', '-in',
74*e0c4386eSCy Schubert                  srctop_file('test', 'certs', 'server-ed448-cert.pem'),
75*e0c4386eSCy Schubert                  '-inkey', srctop_file('test', 'certs', 'server-ed448-key.pem'),
76*e0c4386eSCy Schubert                  '-out', 'Ed448.sig', '-rawin']))),
77*e0c4386eSCy Schubert                  "Sign a piece of data using Ed448");
78*e0c4386eSCy Schubert    ok(run(app(([ 'openssl', 'pkeyutl', '-verify', '-certin', '-in',
79*e0c4386eSCy Schubert                  srctop_file('test', 'certs', 'server-ed448-cert.pem'),
80*e0c4386eSCy Schubert                  '-inkey', srctop_file('test', 'certs', 'server-ed448-cert.pem'),
81*e0c4386eSCy Schubert                  '-sigfile', 'Ed448.sig', '-rawin']))),
82*e0c4386eSCy Schubert                  "Verify an Ed448 signature against a piece of data");
83*e0c4386eSCy Schubert}
84*e0c4386eSCy Schubert
85*e0c4386eSCy Schubertsub tsignverify {
86*e0c4386eSCy Schubert    my $testtext = shift;
87*e0c4386eSCy Schubert    my $privkey = shift;
88*e0c4386eSCy Schubert    my $pubkey = shift;
89*e0c4386eSCy Schubert    my @extraopts = @_;
90*e0c4386eSCy Schubert
91*e0c4386eSCy Schubert    my $data_to_sign = srctop_file('test', 'data.bin');
92*e0c4386eSCy Schubert    my $other_data = srctop_file('test', 'data2.bin');
93*e0c4386eSCy Schubert    my $sigfile = basename($privkey, '.pem') . '.sig';
94*e0c4386eSCy Schubert
95*e0c4386eSCy Schubert    my @args = ();
96*e0c4386eSCy Schubert    plan tests => 5;
97*e0c4386eSCy Schubert
98*e0c4386eSCy Schubert    @args = ('openssl', 'pkeyutl', '-sign',
99*e0c4386eSCy Schubert             '-inkey', $privkey,
100*e0c4386eSCy Schubert             '-out', $sigfile,
101*e0c4386eSCy Schubert             '-in', $data_to_sign);
102*e0c4386eSCy Schubert    push(@args, @extraopts);
103*e0c4386eSCy Schubert    ok(run(app([@args])),
104*e0c4386eSCy Schubert       $testtext.": Generating signature");
105*e0c4386eSCy Schubert
106*e0c4386eSCy Schubert    @args = ('openssl', 'pkeyutl', '-sign',
107*e0c4386eSCy Schubert             '-inkey', $privkey,
108*e0c4386eSCy Schubert             '-keyform', 'DER',
109*e0c4386eSCy Schubert             '-out', $sigfile,
110*e0c4386eSCy Schubert             '-in', $data_to_sign);
111*e0c4386eSCy Schubert    push(@args, @extraopts);
112*e0c4386eSCy Schubert    ok(!run(app([@args])),
113*e0c4386eSCy Schubert       $testtext.": Checking that mismatching keyform fails");
114*e0c4386eSCy Schubert
115*e0c4386eSCy Schubert    @args = ('openssl', 'pkeyutl', '-verify',
116*e0c4386eSCy Schubert             '-inkey', $privkey,
117*e0c4386eSCy Schubert             '-sigfile', $sigfile,
118*e0c4386eSCy Schubert             '-in', $data_to_sign);
119*e0c4386eSCy Schubert    push(@args, @extraopts);
120*e0c4386eSCy Schubert    ok(run(app([@args])),
121*e0c4386eSCy Schubert       $testtext.": Verify signature with private key");
122*e0c4386eSCy Schubert
123*e0c4386eSCy Schubert    @args = ('openssl', 'pkeyutl', '-verify',
124*e0c4386eSCy Schubert             '-keyform', 'PEM',
125*e0c4386eSCy Schubert             '-inkey', $pubkey, '-pubin',
126*e0c4386eSCy Schubert             '-sigfile', $sigfile,
127*e0c4386eSCy Schubert             '-in', $data_to_sign);
128*e0c4386eSCy Schubert    push(@args, @extraopts);
129*e0c4386eSCy Schubert    ok(run(app([@args])),
130*e0c4386eSCy Schubert       $testtext.": Verify signature with public key");
131*e0c4386eSCy Schubert
132*e0c4386eSCy Schubert    @args = ('openssl', 'pkeyutl', '-verify',
133*e0c4386eSCy Schubert             '-inkey', $pubkey, '-pubin',
134*e0c4386eSCy Schubert             '-sigfile', $sigfile,
135*e0c4386eSCy Schubert             '-in', $other_data);
136*e0c4386eSCy Schubert    push(@args, @extraopts);
137*e0c4386eSCy Schubert    ok(!run(app([@args])),
138*e0c4386eSCy Schubert       $testtext.": Expect failure verifying mismatching data");
139*e0c4386eSCy Schubert}
140*e0c4386eSCy Schubert
141*e0c4386eSCy SchubertSKIP: {
142*e0c4386eSCy Schubert    skip "RSA is not supported by this OpenSSL build", 1
143*e0c4386eSCy Schubert        if disabled("rsa");
144*e0c4386eSCy Schubert
145*e0c4386eSCy Schubert    subtest "RSA CLI signature generation and verification" => sub {
146*e0c4386eSCy Schubert        tsignverify("RSA",
147*e0c4386eSCy Schubert                    srctop_file("test","testrsa.pem"),
148*e0c4386eSCy Schubert                    srctop_file("test","testrsapub.pem"),
149*e0c4386eSCy Schubert                    "-rawin", "-digest", "sha256");
150*e0c4386eSCy Schubert    };
151*e0c4386eSCy Schubert
152*e0c4386eSCy Schubert    subtest "RSA CLI signature and verification with pkeyopt" => sub {
153*e0c4386eSCy Schubert        tsignverify("RSA",
154*e0c4386eSCy Schubert                    srctop_file("test","testrsa.pem"),
155*e0c4386eSCy Schubert                    srctop_file("test","testrsapub.pem"),
156*e0c4386eSCy Schubert                    "-rawin", "-digest", "sha256",
157*e0c4386eSCy Schubert                    "-pkeyopt", "rsa_padding_mode:pss");
158*e0c4386eSCy Schubert    };
159*e0c4386eSCy Schubert}
160*e0c4386eSCy Schubert
161*e0c4386eSCy SchubertSKIP: {
162*e0c4386eSCy Schubert    skip "DSA is not supported by this OpenSSL build", 1
163*e0c4386eSCy Schubert        if disabled("dsa");
164*e0c4386eSCy Schubert
165*e0c4386eSCy Schubert    subtest "DSA CLI signature generation and verification" => sub {
166*e0c4386eSCy Schubert        tsignverify("DSA",
167*e0c4386eSCy Schubert                    srctop_file("test","testdsa.pem"),
168*e0c4386eSCy Schubert                    srctop_file("test","testdsapub.pem"),
169*e0c4386eSCy Schubert                    "-rawin", "-digest", "sha256");
170*e0c4386eSCy Schubert    };
171*e0c4386eSCy Schubert}
172*e0c4386eSCy Schubert
173*e0c4386eSCy SchubertSKIP: {
174*e0c4386eSCy Schubert    skip "ECDSA is not supported by this OpenSSL build", 1
175*e0c4386eSCy Schubert        if disabled("ec");
176*e0c4386eSCy Schubert
177*e0c4386eSCy Schubert    subtest "ECDSA CLI signature generation and verification" => sub {
178*e0c4386eSCy Schubert        tsignverify("ECDSA",
179*e0c4386eSCy Schubert                    srctop_file("test","testec-p256.pem"),
180*e0c4386eSCy Schubert                    srctop_file("test","testecpub-p256.pem"),
181*e0c4386eSCy Schubert                    "-rawin", "-digest", "sha256");
182*e0c4386eSCy Schubert    };
183*e0c4386eSCy Schubert}
184*e0c4386eSCy Schubert
185*e0c4386eSCy SchubertSKIP: {
186*e0c4386eSCy Schubert    skip "EdDSA is not supported by this OpenSSL build", 2
187*e0c4386eSCy Schubert        if disabled("ec");
188*e0c4386eSCy Schubert
189*e0c4386eSCy Schubert    subtest "Ed2559 CLI signature generation and verification" => sub {
190*e0c4386eSCy Schubert        tsignverify("Ed25519",
191*e0c4386eSCy Schubert                    srctop_file("test","tested25519.pem"),
192*e0c4386eSCy Schubert                    srctop_file("test","tested25519pub.pem"),
193*e0c4386eSCy Schubert                    "-rawin");
194*e0c4386eSCy Schubert    };
195*e0c4386eSCy Schubert
196*e0c4386eSCy Schubert    subtest "Ed448 CLI signature generation and verification" => sub {
197*e0c4386eSCy Schubert        tsignverify("Ed448",
198*e0c4386eSCy Schubert                    srctop_file("test","tested448.pem"),
199*e0c4386eSCy Schubert                    srctop_file("test","tested448pub.pem"),
200*e0c4386eSCy Schubert                    "-rawin");
201*e0c4386eSCy Schubert    };
202*e0c4386eSCy Schubert}
203