BIO_GET_EX_NEW_INDEX(3ossl)

πŸ“¦ version 3.5.0, in opensuse-leap 16.0

🌸 BIO_GET_EX_NEW_INDEX β€” the OpenSSL 3ossl glow-up 🌸

okay so bestie, you know how basically every big OpenSSL struct has a little secret pocket where you can stash your own stuff? yeah. this whole page is about that pocket. it's from the 3ossl manual, it's iconic, and by the end you're gonna know it by heart. let's go πŸ’…


✨ NAME ✨

application-specific data β€” that's the whole vibe. and here's every single function that lives on this page, grouped by the datatype they belong to so your brain doesn't explode:

  • BIO_get_ex_new_index, BIO_set_ex_data, BIO_get_ex_data, BIO_set_app_data, BIO_get_app_data
  • DH_get_ex_new_index, DH_set_ex_data, DH_get_ex_data
  • DSA_get_ex_new_index, DSA_set_ex_data, DSA_get_ex_data
  • EC_KEY_get_ex_new_index, EC_KEY_set_ex_data, EC_KEY_get_ex_data
  • ENGINE_get_ex_new_index, ENGINE_set_ex_data, ENGINE_get_ex_data
  • EVP_PKEY_get_ex_new_index, EVP_PKEY_set_ex_data, EVP_PKEY_get_ex_data
  • RSA_get_ex_new_index, RSA_set_ex_data, RSA_get_ex_data, RSA_set_app_data, RSA_get_app_data
  • SSL_get_ex_new_index, SSL_set_ex_data, SSL_get_ex_data, SSL_set_app_data, SSL_get_app_data
  • SSL_CTX_get_ex_new_index, SSL_CTX_set_ex_data, SSL_CTX_get_ex_data, SSL_CTX_set_app_data, SSL_CTX_get_app_data
  • SSL_SESSION_get_ex_new_index, SSL_SESSION_set_ex_data, SSL_SESSION_get_ex_data, SSL_SESSION_set_app_data, SSL_SESSION_get_app_data
  • UI_get_ex_new_index, UI_set_ex_data, UI_get_ex_data, UI_set_app_data, UI_get_app_data
  • X509_STORE_CTX_get_ex_new_index, X509_STORE_CTX_set_ex_data, X509_STORE_CTX_get_ex_data, X509_STORE_CTX_set_app_data, X509_STORE_CTX_get_app_data
  • X509_STORE_get_ex_new_index, X509_STORE_set_ex_data, X509_STORE_get_ex_data
  • X509_get_ex_new_index, X509_set_ex_data, X509_get_ex_data

okay yes that was a lot. drink some water. you ate that. 🫢


πŸ¦‹ SYNOPSIS πŸ¦‹

so the header you gotta pull in is this one, bestie:

#include <openssl/x509.h>

and here's the generic shape β€” TYPE is a placeholder, obviously, not a real type, do not come for me:

int TYPE_get_ex_new_index(long argl, void *argp,
                          CRYPTO_EX_new *new_func,
                          CRYPTO_EX_dup *dup_func,
                          CRYPTO_EX_free *free_func);

int TYPE_set_ex_data(TYPE *d, int idx, void *arg);

void *TYPE_get_ex_data(const TYPE *d, int idx);

#define TYPE_set_app_data(TYPE *d, void *arg)
#define TYPE_get_app_data(TYPE *d)
⚠️ heads up: the following functions have been deprecated since OpenSSL 3.0, and you can hide them entirely by defining OPENSSL_API_COMPAT with a suitable version value, see openssl_user_macros(7):
int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
                        CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int DH_set_ex_data(DH *type, int idx, void *arg);
void *DH_get_ex_data(DH *type, int idx);
int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
                         CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int DSA_set_ex_data(DSA *type, int idx, void *arg);
void *DSA_get_ex_data(DSA *type, int idx);
int EC_KEY_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
                            CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int EC_KEY_set_ex_data(EC_KEY *type, int idx, void *arg);
