diff options
Diffstat (limited to 'include/linux/sunrpc/gss_krb5.h')
| -rw-r--r-- | include/linux/sunrpc/gss_krb5.h | 184 |
1 files changed, 178 insertions, 6 deletions
diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h index e7bbdba474d5..5af2931cf58d 100644 --- a/include/linux/sunrpc/gss_krb5.h +++ b/include/linux/sunrpc/gss_krb5.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Adapted from MIT Kerberos 5-1.2.1 lib/include/krb5.h, | 4 | * Adapted from MIT Kerberos 5-1.2.1 lib/include/krb5.h, |
| 5 | * lib/gssapi/krb5/gssapiP_krb5.h, and others | 5 | * lib/gssapi/krb5/gssapiP_krb5.h, and others |
| 6 | * | 6 | * |
| 7 | * Copyright (c) 2000 The Regents of the University of Michigan. | 7 | * Copyright (c) 2000-2008 The Regents of the University of Michigan. |
| 8 | * All rights reserved. | 8 | * All rights reserved. |
| 9 | * | 9 | * |
| 10 | * Andy Adamson <andros@umich.edu> | 10 | * Andy Adamson <andros@umich.edu> |
| @@ -36,17 +36,86 @@ | |||
| 36 | * | 36 | * |
| 37 | */ | 37 | */ |
| 38 | 38 | ||
| 39 | #include <linux/crypto.h> | ||
| 39 | #include <linux/sunrpc/auth_gss.h> | 40 | #include <linux/sunrpc/auth_gss.h> |
| 40 | #include <linux/sunrpc/gss_err.h> | 41 | #include <linux/sunrpc/gss_err.h> |
| 41 | #include <linux/sunrpc/gss_asn1.h> | 42 | #include <linux/sunrpc/gss_asn1.h> |
| 42 | 43 | ||
| 44 | /* Length of constant used in key derivation */ | ||
| 45 | #define GSS_KRB5_K5CLENGTH (5) | ||
| 46 | |||
| 47 | /* Maximum key length (in bytes) for the supported crypto algorithms*/ | ||
| 48 | #define GSS_KRB5_MAX_KEYLEN (32) | ||
| 49 | |||
| 50 | /* Maximum checksum function output for the supported crypto algorithms */ | ||
| 51 | #define GSS_KRB5_MAX_CKSUM_LEN (20) | ||
| 52 | |||
| 53 | /* Maximum blocksize for the supported crypto algorithms */ | ||
| 54 | #define GSS_KRB5_MAX_BLOCKSIZE (16) | ||
| 55 | |||
| 56 | struct krb5_ctx; | ||
| 57 | |||
| 58 | struct gss_krb5_enctype { | ||
| 59 | const u32 etype; /* encryption (key) type */ | ||
| 60 | const u32 ctype; /* checksum type */ | ||
| 61 | const char *name; /* "friendly" name */ | ||
| 62 | const char *encrypt_name; /* crypto encrypt name */ | ||
| 63 | const char *cksum_name; /* crypto checksum name */ | ||
| 64 | const u16 signalg; /* signing algorithm */ | ||
| 65 | const u16 sealalg; /* sealing algorithm */ | ||
| 66 | const u32 blocksize; /* encryption blocksize */ | ||
| 67 | const u32 conflen; /* confounder length | ||
| 68 | (normally the same as | ||
| 69 | the blocksize) */ | ||
| 70 | const u32 cksumlength; /* checksum length */ | ||
| 71 | const u32 keyed_cksum; /* is it a keyed cksum? */ | ||
| 72 | const u32 keybytes; /* raw key len, in bytes */ | ||
| 73 | const u32 keylength; /* final key len, in bytes */ | ||
| 74 | u32 (*encrypt) (struct crypto_blkcipher *tfm, | ||
| 75 | void *iv, void *in, void *out, | ||
| 76 | int length); /* encryption function */ | ||
| 77 | u32 (*decrypt) (struct crypto_blkcipher *tfm, | ||
| 78 | void *iv, void *in, void *out, | ||
| 79 | int length); /* decryption function */ | ||
| 80 | u32 (*mk_key) (const struct gss_krb5_enctype *gk5e, | ||
| 81 | struct xdr_netobj *in, | ||
| 82 | struct xdr_netobj *out); /* complete key generation */ | ||
| 83 | u32 (*encrypt_v2) (struct krb5_ctx *kctx, u32 offset, | ||
| 84 | struct xdr_buf *buf, int ec, | ||
| 85 | struct page **pages); /* v2 encryption function */ | ||
| 86 | u32 (*decrypt_v2) (struct krb5_ctx *kctx, u32 offset, | ||
| 87 | struct xdr_buf *buf, u32 *headskip, | ||
| 88 | u32 *tailskip); /* v2 decryption function */ | ||
| 89 | }; | ||
| 90 | |||
| 91 | /* krb5_ctx flags definitions */ | ||
| 92 | #define KRB5_CTX_FLAG_INITIATOR 0x00000001 | ||
| 93 | #define KRB5_CTX_FLAG_CFX 0x00000002 | ||
| 94 | #define KRB5_CTX_FLAG_ACCEPTOR_SUBKEY 0x00000004 | ||
| 95 | |||
| 43 | struct krb5_ctx { | 96 | struct krb5_ctx { |
| 44 | int initiate; /* 1 = initiating, 0 = accepting */ | 97 | int initiate; /* 1 = initiating, 0 = accepting */ |
| 98 | u32 enctype; | ||
| 99 | u32 flags; | ||
| 100 | const struct gss_krb5_enctype *gk5e; /* enctype-specific info */ | ||
| 45 | struct crypto_blkcipher *enc; | 101 | struct crypto_blkcipher *enc; |
| 46 | struct crypto_blkcipher *seq; | 102 | struct crypto_blkcipher *seq; |
| 103 | struct crypto_blkcipher *acceptor_enc; | ||
| 104 | struct crypto_blkcipher *initiator_enc; | ||
| 105 | struct crypto_blkcipher *acceptor_enc_aux; | ||
| 106 | struct crypto_blkcipher *initiator_enc_aux; | ||
| 107 | u8 Ksess[GSS_KRB5_MAX_KEYLEN]; /* session key */ | ||
| 108 | u8 cksum[GSS_KRB5_MAX_KEYLEN]; | ||
| 47 | s32 endtime; | 109 | s32 endtime; |
| 48 | u32 seq_send; | 110 | u32 seq_send; |
| 111 | u64 seq_send64; | ||
| 49 | struct xdr_netobj mech_used; | 112 | struct xdr_netobj mech_used; |
| 113 | u8 initiator_sign[GSS_KRB5_MAX_KEYLEN]; | ||
| 114 | u8 acceptor_sign[GSS_KRB5_MAX_KEYLEN]; | ||
| 115 | u8 initiator_seal[GSS_KRB5_MAX_KEYLEN]; | ||
| 116 | u8 acceptor_seal[GSS_KRB5_MAX_KEYLEN]; | ||
| 117 | u8 initiator_integ[GSS_KRB5_MAX_KEYLEN]; | ||
| 118 | u8 acceptor_integ[GSS_KRB5_MAX_KEYLEN]; | ||
| 50 | }; | 119 | }; |
| 51 | 120 | ||
| 52 | extern spinlock_t krb5_seq_lock; | 121 | extern spinlock_t krb5_seq_lock; |
| @@ -57,6 +126,18 @@ extern spinlock_t krb5_seq_lock; | |||
| 57 | #define KG_TOK_MIC_MSG 0x0101 | 126 | #define KG_TOK_MIC_MSG 0x0101 |
| 58 | #define KG_TOK_WRAP_MSG 0x0201 | 127 | #define KG_TOK_WRAP_MSG 0x0201 |
| 59 | 128 | ||
| 129 | #define KG2_TOK_INITIAL 0x0101 | ||
| 130 | #define KG2_TOK_RESPONSE 0x0202 | ||
| 131 | #define KG2_TOK_MIC 0x0404 | ||
| 132 | #define KG2_TOK_WRAP 0x0504 | ||
| 133 | |||
| 134 | #define KG2_TOKEN_FLAG_SENTBYACCEPTOR 0x01 | ||
| 135 | #define KG2_TOKEN_FLAG_SEALED 0x02 | ||
| 136 | #define KG2_TOKEN_FLAG_ACCEPTORSUBKEY 0x04 | ||
| 137 | |||
| 138 | #define KG2_RESP_FLAG_ERROR 0x0001 | ||
| 139 | #define KG2_RESP_FLAG_DELEG_OK 0x0002 | ||
| 140 | |||
| 60 | enum sgn_alg { | 141 | enum sgn_alg { |
| 61 | SGN_ALG_DES_MAC_MD5 = 0x0000, | 142 | SGN_ALG_DES_MAC_MD5 = 0x0000, |
| 62 | SGN_ALG_MD2_5 = 0x0001, | 143 | SGN_ALG_MD2_5 = 0x0001, |
| @@ -81,6 +162,9 @@ enum seal_alg { | |||
| 81 | #define CKSUMTYPE_RSA_MD5_DES 0x0008 | 162 | #define CKSUMTYPE_RSA_MD5_DES 0x0008 |
| 82 | #define CKSUMTYPE_NIST_SHA 0x0009 | 163 | #define CKSUMTYPE_NIST_SHA 0x0009 |
| 83 | #define CKSUMTYPE_HMAC_SHA1_DES3 0x000c | 164 | #define CKSUMTYPE_HMAC_SHA1_DES3 0x000c |
| 165 | #define CKSUMTYPE_HMAC_SHA1_96_AES128 0x000f | ||
| 166 | #define CKSUMTYPE_HMAC_SHA1_96_AES256 0x0010 | ||
| 167 | #define CKSUMTYPE_HMAC_MD5_ARCFOUR -138 /* Microsoft md5 hmac cksumtype */ | ||
| 84 | 168 | ||
| 85 | /* from gssapi_err_krb5.h */ | 169 | /* from gssapi_err_krb5.h */ |
| 86 | #define KG_CCACHE_NOMATCH (39756032L) | 170 | #define KG_CCACHE_NOMATCH (39756032L) |
| @@ -111,11 +195,56 @@ enum seal_alg { | |||
| 111 | #define ENCTYPE_DES3_CBC_RAW 0x0006 /* DES-3 cbc mode raw */ | 195 | #define ENCTYPE_DES3_CBC_RAW 0x0006 /* DES-3 cbc mode raw */ |
| 112 | #define ENCTYPE_DES_HMAC_SHA1 0x0008 | 196 | #define ENCTYPE_DES_HMAC_SHA1 0x0008 |
| 113 | #define ENCTYPE_DES3_CBC_SHA1 0x0010 | 197 | #define ENCTYPE_DES3_CBC_SHA1 0x0010 |
| 198 | #define ENCTYPE_AES128_CTS_HMAC_SHA1_96 0x0011 | ||
| 199 | #define ENCTYPE_AES256_CTS_HMAC_SHA1_96 0x0012 | ||
| 200 | #define ENCTYPE_ARCFOUR_HMAC 0x0017 | ||
| 201 | #define ENCTYPE_ARCFOUR_HMAC_EXP 0x0018 | ||
| 114 | #define ENCTYPE_UNKNOWN 0x01ff | 202 | #define ENCTYPE_UNKNOWN 0x01ff |
| 115 | 203 | ||
| 116 | s32 | 204 | /* |
| 117 | make_checksum(char *, char *header, int hdrlen, struct xdr_buf *body, | 205 | * Constants used for key derivation |
| 118 | int body_offset, struct xdr_netobj *cksum); | 206 | */ |
| 207 | /* for 3DES */ | ||
| 208 | #define KG_USAGE_SEAL (22) | ||
| 209 | #define KG_USAGE_SIGN (23) | ||
| 210 | #define KG_USAGE_SEQ (24) | ||
| 211 | |||
| 212 | /* from rfc3961 */ | ||
| 213 | #define KEY_USAGE_SEED_CHECKSUM (0x99) | ||
| 214 | #define KEY_USAGE_SEED_ENCRYPTION (0xAA) | ||
| 215 | #define KEY_USAGE_SEED_INTEGRITY (0x55) | ||
| 216 | |||
| 217 | /* from rfc4121 */ | ||
| 218 | #define KG_USAGE_ACCEPTOR_SEAL (22) | ||
| 219 | #define KG_USAGE_ACCEPTOR_SIGN (23) | ||
| 220 | #define KG_USAGE_INITIATOR_SEAL (24) | ||
| 221 | #define KG_USAGE_INITIATOR_SIGN (25) | ||
| 222 | |||
| 223 | /* | ||
| 224 | * This compile-time check verifies that we will not exceed the | ||
| 225 | * slack space allotted by the client and server auth_gss code | ||
| 226 | * before they call gss_wrap(). | ||
| 227 | */ | ||
| 228 | #define GSS_KRB5_MAX_SLACK_NEEDED \ | ||
| 229 | (GSS_KRB5_TOK_HDR_LEN /* gss token header */ \ | ||
| 230 | + GSS_KRB5_MAX_CKSUM_LEN /* gss token checksum */ \ | ||
| 231 | + GSS_KRB5_MAX_BLOCKSIZE /* confounder */ \ | ||
| 232 | + GSS_KRB5_MAX_BLOCKSIZE /* possible padding */ \ | ||
| 233 | + GSS_KRB5_TOK_HDR_LEN /* encrypted hdr in v2 token */\ | ||
| 234 | + GSS_KRB5_MAX_CKSUM_LEN /* encryption hmac */ \ | ||
| 235 | + 4 + 4 /* RPC verifier */ \ | ||
| 236 | + GSS_KRB5_TOK_HDR_LEN \ | ||
| 237 | + GSS_KRB5_MAX_CKSUM_LEN) | ||
| 238 | |||
| 239 | u32 | ||
| 240 | make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen, | ||
| 241 | struct xdr_buf *body, int body_offset, u8 *cksumkey, | ||
| 242 | unsigned int usage, struct xdr_netobj *cksumout); | ||
| 243 | |||
| 244 | u32 | ||
| 245 | make_checksum_v2(struct krb5_ctx *, char *header, int hdrlen, | ||
| 246 | struct xdr_buf *body, int body_offset, u8 *key, | ||
| 247 | unsigned int usage, struct xdr_netobj *cksum); | ||
| 119 | 248 | ||
| 120 | u32 gss_get_mic_kerberos(struct gss_ctx *, struct xdr_buf *, | 249 | u32 gss_get_mic_kerberos(struct gss_ctx *, struct xdr_buf *, |
| 121 | struct xdr_netobj *); | 250 | struct xdr_netobj *); |
| @@ -149,11 +278,54 @@ gss_decrypt_xdr_buf(struct crypto_blkcipher *tfm, struct xdr_buf *inbuf, | |||
| 149 | int offset); | 278 | int offset); |
| 150 | 279 | ||
| 151 | s32 | 280 | s32 |
| 152 | krb5_make_seq_num(struct crypto_blkcipher *key, | 281 | krb5_make_seq_num(struct krb5_ctx *kctx, |
| 282 | struct crypto_blkcipher *key, | ||
| 153 | int direction, | 283 | int direction, |
| 154 | u32 seqnum, unsigned char *cksum, unsigned char *buf); | 284 | u32 seqnum, unsigned char *cksum, unsigned char *buf); |
| 155 | 285 | ||
| 156 | s32 | 286 | s32 |
| 157 | krb5_get_seq_num(struct crypto_blkcipher *key, | 287 | krb5_get_seq_num(struct krb5_ctx *kctx, |
| 158 | unsigned char *cksum, | 288 | unsigned char *cksum, |
| 159 | unsigned char *buf, int *direction, u32 *seqnum); | 289 | unsigned char *buf, int *direction, u32 *seqnum); |
| 290 | |||
| 291 | int | ||
| 292 | xdr_extend_head(struct xdr_buf *buf, unsigned int base, unsigned int shiftlen); | ||
| 293 | |||
| 294 | u32 | ||
| 295 | krb5_derive_key(const struct gss_krb5_enctype *gk5e, | ||
| 296 | const struct xdr_netobj *inkey, | ||
| 297 | struct xdr_netobj *outkey, | ||
| 298 | const struct xdr_netobj *in_constant, | ||
| 299 | gfp_t gfp_mask); | ||
| 300 | |||
| 301 | u32 | ||
| 302 | gss_krb5_des3_make_key(const struct gss_krb5_enctype *gk5e, | ||
| 303 | struct xdr_netobj *randombits, | ||
| 304 | struct xdr_netobj *key); | ||
| 305 | |||
| 306 | u32 | ||
| 307 | gss_krb5_aes_make_key(const struct gss_krb5_enctype *gk5e, | ||
| 308 | struct xdr_netobj *randombits, | ||
| 309 | struct xdr_netobj *key); | ||
| 310 | |||
| 311 | u32 | ||
| 312 | gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset, | ||
| 313 | struct xdr_buf *buf, int ec, | ||
| 314 | struct page **pages); | ||
| 315 | |||
| 316 | u32 | ||
| 317 | gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, | ||
| 318 | struct xdr_buf *buf, u32 *plainoffset, | ||
| 319 | u32 *plainlen); | ||
| 320 | |||
| 321 | int | ||
| 322 | krb5_rc4_setup_seq_key(struct krb5_ctx *kctx, | ||
| 323 | struct crypto_blkcipher *cipher, | ||
| 324 | unsigned char *cksum); | ||
| 325 | |||
| 326 | int | ||
| 327 | krb5_rc4_setup_enc_key(struct krb5_ctx *kctx, | ||
| 328 | struct crypto_blkcipher *cipher, | ||
| 329 | s32 seqnum); | ||
| 330 | void | ||
| 331 | gss_krb5_make_confounder(char *p, u32 conflen); | ||
