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