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