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