1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* Kerberos5 crypto internals 3 * 4 * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 8 #include <linux/scatterlist.h> 9 #include <crypto/krb5.h> 10 11 /* 12 * Profile used for key derivation and encryption. 13 */ 14 struct krb5_crypto_profile { 15 /* Pseudo-random function */ 16 int (*calc_PRF)(const struct krb5_enctype *krb5, 17 const struct krb5_buffer *protocol_key, 18 const struct krb5_buffer *octet_string, 19 struct krb5_buffer *result, 20 gfp_t gfp); 21 22 /* Checksum key derivation */ 23 int (*calc_Kc)(const struct krb5_enctype *krb5, 24 const struct krb5_buffer *TK, 25 const struct krb5_buffer *usage_constant, 26 struct krb5_buffer *Kc, 27 gfp_t gfp); 28 29 /* Encryption key derivation */ 30 int (*calc_Ke)(const struct krb5_enctype *krb5, 31 const struct krb5_buffer *TK, 32 const struct krb5_buffer *usage_constant, 33 struct krb5_buffer *Ke, 34 gfp_t gfp); 35 36 /* Integrity key derivation */ 37 int (*calc_Ki)(const struct krb5_enctype *krb5, 38 const struct krb5_buffer *TK, 39 const struct krb5_buffer *usage_constant, 40 struct krb5_buffer *Ki, 41 gfp_t gfp); 42 43 /* Derive the keys needed for an encryption AEAD object. */ 44 int (*derive_encrypt_keys)(const struct krb5_enctype *krb5, 45 const struct krb5_buffer *TK, 46 unsigned int usage, 47 struct krb5_buffer *setkey, 48 gfp_t gfp); 49 50 /* Directly load the keys needed for an encryption AEAD object. */ 51 int (*load_encrypt_keys)(const struct krb5_enctype *krb5, 52 const struct krb5_buffer *Ke, 53 const struct krb5_buffer *Ki, 54 struct krb5_buffer *setkey, 55 gfp_t gfp); 56 57 /* Derive the key needed for a checksum hash object. */ 58 int (*derive_checksum_key)(const struct krb5_enctype *krb5, 59 const struct krb5_buffer *TK, 60 unsigned int usage, 61 struct krb5_buffer *setkey, 62 gfp_t gfp); 63 64 /* Directly load the keys needed for a checksum hash object. */ 65 int (*load_checksum_key)(const struct krb5_enctype *krb5, 66 const struct krb5_buffer *Kc, 67 struct krb5_buffer *setkey, 68 gfp_t gfp); 69 70 /* Encrypt data in-place, inserting confounder and checksum. */ 71 ssize_t (*encrypt)(const struct krb5_enctype *krb5, 72 struct crypto_aead *aead, 73 struct scatterlist *sg, unsigned int nr_sg, 74 size_t sg_len, 75 size_t data_offset, size_t data_len, 76 bool preconfounded); 77 78 /* Decrypt data in-place, removing confounder and checksum */ 79 int (*decrypt)(const struct krb5_enctype *krb5, 80 struct crypto_aead *aead, 81 struct scatterlist *sg, unsigned int nr_sg, 82 size_t *_offset, size_t *_len); 83 84 /* Generate a MIC on part of a packet, inserting the checksum */ 85 ssize_t (*get_mic)(const struct krb5_enctype *krb5, 86 struct crypto_shash *shash, 87 const struct krb5_buffer *metadata, 88 struct scatterlist *sg, unsigned int nr_sg, 89 size_t sg_len, 90 size_t data_offset, size_t data_len); 91 92 /* Verify the MIC on a piece of data, removing the checksum */ 93 int (*verify_mic)(const struct krb5_enctype *krb5, 94 struct crypto_shash *shash, 95 const struct krb5_buffer *metadata, 96 struct scatterlist *sg, unsigned int nr_sg, 97 size_t *_offset, size_t *_len); 98 }; 99 100 /* 101 * Crypto size/alignment rounding convenience macros. 102 */ 103 #define crypto_roundup(X) ((unsigned int)round_up((X), CRYPTO_MINALIGN)) 104 105 #define krb5_aead_size(TFM) \ 106 crypto_roundup(sizeof(struct aead_request) + crypto_aead_reqsize(TFM)) 107 #define krb5_aead_ivsize(TFM) \ 108 crypto_roundup(crypto_aead_ivsize(TFM)) 109 #define krb5_shash_size(TFM) \ 110 crypto_roundup(sizeof(struct shash_desc) + crypto_shash_descsize(TFM)) 111 #define krb5_digest_size(TFM) \ 112 crypto_roundup(crypto_shash_digestsize(TFM)) 113 #define round16(x) (((x) + 15) & ~15) 114 115 /* 116 * krb5_api.c 117 */ 118 struct crypto_aead *krb5_prepare_encryption(const struct krb5_enctype *krb5, 119 const struct krb5_buffer *keys, 120 gfp_t gfp); 121 struct crypto_shash *krb5_prepare_checksum(const struct krb5_enctype *krb5, 122 const struct krb5_buffer *Kc, 123 gfp_t gfp); 124 125 /* 126 * krb5_kdf.c 127 */ 128 int krb5_derive_Kc(const struct krb5_enctype *krb5, const struct krb5_buffer *TK, 129 u32 usage, struct krb5_buffer *key, gfp_t gfp); 130 int krb5_derive_Ke(const struct krb5_enctype *krb5, const struct krb5_buffer *TK, 131 u32 usage, struct krb5_buffer *key, gfp_t gfp); 132 int krb5_derive_Ki(const struct krb5_enctype *krb5, const struct krb5_buffer *TK, 133 u32 usage, struct krb5_buffer *key, gfp_t gfp); 134 135 /* 136 * rfc3961_simplified.c 137 */ 138 extern const struct krb5_crypto_profile rfc3961_simplified_profile; 139