Commit ecb0f148 authored by Matt Caswell's avatar Matt Caswell
Browse files

Add the NIST CAVS test vectors for CCM



This imports all of the NIST CAVS test vectors for CCM (SP800-38C) and
coverts them for use within evp_test. This commit also adds a script to
convert the .rsp CAVS files into the evp_test format.

Reviewed-by: default avatarShane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8981)
parent bddf965d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ setup("test_evp");

my @files = ( "evpciph.txt", "evpdigest.txt", "evpencod.txt", "evpkdf.txt",
    "evppkey_kdf.txt", "evpmac.txt", "evppbe.txt", "evppkey.txt",
    "evppkey_ecc.txt", "evpcase.txt", "evpaessiv.txt" );
    "evppkey_ecc.txt", "evpcase.txt", "evpaessiv.txt", "evpccmcavs.txt" );

plan tests => scalar(@files);

+23927 −0

File added.

Preview size limit exceeded, changes collapsed.

+121 −0
Original line number Diff line number Diff line
#! /usr/bin/env perl
# Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

#Convert CCM CAVS test vectors to a format suitable for evp_test

use strict;
use warnings;

my $alg;
my $mode;
my $keylen;
my $key = "";
my $iv = "";
my $aad = "";
my $ct = "";
my $pt = "";
my $tag = "";
my $aadlen = 0;
my $ptlen = 0;
my $taglen = 0;
my $res = "";
my $intest = 0;
my $fixediv = 0;

while (<STDIN>)
{
    chomp;

    # Pull out the cipher mode from the comment at the beginning of the file
    if(/^#\s*"([^-]+)-\w+" information/) {
        $mode = lc($1);
    # Pull out the key length from the comment at the beginning of the file
    } elsif(/^#\s*(\w+) Keylen: (\d+)/) {
        $alg = lc($1);
        $keylen = $2;
    # Some parameters common to many tests appear as a list in square brackets
    # so parse these
    } elsif(/\[(.*)\]/) {
        my @pairs = split(/, /, $1);
        foreach my $pair (@pairs) {
            $pair =~ /(\w+)\s*=\s*(\d+)/;
            # AAD Length
            if ($1 eq "Alen") {
                $aadlen = $2;
            # Plaintext length
            } elsif ($1 eq "Plen") {
                $ptlen = $2;
            # Tag length
            } elsif ($1 eq "Tlen") {
                $taglen = $2;
            }
        }
    # Key/Value pair
    } elsif (/^\s*(\w+)\s*=\s*(\S.*)\r/) {
        if ($1 eq "Key") {
            $key = $2;
        } elsif ($1 eq "Nonce") {
            $iv = $2;
            if ($intest == 0) {
                $fixediv = 1;
            } else {
                $fixediv = 0;
            }
        } elsif ($1 eq "Adata") {
            $aad = $2;
        } elsif ($1 eq "CT") {
            $ct = substr($2, 0, length($2) - ($taglen * 2));
            $tag = substr($2, $taglen * -2);
        } elsif ($1 eq "Payload") {
            $pt = $2;
        } elsif ($1 eq "Result") {
            if ($2 =~ /Fail/) {
                $res = "CIPHERUPDATE_ERROR";
            }
        } elsif ($1 eq "Count") {
            $intest = 1;
        } elsif ($1 eq "Plen") {
            $ptlen = $2;
        } elsif ($1 eq "Tlen") {
            $taglen = $2;
        } elsif ($1 eq "Alen") {
            $aadlen = $2;
        }
    # Something else - probably just a blank line
    } elsif ($intest) {
        print "Cipher = $alg-$keylen-$mode\n";
        print "Key = $key\n";
        print "IV = $iv\n";
        print "AAD =";
        if ($aadlen > 0) {
            print " $aad";
        }
        print "\nTag =";
        if ($taglen > 0) {
            print " $tag";
        }
        print "\nPlaintext =";
        if ($ptlen > 0) {
            print " $pt";
        }
        print "\nCiphertext = $ct\n";
        if ($res ne "") {
            print "Operation = DECRYPT\n";
            print "Result = $res\n";
        }
        print "\n";
        $res = "";
        if ($fixediv == 0) {
            $iv = "";
        }
        $aad = "";
        $tag = "";
        $pt = "";
        $intest = 0;
    }
}