Home | History | Annotate | Line # | Download | only in recipes
      1 #! /usr/bin/env perl
      2 # Copyright 2024-2025 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 srctop_dir bldtop_dir srctop_file);
     13 use OpenSSL::Test::Utils;
     14 
     15 BEGIN {
     16     setup("test_ml_dsa");
     17 }
     18 
     19 my $provconf = srctop_file("test", "fips-and-base.cnf");
     20 # fips will be added later
     21 my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
     22 
     23 use lib srctop_dir('Configurations');
     24 use lib bldtop_dir('.');
     25 
     26 plan skip_all => 'ML-DSA is not supported in this build' if disabled('ml-dsa');
     27 plan tests => 12;
     28 
     29 require_ok(srctop_file('test','recipes','tconversion.pl'));
     30 
     31 subtest "ml-dsa-44 conversions using 'openssl pkey' -- private key" => sub {
     32     tconversion( -type => "pkey",
     33                  -in => srctop_file("test","testmldsa44.pem"),
     34                  -prefix => "mldsa44-pkey-priv" );
     35 };
     36 subtest "ml-dsa-44 conversions using 'openssl pkey' -- pkcs8 key" => sub {
     37     tconversion( -type => "pkey",
     38                  -in => srctop_file("test","testmldsa44.pem"),
     39                  -args => ["pkey"],
     40                  -prefix => "mldsa44-pkey-pkcs8" );
     41 };
     42 subtest "ml-dsa-44 conversions using 'openssl pkey' -- pub key" => sub {
     43     tconversion( -type => "pkey",
     44                  -in => srctop_file("test","testmldsa44pub.pem"),
     45                  -args => ["pkey", "-pubin", "-pubout"],
     46                  -prefix => "mldsa44-pkey-pub" );
     47 };
     48 
     49 subtest "ml-dsa-65 conversions using 'openssl pkey' -- private key" => sub {
     50     tconversion( -type => "pkey",
     51                  -in => srctop_file("test","testmldsa65.pem"),
     52                  -prefix => "mldsa65-pkey-priv");
     53 };
     54 subtest "ml-dsa-65 conversions using 'openssl pkey' -- pkcs8 key" => sub {
     55     tconversion( -type => "pkey", -in => srctop_file("test","testmldsa65.pem"),
     56                  -args => ["pkey"], -prefix => "mldsa65-pkey-pkcs8");
     57 };
     58 subtest "ml-dsa-65 conversions using 'openssl pkey' -- pub key" => sub {
     59     tconversion( -type => "pkey",
     60                  -in => srctop_file("test","testmldsa65pub.pem"),
     61                  -args => ["pkey", "-pubin", "-pubout"],
     62                  -prefix => "mldsa65-pkey-pub" );
     63 };
     64 
     65 subtest "ml-dsa-87 conversions using 'openssl pkey' -- private key" => sub {
     66     tconversion( -type => "pkey",
     67                  -in => srctop_file("test","testmldsa87.pem"),
     68                  -prefix => "mldsa87-pkey-priv" );
     69 };
     70 subtest "ml-dsa-87 conversions using 'openssl pkey' -- pkcs8 key" => sub {
     71     tconversion( -type => "pkey",
     72                  -in => srctop_file("test","testmldsa87.pem"),
     73                  -args => ["pkey"],
     74                  -prefix => "mldsa87-pkey-pkcs8" );
     75 };
     76 subtest "ml-dsa-87 conversions using 'openssl pkey' -- pub key" => sub {
     77     tconversion( -type => "pkey",
     78                  -in => srctop_file("test","testmldsa87pub.pem"),
     79                  -args => ["pkey", "-pubin", "-pubout"],
     80                  -prefix => "mldsa87-pkey-pub" );
     81 };
     82 
     83 ok(run(test(["ml_dsa_test"])), "running ml_dsa_test");
     84 
     85 SKIP: {
     86     skip "Skipping FIPS tests", 1
     87         if $no_fips;
     88 
     89     # ML-DSA is only present after OpenSSL 3.5
     90     run(test(["fips_version_test", "-config", $provconf, ">=3.5.0"]),
     91              capture => 1, statusvar => \my $exit);
     92     skip "FIPS provider version is too old for ML-DSA test", 1
     93         if !$exit;
     94 
     95     ok(run(test(["ml_dsa_test", "-config",  $provconf])),
     96            "running ml_dsa_test with FIPS");
     97 }
     98