---
name: "libressl-SSL_export_keying_material"
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-SSL_export_keying_material"
---

# libressl-SSL\_export\_keying\_material(3)

obtain keying material for application use

## NAME

**SSL\_export\_keying\_material** – obtain keying material for application use

## SYNOPSIS

SSL Library (libssl, -lssl) libcrypto

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

*int*\

**SSL\_export\_keying\_material**(*SSL \*s*, *unsigned char \*out*, *size\_t olen*, *const char \*label*, *size\_t llen*, *const unsigned char \*context*, *size\_t contextlen*, *int use\_context*);

## DESCRIPTION

During the creation of a TLS or DTLS connection, shared keying material is established between the two endpoints. The function **SSL\_export\_keying\_material**() enables an application to use some of this keying material for its own purposes in accordance with RFC 5705.

An application may need to securely establish the context within which this keying material will be used. For example, this may include identifiers for the application session, application algorithms or parameters, or the lifetime of the context. The context value is left to the application but must be the same on both sides of the communication.

For a given SSL connection *s*, *olen* bytes of data will be written to *out*. The application specific context should be supplied in the location pointed to by *context* and should be *contextlen* bytes long. Provision of a context is optional. If the context should be omitted entirely, then *use\_context* should be set to 0. Otherwise it should be any other value. If *use\_context* is 0, then the values of *context* and *contextlen* are ignored.

In TLSv1.2 and below, a zero length context is treated differently from no context at all, and will result in different keying material being returned.

An application specific label should be provided in the location pointed to by *label* and should be *llen* bytes long. Typically this will be a value from the *IANA Exporter Label Registry:* **https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#exporter-labels**.

Alternatively, labels beginning with "EXPERIMENTAL" are permitted by the standard to be used without registration.

## RETURN VALUES

**SSL\_export\_keying\_material**() returns 1 on success or 0 or -1 on failure.

## SEE ALSO

[ssl(3)](/ssl/3.md)

## HISTORY

**SSL\_export\_keying\_material**() first appeared in OpenSSL 1.0.1 and has been available since OpenBSD 5.3.
