blob: 0a3388e27c7046ac60f7e9a8e4410056799d80fb [file] [log] [blame]
//SPDX-FileCopyrightText: 2020 Anish Singhani
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// SPDX-License-Identifier: Apache-2.0
#include "verilog/dv/caravel/defs.h"
#include "verilog/dv/caravel/stub.c"
#include "printio.h"
void runTest(uint32_t key0, uint32_t key1, uint32_t key2, uint32_t key3,
uint32_t key4, uint32_t key5, uint32_t key6, uint32_t key7,
uint32_t iv0, uint32_t iv1, uint32_t iv2, uint32_t iv3,
uint32_t in0, uint32_t in1, uint32_t in2, uint32_t in3,
uint32_t out0, uint32_t out1, uint32_t out2, uint32_t out3,
bool verbose, bool enc, bool aes256) {
uint32_t aes_mask = aes256 ? 0x10 : 0x0;
*((volatile uint32_t*) 0x30000000) = aes_mask | 0;
if (aes256) {
*((volatile uint32_t*) 0x30000040) = key4;
*((volatile uint32_t*) 0x30000040) = key5;
*((volatile uint32_t*) 0x30000040) = key6;
*((volatile uint32_t*) 0x30000040) = key7;
*((volatile uint32_t*) 0x3000000C) = 2;
if (verbose) printstr("tkey\n");
while((*((volatile uint32_t*) 0x30000000) & 0x3) != 0x3);
}
// Load key
*((volatile uint32_t*) 0x30000040) = key0;
*((volatile uint32_t*) 0x30000040) = key1;
*((volatile uint32_t*) 0x30000040) = key2;
*((volatile uint32_t*) 0x30000040) = key3;
// Update key
*((volatile uint32_t*) 0x3000000C) = 1;
if (verbose) printstr("key\n");
while((*((volatile uint32_t*) 0x30000000) & 0x3) != 0x3);
// Set IV
if (iv0 | iv1 | iv2 | iv3) {
*((volatile uint32_t*) 0x30000000) = aes_mask | 0;
*((volatile uint32_t*) 0x30000010) = iv0;
*((volatile uint32_t*) 0x30000010) = iv1;
*((volatile uint32_t*) 0x30000010) = iv2;
*((volatile uint32_t*) 0x30000010) = iv3;
*((volatile uint32_t*) 0x30000008) = 1;
while((*((volatile uint32_t*) 0x30000000) & 0x4) != 0x4);
*((volatile uint32_t*) 0x30000000) = aes_mask | 8;
} else {
*((volatile uint32_t*) 0x30000000) = aes_mask | 0;
}
if (verbose) printstr("iv\n");
// Load input data
*((volatile uint32_t*) 0x30000010) = in0;
*((volatile uint32_t*) 0x30000010) = in1;
*((volatile uint32_t*) 0x30000010) = in2;
*((volatile uint32_t*) 0x30000010) = in3;
if (enc) *((volatile uint32_t*) 0x30000004) = 1;
else *((volatile uint32_t*) 0x30000008) = 1;
if (verbose) printstr("data\n");
while((*((volatile uint32_t*) 0x30000000) & 0x4) != 0x4);
// Read back result
if (*((volatile uint32_t*) 0x30000030) == out0 &&
*((volatile uint32_t*) 0x30000034) == out1 &&
*((volatile uint32_t*) 0x30000038) == out2 &&
*((volatile uint32_t*) 0x3000003C) == out3) {
printstr("Res: PASS\n");
} else {
printstr("Res: FAIL\n");
verbose = 1;
}
if (verbose) {
printhex(*((volatile uint32_t*) 0x30000030), true);
printhex(*((volatile uint32_t*) 0x30000034), true);
printhex(*((volatile uint32_t*) 0x30000038), true);
printhex(*((volatile uint32_t*) 0x3000003C), true);
printstr("\n");
}
}
void main() {
reg_spimaster_config = 0xA002; // Allow use of pin3
printstr("aes\n");
bool verbose = 0;
// Load top key as 165406623308029099331681619155339851573
// Load key as 105658700701783706739513152549528565804
// Set IV to 98873892024534219918523500662347411235
// Decrypt 124392828678387920155199777039481918860
// Expect 67096222749627335679586640564596122443
printstr("de1\n");
runTest(1333600292, 2067428908, 724464948, 1210611756,
2087725097, 2049403466, 1044015937, 1296971573,
1247963967, 1903436343, 2034596968, 1952329507,
1570058230, 4070621038, 2773892934, 3961869708,
846873392, 1043276127, 961370419, 674374475,
verbose, 0, 1);
// Load top key as 165406623308029099331681619155339851573
// Load key as 105658700701783706739513152549528565804
// Set IV to 98873892024534219918523500662347411235
// encrypt 67096222749627335679586640564596122443
// Expect 124392828678387920155199777039481918860
printstr("en1\n");
runTest(1333600292, 2067428908, 724464948, 1210611756,
2087725097, 2049403466, 1044015937, 1296971573,
1247963967, 1903436343, 2034596968, 1952329507,
846873392, 1043276127, 961370419, 674374475,
1570058230, 4070621038, 2773892934, 3961869708,
verbose, 1, 1);
// Load key as 114849718896073566083416993308083054187
// Set IV to 94605682877008349257125771496548550738
// Encrypt 54758945827980741386470298169332301409
// Expect 63241459423936053969797744104158954336
printstr("en2\n");
runTest(1449607251, 1734159223, 1713582630, 908945003,
0, 0, 0, 0,
1194091594, 577847158, 1245724226, 1512654930,
691155065, 845884219, 1382968177, 1333362273,
798219438, 3687767725, 1414612439, 2930934624,
verbose, 1, 0);
// Load key as 114849718896073566083416993308083054187
// Set IV to 94605682877008349257125771496548550738
// Decrypt 63241459423936053969797744104158954336
// Expect 54758945827980741386470298169332301409
printstr("de2\n");
runTest(1449607251, 1734159223, 1713582630, 908945003,
0, 0, 0, 0,
1194091594, 577847158, 1245724226, 1512654930,
798219438, 3687767725, 1414612439, 2930934624,
691155065, 845884219, 1382968177, 1333362273,
verbose, 0, 0);
printstr("Res: ");
printstr((char*)0x30000050);
printstr("\n");
endtest();
}