arrange AES APIs (almost is around ARM9)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@76 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
yutaka 2007-05-22 09:28:16 +00:00
parent 56d2717953
commit 58d709b0c1
8 changed files with 853 additions and 65 deletions

View File

@ -212,17 +212,26 @@ static void AesPxiCallback(PXIFifoTag tag, u32 data, BOOL err)
case AES_PXI_COMMAND_WAIT_INPUT_FIFO_NOT_FULL:
case AES_PXI_COMMAND_WAIT_OUTPUT_FIFO_NOT_EMPTY:
case AES_PXI_COMMAND_IS_VALID:
#if 0
case AES_PXI_COMMAND_SELECT_KEY:
case AES_PXI_COMMAND_SET_KEY:
case AES_PXI_COMMAND_SET_ID:
case AES_PXI_COMMAND_SET_SEED:
case AES_PXI_COMMAND_SET_KEY2:
#else
case AES_PXI_COMMAND_SET_GENERAL_KEY:
case AES_PXI_COMMAND_SET_SYSTEM_KEY:
case AES_PXI_COMMAND_SET_GAME_KEY:
case AES_PXI_COMMAND_SET_SPECIAL_KEY:
case AES_PXI_COMMAND_SET_ALTERNATIVE_KEY:
#endif
case AES_PXI_COMMAND_START_CCM_DEC:
case AES_PXI_COMMAND_START_CCM_DEC_NOMAC:
case AES_PXI_COMMAND_START_CCM_ENC:
case AES_PXI_COMMAND_START_CTR:
case AES_PXI_COMMAND_START_DMA_SEND:
case AES_PXI_COMMAND_START_DMA_RECV:
case AES_PXI_COMMAND_WAIT_DMA:
case AES_PXI_COMMAND_CPU_SEND:
case AES_PXI_COMMAND_CPU_RECV:
// スレッドを再開
@ -304,8 +313,10 @@ static void AesThread(void *arg)
OSMessage msg;
BOOL result;
u128 data128a;
u128 data128;
#if 0
u128 data128b;
#endif
u96 data96;
u32 data32a;
u32 data32b;
@ -371,7 +382,7 @@ static void AesThread(void *arg)
AesReturnResult(aesWork.command, result ?
AES_PXI_RESULT_SUCCESS_TRUE : AES_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達
break;
#if 0
case AES_PXI_COMMAND_SELECT_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SELECT_KEY);
AES_SelectKey(aesWork.data[0]);
@ -380,40 +391,76 @@ static void AesThread(void *arg)
case AES_PXI_COMMAND_SET_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_KEY);
AES_UNPACK_U128(&data128a, &aesWork.data[1]);
AES_SetKey(aesWork.data[0], &data128a);
AES_UNPACK_U128(&data128, &aesWork.data[1]);
AES_SetKey(aesWork.data[0], &data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_ID:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_ID);
AES_UNPACK_U128(&data128a, &aesWork.data[1]);
AES_SetId(aesWork.data[0], &data128a);
AES_UNPACK_U128(&data128, &aesWork.data[1]);
AES_SetId(aesWork.data[0], &data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_SEED:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_SEED);
AES_UNPACK_U128(&data128a, &aesWork.data[1]);
AES_SetSeed(aesWork.data[0], &data128a);
AES_UNPACK_U128(&data128, &aesWork.data[1]);
AES_SetSeed(aesWork.data[0], &data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_KEY2:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_KEY2);
AES_UNPACK_U128(&data128a, &aesWork.data[1]);
AES_UNPACK_U128(&data128, &aesWork.data[1]);
AES_UNPACK_U128(&data128b, &aesWork.data[17]);
AES_SetKey2(aesWork.data[1], &data128a, &data128b);
AES_SetKey2(aesWork.data[1], &data128, &data128b);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
#else
case AES_PXI_COMMAND_SET_GENERAL_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_GENERAL_KEY);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AES_SetGeneralKey(&data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_SYSTEM_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_SYSTEM_KEY);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AES_SetSystemKey(&data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_GAME_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_GAME_KEY);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AES_SetGameKey(&data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_SPECIAL_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_SPECIAL_KEY);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AES_SetSpecialKey(&data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_SET_ALTERNATIVE_KEY:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_SET_ALTERNATIVE_KEY);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AESi_SetAlternativeKey(&data128);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
#endif
case AES_PXI_COMMAND_START_CCM_DEC:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_START_CCM_DEC);
AES_UNPACK_U96(&data96, &aesWork.data[0]);
AES_UNPACK_U128(&data128a, &aesWork.data[12]);
AES_UNPACK_U128(&data128, &aesWork.data[12]);
AES_UNPACK_U32(&data32a, &aesWork.data[28]);
AES_UNPACK_U32(&data32b, &aesWork.data[32]);
AES_StartCcmDec(&data96, &data128a, data32a, data32b, (BOOL)aesWork.data[36]);
AES_StartCcmDec(&data96, &data128, data32a, data32b, (BOOL)aesWork.data[36]);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
@ -437,9 +484,9 @@ static void AesThread(void *arg)
case AES_PXI_COMMAND_START_CTR:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_START_CTR);
AES_UNPACK_U128(&data128a, &aesWork.data[0]);
AES_UNPACK_U128(&data128, &aesWork.data[0]);
AES_UNPACK_U32(&data32a, &aesWork.data[16]);
AES_StartCtrDec(&data128a, data32a);
AES_StartCtrDec(&data128, data32a);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
@ -459,6 +506,12 @@ static void AesThread(void *arg)
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_WAIT_DMA:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_WAIT_DMA);
MIi_WaitExDma(aesWork.data[0]);
AesReturnResult(aesWork.command, AES_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達
break;
case AES_PXI_COMMAND_CPU_SEND:
AES_PXI_SIZE_CHECK(AES_PXI_SIZE_START_DMA_SEND);
AES_UNPACK_U32(&data32a, &aesWork.data[0]);

View File

@ -532,6 +532,7 @@ AESResult AES_IsValid(void)
return aesWork.result;
}
#if 0
/*---------------------------------------------------------------------------*
Name: AES_SelectKeyAsync
@ -907,6 +908,389 @@ AESResult AES_SetKey2(u32 keyNo, const u128 *pId, const u128 *pSeed)
}
return aesWork.result;
}
#else
/*---------------------------------------------------------------------------*
Name: AES_SetGeneralKeyAsync
Description: set AES key normally
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGeneralKeyAsync(const u128 *pKey, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_SET_GENERAL_KEY;
const u8 size = AES_PXI_SIZE_SET_GENERAL_KEY;
OSIntrMode enabled;
u8 data[size];
int i;
SDK_NULL_ASSERT(pKey);
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
// データ作成
AES_PACK_U128(&data[0], pKey);
// コマンド送信
if (AesSendPxiCommand(command, size, data[0]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
for (i = 1; i < size; i+=3) {
if (AesSendPxiData(&data[i]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
}
return AES_RESULT_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: AES_SetGeneralKey
Description: set AES key normally
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGeneralKey(const u128 *pKey)
{
aesWork.result = AES_SetGeneralKeyAsync(pKey, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
/*---------------------------------------------------------------------------*
Name: AES_SetSystemKeyAsync
Description: set AES key to be restricted to the system (device)
NOTE: if data encrypted this key, other system cannot
decrypt with this key. but another key can decrypt it if
another key was found for another system.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSystemKeyAsync(const u128 *pKey, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_SET_SYSTEM_KEY;
const u8 size = AES_PXI_SIZE_SET_SYSTEM_KEY;
OSIntrMode enabled;
u8 data[size];
int i;
SDK_NULL_ASSERT(pKey);
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
// データ作成
AES_PACK_U128(&data[0], pKey);
// コマンド送信
if (AesSendPxiCommand(command, size, data[0]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
for (i = 1; i < size; i+=3) {
if (AesSendPxiData(&data[i]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
}
return AES_RESULT_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: AES_SetSystemKey
Description: set AES key to be restricted to the system (device)
NOTE: if data encrypted this key, other system cannot
decrypt with this key. but another key can decrypt it if
another key was found for another system.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSystemKey(const u128 *pKey)
{
aesWork.result = AES_SetSystemKeyAsync(pKey, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
/*---------------------------------------------------------------------------*
Name: AES_SetGameKeyAsync
Description: set AES key to be restricted to the application (initial code).
NOTE: if data encrypted this key, other application cannot
decrypt with this key. but another key can decrypt it if
another key was found for another application.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGameKeyAsync(const u128 *pKey, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_SET_GAME_KEY;
const u8 size = AES_PXI_SIZE_SET_GAME_KEY;
OSIntrMode enabled;
u8 data[size];
int i;
SDK_NULL_ASSERT(pKey);
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
// データ作成
AES_PACK_U128(&data[0], pKey);
// コマンド送信
if (AesSendPxiCommand(command, size, data[0]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
for (i = 1; i < size; i+=3) {
if (AesSendPxiData(&data[i]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
}
return AES_RESULT_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: AES_SetGameKey
Description: set AES key to be restricted to the application (initial code).
NOTE: if data encrypted this key, other application cannot
decrypt with this key. but another key can decrypt it if
another key was found for another application.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGameKey(const u128 *pKey)
{
aesWork.result = AES_SetGameKeyAsync(pKey, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
/*---------------------------------------------------------------------------*
Name: AES_SetSpecialKeyAsync
Description: set AES key to be restricted to the application and the system.
NOTE: if data encrypted this key, other application or other
system cannot decrypt with this key. but another key can
decrypt it if another key was found for another application
and/or another system.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSpecialKeyAsync(const u128 *pKey, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_SET_SPECIAL_KEY;
const u8 size = AES_PXI_SIZE_SET_SPECIAL_KEY;
OSIntrMode enabled;
u8 data[size];
int i;
SDK_NULL_ASSERT(pKey);
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
// データ作成
AES_PACK_U128(&data[0], pKey);
// コマンド送信
if (AesSendPxiCommand(command, size, data[0]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
for (i = 1; i < size; i+=3) {
if (AesSendPxiData(&data[i]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
}
return AES_RESULT_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: AES_SetSpecialKey
Description: set AES key to be restricted to the application and the system.
NOTE: if data encrypted this key, other application or other
system cannot decrypt with this key. but another key can
decrypt it if another key was found for another application
and/or another system.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSpecialKey(const u128 *pKey)
{
aesWork.result = AES_SetSpecialKeyAsync(pKey, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
#if 0 // for loader
/*---------------------------------------------------------------------------*
Name: AESi_SetAlternativeKeyAsync
Description: set mangled AES key
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AESi_SetAlternativeKeyAsync(const u128 *pKey, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_SET_ALTERNATIVE_KEY;
const u8 size = AES_PXI_SIZE_SET_ALTERNATIVE_KEY;
OSIntrMode enabled;
u8 data[size];
int i;
SDK_NULL_ASSERT(pKey);
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
// データ作成
AES_PACK_U128(&data[0], pKey);
// コマンド送信
if (AesSendPxiCommand(command, size, data[0]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
for (i = 1; i < size; i+=3) {
if (AesSendPxiData(&data[i]) == FALSE)
{
return AES_RESULT_SEND_ERROR;
}
}
return AES_RESULT_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: AES_SetAlternativeKey
Description: set mangled AES key
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetAlternativeKey(const u128 *pKey)
{
aesWork.result = AES_SetAlternativeKeyAsync(pKey, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
#endif
#endif
/*---------------------------------------------------------------------------*
Name: AES_StartCcmDecAsync
@ -1223,7 +1607,7 @@ AESResult AES_StartDmaSendAsync(u32 dmaNo, const void *src, u32 length, AESCallb
u8 data[size];
int i;
SDK_NULL_ASSERT(iv);
SDK_NULL_ASSERT(src);
AES_ASSERT_DATA_LENGTH(length);
SDK_NULL_ASSERT(callback);
@ -1306,7 +1690,7 @@ AESResult AES_StartDmaRecvAsync(u32 dmaNo, const void *dest, u32 length, AESCall
u8 data[size];
int i;
SDK_NULL_ASSERT(iv);
SDK_NULL_ASSERT(dest);
AES_ASSERT_DATA_LENGTH(length);
SDK_NULL_ASSERT(callback);
@ -1365,6 +1749,62 @@ AESResult AES_StartDmaRecv(u32 dmaNo, const void *dest, u32 length)
}
return aesWork.result;
}
/*---------------------------------------------------------------------------*
Name: AES_WaitDmaAsync
Description: Waiting ARM7 side DMA is done.
It may move to MI.
async version.
Arguments: dmaNo : DMA channel No. (4 - 7)
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_WaitDmaAsync(u32 dmaNo, AESCallback callback, void *arg)
{
const AESPxiCommand command = AES_PXI_COMMAND_WAIT_DMA;
const u8 size = AES_PXI_SIZE_WAIT_DMA;
OSIntrMode enabled;
SDK_NULL_ASSERT(callback);
enabled = OS_DisableInterrupts();
if (aesWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return AES_RESULT_BUSY;
}
aesWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
// コールバック設定
aesWork.callback = callback;
aesWork.callbackArg = arg;
return AesSendPxiCommand(command, size, (u8)dmaNo) ? AES_RESULT_SUCCESS : AES_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: AES_WaitDma
Description: Waiting ARM7 side DMA is done.
It may move to MI.
sync version.
Arguments: dmaNo : DMA channel No. (4 - 7)
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_WaitDma(u32 dmaNo)
{
aesWork.result = AES_WaitDmaAsync(dmaNo, AesSyncCallback, 0);
if (aesWork.result == AES_RESULT_SUCCESS)
{
AesWaitBusy();
}
return aesWork.result;
}
/*---------------------------------------------------------------------------*
Name: AES_CpuSendAsync
@ -1390,7 +1830,7 @@ AESResult AES_CpuSendAsync(const void *src, u32 length, AESCallback callback, vo
u8 data[size];
int i;
SDK_NULL_ASSERT(iv);
SDK_NULL_ASSERT(src);
AES_ASSERT_DATA_LENGTH(length);
SDK_NULL_ASSERT(callback);
@ -1472,7 +1912,7 @@ AESResult AES_CpuRecvAsync(const void *dest, u32 length, AESCallback callback, v
u8 data[size];
int i;
SDK_NULL_ASSERT(iv);
SDK_NULL_ASSERT(dest);
AES_ASSERT_DATA_LENGTH(length);
SDK_NULL_ASSERT(callback);

View File

@ -31,12 +31,6 @@ static const u128 key = {
0x01234567,
0x89abcdef
};
static const u128 key2 = {
0x00112233,
0x44556677,
0x8899aabb,
0xccddeeff
};
static const u96 nonce = {
0x01234567,
0x89abcdef,
@ -297,7 +291,7 @@ void TwlMain()
// 鍵を設定しておく
AES_SetKey(0, &key);
AES_SetKey2(1, &key, &key2);
AES_SetSeed(1, &key);
test0();
test1();

View File

@ -27,12 +27,6 @@ static const u128 key = {
0x01234567,
0x89abcdef
};
static const u128 key2 = {
0x00112233,
0x44556677,
0x8899aabb,
0xccddeeff
};
static const u96 nonce = {
0x01234567,
0x89abcdef,
@ -61,8 +55,8 @@ static const u32 gs_data[] ATTRIBUTE_ALIGN(32) = {
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567
};
static u8 dataA[sizeof(gs_data) + sizeof(u128)] ATTRIBUTE_ALIGN(32);
static u8 dataB[sizeof(gs_data) + sizeof(u128)] ATTRIBUTE_ALIGN(32);
static u8 dataA[sizeof(gs_data) + sizeof(u128) + 32] ATTRIBUTE_ALIGN(32);
static u8 dataB[sizeof(gs_data) + sizeof(u128) + 32] ATTRIBUTE_ALIGN(32);
//================================================================================
static void dump(const char *str, void *ptr, u32 length)
@ -94,11 +88,11 @@ static void test0(void)
OS_TPrintf("%s: Failed to call AES_Reset (%d).\n", __func__, result);
}
// 鍵は0番目を使う
result = AES_SelectKey(0);
// 鍵を設定する
result = AES_SetGeneralKey(&key);
if (AES_RESULT_SUCCESS != result)
{
OS_TPrintf("%s: Failed to call AES_SelectKey (%d).\n", __func__, result);
OS_TPrintf("%s: Failed to call AES_SetGeneralKey (%d).\n", __func__, result);
}
#ifdef TEST0_USE_DMA_INPUT
@ -132,11 +126,11 @@ static void test0(void)
#ifdef TEST0_USE_DMA_INPUT
#ifdef TEST0_USE_DMA_OUTPUT
// AES完了待ち
result = AES_Wait();
// AES出力DMA完了待ち
result = AES_WaitDma(OUTPUT_DMA);
if (AES_RESULT_SUCCESS != result)
{
OS_TPrintf("%s: Failed to call AES_Wait (%d).\n", __func__, result);
OS_TPrintf("%s: Failed to call AES_WaitDma (%d).\n", __func__, result);
}
#else
// CPUで出力してみる
@ -240,10 +234,10 @@ static void test2(void)
}
// 鍵を設定する
result = AES_SelectKey(1);
result = AES_SetSpecialKey(&key);
if (AES_RESULT_SUCCESS != result)
{
OS_TPrintf("%s: Failed to call AES_SelectKey (%d).\n", __func__, result);
OS_TPrintf("%s: Failed to call AES_SetSpecialKey (%d).\n", __func__, result);
}
// 出力DMA設定
@ -331,18 +325,6 @@ void TwlMain()
}
OS_TPrintf("AES_TryLock wad done.\n");
// 鍵を設定しておく
result = AES_SetKey(0, &key);
if (AES_RESULT_SUCCESS != result)
{
OS_TPrintf("%s: Failed to call AES_SetKey (%d).\n", __func__, result);
}
result = AES_SetKey2(1, &key, &key2);
if (AES_RESULT_SUCCESS != result)
{
OS_TPrintf("%s: Failed to call AES_SetKey2 (%d).\n", __func__, result);
}
test0();
test1();
test2();

View File

@ -69,6 +69,21 @@ typedef enum
}
AESMacLength;
// make sense of the purpose
typedef enum
{
AES_KEYSEL_GAME = 0,
AES_KEYSEL_SPECIAL = 1,
AES_KEYSEL_ALTERNATIVE = 2,
AES_KEYSEL_SYSTEM = 3,
AES_KEYSEL_IPL = AES_KEYSEL_ALTERNATIVE,
AES_KEYSEL_GENERAL = 0 // for key register
}
AESKeySel;
/*---------------------------------------------------------------------------*
<EFBFBD>\¢Ìè`
*---------------------------------------------------------------------------*/
@ -229,6 +244,88 @@ void AES_SetSeed(u32 keyNo, const u128 *pSeed);
*---------------------------------------------------------------------------*/
void AES_SetKey2(u32 keyNo, const u128 *pId, const u128 *pSeed);
// APIs for constract with ARM9
/*---------------------------------------------------------------------------*
Name: AES_SetGeneralKey
Description: set AES key normally
Arguments: pKey - pointer to key data
Returns: None.
*---------------------------------------------------------------------------*/
static inline void AES_SetGeneralKey(const u128 *pKey)
{
AES_SetKey(AES_KEYSEL_GENERAL, pKey);
AES_SelectKey(AES_KEYSEL_GENERAL);
}
/*---------------------------------------------------------------------------*
Name: AES_SetSystemKey
Description: set AES key to be restricted to the system (device)
NOTE: if data encrypted this key, other system cannot
decrypt with this key. but another key can decrypt it if
another key was found for another system.
Arguments: pKey - pointer to key data
Returns: None.
*---------------------------------------------------------------------------*/
static inline void AES_SetSystemKey(const u128 *pKey)
{
AES_SetSeed(AES_KEYSEL_SYSTEM, pKey);
AES_SelectKey(AES_KEYSEL_SYSTEM);
}
/*---------------------------------------------------------------------------*
Name: AES_SetGameKey
Description: set AES key to be restricted to the application (initial code).
NOTE: if data encrypted this key, other application cannot
decrypt with this key. but another key can decrypt it if
another key was found for another application.
Arguments: pKey - pointer to key data
Returns: None.
*---------------------------------------------------------------------------*/
static inline void AES_SetGameKey(const u128 *pKey)
{
AES_SetSeed(AES_KEYSEL_GAME, pKey);
AES_SelectKey(AES_KEYSEL_GAME);
}
/*---------------------------------------------------------------------------*
Name: AES_SetSpecialKey
Description: set AES key to be restricted to the application and the system.
NOTE: if data encrypted this key, other application or other
system cannot decrypt with this key. but another key can
decrypt it if another key was found for another application
and/or another system.
Arguments: pKey - pointer to key data
Returns: None.
*---------------------------------------------------------------------------*/
static inline void AES_SetSpecialKey(const u128 *pKey)
{
AES_SetSeed(AES_KEYSEL_SPECIAL, pKey);
AES_SelectKey(AES_KEYSEL_SPECIAL);
}
/*---------------------------------------------------------------------------*
Name: AESi_SetAlternativeKey
Description: set mangled AES key
Arguments: pKey - pointer to key data
Returns: None.
*---------------------------------------------------------------------------*/
static inline void AESi_SetAlternativeKey(const u128 *pKey)
{
AES_SetSeed(AES_KEYSEL_ALTERNATIVE, pKey);
AES_SelectKey(AES_KEYSEL_ALTERNATIVE);
}
/*---------------------------------------------------------------------------*
Name: AES_StartCcmDec

View File

@ -258,6 +258,7 @@ AESResult AES_IsValidAsync(AESCallback callback, void *arg);
*---------------------------------------------------------------------------*/
AESResult AES_IsValid(void);
#if 0
/*---------------------------------------------------------------------------*
Name: AES_SelectKeyAsync
@ -406,6 +407,154 @@ AESResult AES_SetKey2Async(u32 keyNo, const u128 *pId, const u128 *pSeed, AESCal
*---------------------------------------------------------------------------*/
AESResult AES_SetKey2(u32 keyNo, const u128 *pId, const u128 *pSeed);
#else
/*---------------------------------------------------------------------------*
Name: AES_SetGeneralKeyAsync
Description: set AES key normally
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGeneralKeyAsync(const u128 *pKey, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AES_SetGeneralKey
Description: set AES key normally
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGeneralKey(const u128 *pKey);
/*---------------------------------------------------------------------------*
Name: AES_SetSystemKeyAsync
Description: set AES key to be restricted to the system (device)
NOTE: if data encrypted this key, other system cannot
decrypt with this key. but another key can decrypt it if
another key was found for another system.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSystemKeyAsync(const u128 *pKey, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AES_SetSystemKey
Description: set AES key to be restricted to the system (device)
NOTE: if data encrypted this key, other system cannot
decrypt with this key. but another key can decrypt it if
another key was found for another system.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSystemKey(const u128 *pKey);
/*---------------------------------------------------------------------------*
Name: AES_SetGameKeyAsync
Description: set AES key to be restricted to the application (initial code).
NOTE: if data encrypted this key, other application cannot
decrypt with this key. but another key can decrypt it if
another key was found for another application.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGameKeyAsync(const u128 *pKey, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AES_SetGameKey
Description: set AES key to be restricted to the application (initial code).
NOTE: if data encrypted this key, other application cannot
decrypt with this key. but another key can decrypt it if
another key was found for another application.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetGameKey(const u128 *pKey);
/*---------------------------------------------------------------------------*
Name: AES_SetSpecialKeyAsync
Description: set AES key to be restricted to the application and the system.
NOTE: if data encrypted this key, other application or other
system cannot decrypt with this key. but another key can
decrypt it if another key was found for another application
and/or another system.
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSpecialKeyAsync(const u128 *pKey, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AES_SetSpecialKey
Description: set AES key to be restricted to the application and the system.
NOTE: if data encrypted this key, other application or other
system cannot decrypt with this key. but another key can
decrypt it if another key was found for another application
and/or another system.
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_SetSpecialKey(const u128 *pKey);
#if 0 // for loader
/*---------------------------------------------------------------------------*
Name: AESi_SetAlternativeKeyAsync
Description: set mangled AES key
Arguments: pKey - pointer to key data
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AESi_SetAlternativeKeyAsync(const u128 *pKey, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AESi_SetAlternativeKey
Description: set mangled AES key
sync version.
Arguments: pKey - pointer to key data
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AESi_SetAlternativeKey(const u128 *pKey);
#endif
#endif
/*---------------------------------------------------------------------------*
Name: AES_StartCcmDecAsync
@ -632,6 +781,34 @@ AESResult AES_StartDmaRecvAsync(u32 dmaNo, const void *dest, u32 size, AESCallba
*---------------------------------------------------------------------------*/
AESResult AES_StartDmaRecv(u32 dmaNo, const void *dest, u32 size);
/*---------------------------------------------------------------------------*
Name: AES_WaitDmaAsync
Description: Waiting ARM7 side DMA is done.
It may move to MI.
async version.
Arguments: dmaNo : DMA channel No. (4 - 7)
callback -
arg -
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_WaitDmaAsync(u32 dmaNo, AESCallback callback, void *arg);
/*---------------------------------------------------------------------------*
Name: AES_WaitDma
Description: Waiting ARM7 side DMA is done.
It may move to MI.
sync version.
Arguments: dmaNo : DMA channel No. (4 - 7)
Returns: AESResult
*---------------------------------------------------------------------------*/
AESResult AES_WaitDma(u32 dmaNo);
/*---------------------------------------------------------------------------*
Name: AES_CpuSendAsync

View File

@ -55,19 +55,28 @@ typedef enum AESPxiCommand
AES_PXI_COMMAND_WAIT_INPUT_FIFO_NOT_FULL = 0x05,
AES_PXI_COMMAND_WAIT_OUTPUT_FIFO_NOT_EMPTY = 0x06,
AES_PXI_COMMAND_IS_VALID = 0x07,
#if 0
AES_PXI_COMMAND_SELECT_KEY = 0x10,
AES_PXI_COMMAND_SET_KEY = 0x11,
AES_PXI_COMMAND_SET_ID = 0x12,
AES_PXI_COMMAND_SET_SEED = 0x13,
AES_PXI_COMMAND_SET_KEY2 = 0x14,
#else
AES_PXI_COMMAND_SET_GENERAL_KEY = 0x10,
AES_PXI_COMMAND_SET_SYSTEM_KEY = 0x11,
AES_PXI_COMMAND_SET_GAME_KEY = 0x12,
AES_PXI_COMMAND_SET_SPECIAL_KEY = 0x13,
AES_PXI_COMMAND_SET_ALTERNATIVE_KEY = 0x14,
#endif
AES_PXI_COMMAND_START_CCM_DEC = 0x20,
AES_PXI_COMMAND_START_CCM_DEC_NOMAC = 0x21,
AES_PXI_COMMAND_START_CCM_ENC = 0x22,
AES_PXI_COMMAND_START_CTR = 0x23,
AES_PXI_COMMAND_START_DMA_SEND = 0x30,
AES_PXI_COMMAND_START_DMA_RECV = 0x31,
AES_PXI_COMMAND_CPU_SEND = 0x32,
AES_PXI_COMMAND_CPU_RECV = 0x33,
AES_PXI_COMMAND_WAIT_DMA = 0x32,
AES_PXI_COMMAND_CPU_SEND = 0x33,
AES_PXI_COMMAND_CPU_RECV = 0x34,
AES_PXI_COMMAND_TRY_LOCK = 0x40,
AES_PXI_COMMAND_UNLOCK = 0x41
@ -85,17 +94,26 @@ typedef enum AESPxiSize
AES_PXI_SIZE_WAIT_INPUT_FIFO_NOT_FULL = 0,
AES_PXI_SIZE_WAIT_OUTPUT_FIFO_NOT_EMPTY = 0,
AES_PXI_SIZE_IS_VALID = 0,
#if 0
AES_PXI_SIZE_SELECT_KEY = 1, // keyNo
AES_PXI_SIZE_SET_KEY = 17, // keyNo, pKey(16)
AES_PXI_SIZE_SET_ID = 17, // keyNo, pId(16)
AES_PXI_SIZE_SET_SEED = 17, // keyNo, pSeed(16)
AES_PXI_SIZE_SET_KEY2 = 33, // keyNo, pId(16), pSeed(16)
#else
AES_PXI_SIZE_SET_GENERAL_KEY = 16, // pKey(16)
AES_PXI_SIZE_SET_SYSTEM_KEY = 16, // pKey(16)
AES_PXI_SIZE_SET_GAME_KEY = 16, // pKey(16)
AES_PXI_SIZE_SET_SPECIAL_KEY = 16, // pKey(16)
AES_PXI_SIZE_SET_ALTERNATIVE_KEY = 16, // pKey(16)
#endif
AES_PXI_SIZE_START_CCM_DEC = 37, // nonce(12), mac(16), alen(4), plen(4), isA
AES_PXI_SIZE_START_CCM_DEC_NOMAC = 21, // nonce(12), alen(4), plen(4), isA
AES_PXI_SIZE_START_CCM_ENC = 21, // nonce(12), alen(4), plen(4), isA
AES_PXI_SIZE_START_CTR = 20, // iv(16), len(4)
AES_PXI_SIZE_START_DMA_SEND = 9, // no, src(4), size(4)
AES_PXI_SIZE_START_DMA_RECV = 9, // no, dest(4), size(4)
AES_PXI_SIZE_WAIT_DMA = 1, // no
AES_PXI_SIZE_CPU_SEND = 8, // src(4), size(4)
AES_PXI_SIZE_CPU_RECV = 8, // dest(4), size(4)

View File

@ -45,25 +45,52 @@ ID
また、アプリケーション依存とは、ROMヘッダ辺りを反映するということ。
上記の内容を反映するように、IDを設定することになる。
0と1はブートローダーが、2と3はIPL ROMが設定する。
(いつでも上書きできるので、IPL ROMで0と1も設定しておく)
●アプリケーション解放
●アプリケーションが触ることのできる部分
アプリケーションには、KEY[0]、SEED[0]SEED[3]を使えるようにする。
場合によっては、SEED[2]とSEED[3]は解放させない(2つしかない)
●ARM9側API案
●ARM7側初期化
鍵の種類を、DEVICE_DEPEND、APPLICATION_DEPENDの
ビットORで設定できるようにするだけ
ROMコードで全レジスタの初期値を設定している。
大半はダミーだが、ID関係の固定値はここでのみの設定となる
複数レジスタがあることも見せずに、値をほおり込むと
AESコアに送るところまで処理する。
アプリケーションローダー用に、TwlFirm内にIDのgame_code依存
部分のみを再設定するコードを用意している。
・AES_SetNormalKey(u128 pKey)
・AES_SetSpecialKey(u128 pKey, u32 types)
アプリケーション起動後はIDを触ることは無い。
●ARM9側API
次のような個別のAPIを用意して見た。
AES_SetGeneralKey() KEY[0]に鍵を設定する
AES_SetSystemKey() SEED[3]に鍵を設定する
AES_SetGameKey() SEED[0]に鍵を設定する
AES_SetSpecialKey() SEED[1]に鍵を設定する
//AESi_SetAlternativeKey() SEED[2]に鍵を設定する (非公開)
それぞれ引数をすぐに有効にするもので、「以前の鍵」という使い方は
できないようにしている。
●ARM7側API
個別に指定することも上記APIを使用することもできる。
個別設定用に、次のenumを用意している。
typedef enum
{
AES_KEYSEL_GAME = 0,
AES_KEYSEL_SPECIAL = 1,
AES_KEYSEL_ALTERNATIVE = 2,
AES_KEYSEL_SYSTEM = 3,
AES_KEYSEL_IPL = AES_KEYSEL_ALTERNATIVE,
AES_KEYSEL_GENERAL = 0 // for key register
}
AESKeySel;