diff options
author | Matt Caswell <matt@openssl.org> | 2019-05-22 19:36:25 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2019-05-23 10:49:54 +0100 |
commit | ecb0f148a94c9b0076240ca1d7904ab50a7dc9a4 (patch) | |
tree | d7b42c5defeea4aefb525e4bc089f47fda6ce9a1 /util/cavs-to-evptest.pl | |
parent | bddf965d29cb4a9c4d6eeb94aa96dfa47d0cfa5d (diff) |
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: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8981)
Diffstat (limited to 'util/cavs-to-evptest.pl')
-rw-r--r-- | util/cavs-to-evptest.pl | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/util/cavs-to-evptest.pl b/util/cavs-to-evptest.pl new file mode 100644 index 0000000000..8df32943db --- /dev/null +++ b/util/cavs-to-evptest.pl @@ -0,0 +1,121 @@ +#! /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; + } +} |