static int nuron_init(ENGINE *e) { if(pvDSOHandle != NULL) { NURONerr(NURON_F_NURON_INIT,NURON_R_ALREADY_LOADED); return 0; } pvDSOHandle = DSO_load(NULL, get_NURON_LIBNAME(), NULL, DSO_FLAG_NAME_TRANSLATION_EXT_ONLY); if(!pvDSOHandle) { NURONerr(NURON_F_NURON_INIT,NURON_R_DSO_NOT_FOUND); return 0; } pfnModExp = (tfnModExp *)DSO_bind_func(pvDSOHandle, NURON_F1); if(!pfnModExp) { NURONerr(NURON_F_NURON_INIT,NURON_R_DSO_FUNCTION_NOT_FOUND); return 0; } return 1; }
static int nuron_finish(ENGINE *e) { free_NURON_LIBNAME(); if (pvDSOHandle == NULL) { NURONerr(NURON_F_NURON_FINISH, NURON_R_NOT_LOADED); return 0; } if (!DSO_free(pvDSOHandle)) { NURONerr(NURON_F_NURON_FINISH, NURON_R_DSO_FAILURE); return 0; } pvDSOHandle = NULL; pfnModExp = NULL; return 1; }
static int nuron_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx) { if (!pvDSOHandle) { NURONerr(NURON_F_NURON_MOD_EXP, NURON_R_NOT_LOADED); return 0; } return pfnModExp(r, a, p, m); }
static int nuron_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) { int initialised = ((pvDSOHandle == NULL) ? 0 : 1); switch (cmd) { case NURON_CMD_SO_PATH: if (p == NULL) { NURONerr(NURON_F_NURON_CTRL, ERR_R_PASSED_NULL_PARAMETER); return 0; } if (initialised) { NURONerr(NURON_F_NURON_CTRL, NURON_R_ALREADY_LOADED); return 0; } return set_NURON_LIBNAME((const char *)p); default: break; } NURONerr(NURON_F_NURON_CTRL, NURON_R_CTRL_COMMAND_NOT_IMPLEMENTED); return 0; }