diff options
-rw-r--r-- | include/linux/sunrpc/gss_krb5.h | 1 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_mech.c | 1 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_seal.c | 20 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_unseal.c | 21 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_wrap.c | 38 |
5 files changed, 69 insertions, 12 deletions
diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h index 31bb8a538bf1..5378e455482c 100644 --- a/include/linux/sunrpc/gss_krb5.h +++ b/include/linux/sunrpc/gss_krb5.h | |||
@@ -48,6 +48,7 @@ | |||
48 | 48 | ||
49 | struct krb5_ctx { | 49 | struct krb5_ctx { |
50 | int initiate; /* 1 = initiating, 0 = accepting */ | 50 | int initiate; /* 1 = initiating, 0 = accepting */ |
51 | u32 enctype; | ||
51 | struct crypto_blkcipher *enc; | 52 | struct crypto_blkcipher *enc; |
52 | struct crypto_blkcipher *seq; | 53 | struct crypto_blkcipher *seq; |
53 | s32 endtime; | 54 | s32 endtime; |
diff --git a/net/sunrpc/auth_gss/gss_krb5_mech.c b/net/sunrpc/auth_gss/gss_krb5_mech.c index 2deb0ed72ff4..0cd940e897ed 100644 --- a/net/sunrpc/auth_gss/gss_krb5_mech.c +++ b/net/sunrpc/auth_gss/gss_krb5_mech.c | |||
@@ -139,6 +139,7 @@ gss_import_sec_context_kerberos(const void *p, | |||
139 | p = simple_get_bytes(p, end, &ctx->initiate, sizeof(ctx->initiate)); | 139 | p = simple_get_bytes(p, end, &ctx->initiate, sizeof(ctx->initiate)); |
140 | if (IS_ERR(p)) | 140 | if (IS_ERR(p)) |
141 | goto out_err_free_ctx; | 141 | goto out_err_free_ctx; |
142 | ctx->enctype = ENCTYPE_DES_CBC_RAW; | ||
142 | /* The downcall format was designed before we completely understood | 143 | /* The downcall format was designed before we completely understood |
143 | * the uses of the context fields; so it includes some stuff we | 144 | * the uses of the context fields; so it includes some stuff we |
144 | * just give some minimal sanity-checking, and some we ignore | 145 | * just give some minimal sanity-checking, and some we ignore |
diff --git a/net/sunrpc/auth_gss/gss_krb5_seal.c b/net/sunrpc/auth_gss/gss_krb5_seal.c index 88fe6e75ed7e..71c2014e7ebf 100644 --- a/net/sunrpc/auth_gss/gss_krb5_seal.c +++ b/net/sunrpc/auth_gss/gss_krb5_seal.c | |||
@@ -70,11 +70,10 @@ | |||
70 | 70 | ||
71 | DEFINE_SPINLOCK(krb5_seq_lock); | 71 | DEFINE_SPINLOCK(krb5_seq_lock); |
72 | 72 | ||
73 | u32 | 73 | static u32 |
74 | gss_get_mic_kerberos(struct gss_ctx *gss_ctx, struct xdr_buf *text, | 74 | gss_get_mic_v1(struct krb5_ctx *ctx, struct xdr_buf *text, |
75 | struct xdr_netobj *token) | 75 | struct xdr_netobj *token) |
76 | { | 76 | { |
77 | struct krb5_ctx *ctx = gss_ctx->internal_ctx_id; | ||
78 | char cksumdata[16]; | 77 | char cksumdata[16]; |
79 | struct xdr_netobj md5cksum = {.len = 0, .data = cksumdata}; | 78 | struct xdr_netobj md5cksum = {.len = 0, .data = cksumdata}; |
80 | unsigned char *ptr, *msg_start; | 79 | unsigned char *ptr, *msg_start; |
@@ -120,3 +119,18 @@ gss_get_mic_kerberos(struct gss_ctx *gss_ctx, struct xdr_buf *text, | |||
120 | 119 | ||
121 | return (ctx->endtime < now) ? GSS_S_CONTEXT_EXPIRED : GSS_S_COMPLETE; | 120 | return (ctx->endtime < now) ? GSS_S_CONTEXT_EXPIRED : GSS_S_COMPLETE; |
122 | } | 121 | } |
122 | |||
123 | u32 | ||
124 | gss_get_mic_kerberos(struct gss_ctx *gss_ctx, struct xdr_buf *text, | ||
125 | struct xdr_netobj *token) | ||
126 | { | ||
127 | struct krb5_ctx *ctx = gss_ctx->internal_ctx_id; | ||
128 | |||
129 | switch (ctx->enctype) { | ||
130 | default: | ||
131 | BUG(); | ||
132 | case ENCTYPE_DES_CBC_RAW: | ||
133 | return gss_get_mic_v1(ctx, text, token); | ||
134 | } | ||
135 | } | ||
136 | |||
diff --git a/net/sunrpc/auth_gss/gss_krb5_unseal.c b/net/sunrpc/auth_gss/gss_krb5_unseal.c index ce6c247edad0..069d4b59807a 100644 --- a/net/sunrpc/auth_gss/gss_krb5_unseal.c +++ b/net/sunrpc/auth_gss/gss_krb5_unseal.c | |||
@@ -70,11 +70,10 @@ | |||
70 | /* read_token is a mic token, and message_buffer is the data that the mic was | 70 | /* read_token is a mic token, and message_buffer is the data that the mic was |
71 | * supposedly taken over. */ | 71 | * supposedly taken over. */ |
72 | 72 | ||
73 | u32 | 73 | static u32 |
74 | gss_verify_mic_kerberos(struct gss_ctx *gss_ctx, | 74 | gss_verify_mic_v1(struct krb5_ctx *ctx, |
75 | struct xdr_buf *message_buffer, struct xdr_netobj *read_token) | 75 | struct xdr_buf *message_buffer, struct xdr_netobj *read_token) |
76 | { | 76 | { |
77 | struct krb5_ctx *ctx = gss_ctx->internal_ctx_id; | ||
78 | int signalg; | 77 | int signalg; |
79 | int sealalg; | 78 | int sealalg; |
80 | char cksumdata[16]; | 79 | char cksumdata[16]; |
@@ -135,3 +134,19 @@ gss_verify_mic_kerberos(struct gss_ctx *gss_ctx, | |||
135 | 134 | ||
136 | return GSS_S_COMPLETE; | 135 | return GSS_S_COMPLETE; |
137 | } | 136 | } |
137 | |||
138 | u32 | ||
139 | gss_verify_mic_kerberos(struct gss_ctx *gss_ctx, | ||
140 | struct xdr_buf *message_buffer, | ||
141 | struct xdr_netobj *read_token) | ||
142 | { | ||
143 | struct krb5_ctx *ctx = gss_ctx->internal_ctx_id; | ||
144 | |||
145 | switch (ctx->enctype) { | ||
146 | default: | ||
147 | BUG(); | ||
148 | case ENCTYPE_DES_CBC_RAW: | ||
149 | return gss_verify_mic_v1(ctx, message_buffer, read_token); | ||
150 | } | ||
151 | } | ||
152 | |||
diff --git a/net/sunrpc/auth_gss/gss_krb5_wrap.c b/net/sunrpc/auth_gss/gss_krb5_wrap.c index 5d6c3b12ea70..b45b59b17ae1 100644 --- a/net/sunrpc/auth_gss/gss_krb5_wrap.c +++ b/net/sunrpc/auth_gss/gss_krb5_wrap.c | |||
@@ -124,11 +124,10 @@ make_confounder(char *p, u32 conflen) | |||
124 | 124 | ||
125 | /* XXX factor out common code with seal/unseal. */ | 125 | /* XXX factor out common code with seal/unseal. */ |
126 | 126 | ||
127 | u32 | 127 | static u32 |
128 | gss_wrap_kerberos(struct gss_ctx *ctx, int offset, | 128 | gss_wrap_kerberos_v1(struct krb5_ctx *kctx, int offset, |
129 | struct xdr_buf *buf, struct page **pages) | 129 | struct xdr_buf *buf, struct page **pages) |
130 | { | 130 | { |
131 | struct krb5_ctx *kctx = ctx->internal_ctx_id; | ||
132 | char cksumdata[16]; | 131 | char cksumdata[16]; |
133 | struct xdr_netobj md5cksum = {.len = 0, .data = cksumdata}; | 132 | struct xdr_netobj md5cksum = {.len = 0, .data = cksumdata}; |
134 | int blocksize = 0, plainlen; | 133 | int blocksize = 0, plainlen; |
@@ -203,10 +202,9 @@ gss_wrap_kerberos(struct gss_ctx *ctx, int offset, | |||
203 | return (kctx->endtime < now) ? GSS_S_CONTEXT_EXPIRED : GSS_S_COMPLETE; | 202 | return (kctx->endtime < now) ? GSS_S_CONTEXT_EXPIRED : GSS_S_COMPLETE; |
204 | } | 203 | } |
205 | 204 | ||
206 | u32 | 205 | static u32 |
207 | gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf) | 206 | gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) |
208 | { | 207 | { |
209 | struct krb5_ctx *kctx = ctx->internal_ctx_id; | ||
210 | int signalg; | 208 | int signalg; |
211 | int sealalg; | 209 | int sealalg; |
212 | char cksumdata[16]; | 210 | char cksumdata[16]; |
@@ -294,3 +292,31 @@ gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf) | |||
294 | 292 | ||
295 | return GSS_S_COMPLETE; | 293 | return GSS_S_COMPLETE; |
296 | } | 294 | } |
295 | |||
296 | u32 | ||
297 | gss_wrap_kerberos(struct gss_ctx *gctx, int offset, | ||
298 | struct xdr_buf *buf, struct page **pages) | ||
299 | { | ||
300 | struct krb5_ctx *kctx = gctx->internal_ctx_id; | ||
301 | |||
302 | switch (kctx->enctype) { | ||
303 | default: | ||
304 | BUG(); | ||
305 | case ENCTYPE_DES_CBC_RAW: | ||
306 | return gss_wrap_kerberos_v1(kctx, offset, buf, pages); | ||
307 | } | ||
308 | } | ||
309 | |||
310 | u32 | ||
311 | gss_unwrap_kerberos(struct gss_ctx *gctx, int offset, struct xdr_buf *buf) | ||
312 | { | ||
313 | struct krb5_ctx *kctx = gctx->internal_ctx_id; | ||
314 | |||
315 | switch (kctx->enctype) { | ||
316 | default: | ||
317 | BUG(); | ||
318 | case ENCTYPE_DES_CBC_RAW: | ||
319 | return gss_unwrap_kerberos_v1(kctx, offset, buf); | ||
320 | } | ||
321 | } | ||
322 | |||