1 /*
2 * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include "cc_pal_types.h"
8 #include "cc_pal_mem.h"
9 #include "cc_pal_abort.h"
10 #include "mbedtls_cc_chacha.h"
11 #include "mbedtls_cc_chacha_error.h"
12 #include "driver_defs.h"
13 #include "cc_sym_error.h"
14 #include "chacha_driver_ext_dma.h"
15 #include "mbedtls_ext_dma_error.h"
16
17
Driver2ExtDMAChachaErr(drvError_t drvRc)18 static CCError_t Driver2ExtDMAChachaErr(drvError_t drvRc)
19 {
20 switch (drvRc) {
21 case CHACHA_DRV_OK:
22 return CC_OK;
23 case CHACHA_DRV_ILLEGAL_OPERATION_DIRECTION_ERROR:
24 return EXT_DMA_CHACHA_INVALID_ENCRYPT_MODE_ERROR;
25 case CHACHA_DRV_ILLEGAL_NONCE_SIZE_ERROR:
26 return EXT_DMA_CHACHA_INVALID_NONCE_ERROR;
27 default:
28 return CC_FATAL_ERROR;
29 }
30 }
31
32
mbedtls_ext_dma_chacha_init(uint8_t * pNonce,mbedtls_chacha_nonce_size_t nonceSizeFlag,uint8_t * pKey,uint32_t keySizeBytes,uint32_t initialCounter,mbedtls_chacha_encrypt_mode_t EncryptDecryptFlag,uint32_t dataSize)33 int mbedtls_ext_dma_chacha_init(uint8_t * pNonce,
34 mbedtls_chacha_nonce_size_t nonceSizeFlag,
35 uint8_t * pKey,
36 uint32_t keySizeBytes,
37 uint32_t initialCounter,
38 mbedtls_chacha_encrypt_mode_t EncryptDecryptFlag,
39 uint32_t dataSize)
40 {
41 drvError_t drvRc = CHACHA_DRV_OK;
42 uint32_t keyBufferWords[CC_CHACHA_KEY_MAX_SIZE_IN_WORDS];
43 uint32_t nonceBuffer[CC_CHACHA_NONCE_MAX_SIZE_IN_WORDS];
44 uint32_t nonceSizeBytes=0;
45 /* ............... checking the parameters validity ................... */
46 /* -------------------------------------------------------------------- */
47 /* if dataSize is 0 return an error */
48 if ((dataSize == 0) || (dataSize > CPU_DIN_MAX_SIZE)){
49 return EXT_DMA_CHACHA_ILLEGAL_INPUT_SIZE_ERROR;
50 }
51 /* if the pNonce is NULL return an error */
52 if (pNonce == NULL) {
53 return EXT_DMA_CHACHA_INVALID_NONCE_PTR_ERROR;
54 }
55
56 /* check the Encrypt / Decrypt flag validity */
57 if (EncryptDecryptFlag >= CC_CHACHA_EncryptNumOfOptions) {
58 return EXT_DMA_CHACHA_INVALID_ENCRYPT_MODE_ERROR;
59 }
60
61 /* check the validity of the key pointer */
62 if (pKey == NULL) {
63 return EXT_DMA_CHACHA_INVALID_KEY_POINTER_ERROR;
64 }
65 if (keySizeBytes != CC_CHACHA_KEY_MAX_SIZE_IN_BYTES) {
66 return EXT_DMA_CHACHA_ILLEGAL_KEY_SIZE_ERROR;
67
68 }
69
70 switch (nonceSizeFlag) {
71 case CC_CHACHA_Nonce64BitSize:
72 nonceSizeBytes = 8;
73 break;
74 case CC_CHACHA_Nonce96BitSize:
75 nonceSizeBytes = 12;
76 break;
77 default:
78 return EXT_DMA_CHACHA_INVALID_NONCE_ERROR;
79 }
80
81 CC_PalMemCopy((uint8_t *)keyBufferWords, pKey, CC_CHACHA_KEY_MAX_SIZE_IN_BYTES);
82 CC_PalMemCopy((uint8_t *)nonceBuffer, pNonce, nonceSizeBytes);
83
84 drvRc = InitChachaExtDma(nonceBuffer, (chachaNonceSize_t)nonceSizeFlag, keyBufferWords, initialCounter, dataSize);
85
86 return Driver2ExtDMAChachaErr(drvRc);
87 }
88
89
mbedtls_chacha_ext_dma_finish(void)90 int mbedtls_chacha_ext_dma_finish(void)
91 {
92 drvError_t drvRc = CHACHA_DRV_OK;
93
94 drvRc = terminateChachaExtDma();
95
96 return Driver2ExtDMAChachaErr(drvRc);
97 }
98