X509_LOOKUP_METH_NEW(3ossl)

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

✨ X509_LOOKUP_METH_NEW ✨

okay so this one's from the 3ossl manual, bestie β€” OpenSSL's own docs β€” and it's genuinely the blueprint for teaching OpenSSL how to go find certificates. buckle up πŸŽ€


🌸 NAME 🌸

Here's the whole squad β€” every single one of these lives on this page:

  • the typedef itself: X509_LOOKUP_METHOD
  • birth & death: X509_LOOKUP_meth_new, X509_LOOKUP_meth_free
  • the new_item duo: X509_LOOKUP_meth_set_new_item, X509_LOOKUP_meth_get_new_item
  • the free duo: X509_LOOKUP_meth_set_free, X509_LOOKUP_meth_get_free
  • the init duo: X509_LOOKUP_meth_set_init, X509_LOOKUP_meth_get_init
  • the shutdown duo: X509_LOOKUP_meth_set_shutdown, X509_LOOKUP_meth_get_shutdown
  • the ctrl crew: X509_LOOKUP_ctrl_fn, X509_LOOKUP_meth_set_ctrl, X509_LOOKUP_meth_get_ctrl
  • the subject crew: X509_LOOKUP_get_by_subject_fn, X509_LOOKUP_meth_set_get_by_subject, X509_LOOKUP_meth_get_get_by_subject
  • the issuer/serial crew: X509_LOOKUP_get_by_issuer_serial_fn, X509_LOOKUP_meth_set_get_by_issuer_serial, X509_LOOKUP_meth_get_get_by_issuer_serial
  • the fingerprint crew: X509_LOOKUP_get_by_fingerprint_fn, X509_LOOKUP_meth_set_get_by_fingerprint, X509_LOOKUP_meth_get_get_by_fingerprint
  • the alias crew: X509_LOOKUP_get_by_alias_fn, X509_LOOKUP_meth_set_get_by_alias, X509_LOOKUP_meth_get_get_by_alias
  • and the object setters: X509_OBJECT_set1_X509, X509_OBJECT_set1_X509_CRL

collectively? these are the routines to build up X509_LOOKUP methods. and they ate. πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

#include <openssl/x509_vfy.h>

typedef x509_lookup_method_st X509_LOOKUP_METHOD;

X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name);
void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method);

int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method,
                                  int (*new_item) (X509_LOOKUP *ctx));
int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method))
    (X509_LOOKUP *ctx);

int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method,
                              void (*free) (X509_LOOKUP *ctx));
void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method))
    (X509_LOOKUP *ctx);

int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method,
                              int (*init) (X509_LOOKUP *ctx));
int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method))
    (X509_LOOKUP *ctx);

int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method,
                                  int (*shutdown) (X509_LOOKUP *ctx));
int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method))
    (X509_LOOKUP *ctx);

typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc,
                                   long argl, char **ret);
int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method,
    X509_LOOKUP_ctrl_fn ctrl_fn);
X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method);

typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx,
                                             X509_LOOKUP_TYPE type,
                                             const X509_NAME *name,
                                             X509_OBJECT *ret);
int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method,
    X509_LOOKUP_get_by_subject_fn fn);
X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject(
    const X509_LOOKUP_METHOD *method);

typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx,
                                                   X509_LOOKUP_TYPE type,
                                                   const X509_NAME *name,
                                                   const ASN1_INTEGER *serial,
                                                   X509_OBJECT *ret);
int X509_LOOKUP_meth_set_get_by_issuer_serial(
    X509_LOOKUP_METHOD *method, X509_LOOKUP_get_by_issuer_serial_fn fn);
X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial(
    const X509_LOOKUP_METHOD *method);

typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx,
                                                 X509_LOOKUP_TYPE type,
                                                 const unsigned char* bytes,
                                                 int len,
                                                 X509_OBJECT *ret);
int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method,
    X509_LOOKUP_get_by_fingerprint_fn fn);
X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint(
    const X509_LOOKUP_METHOD *method);

typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx,
                                           X509_LOOKUP_TYPE type,
                                           const char *str,
                                           int len,
                                           X509_OBJECT *ret);
int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method,
    X509_LOOKUP_get_by_alias_fn fn);
X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias(
    const X509_LOOKUP_METHOD *method);

int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj);
int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj);

πŸ’– DESCRIPTION πŸ’–

so the X509_LOOKUP_METHOD type is a struct β€” the whole blueprint for inventing new X509_LOOKUP types. it hands OpenSSL a little bundle of functions, and OpenSSL uses that bundle to implement all its various X509 and X509_CRL lookup abilities. and here's the cute part: one instance of an X509_LOOKUP_METHOD can be associated with many instantiations of an X509_LOOKUP structure. one blueprint, infinite builds. main character energy fr 🫢

