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