Home | History | Annotate | Line # | Download | only in recipes
      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 
      9 use strict;
     10 use warnings;
     11 
     12 use OpenSSL::Test qw(:DEFAULT data_file bldtop_dir srctop_file srctop_dir bldtop_file);
     13 use OpenSSL::Test::Utils;
     14 use File::Compare qw/compare_text/;
     15 
     16 BEGIN {
     17     setup("test_rsaoaep");
     18 }
     19 use lib srctop_dir('Configurations');
     20 use lib bldtop_dir('.');
     21 
     22 my $no_check = disabled('fips-securitychecks');
     23 
     24 plan tests =>
     25     ($no_check ? 0 : 1)         # FIPS security check
     26     + 9;
     27 
     28 my @prov = ( );
     29 my $provconf = srctop_file("test", "fips-and-base.cnf");
     30 my $provpath = bldtop_dir("providers");
     31 my $msg_file = data_file("plain_text");
     32 my $enc1_file = "enc1.bin";
     33 my $enc2_file = "enc2.bin";
     34 my $enc3_file = "enc3.bin";
     35 my $dec1_file = "dec1.txt";
     36 my $dec2_file = "dec2.txt";
     37 my $dec3_file = "dec3.txt";
     38 my $key_file = srctop_file("test", "testrsa2048.pem");
     39 my $small_key_file = srctop_file("test", "testrsa.pem");
     40 
     41 $ENV{OPENSSL_TEST_LIBCTX} = "1";
     42 
     43 unless ($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 
     58 ok(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 
     70 ok(!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 
     81 ok(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 
     94 ok(!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 
    105 ok(!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 
    116 ok(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 
    129 ok(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 
    140 ok(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 
    150 ok(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