1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #define CC_PAL_LOG_CUR_COMPONENT CC_LOG_MASK_CC_API
8 
9 #include "cc_pal_types.h"
10 #include "cc_pal_mem.h"
11 #include "cc_pal_abort.h"
12 #include "cc_hash_defs.h"
13 #include "hash_driver_ext_dma.h"
14 #include "mbedtls_hash_ext_dma.h"
15 #include "cc_common.h"
16 #include "cc_common_math.h"
17 #include "cc_sym_error.h"
18 #include "cc_pal_perf.h"
19 #include "cc_pal_compiler.h"
20 #include "mbedtls_ext_dma_error.h"
21 
Driver2ExtDmaHashErr(drvError_t drvRc)22 static int Driver2ExtDmaHashErr(drvError_t drvRc)
23 {
24     switch (drvRc) {
25     case HASH_DRV_OK:
26         return 0;
27     case HASH_DRV_ILLEGAL_OPERATION_MODE_ERROR:
28         return EXT_DMA_HASH_ILLEGAL_OPERATION_MODE_ERROR;
29     default:
30         return CC_FATAL_ERROR;
31     }
32 }
33 
34 
mbedtls_hash_ext_dma_init(CCHashOperationMode_t operationMode,uint32_t dataSize)35 int mbedtls_hash_ext_dma_init(CCHashOperationMode_t  operationMode, uint32_t dataSize)
36 {
37     drvError_t drvRc = HASH_DRV_OK;
38     int error = CC_OK;
39     hashMode_t mode;
40 
41     /* check Hash mode */
42     switch (operationMode) {
43     case CC_HASH_SHA1_mode:
44         mode = HASH_SHA1;
45         break;
46     case CC_HASH_SHA224_mode:
47         mode = HASH_SHA224;
48         break;
49     case CC_HASH_SHA256_mode:
50         mode = HASH_SHA256;
51         break;
52     default:
53         error = EXT_DMA_HASH_ILLEGAL_OPERATION_MODE_ERROR;
54         goto endInit;
55     }
56 
57     if (dataSize > CPU_DIN_MAX_SIZE){
58         error = EXT_DMA_ILLEGAL_INPUT_SIZE_ERROR;
59         goto endInit;
60     }
61     drvRc = InitHashExtDma(mode, dataSize);
62     error = Driver2ExtDmaHashErr(drvRc);
63 
64 endInit:
65     return error;
66 }
67 
68 
69 
mbedtls_hash_ext_dma_finish(CCHashOperationMode_t operationMode,uint32_t digestBufferSize,uint32_t * digestBuffer)70 int mbedtls_hash_ext_dma_finish(CCHashOperationMode_t  operationMode, uint32_t digestBufferSize, uint32_t *digestBuffer)
71 {
72     CCError_t error = CC_OK;
73     drvError_t rc = HASH_DRV_OK;
74     hashMode_t mode;
75 
76     if ( digestBuffer == NULL ) {
77         error = EXT_DMA_HASH_INVALID_RESULT_BUFFER_POINTER_ERROR;
78         goto endFinish;
79     }
80     if (digestBufferSize != CC_HASH_SHA1_DIGEST_SIZE_IN_BYTES &&
81         digestBufferSize != CC_HASH_SHA224_DIGEST_SIZE_IN_BYTES &&
82         digestBufferSize != CC_HASH_SHA256_DIGEST_SIZE_IN_BYTES) {
83         error = EXT_DMA_HASH_ILLEGAL_PARAMS_ERROR;
84         goto endFinish;
85     }
86     /* check Hash mode */
87     switch (operationMode) {
88     case CC_HASH_SHA1_mode:
89         mode = HASH_SHA1;
90         break;
91     case CC_HASH_SHA224_mode:
92         mode = HASH_SHA224;
93         break;
94     case CC_HASH_SHA256_mode:
95         mode = HASH_SHA256;
96         break;
97     default:
98         error = EXT_DMA_HASH_ILLEGAL_OPERATION_MODE_ERROR;
99         goto endFinish;
100     }
101 
102     error = FinishHashExtDma(mode, digestBuffer);
103     error = Driver2ExtDmaHashErr(error);
104     return error;
105 
106 endFinish:
107     rc = terminateHashExtDma();
108     if (rc != 0) {
109         CC_PalAbort("Failed to terminateAesExtDma \n");
110     }
111     return error;
112 }
113