#! /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 () { 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; } }