1 /* 2 * This file is part of the openHiTLS project. 3 * 4 * openHiTLS is licensed under the Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * 8 * http://license.coscl.org.cn/MulanPSL2 9 * 10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13 * See the Mulan PSL v2 for more details. 14 */ 15 16 /** 17 * @defgroup crypt_eal_provider 18 * @ingroup crypt 19 * @brief using during provider development 20 */ 21 22 #ifndef CRYPT_EAL_IMPLPROVIDER_H 23 #define CRYPT_EAL_IMPLPROVIDER_H 24 25 #include <stdint.h> 26 #include "bsl_params.h" 27 #include "crypt_types.h" 28 #include "crypt_eal_provider.h" 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif // __cplusplus 33 34 #define CRYPT_EAL_FUNC_END {0, NULL} 35 #define CRYPT_EAL_ALGINFO_END {0, NULL, NULL} 36 37 typedef struct { 38 int32_t algId; // implemented algorithm id, such as aes128cbc, rsa sign 39 const CRYPT_EAL_Func *implFunc; // implemented algorithm callback 40 const char *attr; // implemented algorithm attribute 41 } CRYPT_EAL_AlgInfo; 42 43 typedef void (CRYPT_EAL_CvtVoid)(void); 44 45 /* capFuncs */ 46 #define CRYPT_EAL_CAP_GETENTROPY 1 // Callback definition CRYPT_EAL_GetEntropyCb, in crypt_types.h 47 #define CRYPT_EAL_CAP_CLEANENTROPY 2 // Callback definition CRYPT_EAL_CleanEntropyCb 48 #define CRYPT_EAL_CAP_GETNONCE 3 // Callback definition CRYPT_EAL_GetNonceCb 49 #define CRYPT_EAL_CAP_CLEANNONCE 4 // Callback definition CRYPT_EAL_CleanNonceCb 50 51 /* get information from mgrCtx, such as entropy source context */ 52 #define CRYPT_EAL_CAP_MGRCTXCTRL 5 53 54 typedef int32_t (*CRYPT_EAL_ProvMgrCtrlCb)(void *mgrCtx, int32_t cmd, void *val, uint32_t valLen); 55 56 typedef enum { 57 CRYPT_EAL_MGR_GETSEEDCTX, 58 CRYPT_EAL_MGR_GETLIBCTX, 59 } CRYPT_EAL_PROVMGRCTRL; 60 61 /* outFuncs */ 62 #define CRYPT_EAL_PROVCB_FREE 1 63 #define CRYPT_EAL_PROVCB_QUERY 2 64 #define CRYPT_EAL_PROVCB_CTRL 3 65 #define CRYPT_EAL_PROVCB_GETCAPS 4 66 67 68 typedef void (*CRYPT_EAL_ProvFreeCb)(void *provCtx); 69 70 #define CRYPT_EAL_OPERAID_SYMMCIPHER 1 71 #define CRYPT_EAL_OPERAID_KEYMGMT 2 72 #define CRYPT_EAL_OPERAID_SIGN 3 73 #define CRYPT_EAL_OPERAID_ASYMCIPHER 4 74 #define CRYPT_EAL_OPERAID_KEYEXCH 5 75 #define CRYPT_EAL_OPERAID_KEM 6 76 #define CRYPT_EAL_OPERAID_HASH 7 77 #define CRYPT_EAL_OPERAID_MAC 8 78 #define CRYPT_EAL_OPERAID_KDF 9 79 #define CRYPT_EAL_OPERAID_RAND 10 80 #define CRYPT_EAL_OPERAID_DECODER 11 81 82 typedef int32_t (*CRYPT_EAL_ProvQueryCb)(void *provCtx, int32_t operaId, CRYPT_EAL_AlgInfo **algInfos); 83 /* Used for obtaining provider information through the eal layer interface */ 84 typedef int32_t (*CRYPT_EAL_ProvCtrlCb)(void *provCtx, int32_t cmd, void *val, uint32_t valLen); 85 86 #define CRYPT_EAL_GET_GROUP_CAP 1 87 #define CRYPT_EAL_GET_SIGALG_CAP 2 88 89 /* Used for obtaining the capabilities of provider through the eal layer interface */ 90 typedef int32_t (*CRYPT_EAL_ProvGetCapsCb)(void *provCtx, int32_t cmd, CRYPT_EAL_ProcessFuncCb cb, void *args); 91 92 /** 93 * @ingroup crypt_eal_provider 94 * @brief Provider initialization function prototype, 95 * 96 * @param mgrCtx [IN] framework generates context for each provider, for provider, it is opaque 97 * @param param [IN] parameters passed transparently when loading the provider interface 98 * @param capFuncs [IN] The ability passed from the framework to provider, such as entropy source 99 * @param outFuncs [OUT] The callback returned by provider, such as entropy source 100 * @param provCtx [OUT] provider context 101 * 102 * @retval #CRYPT_SUCCESS, if success. 103 * Other error codes see the crypt_errno.h 104 */ 105 typedef int32_t (*CRYPT_EAL_ImplProviderInit)(CRYPT_EAL_ProvMgrCtx *mgrCtx, BSL_Param *param, 106 CRYPT_EAL_Func *capFuncs, CRYPT_EAL_Func **outFuncs, void **provCtx); 107 108 // CRYPT_EAL_OPERAID_SYMMCIPHER 109 #define CRYPT_EAL_IMPLCIPHER_NEWCTX 1 110 #define CRYPT_EAL_IMPLCIPHER_INITCTX 2 111 #define CRYPT_EAL_IMPLCIPHER_UPDATE 3 112 #define CRYPT_EAL_IMPLCIPHER_FINAL 4 113 #define CRYPT_EAL_IMPLCIPHER_DEINITCTX 5 114 #define CRYPT_EAL_IMPLCIPHER_CTRL 6 115 #define CRYPT_EAL_IMPLCIPHER_FREECTX 7 116 117 typedef void *(*CRYPT_EAL_ImplCipherNewCtx)(void *provCtx, int32_t algId); 118 typedef int32_t (*CRYPT_EAL_ImplCipherInitCtx)(void *ctx, const uint8_t *key, uint32_t keyLen, 119 const uint8_t *iv, uint32_t ivLen, BSL_Param *param, bool enc); 120 typedef int32_t (*CRYPT_EAL_ImplCipherUpdate)(void *ctx, const uint8_t *in, uint32_t inLen, 121 uint8_t *out, uint32_t *outLen); 122 typedef int32_t (*CRYPT_EAL_ImplCipherFinal)(void *ctx, uint8_t *out, uint32_t *outLen); 123 typedef int32_t (*CRYPT_EAL_ImplCipherDeinitCtx)(void *ctx); 124 typedef int32_t (*CRYPT_EAL_ImplCipherCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); 125 typedef void (*CRYPT_EAL_ImplCipherFreeCtx)(void *ctx); 126 127 128 // CRYPT_EAL_OPERAID_KEYMGMT 129 #define CRYPT_EAL_IMPLPKEYMGMT_NEWCTX 1 130 #define CRYPT_EAL_IMPLPKEYMGMT_SETPARAM 2 131 #define CRYPT_EAL_IMPLPKEYMGMT_GETPARAM 3 132 #define CRYPT_EAL_IMPLPKEYMGMT_GENKEY 4 133 #define CRYPT_EAL_IMPLPKEYMGMT_SETPRV 5 134 #define CRYPT_EAL_IMPLPKEYMGMT_SETPUB 6 135 #define CRYPT_EAL_IMPLPKEYMGMT_GETPRV 7 136 #define CRYPT_EAL_IMPLPKEYMGMT_GETPUB 8 137 #define CRYPT_EAL_IMPLPKEYMGMT_DUPCTX 9 138 #define CRYPT_EAL_IMPLPKEYMGMT_CHECK 10 139 #define CRYPT_EAL_IMPLPKEYMGMT_COMPARE 11 140 #define CRYPT_EAL_IMPLPKEYMGMT_CTRL 12 141 #define CRYPT_EAL_IMPLPKEYMGMT_FREECTX 13 142 #define CRYPT_EAL_IMPLPKEYMGMT_IMPORT 14 143 #define CRYPT_EAL_IMPLPKEYMGMT_EXPORT 15 144 145 typedef void *(*CRYPT_EAL_ImplPkeyMgmtNewCtx)(void *provCtx, int32_t algId); 146 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtSetParam)(void *ctx, const BSL_Param *param); 147 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtGetParam)(void *ctx, BSL_Param *param); 148 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtGenKey)(void *ctx); 149 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtSetPrv)(void *ctx, const BSL_Param *param); 150 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtSetPub)(void *ctx, const BSL_Param *param); 151 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtGetPrv)(const void *ctx, BSL_Param *param); 152 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtGetPub)(const void *ctx, BSL_Param *param); 153 typedef void *(*CRYPT_EAL_ImplPkeyMgmtDupCtx)(const void *ctx); 154 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtCheck)(const void *prv, const void *pub); 155 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtCompare)(const void *ctx1, const void *ctx2); 156 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); 157 typedef void (*CRYPT_EAL_ImplPkeyMgmtFreeCtx)(void *ctx); 158 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtImport)(void *ctx, const BSL_Param *param); 159 typedef int32_t (*CRYPT_EAL_ImplPkeyMgmtExport)(const void *ctx, BSL_Param *param); 160 161 // CRYPT_EAL_OPERAID_SIGN 162 #define CRYPT_EAL_IMPLPKEYSIGN_SIGN 1 163 #define CRYPT_EAL_IMPLPKEYSIGN_SIGNDATA 2 164 #define CRYPT_EAL_IMPLPKEYSIGN_VERIFY 3 165 #define CRYPT_EAL_IMPLPKEYSIGN_VERIFYDATA 4 166 #define CRYPT_EAL_IMPLPKEYSIGN_RECOVER 5 167 #define CRYPT_EAL_IMPLPKEYSIGN_BLIND 6 168 #define CRYPT_EAL_IMPLPKEYSIGN_UNBLIND 7 169 170 typedef int32_t (*CRYPT_EAL_ImplPkeySign)(void *ctx, int32_t mdAlgId, const uint8_t *data, uint32_t dataLen, 171 uint8_t *sign, uint32_t *signLen); 172 typedef int32_t (*CRYPT_EAL_ImplPkeySignData)(void *ctx, const uint8_t *data, uint32_t dataLen, 173 uint8_t *sign, uint32_t *signLen); 174 typedef int32_t (*CRYPT_EAL_ImplPkeyVerify)(const void *ctx, int32_t mdAlgId, const uint8_t *data, uint32_t dataLen, 175 uint8_t *sign, uint32_t signLen); 176 typedef int32_t (*CRYPT_EAL_ImplPkeyVerifyData)(const void *ctx, const uint8_t *data, uint32_t dataLen, 177 uint8_t *sign, uint32_t signLen); 178 typedef int32_t (*CRYPT_EAL_ImplPkeyRecover)(const void *ctx, uint8_t *sign, uint32_t signLen, 179 uint8_t *data, uint32_t *dataLen); 180 typedef int32_t (*CRYPT_EAL_ImplPkeyBlind)(void *ctx, int32_t mdAlgId, const uint8_t *input, uint32_t inputLen, 181 uint8_t *out, uint32_t *outLen); 182 typedef int32_t (*CRYPT_EAL_ImplPkeyUnBlind)(const void *ctx, const uint8_t *input, uint32_t inputLen, 183 uint8_t *out, uint32_t *outLen); 184 185 // CRYPT_EAL_OPERAID_ASYMCIPHER 186 #define CRYPT_EAL_IMPLPKEYCIPHER_ENCRYPT 1 187 #define CRYPT_EAL_IMPLPKEYCIPHER_DECRYPT 2 188 189 typedef int32_t (*CRYPT_EAL_ImplPkeyEncrypt)(void *ctx, const uint8_t *data, uint32_t dataLen, 190 uint8_t *out, uint32_t *outLen); 191 typedef int32_t (*CRYPT_EAL_ImplPkeyDecrypt)(void *ctx, const uint8_t *data, uint32_t dataLen, 192 uint8_t *out, uint32_t *outLen); 193 194 // CRYPT_EAL_OPERAID_KEYEXCH 195 #define CRYPT_EAL_IMPLPKEYEXCH_EXCH 1 196 typedef int32_t (*CRYPT_EAL_ImplPkeyExch)(const void *ctx, const void *pubCtx, uint8_t *out, uint32_t *outLen); 197 198 // CRYPT_EAL_OPERAID_KEM 199 #define CRYPT_EAL_IMPLPKEYKEM_ENCAPSULATE_INIT 1 200 #define CRYPT_EAL_IMPLPKEYKEM_DECAPSULATE_INIT 2 201 #define CRYPT_EAL_IMPLPKEYKEM_ENCAPSULATE 3 202 #define CRYPT_EAL_IMPLPKEYKEM_DECAPSULATE 4 203 204 typedef int32_t (*CRYPT_EAL_ImplPkeyEncapsInit)(const void *ctx, BSL_Param *params); 205 typedef int32_t (*CRYPT_EAL_ImplPkeyDecapsInit)(const void *ctx, BSL_Param *params); 206 typedef int32_t (*CRYPT_EAL_ImplPkeyKemEncapsulate)(const void *ctx, uint8_t *cipher, uint32_t *cipherLen, 207 uint8_t *out, uint32_t *outLen); 208 typedef int32_t (*CRYPT_EAL_ImplPkeyKemDecapsulate)(const void *ctx, uint8_t *data, uint32_t dataLen, 209 uint8_t *out, uint32_t *outLen); 210 211 // CRYPT_EAL_OPERAID_HASH 212 #define CRYPT_EAL_IMPLMD_NEWCTX 1 213 #define CRYPT_EAL_IMPLMD_INITCTX 2 214 #define CRYPT_EAL_IMPLMD_UPDATE 3 215 #define CRYPT_EAL_IMPLMD_FINAL 4 216 #define CRYPT_EAL_IMPLMD_DEINITCTX 5 217 #define CRYPT_EAL_IMPLMD_DUPCTX 6 218 #define CRYPT_EAL_IMPLMD_CTRL 7 // not support 219 #define CRYPT_EAL_IMPLMD_FREECTX 8 220 #define CRYPT_EAL_IMPLMD_SQUEEZE 9 221 222 typedef void *(*CRYPT_EAL_ImplMdNewCtx)(void *provCtx, int32_t algId); 223 typedef int32_t (*CRYPT_EAL_ImplMdInitCtx)(void *ctx, BSL_Param *param); 224 typedef int32_t (*CRYPT_EAL_ImplMdUpdate)(void *ctx, const uint8_t *input, uint32_t len); 225 typedef int32_t (*CRYPT_EAL_ImplMdFinal)(void *ctx, uint8_t *out, uint32_t *outLen); 226 typedef int32_t (*CRYPT_EAL_ImplMdDeInitCtx)(void *ctx); 227 typedef void *(*CRYPT_EAL_ImplMdDupCtx)(const void *ctx); 228 typedef int32_t (*CRYPT_EAL_ImplMdCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); // not support 229 typedef void (*CRYPT_EAL_ImplMdFreeCtx)(void *ctx); 230 typedef int32_t (*CRYPT_EAL_ImplMdSqueeze)(void *ctx, uint8_t *out, uint32_t len); 231 232 // CRYPT_EAL_OPERAID_MAC 233 #define CRYPT_EAL_IMPLMAC_NEWCTX 1 234 #define CRYPT_EAL_IMPLMAC_INIT 2 235 #define CRYPT_EAL_IMPLMAC_UPDATE 3 236 #define CRYPT_EAL_IMPLMAC_FINAL 4 237 #define CRYPT_EAL_IMPLMAC_DEINITCTX 5 238 #define CRYPT_EAL_IMPLMAC_REINITCTX 6 239 #define CRYPT_EAL_IMPLMAC_CTRL 7 240 #define CRYPT_EAL_IMPLMAC_FREECTX 8 241 242 typedef void *(*CRYPT_EAL_ImplMacNewCtx)(void *provCtx, int32_t algId); 243 typedef int32_t (*CRYPT_EAL_ImplMacInit)(void *ctx, const uint8_t *key, uint32_t len, BSL_Param *param); 244 typedef int32_t (*CRYPT_EAL_ImplMacUpdate)(void *ctx, const uint8_t *input, uint32_t len); 245 typedef int32_t (*CRYPT_EAL_ImplMacFinal)(void *ctx, uint8_t *out, uint32_t *outLen); 246 typedef int32_t (*CRYPT_EAL_ImplMacDeInitCtx)(void *ctx); 247 typedef int32_t (*CRYPT_EAL_ImplMacReInitCtx)(void *ctx); 248 typedef int32_t (*CRYPT_EAL_ImplMacCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); 249 typedef void (*CRYPT_EAL_ImplMacFreeCtx)(void *ctx); 250 251 // CRYPT_EAL_OPERAID_KDF 252 #define CRYPT_EAL_IMPLKDF_NEWCTX 1 253 #define CRYPT_EAL_IMPLKDF_SETPARAM 2 254 #define CRYPT_EAL_IMPLKDF_DERIVE 3 255 #define CRYPT_EAL_IMPLKDF_DEINITCTX 4 256 #define CRYPT_EAL_IMPLKDF_CTRL 5 // not support 257 #define CRYPT_EAL_IMPLKDF_FREECTX 6 258 259 typedef void *(*CRYPT_EAL_ImplKdfNewCtx)(void *provCtx, int32_t algId); 260 typedef int32_t (*CRYPT_EAL_ImplKdfSetParam)(void *ctx, BSL_Param *param); 261 typedef int32_t (*CRYPT_EAL_ImplKdfDerive)(void *ctx, uint8_t *key, uint32_t keyLen); 262 typedef int32_t (*CRYPT_EAL_ImplKdfDeInitCtx)(void *ctx); 263 typedef int32_t (*CRYPT_EAL_ImplKdfCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); // not support 264 typedef void (*CRYPT_EAL_ImplKdfFreeCtx)(void *ctx); 265 266 // CRYPT_EAL_OPERAID_RAND 267 #define CRYPT_EAL_IMPLRAND_DRBGNEWCTX 1 268 #define CRYPT_EAL_IMPLRAND_DRBGINST 2 269 #define CRYPT_EAL_IMPLRAND_DRBGUNINST 3 270 #define CRYPT_EAL_IMPLRAND_DRBGGEN 4 271 #define CRYPT_EAL_IMPLRAND_DRBGRESEED 5 272 #define CRYPT_EAL_IMPLRAND_DRBGCTRL 6 273 #define CRYPT_EAL_IMPLRAND_DRBGFREECTX 7 274 275 typedef void *(*CRYPT_EAL_ImplRandDrbgNewCtx)(void *provCtx, int32_t algId, BSL_Param *param); 276 typedef int32_t (*CRYPT_EAL_ImplRandDrbgInst)(void *ctx, const uint8_t *pers, uint32_t persLen, BSL_Param *param); 277 typedef int32_t (*CRYPT_EAL_ImplRandDrbgUnInst)(void *ctx); 278 typedef int32_t (*CRYPT_EAL_ImplRandDrbgGen)(void *ctx, uint8_t *out, uint32_t outLen, const uint8_t *addin, 279 uint32_t adinLen, BSL_Param *param); 280 typedef int32_t (*CRYPT_EAL_ImplRandDrbgReSeed)(void *ctx, const uint8_t *addin, uint32_t addinLen, BSL_Param *param); 281 typedef int32_t (*CRYPT_EAL_ImplRandDrbgCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); 282 typedef void (*CRYPT_EAL_ImplRandDrbgFreeCtx)(void *ctx); 283 284 // CRYPT_EAL_OPERAID_DECODER 285 #define CRYPT_DECODER_IMPL_NEWCTX 1 286 #define CRYPT_DECODER_IMPL_SETPARAM 2 287 #define CRYPT_DECODER_IMPL_GETPARAM 3 288 #define CRYPT_DECODER_IMPL_DECODE 4 289 #define CRYPT_DECODER_IMPL_FREEOUTDATA 5 290 #define CRYPT_DECODER_IMPL_FREECTX 6 291 292 typedef void *(*CRYPT_DECODER_IMPL_NewCtx)(void *provCtx); 293 typedef int32_t (*CRYPT_DECODER_IMPL_SetParam)(void *ctx, const BSL_Param *param); 294 typedef int32_t (*CRYPT_DECODER_IMPL_GetParam)(void *ctx, BSL_Param *param); 295 typedef int32_t (*CRYPT_DECODER_IMPL_Decode)(void *ctx, const BSL_Param *inParam, BSL_Param **outParam); 296 typedef void (*CRYPT_DECODER_IMPL_FreeOutData)(void *ctx, BSL_Param *outData); 297 typedef void (*CRYPT_DECODER_IMPL_FreeCtx)(void *ctx); 298 299 #ifdef __cplusplus 300 } 301 #endif // __cplusplus 302 303 #endif // CRYPT_EAL_IMPLPROVIDER_H 304