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

# libressl-EVP\_BytesToKey(3)

password based encryption routine

## NAME

**EVP\_BytesToKey** – password based encryption routine

## SYNOPSIS

Crypto Library (libcrypto, -lcrypto)

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

*int*\

**EVP\_BytesToKey**(*const EVP\_CIPHER \*type*, *const EVP\_MD \*md*, *const unsigned char \*salt*, *const unsigned char \*data*, *int datal*, *int count*, *unsigned char \*key*, *unsigned char \*iv*);

## DESCRIPTION

**EVP\_BytesToKey**() derives a key and IV from various parameters. *type* is the cipher to derive the key and IV for. *md* is the message digest to use. The *salt* parameter is used as a salt in the derivation: it should point to a buffer containing PKCS5\_SALT\_LEN = 8 bytes or NULL if no salt is used. *data* is a buffer containing *datal* bytes which is used to derive the keying data. *count* is the iteration count to use. The derived key and IV will be written to *key* and *iv*, respectively.

A typical application of this function is to derive keying material for an encryption algorithm from a password in the *data* parameter.

Increasing the *count* parameter slows down the algorithm, which makes it harder for an attacker to perform a brute force attack using a large number of candidate passwords.

If the total key and IV length is less than the digest length and MD5 is used, then the derivation algorithm is compatible with PKCS#5 v1.5. Otherwise, a non-standard extension is used to derive the extra data.

Newer applications should use more standard algorithms such as PBKDF2 as defined in PKCS#5v2.1 for key derivation.

## KEY DERIVATION ALGORITHM

The key and IV is derived by concatenating D\_1, D\_2, etc. until enough data is available for the key and IV. D\_i is defined recursively as:

```
D_i = HASH^count(D_(i-1) || data || salt)
```

where \|\| denotes concatenation, D\_0 is empty, HASH is the digest algorithm in use, HASH^1(data) is simply HASH(data), HASH^2(data) is HASH(HASH(data)) and so on.

The initial bytes are used for the key and the subsequent bytes for the IV.

## RETURN VALUES

If *data* is NULL, **EVP\_BytesToKey**() returns the number of bytes needed to store the derived key. Otherwise, **EVP\_BytesToKey**() returns the size of the derived key in bytes or 0 on error.

## SEE ALSO

evp(3), EVP\_EncryptInit(3), PKCS5\_PBKDF2\_HMAC(3)

## HISTORY

**EVP\_BytesToKey**() first appeared in SSLeay 0.5.1 and has been available since OpenBSD 2.4.
