1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ciuse strict;
10e1051a39Sopenharmony_ciuse warnings;
11e1051a39Sopenharmony_ci
12e1051a39Sopenharmony_ciuse OpenSSL::Test qw(:DEFAULT data_file bldtop_dir srctop_file srctop_dir bldtop_file);
13e1051a39Sopenharmony_ciuse OpenSSL::Test::Utils;
14e1051a39Sopenharmony_ciuse File::Compare qw/compare_text/;
15e1051a39Sopenharmony_ci
16e1051a39Sopenharmony_ciBEGIN {
17e1051a39Sopenharmony_ci    setup("test_rsaoaep");
18e1051a39Sopenharmony_ci}
19e1051a39Sopenharmony_ciuse lib srctop_dir('Configurations');
20e1051a39Sopenharmony_ciuse lib bldtop_dir('.');
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_cimy $no_check = disabled('fips-securitychecks');
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ciplan tests =>
25e1051a39Sopenharmony_ci    ($no_check ? 0 : 1)         # FIPS security check
26e1051a39Sopenharmony_ci    + 9;
27e1051a39Sopenharmony_ci
28e1051a39Sopenharmony_cimy @prov = ( );
29e1051a39Sopenharmony_cimy $provconf = srctop_file("test", "fips-and-base.cnf");
30e1051a39Sopenharmony_cimy $provpath = bldtop_dir("providers");
31e1051a39Sopenharmony_cimy $msg_file = data_file("plain_text");
32e1051a39Sopenharmony_cimy $enc1_file = "enc1.bin";
33e1051a39Sopenharmony_cimy $enc2_file = "enc2.bin";
34e1051a39Sopenharmony_cimy $enc3_file = "enc3.bin";
35e1051a39Sopenharmony_cimy $dec1_file = "dec1.txt";
36e1051a39Sopenharmony_cimy $dec2_file = "dec2.txt";
37e1051a39Sopenharmony_cimy $dec3_file = "dec3.txt";
38e1051a39Sopenharmony_cimy $key_file = srctop_file("test", "testrsa2048.pem");
39e1051a39Sopenharmony_cimy $small_key_file = srctop_file("test", "testrsa.pem");
40e1051a39Sopenharmony_ci
41e1051a39Sopenharmony_ci$ENV{OPENSSL_TEST_LIBCTX} = "1";
42e1051a39Sopenharmony_ci
43e1051a39Sopenharmony_ciunless ($no_check) {
44e1051a39Sopenharmony_ci    @prov = ( "-provider-path", $provpath, "-config", $provconf );
45e1051a39Sopenharmony_ci    ok(!run(app(['openssl', 'pkeyutl',
46e1051a39Sopenharmony_ci                 @prov,
47e1051a39Sopenharmony_ci                 '-encrypt',
48e1051a39Sopenharmony_ci                 '-in', $msg_file,
49e1051a39Sopenharmony_ci                 '-inkey', $small_key_file,
50e1051a39Sopenharmony_ci                 '-pkeyopt', 'pad-mode:oaep',
51e1051a39Sopenharmony_ci                 '-pkeyopt', 'oaep-label:123',
52e1051a39Sopenharmony_ci                 '-pkeyopt', 'digest:sha1',
53e1051a39Sopenharmony_ci                 '-pkeyopt', 'mgf1-digest:sha1',
54e1051a39Sopenharmony_ci                 '-out', $enc1_file])),
55e1051a39Sopenharmony_ci       "RSA OAEP Encryption with a key smaller than 2048 in fips mode should fail");
56e1051a39Sopenharmony_ci}
57e1051a39Sopenharmony_ci
58e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
59e1051a39Sopenharmony_ci            @prov,
60e1051a39Sopenharmony_ci            '-encrypt',
61e1051a39Sopenharmony_ci            '-in', $msg_file,
62e1051a39Sopenharmony_ci            '-inkey', $key_file,
63e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
64e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
65e1051a39Sopenharmony_ci            '-pkeyopt', 'digest:sha1',
66e1051a39Sopenharmony_ci            '-pkeyopt', 'mgf1-digest:sha1',
67e1051a39Sopenharmony_ci            '-out', $enc1_file])),
68e1051a39Sopenharmony_ci   "RSA OAEP Encryption");
69e1051a39Sopenharmony_ci
70e1051a39Sopenharmony_ciok(!run(app(['openssl', 'pkeyutl',
71e1051a39Sopenharmony_ci             @prov,
72e1051a39Sopenharmony_ci             '-encrypt',
73e1051a39Sopenharmony_ci             '-in', $key_file,
74e1051a39Sopenharmony_ci             '-inkey', $key_file,
75e1051a39Sopenharmony_ci             '-pkeyopt', 'pad-mode:oaep',
76e1051a39Sopenharmony_ci             '-pkeyopt', 'oaep-label:123',
77e1051a39Sopenharmony_ci             '-pkeyopt', 'digest:sha256',
78e1051a39Sopenharmony_ci             '-pkeyopt', 'mgf1-digest:sha1'])),
79e1051a39Sopenharmony_ci   "RSA OAEP Encryption should fail if the message is larger than the rsa modulus");
80e1051a39Sopenharmony_ci
81e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
82e1051a39Sopenharmony_ci            @prov,
83e1051a39Sopenharmony_ci            '-decrypt',
84e1051a39Sopenharmony_ci            '-inkey', $key_file,
85e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
86e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
87e1051a39Sopenharmony_ci            '-pkeyopt', 'digest:sha1',
88e1051a39Sopenharmony_ci            '-pkeyopt', 'mgf1-digest:sha1',
89e1051a39Sopenharmony_ci            '-in', $enc1_file,
90e1051a39Sopenharmony_ci            '-out', $dec1_file]))
91e1051a39Sopenharmony_ci    && compare_text($dec1_file, $msg_file) == 0,
92e1051a39Sopenharmony_ci    "RSA OAEP Decryption");
93e1051a39Sopenharmony_ci
94e1051a39Sopenharmony_ciok(!run(app(['openssl', 'pkeyutl',
95e1051a39Sopenharmony_ci             @prov,
96e1051a39Sopenharmony_ci             '-decrypt',
97e1051a39Sopenharmony_ci             '-inkey', $key_file,
98e1051a39Sopenharmony_ci             '-pkeyopt', 'pad-mode:oaep',
99e1051a39Sopenharmony_ci             '-pkeyopt', 'oaep-label:123',
100e1051a39Sopenharmony_ci             '-pkeyopt', 'digest:sha256',
101e1051a39Sopenharmony_ci             '-pkeyopt', 'mgf1-digest:sha224',
102e1051a39Sopenharmony_ci             '-in', $enc1_file])),
103e1051a39Sopenharmony_ci    "Incorrect digest for RSA OAEP Decryption");
104e1051a39Sopenharmony_ci
105e1051a39Sopenharmony_ciok(!run(app(['openssl', 'pkeyutl',
106e1051a39Sopenharmony_ci             @prov,
107e1051a39Sopenharmony_ci             '-decrypt',
108e1051a39Sopenharmony_ci             '-inkey', $key_file,
109e1051a39Sopenharmony_ci             '-pkeyopt', 'pad-mode:oaep',
110e1051a39Sopenharmony_ci             '-pkeyopt', 'oaep-label:123',
111e1051a39Sopenharmony_ci             '-pkeyopt', 'digest:sha1',
112e1051a39Sopenharmony_ci             '-pkeyopt', 'mgf1-digest:sha224',
113e1051a39Sopenharmony_ci             '-in', $enc1_file])),
114e1051a39Sopenharmony_ci    "Incorrect mgf1-digest for RSA OAEP Decryption");
115e1051a39Sopenharmony_ci
116e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
117e1051a39Sopenharmony_ci            @prov,
118e1051a39Sopenharmony_ci            '-encrypt',
119e1051a39Sopenharmony_ci            '-in', $msg_file,
120e1051a39Sopenharmony_ci            '-inkey', $key_file,
121e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
122e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
123e1051a39Sopenharmony_ci            '-pkeyopt', 'digest:sha1',
124e1051a39Sopenharmony_ci            '-pkeyopt', 'mgf1-digest:sha1',
125e1051a39Sopenharmony_ci            '-out', $enc2_file]))
126e1051a39Sopenharmony_ci    && compare_text($enc2_file, $enc1_file) != 0,
127e1051a39Sopenharmony_ci   "RSA OAEP Encryption should generate different encrypted data");
128e1051a39Sopenharmony_ci
129e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
130e1051a39Sopenharmony_ci            @prov,
131e1051a39Sopenharmony_ci            '-decrypt',
132e1051a39Sopenharmony_ci            '-inkey', $key_file,
133e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
134e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
135e1051a39Sopenharmony_ci            '-in', $enc2_file,
136e1051a39Sopenharmony_ci            '-out', $dec2_file]))
137e1051a39Sopenharmony_ci    && compare_text($dec2_file, $msg_file) == 0,
138e1051a39Sopenharmony_ci    "RSA OAEP Decryption with default digests");
139e1051a39Sopenharmony_ci
140e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
141e1051a39Sopenharmony_ci            @prov,
142e1051a39Sopenharmony_ci            '-encrypt',
143e1051a39Sopenharmony_ci            '-in', $msg_file,
144e1051a39Sopenharmony_ci            '-inkey', $key_file,
145e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
146e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
147e1051a39Sopenharmony_ci            '-out', $enc3_file])),
148e1051a39Sopenharmony_ci   "RSA OAEP Encryption with default digests");
149e1051a39Sopenharmony_ci
150e1051a39Sopenharmony_ciok(run(app(['openssl', 'pkeyutl',
151e1051a39Sopenharmony_ci            @prov,
152e1051a39Sopenharmony_ci            '-decrypt',
153e1051a39Sopenharmony_ci            '-inkey', $key_file,
154e1051a39Sopenharmony_ci            '-pkeyopt', 'pad-mode:oaep',
155e1051a39Sopenharmony_ci            '-pkeyopt', 'oaep-label:123',
156e1051a39Sopenharmony_ci            '-pkeyopt', 'digest:sha1',
157e1051a39Sopenharmony_ci            '-pkeyopt', 'mgf1-digest:sha1',
158e1051a39Sopenharmony_ci            '-in', $enc3_file,
159e1051a39Sopenharmony_ci            '-out', $dec3_file]))
160e1051a39Sopenharmony_ci    && compare_text($dec3_file, $msg_file) == 0,
161e1051a39Sopenharmony_ci    "RSA OAEP Decryption with explicit default digests");
162