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