mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
AES32 sharing logic
This commit is contained in:
parent
a714904696
commit
8af25a45e6
@ -26,23 +26,16 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aes32d(
|
module aes32d(
|
||||||
input logic [1:0] bs,
|
input logic [7:0] SboxIn,
|
||||||
input logic [31:0] rs1,
|
|
||||||
input logic [31:0] rs2,
|
|
||||||
input logic finalround,
|
input logic finalround,
|
||||||
output logic [31:0] result
|
output logic [31:0] result
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [4:0] shamt;
|
logic [7:0] SboxOut;
|
||||||
logic [7:0] SboxIn, SboxOut;
|
logic [31:0] so, mixed;
|
||||||
logic [31:0] so, mixed, rotin, rotout;
|
|
||||||
|
|
||||||
assign shamt = {bs, 3'b0}; // shamt = bs * 8 (convert bytes to bits)
|
|
||||||
assign SboxIn = rs2[shamt +: 8]; // select byte bs of rs2
|
|
||||||
aesinvsbox inv_sbox(SboxIn, SboxOut); // Apply inverse sbox to si
|
aesinvsbox inv_sbox(SboxIn, SboxOut); // Apply inverse sbox to si
|
||||||
assign so = {24'h0, SboxOut}; // Pad output of inverse substitution box
|
assign so = {24'h0, SboxOut}; // Pad output of inverse substitution box
|
||||||
aesinvmixcolumns mix(so, mixed); // Run so through the mixword AES function
|
aesinvmixcolumns mix(so, mixed); // Run so through the mixword AES function
|
||||||
mux2 #(32) rmux(mixed, so, finalround, rotin); // on final round, skip mixcolumns
|
mux2 #(32) rmux(mixed, so, finalround, result); // on final round, skip mixcolumns
|
||||||
rotate #(32) rot(rotin, shamt, rotout); // Rotate left by shamt (bs * 8)
|
|
||||||
assign result = rs1 ^ rotout; // xor with running value
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -26,23 +26,16 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aes32e(
|
module aes32e(
|
||||||
input logic [1:0] bs,
|
input logic [7:0] SboxIn,
|
||||||
input logic [31:0] rs1,
|
|
||||||
input logic [31:0] rs2,
|
|
||||||
input logic finalround,
|
input logic finalround,
|
||||||
output logic [31:0] result
|
output logic [31:0] result
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [4:0] shamt;
|
logic [7:0] SboxOut;
|
||||||
logic [7:0] SboxIn, SboxOut;
|
logic [31:0] so, mixed;
|
||||||
logic [31:0] so, mixed, rotin, rotout;
|
|
||||||
|
|
||||||
assign shamt = {bs, 3'b0}; // shamt = bs * 8 (convert bytes to bits)
|
|
||||||
assign SboxIn = rs2[shamt +: 8]; // select byte bs of rs2
|
|
||||||
aessbox sbox(SboxIn, SboxOut); // Substitute
|
aessbox sbox(SboxIn, SboxOut); // Substitute
|
||||||
assign so = {24'h0, SboxOut}; // Pad sbox output
|
assign so = {24'h0, SboxOut}; // Pad sbox output
|
||||||
aesmixcolumns mwd(so, mixed); // Mix Word using aesmixword component
|
aesmixcolumns mwd(so, mixed); // Mix Word using aesmixword component
|
||||||
mux2 #(32) rmux(mixed, so, finalround, rotin); // on final round, skip mixcolumns
|
mux2 #(32) rmux(mixed, so, finalround, result); // on final round, skip mixcolumns
|
||||||
rotate #(32) mrot(rotin, shamt, rotout); // Rotate the mixcolumns output left by shamt (bs * 8)
|
|
||||||
assign result = rs1 ^ rotout; // xor with running value
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -34,16 +34,27 @@ module zknde32 import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic [31:0] ZKNDEResult
|
output logic [31:0] ZKNDEResult
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [31:0] ZKNEResult, ZKNDResult;
|
logic [4:0] shamt;
|
||||||
|
logic [7:0] SboxIn;
|
||||||
|
logic [31:0] ZKNEResult, ZKNDResult, rotin, rotout;
|
||||||
|
|
||||||
if (P.ZKND_SUPPORTED) aes32d aes32d(.bs(Funct7[6:5]), .rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .result(ZKNDResult));
|
// Initial shamt and Sbox input selection steps shared between encrypt and decrypt
|
||||||
if (P.ZKNE_SUPPORTED) aes32e aes32e(.bs(Funct7[6:5]), .rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .result(ZKNEResult));
|
assign shamt = {Funct7[6:5], 3'b0}; // shamt = bs * 8 (convert bytes to bits)
|
||||||
|
assign SboxIn = B[shamt +: 8]; // select byte bs of rs2
|
||||||
|
|
||||||
|
// Handle logic specific to encrypt or decrypt
|
||||||
|
if (P.ZKND_SUPPORTED) aes32d aes32d(.SboxIn, .finalround(ZKNSelect[2]), .result(ZKNDResult));
|
||||||
|
if (P.ZKNE_SUPPORTED) aes32e aes32e(.SboxIn, .finalround(ZKNSelect[2]), .result(ZKNEResult));
|
||||||
|
|
||||||
// Mux result if both decrypt and encrypt are supported; otherwise, choose the only result
|
// Mux result if both decrypt and encrypt are supported; otherwise, choose the only result
|
||||||
if (P.ZKND_SUPPORTED & P.ZKNE_SUPPORTED)
|
if (P.ZKND_SUPPORTED & P.ZKNE_SUPPORTED)
|
||||||
mux2 #(32) zknmux(ZKNDResult, ZKNEResult, ZKNSelect[0], ZKNDEResult);
|
mux2 #(32) zknmux(ZKNDResult, ZKNEResult, ZKNSelect[0], rotin);
|
||||||
else if (P.ZKND_SUPPORTED)
|
else if (P.ZKND_SUPPORTED)
|
||||||
assign ZKNDEResult = ZKNDResult;
|
assign rotin = ZKNDResult;
|
||||||
else
|
else
|
||||||
assign ZKNDEResult = ZKNEResult;
|
assign rotin = ZKNEResult;
|
||||||
|
|
||||||
|
// final rotate and XOR steps shared between encrypt and decrypt
|
||||||
|
rotate #(32) mrot(rotin, shamt, rotout); // Rotate the mixcolumns output left by shamt (bs * 8)
|
||||||
|
assign ZKNDEResult = A ^ rotout; // xor with running value
|
||||||
endmodule
|
endmodule
|
||||||
|
Loading…
Reference in New Issue
Block a user