Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 192267
b: refs/heads/master
c: a8cc1cb
h: refs/heads/master
i:
  192265: 6c92130
  192263: 4a8edb3
v: v3
  • Loading branch information
Kevin Coffman authored and Trond Myklebust committed May 14, 2010
1 parent f7249e5 commit 76f24b1
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1ac3719a2214c545c7e19d34e272a148ca9a24f1
refs/heads/master: a8cc1cb7d7a12b0e2855832d10cfbfaffebfad6c
63 changes: 39 additions & 24 deletions trunk/net/sunrpc/auth_gss/gss_krb5_mech.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,53 +123,47 @@ get_key(const void *p, const void *end, struct crypto_blkcipher **res)
}

static int
gss_import_sec_context_kerberos(const void *p,
size_t len,
struct gss_ctx *ctx_id)
gss_import_v1_context(const void *p, const void *end, struct krb5_ctx *ctx)
{
const void *end = (const void *)((const char *)p + len);
struct krb5_ctx *ctx;
int tmp;

if (!(ctx = kzalloc(sizeof(*ctx), GFP_NOFS))) {
p = ERR_PTR(-ENOMEM);
goto out_err;
}

p = simple_get_bytes(p, end, &ctx->initiate, sizeof(ctx->initiate));
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;

/* Old format supports only DES! Any other enctype uses new format */
ctx->enctype = ENCTYPE_DES_CBC_RAW;

/* The downcall format was designed before we completely understood
* the uses of the context fields; so it includes some stuff we
* just give some minimal sanity-checking, and some we ignore
* completely (like the next twenty bytes): */
if (unlikely(p + 20 > end || p + 20 < p))
goto out_err_free_ctx;
goto out_err;
p += 20;
p = simple_get_bytes(p, end, &tmp, sizeof(tmp));
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;
if (tmp != SGN_ALG_DES_MAC_MD5) {
p = ERR_PTR(-ENOSYS);
goto out_err_free_ctx;
goto out_err;
}
p = simple_get_bytes(p, end, &tmp, sizeof(tmp));
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;
if (tmp != SEAL_ALG_DES) {
p = ERR_PTR(-ENOSYS);
goto out_err_free_ctx;
goto out_err;
}
p = simple_get_bytes(p, end, &ctx->endtime, sizeof(ctx->endtime));
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;
p = simple_get_bytes(p, end, &ctx->seq_send, sizeof(ctx->seq_send));
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;
p = simple_get_netobj(p, end, &ctx->mech_used);
if (IS_ERR(p))
goto out_err_free_ctx;
goto out_err;
p = get_key(p, end, &ctx->enc);
if (IS_ERR(p))
goto out_err_free_mech;
Expand All @@ -181,9 +175,6 @@ gss_import_sec_context_kerberos(const void *p,
goto out_err_free_key2;
}

ctx_id->internal_ctx_id = ctx;

dprintk("RPC: Successfully imported new context.\n");
return 0;

out_err_free_key2:
Expand All @@ -192,12 +183,36 @@ gss_import_sec_context_kerberos(const void *p,
crypto_free_blkcipher(ctx->enc);
out_err_free_mech:
kfree(ctx->mech_used.data);
out_err_free_ctx:
kfree(ctx);
out_err:
return PTR_ERR(p);
}

static int
gss_import_sec_context_kerberos(const void *p, size_t len,
struct gss_ctx *ctx_id)
{
const void *end = (const void *)((const char *)p + len);
struct krb5_ctx *ctx;
int ret;

ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
if (ctx == NULL)
return -ENOMEM;

if (len == 85)
ret = gss_import_v1_context(p, end, ctx);
else
ret = -EINVAL;

if (ret == 0)
ctx_id->internal_ctx_id = ctx;
else
kfree(ctx);

dprintk("RPC: %s: returning %d\n", __func__, ret);
return ret;
}

static void
gss_delete_sec_context_kerberos(void *internal_ctx) {
struct krb5_ctx *kctx = internal_ctx;
Expand Down

0 comments on commit 76f24b1

Please sign in to comment.