parent
e43a216ab5
commit
ff69df2a15
|
@ -165,9 +165,37 @@ void ProcessBlock_CCM_Decrypt()
|
|||
//printf("AES-CCM: "); _printhex2(data, 16);
|
||||
|
||||
Swap16(data_rev, data);
|
||||
|
||||
AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16);
|
||||
for (int i = 0; i < 16; i++) CurMAC[i] ^= data_rev[i];
|
||||
AES_ECB_encrypt(&Ctx, CurMAC);
|
||||
|
||||
Swap16(data, data_rev);
|
||||
|
||||
//printf(" -> "); _printhex2(data, 16);
|
||||
|
||||
OutputFIFO->Write(*(u32*)&data[0]);
|
||||
OutputFIFO->Write(*(u32*)&data[4]);
|
||||
OutputFIFO->Write(*(u32*)&data[8]);
|
||||
OutputFIFO->Write(*(u32*)&data[12]);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
//printf("AES-CCM: "); _printhex2(data, 16);
|
||||
|
||||
Swap16(data_rev, data);
|
||||
|
||||
for (int i = 0; i < 16; i++) CurMAC[i] ^= data_rev[i];
|
||||
AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16);
|
||||
AES_ECB_encrypt(&Ctx, CurMAC);
|
||||
|
||||
Swap16(data, data_rev);
|
||||
|
@ -232,7 +260,6 @@ void WriteCnt(u32 val)
|
|||
OutputDMASize = dmasize_out[(val >> 14) & 0x3];
|
||||
|
||||
AESMode = (val >> 28) & 0x3;
|
||||
if (AESMode == 1) printf("AES-CCM TODO\n");
|
||||
|
||||
if (val & (1<<24))
|
||||
{
|
||||
|
@ -245,6 +272,8 @@ void WriteCnt(u32 val)
|
|||
// transfer start (checkme)
|
||||
RemBlocks = BlkCnt >> 16;
|
||||
|
||||
if (AESMode == 0 && (!(val & (1<<20)))) printf("AES: CCM-DECRYPT MAC FROM WRFIFO, TODO\n");
|
||||
|
||||
if (RemBlocks > 0)
|
||||
{
|
||||
u8 key[16];
|
||||
|
@ -365,14 +394,9 @@ void Update()
|
|||
switch (AESMode)
|
||||
{
|
||||
case 0: ProcessBlock_CCM_Decrypt(); break;
|
||||
case 1: ProcessBlock_CCM_Encrypt(); break;
|
||||
case 2:
|
||||
case 3: ProcessBlock_CTR(); break;
|
||||
default:
|
||||
// dorp
|
||||
OutputFIFO->Write(InputFIFO->Read());
|
||||
OutputFIFO->Write(InputFIFO->Read());
|
||||
OutputFIFO->Write(InputFIFO->Read());
|
||||
OutputFIFO->Write(InputFIFO->Read());
|
||||
}
|
||||
|
||||
RemBlocks--;
|
||||
|
@ -398,6 +422,24 @@ void Update()
|
|||
if (CurMAC[15-i] != MAC[i]) Cnt &= ~(1<<21);
|
||||
}
|
||||
}
|
||||
else if (AESMode == 1)
|
||||
{
|
||||
Ctx.Iv[13] = 0x00;
|
||||
Ctx.Iv[14] = 0x00;
|
||||
Ctx.Iv[15] = 0x00;
|
||||
AES_CTR_xcrypt_buffer(&Ctx, CurMAC, 16);
|
||||
|
||||
u8 finalmac[16];
|
||||
Swap16(finalmac, CurMAC);
|
||||
|
||||
OutputFIFO->Write(*(u32*)&finalmac[0]);
|
||||
OutputFIFO->Write(*(u32*)&finalmac[4]);
|
||||
OutputFIFO->Write(*(u32*)&finalmac[8]);
|
||||
OutputFIFO->Write(*(u32*)&finalmac[12]);
|
||||
|
||||
// CHECKME
|
||||
Cnt &= ~(1<<21);
|
||||
}
|
||||
else
|
||||
{
|
||||
// CHECKME
|
||||
|
|
Loading…
Reference in New Issue