1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3
4 /**
5 *****************************************************************************
6 * @file lac_sym_qat_key.c Interfaces for populating the symmetric qat key
7 * structures
8 *
9 * @ingroup LacSymQatKey
10 *
11 *****************************************************************************/
12
13 #include "cpa.h"
14 #include "cpa_cy_key.h"
15 #include "lac_mem.h"
16 #include "icp_qat_fw_la.h"
17 #include "icp_accel_devices.h"
18 #include "icp_adf_debug.h"
19 #include "lac_list.h"
20 #include "lac_sal_types.h"
21 #include "lac_sym_qat_key.h"
22 #include "lac_sym_hash_defs.h"
23
24 void
LacSymQat_KeySslRequestPopulate(icp_qat_la_bulk_req_hdr_t * pKeyGenReqHdr,icp_qat_fw_la_key_gen_common_t * pKeyGenReqMid,Cpa32U generatedKeyLenInBytes,Cpa32U labelLenInBytes,Cpa32U secretLenInBytes,Cpa32U iterations)25 LacSymQat_KeySslRequestPopulate(icp_qat_la_bulk_req_hdr_t *pKeyGenReqHdr,
26 icp_qat_fw_la_key_gen_common_t *pKeyGenReqMid,
27 Cpa32U generatedKeyLenInBytes,
28 Cpa32U labelLenInBytes,
29 Cpa32U secretLenInBytes,
30 Cpa32U iterations)
31 {
32 /* Rounded to nearest 8 byte boundary */
33 Cpa8U outLenRounded = 0;
34 outLenRounded = LAC_ALIGN_POW2_ROUNDUP(generatedKeyLenInBytes,
35 LAC_QUAD_WORD_IN_BYTES);
36
37 pKeyGenReqMid->u.secret_lgth_ssl = secretLenInBytes;
38 pKeyGenReqMid->u1.s1.output_lgth_ssl = outLenRounded;
39 pKeyGenReqMid->u1.s1.label_lgth_ssl = labelLenInBytes;
40 pKeyGenReqMid->u2.iter_count = iterations;
41 pKeyGenReqMid->u3.resrvd2 = 0;
42 pKeyGenReqMid->resrvd3 = 0;
43
44 /* Set up the common LA flags */
45 pKeyGenReqHdr->comn_hdr.service_cmd_id =
46 ICP_QAT_FW_LA_CMD_SSL3_KEY_DERIVE;
47 pKeyGenReqHdr->comn_hdr.resrvd1 = 0;
48 }
49
50 void
LacSymQat_KeyTlsRequestPopulate(icp_qat_fw_la_key_gen_common_t * pKeyGenReqParams,Cpa32U generatedKeyLenInBytes,Cpa32U labelInfo,Cpa32U secretLenInBytes,Cpa8U seedLenInBytes,icp_qat_fw_la_cmd_id_t cmdId)51 LacSymQat_KeyTlsRequestPopulate(
52 icp_qat_fw_la_key_gen_common_t *pKeyGenReqParams,
53 Cpa32U generatedKeyLenInBytes,
54 Cpa32U labelInfo, /* Generic name, can be num of labels or label length */
55 Cpa32U secretLenInBytes,
56 Cpa8U seedLenInBytes,
57 icp_qat_fw_la_cmd_id_t cmdId)
58 {
59 pKeyGenReqParams->u1.s3.output_lgth_tls =
60 LAC_ALIGN_POW2_ROUNDUP(generatedKeyLenInBytes,
61 LAC_QUAD_WORD_IN_BYTES);
62
63 /* For TLS u param of auth_req_params is set to secretLen */
64 pKeyGenReqParams->u.secret_lgth_tls = secretLenInBytes;
65
66 switch (cmdId) {
67 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT:
68 pKeyGenReqParams->u2.hkdf_ikm_length = secretLenInBytes;
69 pKeyGenReqParams->u3.resrvd2 = 0;
70 break;
71 case ICP_QAT_FW_LA_CMD_HKDF_EXPAND:
72 pKeyGenReqParams->u1.hkdf.info_length = labelInfo;
73 break;
74 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT_AND_EXPAND:
75 pKeyGenReqParams->u2.hkdf_ikm_length = secretLenInBytes;
76 pKeyGenReqParams->u1.hkdf.info_length = labelInfo;
77 break;
78 case ICP_QAT_FW_LA_CMD_HKDF_EXPAND_LABEL:
79 /* Num of Labels */
80 pKeyGenReqParams->u1.hkdf_label.num_labels = labelInfo;
81 pKeyGenReqParams->u3.hkdf_num_sublabels = 4; /* 4 subLabels */
82 break;
83 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT_AND_EXPAND_LABEL:
84 pKeyGenReqParams->u2.hkdf_ikm_length = secretLenInBytes;
85 /* Num of Labels */
86 pKeyGenReqParams->u1.hkdf_label.num_labels = labelInfo;
87 pKeyGenReqParams->u3.hkdf_num_sublabels = 4; /* 4 subLabels */
88 break;
89 default:
90 pKeyGenReqParams->u1.s3.label_lgth_tls = labelInfo;
91 pKeyGenReqParams->u2.tls_seed_length = seedLenInBytes;
92 pKeyGenReqParams->u3.resrvd2 = 0;
93 break;
94 }
95 pKeyGenReqParams->resrvd3 = 0;
96 }
97
98 void
LacSymQat_KeyMgfRequestPopulate(icp_qat_la_bulk_req_hdr_t * pKeyGenReqHdr,icp_qat_fw_la_key_gen_common_t * pKeyGenReqMid,Cpa8U seedLenInBytes,Cpa16U maskLenInBytes,Cpa8U hashLenInBytes)99 LacSymQat_KeyMgfRequestPopulate(icp_qat_la_bulk_req_hdr_t *pKeyGenReqHdr,
100 icp_qat_fw_la_key_gen_common_t *pKeyGenReqMid,
101 Cpa8U seedLenInBytes,
102 Cpa16U maskLenInBytes,
103 Cpa8U hashLenInBytes)
104 {
105 pKeyGenReqHdr->comn_hdr.service_cmd_id = ICP_QAT_FW_LA_CMD_MGF1;
106 pKeyGenReqMid->u.mask_length =
107 LAC_ALIGN_POW2_ROUNDUP(maskLenInBytes, LAC_QUAD_WORD_IN_BYTES);
108
109 pKeyGenReqMid->u1.s2.hash_length = hashLenInBytes;
110 pKeyGenReqMid->u1.s2.seed_length = seedLenInBytes;
111 }
112
113 void
LacSymQat_KeySslKeyMaterialInputPopulate(sal_service_t * pService,icp_qat_fw_la_ssl_key_material_input_t * pSslKeyMaterialInput,void * pSeed,Cpa64U labelPhysAddr,void * pSecret)114 LacSymQat_KeySslKeyMaterialInputPopulate(
115 sal_service_t *pService,
116 icp_qat_fw_la_ssl_key_material_input_t *pSslKeyMaterialInput,
117 void *pSeed,
118 Cpa64U labelPhysAddr,
119 void *pSecret)
120 {
121 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
122 (*pService), pSslKeyMaterialInput->seed_addr, pSeed);
123
124 pSslKeyMaterialInput->label_addr = labelPhysAddr;
125
126 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
127 (*pService), pSslKeyMaterialInput->secret_addr, pSecret);
128 }
129
130 void
LacSymQat_KeyTlsKeyMaterialInputPopulate(sal_service_t * pService,icp_qat_fw_la_tls_key_material_input_t * pTlsKeyMaterialInput,void * pSeed,Cpa64U labelPhysAddr)131 LacSymQat_KeyTlsKeyMaterialInputPopulate(
132 sal_service_t *pService,
133 icp_qat_fw_la_tls_key_material_input_t *pTlsKeyMaterialInput,
134 void *pSeed,
135 Cpa64U labelPhysAddr)
136 {
137 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
138 (*pService), pTlsKeyMaterialInput->seed_addr, pSeed);
139
140 pTlsKeyMaterialInput->label_addr = labelPhysAddr;
141 }
142
143 void
LacSymQat_KeyTlsHKDFKeyMaterialInputPopulate(sal_service_t * pService,icp_qat_fw_la_hkdf_key_material_input_t * pTlsKeyMaterialInput,CpaCyKeyGenHKDFOpData * pKeyGenTlsOpData,Cpa64U subLabelsPhysAddr,icp_qat_fw_la_cmd_id_t cmdId)144 LacSymQat_KeyTlsHKDFKeyMaterialInputPopulate(
145 sal_service_t *pService,
146 icp_qat_fw_la_hkdf_key_material_input_t *pTlsKeyMaterialInput,
147 CpaCyKeyGenHKDFOpData *pKeyGenTlsOpData,
148 Cpa64U subLabelsPhysAddr,
149 icp_qat_fw_la_cmd_id_t cmdId)
150 {
151 switch (cmdId) {
152 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT:
153 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
154 (*pService),
155 pTlsKeyMaterialInput->ikm_addr,
156 pKeyGenTlsOpData->secret);
157 break;
158 case ICP_QAT_FW_LA_CMD_HKDF_EXPAND:
159 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
160 (*pService),
161 pTlsKeyMaterialInput->labels_addr,
162 pKeyGenTlsOpData->info);
163 break;
164 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT_AND_EXPAND:
165 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
166 (*pService),
167 pTlsKeyMaterialInput->ikm_addr,
168 pKeyGenTlsOpData->secret);
169 pTlsKeyMaterialInput->labels_addr =
170 pTlsKeyMaterialInput->ikm_addr +
171 ((uint64_t)&pKeyGenTlsOpData->info -
172 (uint64_t)&pKeyGenTlsOpData->secret);
173 break;
174 case ICP_QAT_FW_LA_CMD_HKDF_EXPAND_LABEL:
175 pTlsKeyMaterialInput->sublabels_addr = subLabelsPhysAddr;
176 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
177 (*pService),
178 pTlsKeyMaterialInput->labels_addr,
179 pKeyGenTlsOpData->label);
180 break;
181 case ICP_QAT_FW_LA_CMD_HKDF_EXTRACT_AND_EXPAND_LABEL:
182 pTlsKeyMaterialInput->sublabels_addr = subLabelsPhysAddr;
183 LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
184 (*pService),
185 pTlsKeyMaterialInput->ikm_addr,
186 pKeyGenTlsOpData->secret);
187 pTlsKeyMaterialInput->labels_addr =
188 pTlsKeyMaterialInput->ikm_addr +
189 ((uint64_t)&pKeyGenTlsOpData->label -
190 (uint64_t)&pKeyGenTlsOpData->secret);
191 break;
192 default:
193 break;
194 }
195 }
196