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