xref: /freebsd/sys/dev/qat/qat_api/common/crypto/sym/qat/lac_sym_qat_key.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
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