linux/net/sunrpc/auth_gss/svcauth_gss.c
<<
>>
Prefs
   1/*
   2 * Neil Brown <neilb@cse.unsw.edu.au>
   3 * J. Bruce Fields <bfields@umich.edu>
   4 * Andy Adamson <andros@umich.edu>
   5 * Dug Song <dugsong@monkey.org>
   6 *
   7 * RPCSEC_GSS server authentication.
   8 * This implements RPCSEC_GSS as defined in rfc2203 (rpcsec_gss) and rfc2078
   9 * (gssapi)
  10 *
  11 * The RPCSEC_GSS involves three stages:
  12 *  1/ context creation
  13 *  2/ data exchange
  14 *  3/ context destruction
  15 *
  16 * Context creation is handled largely by upcalls to user-space.
  17 *  In particular, GSS_Accept_sec_context is handled by an upcall
  18 * Data exchange is handled entirely within the kernel
  19 *  In particular, GSS_GetMIC, GSS_VerifyMIC, GSS_Seal, GSS_Unseal are in-kernel.
  20 * Context destruction is handled in-kernel
  21 *  GSS_Delete_sec_context is in-kernel
  22 *
  23 * Context creation is initiated by a RPCSEC_GSS_INIT request arriving.
  24 * The context handle and gss_token are used as a key into the rpcsec_init cache.
  25 * The content of this cache includes some of the outputs of GSS_Accept_sec_context,
  26 * being major_status, minor_status, context_handle, reply_token.
  27 * These are sent back to the client.
  28 * Sequence window management is handled by the kernel.  The window size if currently
  29 * a compile time constant.
  30 *
  31 * When user-space is happy that a context is established, it places an entry
  32 * in the rpcsec_context cache. The key for this cache is the context_handle.
  33 * The content includes:
  34 *   uid/gidlist - for determining access rights
  35 *   mechanism type
  36 *   mechanism specific information, such as a key
  37 *
  38 */
  39
  40#include <linux/slab.h>
  41#include <linux/types.h>
  42#include <linux/module.h>
  43#include <linux/pagemap.h>
  44#include <linux/user_namespace.h>
  45
  46#include <linux/sunrpc/auth_gss.h>
  47#include <linux/sunrpc/gss_err.h>
  48#include <linux/sunrpc/svcauth.h>
  49#include <linux/sunrpc/svcauth_gss.h>
  50#include <linux/sunrpc/cache.h>
  51#include "gss_rpc_upcall.h"
  52
  53
  54#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
  55# define RPCDBG_FACILITY        RPCDBG_AUTH
  56#endif
  57
  58/* The rpcsec_init cache is used for mapping RPCSEC_GSS_{,CONT_}INIT requests
  59 * into replies.
  60 *
  61 * Key is context handle (\x if empty) and gss_token.
  62 * Content is major_status minor_status (integers) context_handle, reply_token.
  63 *
  64 */
  65
  66static int netobj_equal(struct xdr_netobj *a, struct xdr_netobj *b)
  67{
  68        return a->len == b->len && 0 == memcmp(a->data, b->data, a->len);
  69}
  70
  71#define RSI_HASHBITS    6
  72#define RSI_HASHMAX     (1<<RSI_HASHBITS)
  73
  74struct rsi {
  75        struct cache_head       h;
  76        struct xdr_netobj       in_handle, in_token;
  77        struct xdr_netobj       out_handle, out_token;
  78        int                     major_status, minor_status;
  79};
  80
  81static struct rsi *rsi_update(struct cache_detail *cd, struct rsi *new, struct rsi *old);
  82static struct rsi *rsi_lookup(struct cache_detail *cd, struct rsi *item);
  83
  84static void rsi_free(struct rsi *rsii)
  85{
  86        kfree(rsii->in_handle.data);
  87        kfree(rsii->in_token.data);
  88        kfree(rsii->out_handle.data);
  89        kfree(rsii->out_token.data);
  90}
  91
  92static void rsi_put(struct kref *ref)
  93{
  94        struct rsi *rsii = container_of(ref, struct rsi, h.ref);
  95        rsi_free(rsii);
  96        kfree(rsii);
  97}
  98
  99static inline int rsi_hash(struct rsi *item)
 100{
 101        return hash_mem(item->in_handle.data, item->in_handle.len, RSI_HASHBITS)
 102             ^ hash_mem(item->in_token.data, item->in_token.len, RSI_HASHBITS);
 103}
 104
 105static int rsi_match(struct cache_head *a, struct cache_head *b)
 106{
 107        struct rsi *item = container_of(a, struct rsi, h);
 108        struct rsi *tmp = container_of(b, struct rsi, h);
 109        return netobj_equal(&item->in_handle, &tmp->in_handle) &&
 110               netobj_equal(&item->in_token, &tmp->in_token);
 111}
 112
 113static int dup_to_netobj(struct xdr_netobj *dst, char *src, int len)
 114{
 115        dst->len = len;
 116        dst->data = (len ? kmemdup(src, len, GFP_KERNEL) : NULL);
 117        if (len && !dst->data)
 118                return -ENOMEM;
 119        return 0;
 120}
 121
 122static inline int dup_netobj(struct xdr_netobj *dst, struct xdr_netobj *src)
 123{
 124        return dup_to_netobj(dst, src->data, src->len);
 125}
 126
 127static void rsi_init(struct cache_head *cnew, struct cache_head *citem)
 128{
 129        struct rsi *new = container_of(cnew, struct rsi, h);
 130        struct rsi *item = container_of(citem, struct rsi, h);
 131
 132        new->out_handle.data = NULL;
 133        new->out_handle.len = 0;
 134        new->out_token.data = NULL;
 135        new->out_token.len = 0;
 136        new->in_handle.len = item->in_handle.len;
 137        item->in_handle.len = 0;
 138        new->in_token.len = item->in_token.len;
 139        item->in_token.len = 0;
 140        new->in_handle.data = item->in_handle.data;
 141        item->in_handle.data = NULL;
 142        new->in_token.data = item->in_token.data;
 143        item->in_token.data = NULL;
 144}
 145
 146static void update_rsi(struct cache_head *cnew, struct cache_head *citem)
 147{
 148        struct rsi *new = container_of(cnew, struct rsi, h);
 149        struct rsi *item = container_of(citem, struct rsi, h);
 150
 151        BUG_ON(new->out_handle.data || new->out_token.data);
 152        new->out_handle.len = item->out_handle.len;
 153        item->out_handle.len = 0;
 154        new->out_token.len = item->out_token.len;
 155        item->out_token.len = 0;
 156        new->out_handle.data = item->out_handle.data;
 157        item->out_handle.data = NULL;
 158        new->out_token.data = item->out_token.data;
 159        item->out_token.data = NULL;
 160
 161        new->major_status = item->major_status;
 162        new->minor_status = item->minor_status;
 163}
 164
 165static struct cache_head *rsi_alloc(void)
 166{
 167        struct rsi *rsii = kmalloc(sizeof(*rsii), GFP_KERNEL);
 168        if (rsii)
 169                return &rsii->h;
 170        else
 171                return NULL;
 172}
 173
 174static void rsi_request(struct cache_detail *cd,
 175                       struct cache_head *h,
 176                       char **bpp, int *blen)
 177{
 178        struct rsi *rsii = container_of(h, struct rsi, h);
 179
 180        qword_addhex(bpp, blen, rsii->in_handle.data, rsii->in_handle.len);
 181        qword_addhex(bpp, blen, rsii->in_token.data, rsii->in_token.len);
 182        (*bpp)[-1] = '\n';
 183}
 184
 185static int rsi_parse(struct cache_detail *cd,
 186                    char *mesg, int mlen)
 187{
 188        /* context token expiry major minor context token */
 189        char *buf = mesg;
 190        char *ep;
 191        int len;
 192        struct rsi rsii, *rsip = NULL;
 193        time_t expiry;
 194        int status = -EINVAL;
 195
 196        memset(&rsii, 0, sizeof(rsii));
 197        /* handle */
 198        len = qword_get(&mesg, buf, mlen);
 199        if (len < 0)
 200                goto out;
 201        status = -ENOMEM;
 202        if (dup_to_netobj(&rsii.in_handle, buf, len))
 203                goto out;
 204
 205        /* token */
 206        len = qword_get(&mesg, buf, mlen);
 207        status = -EINVAL;
 208        if (len < 0)
 209                goto out;
 210        status = -ENOMEM;
 211        if (dup_to_netobj(&rsii.in_token, buf, len))
 212                goto out;
 213
 214        rsip = rsi_lookup(cd, &rsii);
 215        if (!rsip)
 216                goto out;
 217
 218        rsii.h.flags = 0;
 219        /* expiry */
 220        expiry = get_expiry(&mesg);
 221        status = -EINVAL;
 222        if (expiry == 0)
 223                goto out;
 224
 225        /* major/minor */
 226        len = qword_get(&mesg, buf, mlen);
 227        if (len <= 0)
 228                goto out;
 229        rsii.major_status = simple_strtoul(buf, &ep, 10);
 230        if (*ep)
 231                goto out;
 232        len = qword_get(&mesg, buf, mlen);
 233        if (len <= 0)
 234                goto out;
 235        rsii.minor_status = simple_strtoul(buf, &ep, 10);
 236        if (*ep)
 237                goto out;
 238
 239        /* out_handle */
 240        len = qword_get(&mesg, buf, mlen);
 241        if (len < 0)
 242                goto out;
 243        status = -ENOMEM;
 244        if (dup_to_netobj(&rsii.out_handle, buf, len))
 245                goto out;
 246
 247        /* out_token */
 248        len = qword_get(&mesg, buf, mlen);
 249        status = -EINVAL;
 250        if (len < 0)
 251                goto out;
 252        status = -ENOMEM;
 253        if (dup_to_netobj(&rsii.out_token, buf, len))
 254                goto out;
 255        rsii.h.expiry_time = expiry;
 256        rsip = rsi_update(cd, &rsii, rsip);
 257        status = 0;
 258out:
 259        rsi_free(&rsii);
 260        if (rsip)
 261                cache_put(&rsip->h, cd);
 262        else
 263                status = -ENOMEM;
 264        return status;
 265}
 266
 267static const struct cache_detail rsi_cache_template = {
 268        .owner          = THIS_MODULE,
 269        .hash_size      = RSI_HASHMAX,
 270        .name           = "auth.rpcsec.init",
 271        .cache_put      = rsi_put,
 272        .cache_request  = rsi_request,
 273        .cache_parse    = rsi_parse,
 274        .match          = rsi_match,
 275        .init           = rsi_init,
 276        .update         = update_rsi,
 277        .alloc          = rsi_alloc,
 278};
 279
 280static struct rsi *rsi_lookup(struct cache_detail *cd, struct rsi *item)
 281{
 282        struct cache_head *ch;
 283        int hash = rsi_hash(item);
 284
 285        ch = sunrpc_cache_lookup(cd, &item->h, hash);
 286        if (ch)
 287                return container_of(ch, struct rsi, h);
 288        else
 289                return NULL;
 290}
 291
 292static struct rsi *rsi_update(struct cache_detail *cd, struct rsi *new, struct rsi *old)
 293{
 294        struct cache_head *ch;
 295        int hash = rsi_hash(new);
 296
 297        ch = sunrpc_cache_update(cd, &new->h,
 298                                 &old->h, hash);
 299        if (ch)
 300                return container_of(ch, struct rsi, h);
 301        else
 302                return NULL;
 303}
 304
 305
 306/*
 307 * The rpcsec_context cache is used to store a context that is
 308 * used in data exchange.
 309 * The key is a context handle. The content is:
 310 *  uid, gidlist, mechanism, service-set, mech-specific-data
 311 */
 312
 313#define RSC_HASHBITS    10
 314#define RSC_HASHMAX     (1<<RSC_HASHBITS)
 315
 316#define GSS_SEQ_WIN     128
 317
 318struct gss_svc_seq_data {
 319        /* highest seq number seen so far: */
 320        int                     sd_max;
 321        /* for i such that sd_max-GSS_SEQ_WIN < i <= sd_max, the i-th bit of
 322         * sd_win is nonzero iff sequence number i has been seen already: */
 323        unsigned long           sd_win[GSS_SEQ_WIN/BITS_PER_LONG];
 324        spinlock_t              sd_lock;
 325};
 326
 327struct rsc {
 328        struct cache_head       h;
 329        struct xdr_netobj       handle;
 330        struct svc_cred         cred;
 331        struct gss_svc_seq_data seqdata;
 332        struct gss_ctx          *mechctx;
 333};
 334
 335static struct rsc *rsc_update(struct cache_detail *cd, struct rsc *new, struct rsc *old);
 336static struct rsc *rsc_lookup(struct cache_detail *cd, struct rsc *item);
 337
 338static void rsc_free(struct rsc *rsci)
 339{
 340        kfree(rsci->handle.data);
 341        if (rsci->mechctx)
 342                gss_delete_sec_context(&rsci->mechctx);
 343        free_svc_cred(&rsci->cred);
 344}
 345
 346static void rsc_put(struct kref *ref)
 347{
 348        struct rsc *rsci = container_of(ref, struct rsc, h.ref);
 349
 350        rsc_free(rsci);
 351        kfree(rsci);
 352}
 353
 354static inline int
 355rsc_hash(struct rsc *rsci)
 356{
 357        return hash_mem(rsci->handle.data, rsci->handle.len, RSC_HASHBITS);
 358}
 359
 360static int
 361rsc_match(struct cache_head *a, struct cache_head *b)
 362{
 363        struct rsc *new = container_of(a, struct rsc, h);
 364        struct rsc *tmp = container_of(b, struct rsc, h);
 365
 366        return netobj_equal(&new->handle, &tmp->handle);
 367}
 368
 369static void
 370rsc_init(struct cache_head *cnew, struct cache_head *ctmp)
 371{
 372        struct rsc *new = container_of(cnew, struct rsc, h);
 373        struct rsc *tmp = container_of(ctmp, struct rsc, h);
 374
 375        new->handle.len = tmp->handle.len;
 376        tmp->handle.len = 0;
 377        new->handle.data = tmp->handle.data;
 378        tmp->handle.data = NULL;
 379        new->mechctx = NULL;
 380        init_svc_cred(&new->cred);
 381}
 382
 383static void
 384update_rsc(struct cache_head *cnew, struct cache_head *ctmp)
 385{
 386        struct rsc *new = container_of(cnew, struct rsc, h);
 387        struct rsc *tmp = container_of(ctmp, struct rsc, h);
 388
 389        new->mechctx = tmp->mechctx;
 390        tmp->mechctx = NULL;
 391        memset(&new->seqdata, 0, sizeof(new->seqdata));
 392        spin_lock_init(&new->seqdata.sd_lock);
 393        new->cred = tmp->cred;
 394        init_svc_cred(&tmp->cred);
 395}
 396
 397static struct cache_head *
 398rsc_alloc(void)
 399{
 400        struct rsc *rsci = kmalloc(sizeof(*rsci), GFP_KERNEL);
 401        if (rsci)
 402                return &rsci->h;
 403        else
 404                return NULL;
 405}
 406
 407static int rsc_parse(struct cache_detail *cd,
 408                     char *mesg, int mlen)
 409{
 410        /* contexthandle expiry [ uid gid N <n gids> mechname ...mechdata... ] */
 411        char *buf = mesg;
 412        int id;
 413        int len, rv;
 414        struct rsc rsci, *rscp = NULL;
 415        time_t expiry;
 416        int status = -EINVAL;
 417        struct gss_api_mech *gm = NULL;
 418
 419        memset(&rsci, 0, sizeof(rsci));
 420        /* context handle */
 421        len = qword_get(&mesg, buf, mlen);
 422        if (len < 0) goto out;
 423        status = -ENOMEM;
 424        if (dup_to_netobj(&rsci.handle, buf, len))
 425                goto out;
 426
 427        rsci.h.flags = 0;
 428        /* expiry */
 429        expiry = get_expiry(&mesg);
 430        status = -EINVAL;
 431        if (expiry == 0)
 432                goto out;
 433
 434        rscp = rsc_lookup(cd, &rsci);
 435        if (!rscp)
 436                goto out;
 437
 438        /* uid, or NEGATIVE */
 439        rv = get_int(&mesg, &id);
 440        if (rv == -EINVAL)
 441                goto out;
 442        if (rv == -ENOENT)
 443                set_bit(CACHE_NEGATIVE, &rsci.h.flags);
 444        else {
 445                int N, i;
 446
 447                /*
 448                 * NOTE: we skip uid_valid()/gid_valid() checks here:
 449                 * instead, * -1 id's are later mapped to the
 450                 * (export-specific) anonymous id by nfsd_setuser.
 451                 *
 452                 * (But supplementary gid's get no such special
 453                 * treatment so are checked for validity here.)
 454                 */
 455                /* uid */
 456                rsci.cred.cr_uid = make_kuid(&init_user_ns, id);
 457
 458                /* gid */
 459                if (get_int(&mesg, &id))
 460                        goto out;
 461                rsci.cred.cr_gid = make_kgid(&init_user_ns, id);
 462
 463                /* number of additional gid's */
 464                if (get_int(&mesg, &N))
 465                        goto out;
 466                if (N < 0 || N > NGROUPS_MAX)
 467                        goto out;
 468                status = -ENOMEM;
 469                rsci.cred.cr_group_info = groups_alloc(N);
 470                if (rsci.cred.cr_group_info == NULL)
 471                        goto out;
 472
 473                /* gid's */
 474                status = -EINVAL;
 475                for (i=0; i<N; i++) {
 476                        kgid_t kgid;
 477                        if (get_int(&mesg, &id))
 478                                goto out;
 479                        kgid = make_kgid(&init_user_ns, id);
 480                        if (!gid_valid(kgid))
 481                                goto out;
 482                        rsci.cred.cr_group_info->gid[i] = kgid;
 483                }
 484                groups_sort(rsci.cred.cr_group_info);
 485
 486                /* mech name */
 487                len = qword_get(&mesg, buf, mlen);
 488                if (len < 0)
 489                        goto out;
 490                gm = rsci.cred.cr_gss_mech = gss_mech_get_by_name(buf);
 491                status = -EOPNOTSUPP;
 492                if (!gm)
 493                        goto out;
 494
 495                status = -EINVAL;
 496                /* mech-specific data: */
 497                len = qword_get(&mesg, buf, mlen);
 498                if (len < 0)
 499                        goto out;
 500                status = gss_import_sec_context(buf, len, gm, &rsci.mechctx,
 501                                                NULL, GFP_KERNEL);
 502                if (status)
 503                        goto out;
 504
 505                /* get client name */
 506                len = qword_get(&mesg, buf, mlen);
 507                if (len > 0) {
 508                        rsci.cred.cr_principal = kstrdup(buf, GFP_KERNEL);
 509                        if (!rsci.cred.cr_principal) {
 510                                status = -ENOMEM;
 511                                goto out;
 512                        }
 513                }
 514
 515        }
 516        rsci.h.expiry_time = expiry;
 517        rscp = rsc_update(cd, &rsci, rscp);
 518        status = 0;
 519out:
 520        rsc_free(&rsci);
 521        if (rscp)
 522                cache_put(&rscp->h, cd);
 523        else
 524                status = -ENOMEM;
 525        return status;
 526}
 527
 528static const struct cache_detail rsc_cache_template = {
 529        .owner          = THIS_MODULE,
 530        .hash_size      = RSC_HASHMAX,
 531        .name           = "auth.rpcsec.context",
 532        .cache_put      = rsc_put,
 533        .cache_parse    = rsc_parse,
 534        .match          = rsc_match,
 535        .init           = rsc_init,
 536        .update         = update_rsc,
 537        .alloc          = rsc_alloc,
 538};
 539
 540static struct rsc *rsc_lookup(struct cache_detail *cd, struct rsc *item)
 541{
 542        struct cache_head *ch;
 543        int hash = rsc_hash(item);
 544
 545        ch = sunrpc_cache_lookup(cd, &item->h, hash);
 546        if (ch)
 547                return container_of(ch, struct rsc, h);
 548        else
 549                return NULL;
 550}
 551
 552static struct rsc *rsc_update(struct cache_detail *cd, struct rsc *new, struct rsc *old)
 553{
 554        struct cache_head *ch;
 555        int hash = rsc_hash(new);
 556
 557        ch = sunrpc_cache_update(cd, &new->h,
 558                                 &old->h, hash);
 559        if (ch)
 560                return container_of(ch, struct rsc, h);
 561        else
 562                return NULL;
 563}
 564
 565
 566static struct rsc *
 567gss_svc_searchbyctx(struct cache_detail *cd, struct xdr_netobj *handle)
 568{
 569        struct rsc rsci;
 570        struct rsc *found;
 571
 572        memset(&rsci, 0, sizeof(rsci));
 573        if (dup_to_netobj(&rsci.handle, handle->data, handle->len))
 574                return NULL;
 575        found = rsc_lookup(cd, &rsci);
 576        rsc_free(&rsci);
 577        if (!found)
 578                return NULL;
 579        if (cache_check(cd, &found->h, NULL))
 580                return NULL;
 581        return found;
 582}
 583
 584/* Implements sequence number algorithm as specified in RFC 2203. */
 585static int
 586gss_check_seq_num(struct rsc *rsci, int seq_num)
 587{
 588        struct gss_svc_seq_data *sd = &rsci->seqdata;
 589
 590        spin_lock(&sd->sd_lock);
 591        if (seq_num > sd->sd_max) {
 592                if (seq_num >= sd->sd_max + GSS_SEQ_WIN) {
 593                        memset(sd->sd_win,0,sizeof(sd->sd_win));
 594                        sd->sd_max = seq_num;
 595                } else while (sd->sd_max < seq_num) {
 596                        sd->sd_max++;
 597                        __clear_bit(sd->sd_max % GSS_SEQ_WIN, sd->sd_win);
 598                }
 599                __set_bit(seq_num % GSS_SEQ_WIN, sd->sd_win);
 600                goto ok;
 601        } else if (seq_num <= sd->sd_max - GSS_SEQ_WIN) {
 602                goto drop;
 603        }
 604        /* sd_max - GSS_SEQ_WIN < seq_num <= sd_max */
 605        if (__test_and_set_bit(seq_num % GSS_SEQ_WIN, sd->sd_win))
 606                goto drop;
 607ok:
 608        spin_unlock(&sd->sd_lock);
 609        return 1;
 610drop:
 611        spin_unlock(&sd->sd_lock);
 612        return 0;
 613}
 614
 615static inline u32 round_up_to_quad(u32 i)
 616{
 617        return (i + 3 ) & ~3;
 618}
 619
 620static inline int
 621svc_safe_getnetobj(struct kvec *argv, struct xdr_netobj *o)
 622{
 623        int l;
 624
 625        if (argv->iov_len < 4)
 626                return -1;
 627        o->len = svc_getnl(argv);
 628        l = round_up_to_quad(o->len);
 629        if (argv->iov_len < l)
 630                return -1;
 631        o->data = argv->iov_base;
 632        argv->iov_base += l;
 633        argv->iov_len -= l;
 634        return 0;
 635}
 636
 637static inline int
 638svc_safe_putnetobj(struct kvec *resv, struct xdr_netobj *o)
 639{
 640        u8 *p;
 641
 642        if (resv->iov_len + 4 > PAGE_SIZE)
 643                return -1;
 644        svc_putnl(resv, o->len);
 645        p = resv->iov_base + resv->iov_len;
 646        resv->iov_len += round_up_to_quad(o->len);
 647        if (resv->iov_len > PAGE_SIZE)
 648                return -1;
 649        memcpy(p, o->data, o->len);
 650        memset(p + o->len, 0, round_up_to_quad(o->len) - o->len);
 651        return 0;
 652}
 653
 654/*
 655 * Verify the checksum on the header and return SVC_OK on success.
 656 * Otherwise, return SVC_DROP (in the case of a bad sequence number)
 657 * or return SVC_DENIED and indicate error in authp.
 658 */
 659static int
 660gss_verify_header(struct svc_rqst *rqstp, struct rsc *rsci,
 661                  __be32 *rpcstart, struct rpc_gss_wire_cred *gc, __be32 *authp)
 662{
 663        struct gss_ctx          *ctx_id = rsci->mechctx;
 664        struct xdr_buf          rpchdr;
 665        struct xdr_netobj       checksum;
 666        u32                     flavor = 0;
 667        struct kvec             *argv = &rqstp->rq_arg.head[0];
 668        struct kvec             iov;
 669
 670        /* data to compute the checksum over: */
 671        iov.iov_base = rpcstart;
 672        iov.iov_len = (u8 *)argv->iov_base - (u8 *)rpcstart;
 673        xdr_buf_from_iov(&iov, &rpchdr);
 674
 675        *authp = rpc_autherr_badverf;
 676        if (argv->iov_len < 4)
 677                return SVC_DENIED;
 678        flavor = svc_getnl(argv);
 679        if (flavor != RPC_AUTH_GSS)
 680                return SVC_DENIED;
 681        if (svc_safe_getnetobj(argv, &checksum))
 682                return SVC_DENIED;
 683
 684        if (rqstp->rq_deferred) /* skip verification of revisited request */
 685                return SVC_OK;
 686        if (gss_verify_mic(ctx_id, &rpchdr, &checksum) != GSS_S_COMPLETE) {
 687                *authp = rpcsec_gsserr_credproblem;
 688                return SVC_DENIED;
 689        }
 690
 691        if (gc->gc_seq > MAXSEQ) {
 692                dprintk("RPC:       svcauth_gss: discarding request with "
 693                                "large sequence number %d\n", gc->gc_seq);
 694                *authp = rpcsec_gsserr_ctxproblem;
 695                return SVC_DENIED;
 696        }
 697        if (!gss_check_seq_num(rsci, gc->gc_seq)) {
 698                dprintk("RPC:       svcauth_gss: discarding request with "
 699                                "old sequence number %d\n", gc->gc_seq);
 700                return SVC_DROP;
 701        }
 702        return SVC_OK;
 703}
 704
 705static int
 706gss_write_null_verf(struct svc_rqst *rqstp)
 707{
 708        __be32     *p;
 709
 710        svc_putnl(rqstp->rq_res.head, RPC_AUTH_NULL);
 711        p = rqstp->rq_res.head->iov_base + rqstp->rq_res.head->iov_len;
 712        /* don't really need to check if head->iov_len > PAGE_SIZE ... */
 713        *p++ = 0;
 714        if (!xdr_ressize_check(rqstp, p))
 715                return -1;
 716        return 0;
 717}
 718
 719static int
 720gss_write_verf(struct svc_rqst *rqstp, struct gss_ctx *ctx_id, u32 seq)
 721{
 722        __be32                  *xdr_seq;
 723        u32                     maj_stat;
 724        struct xdr_buf          verf_data;
 725        struct xdr_netobj       mic;
 726        __be32                  *p;
 727        struct kvec             iov;
 728        int err = -1;
 729
 730        svc_putnl(rqstp->rq_res.head, RPC_AUTH_GSS);
 731        xdr_seq = kmalloc(4, GFP_KERNEL);
 732        if (!xdr_seq)
 733                return -1;
 734        *xdr_seq = htonl(seq);
 735
 736        iov.iov_base = xdr_seq;
 737        iov.iov_len = 4;
 738        xdr_buf_from_iov(&iov, &verf_data);
 739        p = rqstp->rq_res.head->iov_base + rqstp->rq_res.head->iov_len;
 740        mic.data = (u8 *)(p + 1);
 741        maj_stat = gss_get_mic(ctx_id, &verf_data, &mic);
 742        if (maj_stat != GSS_S_COMPLETE)
 743                goto out;
 744        *p++ = htonl(mic.len);
 745        memset((u8 *)p + mic.len, 0, round_up_to_quad(mic.len) - mic.len);
 746        p += XDR_QUADLEN(mic.len);
 747        if (!xdr_ressize_check(rqstp, p))
 748                goto out;
 749        err = 0;
 750out:
 751        kfree(xdr_seq);
 752        return err;
 753}
 754
 755struct gss_domain {
 756        struct auth_domain      h;
 757        u32                     pseudoflavor;
 758};
 759
 760static struct auth_domain *
 761find_gss_auth_domain(struct gss_ctx *ctx, u32 svc)
 762{
 763        char *name;
 764
 765        name = gss_service_to_auth_domain_name(ctx->mech_type, svc);
 766        if (!name)
 767                return NULL;
 768        return auth_domain_find(name);
 769}
 770
 771static struct auth_ops svcauthops_gss;
 772
 773u32 svcauth_gss_flavor(struct auth_domain *dom)
 774{
 775        struct gss_domain *gd = container_of(dom, struct gss_domain, h);
 776
 777        return gd->pseudoflavor;
 778}
 779
 780EXPORT_SYMBOL_GPL(svcauth_gss_flavor);
 781
 782int
 783svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name)
 784{
 785        struct gss_domain       *new;
 786        struct auth_domain      *test;
 787        int                     stat = -ENOMEM;
 788
 789        new = kmalloc(sizeof(*new), GFP_KERNEL);
 790        if (!new)
 791                goto out;
 792        kref_init(&new->h.ref);
 793        new->h.name = kstrdup(name, GFP_KERNEL);
 794        if (!new->h.name)
 795                goto out_free_dom;
 796        new->h.flavour = &svcauthops_gss;
 797        new->pseudoflavor = pseudoflavor;
 798
 799        stat = 0;
 800        test = auth_domain_lookup(name, &new->h);
 801        if (test != &new->h) { /* Duplicate registration */
 802                auth_domain_put(test);
 803                kfree(new->h.name);
 804                goto out_free_dom;
 805        }
 806        return 0;
 807
 808out_free_dom:
 809        kfree(new);
 810out:
 811        return stat;
 812}
 813
 814EXPORT_SYMBOL_GPL(svcauth_gss_register_pseudoflavor);
 815
 816static inline int
 817read_u32_from_xdr_buf(struct xdr_buf *buf, int base, u32 *obj)
 818{
 819        __be32  raw;
 820        int     status;
 821
 822        status = read_bytes_from_xdr_buf(buf, base, &raw, sizeof(*obj));
 823        if (status)
 824                return status;
 825        *obj = ntohl(raw);
 826        return 0;
 827}
 828
 829/* It would be nice if this bit of code could be shared with the client.
 830 * Obstacles:
 831 *      The client shouldn't malloc(), would have to pass in own memory.
 832 *      The server uses base of head iovec as read pointer, while the
 833 *      client uses separate pointer. */
 834static int
 835unwrap_integ_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx)
 836{
 837        int stat = -EINVAL;
 838        u32 integ_len, maj_stat;
 839        struct xdr_netobj mic;
 840        struct xdr_buf integ_buf;
 841
 842        /* NFS READ normally uses splice to send data in-place. However
 843         * the data in cache can change after the reply's MIC is computed
 844         * but before the RPC reply is sent. To prevent the client from
 845         * rejecting the server-computed MIC in this somewhat rare case,
 846         * do not use splice with the GSS integrity service.
 847         */
 848        clear_bit(RQ_SPLICE_OK, &rqstp->rq_flags);
 849
 850        /* Did we already verify the signature on the original pass through? */
 851        if (rqstp->rq_deferred)
 852                return 0;
 853
 854        integ_len = svc_getnl(&buf->head[0]);
 855        if (integ_len & 3)
 856                return stat;
 857        if (integ_len > buf->len)
 858                return stat;
 859        if (xdr_buf_subsegment(buf, &integ_buf, 0, integ_len)) {
 860                WARN_ON_ONCE(1);
 861                return stat;
 862        }
 863        /* copy out mic... */
 864        if (read_u32_from_xdr_buf(buf, integ_len, &mic.len))
 865                return stat;
 866        if (mic.len > RPC_MAX_AUTH_SIZE)
 867                return stat;
 868        mic.data = kmalloc(mic.len, GFP_KERNEL);
 869        if (!mic.data)
 870                return stat;
 871        if (read_bytes_from_xdr_buf(buf, integ_len + 4, mic.data, mic.len))
 872                goto out;
 873        maj_stat = gss_verify_mic(ctx, &integ_buf, &mic);
 874        if (maj_stat != GSS_S_COMPLETE)
 875                goto out;
 876        if (svc_getnl(&buf->head[0]) != seq)
 877                goto out;
 878        /* trim off the mic and padding at the end before returning */
 879        xdr_buf_trim(buf, round_up_to_quad(mic.len) + 4);
 880        stat = 0;
 881out:
 882        kfree(mic.data);
 883        return stat;
 884}
 885
 886static inline int
 887total_buf_len(struct xdr_buf *buf)
 888{
 889        return buf->head[0].iov_len + buf->page_len + buf->tail[0].iov_len;
 890}
 891
 892static void
 893fix_priv_head(struct xdr_buf *buf, int pad)
 894{
 895        if (buf->page_len == 0) {
 896                /* We need to adjust head and buf->len in tandem in this
 897                 * case to make svc_defer() work--it finds the original
 898                 * buffer start using buf->len - buf->head[0].iov_len. */
 899                buf->head[0].iov_len -= pad;
 900        }
 901}
 902
 903static int
 904unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx)
 905{
 906        u32 priv_len, maj_stat;
 907        int pad, saved_len, remaining_len, offset;
 908
 909        clear_bit(RQ_SPLICE_OK, &rqstp->rq_flags);
 910
 911        priv_len = svc_getnl(&buf->head[0]);
 912        if (rqstp->rq_deferred) {
 913                /* Already decrypted last time through! The sequence number
 914                 * check at out_seq is unnecessary but harmless: */
 915                goto out_seq;
 916        }
 917        /* buf->len is the number of bytes from the original start of the
 918         * request to the end, where head[0].iov_len is just the bytes
 919         * not yet read from the head, so these two values are different: */
 920        remaining_len = total_buf_len(buf);
 921        if (priv_len > remaining_len)
 922                return -EINVAL;
 923        pad = remaining_len - priv_len;
 924        buf->len -= pad;
 925        fix_priv_head(buf, pad);
 926
 927        /* Maybe it would be better to give gss_unwrap a length parameter: */
 928        saved_len = buf->len;
 929        buf->len = priv_len;
 930        maj_stat = gss_unwrap(ctx, 0, buf);
 931        pad = priv_len - buf->len;
 932        buf->len = saved_len;
 933        buf->len -= pad;
 934        /* The upper layers assume the buffer is aligned on 4-byte boundaries.
 935         * In the krb5p case, at least, the data ends up offset, so we need to
 936         * move it around. */
 937        /* XXX: This is very inefficient.  It would be better to either do
 938         * this while we encrypt, or maybe in the receive code, if we can peak
 939         * ahead and work out the service and mechanism there. */
 940        offset = buf->head[0].iov_len % 4;
 941        if (offset) {
 942                buf->buflen = RPCSVC_MAXPAYLOAD;
 943                xdr_shift_buf(buf, offset);
 944                fix_priv_head(buf, pad);
 945        }
 946        if (maj_stat != GSS_S_COMPLETE)
 947                return -EINVAL;
 948out_seq:
 949        if (svc_getnl(&buf->head[0]) != seq)
 950                return -EINVAL;
 951        return 0;
 952}
 953
 954struct gss_svc_data {
 955        /* decoded gss client cred: */
 956        struct rpc_gss_wire_cred        clcred;
 957        /* save a pointer to the beginning of the encoded verifier,
 958         * for use in encryption/checksumming in svcauth_gss_release: */
 959        __be32                          *verf_start;
 960        struct rsc                      *rsci;
 961};
 962
 963static int
 964svcauth_gss_set_client(struct svc_rqst *rqstp)
 965{
 966        struct gss_svc_data *svcdata = rqstp->rq_auth_data;
 967        struct rsc *rsci = svcdata->rsci;
 968        struct rpc_gss_wire_cred *gc = &svcdata->clcred;
 969        int stat;
 970
 971        /*
 972         * A gss export can be specified either by:
 973         *      export  *(sec=krb5,rw)
 974         * or by
 975         *      export gss/krb5(rw)
 976         * The latter is deprecated; but for backwards compatibility reasons
 977         * the nfsd code will still fall back on trying it if the former
 978         * doesn't work; so we try to make both available to nfsd, below.
 979         */
 980        rqstp->rq_gssclient = find_gss_auth_domain(rsci->mechctx, gc->gc_svc);
 981        if (rqstp->rq_gssclient == NULL)
 982                return SVC_DENIED;
 983        stat = svcauth_unix_set_client(rqstp);
 984        if (stat == SVC_DROP || stat == SVC_CLOSE)
 985                return stat;
 986        return SVC_OK;
 987}
 988
 989static inline int
 990gss_write_init_verf(struct cache_detail *cd, struct svc_rqst *rqstp,
 991                struct xdr_netobj *out_handle, int *major_status)
 992{
 993        struct rsc *rsci;
 994        int        rc;
 995
 996        if (*major_status != GSS_S_COMPLETE)
 997                return gss_write_null_verf(rqstp);
 998        rsci = gss_svc_searchbyctx(cd, out_handle);
 999        if (rsci == NULL) {
1000                *major_status = GSS_S_NO_CONTEXT;
1001                return gss_write_null_verf(rqstp);
1002        }
1003        rc = gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN);
1004        cache_put(&rsci->h, cd);
1005        return rc;
1006}
1007
1008static inline int
1009gss_read_common_verf(struct rpc_gss_wire_cred *gc,
1010                     struct kvec *argv, __be32 *authp,
1011                     struct xdr_netobj *in_handle)
1012{
1013        /* Read the verifier; should be NULL: */
1014        *authp = rpc_autherr_badverf;
1015        if (argv->iov_len < 2 * 4)
1016                return SVC_DENIED;
1017        if (svc_getnl(argv) != RPC_AUTH_NULL)
1018                return SVC_DENIED;
1019        if (svc_getnl(argv) != 0)
1020                return SVC_DENIED;
1021        /* Martial context handle and token for upcall: */
1022        *authp = rpc_autherr_badcred;
1023        if (gc->gc_proc == RPC_GSS_PROC_INIT && gc->gc_ctx.len != 0)
1024                return SVC_DENIED;
1025        if (dup_netobj(in_handle, &gc->gc_ctx))
1026                return SVC_CLOSE;
1027        *authp = rpc_autherr_badverf;
1028
1029        return 0;
1030}
1031
1032static inline int
1033gss_read_verf(struct rpc_gss_wire_cred *gc,
1034              struct kvec *argv, __be32 *authp,
1035              struct xdr_netobj *in_handle,
1036              struct xdr_netobj *in_token)
1037{
1038        struct xdr_netobj tmpobj;
1039        int res;
1040
1041        res = gss_read_common_verf(gc, argv, authp, in_handle);
1042        if (res)
1043                return res;
1044
1045        if (svc_safe_getnetobj(argv, &tmpobj)) {
1046                kfree(in_handle->data);
1047                return SVC_DENIED;
1048        }
1049        if (dup_netobj(in_token, &tmpobj)) {
1050                kfree(in_handle->data);
1051                return SVC_CLOSE;
1052        }
1053
1054        return 0;
1055}
1056
1057/* Ok this is really heavily depending on a set of semantics in
1058 * how rqstp is set up by svc_recv and pages laid down by the
1059 * server when reading a request. We are basically guaranteed that
1060 * the token lays all down linearly across a set of pages, starting
1061 * at iov_base in rq_arg.head[0] which happens to be the first of a
1062 * set of pages stored in rq_pages[].
1063 * rq_arg.head[0].iov_base will provide us the page_base to pass
1064 * to the upcall.
1065 */
1066static inline int
1067gss_read_proxy_verf(struct svc_rqst *rqstp,
1068                    struct rpc_gss_wire_cred *gc, __be32 *authp,
1069                    struct xdr_netobj *in_handle,
1070                    struct gssp_in_token *in_token)
1071{
1072        struct kvec *argv = &rqstp->rq_arg.head[0];
1073        u32 inlen;
1074        int res;
1075
1076        res = gss_read_common_verf(gc, argv, authp, in_handle);
1077        if (res)
1078                return res;
1079
1080        inlen = svc_getnl(argv);
1081        if (inlen > (argv->iov_len + rqstp->rq_arg.page_len))
1082                return SVC_DENIED;
1083
1084        in_token->pages = rqstp->rq_pages;
1085        in_token->page_base = (ulong)argv->iov_base & ~PAGE_MASK;
1086        in_token->page_len = inlen;
1087
1088        return 0;
1089}
1090
1091static inline int
1092gss_write_resv(struct kvec *resv, size_t size_limit,
1093               struct xdr_netobj *out_handle, struct xdr_netobj *out_token,
1094               int major_status, int minor_status)
1095{
1096        if (resv->iov_len + 4 > size_limit)
1097                return -1;
1098        svc_putnl(resv, RPC_SUCCESS);
1099        if (svc_safe_putnetobj(resv, out_handle))
1100                return -1;
1101        if (resv->iov_len + 3 * 4 > size_limit)
1102                return -1;
1103        svc_putnl(resv, major_status);
1104        svc_putnl(resv, minor_status);
1105        svc_putnl(resv, GSS_SEQ_WIN);
1106        if (svc_safe_putnetobj(resv, out_token))
1107                return -1;
1108        return 0;
1109}
1110
1111/*
1112 * Having read the cred already and found we're in the context
1113 * initiation case, read the verifier and initiate (or check the results
1114 * of) upcalls to userspace for help with context initiation.  If
1115 * the upcall results are available, write the verifier and result.
1116 * Otherwise, drop the request pending an answer to the upcall.
1117 */
1118static int svcauth_gss_legacy_init(struct svc_rqst *rqstp,
1119                        struct rpc_gss_wire_cred *gc, __be32 *authp)
1120{
1121        struct kvec *argv = &rqstp->rq_arg.head[0];
1122        struct kvec *resv = &rqstp->rq_res.head[0];
1123        struct rsi *rsip, rsikey;
1124        int ret;
1125        struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id);
1126
1127        memset(&rsikey, 0, sizeof(rsikey));
1128        ret = gss_read_verf(gc, argv, authp,
1129                            &rsikey.in_handle, &rsikey.in_token);
1130        if (ret)
1131                return ret;
1132
1133        /* Perform upcall, or find upcall result: */
1134        rsip = rsi_lookup(sn->rsi_cache, &rsikey);
1135        rsi_free(&rsikey);
1136        if (!rsip)
1137                return SVC_CLOSE;
1138        if (cache_check(sn->rsi_cache, &rsip->h, &rqstp->rq_chandle) < 0)
1139                /* No upcall result: */
1140                return SVC_CLOSE;
1141
1142        ret = SVC_CLOSE;
1143        /* Got an answer to the upcall; use it: */
1144        if (gss_write_init_verf(sn->rsc_cache, rqstp,
1145                                &rsip->out_handle, &rsip->major_status))
1146                goto out;
1147        if (gss_write_resv(resv, PAGE_SIZE,
1148                           &rsip->out_handle, &rsip->out_token,
1149                           rsip->major_status, rsip->minor_status))
1150                goto out;
1151
1152        ret = SVC_COMPLETE;
1153out:
1154        cache_put(&rsip->h, sn->rsi_cache);
1155        return ret;
1156}
1157
1158static int gss_proxy_save_rsc(struct cache_detail *cd,
1159                                struct gssp_upcall_data *ud,
1160                                uint64_t *handle)
1161{
1162        struct rsc rsci, *rscp = NULL;
1163        static atomic64_t ctxhctr;
1164        long long ctxh;
1165        struct gss_api_mech *gm = NULL;
1166        time_t expiry;
1167        int status = -EINVAL;
1168
1169        memset(&rsci, 0, sizeof(rsci));
1170        /* context handle */
1171        status = -ENOMEM;
1172        /* the handle needs to be just a unique id,
1173         * use a static counter */
1174        ctxh = atomic64_inc_return(&ctxhctr);
1175
1176        /* make a copy for the caller */
1177        *handle = ctxh;
1178
1179        /* make a copy for the rsc cache */
1180        if (dup_to_netobj(&rsci.handle, (char *)handle, sizeof(uint64_t)))
1181                goto out;
1182        rscp = rsc_lookup(cd, &rsci);
1183        if (!rscp)
1184                goto out;
1185
1186        /* creds */
1187        if (!ud->found_creds) {
1188                /* userspace seem buggy, we should always get at least a
1189                 * mapping to nobody */
1190                dprintk("RPC:       No creds found!\n");
1191                goto out;
1192        } else {
1193
1194                /* steal creds */
1195                rsci.cred = ud->creds;
1196                memset(&ud->creds, 0, sizeof(struct svc_cred));
1197
1198                status = -EOPNOTSUPP;
1199                /* get mech handle from OID */
1200                gm = gss_mech_get_by_OID(&ud->mech_oid);
1201                if (!gm)
1202                        goto out;
1203                rsci.cred.cr_gss_mech = gm;
1204
1205                status = -EINVAL;
1206                /* mech-specific data: */
1207                status = gss_import_sec_context(ud->out_handle.data,
1208                                                ud->out_handle.len,
1209                                                gm, &rsci.mechctx,
1210                                                &expiry, GFP_KERNEL);
1211                if (status)
1212                        goto out;
1213        }
1214
1215        rsci.h.expiry_time = expiry;
1216        rscp = rsc_update(cd, &rsci, rscp);
1217        status = 0;
1218out:
1219        rsc_free(&rsci);
1220        if (rscp)
1221                cache_put(&rscp->h, cd);
1222        else
1223                status = -ENOMEM;
1224        return status;
1225}
1226
1227static int svcauth_gss_proxy_init(struct svc_rqst *rqstp,
1228                        struct rpc_gss_wire_cred *gc, __be32 *authp)
1229{
1230        struct kvec *resv = &rqstp->rq_res.head[0];
1231        struct xdr_netobj cli_handle;
1232        struct gssp_upcall_data ud;
1233        uint64_t handle;
1234        int status;
1235        int ret;
1236        struct net *net = rqstp->rq_xprt->xpt_net;
1237        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1238
1239        memset(&ud, 0, sizeof(ud));
1240        ret = gss_read_proxy_verf(rqstp, gc, authp,
1241                                  &ud.in_handle, &ud.in_token);
1242        if (ret)
1243                return ret;
1244
1245        ret = SVC_CLOSE;
1246
1247        /* Perform synchronous upcall to gss-proxy */
1248        status = gssp_accept_sec_context_upcall(net, &ud);
1249        if (status)
1250                goto out;
1251
1252        dprintk("RPC:       svcauth_gss: gss major status = %d "
1253                        "minor status = %d\n",
1254                        ud.major_status, ud.minor_status);
1255
1256        switch (ud.major_status) {
1257        case GSS_S_CONTINUE_NEEDED:
1258                cli_handle = ud.out_handle;
1259                break;
1260        case GSS_S_COMPLETE:
1261                status = gss_proxy_save_rsc(sn->rsc_cache, &ud, &handle);
1262                if (status)
1263                        goto out;
1264                cli_handle.data = (u8 *)&handle;
1265                cli_handle.len = sizeof(handle);
1266                break;
1267        default:
1268                ret = SVC_CLOSE;
1269                goto out;
1270        }
1271
1272        /* Got an answer to the upcall; use it: */
1273        if (gss_write_init_verf(sn->rsc_cache, rqstp,
1274                                &cli_handle, &ud.major_status))
1275                goto out;
1276        if (gss_write_resv(resv, PAGE_SIZE,
1277                           &cli_handle, &ud.out_token,
1278                           ud.major_status, ud.minor_status))
1279                goto out;
1280
1281        ret = SVC_COMPLETE;
1282out:
1283        gssp_free_upcall_data(&ud);
1284        return ret;
1285}
1286
1287/*
1288 * Try to set the sn->use_gss_proxy variable to a new value. We only allow
1289 * it to be changed if it's currently undefined (-1). If it's any other value
1290 * then return -EBUSY unless the type wouldn't have changed anyway.
1291 */
1292static int set_gss_proxy(struct net *net, int type)
1293{
1294        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1295        int ret;
1296
1297        WARN_ON_ONCE(type != 0 && type != 1);
1298        ret = cmpxchg(&sn->use_gss_proxy, -1, type);
1299        if (ret != -1 && ret != type)
1300                return -EBUSY;
1301        return 0;
1302}
1303
1304static bool use_gss_proxy(struct net *net)
1305{
1306        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1307
1308        /* If use_gss_proxy is still undefined, then try to disable it */
1309        if (sn->use_gss_proxy == -1)
1310                set_gss_proxy(net, 0);
1311        return sn->use_gss_proxy;
1312}
1313
1314#ifdef CONFIG_PROC_FS
1315
1316static ssize_t write_gssp(struct file *file, const char __user *buf,
1317                         size_t count, loff_t *ppos)
1318{
1319        struct net *net = PDE_DATA(file_inode(file));
1320        char tbuf[20];
1321        unsigned long i;
1322        int res;
1323
1324        if (*ppos || count > sizeof(tbuf)-1)
1325                return -EINVAL;
1326        if (copy_from_user(tbuf, buf, count))
1327                return -EFAULT;
1328
1329        tbuf[count] = 0;
1330        res = kstrtoul(tbuf, 0, &i);
1331        if (res)
1332                return res;
1333        if (i != 1)
1334                return -EINVAL;
1335        res = set_gssp_clnt(net);
1336        if (res)
1337                return res;
1338        res = set_gss_proxy(net, 1);
1339        if (res)
1340                return res;
1341        return count;
1342}
1343
1344static ssize_t read_gssp(struct file *file, char __user *buf,
1345                         size_t count, loff_t *ppos)
1346{
1347        struct net *net = PDE_DATA(file_inode(file));
1348        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1349        unsigned long p = *ppos;
1350        char tbuf[10];
1351        size_t len;
1352
1353        snprintf(tbuf, sizeof(tbuf), "%d\n", sn->use_gss_proxy);
1354        len = strlen(tbuf);
1355        if (p >= len)
1356                return 0;
1357        len -= p;
1358        if (len > count)
1359                len = count;
1360        if (copy_to_user(buf, (void *)(tbuf+p), len))
1361                return -EFAULT;
1362        *ppos += len;
1363        return len;
1364}
1365
1366static const struct file_operations use_gss_proxy_ops = {
1367        .open = nonseekable_open,
1368        .write = write_gssp,
1369        .read = read_gssp,
1370};
1371
1372static int create_use_gss_proxy_proc_entry(struct net *net)
1373{
1374        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1375        struct proc_dir_entry **p = &sn->use_gssp_proc;
1376
1377        sn->use_gss_proxy = -1;
1378        *p = proc_create_data("use-gss-proxy", S_IFREG | 0600,
1379                              sn->proc_net_rpc,
1380                              &use_gss_proxy_ops, net);
1381        if (!*p)
1382                return -ENOMEM;
1383        init_gssp_clnt(sn);
1384        return 0;
1385}
1386
1387static void destroy_use_gss_proxy_proc_entry(struct net *net)
1388{
1389        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1390
1391        if (sn->use_gssp_proc) {
1392                remove_proc_entry("use-gss-proxy", sn->proc_net_rpc); 
1393                clear_gssp_clnt(sn);
1394        }
1395}
1396#else /* CONFIG_PROC_FS */
1397
1398static int create_use_gss_proxy_proc_entry(struct net *net)
1399{
1400        return 0;
1401}
1402
1403static void destroy_use_gss_proxy_proc_entry(struct net *net) {}
1404
1405#endif /* CONFIG_PROC_FS */
1406
1407/*
1408 * Accept an rpcsec packet.
1409 * If context establishment, punt to user space
1410 * If data exchange, verify/decrypt
1411 * If context destruction, handle here
1412 * In the context establishment and destruction case we encode
1413 * response here and return SVC_COMPLETE.
1414 */
1415static int
1416svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)
1417{
1418        struct kvec     *argv = &rqstp->rq_arg.head[0];
1419        struct kvec     *resv = &rqstp->rq_res.head[0];
1420        u32             crlen;
1421        struct gss_svc_data *svcdata = rqstp->rq_auth_data;
1422        struct rpc_gss_wire_cred *gc;
1423        struct rsc      *rsci = NULL;
1424        __be32          *rpcstart;
1425        __be32          *reject_stat = resv->iov_base + resv->iov_len;
1426        int             ret;
1427        struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id);
1428
1429        dprintk("RPC:       svcauth_gss: argv->iov_len = %zd\n",
1430                        argv->iov_len);
1431
1432        *authp = rpc_autherr_badcred;
1433        if (!svcdata)
1434                svcdata = kmalloc(sizeof(*svcdata), GFP_KERNEL);
1435        if (!svcdata)
1436                goto auth_err;
1437        rqstp->rq_auth_data = svcdata;
1438        svcdata->verf_start = NULL;
1439        svcdata->rsci = NULL;
1440        gc = &svcdata->clcred;
1441
1442        /* start of rpc packet is 7 u32's back from here:
1443         * xid direction rpcversion prog vers proc flavour
1444         */
1445        rpcstart = argv->iov_base;
1446        rpcstart -= 7;
1447
1448        /* credential is:
1449         *   version(==1), proc(0,1,2,3), seq, service (1,2,3), handle
1450         * at least 5 u32s, and is preceded by length, so that makes 6.
1451         */
1452
1453        if (argv->iov_len < 5 * 4)
1454                goto auth_err;
1455        crlen = svc_getnl(argv);
1456        if (svc_getnl(argv) != RPC_GSS_VERSION)
1457                goto auth_err;
1458        gc->gc_proc = svc_getnl(argv);
1459        gc->gc_seq = svc_getnl(argv);
1460        gc->gc_svc = svc_getnl(argv);
1461        if (svc_safe_getnetobj(argv, &gc->gc_ctx))
1462                goto auth_err;
1463        if (crlen != round_up_to_quad(gc->gc_ctx.len) + 5 * 4)
1464                goto auth_err;
1465
1466        if ((gc->gc_proc != RPC_GSS_PROC_DATA) && (rqstp->rq_proc != 0))
1467                goto auth_err;
1468
1469        *authp = rpc_autherr_badverf;
1470        switch (gc->gc_proc) {
1471        case RPC_GSS_PROC_INIT:
1472        case RPC_GSS_PROC_CONTINUE_INIT:
1473                if (use_gss_proxy(SVC_NET(rqstp)))
1474                        return svcauth_gss_proxy_init(rqstp, gc, authp);
1475                else
1476                        return svcauth_gss_legacy_init(rqstp, gc, authp);
1477        case RPC_GSS_PROC_DATA:
1478        case RPC_GSS_PROC_DESTROY:
1479                /* Look up the context, and check the verifier: */
1480                *authp = rpcsec_gsserr_credproblem;
1481                rsci = gss_svc_searchbyctx(sn->rsc_cache, &gc->gc_ctx);
1482                if (!rsci)
1483                        goto auth_err;
1484                switch (gss_verify_header(rqstp, rsci, rpcstart, gc, authp)) {
1485                case SVC_OK:
1486                        break;
1487                case SVC_DENIED:
1488                        goto auth_err;
1489                case SVC_DROP:
1490                        goto drop;
1491                }
1492                break;
1493        default:
1494                *authp = rpc_autherr_rejectedcred;
1495                goto auth_err;
1496        }
1497
1498        /* now act upon the command: */
1499        switch (gc->gc_proc) {
1500        case RPC_GSS_PROC_DESTROY:
1501                if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))
1502                        goto auth_err;
1503                /* Delete the entry from the cache_list and call cache_put */
1504                sunrpc_cache_unhash(sn->rsc_cache, &rsci->h);
1505                if (resv->iov_len + 4 > PAGE_SIZE)
1506                        goto drop;
1507                svc_putnl(resv, RPC_SUCCESS);
1508                goto complete;
1509        case RPC_GSS_PROC_DATA:
1510                *authp = rpcsec_gsserr_ctxproblem;
1511                svcdata->verf_start = resv->iov_base + resv->iov_len;
1512                if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))
1513                        goto auth_err;
1514                rqstp->rq_cred = rsci->cred;
1515                get_group_info(rsci->cred.cr_group_info);
1516                *authp = rpc_autherr_badcred;
1517                switch (gc->gc_svc) {
1518                case RPC_GSS_SVC_NONE:
1519                        break;
1520                case RPC_GSS_SVC_INTEGRITY:
1521                        /* placeholders for length and seq. number: */
1522                        svc_putnl(resv, 0);
1523                        svc_putnl(resv, 0);
1524                        if (unwrap_integ_data(rqstp, &rqstp->rq_arg,
1525                                        gc->gc_seq, rsci->mechctx))
1526                                goto garbage_args;
1527                        rqstp->rq_auth_slack = RPC_MAX_AUTH_SIZE;
1528                        break;
1529                case RPC_GSS_SVC_PRIVACY:
1530                        /* placeholders for length and seq. number: */
1531                        svc_putnl(resv, 0);
1532                        svc_putnl(resv, 0);
1533                        if (unwrap_priv_data(rqstp, &rqstp->rq_arg,
1534                                        gc->gc_seq, rsci->mechctx))
1535                                goto garbage_args;
1536                        rqstp->rq_auth_slack = RPC_MAX_AUTH_SIZE * 2;
1537                        break;
1538                default:
1539                        goto auth_err;
1540                }
1541                svcdata->rsci = rsci;
1542                cache_get(&rsci->h);
1543                rqstp->rq_cred.cr_flavor = gss_svc_to_pseudoflavor(
1544                                        rsci->mechctx->mech_type,
1545                                        GSS_C_QOP_DEFAULT,
1546                                        gc->gc_svc);
1547                ret = SVC_OK;
1548                goto out;
1549        }
1550garbage_args:
1551        ret = SVC_GARBAGE;
1552        goto out;
1553auth_err:
1554        /* Restore write pointer to its original value: */
1555        xdr_ressize_check(rqstp, reject_stat);
1556        ret = SVC_DENIED;
1557        goto out;
1558complete:
1559        ret = SVC_COMPLETE;
1560        goto out;
1561drop:
1562        ret = SVC_CLOSE;
1563out:
1564        if (rsci)
1565                cache_put(&rsci->h, sn->rsc_cache);
1566        return ret;
1567}
1568
1569static __be32 *
1570svcauth_gss_prepare_to_wrap(struct xdr_buf *resbuf, struct gss_svc_data *gsd)
1571{
1572        __be32 *p;
1573        u32 verf_len;
1574
1575        p = gsd->verf_start;
1576        gsd->verf_start = NULL;
1577
1578        /* If the reply stat is nonzero, don't wrap: */
1579        if (*(p-1) != rpc_success)
1580                return NULL;
1581        /* Skip the verifier: */
1582        p += 1;
1583        verf_len = ntohl(*p++);
1584        p += XDR_QUADLEN(verf_len);
1585        /* move accept_stat to right place: */
1586        memcpy(p, p + 2, 4);
1587        /* Also don't wrap if the accept stat is nonzero: */
1588        if (*p != rpc_success) {
1589                resbuf->head[0].iov_len -= 2 * 4;
1590                return NULL;
1591        }
1592        p++;
1593        return p;
1594}
1595
1596static inline int
1597svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp)
1598{
1599        struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data;
1600        struct rpc_gss_wire_cred *gc = &gsd->clcred;
1601        struct xdr_buf *resbuf = &rqstp->rq_res;
1602        struct xdr_buf integ_buf;
1603        struct xdr_netobj mic;
1604        struct kvec *resv;
1605        __be32 *p;
1606        int integ_offset, integ_len;
1607        int stat = -EINVAL;
1608
1609        p = svcauth_gss_prepare_to_wrap(resbuf, gsd);
1610        if (p == NULL)
1611                goto out;
1612        integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base;
1613        integ_len = resbuf->len - integ_offset;
1614        BUG_ON(integ_len % 4);
1615        *p++ = htonl(integ_len);
1616        *p++ = htonl(gc->gc_seq);
1617        if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, integ_len)) {
1618                WARN_ON_ONCE(1);
1619                goto out_err;
1620        }
1621        if (resbuf->tail[0].iov_base == NULL) {
1622                if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE > PAGE_SIZE)
1623                        goto out_err;
1624                resbuf->tail[0].iov_base = resbuf->head[0].iov_base
1625                                                + resbuf->head[0].iov_len;
1626                resbuf->tail[0].iov_len = 0;
1627        }
1628        resv = &resbuf->tail[0];
1629        mic.data = (u8 *)resv->iov_base + resv->iov_len + 4;
1630        if (gss_get_mic(gsd->rsci->mechctx, &integ_buf, &mic))
1631                goto out_err;
1632        svc_putnl(resv, mic.len);
1633        memset(mic.data + mic.len, 0,
1634                        round_up_to_quad(mic.len) - mic.len);
1635        resv->iov_len += XDR_QUADLEN(mic.len) << 2;
1636        /* not strictly required: */
1637        resbuf->len += XDR_QUADLEN(mic.len) << 2;
1638        BUG_ON(resv->iov_len > PAGE_SIZE);
1639out:
1640        stat = 0;
1641out_err:
1642        return stat;
1643}
1644
1645static inline int
1646svcauth_gss_wrap_resp_priv(struct svc_rqst *rqstp)
1647{
1648        struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data;
1649        struct rpc_gss_wire_cred *gc = &gsd->clcred;
1650        struct xdr_buf *resbuf = &rqstp->rq_res;
1651        struct page **inpages = NULL;
1652        __be32 *p, *len;
1653        int offset;
1654        int pad;
1655
1656        p = svcauth_gss_prepare_to_wrap(resbuf, gsd);
1657        if (p == NULL)
1658                return 0;
1659        len = p++;
1660        offset = (u8 *)p - (u8 *)resbuf->head[0].iov_base;
1661        *p++ = htonl(gc->gc_seq);
1662        inpages = resbuf->pages;
1663        /* XXX: Would be better to write some xdr helper functions for
1664         * nfs{2,3,4}xdr.c that place the data right, instead of copying: */
1665
1666        /*
1667         * If there is currently tail data, make sure there is
1668         * room for the head, tail, and 2 * RPC_MAX_AUTH_SIZE in
1669         * the page, and move the current tail data such that
1670         * there is RPC_MAX_AUTH_SIZE slack space available in
1671         * both the head and tail.
1672         */
1673        if (resbuf->tail[0].iov_base) {
1674                BUG_ON(resbuf->tail[0].iov_base >= resbuf->head[0].iov_base
1675                                                        + PAGE_SIZE);
1676                BUG_ON(resbuf->tail[0].iov_base < resbuf->head[0].iov_base);
1677                if (resbuf->tail[0].iov_len + resbuf->head[0].iov_len
1678                                + 2 * RPC_MAX_AUTH_SIZE > PAGE_SIZE)
1679                        return -ENOMEM;
1680                memmove(resbuf->tail[0].iov_base + RPC_MAX_AUTH_SIZE,
1681                        resbuf->tail[0].iov_base,
1682                        resbuf->tail[0].iov_len);
1683                resbuf->tail[0].iov_base += RPC_MAX_AUTH_SIZE;
1684        }
1685        /*
1686         * If there is no current tail data, make sure there is
1687         * room for the head data, and 2 * RPC_MAX_AUTH_SIZE in the
1688         * allotted page, and set up tail information such that there
1689         * is RPC_MAX_AUTH_SIZE slack space available in both the
1690         * head and tail.
1691         */
1692        if (resbuf->tail[0].iov_base == NULL) {
1693                if (resbuf->head[0].iov_len + 2*RPC_MAX_AUTH_SIZE > PAGE_SIZE)
1694                        return -ENOMEM;
1695                resbuf->tail[0].iov_base = resbuf->head[0].iov_base
1696                        + resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE;
1697                resbuf->tail[0].iov_len = 0;
1698        }
1699        if (gss_wrap(gsd->rsci->mechctx, offset, resbuf, inpages))
1700                return -ENOMEM;
1701        *len = htonl(resbuf->len - offset);
1702        pad = 3 - ((resbuf->len - offset - 1)&3);
1703        p = (__be32 *)(resbuf->tail[0].iov_base + resbuf->tail[0].iov_len);
1704        memset(p, 0, pad);
1705        resbuf->tail[0].iov_len += pad;
1706        resbuf->len += pad;
1707        return 0;
1708}
1709
1710static int
1711svcauth_gss_release(struct svc_rqst *rqstp)
1712{
1713        struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data;
1714        struct rpc_gss_wire_cred *gc = &gsd->clcred;
1715        struct xdr_buf *resbuf = &rqstp->rq_res;
1716        int stat = -EINVAL;
1717        struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id);
1718
1719        if (gc->gc_proc != RPC_GSS_PROC_DATA)
1720                goto out;
1721        /* Release can be called twice, but we only wrap once. */
1722        if (gsd->verf_start == NULL)
1723                goto out;
1724        /* normally not set till svc_send, but we need it here: */
1725        /* XXX: what for?  Do we mess it up the moment we call svc_putu32
1726         * or whatever? */
1727        resbuf->len = total_buf_len(resbuf);
1728        switch (gc->gc_svc) {
1729        case RPC_GSS_SVC_NONE:
1730                break;
1731        case RPC_GSS_SVC_INTEGRITY:
1732                stat = svcauth_gss_wrap_resp_integ(rqstp);
1733                if (stat)
1734                        goto out_err;
1735                break;
1736        case RPC_GSS_SVC_PRIVACY:
1737                stat = svcauth_gss_wrap_resp_priv(rqstp);
1738                if (stat)
1739                        goto out_err;
1740                break;
1741        /*
1742         * For any other gc_svc value, svcauth_gss_accept() already set
1743         * the auth_error appropriately; just fall through:
1744         */
1745        }
1746
1747out:
1748        stat = 0;
1749out_err:
1750        if (rqstp->rq_client)
1751                auth_domain_put(rqstp->rq_client);
1752        rqstp->rq_client = NULL;
1753        if (rqstp->rq_gssclient)
1754                auth_domain_put(rqstp->rq_gssclient);
1755        rqstp->rq_gssclient = NULL;
1756        if (rqstp->rq_cred.cr_group_info)
1757                put_group_info(rqstp->rq_cred.cr_group_info);
1758        rqstp->rq_cred.cr_group_info = NULL;
1759        if (gsd->rsci)
1760                cache_put(&gsd->rsci->h, sn->rsc_cache);
1761        gsd->rsci = NULL;
1762
1763        return stat;
1764}
1765
1766static void
1767svcauth_gss_domain_release(struct auth_domain *dom)
1768{
1769        struct gss_domain *gd = container_of(dom, struct gss_domain, h);
1770
1771        kfree(dom->name);
1772        kfree(gd);
1773}
1774
1775static struct auth_ops svcauthops_gss = {
1776        .name           = "rpcsec_gss",
1777        .owner          = THIS_MODULE,
1778        .flavour        = RPC_AUTH_GSS,
1779        .accept         = svcauth_gss_accept,
1780        .release        = svcauth_gss_release,
1781        .domain_release = svcauth_gss_domain_release,
1782        .set_client     = svcauth_gss_set_client,
1783};
1784
1785static int rsi_cache_create_net(struct net *net)
1786{
1787        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1788        struct cache_detail *cd;
1789        int err;
1790
1791        cd = cache_create_net(&rsi_cache_template, net);
1792        if (IS_ERR(cd))
1793                return PTR_ERR(cd);
1794        err = cache_register_net(cd, net);
1795        if (err) {
1796                cache_destroy_net(cd, net);
1797                return err;
1798        }
1799        sn->rsi_cache = cd;
1800        return 0;
1801}
1802
1803static void rsi_cache_destroy_net(struct net *net)
1804{
1805        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1806        struct cache_detail *cd = sn->rsi_cache;
1807
1808        sn->rsi_cache = NULL;
1809        cache_purge(cd);
1810        cache_unregister_net(cd, net);
1811        cache_destroy_net(cd, net);
1812}
1813
1814static int rsc_cache_create_net(struct net *net)
1815{
1816        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1817        struct cache_detail *cd;
1818        int err;
1819
1820        cd = cache_create_net(&rsc_cache_template, net);
1821        if (IS_ERR(cd))
1822                return PTR_ERR(cd);
1823        err = cache_register_net(cd, net);
1824        if (err) {
1825                cache_destroy_net(cd, net);
1826                return err;
1827        }
1828        sn->rsc_cache = cd;
1829        return 0;
1830}
1831
1832static void rsc_cache_destroy_net(struct net *net)
1833{
1834        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1835        struct cache_detail *cd = sn->rsc_cache;
1836
1837        sn->rsc_cache = NULL;
1838        cache_purge(cd);
1839        cache_unregister_net(cd, net);
1840        cache_destroy_net(cd, net);
1841}
1842
1843int
1844gss_svc_init_net(struct net *net)
1845{
1846        int rv;
1847
1848        rv = rsc_cache_create_net(net);
1849        if (rv)
1850                return rv;
1851        rv = rsi_cache_create_net(net);
1852        if (rv)
1853                goto out1;
1854        rv = create_use_gss_proxy_proc_entry(net);
1855        if (rv)
1856                goto out2;
1857        return 0;
1858out2:
1859        destroy_use_gss_proxy_proc_entry(net);
1860out1:
1861        rsc_cache_destroy_net(net);
1862        return rv;
1863}
1864
1865void
1866gss_svc_shutdown_net(struct net *net)
1867{
1868        destroy_use_gss_proxy_proc_entry(net);
1869        rsi_cache_destroy_net(net);
1870        rsc_cache_destroy_net(net);
1871}
1872
1873int
1874gss_svc_init(void)
1875{
1876        return svc_auth_register(RPC_AUTH_GSS, &svcauthops_gss);
1877}
1878
1879void
1880gss_svc_shutdown(void)
1881{
1882        svc_auth_unregister(RPC_AUTH_GSS);
1883}
1884