EVP_KDF-KRB5KDF(7SSL)

πŸ’– EVP_KDF-KRB5KDF(7SSL) β€” bestie edition

okay so ✨ this is the manpage for EVP_KDF-KRB5KDF (yes that's the whole name, it's giving Very Specific) and it's part of the OpenSSL crew. Strap in, we're deriving keys πŸ’…


πŸŽ€ NAME

EVP_KDF-KRB5KDF β€” the RFC3961 Krb5 KDF EVP_KDF implementation, i.e. the little guy that knows how to do the Krb5 key derivation thing πŸ¦‹


✨ DESCRIPTION

It's support for computing the KRB5KDF KDF through the EVP_KDF API. No cap.

The EVP_KDF-KRB5KDF algorithm implements the key derivation function defined in RFC 3961, section 5.1, and Krb5 uses it to derive session keys. To do the derivation you need three inputs, and bestie you cannot skip any of them:

  • a cipher (for example AES-128-CBC),
  • the initial key,
  • and a constant.

🌸 Identity

"KRB5KDF" is the name for this implementation πŸ’– it's what you hand to the EVP_KDF_fetch() function when you want it.

🫢 Supported parameters

Here's the roster, the whole roster, nobody left out:

  • "properties" (OSSL_KDF_PARAM_PROPERTIES) <UTF8 string>
  • "cipher" (OSSL_KDF_PARAM_CIPHER) <UTF8 string>
  • "key" (OSSL_KDF_PARAM_KEY) <octet string>

These three literally just work as described in "PARAMETERS" in EVP_KDF(3). Go look there, they said it better, iykyk.

  • "constant" (OSSL_KDF_PARAM_CONSTANT) <octet string> β€” this one sets the constant value for the KDF. And heads up: if a value is already set, the contents get replaced. Not appended, not merged, replaced. periodt. πŸ”₯

πŸ¦‹ NOTES

Wanna get yourself a context for KRB5KDF? You do it like this:

EVP_KDF *kdf = EVP_KDF_fetch(NULL, "KRB5KDF", NULL);
EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf);

The output length of the KRB5KDF derivation is specified via the keylen parameter to the EVP_KDF_derive(3) function, and it MUST match the key length for the chosen cipher or an error is returned. Like, MUST must. 😭

Also, the constant's length must not exceed the block size of the cipher. Respect the block size bestie.

And here's the sneaky part πŸ‘‘ since the KRB5KDF output length depends on the chosen cipher, calling EVP_KDF_CTX_get_kdf_size(3) to obtain the requisite length returns the correct length only after the cipher is set. Before that, it just returns EVP_MAX_KEY_LENGTH. So:

The caller must allocate a buffer of the correct length for the chosen cipher, and pass that buffer to the EVP_KDF_derive(3) function along with that length. ✨

πŸ’œ EXAMPLES

This example derives a key using the AES-128-CBC cipher β€” look at it go:

EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char key[16] = "01234...";
unsigned char constant[] = "I'm a constant";
unsigned char out[16];
size_t outlen = sizeof(out);
OSSL_PARAM params[4], *p = params;

kdf = EVP_KDF_fetch(NULL, "KRB5KDF", NULL);
kctx = EVP_KDF_CTX_new(kdf);
EVP_KDF_free(kdf);

*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CIPHER,
                                        SN_aes_128_cbc,
                                        strlen(SN_aes_128_cbc));
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
                                         key, (size_t)16);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_CONSTANT,
                                         constant, strlen(constant));
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, outlen, params) <= 0)
    /* Error */

EVP_KDF_CTX_free(kctx);

πŸ‘‘ CONFORMING TO

RFC 3961 β€” she follows the rules, she's a good girl πŸŽ€


🌈 SEE ALSO


⭐ HISTORY

This functionality was added in OpenSSL 3.0. Glow up era. οΏ½οΏ½


Copyright 2016-2021 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. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.


and that's the whole vibe check, bestie 🫢 this was 4.0.3, dated 2026-09-29, straight from the OpenSSL girls β€” go derive something iconic πŸ’–βœ¨πŸŒΈ

πŸ“¦ where this page comes from