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
24void
25LacSymQat_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
50void
51LacSymQat_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
98void
99LacSymQat_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
113void
114LacSymQat_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
130void
131LacSymQat_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
143void
144LacSymQat_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