[aes/dv] Nist testvector sequence
Signed-off-by: Rasmus Madsen <rasmus.madsen@wdc.com>
diff --git a/hw/dv/sv/test_vectors/README.md b/hw/dv/sv/test_vectors/README.md
index 68efb45..690db41 100644
--- a/hw/dv/sv/test_vectors/README.md
+++ b/hw/dv/sv/test_vectors/README.md
@@ -41,3 +41,8 @@
[non-XOF](https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/KMACXOF_samples.pdf)
variants.
These vectors are found in `vectors/xof/kmac/`.
+
+### AES vectors
+Test vectors for AES can be found under hw/ip/aes/dv/test_vectors
+Test vectors for AES algorithm are taken from the
+[NIST website](https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/AES_ModesA_All.pdf)
diff --git a/hw/ip/aes/dv/aes_sim.core b/hw/ip/aes/dv/aes_sim.core
index b2b2023..e0dfbe9 100644
--- a/hw/ip/aes/dv/aes_sim.core
+++ b/hw/ip/aes/dv/aes_sim.core
@@ -14,6 +14,7 @@
- lowrisc:dv:aes_test
- lowrisc:dv:aes_sva
- lowrisc:dv:aes_cov
+ - lowrisc:dv:test_vectors
files:
- tb/tb.sv
file_type: systemVerilogSource
diff --git a/hw/ip/aes/dv/aes_sim_cfg.hjson b/hw/ip/aes/dv/aes_sim_cfg.hjson
index 53f8be6..d11c083 100644
--- a/hw/ip/aes/dv/aes_sim_cfg.hjson
+++ b/hw/ip/aes/dv/aes_sim_cfg.hjson
@@ -75,6 +75,12 @@
reseed: 1
}
{
+ name: aes_nist_vectors
+ uvm_test: aes_wake_up_test
+ uvm_test_seq: aes_nist_vectors_vseq
+ reseed: 1
+ }
+ {
name: aes_smoke
uvm_test: aes_smoke_test
uvm_test_seq: aes_stress_vseq
diff --git a/hw/ip/aes/dv/env/aes_env.core b/hw/ip/aes/dv/env/aes_env.core
index f7806e9..c7025eb 100644
--- a/hw/ip/aes/dv/env/aes_env.core
+++ b/hw/ip/aes/dv/env/aes_env.core
@@ -16,6 +16,7 @@
- lowrisc:dv:csr_utils
- lowrisc:dv:aes_model_dpi
- lowrisc:dv:aes_cov
+ - lowrisc:dv:aes_test_vectors
files:
- aes_env_pkg.sv
- aes_seq_item.sv: {is_include_file: true}
@@ -31,6 +32,7 @@
- seq_lib/aes_wake_up_vseq.sv: {is_include_file: true}
- seq_lib/aes_stress_vseq.sv: {is_include_file: true}
- seq_lib/aes_alert_reset_vseq.sv: {is_include_file: true}
+ - seq_lib/aes_nist_vectors_vseq.sv: {is_include_file: true}
file_type: systemVerilogSource
generate:
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_nist_vectors_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_nist_vectors_vseq.sv
new file mode 100644
index 0000000..e6c2736
--- /dev/null
+++ b/hw/ip/aes/dv/env/seq_lib/aes_nist_vectors_vseq.sv
@@ -0,0 +1,118 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// basic wake up sequence in place to verify that environment is hooked up correctly.
+// static test that is running same data set every time
+
+
+//`include "nist_vectors.sv"
+import nist_vectors_pkg::*;
+class aes_nist_vectors_vseq extends aes_base_vseq;
+ `uvm_object_utils(aes_nist_vectors_vseq)
+
+ `uvm_object_new
+
+
+ parameter bit ENCRYPT = 1'b0;
+ parameter bit DECRYPT = 1'b1;
+
+ bit [3:0] [31:0] plain_text[4];
+ bit [7:0] [31:0] init_key[2] = '{256'h0, 256'h0};
+ bit [3:0] [31:0] iv;
+ bit [3:0] [31:0] cipher_text[4];
+ bit [3:0] [31:0] decrypted_text[4];
+ bit do_b2b = 0;
+ int num_vec = 0;
+
+ aes_nist_vectors nist_obj = new;
+ nist_vector_t nist_vectors[];
+
+
+ task body();
+
+ `uvm_info(`gfn, $sformatf("STARTING AES NIST VECTOR SEQUENCE"), UVM_LOW)
+ num_vec = nist_obj.get_num_vectors();
+ nist_vectors = new[num_vec];
+ nist_vectors = nist_obj.vector_q;
+
+ `uvm_info(`gfn, $sformatf("size of array %d", nist_vectors.size()), UVM_LOW)
+
+ `DV_CHECK_RANDOMIZE_FATAL(this)
+
+ foreach (nist_vectors[i]) begin
+ // wait for dut idle
+ csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+ `uvm_info(`gfn, $sformatf("%s", vector2string(nist_vectors[i]) ), UVM_LOW)
+ `uvm_info(`gfn, $sformatf(" \n\t ---|setting operation to encrypt"), UVM_MEDIUM)
+
+ // update CTRL reg //
+ ral.ctrl_shadowed.operation.set(ENCRYPT);
+ ral.ctrl_shadowed.key_len.set(nist_vectors[i].key_len);
+ ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
+ csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
+ // transpose key To match NIST format ( little endian)
+ init_key = '{ {<<8{nist_vectors[i].key}} , 256'h0 };
+ write_key(init_key, do_b2b);
+ if (nist_vectors[i].mode != AES_ECB) begin
+ iv = {<<8{nist_vectors[i].iv}};
+ write_iv(iv, do_b2b);
+ end
+
+ `uvm_info(`gfn, $sformatf(" \n\t ---| ADDING PLAIN TEXT"), UVM_MEDIUM)
+
+ foreach (nist_vectors[i].plain_text[n]) begin
+ csr_spinwait(.ptr(ral.status.input_ready) , .exp_data(1'b1));
+ // transpose input text
+ plain_text[n] = {<<8{nist_vectors[i].plain_text[n]}};
+ add_data(plain_text[n], do_b2b);
+
+ // poll status register
+ `uvm_info(`gfn, $sformatf("\n\t ---| Polling for data register %s",
+ ral.status.convert2string()), UVM_DEBUG)
+
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));
+ read_data(cipher_text[n], do_b2b);
+ end
+
+ foreach (nist_vectors[i].plain_text[n]) begin
+ cipher_text[n] = {<<8{cipher_text[n]}};
+ `uvm_info(`gfn, $sformatf("calculated cipher %0h",cipher_text[n]), UVM_LOW)
+ if (cipher_text[n] != nist_vectors[i].cipher_text[n]) begin
+ `uvm_error(`gfn, $sformatf("Result does not match NIST for vector[%d][%d], \n nist: %0h \n output: %0h", i,n,
+ nist_vectors[i].cipher_text[n], cipher_text[n]))
+ end
+ end
+
+ ral.ctrl_shadowed.operation.set(DECRYPT);
+ ral.ctrl_shadowed.key_len.set(nist_vectors[i].key_len);
+ ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
+ csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
+
+ // transpose key To match NIST format ( little endian)
+ init_key = '{ {<<8{nist_vectors[i].key}} , 256'h0 };
+ write_key(init_key, do_b2b);
+ if (nist_vectors[i].mode != AES_ECB) begin
+ iv = {<<8{nist_vectors[i].iv}};
+ write_iv(iv, do_b2b);
+ end
+
+ foreach (nist_vectors[i].plain_text[n]) begin
+ csr_spinwait(.ptr(ral.status.input_ready) , .exp_data(1'b1));
+ // transpose input text
+ cipher_text[n] = {<<8{cipher_text[n]}};
+ add_data(cipher_text[n], do_b2b);
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));
+ read_data(decrypted_text[n], do_b2b);
+ end
+ foreach (nist_vectors[i].cipher_text[n]) begin
+ decrypted_text[n] = {<<8{decrypted_text[n]}};
+ if(nist_vectors[i].plain_text[n] != decrypted_text[n]) begin
+ `uvm_fatal(`gfn, $sformatf("DEcrypted Result does not match NIST for vector[%d][%d], \n nist: %0h \n output: %0h", i,n,
+ nist_vectors[i].plain_text[n], decrypted_text[n]));
+ end
+ end
+ end
+ `uvm_info(`gfn, $sformatf(" \n\t ---| YAY TEST PASSED |--- \n \t "), UVM_NONE)
+ endtask : body
+endclass : aes_nist_vectors_vseq
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
index beded7c..f2c1847 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
@@ -4,6 +4,7 @@
`include "aes_base_vseq.sv"
`include "aes_wake_up_vseq.sv"
+`include "aes_nist_vectors_vseq.sv"
`include "aes_common_vseq.sv"
`include "aes_stress_vseq.sv"
`include "aes_alert_reset_vseq.sv"
diff --git a/hw/ip/aes/dv/test_vectors/aes_nist_vectors.core b/hw/ip/aes/dv/test_vectors/aes_nist_vectors.core
new file mode 100644
index 0000000..3d55d05
--- /dev/null
+++ b/hw/ip/aes/dv/test_vectors/aes_nist_vectors.core
@@ -0,0 +1,18 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:dv:aes_test_vectors"
+description: "parse test vectors files and output an array of structures with parsed info"
+filesets:
+ files_dv:
+ depend:
+ - lowrisc:ip:aes
+ files:
+ - nist_vectors_pkg.sv
+ file_type: systemVerilogSource
+
+targets:
+ default:
+ filesets:
+ - files_dv
diff --git a/hw/ip/aes/dv/test_vectors/nist_vectors_pkg.sv b/hw/ip/aes/dv/test_vectors/nist_vectors_pkg.sv
new file mode 100644
index 0000000..07d5742
--- /dev/null
+++ b/hw/ip/aes/dv/test_vectors/nist_vectors_pkg.sv
@@ -0,0 +1,348 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+//##############################################
+//# https://csrc.nist.gov/CSRC/media/Projects/Cryptographic
+//#-Standards-and-Guidelines/documents/examples/AES_ModesA_All.pdf
+//###############################################
+//# AES TEST VECTORS #
+//# Modes: ECB, CTR, OFB, CFB CBC #
+//# Key Lengths: 128bit, 192bit, 256bit #
+//# #
+//# This File was autogenerated by an external #
+//# script converting the PDF to systemverilog #
+//###############################################
+package nist_vectors_pkg;
+
+ import uvm_pkg::*;
+ import aes_pkg::*;
+
+ typedef struct {
+ aes_mode_e mode;
+ key_len_e key_len;
+ aes_op_e operation;
+ bit [127:0] iv;
+ bit [255:0] key;
+ bit [3:0] [31:0] plain_text[4];
+ bit [3:0] [31:0] cipher_text[4];
+ } nist_vector_t;
+
+
+
+ function automatic string vector2string(nist_vector_t vector);
+ string str;
+ str = $sformatf("\n ----| NIST Vector | ----");
+ str = $sformatf("%s \n Notes that the Nist Vectors are listed in little endian format",
+ str);
+ str = $sformatf("%s \n and need to be byteswapped for use with AES", str);
+ str = $sformatf("%s \n Mode: %s", str, vector.mode.name);
+ str = $sformatf("%s \n Key Len: %s", str, vector.key_len.name);
+ str = $sformatf("%s \n Key: %0h", str, vector.key);
+ str = $sformatf("%s \n Iv: %0h", str, vector.iv);
+ str = $sformatf("%s \n plaintext: %0h", str, vector.plain_text[0]);
+ str = $sformatf("%s \n plaintext: %0h", str, vector.plain_text[1]);
+ str = $sformatf("%s \n plaintext: %0h", str, vector.plain_text[2]);
+ str = $sformatf("%s \n plaintext: %0h", str, vector.plain_text[3]);
+ str = $sformatf("%s \n ciphertext: %0h", str, vector.cipher_text[0]);
+ str = $sformatf("%s \n ciphertext: %0h", str, vector.cipher_text[1]);
+ str = $sformatf("%s \n ciphertext: %0h", str, vector.cipher_text[2]);
+ str = $sformatf("%s \n ciphertext: %0h", str, vector.cipher_text[3]);
+ return str;
+ endfunction // vector2string
+
+
+ class aes_nist_vectors extends uvm_object;
+ `uvm_object_utils(aes_nist_vectors)
+ nist_vector_t vector_q[];
+ int num;
+
+
+ function new(string name = "aes_nist_vectors");
+ super.new();
+ num = get_num_vectors();
+ vector_q = new[num];
+ get_vectors(vector_q);
+ endfunction // new
+
+
+ function void get_vectors(ref nist_vector_t nist_vectors[]);
+
+
+ // NIST VECTOR[0] //
+ nist_vectors[0].mode = AES_ECB;
+ nist_vectors[0].key_len = AES_128;
+ nist_vectors[0].key = 256'h2B7E151628AED2A6ABF7158809CF4F3C00000000000000000000000000000000;
+ nist_vectors[0].iv = 128'h00000000000000000000000000000000;
+ nist_vectors[0].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[0].cipher_text = '{ 128'h3AD77BB40D7A3660A89ECAF32466EF97,
+ 128'hF5D3D58503B9699DE785895A96FDBAAF,
+ 128'h43B1CD7F598ECE23881B00E3ED030688,
+ 128'h7B0C785E27E8AD3F8223207104725DD4
+ };
+
+
+
+ // NIST VECTOR[1] //
+ nist_vectors[1].mode = AES_ECB;
+ nist_vectors[1].key_len = AES_192;
+ nist_vectors[1].key = 256'h8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B0000000000000000;
+ nist_vectors[1].iv = 128'h00000000000000000000000000000000;
+ nist_vectors[1].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[1].cipher_text = '{ 128'hBD334F1D6E45F25FF712A214571FA5CC,
+ 128'h974104846D0AD3AD7734ECB3ECEE4EEF,
+ 128'hEF7AFD2270E2E60ADCE0BA2FACE6444E,
+ 128'h9A4B41BA738D6C72FB16691603C18E0E
+ };
+
+
+
+ // NIST VECTOR[2] //
+ nist_vectors[2].mode = AES_ECB;
+ nist_vectors[2].key_len = AES_256;
+ nist_vectors[2].key = 256'h603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4;
+ nist_vectors[2].iv = 128'h00000000000000000000000000000000;
+ nist_vectors[2].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[2].cipher_text = '{ 128'hF3EED1BDB5D2A03C064B5A7E3DB181F8,
+ 128'h591CCB10D410ED26DC5BA74A31362870,
+ 128'hB6ED21B99CA6F4F9F153E7B1BEAFED1D,
+ 128'h23304B7A39F9F3FF067D8D8F9E24ECC7
+ };
+
+
+
+ // NIST VECTOR[3] //
+ nist_vectors[3].mode = AES_CBC;
+ nist_vectors[3].key_len = AES_128;
+ nist_vectors[3].key = 256'h2B7E151628AED2A6ABF7158809CF4F3C00000000000000000000000000000000;
+ nist_vectors[3].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[3].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[3].cipher_text = '{ 128'h7649ABAC8119B246CEE98E9B12E9197D,
+ 128'h5086CB9B507219EE95DB113A917678B2,
+ 128'h73BED6B8E3C1743B7116E69E22229516,
+ 128'h3FF1CAA1681FAC09120ECA307586E1A7
+ };
+
+
+
+ // NIST VECTOR[4] //
+ nist_vectors[4].mode = AES_CBC;
+ nist_vectors[4].key_len = AES_192;
+ nist_vectors[4].key = 256'h8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B0000000000000000;
+ nist_vectors[4].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[4].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[4].cipher_text = '{ 128'h4F021DB243BC633D7178183A9FA071E8,
+ 128'hB4D9ADA9AD7DEDF4E5E738763F69145A,
+ 128'h571B242012FB7AE07FA9BAAC3DF102E0,
+ 128'h08B0E27988598881D920A9E64F5615CD
+ };
+
+
+
+ // NIST VECTOR[5] //
+ nist_vectors[5].mode = AES_CBC;
+ nist_vectors[5].key_len = AES_256;
+ nist_vectors[5].key = 256'h603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4;
+ nist_vectors[5].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[5].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[5].cipher_text = '{ 128'hF58C4C04D6E5F1BA779EABFB5F7BFBD6,
+ 128'h9CFC4E967EDB808D679F777BC6702C7D,
+ 128'h39F23369A9D9BACFA530E26304231461,
+ 128'hB2EB05E2C39BE9FCDA6C19078C6A9D1B
+ };
+
+
+
+ // NIST VECTOR[6] //
+ nist_vectors[6].mode = AES_CFB;
+ nist_vectors[6].key_len = AES_128;
+ nist_vectors[6].key = 256'h2B7E151628AED2A6ABF7158809CF4F3C00000000000000000000000000000000;
+ nist_vectors[6].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[6].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[6].cipher_text = '{ 128'h3B3FD92EB72DAD20333449F8E83CFB4A,
+ 128'hC8A64537A0B3A93FCDE3CDAD9F1CE58B,
+ 128'h26751F67A3CBB140B1808CF187A4F4DF,
+ 128'hC04B05357C5D1C0EEAC4C66F9FF7F2E6
+ };
+
+
+
+ // NIST VECTOR[7] //
+ nist_vectors[7].mode = AES_CFB;
+ nist_vectors[7].key_len = AES_192;
+ nist_vectors[7].key = 256'h8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B0000000000000000;
+ nist_vectors[7].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[7].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[7].cipher_text = '{ 128'hCDC80D6FDDF18CAB34C25909C99A4174,
+ 128'h67CE7F7F81173621961A2B70171D3D7A,
+ 128'h2E1E8A1DD59B88B1C8E60FED1EFAC4C9,
+ 128'hC05F9F9CA9834FA042AE8FBA584B09FF
+ };
+
+
+
+ // NIST VECTOR[8] //
+ nist_vectors[8].mode = AES_CFB;
+ nist_vectors[8].key_len = AES_256;
+ nist_vectors[8].key = 256'h603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4;
+ nist_vectors[8].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[8].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[8].cipher_text = '{ 128'hDC7E84BFDA79164B7ECD8486985D3860,
+ 128'h39FFED143B28B1C832113C6331E5407B,
+ 128'hDF10132415E54B92A13ED0A8267AE2F9,
+ 128'h75A385741AB9CEF82031623D55B1E471
+ };
+
+
+
+ // NIST VECTOR[9] //
+ nist_vectors[9].mode = AES_OFB;
+ nist_vectors[9].key_len = AES_128;
+ nist_vectors[9].key = 256'h2B7E151628AED2A6ABF7158809CF4F3C00000000000000000000000000000000;
+ nist_vectors[9].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[9].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[9].cipher_text = '{ 128'h3B3FD92EB72DAD20333449F8E83CFB4A,
+ 128'h7789508D16918F03F53C52DAC54ED825,
+ 128'h9740051E9C5FECF64344F7A82260EDCC,
+ 128'h304C6528F659C77866A510D9C1D6AE5E
+ };
+
+
+
+ // NIST VECTOR[10] //
+ nist_vectors[10].mode = AES_OFB;
+ nist_vectors[10].key_len = AES_192;
+ nist_vectors[10].key = 256'h8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B0000000000000000;
+ nist_vectors[10].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[10].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[10].cipher_text = '{ 128'hCDC80D6FDDF18CAB34C25909C99A4174,
+ 128'hFCC28B8D4C63837C09E81700C1100401,
+ 128'h8D9A9AEAC0F6596F559C6D4DAF59A5F2,
+ 128'h6D9F200857CA6C3E9CAC524BD9ACC92A
+ };
+
+
+
+ // NIST VECTOR[11] //
+ nist_vectors[11].mode = AES_OFB;
+ nist_vectors[11].key_len = AES_256;
+ nist_vectors[11].key = 256'h603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4;
+ nist_vectors[11].iv = 128'h000102030405060708090A0B0C0D0E0F;
+ nist_vectors[11].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[11].cipher_text = '{ 128'hDC7E84BFDA79164B7ECD8486985D3860,
+ 128'h4FEBDC6740D20B3AC88F6AD82A4FB08D,
+ 128'h71AB47A086E86EEDF39D1C5BBA97C408,
+ 128'h0126141D67F37BE8538F5A8BE740E484
+ };
+
+
+
+ // NIST VECTOR[12] //
+ nist_vectors[12].mode = AES_CTR;
+ nist_vectors[12].key_len = AES_128;
+ nist_vectors[12].key = 256'h2B7E151628AED2A6ABF7158809CF4F3C00000000000000000000000000000000;
+ nist_vectors[12].iv = 128'hF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF;
+ nist_vectors[12].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[12].cipher_text = '{ 128'h874D6191B620E3261BEF6864990DB6CE,
+ 128'h9806F66B7970FDFF8617187BB9FFFDFF,
+ 128'h5AE4DF3EDBD5D35E5B4F09020DB03EAB,
+ 128'h1E031DDA2FBE03D1792170A0F3009CEE
+ };
+
+
+
+ // NIST VECTOR[13] //
+ nist_vectors[13].mode = AES_CTR;
+ nist_vectors[13].key_len = AES_192;
+ nist_vectors[13].key = 256'h8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B0000000000000000;
+ nist_vectors[13].iv = 128'hF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF;
+ nist_vectors[13].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[13].cipher_text = '{ 128'h1ABC932417521CA24F2B0459FE7E6E0B,
+ 128'h090339EC0AA6FAEFD5CCC2C6F4CE8E94,
+ 128'h1E36B26BD1EBC670D1BD1D665620ABF7,
+ 128'h4F78A7F6D29809585A97DAEC58C6B050
+ };
+
+
+
+ // NIST VECTOR[14] //
+ nist_vectors[14].mode = AES_CTR;
+ nist_vectors[14].key_len = AES_256;
+ nist_vectors[14].key = 256'h603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4;
+ nist_vectors[14].iv = 128'hF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF;
+ nist_vectors[14].plain_text = '{ 128'h6BC1BEE22E409F96E93D7E117393172A,
+ 128'hAE2D8A571E03AC9C9EB76FAC45AF8E51,
+ 128'h30C81C46A35CE411E5FBC1191A0A52EF,
+ 128'hF69F2445DF4F9B17AD2B417BE66C3710
+ };
+ nist_vectors[14].cipher_text = '{ 128'h601EC313775789A5B7A7F504BBF3D228,
+ 128'hF443E3CA4D62B59ACA84E990CACAF5C5,
+ 128'h2B0930DAA23DE94CE87017BA2D84988D,
+ 128'hDFC9C58DB67AADA613C2DD08457941A6
+ };
+
+ endfunction
+
+ function int get_num_vectors();
+ return 15;
+ endfunction
+
+ endclass
+endpackage
+