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