1*4724848cSchristos /* 2*4724848cSchristos * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. 3*4724848cSchristos * 4*4724848cSchristos * Licensed under the OpenSSL license (the "License"). You may not use 5*4724848cSchristos * this file except in compliance with the License. You can obtain a copy 6*4724848cSchristos * in the file LICENSE in the source distribution or at 7*4724848cSchristos * https://www.openssl.org/source/license.html 8*4724848cSchristos */ 9*4724848cSchristos 10*4724848cSchristos #ifndef OSSL_INTERNAL_DSO_H 11*4724848cSchristos # define OSSL_INTERNAL_DSO_H 12*4724848cSchristos 13*4724848cSchristos # include <openssl/crypto.h> 14*4724848cSchristos # include "internal/dsoerr.h" 15*4724848cSchristos 16*4724848cSchristos /* These values are used as commands to DSO_ctrl() */ 17*4724848cSchristos # define DSO_CTRL_GET_FLAGS 1 18*4724848cSchristos # define DSO_CTRL_SET_FLAGS 2 19*4724848cSchristos # define DSO_CTRL_OR_FLAGS 3 20*4724848cSchristos 21*4724848cSchristos /* 22*4724848cSchristos * By default, DSO_load() will translate the provided filename into a form 23*4724848cSchristos * typical for the platform using the dso_name_converter function of the 24*4724848cSchristos * method. Eg. win32 will transform "blah" into "blah.dll", and dlfcn will 25*4724848cSchristos * transform it into "libblah.so". This callback could even utilise the 26*4724848cSchristos * DSO_METHOD's converter too if it only wants to override behaviour for 27*4724848cSchristos * one or two possible DSO methods. However, the following flag can be 28*4724848cSchristos * set in a DSO to prevent *any* native name-translation at all - eg. if 29*4724848cSchristos * the caller has prompted the user for a path to a driver library so the 30*4724848cSchristos * filename should be interpreted as-is. 31*4724848cSchristos */ 32*4724848cSchristos # define DSO_FLAG_NO_NAME_TRANSLATION 0x01 33*4724848cSchristos /* 34*4724848cSchristos * An extra flag to give if only the extension should be added as 35*4724848cSchristos * translation. This is obviously only of importance on Unix and other 36*4724848cSchristos * operating systems where the translation also may prefix the name with 37*4724848cSchristos * something, like 'lib', and ignored everywhere else. This flag is also 38*4724848cSchristos * ignored if DSO_FLAG_NO_NAME_TRANSLATION is used at the same time. 39*4724848cSchristos */ 40*4724848cSchristos # define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 41*4724848cSchristos 42*4724848cSchristos /* 43*4724848cSchristos * Don't unload the DSO when we call DSO_free() 44*4724848cSchristos */ 45*4724848cSchristos # define DSO_FLAG_NO_UNLOAD_ON_FREE 0x04 46*4724848cSchristos 47*4724848cSchristos /* 48*4724848cSchristos * This flag loads the library with public symbols. Meaning: The exported 49*4724848cSchristos * symbols of this library are public to all libraries loaded after this 50*4724848cSchristos * library. At the moment only implemented in unix. 51*4724848cSchristos */ 52*4724848cSchristos # define DSO_FLAG_GLOBAL_SYMBOLS 0x20 53*4724848cSchristos 54*4724848cSchristos typedef void (*DSO_FUNC_TYPE) (void); 55*4724848cSchristos 56*4724848cSchristos typedef struct dso_st DSO; 57*4724848cSchristos typedef struct dso_meth_st DSO_METHOD; 58*4724848cSchristos 59*4724848cSchristos /* 60*4724848cSchristos * The function prototype used for method functions (or caller-provided 61*4724848cSchristos * callbacks) that transform filenames. They are passed a DSO structure 62*4724848cSchristos * pointer (or NULL if they are to be used independently of a DSO object) and 63*4724848cSchristos * a filename to transform. They should either return NULL (if there is an 64*4724848cSchristos * error condition) or a newly allocated string containing the transformed 65*4724848cSchristos * form that the caller will need to free with OPENSSL_free() when done. 66*4724848cSchristos */ 67*4724848cSchristos typedef char *(*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); 68*4724848cSchristos /* 69*4724848cSchristos * The function prototype used for method functions (or caller-provided 70*4724848cSchristos * callbacks) that merge two file specifications. They are passed a DSO 71*4724848cSchristos * structure pointer (or NULL if they are to be used independently of a DSO 72*4724848cSchristos * object) and two file specifications to merge. They should either return 73*4724848cSchristos * NULL (if there is an error condition) or a newly allocated string 74*4724848cSchristos * containing the result of merging that the caller will need to free with 75*4724848cSchristos * OPENSSL_free() when done. Here, merging means that bits and pieces are 76*4724848cSchristos * taken from each of the file specifications and added together in whatever 77*4724848cSchristos * fashion that is sensible for the DSO method in question. The only rule 78*4724848cSchristos * that really applies is that if the two specification contain pieces of the 79*4724848cSchristos * same type, the copy from the first string takes priority. One could see 80*4724848cSchristos * it as the first specification is the one given by the user and the second 81*4724848cSchristos * being a bunch of defaults to add on if they're missing in the first. 82*4724848cSchristos */ 83*4724848cSchristos typedef char *(*DSO_MERGER_FUNC)(DSO *, const char *, const char *); 84*4724848cSchristos 85*4724848cSchristos DSO *DSO_new(void); 86*4724848cSchristos int DSO_free(DSO *dso); 87*4724848cSchristos int DSO_flags(DSO *dso); 88*4724848cSchristos int DSO_up_ref(DSO *dso); 89*4724848cSchristos long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); 90*4724848cSchristos 91*4724848cSchristos /* 92*4724848cSchristos * These functions can be used to get/set the platform-independent filename 93*4724848cSchristos * used for a DSO. NB: set will fail if the DSO is already loaded. 94*4724848cSchristos */ 95*4724848cSchristos const char *DSO_get_filename(DSO *dso); 96*4724848cSchristos int DSO_set_filename(DSO *dso, const char *filename); 97*4724848cSchristos /* 98*4724848cSchristos * This function will invoke the DSO's name_converter callback to translate a 99*4724848cSchristos * filename, or if the callback isn't set it will instead use the DSO_METHOD's 100*4724848cSchristos * converter. If "filename" is NULL, the "filename" in the DSO itself will be 101*4724848cSchristos * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is 102*4724848cSchristos * simply duplicated. NB: This function is usually called from within a 103*4724848cSchristos * DSO_METHOD during the processing of a DSO_load() call, and is exposed so 104*4724848cSchristos * that caller-created DSO_METHODs can do the same thing. A non-NULL return 105*4724848cSchristos * value will need to be OPENSSL_free()'d. 106*4724848cSchristos */ 107*4724848cSchristos char *DSO_convert_filename(DSO *dso, const char *filename); 108*4724848cSchristos /* 109*4724848cSchristos * This function will invoke the DSO's merger callback to merge two file 110*4724848cSchristos * specifications, or if the callback isn't set it will instead use the 111*4724848cSchristos * DSO_METHOD's merger. A non-NULL return value will need to be 112*4724848cSchristos * OPENSSL_free()'d. 113*4724848cSchristos */ 114*4724848cSchristos char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); 115*4724848cSchristos 116*4724848cSchristos /* 117*4724848cSchristos * The all-singing all-dancing load function, you normally pass NULL for the 118*4724848cSchristos * first and third parameters. Use DSO_up_ref and DSO_free for subsequent 119*4724848cSchristos * reference count handling. Any flags passed in will be set in the 120*4724848cSchristos * constructed DSO after its init() function but before the load operation. 121*4724848cSchristos * If 'dso' is non-NULL, 'flags' is ignored. 122*4724848cSchristos */ 123*4724848cSchristos DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); 124*4724848cSchristos 125*4724848cSchristos /* This function binds to a function inside a shared library. */ 126*4724848cSchristos DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); 127*4724848cSchristos 128*4724848cSchristos /* 129*4724848cSchristos * This method is the default, but will beg, borrow, or steal whatever method 130*4724848cSchristos * should be the default on any particular platform (including 131*4724848cSchristos * DSO_METH_null() if necessary). 132*4724848cSchristos */ 133*4724848cSchristos DSO_METHOD *DSO_METHOD_openssl(void); 134*4724848cSchristos 135*4724848cSchristos /* 136*4724848cSchristos * This function writes null-terminated pathname of DSO module containing 137*4724848cSchristos * 'addr' into 'sz' large caller-provided 'path' and returns the number of 138*4724848cSchristos * characters [including trailing zero] written to it. If 'sz' is 0 or 139*4724848cSchristos * negative, 'path' is ignored and required amount of characters [including 140*4724848cSchristos * trailing zero] to accommodate pathname is returned. If 'addr' is NULL, then 141*4724848cSchristos * pathname of cryptolib itself is returned. Negative or zero return value 142*4724848cSchristos * denotes error. 143*4724848cSchristos */ 144*4724848cSchristos int DSO_pathbyaddr(void *addr, char *path, int sz); 145*4724848cSchristos 146*4724848cSchristos /* 147*4724848cSchristos * Like DSO_pathbyaddr() but instead returns a handle to the DSO for the symbol 148*4724848cSchristos * or NULL on error. 149*4724848cSchristos */ 150*4724848cSchristos DSO *DSO_dsobyaddr(void *addr, int flags); 151*4724848cSchristos 152*4724848cSchristos /* 153*4724848cSchristos * This function should be used with caution! It looks up symbols in *all* 154*4724848cSchristos * loaded modules and if module gets unloaded by somebody else attempt to 155*4724848cSchristos * dereference the pointer is doomed to have fatal consequences. Primary 156*4724848cSchristos * usage for this function is to probe *core* system functionality, e.g. 157*4724848cSchristos * check if getnameinfo(3) is available at run-time without bothering about 158*4724848cSchristos * OS-specific details such as libc.so.versioning or where does it actually 159*4724848cSchristos * reside: in libc itself or libsocket. 160*4724848cSchristos */ 161*4724848cSchristos void *DSO_global_lookup(const char *name); 162*4724848cSchristos 163*4724848cSchristos int ERR_load_DSO_strings(void); 164*4724848cSchristos 165*4724848cSchristos #endif 166