---
name: "libressl-DH_set_method"
section: "3"
platform: "linux"
package: "libressl"
version: "4.4.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libressl-DH_set_method"
---

# libressl-DH\_set\_method(3)

select DH method

## NAME

**DH\_set\_default\_method**, **DH\_get\_default\_method**, **DH\_set\_method**, **DH\_new\_method**, **DH\_OpenSSL** – select DH method

## SYNOPSIS

Crypto Library (libcrypto, -lcrypto)

**#include \<openssl/dh.h\>**

*void*\

**DH\_set\_default\_method**(*const DH\_METHOD \*meth*);

*const* *DH\_METHOD* *\**\

**DH\_get\_default\_method**(*void*);

*int*\

**DH\_set\_method**(*DH \*dh*, *const DH\_METHOD \*meth*);

*DH* *\**\

**DH\_new\_method**(*ENGINE \*engine*);

*const* *DH\_METHOD* *\**\

**DH\_OpenSSL**(*void*);

## DESCRIPTION

A *DH\_METHOD* object contains pointers to the functions used for Diffie-Hellman operations. By default, the internal implementation returned by **DH\_OpenSSL**() is used. By selecting another method, alternative implementations such as hardware accelerators may be used.

**DH\_set\_default\_method**() selects *meth* as the default method for all *DH* structures created later.

**DH\_get\_default\_method**() returns a pointer to the current default method.

**DH\_set\_method**() selects *meth* to perform all operations using the key *dh*. This replaces the *DH\_METHOD* used by the *dh* key. It is possible to have *DH* keys that only work with certain *DH\_METHOD* implementations, and in such cases attempting to change the *DH\_METHOD* for the key can have unexpected results.

**DH\_new\_method**() allocates and initializes a *DH* structure. The *engine* argument is ignored and the default method controlled by **DH\_set\_default\_method**() is used.

The *DH\_METHOD* structure is defined as follows:

```
typedef struct dh_meth_st
{
     /* name of the implementation */
	const char *name;
     /* generate private and public DH values for key agreement */
        int (*generate_key)(DH *dh);
     /* compute shared secret */
        int (*compute_key)(unsigned char *key, BIGNUM *pub_key, DH *dh);
     /* compute r = a ^ p mod m (May be NULL for some implementations) */
        int (*bn_mod_exp)(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                                const BIGNUM *m, BN_CTX *ctx,
                                BN_MONT_CTX *m_ctx);
     /* called at DH_new */
        int (*init)(DH *dh);
     /* called at DH_free */
        int (*finish)(DH *dh);
        int flags;
        char *app_data; /* ?? */
} DH_METHOD;
```

## RETURN VALUES

**DH\_OpenSSL**() and **DH\_get\_default\_method**() return pointers to the respective *DH\_METHOD*.

**DH\_set\_method**() returns 1 on success or 0 on failure. Currently, it cannot fail.

**DH\_new\_method**() returns NULL and sets an error code that can be obtained by ERR\_get\_error(3) if the allocation fails. Otherwise it returns a pointer to the newly allocated structure.

## SEE ALSO

DH\_new(3)

## HISTORY

**DH\_set\_default\_method**(), **DH\_get\_default\_method**(), **DH\_set\_method**(), **DH\_new\_method**() and **DH\_OpenSSL**() first appeared in OpenSSL 0.9.5 and have been available since OpenBSD 2.7.
