1*e0c4386eSCy Schubert#! /usr/bin/env perl 2*e0c4386eSCy Schubert# Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved. 3*e0c4386eSCy Schubert# Copyright 2017 BaishanCloud. All rights reserved. 4*e0c4386eSCy Schubert# 5*e0c4386eSCy Schubert# Licensed under the Apache License 2.0 (the "License"). You may not use 6*e0c4386eSCy Schubert# this file except in compliance with the License. You can obtain a copy 7*e0c4386eSCy Schubert# in the file LICENSE in the source distribution or at 8*e0c4386eSCy Schubert# https://www.openssl.org/source/license.html 9*e0c4386eSCy Schubert 10*e0c4386eSCy Schubert 11*e0c4386eSCy Schubertuse strict; 12*e0c4386eSCy Schubertuse warnings; 13*e0c4386eSCy Schubert 14*e0c4386eSCy Schubertuse File::Spec; 15*e0c4386eSCy Schubertuse OpenSSL::Test qw/:DEFAULT data_file/; 16*e0c4386eSCy Schubertuse OpenSSL::Test::Utils; 17*e0c4386eSCy Schubert 18*e0c4386eSCy Schubertsetup("test_mp_rsa"); 19*e0c4386eSCy Schubert 20*e0c4386eSCy Schubertmy @test_param = ( 21*e0c4386eSCy Schubert # 3 primes, 2048-bit 22*e0c4386eSCy Schubert { 23*e0c4386eSCy Schubert primes => '3', 24*e0c4386eSCy Schubert bits => '2048', 25*e0c4386eSCy Schubert }, 26*e0c4386eSCy Schubert # 4 primes, 4096-bit 27*e0c4386eSCy Schubert { 28*e0c4386eSCy Schubert primes => '4', 29*e0c4386eSCy Schubert bits => '4096', 30*e0c4386eSCy Schubert }, 31*e0c4386eSCy Schubert # 5 primes, 8192-bit 32*e0c4386eSCy Schubert { 33*e0c4386eSCy Schubert primes => '5', 34*e0c4386eSCy Schubert bits => '8192', 35*e0c4386eSCy Schubert }, 36*e0c4386eSCy Schubert); 37*e0c4386eSCy Schubert 38*e0c4386eSCy Schubertplan tests => 2 + scalar(@test_param) * 5 * 2; 39*e0c4386eSCy Schubert 40*e0c4386eSCy Schubertok(run(test(["rsa_mp_test"])), "running rsa multi prime test"); 41*e0c4386eSCy Schubert 42*e0c4386eSCy Schubertok(run(app(['openssl', 'pkey', '-noout', '-check', '-in', 43*e0c4386eSCy Schubert data_file('rsamplcm.pem')])), "checking lcm in key check"); 44*e0c4386eSCy Schubert 45*e0c4386eSCy Schubertmy $cleartext = data_file("plain_text"); 46*e0c4386eSCy Schubert 47*e0c4386eSCy Schubert# genrsa 48*e0c4386eSCy Schubertrun_mp_tests(0); 49*e0c4386eSCy Schubert# evp 50*e0c4386eSCy Schubertrun_mp_tests(1); 51*e0c4386eSCy Schubert 52*e0c4386eSCy Schubertsub run_mp_tests { 53*e0c4386eSCy Schubert my $evp = shift; 54*e0c4386eSCy Schubert 55*e0c4386eSCy Schubert foreach my $param (@test_param) { 56*e0c4386eSCy Schubert my $primes = $param->{primes}; 57*e0c4386eSCy Schubert my $bits = $param->{bits}; 58*e0c4386eSCy Schubert my $name = ($evp ? "evp" : "") . "${bits}p${primes}"; 59*e0c4386eSCy Schubert 60*e0c4386eSCy Schubert if ($evp) { 61*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'genpkey', '-out', "rsamptest-$name.pem", 62*e0c4386eSCy Schubert '-algorithm', 'RSA', 63*e0c4386eSCy Schubert '-pkeyopt', "rsa_keygen_primes:$primes", 64*e0c4386eSCy Schubert '-pkeyopt', "rsa_keygen_bits:$bits"])), 65*e0c4386eSCy Schubert "genrsa $name"); 66*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'pkey', '-check', 67*e0c4386eSCy Schubert '-in', "rsamptest-$name.pem", '-noout'])), 68*e0c4386eSCy Schubert "rsa -check $name"); 69*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'pkeyutl', '-inkey', "rsamptest-$name.pem", 70*e0c4386eSCy Schubert '-encrypt', '-in', $cleartext, 71*e0c4386eSCy Schubert '-out', "rsamptest-$name.enc" ])), 72*e0c4386eSCy Schubert "rsa $name encrypt"); 73*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'pkeyutl', '-inkey', "rsamptest-$name.pem", 74*e0c4386eSCy Schubert '-decrypt', '-in', "rsamptest-$name.enc", 75*e0c4386eSCy Schubert '-out', "rsamptest-$name.dec" ])), 76*e0c4386eSCy Schubert "rsa $name decrypt"); 77*e0c4386eSCy Schubert } else { 78*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'genrsa', '-out', "rsamptest-$name.pem", 79*e0c4386eSCy Schubert '-primes', $primes, $bits])), "genrsa $name"); 80*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'rsa', '-check', 81*e0c4386eSCy Schubert '-in', "rsamptest-$name.pem", '-noout'])), 82*e0c4386eSCy Schubert "rsa -check $name"); 83*e0c4386eSCy Schubert if (!disabled('deprecated-3.0')) { 84*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'rsautl', '-inkey', "rsamptest-$name.pem", 85*e0c4386eSCy Schubert '-encrypt', '-in', $cleartext, 86*e0c4386eSCy Schubert '-out', "rsamptest-$name.enc" ])), 87*e0c4386eSCy Schubert "rsa $name encrypt"); 88*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'rsautl', '-inkey', "rsamptest-$name.pem", 89*e0c4386eSCy Schubert '-decrypt', '-in', "rsamptest-$name.enc", 90*e0c4386eSCy Schubert '-out', "rsamptest-$name.dec" ])), 91*e0c4386eSCy Schubert "rsa $name decrypt"); 92*e0c4386eSCy Schubert } else { 93*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'pkeyutl', '-inkey', "rsamptest-$name.pem", 94*e0c4386eSCy Schubert '-encrypt', '-in', $cleartext, 95*e0c4386eSCy Schubert '-out', "rsamptest-$name.enc" ])), 96*e0c4386eSCy Schubert "rsa $name encrypt"); 97*e0c4386eSCy Schubert ok(run(app([ 'openssl', 'pkeyutl', '-inkey', "rsamptest-$name.pem", 98*e0c4386eSCy Schubert '-decrypt', '-in', "rsamptest-$name.enc", 99*e0c4386eSCy Schubert '-out', "rsamptest-$name.dec" ])), 100*e0c4386eSCy Schubert "rsa $name decrypt"); 101*e0c4386eSCy Schubert } 102*e0c4386eSCy Schubert } 103*e0c4386eSCy Schubert ok(check_msg("rsamptest-$name.dec"), "rsa $name check result"); 104*e0c4386eSCy Schubert } 105*e0c4386eSCy Schubert} 106*e0c4386eSCy Schubert 107*e0c4386eSCy Schubertsub check_msg { 108*e0c4386eSCy Schubert my $decrypted = shift; 109*e0c4386eSCy Schubert my $msg; 110*e0c4386eSCy Schubert my $dec; 111*e0c4386eSCy Schubert 112*e0c4386eSCy Schubert open(my $fh, "<", $cleartext) or return 0; 113*e0c4386eSCy Schubert binmode $fh; 114*e0c4386eSCy Schubert read($fh, $msg, 10240); 115*e0c4386eSCy Schubert close $fh; 116*e0c4386eSCy Schubert open($fh, "<", $decrypted ) or return 0; 117*e0c4386eSCy Schubert binmode $fh; 118*e0c4386eSCy Schubert read($fh, $dec, 10240); 119*e0c4386eSCy Schubert close $fh; 120*e0c4386eSCy Schubert 121*e0c4386eSCy Schubert if ($msg ne $dec) { 122*e0c4386eSCy Schubert print STDERR "cleartext and decrypted are not the same"; 123*e0c4386eSCy Schubert return 0; 124*e0c4386eSCy Schubert } 125*e0c4386eSCy Schubert return 1; 126*e0c4386eSCy Schubert} 127