@@ -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;
4545static 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
113112s32 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
121123s32 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