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 (RA4_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 && BSP_FEATURE_CRYPTO_HAS_SCE9 != 0)
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)
772 if(tLen < 4 || tLen > 16)
792 if(aesContext->
nr == 10)
794 status = HW_SCE_Aes128GcmEncryptInitSub(&keyType, aesContext->
ek, temp);
796 else if(aesContext->
nr == 12)
798 status = HW_SCE_Aes192GcmEncryptInitSub(aesContext->
ek, temp);
800 else if(aesContext->
nr == 14)
802 status = HW_SCE_Aes256GcmEncryptInitSub(&keyType, aesContext->
ek, temp);
806 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
810 if(status == FSP_SUCCESS)
822 if(aesContext->
nr == 10)
824 HW_SCE_Aes128GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
826 else if(aesContext->
nr == 12)
828 HW_SCE_Aes192GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
832 HW_SCE_Aes256GcmEncryptUpdateAADSub((uint32_t *)
a,
n / 4);
847 if(aesContext->
nr == 10)
849 HW_SCE_Aes128GcmEncryptUpdateAADSub(
block, 1);
851 else if(aesContext->
nr == 12)
853 HW_SCE_Aes192GcmEncryptUpdateAADSub(
block, 1);
857 HW_SCE_Aes256GcmEncryptUpdateAADSub(
block, 1);
862 if(aesContext->
nr == 10)
864 HW_SCE_Aes128GcmEncryptUpdateTransitionSub();
866 else if(aesContext->
nr == 12)
868 HW_SCE_Aes192GcmEncryptUpdateTransitionSub();
872 HW_SCE_Aes256GcmEncryptUpdateTransitionSub();
885 if(aesContext->
nr == 10)
887 HW_SCE_Aes128GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
890 else if(aesContext->
nr == 12)
892 HW_SCE_Aes192GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
897 HW_SCE_Aes256GcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
924 if(aesContext->
nr == 10)
926 status = HW_SCE_Aes128GcmEncryptFinalSub(
block, temp, temp + 2,
929 else if(aesContext->
nr == 12)
931 status = HW_SCE_Aes192GcmEncryptFinalSub(
block, temp, temp + 2,
934 else if(aesContext->
nr == 14)
936 status = HW_SCE_Aes256GcmEncryptFinalSub(
block, temp, temp + 2,
941 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
946 if(status == FSP_SUCCESS)
978 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c,
979 uint8_t *
p,
size_t length,
const uint8_t *
t,
size_t tLen)
1000 if(tLen < 4 || tLen > 16)
1020 if(aesContext->
nr == 10)
1022 status = HW_SCE_Aes128GcmDecryptInitSub(&keyType, aesContext->
ek, temp);
1024 else if(aesContext->
nr == 12)
1026 status = HW_SCE_Aes192GcmDecryptInitSub(aesContext->
ek, temp);
1028 else if(aesContext->
nr == 14)
1030 status = HW_SCE_Aes256GcmDecryptInitSub(&keyType, aesContext->
ek, temp);
1034 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1038 if(status == FSP_SUCCESS)
1050 if(aesContext->
nr == 10)
1052 HW_SCE_Aes128GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1054 else if(aesContext->
nr == 12)
1056 HW_SCE_Aes192GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1060 HW_SCE_Aes256GcmDecryptUpdateAADSub((uint32_t *)
a,
n / 4);
1075 if(aesContext->
nr == 10)
1077 HW_SCE_Aes128GcmDecryptUpdateAADSub(
block, 1);
1079 else if(aesContext->
nr == 12)
1081 HW_SCE_Aes192GcmDecryptUpdateAADSub(
block, 1);
1085 HW_SCE_Aes256GcmDecryptUpdateAADSub(
block, 1);
1090 if(aesContext->
nr == 10)
1092 HW_SCE_Aes128GcmDecryptUpdateTransitionSub();
1094 else if(aesContext->
nr == 12)
1096 HW_SCE_Aes192GcmDecryptUpdateTransitionSub();
1100 HW_SCE_Aes256GcmDecryptUpdateTransitionSub();
1113 if(aesContext->
nr == 10)
1115 HW_SCE_Aes128GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1118 else if(aesContext->
nr == 12)
1120 HW_SCE_Aes192GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1125 HW_SCE_Aes256GcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1155 osMemset(authTag, 0,
sizeof(authTag));
1159 if(aesContext->
nr == 10)
1161 status = HW_SCE_Aes128GcmDecryptFinalSub(
block, temp, temp + 2,
1162 authTag, temp + 4,
block);
1164 else if(aesContext->
nr == 12)
1166 status = HW_SCE_Aes192GcmDecryptFinalSub(
block, temp, temp + 2,
1167 authTag, temp + 4,
block);
1169 else if(aesContext->
nr == 14)
1171 status = HW_SCE_Aes256GcmDecryptFinalSub(
block, temp, temp + 2,
1172 authTag, temp + 4,
block);
1176 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1181 if(status == FSP_SUCCESS)
1195 #if (CCM_SUPPORT == ENABLED)
1214 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p, uint8_t *
c,
1215 size_t length, uint8_t *
t,
size_t tLen)
1227 uint32_t authTag[4];
1240 if(aLen > (
sizeof(header) - 18))
1254 osMemset(header, 0,
sizeof(header));
1271 osMemcpy(header + headerLen + 2,
a, aLen);
1273 headerLen += 2 + aLen;
1283 if(aesContext->
nr == 10)
1285 status = HW_SCE_Aes128CcmEncryptInitSubGeneral(&keyType, &dataType,
1286 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1287 &
seqNum, (headerLen + 3) / 4);
1289 else if(aesContext->
nr == 12)
1291 status = HW_SCE_Aes192CcmEncryptInitSubGeneral(&keyType, &dataType,
1292 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1293 &
seqNum, (headerLen + 3) / 4);
1295 else if(aesContext->
nr == 14)
1297 status = HW_SCE_Aes256CcmEncryptInitSubGeneral(&keyType, &dataType,
1298 &command, &textLen, aesContext->
ek,
block, (uint32_t *) header,
1299 &
seqNum, (headerLen + 3) / 4);
1303 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1307 if(status == FSP_SUCCESS)
1316 if(aesContext->
nr == 10)
1318 HW_SCE_Aes128CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1321 else if(aesContext->
nr == 12)
1323 HW_SCE_Aes192CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1328 HW_SCE_Aes256CcmEncryptUpdateSub((uint32_t *)
p, (uint32_t *)
c,
1347 if(aesContext->
nr == 10)
1349 status = HW_SCE_Aes128CcmEncryptFinalSubGeneral(
block, &textLen,
1352 else if(aesContext->
nr == 12)
1354 status = HW_SCE_Aes192CcmEncryptFinalSub(
block, &textLen,
block,
1357 else if(aesContext->
nr == 14)
1359 status = HW_SCE_Aes256CcmEncryptFinalSub(
block, &textLen,
block,
1364 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1369 if(status == FSP_SUCCESS)
1402 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c, uint8_t *
p,
1403 size_t length,
const uint8_t *
t,
size_t tLen)
1412 uint32_t authTagLen;
1416 uint32_t authTag[4];
1429 if(aLen > (
sizeof(header) - 18))
1444 osMemset(header, 0,
sizeof(header));
1461 osMemcpy(header + headerLen + 2,
a, aLen);
1463 headerLen += 2 + aLen;
1473 if(aesContext->
nr == 10)
1475 status = HW_SCE_Aes128CcmDecryptInitSubGeneral(&keyType, &dataType,
1476 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1477 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1479 else if(aesContext->
nr == 12)
1481 status = HW_SCE_Aes192CcmDecryptInitSubGeneral(&keyType, &dataType,
1482 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1483 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1485 else if(aesContext->
nr == 14)
1487 status = HW_SCE_Aes256CcmDecryptInitSubGeneral(&keyType, &dataType,
1488 &command, &textLen, &authTagLen, aesContext->
ek,
block,
1489 (uint32_t *) header, &
seqNum, (headerLen + 3) / 4);
1493 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1497 if(status == FSP_SUCCESS)
1506 if(aesContext->
nr == 10)
1508 HW_SCE_Aes128CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1511 else if(aesContext->
nr == 12)
1513 HW_SCE_Aes192CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1518 HW_SCE_Aes256CcmDecryptUpdateSub((uint32_t *)
c, (uint32_t *)
p,
1537 osMemset(authTag, 0,
sizeof(authTag));
1541 if(aesContext->
nr == 10)
1543 status = HW_SCE_Aes128CcmDecryptFinalSubGeneral(
block, &textLen,
1544 authTag, &authTagLen,
block);
1546 else if(aesContext->
nr == 12)
1548 status = HW_SCE_Aes192CcmDecryptFinalSub(
block, &textLen,
1549 authTag, &authTagLen,
block);
1551 else if(aesContext->
nr == 14)
1553 status = HW_SCE_Aes256CcmDecryptFinalSub(
block, &textLen,
1554 authTag, &authTagLen,
block);
1558 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1563 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.
__weak_func error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
__weak_func 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.
__weak_func 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.
#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.
RA4 hardware cryptographic accelerator (SCE5 / SCE9)
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 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 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 ecbDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *c, uint8_t *p, size_t length)
ECB decryption.
RA4 cipher hardware accelerator.
Common interface for encryption algorithms.
CipherAlgoEncryptBlock encryptBlock
CipherAlgoDecryptBlock decryptBlock
const CipherAlgo * cipherAlgo
Cipher algorithm.
void * cipherContext
Cipher algorithm context.