32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "hw_sce_private.h"
36 #include "hw_sce_tdes_private.h"
37 #include "hw_sce_aes_private.h"
47 #if (S7G2_CRYPTO_CIPHER_SUPPORT == ENABLED)
48 #if (DES3_SUPPORT == ENABLED)
62 if(context == NULL || key == NULL)
127 (
const uint32_t *) input, (uint32_t *) output);
130 if(status != SSP_SUCCESS)
156 (
const uint32_t *) input, (uint32_t *) output);
159 if(status != SSP_SUCCESS)
169 #if (AES_SUPPORT == ENABLED)
184 if(context == NULL || key == NULL)
188 status = SSP_SUCCESS;
198 else if(keyLen == 24)
205 else if(keyLen == 32)
215 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
238 if(context->
nr == 10)
242 (
const uint32_t *) input, (uint32_t *) output);
244 else if(context->
nr == 12)
248 (
const uint32_t *) input, (uint32_t *) output);
250 else if(context->
nr == 14)
254 (
const uint32_t *) input, (uint32_t *) output);
259 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
263 if(status != SSP_SUCCESS)
288 if(context->
nr == 10)
292 (
const uint32_t *) input, (uint32_t *) output);
294 else if(context->
nr == 12)
298 (
const uint32_t *) input, (uint32_t *) output);
300 else if(context->
nr == 14)
304 (
const uint32_t *) input, (uint32_t *) output);
309 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
313 if(status != SSP_SUCCESS)
323 #if (ECB_SUPPORT == ENABLED)
336 const uint8_t *
p, uint8_t *
c,
size_t length)
341 status = SSP_SUCCESS;
343 #if (DES3_SUPPORT == ENABLED)
363 status = HW_SCE_TDES_192EcbEncrypt(des3Context->
k1.
ks,
length / 4,
364 (
const uint32_t *)
p, (uint32_t *)
c);
372 status = SSP_ERR_CRYPTO_INVALID_SIZE;
377 #if (AES_SUPPORT == ENABLED)
397 if(aesContext->
nr == 10)
400 status = HW_SCE_AES_128EcbEncrypt(aesContext->
ek,
length / 4,
401 (
const uint32_t *)
p, (uint32_t *)
c);
403 else if(aesContext->
nr == 12)
406 status = HW_SCE_AES_192EcbEncrypt(aesContext->
ek,
length / 4,
407 (
const uint32_t *)
p, (uint32_t *)
c);
409 else if(aesContext->
nr == 14)
412 status = HW_SCE_AES_256EcbEncrypt(aesContext->
ek,
length / 4,
413 (
const uint32_t *)
p, (uint32_t *)
c);
418 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
427 status = SSP_ERR_CRYPTO_INVALID_SIZE;
449 status = SSP_ERR_CRYPTO_INVALID_SIZE;
469 const uint8_t *
c, uint8_t *
p,
size_t length)
474 status = SSP_SUCCESS;
476 #if (DES3_SUPPORT == ENABLED)
496 status = HW_SCE_TDES_192EcbDecrypt(des3Context->
k1.
ks,
length / 4,
497 (
const uint32_t *)
p, (uint32_t *)
c);
505 status = SSP_ERR_CRYPTO_INVALID_SIZE;
510 #if (AES_SUPPORT == ENABLED)
530 if(aesContext->
nr == 10)
533 status = HW_SCE_AES_128EcbDecrypt(aesContext->
ek,
length / 4,
534 (
const uint32_t *)
c, (uint32_t *)
p);
536 else if(aesContext->
nr == 12)
539 status = HW_SCE_AES_192EcbDecrypt(aesContext->
ek,
length / 4,
540 (
const uint32_t *)
c, (uint32_t *)
p);
542 else if(aesContext->
nr == 14)
545 status = HW_SCE_AES_256EcbDecrypt(aesContext->
ek,
length / 4,
546 (
const uint32_t *)
c, (uint32_t *)
p);
551 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
560 status = SSP_ERR_CRYPTO_INVALID_SIZE;
582 status = SSP_ERR_CRYPTO_INVALID_SIZE;
591 #if (CBC_SUPPORT == ENABLED)
605 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
610 status = SSP_SUCCESS;
612 #if (DES3_SUPPORT == ENABLED)
632 status = HW_SCE_TDES_192CbcEncrypt(des3Context->
k1.
ks,
633 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
p,
634 (uint32_t *)
c, (uint32_t *)
iv);
642 status = SSP_ERR_CRYPTO_INVALID_SIZE;
647 #if (AES_SUPPORT == ENABLED)
667 if(aesContext->
nr == 10)
670 status = HW_SCE_AES_128CbcEncrypt(aesContext->
ek,
671 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
p,
672 (uint32_t *)
c, (uint32_t *)
iv);
674 else if(aesContext->
nr == 12)
677 status = HW_SCE_AES_192CbcEncrypt(aesContext->
ek,
678 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
p,
679 (uint32_t *)
c, (uint32_t *)
iv);
681 else if(aesContext->
nr == 14)
684 status = HW_SCE_AES_256CbcEncrypt(aesContext->
ek,
685 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
p,
686 (uint32_t *)
c, (uint32_t *)
iv);
691 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
700 status = SSP_ERR_CRYPTO_INVALID_SIZE;
734 status = SSP_ERR_CRYPTO_INVALID_SIZE;
755 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
760 status = SSP_SUCCESS;
762 #if (DES3_SUPPORT == ENABLED)
782 status = HW_SCE_TDES_192CbcDecrypt(des3Context->
k1.
ks,
783 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
c,
784 (uint32_t *)
p, (uint32_t *)
iv);
792 status = SSP_ERR_CRYPTO_INVALID_SIZE;
797 #if (AES_SUPPORT == ENABLED)
817 if(aesContext->
nr == 10)
820 status = HW_SCE_AES_128CbcDecrypt(aesContext->
ek,
821 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
c,
822 (uint32_t *)
p, (uint32_t *)
iv);
824 else if(aesContext->
nr == 12)
827 status = HW_SCE_AES_192CbcDecrypt(aesContext->
ek,
828 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
c,
829 (uint32_t *)
p, (uint32_t *)
iv);
831 else if(aesContext->
nr == 14)
834 status = HW_SCE_AES_256CbcDecrypt(aesContext->
ek,
835 (
const uint32_t *)
iv,
length / 4, (
const uint32_t *)
c,
836 (uint32_t *)
p, (uint32_t *)
iv);
841 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
850 status = SSP_ERR_CRYPTO_INVALID_SIZE;
887 status = SSP_ERR_CRYPTO_INVALID_SIZE;
896 #if (CTR_SUPPORT == ENABLED)
911 uint8_t *
t,
const uint8_t *
p, uint8_t *
c,
size_t length)
916 status = SSP_SUCCESS;
918 #if (DES3_SUPPORT == ENABLED)
941 status = HW_SCE_TDES_192CtrEncrypt(des3Context->
k1.
ks,
942 (
const uint32_t *)
t,
length / 4, (
const uint32_t *)
p,
943 (uint32_t *)
c, (uint32_t *)
t);
951 status = SSP_ERR_CRYPTO_INVALID_SIZE;
957 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
962 #if (AES_SUPPORT == ENABLED)
985 if(aesContext->
nr == 10)
988 status = HW_SCE_AES_128CtrEncrypt(aesContext->
ek,
989 (
const uint32_t *)
t,
length / 4, (
const uint32_t *)
p,
990 (uint32_t *)
c, (uint32_t *)
t);
992 else if(aesContext->
nr == 12)
995 status = HW_SCE_AES_192CtrEncrypt(aesContext->
ek,
996 (
const uint32_t *)
t,
length / 4, (
const uint32_t *)
p,
997 (uint32_t *)
c, (uint32_t *)
t);
999 else if(aesContext->
nr == 14)
1002 status = HW_SCE_AES_256CtrEncrypt(aesContext->
ek,
1003 (
const uint32_t *)
t,
length / 4, (
const uint32_t *)
p,
1004 (uint32_t *)
c, (uint32_t *)
t);
1009 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1018 status = SSP_ERR_CRYPTO_INVALID_SIZE;
1024 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1053 for(i = 0; i <
n; i++)
1059 for(temp = 1, i = 1; i <=
m; i++)
1076 status = SSP_ERR_CRYPTO_NOT_IMPLEMENTED;
1085 #if (GCM_SUPPORT == ENABLED && AES_SUPPORT == ENABLED)
1096 void *cipherContext)
1118 context->
m[0][0] =
h[0];
1119 context->
m[0][1] =
h[1];
1120 context->
m[0][2] =
h[2];
1121 context->
m[0][3] =
h[3];
1144 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p,
1145 uint8_t *
c,
size_t length, uint8_t *
t,
size_t tLen)
1164 if(tLen < 4 || tLen > 16)
1171 if(aesContext->
nr != 10 && aesContext->
nr != 12 && aesContext->
nr != 14)
1206 HW_SCE_AES_Ghash(context->
m[0], j, k / 4, (
const uint32_t *)
iv, j);
1221 HW_SCE_AES_Ghash(context->
m[0], j, 4,
b, j);
1234 HW_SCE_AES_Ghash(context->
m[0], j, 4,
b, j);
1238 if(aesContext->
nr == 10)
1240 HW_SCE_AES_128EcbEncrypt(aesContext->
ek, 4, j,
b);
1242 else if(aesContext->
nr == 12)
1244 HW_SCE_AES_192EcbEncrypt(aesContext->
ek, 4, j,
b);
1248 HW_SCE_AES_256EcbEncrypt(aesContext->
ek, 4, j,
b);
1275 HW_SCE_AES_Ghash(context->
m[0],
s, k / 4, (
const uint32_t *)
a,
s);
1290 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1304 if(aesContext->
nr == 10)
1306 HW_SCE_AES_128GctrEncrypt(aesContext->
ek, j, k / 4,
1307 (
const uint32_t *)
p, (uint32_t *)
c, j);
1309 else if(aesContext->
nr == 12)
1311 HW_SCE_AES_192GctrEncrypt(aesContext->
ek, j, k / 4,
1312 (
const uint32_t *)
p, (uint32_t *)
c, j);
1316 HW_SCE_AES_256GctrEncrypt(aesContext->
ek, j, k / 4,
1317 (
const uint32_t *)
p, (uint32_t *)
c, j);
1321 HW_SCE_AES_Ghash(context->
m[0],
s, k / 4, (
const uint32_t *)
c,
s);
1337 if(aesContext->
nr == 10)
1339 HW_SCE_AES_128GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1341 else if(aesContext->
nr == 12)
1343 HW_SCE_AES_192GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1347 HW_SCE_AES_256GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1354 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1371 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1400 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c,
1401 uint8_t *
p,
size_t length,
const uint8_t *
t,
size_t tLen)
1422 if(tLen < 4 || tLen > 16)
1429 if(aesContext->
nr != 10 && aesContext->
nr != 12 && aesContext->
nr != 14)
1464 HW_SCE_AES_Ghash(context->
m[0], j, k / 4, (
const uint32_t *)
iv, j);
1479 HW_SCE_AES_Ghash(context->
m[0], j, 4,
b, j);
1492 HW_SCE_AES_Ghash(context->
m[0], j, 4,
b, j);
1496 if(aesContext->
nr == 10)
1498 HW_SCE_AES_128EcbEncrypt(aesContext->
ek, 4, j,
b);
1500 else if(aesContext->
nr == 12)
1502 HW_SCE_AES_192EcbEncrypt(aesContext->
ek, 4, j,
b);
1506 HW_SCE_AES_256EcbEncrypt(aesContext->
ek, 4, j,
b);
1533 HW_SCE_AES_Ghash(context->
m[0],
s, k / 4, (
const uint32_t *)
a,
s);
1548 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1562 HW_SCE_AES_Ghash(context->
m[0],
s, k / 4, (
const uint32_t *)
c,
s);
1565 if(aesContext->
nr == 10)
1567 HW_SCE_AES_128GctrEncrypt(aesContext->
ek, j, k / 4,
1568 (
const uint32_t *)
c, (uint32_t *)
p, j);
1570 else if(aesContext->
nr == 12)
1572 HW_SCE_AES_192GctrEncrypt(aesContext->
ek, j, k / 4,
1573 (
const uint32_t *)
c, (uint32_t *)
p, j);
1577 HW_SCE_AES_256GctrEncrypt(aesContext->
ek, j, k / 4,
1578 (
const uint32_t *)
c, (uint32_t *)
p, j);
1595 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1598 if(aesContext->
nr == 10)
1600 HW_SCE_AES_128GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1602 else if(aesContext->
nr == 12)
1604 HW_SCE_AES_192GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1608 HW_SCE_AES_256GctrEncrypt(aesContext->
ek, j, 4,
b,
b, j);
1626 HW_SCE_AES_Ghash(context->
m[0],
s, 4,
b,
s);
1633 for(
mask = 0,
n = 0;
n < tLen;
n++)
Collection of AEAD algorithms.
Block cipher modes of operation.
General definitions for cryptographic algorithms.
@ ERROR_INVALID_KEY_LENGTH
@ ERROR_FAILURE
Generic error code.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
void gcmXorBlock(uint8_t *x, const uint8_t *a, const uint8_t *b, size_t n)
XOR operation.
#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.
Synergy S7G2 hardware cryptographic accelerator (SCE7)
void des3DecryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Decrypt a 8-byte block using Triple DES algorithm.
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen)
Key expansion.
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 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 des3Init(Des3Context *context, const uint8_t *key, size_t keyLen)
Initialize a Triple DES context using the supplied key.
void des3EncryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Encrypt a 8-byte block using Triple DES algorithm.
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 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.
Synergy S7G2 cipher hardware accelerator.
Common interface for encryption algorithms.
CipherAlgoEncryptBlock encryptBlock
CipherAlgoDecryptBlock decryptBlock
Triple DES algorithm context.
const CipherAlgo * cipherAlgo
Cipher algorithm.
void * cipherContext
Cipher algorithm context.
uint32_t m[GCM_TABLE_N][4]
Precalculated table.