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