void *EC_KEY_get_ex_data(EC_KEY *type, int idx);
int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
                         CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int RSA_set_ex_data(RSA *type, int idx, void *arg);
void *RSA_get_ex_data(RSA *type, int idx);
int RSA_set_app_data(RSA *type, void *arg);
void *RSA_get_app_data(RSA *type);
int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
                            CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int ENGINE_set_ex_data(ENGINE *type, int idx, void *arg);
void *ENGINE_get_ex_data(ENGINE *type, int idx);

πŸ’– DESCRIPTION πŸ’–

okay so throughout this whole page, TYPE is a placeholder for any of the OpenSSL datatypes listed in CRYPTO_get_ex_new_index(3). it's giving "insert your fave type here." πŸŽ€

the deprecated girlies, part one: all functions with a TYPE of DH, DSA, RSA and EC_KEY are deprecated. like, retired. applications should instead use EVP_PKEY_set_ex_data(), EVP_PKEY_get_ex_data() and EVP_PKEY_get_ex_new_index(). that's the upgrade path, no cap.

the deprecated girlies, part two: all functions with a TYPE of ENGINE are deprecated too. applications using engines should be replaced by providers. not me telling you your whole architecture needs a glow-up 😭 but like... it does.

so what do these functions actually do? they handle application-specific data for OpenSSL data structures. your stuff, in their struct. matching outfits but separate closets. ✨

  • TYPE_get_ex_new_index() β€” this is a macro that calls CRYPTO_get_ex_new_index() with the correct index value. it's the bouncer handing out your very own index number.
  • TYPE_set_ex_data() β€” this is a function that calls CRYPTO_set_ex_data() with an offset into the opaque exdata part of the TYPE object. and listen: d MUST NOT be NULL. i'm serious. do not do that.
  • TYPE_get_ex_data() β€” this is a function that calls CRYPTO_get_ex_data() with an offset into the opaque exdata part of the TYPE object. and again, d MUST NOT be NULL. same rule, same energy, do not test it. πŸ’€

the app data shortcut β€” for compatibility with previous releases, the exdata index of zero is reserved for "application data." there are two convenience functions for this, and honestly they're the ones you'll actually use:

  • TYPE_set_app_data() β€” a macro that invokes TYPE_set_ex_data() with idx set to zero. so you don't gotta remember the zero. she remembers for you. πŸ’…
  • TYPE_get_app_data() β€” a macro that invokes TYPE_get_ex_data() with idx set to zero. same deal, other direction.

🌈 RETURN VALUES 🌈

  • TYPE_get_ex_new_index() β€” returns a new index on success, or -1 on error. bestie got a whole new index, slay. if it's -1, something went wrong.
  • TYPE_set_ex_data() β€” returns 1 on success or 0 on error.
  • TYPE_get_ex_data() β€” returns the application data, or NULL if an error occurred.
🫢 psst: NULL back from TYPE_get_ex_data() means an error happened β€” don't just assume the data was empty, okay? read the room.

πŸŽ€ SEE ALSO πŸŽ€


πŸ¦‹ HISTORY πŸ¦‹

the following functions were deprecated in OpenSSL 3.0, and yes i'm listing every single one because i don't skip:

DH_get_ex_new_index(), DH_set_ex_data(), DH_get_ex_data(), DSA_get_ex_new_index(), DSA_set_ex_data(), DSA_get_ex_data(), EC_KEY_get_ex_new_index(), EC_KEY_set_ex_data(), EC_KEY_get_ex_data(), ENGINE_get_ex_new_index(), ENGINE_set_ex_data(), ENGINE_get_ex_data(), RSA_get_ex_new_index(), RSA_set_ex_data(), RSA_get_ex_data(), RSA_set_app_data() and RSA_get_app_data().

rest in peace to those, they served their time. πŸ•ŠοΈ


Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.


and that's the page, bestie!! πŸ’œ this was version 3.5.0, dated 2026-09-25, and it's the BIO_GET_EX_NEW_INDEX(3ossl) page β€” go forth and stash your app data responsibly. mwah. πŸ’‹

πŸ“¦ where this page comes from