X509_LOOKUP_meth_new() creates a brand-new X509_LOOKUP_METHOD structure. give it a human-readable string with a brief lil description of the lookup method, okay? that's its whole personality.

X509_LOOKUP_meth_free() destroys an X509_LOOKUP_METHOD structure. and if the argument is NULL? nothing is done. no drama, no crash, iconic behaviour honestly. πŸ’€

X509_LOOKUP_get_new_item() and X509_LOOKUP_set_new_item() get and set the function that gets called when an X509_LOOKUP object is created with X509_LOOKUP_new(). if your X509_LOOKUP_METHOD needs any per-X509_LOOKUP specific data, the supplied new_item function should allocate that data and invoke X509_LOOKUP_set_method_data(3). that's the move. ✨

X509_LOOKUP_get_free() and X509_LOOKUP_set_free() get and set the function used to free any method data that was allocated and set from inside the new_item function. cleanup era. 🧹

X509_LOOKUP_meth_get_init() and X509_LOOKUP_meth_set_init() get and set the function used to initialize the method data that was set with X509_LOOKUP_set_method_data(3) as part of the new_item routine.

X509_LOOKUP_meth_get_shutdown() and X509_LOOKUP_meth_set_shutdown() get and set the function used to shut down the method data whose state was previously initialized in the init function. closing time, you don't gotta go home but you gotta get out of here πŸŒ™

X509_LOOKUP_meth_get_ctrl() and X509_LOOKUP_meth_set_ctrl() get and set a function used to handle arbitrary control commands issued by X509_LOOKUP_ctrl(). and like, what does that control function get handed? the X509_LOOKUP ctx, plus the arguments passed by X509_LOOKUP_ctrl. let me break the args down πŸ‘‡

  • cmd β€” an arbitrary integer that defines some operation
  • argc β€” a pointer to an array of characters
  • argl β€” an integer
  • ret β€” if set, points to a location where any return data should be written

and how argc and argl actually get used? depends entirely on the control function. no universal rules, that's between you and your ctrl fn bestie.


X509_LOOKUP_set_get_by_subject(), X509_LOOKUP_set_get_by_issuer_serial(), X509_LOOKUP_set_get_by_fingerprint(), X509_LOOKUP_set_get_by_alias() set the functions used to retrieve an X509 or X509_CRL object by the object's subject, issuer, fingerprint, and alias respectively. these functions are given the X509_LOOKUP context, the type of the X509_OBJECT being requested, the parameters related to the lookup, and an X509_OBJECT that will receive the requested object. 🎯

⚠️ okay this next bit is important, pay attention, no cap: Implementations must add objects they find to the X509_STORE object using X509_STORE_add_cert() or X509_STORE_add_crl(). this increments its reference count. However β€” and this is the messy part β€” the X509_STORE_CTX_get_by_subject(3) function also increases the reference count, which leads to one too many references being held. 😭 so applications should additionally call X509_free() or X509_CRL_free() to decrement the reference count again. balance restored.

Implementations should also use either X509_OBJECT_set1_X509() or X509_OBJECT_set1_X509_CRL() to set the result. note that this also increments the result's reference count. yeah. more refcounts. we love bookkeeping 🫠

any method data that was created as a result of the new_item function set by X509_LOOKUP_meth_set_new_item() can be accessed with X509_LOOKUP_get_method_data(3). the X509_STORE object that owns the X509_LOOKUP may be accessed with X509_LOOKUP_get_store(3). and the verdict: successful lookups should return 1, and unsuccessful lookups should return 0. simple as that πŸ’«

finally, X509_LOOKUP_get_get_by_subject(), X509_LOOKUP_get_get_by_issuer_serial(), X509_LOOKUP_get_get_by_fingerprint(), X509_LOOKUP_get_get_by_alias() retrieve the function that was set by the corresponding setter. getters getting what setters set. the circle of life 🌈


⭐ RETURN VALUES ⭐

  • the X509_LOOKUP_meth_set functions return 1 on success or 0 on error.
  • the X509_LOOKUP_meth_get functions return the corresponding function pointers.

πŸ‘‘ SEE ALSO πŸ‘‘

X509_STORE_CTX_get_by_subject(3), X509_STORE_new(3), SSL_CTX_set_cert_store(3)

go read those too, iykyk πŸ¦‹


πŸŽ€ HISTORY πŸŽ€

the functions described here were added in OpenSSL 1.1.0i. vintage but still slaying.


Copyright 2018-2024 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 whole page bestie πŸ’œ this was the 3.5.0 version, dated 2026-09-25, filed under X509_LOOKUP_METH_NEW(3ossl) β€” go build something iconic with it, mwah πŸ§šπŸ’–

πŸ“¦ where this page comes from