- for (; fns->function_id != 0; fns++) {
- switch (fns->function_id) {
- case OSSL_FUNC_SIGNATURE_NEWCTX:
- if (signature->newctx != NULL)
- break;
- signature->newctx = OSSL_get_OP_signature_newctx(fns);
- ctxfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_SIGN_INIT:
- if (signature->sign_init != NULL)
- break;
- signature->sign_init = OSSL_get_OP_signature_sign_init(fns);
- signfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_SIGN:
- if (signature->sign != NULL)
- break;
- signature->sign = OSSL_get_OP_signature_sign(fns);
- signfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_VERIFY_INIT:
- if (signature->verify_init != NULL)
- break;
- signature->verify_init = OSSL_get_OP_signature_verify_init(fns);
- verifyfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_VERIFY:
- if (signature->verify != NULL)
- break;
- signature->verify = OSSL_get_OP_signature_verify(fns);
- verifyfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT:
- if (signature->verify_recover_init != NULL)
- break;
- signature->verify_recover_init
- = OSSL_get_OP_signature_verify_recover_init(fns);
- verifyrecfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_VERIFY_RECOVER:
- if (signature->verify_recover != NULL)
- break;
- signature->verify_recover
- = OSSL_get_OP_signature_verify_recover(fns);
- verifyrecfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_FREECTX:
- if (signature->freectx != NULL)
- break;
- signature->freectx = OSSL_get_OP_signature_freectx(fns);
- ctxfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_DUPCTX:
- if (signature->dupctx != NULL)
- break;
- signature->dupctx = OSSL_get_OP_signature_dupctx(fns);
- break;
- case OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS:
- if (signature->get_ctx_params != NULL)
- break;
- signature->get_ctx_params
- = OSSL_get_OP_signature_get_ctx_params(fns);
- gparamfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS:
- if (signature->gettable_ctx_params != NULL)
- break;
- signature->gettable_ctx_params
- = OSSL_get_OP_signature_gettable_ctx_params(fns);
- gparamfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS:
- if (signature->set_ctx_params != NULL)
- break;
- signature->set_ctx_params
- = OSSL_get_OP_signature_set_ctx_params(fns);
- sparamfncnt++;
- break;
- case OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS:
- if (signature->settable_ctx_params != NULL)
- break;
- signature->settable_ctx_params
- = OSSL_get_OP_signature_settable_ctx_params(fns);
- sparamfncnt++;
- break;
- }
- }
- if (ctxfncnt != 2
- || (signfncnt != 2 && verifyfncnt != 2 && verifyrecfncnt != 2)
- || (gparamfncnt != 0 && gparamfncnt != 2)
- || (sparamfncnt != 0 && sparamfncnt != 2)) {
- /*
- * In order to be a consistent set of functions we must have at least
- * a set of context functions (newctx and freectx) as well as a pair of
- * "signature" functions: (sign_init, sign) or (verify_init verify) or
- * (verify_recover_init, verify_recover). set_ctx_params and
- * settable_ctx_params are optional, but if one of them is present then
- * the other one must also be present. The same applies to
- * get_ctx_params and gettable_ctx_params. The dupctx function is
- * optional.
- */
- ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS);