DSA_METH_NEW(3ossl)

πŸ’– NAME πŸ’–

Okay so bestie, welcome to the DSA_METH_NEW(3ossl) page β€” that's the OpenSSL manual, and this one is all about building your own DSA methods. The official one-line summary is literally "Routines to build up DSA methods", and honestly? Iconic. Periodt.

Here's the whole squad of functions this page covers:

  • DSA_meth_new
  • DSA_meth_free
  • DSA_meth_dup
  • DSA_meth_get0_name
  • DSA_meth_set1_name
  • DSA_meth_get_flags
  • DSA_meth_set_flags
  • DSA_meth_get0_app_data
  • DSA_meth_set0_app_data
  • DSA_meth_get_sign
  • DSA_meth_set_sign
  • DSA_meth_get_sign_setup
  • DSA_meth_set_sign_setup
  • DSA_meth_get_verify
  • DSA_meth_set_verify
  • DSA_meth_get_mod_exp
  • DSA_meth_set_mod_exp
  • DSA_meth_get_bn_mod_exp
  • DSA_meth_set_bn_mod_exp
  • DSA_meth_get_init
  • DSA_meth_set_init
  • DSA_meth_get_finish
  • DSA_meth_set_finish
  • DSA_meth_get_paramgen
  • DSA_meth_set_paramgen
  • DSA_meth_get_keygen
  • DSA_meth_set_keygen

✨ SYNOPSIS ✨

First things first, you gotta pull in the header, no cap:

#include <openssl/dsa.h>
⚠️ Heads up bestie, this is important: 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):
DSA_METHOD *DSA_meth_new(const char *name, int flags);

void DSA_meth_free(DSA_METHOD *dsam);

DSA_METHOD *DSA_meth_dup(const DSA_METHOD *meth);

const char *DSA_meth_get0_name(const DSA_METHOD *dsam);
int DSA_meth_set1_name(DSA_METHOD *dsam, const char *name);

int DSA_meth_get_flags(const DSA_METHOD *dsam);
int DSA_meth_set_flags(DSA_METHOD *dsam, int flags);

void *DSA_meth_get0_app_data(const DSA_METHOD *dsam);
int DSA_meth_set0_app_data(DSA_METHOD *dsam, void *app_data);

DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam))(const unsigned char *,
                                                      int, DSA *);
int DSA_meth_set_sign(DSA_METHOD *dsam, DSA_SIG *(*sign)(const unsigned char *,
                                                         int, DSA *));

int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam))(DSA *, BN_CTX *,$
                                                       BIGNUM **, BIGNUM **);
int DSA_meth_set_sign_setup(DSA_METHOD *dsam, int (*sign_setup)(DSA *, BN_CTX *,
                                                                BIGNUM **, BIGNUM **));

int (*DSA_meth_get_verify(const DSA_METHOD *dsam))(const unsigned char *,
                                                   int, DSA_SIG *, DSA *);
int DSA_meth_set_verify(DSA_METHOD *dsam, int (*verify)(const unsigned char *,
                                                        int, DSA_SIG *, DSA *));

int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam))(DSA *dsa, BIGNUM *rr, BIGNUM *a1,
                                                    BIGNUM *p1, BIGNUM *a2, BIGNUM *p2,
                                                    BIGNUM *m, BN_CTX *ctx,
                                                    BN_MONT_CTX *in_mont);
int DSA_meth_set_mod_exp(DSA_METHOD *dsam, int (*mod_exp)(DSA *dsa, BIGNUM *rr,
                                                          BIGNUM *a1, BIGNUM *p1,
                                                          BIGNUM *a2, BIGNUM *p2,
                                                          BIGNUM *m, BN_CTX *ctx,
                                                          BN_MONT_CTX *mont));

int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam))(DSA *dsa, BIGNUM *r, BIGNUM *a,
                                                       const BIGNUM *p, const BIGNUM *m,
                                                       BN_CTX *ctx, BN_MONT_CTX *mont);
int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam, int (*bn_mod_exp)(DSA *dsa,
                                                                BIGNUM *r,
                                                                BIGNUM *a,
                                                                const BIGNUM *p,
                                                                const BIGNUM *m,
                                                                BN_CTX *ctx,
                                                                BN_MONT_CTX *mont));

int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *);
int DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *));

int (*DSA_meth_get_finish(const DSA_METHOD *dsam))(DSA *);
int DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish)(DSA *));

int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam))(DSA *, int,
                                                     const unsigned char *,
                                                     int, int *, unsigned long *,
                                                     BN_GENCB *);
int DSA_meth_set_paramgen(DSA_METHOD *dsam,
                          int (*paramgen)(DSA *, int, const unsigned char *,
                                          int, int *, unsigned long *, BN_GENCB *));

int (*DSA_meth_get_keygen(const DSA_METHOD *dsam))(DSA *);
int DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen)(DSA *));

🌸 DESCRIPTION 🌸

Okay so first, the big sad: every single function on this page is deprecated. Not me getting emotional over a deprecation notice 😭 Applications and extension implementations should instead use the OSSL_PROVIDER APIs. That's the glow-up. Fr fr.

The DSA_METHOD type is a structure used for the provision of custom DSA implementations. Think of it as a little plug-and-play kit πŸŽ€ β€” it gives OpenSSL a set of functions to use for implementing all the various DSA capabilities.

DSA_meth_new() creates a new DSA_METHOD structure. You should give it a unique name and a set of flags. The name should be a NULL terminated string, which will be duplicated and stored in the DSA_METHOD object β€” so yes, it is the caller's responsibility to free the original string. The flags get used during the construction of a new DSA object based on this DSA_METHOD, and any new DSA object will have those flags set by default.

