Commit 3936f02b authored by David Howells's avatar David Howells
Browse files

crypto/krb5: Implement Kerberos crypto core



Provide core structures, an encoding-type registry and basic module and
config bits for a generic Kerberos crypto library.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Herbert Xu <herbert@gondor.apana.org.au>
cc: "David S. Miller" <davem@davemloft.net>
cc: Chuck Lever <chuck.lever@oracle.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Eric Dumazet <edumazet@google.com>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
cc: linux-nfs@vger.kernel.org
cc: linux-crypto@vger.kernel.org
cc: netdev@vger.kernel.org
parent 1b80b6f4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1472,5 +1472,6 @@ endif
source "drivers/crypto/Kconfig"
source "crypto/asymmetric_keys/Kconfig"
source "certs/Kconfig"
source "crypto/krb5/Kconfig"

endif	# if CRYPTO
+2 −0
Original line number Diff line number Diff line
@@ -213,3 +213,5 @@ obj-$(CONFIG_CRYPTO_SIMD) += crypto_simd.o
# Key derivation function
#
obj-$(CONFIG_CRYPTO_KDF800108_CTR) += kdf_sp800108.o

obj-$(CONFIG_CRYPTO_KRB5) += krb5/

crypto/krb5/Kconfig

0 → 100644
+14 −0
Original line number Diff line number Diff line
config CRYPTO_KRB5
	tristate "Kerberos 5 crypto"
	select CRYPTO_MANAGER
	select CRYPTO_KRB5ENC
	select CRYPTO_AUTHENC
	select CRYPTO_SKCIPHER
	select CRYPTO_HASH_INFO
	select CRYPTO_SHA1
	select CRYPTO_CBC
	select CRYPTO_CTS
	select CRYPTO_AES
	help
	  Provide a library for provision of Kerberos-5-based crypto.  This is
	  intended for network filesystems to use.

crypto/krb5/Makefile

0 → 100644
+9 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for asymmetric cryptographic keys
#

krb5-y += \
	krb5_api.o

obj-$(CONFIG_CRYPTO_KRB5) += krb5.o

crypto/krb5/internal.h

0 → 100644
+112 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Kerberos5 crypto internals
 *
 * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 */

#include <crypto/krb5.h>

/*
 * Profile used for key derivation and encryption.
 */
struct krb5_crypto_profile {
	 /* Pseudo-random function */
	int (*calc_PRF)(const struct krb5_enctype *krb5,
			const struct krb5_buffer *protocol_key,
			const struct krb5_buffer *octet_string,
			struct krb5_buffer *result,
			gfp_t gfp);

	/* Checksum key derivation */
	int (*calc_Kc)(const struct krb5_enctype *krb5,
		       const struct krb5_buffer *TK,
		       const struct krb5_buffer *usage_constant,
		       struct krb5_buffer *Kc,
		       gfp_t gfp);

	/* Encryption key derivation */
	int (*calc_Ke)(const struct krb5_enctype *krb5,
		       const struct krb5_buffer *TK,
		       const struct krb5_buffer *usage_constant,
		       struct krb5_buffer *Ke,
		       gfp_t gfp);

	 /* Integrity key derivation */
	int (*calc_Ki)(const struct krb5_enctype *krb5,
		       const struct krb5_buffer *TK,
		       const struct krb5_buffer *usage_constant,
		       struct krb5_buffer *Ki,
		       gfp_t gfp);

	/* Derive the keys needed for an encryption AEAD object. */
	int (*derive_encrypt_keys)(const struct krb5_enctype *krb5,
				   const struct krb5_buffer *TK,
				   unsigned int usage,
				   struct krb5_buffer *setkey,
				   gfp_t gfp);

	/* Directly load the keys needed for an encryption AEAD object. */
	int (*load_encrypt_keys)(const struct krb5_enctype *krb5,
				 const struct krb5_buffer *Ke,
				 const struct krb5_buffer *Ki,
				 struct krb5_buffer *setkey,
				 gfp_t gfp);

	/* Derive the key needed for a checksum hash object. */
	int (*derive_checksum_key)(const struct krb5_enctype *krb5,
				   const struct krb5_buffer *TK,
				   unsigned int usage,
				   struct krb5_buffer *setkey,
				   gfp_t gfp);

	/* Directly load the keys needed for a checksum hash object. */
	int (*load_checksum_key)(const struct krb5_enctype *krb5,
				 const struct krb5_buffer *Kc,
				 struct krb5_buffer *setkey,
				 gfp_t gfp);

	/* Encrypt data in-place, inserting confounder and checksum. */
	ssize_t (*encrypt)(const struct krb5_enctype *krb5,
			   struct crypto_aead *aead,
			   struct scatterlist *sg, unsigned int nr_sg,
			   size_t sg_len,
			   size_t data_offset, size_t data_len,
			   bool preconfounded);

	/* Decrypt data in-place, removing confounder and checksum */
	int (*decrypt)(const struct krb5_enctype *krb5,
		       struct crypto_aead *aead,
		       struct scatterlist *sg, unsigned int nr_sg,
		       size_t *_offset, size_t *_len);

	/* Generate a MIC on part of a packet, inserting the checksum */
	ssize_t (*get_mic)(const struct krb5_enctype *krb5,
			   struct crypto_shash *shash,
			   const struct krb5_buffer *metadata,
			   struct scatterlist *sg, unsigned int nr_sg,
			   size_t sg_len,
			   size_t data_offset, size_t data_len);

	/* Verify the MIC on a piece of data, removing the checksum */
	int (*verify_mic)(const struct krb5_enctype *krb5,
			  struct crypto_shash *shash,
			  const struct krb5_buffer *metadata,
			  struct scatterlist *sg, unsigned int nr_sg,
			  size_t *_offset, size_t *_len);
};

/*
 * Crypto size/alignment rounding convenience macros.
 */
#define crypto_roundup(X) ((unsigned int)round_up((X), CRYPTO_MINALIGN))

#define krb5_aead_size(TFM) \
	crypto_roundup(sizeof(struct aead_request) + crypto_aead_reqsize(TFM))
#define krb5_aead_ivsize(TFM) \
	crypto_roundup(crypto_aead_ivsize(TFM))
#define krb5_shash_size(TFM) \
	crypto_roundup(sizeof(struct shash_desc) + crypto_shash_descsize(TFM))
#define krb5_digest_size(TFM) \
	crypto_roundup(crypto_shash_digestsize(TFM))
#define round16(x) (((x) + 15) & ~15)
Loading