1#!/usr/bin/env perl 2# 3# Based on NIST gcmDecryptxxx.rsp validation files 4# Only first 3 of every set used for compile time saving 5# 6# Copyright The Mbed TLS Contributors 7# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 8 9use strict; 10 11my $file = shift; 12 13open(TEST_DATA, "$file") or die "Opening test cases '$file': $!"; 14 15sub get_suite_val($) 16{ 17 my $name = shift; 18 my $val = ""; 19 20 while(my $line = <TEST_DATA>) 21 { 22 next if ($line !~ /^\[/); 23 ($val) = ($line =~ /\[$name\s\=\s(\w+)\]/); 24 last; 25 } 26 27 return $val; 28} 29 30sub get_val($) 31{ 32 my $name = shift; 33 my $val = ""; 34 my $line; 35 36 while($line = <TEST_DATA>) 37 { 38 next if($line !~ /=/); 39 last; 40 } 41 42 ($val) = ($line =~ /^$name = (\w+)/); 43 44 return $val; 45} 46 47sub get_val_or_fail($) 48{ 49 my $name = shift; 50 my $val = "FAIL"; 51 my $line; 52 53 while($line = <TEST_DATA>) 54 { 55 next if($line !~ /=/ && $line !~ /FAIL/); 56 last; 57 } 58 59 ($val) = ($line =~ /^$name = (\w+)/) if ($line =~ /=/); 60 61 return $val; 62} 63 64my $cnt = 1;; 65while (my $line = <TEST_DATA>) 66{ 67 my $key_len = get_suite_val("Keylen"); 68 next if ($key_len !~ /\d+/); 69 my $iv_len = get_suite_val("IVlen"); 70 my $pt_len = get_suite_val("PTlen"); 71 my $add_len = get_suite_val("AADlen"); 72 my $tag_len = get_suite_val("Taglen"); 73 74 for ($cnt = 0; $cnt < 3; $cnt++) 75 { 76 my $Count = get_val("Count"); 77 my $key = get_val("Key"); 78 my $iv = get_val("IV"); 79 my $ct = get_val("CT"); 80 my $add = get_val("AAD"); 81 my $tag = get_val("Tag"); 82 my $pt = get_val_or_fail("PT"); 83 84 print("GCM NIST Validation (AES-$key_len,$iv_len,$pt_len,$add_len,$tag_len) #$Count\n"); 85 print("gcm_decrypt_and_verify"); 86 print(":\"$key\""); 87 print(":\"$ct\""); 88 print(":\"$iv\""); 89 print(":\"$add\""); 90 print(":$tag_len"); 91 print(":\"$tag\""); 92 print(":\"$pt\""); 93 print(":0"); 94 print("\n\n"); 95 } 96} 97 98print("GCM Selftest\n"); 99print("gcm_selftest:\n\n"); 100 101close(TEST_DATA); 102