static void MYOBJ_sethello(MYOBJ *obj, char *cp) { int st; st = CRYPTO_set_ex_data(&obj->ex_data, sidx, cp); assert(st != 0); }
int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg) { ECDSA_DATA *ecdsa; ecdsa = ecdsa_check(d); if (ecdsa == NULL) return 0; return(CRYPTO_set_ex_data(&ecdsa->ex_data,idx,arg)); }
int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg) { ECDH_DATA *ecdh; ecdh = ecdh_check(d); if (ecdh == NULL) return 0; return (CRYPTO_set_ex_data(&ecdh->ex_data, idx, arg)); }
/** * Duplicates a keyhandle stored in ex_data in case we copy a key. */ int keyhandle_dup(CRYPTO_EX_DATA* to, CRYPTO_EX_DATA*, void *ptrRef, int idx, long, void *) { // This appears to be a bug in OpenSSL. void** ptr = reinterpret_cast<void**>(ptrRef); char* keyhandle = reinterpret_cast<char*>(*ptr); if (keyhandle != NULL) { char* keyhandle_copy = strdup(keyhandle); *ptr = keyhandle_copy; // Call this in case OpenSSL is fixed in the future. (void) CRYPTO_set_ex_data(to, idx, keyhandle_copy); } return 1; }
static int zlib_stateful_init(COMP_CTX *ctx) { int err; struct zlib_state *state = (struct zlib_state *)OPENSSL_malloc(sizeof(struct zlib_state)); if (state == NULL) goto err; state->istream.zalloc = zlib_zalloc; state->istream.zfree = zlib_zfree; state->istream.opaque = Z_NULL; state->istream.next_in = Z_NULL; state->istream.next_out = Z_NULL; state->istream.avail_in = 0; state->istream.avail_out = 0; err = inflateInit_(&state->istream, ZLIB_VERSION, sizeof(z_stream)); if (err != Z_OK) goto err; state->ostream.zalloc = zlib_zalloc; state->ostream.zfree = zlib_zfree; state->ostream.opaque = Z_NULL; state->ostream.next_in = Z_NULL; state->ostream.next_out = Z_NULL; state->ostream.avail_in = 0; state->ostream.avail_out = 0; err = deflateInit_(&state->ostream, Z_DEFAULT_COMPRESSION, ZLIB_VERSION, sizeof(z_stream)); if (err != Z_OK) goto err; CRYPTO_new_ex_data(CRYPTO_EX_INDEX_COMP, ctx, &ctx->ex_data); CRYPTO_set_ex_data(&ctx->ex_data, zlib_stateful_ex_idx, state); return 1; err: if (state) OPENSSL_free(state); return 0; }
int RSA_set_ex_data(RSA *r, int idx, void *arg) { return(CRYPTO_set_ex_data(&r->ex_data,idx,arg)); }
int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg) { return (CRYPTO_set_ex_data(&s->ex_data, idx, arg)); }
int X509_set_ex_data(X509 *r, int idx, void *arg) { return(CRYPTO_set_ex_data(&r->ex_data,idx,arg)); }
int UI_set_ex_data(UI *r, int idx, void *arg) { return (CRYPTO_set_ex_data(&r->ex_data, idx, arg)); }
int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data) { return CRYPTO_set_ex_data(&method->ex_data, idx, data); }
int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg) { return(CRYPTO_set_ex_data(&e->ex_data, idx, arg)); }
int STORE_set_ex_data(STORE *r, int idx, void *arg) { return (CRYPTO_set_ex_data(&r->ex_data, idx, arg)); }
int DH_set_ex_data(DH *d, int idx, void *arg) { return (CRYPTO_set_ex_data(&d->ex_data, idx, arg)); }
int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data) { return CRYPTO_set_ex_data(&str->ex_data, idx, data); }
int SSL_SESSION_set_ex_data(SSL_SESSION *session, int idx, void *arg) { return CRYPTO_set_ex_data(&session->ex_data, idx, arg); }
/* * Get and set the EXDATA */ int RAND_DRBG_set_ex_data(RAND_DRBG *drbg, int idx, void *arg) { return CRYPTO_set_ex_data(&drbg->ex_data, idx, arg); }
int DSA_set_ex_data(DSA *d, int idx, void *arg) { return CRYPTO_set_ex_data(&d->ex_data, idx, arg); }
int BIO_set_ex_data(BIO *bio, int idx, void *data) { return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); }
int EC_KEY_set_ex_data(EC_KEY *key, int idx, void *arg) { return CRYPTO_set_ex_data(&key->ex_data, idx, arg); }
/** * Makes sure the ex_data for the keyhandle is initially set to NULL. */ int keyhandle_new(void*, void*, CRYPTO_EX_DATA* ad, int idx, long, void*) { return CRYPTO_set_ex_data(ad, idx, NULL); }
/* * Duplicate a CRYPTO_EX_DATA variable - including calling dup() callbacks * for each index in the class used by this variable */ int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from) { int mx, j, i; void *ptr; EX_CALLBACK *stack[10]; EX_CALLBACK **storage = NULL; EX_CALLBACKS *ip; int toret = 0; OSSL_EX_DATA_GLOBAL *global = openssl_ctx_get_ex_data_global(from->ctx); if (global == NULL) return 0; to->ctx = from->ctx; if (from->sk == NULL) /* Nothing to copy over */ return 1; if ((ip = get_and_lock(from->ctx, class_index)) == NULL) return 0; mx = sk_EX_CALLBACK_num(ip->meth); j = sk_void_num(from->sk); if (j < mx) mx = j; if (mx > 0) { if (mx < (int)OSSL_NELEM(stack)) storage = stack; else storage = OPENSSL_malloc(sizeof(*storage) * mx); if (storage != NULL) for (i = 0; i < mx; i++) storage[i] = sk_EX_CALLBACK_value(ip->meth, i); } CRYPTO_THREAD_unlock(global->ex_data_lock); if (mx == 0) return 1; if (storage == NULL) { CRYPTOerr(CRYPTO_F_CRYPTO_DUP_EX_DATA, ERR_R_MALLOC_FAILURE); return 0; } /* * Make sure the ex_data stack is at least |mx| elements long to avoid * issues in the for loop that follows; so go get the |mx|'th element * (if it does not exist CRYPTO_get_ex_data() returns NULL), and assign * to itself. This is normally a no-op; but ensures the stack is the * proper size */ if (!CRYPTO_set_ex_data(to, mx - 1, CRYPTO_get_ex_data(to, mx - 1))) goto err; for (i = 0; i < mx; i++) { ptr = CRYPTO_get_ex_data(from, i); if (storage[i] != NULL && storage[i]->dup_func != NULL) if (!storage[i]->dup_func(to, from, &ptr, i, storage[i]->argl, storage[i]->argp)) goto err; CRYPTO_set_ex_data(to, i, ptr); } toret = 1; err: if (storage != stack) OPENSSL_free(storage); return toret; }
EXPORT_C int DSA_set_ex_data(DSA *d, int idx, void *arg) { return(CRYPTO_set_ex_data(&d->ex_data,idx,arg)); }
int RSA_set_ex_data(RSA *rsa, int idx, void *arg) { return CRYPTO_set_ex_data(&rsa->ex_data, idx, arg); }