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