1a8e1175bSopenharmony_ci#!/usr/bin/env perl
2a8e1175bSopenharmony_ci#
3a8e1175bSopenharmony_ci# Based on NIST gcmDecryptxxx.rsp validation files
4a8e1175bSopenharmony_ci# Only first 3 of every set used for compile time saving
5a8e1175bSopenharmony_ci#
6a8e1175bSopenharmony_ci# Copyright The Mbed TLS Contributors
7a8e1175bSopenharmony_ci# SPDX-License-Identifier: Apache-2.0
8a8e1175bSopenharmony_ci#
9a8e1175bSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); you may
10a8e1175bSopenharmony_ci# not use this file except in compliance with the License.
11a8e1175bSopenharmony_ci# You may obtain a copy of the License at
12a8e1175bSopenharmony_ci#
13a8e1175bSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
14a8e1175bSopenharmony_ci#
15a8e1175bSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16a8e1175bSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17a8e1175bSopenharmony_ci# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18a8e1175bSopenharmony_ci# See the License for the specific language governing permissions and
19a8e1175bSopenharmony_ci# limitations under the License.
20a8e1175bSopenharmony_ci
21a8e1175bSopenharmony_ciuse strict;
22a8e1175bSopenharmony_ci
23a8e1175bSopenharmony_cimy $file = shift;
24a8e1175bSopenharmony_ci
25a8e1175bSopenharmony_ciopen(TEST_DATA, "$file") or die "Opening test cases '$file': $!";
26a8e1175bSopenharmony_ci
27a8e1175bSopenharmony_cisub get_suite_val($)
28a8e1175bSopenharmony_ci{
29a8e1175bSopenharmony_ci    my $name = shift;
30a8e1175bSopenharmony_ci    my $val = "";
31a8e1175bSopenharmony_ci
32a8e1175bSopenharmony_ci    while(my $line = <TEST_DATA>)
33a8e1175bSopenharmony_ci    {
34a8e1175bSopenharmony_ci        next if ($line !~ /^\[/);
35a8e1175bSopenharmony_ci        ($val) = ($line =~ /\[$name\s\=\s(\w+)\]/);
36a8e1175bSopenharmony_ci        last;
37a8e1175bSopenharmony_ci    }
38a8e1175bSopenharmony_ci
39a8e1175bSopenharmony_ci    return $val;
40a8e1175bSopenharmony_ci}
41a8e1175bSopenharmony_ci
42a8e1175bSopenharmony_cisub get_val($)
43a8e1175bSopenharmony_ci{
44a8e1175bSopenharmony_ci    my $name = shift;
45a8e1175bSopenharmony_ci    my $val = "";
46a8e1175bSopenharmony_ci    my $line;
47a8e1175bSopenharmony_ci
48a8e1175bSopenharmony_ci    while($line = <TEST_DATA>)
49a8e1175bSopenharmony_ci    {
50a8e1175bSopenharmony_ci        next if($line !~ /=/);
51a8e1175bSopenharmony_ci        last;
52a8e1175bSopenharmony_ci    }
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ci    ($val) = ($line =~ /^$name = (\w+)/);
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci    return $val;
57a8e1175bSopenharmony_ci}
58a8e1175bSopenharmony_ci
59a8e1175bSopenharmony_cisub get_val_or_fail($)
60a8e1175bSopenharmony_ci{
61a8e1175bSopenharmony_ci    my $name = shift;
62a8e1175bSopenharmony_ci    my $val = "FAIL";
63a8e1175bSopenharmony_ci    my $line;
64a8e1175bSopenharmony_ci
65a8e1175bSopenharmony_ci    while($line = <TEST_DATA>)
66a8e1175bSopenharmony_ci    {
67a8e1175bSopenharmony_ci        next if($line !~ /=/ && $line !~ /FAIL/);
68a8e1175bSopenharmony_ci        last;
69a8e1175bSopenharmony_ci    }
70a8e1175bSopenharmony_ci
71a8e1175bSopenharmony_ci    ($val) = ($line =~ /^$name = (\w+)/) if ($line =~ /=/);
72a8e1175bSopenharmony_ci
73a8e1175bSopenharmony_ci    return $val;
74a8e1175bSopenharmony_ci}
75a8e1175bSopenharmony_ci
76a8e1175bSopenharmony_cimy $cnt = 1;;
77a8e1175bSopenharmony_ciwhile (my $line = <TEST_DATA>)
78a8e1175bSopenharmony_ci{
79a8e1175bSopenharmony_ci    my $key_len = get_suite_val("Keylen");
80a8e1175bSopenharmony_ci    next if ($key_len !~ /\d+/);
81a8e1175bSopenharmony_ci    my $iv_len = get_suite_val("IVlen");
82a8e1175bSopenharmony_ci    my $pt_len = get_suite_val("PTlen");
83a8e1175bSopenharmony_ci    my $add_len = get_suite_val("AADlen");
84a8e1175bSopenharmony_ci    my $tag_len = get_suite_val("Taglen");
85a8e1175bSopenharmony_ci
86a8e1175bSopenharmony_ci    for ($cnt = 0; $cnt < 3; $cnt++)
87a8e1175bSopenharmony_ci    {
88a8e1175bSopenharmony_ci        my $Count = get_val("Count");
89a8e1175bSopenharmony_ci        my $key = get_val("Key");
90a8e1175bSopenharmony_ci        my $iv = get_val("IV");
91a8e1175bSopenharmony_ci        my $ct = get_val("CT");
92a8e1175bSopenharmony_ci        my $add = get_val("AAD");
93a8e1175bSopenharmony_ci        my $tag = get_val("Tag");
94a8e1175bSopenharmony_ci        my $pt = get_val_or_fail("PT");
95a8e1175bSopenharmony_ci
96a8e1175bSopenharmony_ci        print("GCM NIST Validation (AES-$key_len,$iv_len,$pt_len,$add_len,$tag_len) #$Count\n");
97a8e1175bSopenharmony_ci        print("gcm_decrypt_and_verify");
98a8e1175bSopenharmony_ci        print(":\"$key\"");
99a8e1175bSopenharmony_ci        print(":\"$ct\"");
100a8e1175bSopenharmony_ci        print(":\"$iv\"");
101a8e1175bSopenharmony_ci        print(":\"$add\"");
102a8e1175bSopenharmony_ci        print(":$tag_len");
103a8e1175bSopenharmony_ci        print(":\"$tag\"");
104a8e1175bSopenharmony_ci        print(":\"$pt\"");
105a8e1175bSopenharmony_ci        print(":0");
106a8e1175bSopenharmony_ci        print("\n\n");
107a8e1175bSopenharmony_ci    }
108a8e1175bSopenharmony_ci}
109a8e1175bSopenharmony_ci
110a8e1175bSopenharmony_ciprint("GCM Selftest\n");
111a8e1175bSopenharmony_ciprint("gcm_selftest:\n\n");
112a8e1175bSopenharmony_ci
113a8e1175bSopenharmony_ciclose(TEST_DATA);
114