32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "hw_sce_private.h"
36 #include "hw_sce_ra_private.h"
37 #include "hw_sce_aes_private.h"
47 #if (RA8_CRYPTO_CIPHER_SUPPORT == ENABLED && AES_SUPPORT == ENABLED)
62 uint8_t *output,
size_t length, uint32_t command)
80 status = HW_SCE_Aes128EncryptDecryptInitSub(&keyType, &command,
81 context->
ek, (
const uint32_t *)
iv);
83 else if(context->
nr == 12)
85 status = HW_SCE_Aes192EncryptDecryptInitSub(&command,
86 context->
ek, (
const uint32_t *)
iv);
88 else if(context->
nr == 14)
90 status = HW_SCE_Aes256EncryptDecryptInitSub(&keyType, &command,
91 context->
ek, (
const uint32_t *)
iv);
95 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
99 if(status == FSP_SUCCESS)
105 if(context->
nr == 10)
107 HW_SCE_Aes128EncryptDecryptUpdateSub((
const uint32_t *) input,
108 (uint32_t *) output, (
length -
n) / 4);
110 else if(context->
nr == 12)
112 HW_SCE_Aes192EncryptDecryptUpdateSub((
const uint32_t *) input,
113 (uint32_t *) output, (
length -
n) / 4);
117 HW_SCE_Aes256EncryptDecryptUpdateSub((
const uint32_t *) input,
118 (uint32_t *) output, (
length -
n) / 4);
129 if(context->
nr == 10)
131 HW_SCE_Aes128EncryptDecryptUpdateSub(
block,
block,
134 else if(context->
nr == 12)
136 HW_SCE_Aes192EncryptDecryptUpdateSub(
block,
block,
141 HW_SCE_Aes256EncryptDecryptUpdateSub(
block,
block,
151 if(status == FSP_SUCCESS)
154 if(context->
nr == 10)
156 status = HW_SCE_Aes128EncryptDecryptFinalSub();
158 else if(context->
nr == 12)
160 status = HW_SCE_Aes192EncryptDecryptFinalSub();
162 else if(context->
nr == 14)
164 status = HW_SCE_Aes256EncryptDecryptFinalSub();
168 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
173 if(status != FSP_SUCCESS)
199 if(context == NULL || key == NULL)
212 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
213 SCE_OEM_CMD_AES128, NULL, NULL, key, context->
ek);
215 else if(keyLen == 24)
221 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
222 SCE_OEM_CMD_AES192, NULL, NULL, key, context->
ek);
224 else if(keyLen == 32)
230 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
231 SCE_OEM_CMD_AES256, NULL, NULL, key, context->
ek);
236 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
258 SCE_AES_IN_DATA_CMD_ECB_ENCRYPTION);
273 SCE_AES_IN_DATA_CMD_ECB_DECRYPTION);
277 #if (ECB_SUPPORT == ENABLED)
290 const uint8_t *
p, uint8_t *
c,
size_t length)
309 SCE_AES_IN_DATA_CMD_ECB_ENCRYPTION);
354 const uint8_t *
c, uint8_t *
p,
size_t length)
373 SCE_AES_IN_DATA_CMD_ECB_DECRYPTION);
407 #if (CBC_SUPPORT == ENABLED)
421 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
440 SCE_AES_IN_DATA_CMD_CBC_ENCRYPTION);
505 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
529 SCE_AES_IN_DATA_CMD_CBC_DECRYPTION);
585 #if (CTR_SUPPORT == ENABLED)
600 uint8_t *
t,
const uint8_t *
p, uint8_t *
c,
size_t length)
622 SCE_AES_IN_DATA_CMD_CTR_ENCRYPTION_DECRYPTION);
672 for(i = 0; i <
n; i++)
678 for(temp = 1, i = 1; i <=
m; i++)
704 #if (GCM_SUPPORT == ENABLED)
718 if(context == NULL || cipherContext == NULL)
750 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p,
751 uint8_t *
c,
size_t length, uint8_t *
t,
size_t tLen)
773 if(tLen < 4 || tLen > 16)
795 if(aesContext->
nr == 10)
797 status = HW_SCE_Aes128GcmEncryptInitSub(&keyType, &dummy, &dummy,
798 aesContext->
ek, temp, &dummy);
800 else if(aesContext->
nr == 12)
802 status = HW_SCE_Aes192GcmEncryptInitSub(aesContext->
ek, temp);
804 else if(aesContext->
nr == 14)
806 status = HW_SCE_Aes256GcmEncryptInitSub(&keyType, aesContext->
ek, temp);
810 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
814 if(status == FSP_SUCCESS)
826 if(aesContext->
nr == 10)
828 HW_SCE_Aes128GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
830 else if(aesContext->
nr == 12)
832 HW_SCE_Aes192GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
836 HW_SCE_Aes256GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
851 if(aesContext->
nr == 10)
853 HW_SCE_Aes128GcmEncryptUpdateAADSub(
block, 1);
855 else if(aesContext->
nr == 12)
857 HW_SCE_Aes192GcmEncryptUpdateAADSub(
block, 1);
861 HW_SCE_Aes256GcmEncryptUpdateAADSub(
block, 1);
866 if(aesContext->
nr == 10)
868 HW_SCE_Aes128GcmEncryptUpdateTransitionSub();
870 else if(aesContext->
nr == 12)
872 HW_SCE_Aes192GcmEncryptUpdateTransitionSub();
876 HW_SCE_Aes256GcmEncryptUpdateTransitionSub();
889 if(aesContext->
nr == 10)
891 HW_SCE_Aes128GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
894 else if(aesContext->
nr == 12)
896 HW_SCE_Aes192GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
901 HW_SCE_Aes256GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
928 if(aesContext->
nr == 10)
930 status = HW_SCE_Aes128GcmEncryptFinalSub(
block, temp, temp + 2,
933 else if(aesContext->
nr == 12)
935 status = HW_SCE_Aes192GcmEncryptFinalSub(
block, temp, temp + 2,
938 else if(aesContext->
nr == 14)
940 status = HW_SCE_Aes256GcmEncryptFinalSub(
block, temp, temp + 2,
945 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
950 if(status == FSP_SUCCESS)
982 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c,
983 uint8_t *
p,
size_t length,
const uint8_t *
t,
size_t tLen)
1005 if(tLen < 4 || tLen > 16)
1027 if(aesContext->
nr == 10)
1029 status = HW_SCE_Aes128GcmDecryptInitSub(&keyType, &dummy, &dummy,
1030 aesContext->
ek, temp, &dummy);
1032 else if(aesContext->
nr == 12)
1034 status = HW_SCE_Aes192GcmDecryptInitSub(aesContext->
ek, temp);
1036 else if(aesContext->
nr == 14)
1038 status = HW_SCE_Aes256GcmDecryptInitSub(&keyType, aesContext->
ek, temp);
1042 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1046 if(status == FSP_SUCCESS)
1058 if(aesContext->
nr == 10)
1060 HW_SCE_Aes128GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1062 else if(aesContext->
nr == 12)
1064 HW_SCE_Aes192GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1068 HW_SCE_Aes256GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1083 if(aesContext->
nr == 10)
1085 HW_SCE_Aes128GcmDecryptUpdateAADSub(
block, 1);
1087 else if(aesContext->
nr == 12)
1089 HW_SCE_Aes192GcmDecryptUpdateAADSub(
block, 1);
1093 HW_SCE_Aes256GcmDecryptUpdateAADSub(
block, 1);
1098 if(aesContext->
nr == 10)
1100 HW_SCE_Aes128GcmDecryptUpdateTransitionSub();
1102 else if(aesContext->
nr == 12)
1104 HW_SCE_Aes192GcmDecryptUpdateTransitionSub();
1108 HW_SCE_Aes256GcmDecryptUpdateTransitionSub();
1121 if(aesContext->
nr == 10)
1123 HW_SCE_Aes128GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1126 else if(aesContext->
nr == 12)
1128 HW_SCE_Aes192GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1133 HW_SCE_Aes256GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1163 osMemset(authTag, 0,
sizeof(authTag));
1167 if(aesContext->
nr == 10)
1169 status = HW_SCE_Aes128GcmDecryptFinalSub(
block, temp, temp + 2,
1170 authTag, temp + 4,
block);
1172 else if(aesContext->
nr == 12)
1174 status = HW_SCE_Aes192GcmDecryptFinalSub(
block, temp, temp + 2,
1175 authTag, temp + 4,
block);
1177 else if(aesContext->
nr == 14)
1179 status = HW_SCE_Aes256GcmDecryptFinalSub(
block, temp, temp + 2,
1180 authTag, temp + 4,
block);
1184 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1189 if(status == FSP_SUCCESS)
1203 #if (CCM_SUPPORT == ENABLED)
1222 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p, uint8_t *
c,
1223 size_t length, uint8_t *
t,
size_t tLen)
1235 uint32_t authTag[4];
1248 if(aLen > (
sizeof(header) - 18))
1262 osMemset(header, 0,
sizeof(header));
1279 osMemcpy(header + headerLen + 2,
a, aLen);
1281 headerLen += 2 + aLen;
1291 if(aesContext->
nr == 10)
1293 status = HW_SCE_Aes128CcmEncryptInitSubGeneral(&keyType, &dataType,
1294 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1295 &
seqNum, (headerLen + 3) / 4);
1297 else if(aesContext->
nr == 12)
1299 status = HW_SCE_Aes192CcmEncryptInitSubGeneral(&keyType, &dataType,
1300 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1301 &
seqNum, (headerLen + 3) / 4);
1303 else if(aesContext->
nr == 14)
1305 status = HW_SCE_Aes256CcmEncryptInitSubGeneral(&keyType, &dataType,
1306 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1307 &
seqNum, (headerLen + 3) / 4);
1311 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1315 if(status == FSP_SUCCESS)
1324 if(aesContext->
nr == 10)
1326 HW_SCE_Aes128CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1329 else if(aesContext->
nr == 12)
1331 HW_SCE_Aes192CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1336 HW_SCE_Aes256CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1355 if(aesContext->
nr == 10)
1357 status = HW_SCE_Aes128CcmEncryptFinalSubGeneral(
block, &textLen,
1360 else if(aesContext->
nr == 12)
1362 status = HW_SCE_Aes192CcmEncryptFinalSub(
block, &textLen,
block,
1365 else if(aesContext->
nr == 14)
1367 status = HW_SCE_Aes256CcmEncryptFinalSub(
block, &textLen,
block,
1372 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1377 if(status == FSP_SUCCESS)
1410 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c, uint8_t *
p,
1411 size_t length,
const uint8_t *
t,
size_t tLen)
1420 uint32_t authTagLen;
1424 uint32_t authTag[4];
1437 if(aLen > (
sizeof(header) - 18))
1452 osMemset(header, 0,
sizeof(header));
1469 osMemcpy(header + headerLen + 2,
a, aLen);
1471 headerLen += 2 + aLen;
1481 if(aesContext->
nr == 10)
1483 status = HW_SCE_Aes128CcmDecryptInitSubGeneral(&keyType, &dataType,
1484 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1485 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1487 else if(aesContext->
nr == 12)
1489 status = HW_SCE_Aes192CcmDecryptInitSubGeneral(&keyType, &dataType,
1490 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1491 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1493 else if(aesContext->
nr == 14)
1495 status = HW_SCE_Aes256CcmDecryptInitSubGeneral(&keyType, &dataType,
1496 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1497 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1501 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1505 if(status == FSP_SUCCESS)
1514 if(aesContext->
nr == 10)
1516 HW_SCE_Aes128CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1519 else if(aesContext->
nr == 12)
1521 HW_SCE_Aes192CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1526 HW_SCE_Aes256CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1545 osMemset(authTag, 0,
sizeof(authTag));
1549 if(aesContext->
nr == 10)
1551 status = HW_SCE_Aes128CcmDecryptFinalSubGeneral(
block, &textLen,
1552 authTag, &authTagLen,
block);
1554 else if(aesContext->
nr == 12)
1556 status = HW_SCE_Aes192CcmDecryptFinalSub(
block, &textLen,
1557 authTag, &authTagLen,
block);
1559 else if(aesContext->
nr == 14)
1561 status = HW_SCE_Aes256CcmDecryptFinalSub(
block, &textLen,
1562 authTag, &authTagLen,
block);
1566 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1571 if(status == FSP_SUCCESS)
error_t ccmFormatBlock0(size_t q, const uint8_t *n, size_t nLen, size_t aLen, size_t tLen, uint8_t *b)
Format first block B(0)
void ccmFormatCounter0(const uint8_t *n, size_t nLen, uint8_t *ctr)
Format initial counter value CTR(0)
Collection of AEAD algorithms.
Block cipher modes of operation.
General definitions for cryptographic algorithms.
@ ERROR_FAILURE
Generic error code.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemset(p, value, length)
#define osMemcpy(dest, src, length)
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
RA8 hardware cryptographic accelerator (RSIP7)
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen)
Key expansion.
error_t ccmDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *n, size_t nLen, const uint8_t *a, size_t aLen, const uint8_t *c, uint8_t *p, size_t length, const uint8_t *t, size_t tLen)
Authenticated decryption using CCM.
error_t gcmEncrypt(GcmContext *context, const uint8_t *iv, size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *p, uint8_t *c, size_t length, uint8_t *t, size_t tLen)
Authenticated encryption using GCM.
error_t ccmEncrypt(const CipherAlgo *cipher, void *context, const uint8_t *n, size_t nLen, const uint8_t *a, size_t aLen, const uint8_t *p, uint8_t *c, size_t length, uint8_t *t, size_t tLen)
Authenticated encryption using CCM.
error_t ctrEncrypt(const CipherAlgo *cipher, void *context, uint_t m, uint8_t *t, const uint8_t *p, uint8_t *c, size_t length)
CTR encryption.
error_t cbcEncrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
CBC encryption.
error_t cbcDecrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *c, uint8_t *p, size_t length)
CBC decryption.
void aesDecryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 16-byte block using AES algorithm.
void aesEncryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 16-byte block using AES algorithm.
error_t gcmDecrypt(GcmContext *context, const uint8_t *iv, size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *c, uint8_t *p, size_t length, const uint8_t *t, size_t tLen)
Authenticated decryption using GCM.
error_t ecbEncrypt(const CipherAlgo *cipher, void *context, const uint8_t *p, uint8_t *c, size_t length)
ECB encryption.
error_t aesProcessData(AesContext *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t command)
Perform AES encryption or decryption.
error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
error_t ecbDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *c, uint8_t *p, size_t length)
ECB decryption.
RA8 cipher hardware accelerator.
Common interface for encryption algorithms.
CipherAlgoEncryptBlock encryptBlock
CipherAlgoDecryptBlock decryptBlock
const CipherAlgo * cipherAlgo
Cipher algorithm.
void * cipherContext
Cipher algorithm context.