Skip to content

Commit 974af95

Browse files
authored
aes: improve driver (#133)
* do checks on size & addr alignment * increase block size to the maximum size the aes engine can handle * reduce memory footprint
1 parent 7e37e62 commit 974af95

2 files changed

Lines changed: 25 additions & 20 deletions

File tree

gc/ogc/aes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ distribution.
3535
#include <gctypes.h>
3636
#include <gcutil.h>
3737

38-
#define AES_BLOCK_SIZE 128
38+
#define AES_BLOCK_SIZE 0x10000
3939

4040
#ifdef __cplusplus
4141
extern "C" {

libogc/aes.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ distribution.
3434
#include "ipc.h"
3535
#include "aes.h"
3636

37-
#define AES_HEAPSIZE 0x1000
37+
#define AES_HEAPSIZE 0x400
3838

3939
#define AES_IOCTLV_ENCRYPT 2
4040
#define AES_IOCTLV_DECRYPT 3
@@ -45,33 +45,32 @@ static s32 __aes_hid = -1;
4545
static s32 AES_ExecuteCommand(s32 command, const void* key, u32 key_size, const void* iv, u32 iv_size, const void* in_data, void* out_data, u32 data_size)
4646
{
4747
ioctlv* params = (ioctlv*)iosAlloc(__aes_hid, sizeof(ioctlv) * 4);
48-
void* tmpiv = iosAlloc(__aes_hid, 16);
49-
void* block = iosAlloc(__aes_hid, AES_BLOCK_SIZE);
50-
if (!params || !tmpiv || !block)
48+
void* tmpiv = iosAlloc(__aes_hid, iv_size);
49+
if (!params || !tmpiv)
5150
return -1;
5251

53-
memcpy(tmpiv, iv, 16);
54-
52+
memcpy(tmpiv, iv, iv_size);
53+
5554
s32 ret = -1;
5655
for (u32 i = 0; i < data_size; i += AES_BLOCK_SIZE) {
57-
memcpy(block, (void*)((u32)in_data + i), AES_BLOCK_SIZE);
56+
u32 size = i+AES_BLOCK_SIZE >= data_size
57+
? data_size - i
58+
: AES_BLOCK_SIZE;
5859

59-
params[0].data = block;
60-
params[0].len = AES_BLOCK_SIZE;
60+
params[0].data = (void*)((u32)in_data + i);
61+
params[0].len = size;
6162
params[1].data = (void*) key;
6263
params[1].len = key_size;
63-
params[2].data = block;
64-
params[2].len = AES_BLOCK_SIZE;
64+
params[2].data = (void*)((u32)out_data + i);
65+
params[2].len = size;
6566
params[3].data = tmpiv;
66-
params[3].len = 16;
67+
params[3].len = iv_size;
68+
6769
ret = IOS_Ioctlv(__aes_fd, command, 2, 2, params);
6870
if (ret < 0)
6971
break;
70-
71-
memcpy((void*)((u32)out_data + i), block, AES_BLOCK_SIZE);
7272
}
7373

74-
iosFree(__aes_hid, block);
7574
iosFree(__aes_hid, tmpiv);
7675
iosFree(__aes_hid, params);
7776
return ret;
@@ -112,16 +111,22 @@ s32 AES_Close(void)
112111

113112
s32 AES_Encrypt(const void* key, u32 key_size, const void* iv, u32 iv_size, const void* in_data, void* out_data, u32 data_size)
114113
{
115-
if (key_size != 16 || iv_size != 16)
116-
return -1;
114+
if(((u32)in_data & 0x1f) != 0 || ((u32)out_data & 0x1f) != 0)
115+
return -4;
116+
117+
if (key_size != 16 || iv_size != 16 || (data_size & 15) != 0)
118+
return -4;
117119

118120
return AES_ExecuteCommand(AES_IOCTLV_ENCRYPT, key, key_size, iv, iv_size, in_data, out_data, data_size);
119121
}
120122

121123
s32 AES_Decrypt(const void* key, u32 key_size, const void* iv, u32 iv_size, const void* in_data, void* out_data, u32 data_size)
122124
{
123-
if (key_size != 16 || iv_size != 16)
124-
return -1;
125+
if(((u32)in_data & 0x1f) != 0 || ((u32)out_data & 0x1f) != 0)
126+
return -4;
127+
128+
if (key_size != 16 || iv_size != 16 || (data_size & 15) != 0)
129+
return -4;
125130

126131
return AES_ExecuteCommand(AES_IOCTLV_DECRYPT, key, key_size, iv, iv_size, in_data, out_data, data_size);
127132
}

0 commit comments

Comments
 (0)