DSA_meth_dup() creates a duplicate copy of the DSA_METHOD object passed as a parameter. Lowkey the most useful thing ever: it lets you build a new DSA_METHOD based on an existing one, but with some differences. Chef's kiss πŸ’…

DSA_meth_free() destroys a DSA_METHOD structure and frees up any memory associated with it. And if the argument is NULL, nothing is done β€” no drama, no crash, we love a graceful exit πŸ¦‹

DSA_meth_get0_name() returns a pointer to the name of this DSA_METHOD. Careful bestie: it's a pointer to the internal name string, so you should not free it. DSA_meth_set1_name() sets the name of the DSA_METHOD to name. That string is duplicated and the copy is stored in the DSA_METHOD structure, so the caller remains responsible for freeing the memory associated with the name.

DSA_meth_get_flags() returns the current value of the flags associated with this DSA_METHOD. DSA_meth_set_flags() gives you the ability to set those flags.

DSA_meth_get0_app_data() and DSA_meth_set0_app_data() give you the ability to associate implementation specific data with the DSA_METHOD. And bestie, listen β€” it is the application's responsibility to free this data before the DSA_METHOD is freed via a call to DSA_meth_free(). Do not skip that step, I'm begging 🫢

DSA_meth_get_sign() and DSA_meth_set_sign() get and set the function used for creating a DSA signature, respectively. This function gets called in response to the application calling DSA_do_sign() (or DSA_sign()). The parameters for the function have the same meaning as for DSA_do_sign().

DSA_meth_get_sign_setup() and DSA_meth_set_sign_setup() get and set the function used for precalculating the DSA signature values k^-1 and r. This function gets called in response to the application calling DSA_sign_setup(). The parameters for the function have the same meaning as for DSA_sign_setup().

DSA_meth_get_verify() and DSA_meth_set_verify() get and set the function used for verifying a DSA signature, respectively. This function gets called in response to the application calling DSA_do_verify() (or DSA_verify()). The parameters for the function have the same meaning as for DSA_do_verify().

DSA_meth_get_mod_exp() and DSA_meth_set_mod_exp() get and set the function used for computing the following value:

rr = a1^p1 * a2^p2 mod m

This function gets called by the default OpenSSL method during verification of a DSA signature. The result is stored in the rr parameter. This function may be NULL.

DSA_meth_get_bn_mod_exp() and DSA_meth_set_bn_mod_exp() get and set the function used for computing the following value:

r = a ^ p mod m

This function gets called by the default OpenSSL function for DSA_sign_setup(). The result is stored in the r parameter. This function may be NULL.

DSA_meth_get_init() and DSA_meth_set_init() get and set the function used for creating a new DSA instance, respectively. This function gets called in response to the application calling DSA_new() (if the current default DSA_METHOD is this one) or DSA_new_method(). The DSA_new() and DSA_new_method() functions will allocate the memory for the new DSA object, and a pointer to this newly allocated structure will be passed as a parameter to the function. This function may be NULL.

DSA_meth_get_finish() and DSA_meth_set_finish() get and set the function used for destroying an instance of a DSA object, respectively. This function gets called in response to the application calling DSA_free(). A pointer to the DSA to be destroyed is passed as a parameter. The destroy function should be used for DSA implementation specific clean up β€” but the memory for the DSA itself should not be freed by this function. This function may be NULL.

DSA_meth_get_paramgen() and DSA_meth_set_paramgen() get and set the function used for generating DSA parameters, respectively. This function gets called in response to the application calling DSA_generate_parameters_ex() (or DSA_generate_parameters()). The parameters for the function have the same meaning as for DSA_generate_parameters_ex().

DSA_meth_get_keygen() and DSA_meth_set_keygen() get and set the function used for generating a new DSA key pair, respectively. This function gets called in response to the application calling DSA_generate_key(). The parameter for the function has the same meaning as for DSA_generate_key().


⭐ RETURN VALUES ⭐

DSA_meth_new() and DSA_meth_dup() return the newly allocated DSA_METHOD object, or NULL on failure. (Failure is not the vibe, but at least it tells you πŸ’€)

DSA_meth_get0_name() and DSA_meth_get_flags() return the name and flags associated with the DSA_METHOD, respectively.

All the other DSA_meth_get_*() functions return the appropriate function pointer that has been set in the DSA_METHOD, or NULL if no such pointer has yet been set.

DSA_meth_set1_name() and all the DSA_meth_set_*() functions return 1 on success or 0 on failure.


🌈 SEE ALSO 🌈


πŸ¦‹ HISTORY πŸ¦‹

  • The functions described here were deprecated in OpenSSL 3.0.
  • The functions described here were added in OpenSSL 1.1.0.

okay stay with me bestie, there's more of this page coming πŸ‘€

okay bestie, legal era, but make it cute ✨

Copyright 2016-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. Like, fr fr β€” that's not a suggestion, that's the vibe check you have to pass πŸ’…

You can obtain a copy in the file LICENSE in the source distribution, or at:

https://www.openssl.org/source/license.html

ngl bestie, read the actual license, it's giving required reading πŸ“š don't just skim it and hope for the best 😭

and that's the whole page, no cap 🫢 you made it all the way to the copyright section which means you're literally the main character of documentation reading rn πŸ‘‘

this one's from the 3.5.9 era, dated 2026-09-29 β€” so yes, freshly dated, still iconic, still DSA_METH_NEW(3ossl) 🌸

bye bestie, go write some DSA_METHs πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from