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

# libressl-d2i\_SSL\_SESSION(3)

convert SSL\_SESSION object from/to ASN1 representation

## NAME

**d2i\_SSL\_SESSION**, **i2d\_SSL\_SESSION** – convert SSL\_SESSION object from/to ASN1 representation

## SYNOPSIS

SSL Library (libssl, -lssl) libcrypto

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

*SSL\_SESSION* *\**\

**d2i\_SSL\_SESSION**(*SSL\_SESSION \*\*a*, *const unsigned char \*\*pp*, *long length*);

*int*\

**i2d\_SSL\_SESSION**(*SSL\_SESSION \*in*, *unsigned char \*\*pp*);

## DESCRIPTION

**d2i\_SSL\_SESSION**() transforms the external ASN1 representation of an SSL/TLS session, stored as binary data at location *pp* with length *length*, into an *SSL\_SESSION* object.

**i2d\_SSL\_SESSION**() transforms the *SSL\_SESSION* object *in* into the ASN1 representation and stores it into the memory location pointed to by *pp*. The length of the resulting ASN1 representation is returned. If *pp* is the NULL pointer, only the length is calculated and returned.

The *SSL\_SESSION* object is built from several[malloc(3)](/malloc/3.md) -ed parts; it can therefore not be moved, copied or stored directly. In order to store session data on disk or into a database, it must be transformed into a binary ASN1 representation.

When using **d2i\_SSL\_SESSION**(), the *SSL\_SESSION* object is automatically allocated. The reference count is 1, so that the session must be explicitly removed using SSL\_SESSION\_free(3), unless the *SSL\_SESSION* object is completely taken over, when being called inside the **get\_session\_cb**(), see SSL\_CTX\_sess\_set\_get\_cb(3).

*SSL\_SESSION* objects keep internal link information about the session cache list when being inserted into one *SSL\_CTX* object's session cache. One *SSL\_SESSION* object, regardless of its reference count, must therefore only be used with one *SSL\_CTX* object (and the *SSL* objects created from this *SSL\_CTX* object).

When using **i2d\_SSL\_SESSION**(), the memory location pointed to by *pp* must be large enough to hold the binary representation of the session. There is no known limit on the size of the created ASN1 representation, so call **i2d\_SSL\_SESSION**() first with *pp*=NULL to obtain the encoded size, before allocating the required amount of memory and calling **i2d\_SSL\_SESSION**() again. Note that this will advance the value contained in *\*pp* so it is necessary to save a copy of the original allocation. For example:

```
char	*p, *pp;
int	 elen, len;
elen = i2d_SSL_SESSION(sess, NULL);
p = pp = malloc(elen);
if (p != NULL) {
	len = i2d_SSL_SESSION(sess, &pp);
	assert(elen == len);
	assert(p + len == pp);
}
```

## RETURN VALUES

**d2i\_SSL\_SESSION**() returns a pointer to the newly allocated *SSL\_SESSION* object. In case of failure a NULL pointer is returned and the error message can be retrieved from the error stack.

**i2d\_SSL\_SESSION**() returns the size of the ASN1 representation in bytes. When the session is not valid, 0 is returned and no operation is performed.

## SEE ALSO

d2i\_X509(3), [ssl(3)](/ssl/3.md), SSL\_CTX\_sess\_set\_get\_cb(3), SSL\_SESSION\_free(3)

## HISTORY

**d2i\_SSL\_SESSION**() and **i2d\_SSL\_SESSION**() first appeared in SSLeay 0.5.2 and have been available since OpenBSD 2.4.
