aboutsummaryrefslogtreecommitdiff
path: root/src/DSi_AES.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DSi_AES.cpp')
-rw-r--r--src/DSi_AES.cpp93
1 files changed, 44 insertions, 49 deletions
diff --git a/src/DSi_AES.cpp b/src/DSi_AES.cpp
index 8f5c3f3..9153e90 100644
--- a/src/DSi_AES.cpp
+++ b/src/DSi_AES.cpp
@@ -38,8 +38,8 @@ bool OutputFlush;
u32 InputDMASize, OutputDMASize;
u32 AESMode;
-FIFO<u32>* InputFIFO;
-FIFO<u32>* OutputFIFO;
+FIFO<u32, 16> InputFIFO;
+FIFO<u32, 16> OutputFIFO;
u8 IV[16];
@@ -91,9 +91,6 @@ void ROL16(u8* val, u32 n)
bool Init()
{
- InputFIFO = new FIFO<u32>(16);
- OutputFIFO = new FIFO<u32>(16);
-
const u8 zero[16] = {0};
AES_init_ctx_iv(&Ctx, zero, zero);
@@ -102,8 +99,6 @@ bool Init()
void DeInit()
{
- delete InputFIFO;
- delete OutputFIFO;
}
void Reset()
@@ -119,8 +114,8 @@ void Reset()
OutputDMASize = 0;
AESMode = 0;
- InputFIFO->Clear();
- OutputFIFO->Clear();
+ InputFIFO.Clear();
+ OutputFIFO.Clear();
memset(IV, 0, sizeof(IV));
@@ -164,10 +159,10 @@ void ProcessBlock_CCM_Decrypt()
u8 data[16];
u8 data_rev[16];
- *(u32*)&data[0] = InputFIFO->Read();
- *(u32*)&data[4] = InputFIFO->Read();
- *(u32*)&data[8] = InputFIFO->Read();
- *(u32*)&data[12] = InputFIFO->Read();
+ *(u32*)&data[0] = InputFIFO.Read();
+ *(u32*)&data[4] = InputFIFO.Read();
+ *(u32*)&data[8] = InputFIFO.Read();
+ *(u32*)&data[12] = InputFIFO.Read();
//printf("AES-CCM: "); _printhex2(data, 16);
@@ -181,10 +176,10 @@ void ProcessBlock_CCM_Decrypt()
//printf(" -> "); _printhex2(data, 16);
- OutputFIFO->Write(*(u32*)&data[0]);
- OutputFIFO->Write(*(u32*)&data[4]);
- OutputFIFO->Write(*(u32*)&data[8]);
- OutputFIFO->Write(*(u32*)&data[12]);
+ OutputFIFO.Write(*(u32*)&data[0]);
+ OutputFIFO.Write(*(u32*)&data[4]);
+ OutputFIFO.Write(*(u32*)&data[8]);
+ OutputFIFO.Write(*(u32*)&data[12]);
}
void ProcessBlock_CCM_Encrypt()
@@ -192,10 +187,10 @@ void ProcessBlock_CCM_Encrypt()
u8 data[16];
u8 data_rev[16];
- *(u32*)&data[0] = InputFIFO->Read();
- *(u32*)&data[4] = InputFIFO->Read();
- *(u32*)&data[8] = InputFIFO->Read();
- *(u32*)&data[12] = InputFIFO->Read();
+ *(u32*)&data[0] = InputFIFO.Read();
+ *(u32*)&data[4] = InputFIFO.Read();
+ *(u32*)&data[8] = InputFIFO.Read();
+ *(u32*)&data[12] = InputFIFO.Read();
//printf("AES-CCM: "); _printhex2(data, 16);
@@ -209,10 +204,10 @@ void ProcessBlock_CCM_Encrypt()
//printf(" -> "); _printhex2(data, 16);
- OutputFIFO->Write(*(u32*)&data[0]);
- OutputFIFO->Write(*(u32*)&data[4]);
- OutputFIFO->Write(*(u32*)&data[8]);
- OutputFIFO->Write(*(u32*)&data[12]);
+ OutputFIFO.Write(*(u32*)&data[0]);
+ OutputFIFO.Write(*(u32*)&data[4]);
+ OutputFIFO.Write(*(u32*)&data[8]);
+ OutputFIFO.Write(*(u32*)&data[12]);
}
void ProcessBlock_CTR()
@@ -220,10 +215,10 @@ void ProcessBlock_CTR()
u8 data[16];
u8 data_rev[16];
- *(u32*)&data[0] = InputFIFO->Read();
- *(u32*)&data[4] = InputFIFO->Read();
- *(u32*)&data[8] = InputFIFO->Read();
- *(u32*)&data[12] = InputFIFO->Read();
+ *(u32*)&data[0] = InputFIFO.Read();
+ *(u32*)&data[4] = InputFIFO.Read();
+ *(u32*)&data[8] = InputFIFO.Read();
+ *(u32*)&data[12] = InputFIFO.Read();
//printf("AES-CTR: "); _printhex2(data, 16);
@@ -233,10 +228,10 @@ void ProcessBlock_CTR()
//printf(" -> "); _printhex(data, 16);
- OutputFIFO->Write(*(u32*)&data[0]);
- OutputFIFO->Write(*(u32*)&data[4]);
- OutputFIFO->Write(*(u32*)&data[8]);
- OutputFIFO->Write(*(u32*)&data[12]);
+ OutputFIFO.Write(*(u32*)&data[0]);
+ OutputFIFO.Write(*(u32*)&data[4]);
+ OutputFIFO.Write(*(u32*)&data[8]);
+ OutputFIFO.Write(*(u32*)&data[12]);
}
@@ -244,8 +239,8 @@ u32 ReadCnt()
{
u32 ret = Cnt;
- ret |= InputFIFO->Level();
- ret |= (OutputFIFO->Level() << 5);
+ ret |= InputFIFO.Level();
+ ret |= (OutputFIFO.Level() << 5);
return ret;
}
@@ -341,9 +336,9 @@ void WriteBlkCnt(u32 val)
u32 ReadOutputFIFO()
{
- if (OutputFIFO->IsEmpty()) printf("!!! AES OUTPUT FIFO EMPTY\n");
+ if (OutputFIFO.IsEmpty()) printf("!!! AES OUTPUT FIFO EMPTY\n");
- u32 ret = OutputFIFO->Read();
+ u32 ret = OutputFIFO.Read();
if (Cnt & (1<<31))
{
@@ -352,17 +347,17 @@ u32 ReadOutputFIFO()
}
else
{
- if (OutputFIFO->Level() > 0)
+ if (OutputFIFO.Level() > 0)
DSi::CheckNDMAs(1, 0x2B);
else
DSi::StopNDMAs(1, 0x2B);
- if (OutputMACDue && OutputFIFO->Level() <= 12)
+ if (OutputMACDue && OutputFIFO.Level() <= 12)
{
- OutputFIFO->Write(*(u32*)&OutputMAC[0]);
- OutputFIFO->Write(*(u32*)&OutputMAC[4]);
- OutputFIFO->Write(*(u32*)&OutputMAC[8]);
- OutputFIFO->Write(*(u32*)&OutputMAC[12]);
+ OutputFIFO.Write(*(u32*)&OutputMAC[0]);
+ OutputFIFO.Write(*(u32*)&OutputMAC[4]);
+ OutputFIFO.Write(*(u32*)&OutputMAC[8]);
+ OutputFIFO.Write(*(u32*)&OutputMAC[12]);
OutputMACDue = false;
}
}
@@ -374,9 +369,9 @@ void WriteInputFIFO(u32 val)
{
// TODO: add some delay to processing
- if (InputFIFO->IsFull()) printf("!!! AES INPUT FIFO FULL\n");
+ if (InputFIFO.IsFull()) printf("!!! AES INPUT FIFO FULL\n");
- InputFIFO->Write(val);
+ InputFIFO.Write(val);
if (!(Cnt & (1<<31))) return;
@@ -387,7 +382,7 @@ void CheckInputDMA()
{
if (RemBlocks == 0) return;
- if (InputFIFO->Level() <= InputDMASize)
+ if (InputFIFO.Level() <= InputDMASize)
{
// trigger input DMA
DSi::CheckNDMAs(1, 0x2A);
@@ -398,7 +393,7 @@ void CheckInputDMA()
void CheckOutputDMA()
{
- if (OutputFIFO->Level() >= OutputDMASize)
+ if (OutputFIFO.Level() >= OutputDMASize)
{
// trigger output DMA
DSi::CheckNDMAs(1, 0x2B);
@@ -407,7 +402,7 @@ void CheckOutputDMA()
void Update()
{
- while (InputFIFO->Level() >= 4 && OutputFIFO->Level() <= 12 && RemBlocks > 0)
+ while (InputFIFO.Level() >= 4 && OutputFIFO.Level() <= 12 && RemBlocks > 0)
{
switch (AESMode)
{
@@ -463,7 +458,7 @@ void Update()
if (Cnt & (1<<30)) NDS::SetIRQ2(NDS::IRQ2_DSi_AES);
DSi::StopNDMAs(1, 0x2A);
- if (OutputFIFO->Level() > 0)
+ if (!OutputFIFO.IsEmpty())
DSi::CheckNDMAs(1, 0x2B);
else
DSi::StopNDMAs(1, 0x2B);