xref: /aosp_15_r20/external/mbedtls/tests/scripts/gen_ctr_drbg.pl (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi#!/usr/bin/env perl
2*62c56f98SSadaf Ebrahimi#
3*62c56f98SSadaf Ebrahimi# Based on NIST CTR_DRBG.rsp validation file
4*62c56f98SSadaf Ebrahimi# Only uses AES-256-CTR cases that use a Derivation function
5*62c56f98SSadaf Ebrahimi# and concats nonce and personalization for initialization.
6*62c56f98SSadaf Ebrahimi#
7*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors
8*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9*62c56f98SSadaf Ebrahimi
10*62c56f98SSadaf Ebrahimiuse strict;
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimimy $file = shift;
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimiopen(TEST_DATA, "$file") or die "Opening test cases '$file': $!";
15*62c56f98SSadaf Ebrahimi
16*62c56f98SSadaf Ebrahimisub get_suite_val($)
17*62c56f98SSadaf Ebrahimi{
18*62c56f98SSadaf Ebrahimi    my $name = shift;
19*62c56f98SSadaf Ebrahimi    my $val = "";
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf Ebrahimi    my $line = <TEST_DATA>;
22*62c56f98SSadaf Ebrahimi    ($val) = ($line =~ /\[$name\s\=\s(\w+)\]/);
23*62c56f98SSadaf Ebrahimi
24*62c56f98SSadaf Ebrahimi    return $val;
25*62c56f98SSadaf Ebrahimi}
26*62c56f98SSadaf Ebrahimi
27*62c56f98SSadaf Ebrahimisub get_val($)
28*62c56f98SSadaf Ebrahimi{
29*62c56f98SSadaf Ebrahimi    my $name = shift;
30*62c56f98SSadaf Ebrahimi    my $val = "";
31*62c56f98SSadaf Ebrahimi    my $line;
32*62c56f98SSadaf Ebrahimi
33*62c56f98SSadaf Ebrahimi    while($line = <TEST_DATA>)
34*62c56f98SSadaf Ebrahimi    {
35*62c56f98SSadaf Ebrahimi        next if($line !~ /=/);
36*62c56f98SSadaf Ebrahimi        last;
37*62c56f98SSadaf Ebrahimi    }
38*62c56f98SSadaf Ebrahimi
39*62c56f98SSadaf Ebrahimi    ($val) = ($line =~ /^$name = (\w+)/);
40*62c56f98SSadaf Ebrahimi
41*62c56f98SSadaf Ebrahimi    return $val;
42*62c56f98SSadaf Ebrahimi}
43*62c56f98SSadaf Ebrahimi
44*62c56f98SSadaf Ebrahimimy $cnt = 1;;
45*62c56f98SSadaf Ebrahimiwhile (my $line = <TEST_DATA>)
46*62c56f98SSadaf Ebrahimi{
47*62c56f98SSadaf Ebrahimi    next if ($line !~ /^\[AES-256 use df/);
48*62c56f98SSadaf Ebrahimi
49*62c56f98SSadaf Ebrahimi    my $PredictionResistanceStr = get_suite_val("PredictionResistance");
50*62c56f98SSadaf Ebrahimi    my $PredictionResistance = 0;
51*62c56f98SSadaf Ebrahimi    $PredictionResistance = 1 if ($PredictionResistanceStr eq 'True');
52*62c56f98SSadaf Ebrahimi    my $EntropyInputLen = get_suite_val("EntropyInputLen");
53*62c56f98SSadaf Ebrahimi    my $NonceLen = get_suite_val("NonceLen");
54*62c56f98SSadaf Ebrahimi    my $PersonalizationStringLen = get_suite_val("PersonalizationStringLen");
55*62c56f98SSadaf Ebrahimi    my $AdditionalInputLen = get_suite_val("AdditionalInputLen");
56*62c56f98SSadaf Ebrahimi
57*62c56f98SSadaf Ebrahimi    for ($cnt = 0; $cnt < 15; $cnt++)
58*62c56f98SSadaf Ebrahimi    {
59*62c56f98SSadaf Ebrahimi        my $Count = get_val("COUNT");
60*62c56f98SSadaf Ebrahimi        my $EntropyInput = get_val("EntropyInput");
61*62c56f98SSadaf Ebrahimi        my $Nonce = get_val("Nonce");
62*62c56f98SSadaf Ebrahimi        my $PersonalizationString = get_val("PersonalizationString");
63*62c56f98SSadaf Ebrahimi        my $AdditionalInput1 = get_val("AdditionalInput");
64*62c56f98SSadaf Ebrahimi        my $EntropyInputPR1 = get_val("EntropyInputPR") if ($PredictionResistance == 1);
65*62c56f98SSadaf Ebrahimi        my $EntropyInputReseed = get_val("EntropyInputReseed") if ($PredictionResistance == 0);
66*62c56f98SSadaf Ebrahimi        my $AdditionalInputReseed = get_val("AdditionalInputReseed") if ($PredictionResistance == 0);
67*62c56f98SSadaf Ebrahimi        my $AdditionalInput2 = get_val("AdditionalInput");
68*62c56f98SSadaf Ebrahimi        my $EntropyInputPR2 = get_val("EntropyInputPR") if ($PredictionResistance == 1);
69*62c56f98SSadaf Ebrahimi        my $ReturnedBits = get_val("ReturnedBits");
70*62c56f98SSadaf Ebrahimi
71*62c56f98SSadaf Ebrahimi        if ($PredictionResistance == 1)
72*62c56f98SSadaf Ebrahimi        {
73*62c56f98SSadaf Ebrahimi            print("CTR_DRBG NIST Validation (AES-256 use df,$PredictionResistanceStr,$EntropyInputLen,$NonceLen,$PersonalizationStringLen,$AdditionalInputLen) #$Count\n");
74*62c56f98SSadaf Ebrahimi            print("ctr_drbg_validate_pr");
75*62c56f98SSadaf Ebrahimi            print(":\"$Nonce$PersonalizationString\"");
76*62c56f98SSadaf Ebrahimi            print(":\"$EntropyInput$EntropyInputPR1$EntropyInputPR2\"");
77*62c56f98SSadaf Ebrahimi            print(":\"$AdditionalInput1\"");
78*62c56f98SSadaf Ebrahimi            print(":\"$AdditionalInput2\"");
79*62c56f98SSadaf Ebrahimi            print(":\"$ReturnedBits\"");
80*62c56f98SSadaf Ebrahimi            print("\n\n");
81*62c56f98SSadaf Ebrahimi        }
82*62c56f98SSadaf Ebrahimi        else
83*62c56f98SSadaf Ebrahimi        {
84*62c56f98SSadaf Ebrahimi            print("CTR_DRBG NIST Validation (AES-256 use df,$PredictionResistanceStr,$EntropyInputLen,$NonceLen,$PersonalizationStringLen,$AdditionalInputLen) #$Count\n");
85*62c56f98SSadaf Ebrahimi            print("ctr_drbg_validate_nopr");
86*62c56f98SSadaf Ebrahimi            print(":\"$Nonce$PersonalizationString\"");
87*62c56f98SSadaf Ebrahimi            print(":\"$EntropyInput$EntropyInputReseed\"");
88*62c56f98SSadaf Ebrahimi            print(":\"$AdditionalInput1\"");
89*62c56f98SSadaf Ebrahimi            print(":\"$AdditionalInputReseed\"");
90*62c56f98SSadaf Ebrahimi            print(":\"$AdditionalInput2\"");
91*62c56f98SSadaf Ebrahimi            print(":\"$ReturnedBits\"");
92*62c56f98SSadaf Ebrahimi            print("\n\n");
93*62c56f98SSadaf Ebrahimi        }
94*62c56f98SSadaf Ebrahimi    }
95*62c56f98SSadaf Ebrahimi}
96*62c56f98SSadaf Ebrahimiclose(TEST_DATA);
97