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