URL
https://opencores.org/ocsvn/apbtoaes128/apbtoaes128/trunk
Subversion Repositories apbtoaes128
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 4 to Rev 5
- ↔ Reverse comparison
Rev 4 → Rev 5
/apbtoaes128/trunk/pli/aes_init.h
72,7 → 72,6
//// |
//// |
/////////////////////////////////////////////////////////////////// |
|
static int init_calltf(char*user_data) |
{ |
|
/apbtoaes128/trunk/pli/env_aes.c
163,15 → 163,15
#define AES_WR_ERROR_DOUTR_ONLY 100 |
|
/*TEST USING NAMES TO ENABLE BFMs*/ |
#define ECB_ENCRYPTION 1 |
#define ECB_DECRYPTION 2 |
#define ECB_KEY_GEN 3 |
#define ECB_DERIVATION_DECRYPTION 4 |
#define ECB_ENCRYPTION 1 |
#define ECB_DECRYPTION 2 |
#define ECB_KEY_GEN 3 |
#define ECB_DERIVATION_DECRYPTION 4 |
|
#define ECB_ENCRYPTION_DMA 5 |
#define ECB_DECRYPTION_DMA 6 |
#define ECB_KEY_GEN_DMA 7 |
#define ECB_DERIVATION_DECRYPTION_DMA 8 |
#define ECB_ENCRYPTION_DMA 5 |
#define ECB_DECRYPTION_DMA 6 |
#define ECB_KEY_GEN_DMA 7 |
#define ECB_DERIVATION_DECRYPTION_DMA 8 |
|
#define ECB_ENCRYPTION_CCFIE 9 |
#define ECB_DECRYPTION_CCFIE 10 |
178,6 → 178,39
#define ECB_DERIVATION_DECRYPTION_CCFIE 11 |
#define ECB_KEY_GEN_CCFIE 12 |
|
/*TEST USING CBC*/ |
|
#define CBC_ENCRYPTION 13 |
#define CBC_DECRYPTION 14 |
#define CBC_KEY_GEN 15 |
#define CBC_DERIVATION_DECRYPTION 16 |
|
#define CBC_ENCRYPTION_DMA 17 |
#define CBC_DECRYPTION_DMA 18 |
#define CBC_KEY_GEN_DMA 19 |
#define CBC_DERIVATION_DECRYPTION_DMA 20 |
|
#define CBC_ENCRYPTION_CCFIE 21 |
#define CBC_DECRYPTION_CCFIE 22 |
#define CBC_DERIVATION_DECRYPTION_CCFIE 23 |
#define CBC_KEY_GEN_CCFIE 24 |
|
/*TEST USING CTR*/ |
#define CTR_ENCRYPTION 25 |
#define CTR_DECRYPTION 26 |
#define CTR_KEY_GEN 27 |
#define CTR_DERIVATION_DECRYPTION 28 |
|
#define CTR_ENCRYPTION_DMA 29 |
#define CTR_DECRYPTION_DMA 30 |
#define CTR_KEY_GEN_DMA 31 |
#define CTR_DERIVATION_DECRYPTION_DMA 32 |
|
#define CTR_ENCRYPTION_CCFIE 33 |
#define CTR_DECRYPTION_CCFIE 34 |
#define CTR_DERIVATION_DECRYPTION_CCFIE 35 |
#define CTR_KEY_GEN_CCFIE 36 |
|
/*TYPE CONFIGURATION USED TO INSERT DATA ON DUT*/ |
#define FIPS 0 |
#define RANDOM_DATA 1 |
196,6 → 229,21
unsigned char TEXT_FIPS_DERIVATED[] = {0x69,0xC4,0xE0,0xD8,0x6A,0x7B,0x04,0x30,0xD8,0xCD,0xB7,0x80,0x70,0xB4,0xC5,0x5A}; |
unsigned char KEY_FIPS_DERIVATED[] = {0x13,0x11,0x1D,0x7F,0xE3,0x94,0x4A,0x17,0xF3,0x07,0xA7,0x8B,0x4D,0x2B,0x30,0xC5}; |
|
|
unsigned char KEY_FIPS_CBC_NOT_DERIVATED[] = {0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6,0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C}; |
unsigned char IV_FIPS_CBC_NOT_DERIVATED[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; |
unsigned char TEXT_FIPS_CBC_NOT_DERIVATED[] = {0x6B,0xC1,0xBE,0xE2,0x2E,0x40,0x9F,0x96,0xE9,0x3D,0x7E,0x11,0x73,0x93,0x17,0x2A}; |
|
|
unsigned char TEXT_CBC_FIPS_DERIVATED[] = {0x76,0x49,0xAB,0xAC,0x81,0x19,0xB2,0x46,0xCE,0xE9,0x8E,0x9B,0x12,0xE9,0x19,0x7D}; |
|
|
unsigned char KEY_FIPS_CTR_NOT_DERIVATED[] = {0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6,0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C}; |
unsigned char IV_FIPS_CTR_NOT_DERIVATED[] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}; |
unsigned char TEXT_FIPS_CTR_NOT_DERIVATED[] = {0x6B,0xC1,0xBE,0xE2,0x2E,0x40,0x9F,0x96,0xE9,0x3D,0x7E,0x11,0x73,0x93,0x17,0x2A}; |
|
unsigned char TEXT_CTR_FIPS_DERIVATED[] = {0x87,0x4D,0x61,0x91,0xB6,0x20,0xE3,0x26,0x1B,0xEF,0x68,0x64,0x99,0x0D,0xB6,0xCE}; |
|
/*BFM CONTROL FLOW*/ |
#include "aes_bfm_generate.h" |
|
215,12 → 263,46
#include "bfm_ecb/aes_bfm_key_generation_dma_ecb.h" |
#include "bfm_ecb/aes_bfm_derivation_decryption_dma_ecb.h" |
|
|
#include "bfm_ecb/aes_bfm_encryption_ccfie_ecb.h" |
#include "bfm_ecb/aes_bfm_decryption_ccfie_ecb.h" |
#include "bfm_ecb/aes_bfm_derivation_decryption_ccfie_ecb.h" |
#include "bfm_ecb/aes_bfm_key_generation_ccfie_ecb.h" |
|
/*CBC TEST CASES*/ |
|
#include "bfm_cbc/aes_bfm_encryption_cbc.h" |
#include "bfm_cbc/aes_bfm_decryption_cbc.h" |
#include "bfm_cbc/aes_bfm_derivation_decryption_cbc.h" |
#include "bfm_cbc/aes_bfm_key_generation_cbc.h" |
|
#include "bfm_cbc/aes_bfm_encryption_dma_cbc.h" |
#include "bfm_cbc/aes_bfm_decryption_dma_cbc.h" |
#include "bfm_cbc/aes_bfm_derivation_decryption_dma_cbc.h" |
#include "bfm_cbc/aes_bfm_key_generation_dma_cbc.h" |
|
#include "bfm_cbc/aes_bfm_encryption_ccfie_cbc.h" |
#include "bfm_cbc/aes_bfm_decryption_ccfie_cbc.h" |
#include "bfm_cbc/aes_bfm_derivation_decryption_ccfie_cbc.h" |
#include "bfm_cbc/aes_bfm_key_generation_ccfie_cbc.h" |
|
/*CTR TEST CASES*/ |
|
#include "bfm_ctr/aes_bfm_encryption_ctr.h" |
#include "bfm_ctr/aes_bfm_decryption_ctr.h" |
#include "bfm_ctr/aes_bfm_key_generation_ctr.h" |
#include "bfm_ctr/aes_bfm_derivation_decryption_ctr.h" |
|
#include "bfm_ctr/aes_bfm_encryption_dma_ctr.h" |
#include "bfm_ctr/aes_bfm_decryption_dma_ctr.h" |
#include "bfm_ctr/aes_bfm_key_generation_dma_ctr.h" |
#include "bfm_ctr/aes_bfm_derivation_decryption_dma_ctr.h" |
|
#include "bfm_ctr/aes_bfm_encryption_ccfie_ctr.h" |
#include "bfm_ctr/aes_bfm_decryption_ccfie_ctr.h" |
#include "bfm_ctr/aes_bfm_key_generation_ccfie_ctr.h" |
#include "bfm_ctr/aes_bfm_derivation_decryption_ccfie_ctr.h" |
|
/*ENV CONFIG */ |
#include "aes_init.h" |
#include "aes_monitor.h" |
#include "aes_bfm_reset.h" |
270,7 → 352,7
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
// ENCRYPTION |
//ECB ENCRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_ecb_aes128"; |
298,9 → 380,65
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//DECRYPTION |
//CBC ENCRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_cbc_aes128"; |
tf_data.calltf = aes_bfm_encryption_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_cbc_dma_aes128"; |
tf_data.calltf = aes_bfm_encryption_cbc_dma_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_ccfie_cbc_aes128"; |
tf_data.calltf = aes_bfm_encryption_ccfie_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CTR ENCRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_ctr_aes128"; |
tf_data.calltf = aes_bfm_encryption_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_ctr_dma_aes128"; |
tf_data.calltf = aes_bfm_encryption_ctr_dma_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_encryption_ccfie_ctr_aes128"; |
tf_data.calltf = aes_bfm_encryption_ccfie_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//ECB DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_ecb_aes128"; |
tf_data.calltf = aes_bfm_decryption_ecb_calltf; |
tf_data.compiletf = 0; |
326,9 → 464,65
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//DERIVATION DECRYPTION |
//CBC DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_cbc_aes128"; |
tf_data.calltf = aes_bfm_decryption_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_cbc_dma_aes128"; |
tf_data.calltf = aes_bfm_decryption_cbc_dma_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_ccfie_cbc_aes128"; |
tf_data.calltf = aes_bfm_decryption_ccfie_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CTR DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_ctr_aes128"; |
tf_data.calltf = aes_bfm_decryption_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_ctr_dma_aes128"; |
tf_data.calltf = aes_bfm_decryption_ctr_dma_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_decryption_ccfie_ctr_aes128"; |
tf_data.calltf = aes_bfm_decryption_ccfie_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//ECB DERIVATION DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_ecb_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_ecb_calltf; |
tf_data.compiletf = 0; |
354,6 → 548,63
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CBC DERIVATION DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_cbc_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_dma_cbc_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_dma_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_ccfie_cbc_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_ccfie_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CTR DERIVATION DECRYPTION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_ctr_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_dma_ctr_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_dma_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_derivation_decryption_ccfie_ctr_aes128"; |
tf_data.calltf = aes_bfm_derivation_decryption_ccfie_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
|
//KEY DERIVATION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
383,6 → 634,62
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CBC DERIVATION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_cbc_aes128"; |
tf_data.calltf = aes_bfm_key_generation_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_dma_cbc_aes128"; |
tf_data.calltf = aes_bfm_key_generation_dma_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_ccfie_cbc_aes128"; |
tf_data.calltf = aes_bfm_key_generation_ccfie_cbc_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
//CTR DERIVATION |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_ctr_aes128"; |
tf_data.calltf = aes_bfm_key_generation_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_dma_ctr_aes128"; |
tf_data.calltf = aes_bfm_key_generation_dma_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
tf_data.tfname = "$bfm_key_generation_ccfie_ctr_aes128"; |
tf_data.calltf = aes_bfm_key_generation_ccfie_ctr_calltf; |
tf_data.compiletf = 0; |
tf_data.sizetf = 0; |
tf_data.user_data = 0; |
vpi_register_systf(&tf_data); |
|
// RESET BFM |
tf_data.type = vpiSysTask; |
tf_data.sysfunctype = 0; |
/apbtoaes128/trunk/pli/aes_init_reset.h
72,7 → 72,6
//// |
//// |
/////////////////////////////////////////////////////////////////// |
|
static int init_reset_calltf(char*user_data) |
{ |
|
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_decryption_ccfie_cbc.h
0,0 → 1,612
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_ccfie_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DECRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 561; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
|
|
|
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_encryption_cbc.h
0,0 → 1,605
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_ENCRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 33; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_encryption_dma_cbc.h
0,0 → 1,611
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_cbc_dma_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_ENCRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
|
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
//vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = ADDR_AES_CR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
//v_ecb.value.integer = 1; |
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 6177;//data_in(rd); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_key_generation_ccfie_cbc.h
0,0 → 1,521
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_ccfie_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_KEY_GEN_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 297; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
|
if(counter_read == 0) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 1) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 2) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 3) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter = 0; |
} |
|
if(counter_read == 8) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_ccfie_cbc.h
0,0 → 1,579
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_ccfie_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DERIVATION_DECRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 569;//data_in(rd); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_decryption_cbc.h
0,0 → 1,606
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DECRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 49; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_decryption_dma_cbc.h
0,0 → 1,613
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_cbc_dma_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DECRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6193; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
|
|
|
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_encryption_ccfie_cbc.h
0,0 → 1,603
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_ccfie_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_ENCRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 545; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_key_generation_cbc.h
0,0 → 1,510
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_KEY_GEN && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 41; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_key_generation_dma_cbc.h
0,0 → 1,521
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_dma_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_KEY_GEN_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6185; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
|
if(counter_read == 0) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 1) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 2) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 3) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter = 0; |
} |
|
if(counter_read == 8) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_cbc.h
0,0 → 1,580
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DERIVATION_DECRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 25;//data_in(rd); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_dma_cbc.h
0,0 → 1,579
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_dma_cbc_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CBC_DERIVATION_DECRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CBC_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CBC_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CBC_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CBC_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CBC_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CBC_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CBC_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CBC_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6201; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CBC_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CBC_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CBC_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CBC_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CBC_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CBC_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CBC_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CBC_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/aes_bfm_generate.h
72,10 → 72,10
//// |
//// |
/////////////////////////////////////////////////////////////////// |
|
static int aes_bfm_generate_calltf(char*user_data) |
{ |
|
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle i = vpi_handle_by_name("AES_GLADIC_tb.i", NULL); |
|
86,7 → 86,7
{ |
|
FIPS_ENABLE = FIPS; |
// type_bfm = AES_WR_ONLY; |
type_bfm = AES_WR_ONLY; |
// type_bfm = AES_WR_ERROR_DINR_ONLY; |
// type_bfm = AES_WR_ERROR_DOUTR_ONLY; |
|
103,9 → 103,40
// type_bfm = ECB_ENCRYPTION_CCFIE; |
// type_bfm = ECB_DECRYPTION_CCFIE; |
// type_bfm = ECB_DERIVATION_DECRYPTION_CCFIE; |
type_bfm = ECB_KEY_GEN_CCFIE; |
// type_bfm = ECB_KEY_GEN_CCFIE; |
|
// type_bfm = CBC_ENCRYPTION; |
// type_bfm = CBC_DECRYPTION; |
// type_bfm = CBC_DERIVATION_DECRYPTION; |
// type_bfm = CBC_KEY_GEN; |
|
// type_bfm = CBC_ENCRYPTION_DMA; |
// type_bfm = CBC_DECRYPTION_DMA; |
// type_bfm = CBC_DERIVATION_DECRYPTION_DMA; |
// type_bfm = CBC_KEY_GEN_DMA; |
|
// type_bfm = CBC_ENCRYPTION_CCFIE; |
// type_bfm = CBC_DECRYPTION_CCFIE; |
// type_bfm = CBC_DERIVATION_DECRYPTION_CCFIE; |
// type_bfm = CBC_KEY_GEN_CCFIE; |
|
// type_bfm = CTR_ENCRYPTION; |
// type_bfm = CTR_DECRYPTION; |
// type_bfm = CTR_KEY_GEN; |
// type_bfm = CTR_DERIVATION_DECRYPTION; |
|
|
// type_bfm = CTR_ENCRYPTION_DMA; |
// type_bfm = CTR_DECRYPTION_DMA; |
// type_bfm = CTR_KEY_GEN_DMA; |
// type_bfm = CTR_DERIVATION_DECRYPTION_DMA; |
|
|
// type_bfm = CTR_ENCRYPTION_CCFIE; |
// type_bfm = CTR_DECRYPTION_CCFIE; |
// type_bfm = CTR_KEY_GEN_CCFIE; |
// type_bfm = CTR_DERIVATION_DECRYPTION_CCFIE; |
|
if(PACKETS_GENERATED == MAX_ITERATIONS) |
{ |
v_generate.value.integer = 1; |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_dma_ctr.h
0,0 → 1,579
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_dma_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DERIVATION_DECRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6233; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_decryption_ccfie_ctr.h
0,0 → 1,608
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_ccfie_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DECRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 593; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_encryption_ctr.h
0,0 → 1,605
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_ENCRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 65; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_encryption_dma_ctr.h
0,0 → 1,611
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_ctr_dma_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_ENCRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
|
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
//vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = ADDR_AES_CR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
//v_ecb.value.integer = 1; |
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 6209;//data_in(rd); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_key_generation_ccfie_ctr.h
0,0 → 1,513
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_ccfie_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_KEY_GEN_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 585; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_ccfie_ctr.h
0,0 → 1,579
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_ccfie_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DERIVATION_DECRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 601;//data_in(rd); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_decryption_ctr.h
0,0 → 1,606
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DECRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 81; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_decryption_dma_ctr.h
0,0 → 1,613
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_decryption_ctr_dma_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DECRYPTION_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6225; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
|
|
|
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_encryption_ccfie_ctr.h
0,0 → 1,601
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_encryption_ccfie_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
//printf("%i\n",STATE); |
|
if(type_bfm == CTR_ENCRYPTION_CCFIE && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
|
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
|
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
|
}else if(counter_write == 9)//ENABLE CR |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 577; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
counter=0; |
|
} |
|
|
|
if(counter_write == 14) |
{ |
counter_write = 0; |
STATE = WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
|
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_key_generation_ctr.h
0,0 → 1,510
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_KEY_GEN && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 73; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_ctr.h
0,0 → 1,580
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_derivation_decryption_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_DERIVATION_DECRYPTION && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
//ENABLE CR |
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 89; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
//WRITE DINR |
if(counter_write > 9 && counter_write < 14) //WRITE DINR |
{ |
|
v_ecb.value.integer = ADDR_AES_DINR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(counter_write == 10) |
{ |
a = a | TEXT_CTR_FIPS_DERIVATED[0]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[1]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[2]; |
a = a << 8; |
a = a | TEXT_CTR_FIPS_DERIVATED[3]; |
v_ecb.value.integer = a; |
|
}else if(counter_write == 11) |
{ |
b = b | TEXT_CTR_FIPS_DERIVATED[4]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[5]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[6]; |
b = b << 8; |
b = b | TEXT_CTR_FIPS_DERIVATED[7]; |
v_ecb.value.integer = b; |
|
}else if(counter_write == 12 ) |
{ |
|
c = c | TEXT_CTR_FIPS_DERIVATED[8]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[9]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[10]; |
c = c << 8; |
c = c | TEXT_CTR_FIPS_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
}else if(counter_write == 13 ) |
{ |
d = d | TEXT_CTR_FIPS_DERIVATED[12]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[13]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[14]; |
d = d << 8; |
d = d | TEXT_CTR_FIPS_DERIVATED[15]; |
v_ecb.value.integer = d; |
|
} |
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
|
|
} |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 14) |
{ |
counter_write = 0; |
|
STATE =WAIT_SR; |
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_DOUTR; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 10; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_DOUTR: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
counter = 0; |
} |
|
if(counter_read == 12 ) |
{ |
STATE = RESET_SR; |
counter_read = 0; |
counter_write = 0; |
|
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ctr/aes_bfm_key_generation_dma_ctr.h
0,0 → 1,510
////////////////////////////////////////////////////////////////// |
//// |
//// |
//// AES CORE BLOCK |
//// |
//// |
//// |
//// This file is part of the APB to AES128 project |
//// |
//// http://www.opencores.org/cores/apbtoaes128/ |
//// |
//// |
//// |
//// Description |
//// |
//// Implementation of APB IP core according to |
//// |
//// aes128_spec IP core specification document. |
//// |
//// |
//// |
//// To Do: Things are right here but always all block can suffer changes |
//// |
//// |
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
//// |
//// Copyright (C) 2009 Authors and OPENCORES.ORG |
//// |
//// |
//// |
//// This source file may be used and distributed without |
//// |
//// restriction provided that this copyright statement is not |
//// |
//// removed from the file and that any derivative work contains |
//// the original copyright notice and the associated disclaimer. |
//// |
//// |
//// This source file is free software; you can redistribute it |
//// |
//// and/or modify it under the terms of the GNU Lesser General |
//// |
//// Public License as published by the Free Software Foundation; |
//// either version 2.1 of the License, or (at your option) any |
//// |
//// later version. |
//// |
//// |
//// |
//// This source is distributed in the hope that it will be |
//// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied |
//// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
//// |
//// PURPOSE. See the GNU Lesser General Public License for more |
//// details. |
//// |
//// |
//// |
//// You should have received a copy of the GNU Lesser General |
//// |
//// Public License along with this source; if not, download it |
//// |
//// from http://www.opencores.org/lgpl.shtml |
//// |
//// |
/////////////////////////////////////////////////////////////////// |
static int aes_bfm_key_generation_dma_ctr_calltf(char*user_data) |
{ |
|
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL); |
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL); |
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL); |
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL); |
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL); |
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL); |
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL); |
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL); |
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL); |
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL); |
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL); |
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL); |
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL); |
|
std::random_device rd; |
std::uniform_int_distribution<long int> data_in(0,4294967295); |
|
v_ecb.format=vpiIntVal; |
|
vpi_get_value(PRESETn, &v_ecb); |
|
|
//printf("%i\n",STATE); |
|
|
if(type_bfm == CTR_KEY_GEN_DMA && v_ecb.value.integer == 1) |
{ |
|
switch(STATE) |
{ |
|
case IDLE: |
|
if(PACKETS_GENERATED >= MAX_ITERATIONS) |
{ |
|
STATE = IDLE; |
type_bfm = 0; |
|
}else |
{ |
STATE = WRITE; |
|
counter = 0; |
|
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = vector_address[0]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
} |
|
break; |
|
case WRITE: |
if(counter == 0) |
{ |
|
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
|
if(counter_write < 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
|
if(FIPS_ENABLE == FIPS) |
{ |
|
if(vector_address[counter_write] == ADDR_AES_KEYR3) |
{ |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_KEYR2) |
{ |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR1) |
{ |
|
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_KEYR0) |
{ |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR3) |
{ |
a = a | IV_FIPS_CTR_NOT_DERIVATED[0]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[1]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[2]; |
a = a << 8; |
a = a | IV_FIPS_CTR_NOT_DERIVATED[3]; |
v_ecb.value.integer = a; |
} |
|
|
if(vector_address[counter_write] == ADDR_AES_IVR2) |
{ |
b = b | IV_FIPS_CTR_NOT_DERIVATED[4]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[5]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[6]; |
b = b << 8; |
b = b | IV_FIPS_CTR_NOT_DERIVATED[7]; |
v_ecb.value.integer = b; |
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR1) |
{ |
|
c = c | IV_FIPS_CTR_NOT_DERIVATED[8]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[9]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[10]; |
c = c << 8; |
c = c | IV_FIPS_CTR_NOT_DERIVATED[11]; |
v_ecb.value.integer = c; |
|
} |
|
if(vector_address[counter_write] == ADDR_AES_IVR0) |
{ |
d = d | IV_FIPS_CTR_NOT_DERIVATED[12]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[13]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[14]; |
d = d << 8; |
d = d | IV_FIPS_CTR_NOT_DERIVATED[15]; |
v_ecb.value.integer = d; |
} |
|
|
|
}else if(FIPS_ENABLE == RANDOM_DATA) |
{ |
v_ecb.value.integer = data_in(rd); |
} |
|
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
|
a = 0; |
b = 0; |
c = 0; |
d = 0; |
} |
|
|
if(counter_write == 9) |
{ |
|
v_ecb.value.integer = vector_address[counter_write]; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = 6217; |
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay); |
|
} |
|
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
if(counter_write == 10) |
{ |
counter_write = 0; |
counter_read = 0; |
|
STATE =WAIT_SR; |
|
|
} |
|
break; |
|
case WAIT_SR: |
|
v_ecb.value.integer = ADDR_AES_SR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
if(counter == 0) |
{ |
|
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter=0; |
} |
|
v_ecb.value.integer = 0; |
vpi_get_value(PRDATA,&v_ecb); |
|
if(v_ecb.value.integer == 1) |
{ |
STATE = READ_KEY_GEN; |
|
t_ecb.type = vpiScaledRealTime; |
t_ecb.real = 0; |
v_ecb.format=vpiIntVal; |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay); |
} |
|
|
break; |
|
|
case READ_KEY_GEN: |
|
|
|
if(counter == 0) |
{ |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_read++; |
counter++; |
|
|
|
}else if(counter == 1) |
{ |
|
if(counter_read < 4) |
{ |
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 4) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 5) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
|
if(counter_read == 6) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 7) |
{ |
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 8) |
{ |
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 9) |
{ |
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 10) |
{ |
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
if(counter_read == 11) |
{ |
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter = 0; |
} |
|
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
counter_read = 0; |
} |
|
break; |
|
case RESET_SR: |
|
v_ecb.value.integer = 1; |
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 128; |
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter == 0) |
{ |
|
counter_write++; |
counter++; |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
}else if(counter == 1) |
{ |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
counter=0; |
|
} |
|
if(counter_write == 1) |
{ |
STATE =IDLE; |
counter_write = 0; |
counter=0; |
PACKETS_GENERATED = PACKETS_GENERATED + 1; |
} |
|
|
|
break; |
|
} |
|
} |
|
return 0; |
} |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_key_generation_dma_ecb.h
364,6 → 364,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
370,7 → 407,7
counter = 0; |
} |
|
if(counter_read == 4) |
if(counter_read == 8) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_decryption_ccfie_ecb.h
25,7 → 25,7
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
399,13 → 399,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
415,15 → 412,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_encryption_ecb.h
390,13 → 390,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
406,14 → 403,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_encryption_dma_ecb.h
399,13 → 399,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
415,14 → 412,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_key_generation_ccfie_ecb.h
364,6 → 364,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
370,7 → 407,7
counter = 0; |
} |
|
if(counter_read == 4) |
if(counter_read == 8) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_derivation_decryption_ccfie_ecb.h
25,7 → 25,7
//// |
//// |
//// |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com |
//// |
///////////////////////////////////////////////////////////////// |
//// |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_decryption_ecb.h
399,13 → 399,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
415,15 → 412,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_decryption_dma_ecb.h
399,13 → 399,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
415,15 → 412,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_encryption_ccfie_ecb.h
390,13 → 390,10
if(counter == 0) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
counter_write++; |
counter_read++; |
counter++; |
|
|
406,14 → 403,97
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
if(counter_read < 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_DOUTR; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_KEYR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 8) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 9) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 10) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 11) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
counter = 0; |
} |
|
if(counter_write == 4) |
if(counter_read == 12) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
|
counter_read = 0; |
} |
|
break; |
/apbtoaes128/trunk/pli/bfm_ecb/aes_bfm_key_generation_ecb.h
363,6 → 363,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
if(counter_read == 4) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR3; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 5) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR2; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
|
if(counter_read == 6) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR1; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
|
if(counter_read == 7) |
{ |
|
v_ecb.value.integer = ADDR_AES_IVR0; |
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay); |
|
} |
|
v_ecb.value.integer = 0; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
369,7 → 406,7
counter = 0; |
} |
|
if(counter_read == 4) |
if(counter_read == 8) |
{ |
STATE = RESET_SR; |
counter_write = 0; |
402,6 → 439,7
v_ecb.value.integer = 1; |
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay); |
|
|
}else if(counter == 1) |
{ |
|