+#ifndef OPENSSL_NO_HW
+#ifndef OPENSSL_NO_HW_NURON
+
+static const char def_NURON_LIBNAME[] = "nuronssl";
+static const char *NURON_LIBNAME = def_NURON_LIBNAME;
+static const char *NURON_F1 = "nuron_mod_exp";
+
+/* The definitions for control commands specific to this engine */
+#define NURON_CMD_SO_PATH ENGINE_CMD_BASE
+static const ENGINE_CMD_DEFN nuron_cmd_defns[] = {
+ {NURON_CMD_SO_PATH,
+ "SO_PATH",
+ "Specifies the path to the 'nuronssl' shared library",
+ ENGINE_CMD_FLAG_STRING},
+ {0, NULL, NULL, 0}
+ };
+
+#ifndef OPENSSL_NO_ERR
+/* Error function codes for use in nuron operation */
+#define NURON_F_NURON_INIT 100
+#define NURON_F_NURON_FINISH 101
+#define NURON_F_NURON_CTRL 102
+#define NURON_F_NURON_MOD_EXP 103
+/* Error reason codes */
+#define NURON_R_ALREADY_LOADED 104
+#define NURON_R_DSO_NOT_FOUND 105
+#define NURON_R_DSO_FUNCTION_NOT_FOUND 106
+#define NURON_R_NOT_LOADED 107
+#define NURON_R_DSO_FAILURE 108
+#define NURON_R_CTRL_COMMAND_NOT_IMPLEMENTED 109
+static ERR_STRING_DATA nuron_str_functs[] =
+ {
+ /* This first element is changed to match the dynamic 'lib' number */
+{ERR_PACK(0,0,0), "nuron engine code"},
+{ERR_PACK(0,NURON_F_NURON_INIT,0), "nuron_init"},
+{ERR_PACK(0,NURON_F_NURON_FINISH,0), "nuron_finish"},
+{ERR_PACK(0,NURON_F_NURON_CTRL,0), "nuron_ctrl"},
+{ERR_PACK(0,NURON_F_NURON_MOD_EXP,0), "nuron_mod_exp"},
+/* Error reason codes */
+{NURON_R_ALREADY_LOADED ,"already loaded"},
+{NURON_R_DSO_NOT_FOUND ,"DSO not found"},
+{NURON_R_DSO_FUNCTION_NOT_FOUND ,"DSO function not found"},
+{NURON_R_NOT_LOADED ,"not loaded"},
+{NURON_R_DSO_FAILURE ,"DSO failure"},
+{NURON_R_CTRL_COMMAND_NOT_IMPLEMENTED ,"ctrl command not implemented"},
+{0,NULL}
+ };
+/* The library number we obtain dynamically from the ERR code */
+static int nuron_err_lib = -1;
+#define NURONerr(f,r) ERR_PUT_error(nuron_err_lib,(f),(r),__FILE__,__LINE__)
+static void nuron_load_error_strings(void)
+ {
+ if(nuron_err_lib < 0)
+ {
+ if((nuron_err_lib = ERR_get_next_error_library()) <= 0)
+ return;
+ nuron_str_functs[0].error = ERR_PACK(nuron_err_lib,0,0);
+ ERR_load_strings(nuron_err_lib, nuron_str_functs);
+ }
+ }
+static void nuron_unload_error_strings(void)
+ {
+ if(nuron_err_lib >= 0)
+ {
+ ERR_unload_strings(nuron_err_lib, nuron_str_functs);
+ nuron_err_lib = -1;
+ }
+ }
+#else
+#define NURONerr(f,r) /* NOP */
+static void nuron_load_error_strings(void) { } /* NOP */
+static void nuron_unload_error_strings(void) { } /* NOP */
+#endif