// SPDX-License-Identifier: GPL-2.0-or-later /* Cache manager security. * * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com)
*/
switch (service_id) { /* We don't send CM_SERVICE RPCs, so don't expect a challenge * therefrom.
*/ case FS_SERVICE: case VL_SERVICE: case YFS_FS_SERVICE: case YFS_VL_SERVICE: break; default:
pr_warn("Can't respond to unknown challenge %u:%u",
service_id, security_index); return rxrpc_kernel_reject_challenge(challenge, RX_USER_ABORT, -EPROTO,
afs_abort_unsupported_sec_class);
}
switch (security_index) { #ifdef CONFIG_RXKAD case RXRPC_SECURITY_RXKAD: return rxkad_kernel_respond_to_challenge(challenge); #endif
#ifdef CONFIG_RXGK case RXRPC_SECURITY_RXGK: return rxgk_kernel_respond_to_challenge(challenge, &appdata);
case RXRPC_SECURITY_YFS_RXGK: switch (service_id) { case FS_SERVICE: case YFS_FS_SERVICE:
server = (struct afs_server *)peer_data; if (!server->cm_rxgk_appdata.data) {
mutex_lock(&server->cm_token_lock); if (!server->cm_rxgk_appdata.data)
afs_create_yfs_cm_token(challenge, server);
mutex_unlock(&server->cm_token_lock);
} if (server->cm_rxgk_appdata.data)
appdata = server->cm_rxgk_appdata; break;
} return rxgk_kernel_respond_to_challenge(challenge, &appdata); #endif
while ((oob = rxrpc_kernel_dequeue_oob(net->socket, &type))) { switch (type) { case RXRPC_OOB_CHALLENGE:
afs_respond_to_challenge(oob); break;
}
rxrpc_kernel_free_oob(oob);
}
}
#ifdef CONFIG_RXGK /* * Create a securities keyring for the cache manager and attach a key to it for * the RxGK tokens we want to use to secure the callback connection back from * the fileserver.
*/ int afs_create_token_key(struct afs_net *net, struct socket *socket)
{ conststruct krb5_enctype *krb5; struct key *ring;
key_ref_t key; char K0[32], *desc; int ret;
/* * Create an YFS RxGK GSS token to use as a ticket to the specified fileserver.
*/ staticint afs_create_yfs_cm_token(struct sk_buff *challenge, struct afs_server *server)
{ conststruct krb5_enctype *conn_krb5, *token_krb5; conststruct krb5_buffer *token_key; struct crypto_aead *aead; struct scatterlist sg; struct afs_net *net = server->cell->net; conststruct key *key = net->fs_cm_token_key;
size_t keysize, uuidsize, authsize, toksize, encsize, contsize, adatasize, offset;
__be32 caps[1] = {
[0] = htonl(AFS_CAP_ERROR_TRANSLATION),
};
__be32 *xdr; void *appdata, *K0, *encbase;
u32 enctype; int ret;
if (!key) return -ENOKEY;
/* Assume that the fileserver is happy to use the same encoding type as * we were told to use by the token obtained by the user.
*/
enctype = rxgk_kernel_query_challenge(challenge);
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.