// SPDX-License-Identifier: GPL-2.0-or-later /* RxGK transport key derivation. * * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com)
*/
/* * Constants used to derive the keys and hmacs actually used for doing stuff.
*/ #define RXGK_CLIENT_ENC_PACKET 1026U // 0x402 #define RXGK_CLIENT_MIC_PACKET 1027U // 0x403 #define RXGK_SERVER_ENC_PACKET 1028U // 0x404 #define RXGK_SERVER_MIC_PACKET 1029U // 0x405 #define RXGK_CLIENT_ENC_RESPONSE 1030U // 0x406 #define RXGK_SERVER_ENC_TOKEN 1036U // 0x40c
staticvoid rxgk_free(struct rxgk_context *gk)
{ if (gk->tx_Kc)
crypto_free_shash(gk->tx_Kc); if (gk->rx_Kc)
crypto_free_shash(gk->rx_Kc); if (gk->tx_enc)
crypto_free_aead(gk->tx_enc); if (gk->rx_enc)
crypto_free_aead(gk->rx_enc); if (gk->resp_enc)
crypto_free_aead(gk->resp_enc);
kfree(gk);
}
ret = 0;
out:
kfree_sensitive(buffer); return ret;
aead_error:
ret = PTR_ERR(aead); goto out;
hash_error:
ret = PTR_ERR(shash); goto out;
}
/* * Derive a transport key for a connection and then derive a bunch of usage * keys from it and set up ciphers using them.
*/ struct rxgk_context *rxgk_generate_transport_key(struct rxrpc_connection *conn, conststruct rxgk_key *key, unsignedint key_number,
gfp_t gfp)
{ struct rxgk_context *gk; unsignedlong lifetime; int ret = -ENOPKG;
gk->krb5 = crypto_krb5_find_enctype(key->enctype); if (!gk->krb5) goto err_tk;
ret = rxgk_set_up_ciphers(conn, gk, key, gfp); if (ret) goto err_tk;
/* Set the remaining number of bytes encrypted with this key that may * be transmitted before rekeying. Note that the spec has been * interpreted differently on this point...
*/ switch (key->bytelife) { case 0: case 63:
gk->bytes_remaining = LLONG_MAX; break; case 1 ... 62:
gk->bytes_remaining = 1LL << key->bytelife; break; default:
gk->bytes_remaining = key->bytelife; break;
}
/* Set the time after which rekeying must occur */ if (key->lifetime) {
lifetime = min_t(u64, key->lifetime, INT_MAX / HZ);
lifetime *= HZ;
} else {
lifetime = MAX_JIFFY_OFFSET;
}
gk->expiry = jiffies + lifetime; return gk;
/* * Use the server secret key to set up the ciphers that will be used to extract * the token from a response packet.
*/ int rxgk_set_up_token_cipher(conststruct krb5_buffer *server_key, struct crypto_aead **token_aead, unsignedint enctype, conststruct krb5_enctype **_krb5,
gfp_t gfp)
{ conststruct krb5_enctype *krb5; struct crypto_aead *aead;
krb5 = crypto_krb5_find_enctype(enctype); if (!krb5) return -ENOPKG;
aead = crypto_krb5_prepare_encryption(krb5, server_key, RXGK_SERVER_ENC_TOKEN, gfp); if (IS_ERR(aead)) return PTR_ERR(aead);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.