0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 #include <crypto/skcipher.h>
0040 #include <linux/sunrpc/auth_gss.h>
0041 #include <linux/sunrpc/gss_err.h>
0042 #include <linux/sunrpc/gss_asn1.h>
0043
0044
0045 #define GSS_KRB5_K5CLENGTH (5)
0046
0047
0048 #define GSS_KRB5_MAX_KEYLEN (32)
0049
0050
0051 #define GSS_KRB5_MAX_CKSUM_LEN (20)
0052
0053
0054 #define GSS_KRB5_MAX_BLOCKSIZE (16)
0055
0056 struct krb5_ctx;
0057
0058 struct gss_krb5_enctype {
0059 const u32 etype;
0060 const u32 ctype;
0061 const char *name;
0062 const char *encrypt_name;
0063 const char *cksum_name;
0064 const u16 signalg;
0065 const u16 sealalg;
0066 const u32 blocksize;
0067 const u32 conflen;
0068
0069
0070 const u32 cksumlength;
0071 const u32 keyed_cksum;
0072 const u32 keybytes;
0073 const u32 keylength;
0074 u32 (*encrypt) (struct crypto_sync_skcipher *tfm,
0075 void *iv, void *in, void *out,
0076 int length);
0077 u32 (*decrypt) (struct crypto_sync_skcipher *tfm,
0078 void *iv, void *in, void *out,
0079 int length);
0080 u32 (*mk_key) (const struct gss_krb5_enctype *gk5e,
0081 struct xdr_netobj *in,
0082 struct xdr_netobj *out);
0083 u32 (*encrypt_v2) (struct krb5_ctx *kctx, u32 offset,
0084 struct xdr_buf *buf,
0085 struct page **pages);
0086 u32 (*decrypt_v2) (struct krb5_ctx *kctx, u32 offset, u32 len,
0087 struct xdr_buf *buf, u32 *headskip,
0088 u32 *tailskip);
0089 };
0090
0091
0092 #define KRB5_CTX_FLAG_INITIATOR 0x00000001
0093 #define KRB5_CTX_FLAG_CFX 0x00000002
0094 #define KRB5_CTX_FLAG_ACCEPTOR_SUBKEY 0x00000004
0095
0096 struct krb5_ctx {
0097 int initiate;
0098 u32 enctype;
0099 u32 flags;
0100 const struct gss_krb5_enctype *gk5e;
0101 struct crypto_sync_skcipher *enc;
0102 struct crypto_sync_skcipher *seq;
0103 struct crypto_sync_skcipher *acceptor_enc;
0104 struct crypto_sync_skcipher *initiator_enc;
0105 struct crypto_sync_skcipher *acceptor_enc_aux;
0106 struct crypto_sync_skcipher *initiator_enc_aux;
0107 u8 Ksess[GSS_KRB5_MAX_KEYLEN];
0108 u8 cksum[GSS_KRB5_MAX_KEYLEN];
0109 atomic_t seq_send;
0110 atomic64_t seq_send64;
0111 time64_t endtime;
0112 struct xdr_netobj mech_used;
0113 u8 initiator_sign[GSS_KRB5_MAX_KEYLEN];
0114 u8 acceptor_sign[GSS_KRB5_MAX_KEYLEN];
0115 u8 initiator_seal[GSS_KRB5_MAX_KEYLEN];
0116 u8 acceptor_seal[GSS_KRB5_MAX_KEYLEN];
0117 u8 initiator_integ[GSS_KRB5_MAX_KEYLEN];
0118 u8 acceptor_integ[GSS_KRB5_MAX_KEYLEN];
0119 };
0120
0121
0122 #define GSS_KRB5_TOK_HDR_LEN (16)
0123
0124 #define KG_TOK_MIC_MSG 0x0101
0125 #define KG_TOK_WRAP_MSG 0x0201
0126
0127 #define KG2_TOK_INITIAL 0x0101
0128 #define KG2_TOK_RESPONSE 0x0202
0129 #define KG2_TOK_MIC 0x0404
0130 #define KG2_TOK_WRAP 0x0504
0131
0132 #define KG2_TOKEN_FLAG_SENTBYACCEPTOR 0x01
0133 #define KG2_TOKEN_FLAG_SEALED 0x02
0134 #define KG2_TOKEN_FLAG_ACCEPTORSUBKEY 0x04
0135
0136 #define KG2_RESP_FLAG_ERROR 0x0001
0137 #define KG2_RESP_FLAG_DELEG_OK 0x0002
0138
0139 enum sgn_alg {
0140 SGN_ALG_DES_MAC_MD5 = 0x0000,
0141 SGN_ALG_MD2_5 = 0x0001,
0142 SGN_ALG_DES_MAC = 0x0002,
0143 SGN_ALG_3 = 0x0003,
0144 SGN_ALG_HMAC_SHA1_DES3_KD = 0x0004
0145 };
0146 enum seal_alg {
0147 SEAL_ALG_NONE = 0xffff,
0148 SEAL_ALG_DES = 0x0000,
0149 SEAL_ALG_1 = 0x0001,
0150 SEAL_ALG_DES3KD = 0x0002
0151 };
0152
0153 #define CKSUMTYPE_CRC32 0x0001
0154 #define CKSUMTYPE_RSA_MD4 0x0002
0155 #define CKSUMTYPE_RSA_MD4_DES 0x0003
0156 #define CKSUMTYPE_DESCBC 0x0004
0157 #define CKSUMTYPE_RSA_MD5 0x0007
0158 #define CKSUMTYPE_RSA_MD5_DES 0x0008
0159 #define CKSUMTYPE_NIST_SHA 0x0009
0160 #define CKSUMTYPE_HMAC_SHA1_DES3 0x000c
0161 #define CKSUMTYPE_HMAC_SHA1_96_AES128 0x000f
0162 #define CKSUMTYPE_HMAC_SHA1_96_AES256 0x0010
0163 #define CKSUMTYPE_HMAC_MD5_ARCFOUR -138
0164
0165
0166 #define KG_CCACHE_NOMATCH (39756032L)
0167 #define KG_KEYTAB_NOMATCH (39756033L)
0168 #define KG_TGT_MISSING (39756034L)
0169 #define KG_NO_SUBKEY (39756035L)
0170 #define KG_CONTEXT_ESTABLISHED (39756036L)
0171 #define KG_BAD_SIGN_TYPE (39756037L)
0172 #define KG_BAD_LENGTH (39756038L)
0173 #define KG_CTX_INCOMPLETE (39756039L)
0174 #define KG_CONTEXT (39756040L)
0175 #define KG_CRED (39756041L)
0176 #define KG_ENC_DESC (39756042L)
0177 #define KG_BAD_SEQ (39756043L)
0178 #define KG_EMPTY_CCACHE (39756044L)
0179 #define KG_NO_CTYPES (39756045L)
0180
0181
0182
0183
0184 #define ENCTYPE_NULL 0x0000
0185 #define ENCTYPE_DES_CBC_CRC 0x0001
0186 #define ENCTYPE_DES_CBC_MD4 0x0002
0187 #define ENCTYPE_DES_CBC_MD5 0x0003
0188 #define ENCTYPE_DES_CBC_RAW 0x0004
0189
0190 #define ENCTYPE_DES3_CBC_SHA 0x0005
0191 #define ENCTYPE_DES3_CBC_RAW 0x0006
0192 #define ENCTYPE_DES_HMAC_SHA1 0x0008
0193 #define ENCTYPE_DES3_CBC_SHA1 0x0010
0194 #define ENCTYPE_AES128_CTS_HMAC_SHA1_96 0x0011
0195 #define ENCTYPE_AES256_CTS_HMAC_SHA1_96 0x0012
0196 #define ENCTYPE_ARCFOUR_HMAC 0x0017
0197 #define ENCTYPE_ARCFOUR_HMAC_EXP 0x0018
0198 #define ENCTYPE_UNKNOWN 0x01ff
0199
0200
0201
0202
0203
0204 #define KG_USAGE_SEAL (22)
0205 #define KG_USAGE_SIGN (23)
0206 #define KG_USAGE_SEQ (24)
0207
0208
0209 #define KEY_USAGE_SEED_CHECKSUM (0x99)
0210 #define KEY_USAGE_SEED_ENCRYPTION (0xAA)
0211 #define KEY_USAGE_SEED_INTEGRITY (0x55)
0212
0213
0214 #define KG_USAGE_ACCEPTOR_SEAL (22)
0215 #define KG_USAGE_ACCEPTOR_SIGN (23)
0216 #define KG_USAGE_INITIATOR_SEAL (24)
0217 #define KG_USAGE_INITIATOR_SIGN (25)
0218
0219
0220
0221
0222
0223
0224 #define GSS_KRB5_MAX_SLACK_NEEDED \
0225 (GSS_KRB5_TOK_HDR_LEN \
0226 + GSS_KRB5_MAX_CKSUM_LEN \
0227 + GSS_KRB5_MAX_BLOCKSIZE \
0228 + GSS_KRB5_MAX_BLOCKSIZE \
0229 + GSS_KRB5_TOK_HDR_LEN \
0230 + GSS_KRB5_MAX_CKSUM_LEN \
0231 + 4 + 4 \
0232 + GSS_KRB5_TOK_HDR_LEN \
0233 + GSS_KRB5_MAX_CKSUM_LEN)
0234
0235 u32
0236 make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen,
0237 struct xdr_buf *body, int body_offset, u8 *cksumkey,
0238 unsigned int usage, struct xdr_netobj *cksumout);
0239
0240 u32
0241 make_checksum_v2(struct krb5_ctx *, char *header, int hdrlen,
0242 struct xdr_buf *body, int body_offset, u8 *key,
0243 unsigned int usage, struct xdr_netobj *cksum);
0244
0245 u32 gss_get_mic_kerberos(struct gss_ctx *, struct xdr_buf *,
0246 struct xdr_netobj *);
0247
0248 u32 gss_verify_mic_kerberos(struct gss_ctx *, struct xdr_buf *,
0249 struct xdr_netobj *);
0250
0251 u32
0252 gss_wrap_kerberos(struct gss_ctx *ctx_id, int offset,
0253 struct xdr_buf *outbuf, struct page **pages);
0254
0255 u32
0256 gss_unwrap_kerberos(struct gss_ctx *ctx_id, int offset, int len,
0257 struct xdr_buf *buf);
0258
0259
0260 u32
0261 krb5_encrypt(struct crypto_sync_skcipher *key,
0262 void *iv, void *in, void *out, int length);
0263
0264 u32
0265 krb5_decrypt(struct crypto_sync_skcipher *key,
0266 void *iv, void *in, void *out, int length);
0267
0268 int
0269 gss_encrypt_xdr_buf(struct crypto_sync_skcipher *tfm, struct xdr_buf *outbuf,
0270 int offset, struct page **pages);
0271
0272 int
0273 gss_decrypt_xdr_buf(struct crypto_sync_skcipher *tfm, struct xdr_buf *inbuf,
0274 int offset);
0275
0276 s32
0277 krb5_make_seq_num(struct krb5_ctx *kctx,
0278 struct crypto_sync_skcipher *key,
0279 int direction,
0280 u32 seqnum, unsigned char *cksum, unsigned char *buf);
0281
0282 s32
0283 krb5_get_seq_num(struct krb5_ctx *kctx,
0284 unsigned char *cksum,
0285 unsigned char *buf, int *direction, u32 *seqnum);
0286
0287 int
0288 xdr_extend_head(struct xdr_buf *buf, unsigned int base, unsigned int shiftlen);
0289
0290 u32
0291 krb5_derive_key(const struct gss_krb5_enctype *gk5e,
0292 const struct xdr_netobj *inkey,
0293 struct xdr_netobj *outkey,
0294 const struct xdr_netobj *in_constant,
0295 gfp_t gfp_mask);
0296
0297 u32
0298 gss_krb5_des3_make_key(const struct gss_krb5_enctype *gk5e,
0299 struct xdr_netobj *randombits,
0300 struct xdr_netobj *key);
0301
0302 u32
0303 gss_krb5_aes_make_key(const struct gss_krb5_enctype *gk5e,
0304 struct xdr_netobj *randombits,
0305 struct xdr_netobj *key);
0306
0307 u32
0308 gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset,
0309 struct xdr_buf *buf,
0310 struct page **pages);
0311
0312 u32
0313 gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, u32 len,
0314 struct xdr_buf *buf, u32 *plainoffset,
0315 u32 *plainlen);
0316
0317 void
0318 gss_krb5_make_confounder(char *p, u32 conflen);