linux/crypto/af_alg.c
<<
>>
Prefs
   1/*
   2 * af_alg: User-space algorithm interface
   3 *
   4 * This file provides the user-space API for algorithms.
   5 *
   6 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License as published by the Free
  10 * Software Foundation; either version 2 of the License, or (at your option)
  11 * any later version.
  12 *
  13 */
  14
  15#include <linux/atomic.h>
  16#include <crypto/if_alg.h>
  17#include <linux/crypto.h>
  18#include <linux/init.h>
  19#include <linux/kernel.h>
  20#include <linux/list.h>
  21#include <linux/module.h>
  22#include <linux/net.h>
  23#include <linux/rwsem.h>
  24#include <linux/sched/signal.h>
  25#include <linux/security.h>
  26
  27struct alg_type_list {
  28        const struct af_alg_type *type;
  29        struct list_head list;
  30};
  31
  32static atomic_long_t alg_memory_allocated;
  33
  34static struct proto alg_proto = {
  35        .name                   = "ALG",
  36        .owner                  = THIS_MODULE,
  37        .memory_allocated       = &alg_memory_allocated,
  38        .obj_size               = sizeof(struct alg_sock),
  39};
  40
  41static LIST_HEAD(alg_types);
  42static DECLARE_RWSEM(alg_types_sem);
  43
  44static const struct af_alg_type *alg_get_type(const char *name)
  45{
  46        const struct af_alg_type *type = ERR_PTR(-ENOENT);
  47        struct alg_type_list *node;
  48
  49        down_read(&alg_types_sem);
  50        list_for_each_entry(node, &alg_types, list) {
  51                if (strcmp(node->type->name, name))
  52                        continue;
  53
  54                if (try_module_get(node->type->owner))
  55                        type = node->type;
  56                break;
  57        }
  58        up_read(&alg_types_sem);
  59
  60        return type;
  61}
  62
  63int af_alg_register_type(const struct af_alg_type *type)
  64{
  65        struct alg_type_list *node;
  66        int err = -EEXIST;
  67
  68        down_write(&alg_types_sem);
  69        list_for_each_entry(node, &alg_types, list) {
  70                if (!strcmp(node->type->name, type->name))
  71                        goto unlock;
  72        }
  73
  74        node = kmalloc(sizeof(*node), GFP_KERNEL);
  75        err = -ENOMEM;
  76        if (!node)
  77                goto unlock;
  78
  79        type->ops->owner = THIS_MODULE;
  80        if (type->ops_nokey)
  81                type->ops_nokey->owner = THIS_MODULE;
  82        node->type = type;
  83        list_add(&node->list, &alg_types);
  84        err = 0;
  85
  86unlock:
  87        up_write(&alg_types_sem);
  88
  89        return err;
  90}
  91EXPORT_SYMBOL_GPL(af_alg_register_type);
  92
  93int af_alg_unregister_type(const struct af_alg_type *type)
  94{
  95        struct alg_type_list *node;
  96        int err = -ENOENT;
  97
  98        down_write(&alg_types_sem);
  99        list_for_each_entry(node, &alg_types, list) {
 100                if (strcmp(node->type->name, type->name))
 101                        continue;
 102
 103                list_del(&node->list);
 104                kfree(node);
 105                err = 0;
 106                break;
 107        }
 108        up_write(&alg_types_sem);
 109
 110        return err;
 111}
 112EXPORT_SYMBOL_GPL(af_alg_unregister_type);
 113
 114static void alg_do_release(const struct af_alg_type *type, void *private)
 115{
 116        if (!type)
 117                return;
 118
 119        type->release(private);
 120        module_put(type->owner);
 121}
 122
 123int af_alg_release(struct socket *sock)
 124{
 125        if (sock->sk)
 126                sock_put(sock->sk);
 127        return 0;
 128}
 129EXPORT_SYMBOL_GPL(af_alg_release);
 130
 131void af_alg_release_parent(struct sock *sk)
 132{
 133        struct alg_sock *ask = alg_sk(sk);
 134        unsigned int nokey = ask->nokey_refcnt;
 135        bool last = nokey && !ask->refcnt;
 136
 137        sk = ask->parent;
 138        ask = alg_sk(sk);
 139
 140        lock_sock(sk);
 141        ask->nokey_refcnt -= nokey;
 142        if (!last)
 143                last = !--ask->refcnt;
 144        release_sock(sk);
 145
 146        if (last)
 147                sock_put(sk);
 148}
 149EXPORT_SYMBOL_GPL(af_alg_release_parent);
 150
 151static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 152{
 153        const u32 allowed = CRYPTO_ALG_KERN_DRIVER_ONLY;
 154        struct sock *sk = sock->sk;
 155        struct alg_sock *ask = alg_sk(sk);
 156        struct sockaddr_alg *sa = (void *)uaddr;
 157        const struct af_alg_type *type;
 158        void *private;
 159        int err;
 160
 161        if (sock->state == SS_CONNECTED)
 162                return -EINVAL;
 163
 164        if (addr_len < sizeof(*sa))
 165                return -EINVAL;
 166
 167        /* If caller uses non-allowed flag, return error. */
 168        if ((sa->salg_feat & ~allowed) || (sa->salg_mask & ~allowed))
 169                return -EINVAL;
 170
 171        sa->salg_type[sizeof(sa->salg_type) - 1] = 0;
 172        sa->salg_name[sizeof(sa->salg_name) + addr_len - sizeof(*sa) - 1] = 0;
 173
 174        type = alg_get_type(sa->salg_type);
 175        if (IS_ERR(type) && PTR_ERR(type) == -ENOENT) {
 176                request_module("algif-%s", sa->salg_type);
 177                type = alg_get_type(sa->salg_type);
 178        }
 179
 180        if (IS_ERR(type))
 181                return PTR_ERR(type);
 182
 183        private = type->bind(sa->salg_name, sa->salg_feat, sa->salg_mask);
 184        if (IS_ERR(private)) {
 185                module_put(type->owner);
 186                return PTR_ERR(private);
 187        }
 188
 189        err = -EBUSY;
 190        lock_sock(sk);
 191        if (ask->refcnt | ask->nokey_refcnt)
 192                goto unlock;
 193
 194        swap(ask->type, type);
 195        swap(ask->private, private);
 196
 197        err = 0;
 198
 199unlock:
 200        release_sock(sk);
 201
 202        alg_do_release(type, private);
 203
 204        return err;
 205}
 206
 207static int alg_setkey(struct sock *sk, char __user *ukey,
 208                      unsigned int keylen)
 209{
 210        struct alg_sock *ask = alg_sk(sk);
 211        const struct af_alg_type *type = ask->type;
 212        u8 *key;
 213        int err;
 214
 215        key = sock_kmalloc(sk, keylen, GFP_KERNEL);
 216        if (!key)
 217                return -ENOMEM;
 218
 219        err = -EFAULT;
 220        if (copy_from_user(key, ukey, keylen))
 221                goto out;
 222
 223        err = type->setkey(ask->private, key, keylen);
 224
 225out:
 226        sock_kzfree_s(sk, key, keylen);
 227
 228        return err;
 229}
 230
 231static int alg_setsockopt(struct socket *sock, int level, int optname,
 232                          char __user *optval, unsigned int optlen)
 233{
 234        struct sock *sk = sock->sk;
 235        struct alg_sock *ask = alg_sk(sk);
 236        const struct af_alg_type *type;
 237        int err = -EBUSY;
 238
 239        lock_sock(sk);
 240        if (ask->refcnt)
 241                goto unlock;
 242
 243        type = ask->type;
 244
 245        err = -ENOPROTOOPT;
 246        if (level != SOL_ALG || !type)
 247                goto unlock;
 248
 249        switch (optname) {
 250        case ALG_SET_KEY:
 251                if (sock->state == SS_CONNECTED)
 252                        goto unlock;
 253                if (!type->setkey)
 254                        goto unlock;
 255
 256                err = alg_setkey(sk, optval, optlen);
 257                break;
 258        case ALG_SET_AEAD_AUTHSIZE:
 259                if (sock->state == SS_CONNECTED)
 260                        goto unlock;
 261                if (!type->setauthsize)
 262                        goto unlock;
 263                err = type->setauthsize(ask->private, optlen);
 264        }
 265
 266unlock:
 267        release_sock(sk);
 268
 269        return err;
 270}
 271
 272int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
 273{
 274        struct alg_sock *ask = alg_sk(sk);
 275        const struct af_alg_type *type;
 276        struct sock *sk2;
 277        unsigned int nokey;
 278        int err;
 279
 280        lock_sock(sk);
 281        type = ask->type;
 282
 283        err = -EINVAL;
 284        if (!type)
 285                goto unlock;
 286
 287        sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto, kern);
 288        err = -ENOMEM;
 289        if (!sk2)
 290                goto unlock;
 291
 292        sock_init_data(newsock, sk2);
 293        security_sock_graft(sk2, newsock);
 294        security_sk_clone(sk, sk2);
 295
 296        err = type->accept(ask->private, sk2);
 297
 298        nokey = err == -ENOKEY;
 299        if (nokey && type->accept_nokey)
 300                err = type->accept_nokey(ask->private, sk2);
 301
 302        if (err)
 303                goto unlock;
 304
 305        sk2->sk_family = PF_ALG;
 306
 307        if (nokey || !ask->refcnt++)
 308                sock_hold(sk);
 309        ask->nokey_refcnt += nokey;
 310        alg_sk(sk2)->parent = sk;
 311        alg_sk(sk2)->type = type;
 312        alg_sk(sk2)->nokey_refcnt = nokey;
 313
 314        newsock->ops = type->ops;
 315        newsock->state = SS_CONNECTED;
 316
 317        if (nokey)
 318                newsock->ops = type->ops_nokey;
 319
 320        err = 0;
 321
 322unlock:
 323        release_sock(sk);
 324
 325        return err;
 326}
 327EXPORT_SYMBOL_GPL(af_alg_accept);
 328
 329static int alg_accept(struct socket *sock, struct socket *newsock, int flags,
 330                      bool kern)
 331{
 332        return af_alg_accept(sock->sk, newsock, kern);
 333}
 334
 335static const struct proto_ops alg_proto_ops = {
 336        .family         =       PF_ALG,
 337        .owner          =       THIS_MODULE,
 338
 339        .connect        =       sock_no_connect,
 340        .socketpair     =       sock_no_socketpair,
 341        .getname        =       sock_no_getname,
 342        .ioctl          =       sock_no_ioctl,
 343        .listen         =       sock_no_listen,
 344        .shutdown       =       sock_no_shutdown,
 345        .getsockopt     =       sock_no_getsockopt,
 346        .mmap           =       sock_no_mmap,
 347        .sendpage       =       sock_no_sendpage,
 348        .sendmsg        =       sock_no_sendmsg,
 349        .recvmsg        =       sock_no_recvmsg,
 350
 351        .bind           =       alg_bind,
 352        .release        =       af_alg_release,
 353        .setsockopt     =       alg_setsockopt,
 354        .accept         =       alg_accept,
 355};
 356
 357static void alg_sock_destruct(struct sock *sk)
 358{
 359        struct alg_sock *ask = alg_sk(sk);
 360
 361        alg_do_release(ask->type, ask->private);
 362}
 363
 364static int alg_create(struct net *net, struct socket *sock, int protocol,
 365                      int kern)
 366{
 367        struct sock *sk;
 368        int err;
 369
 370        if (sock->type != SOCK_SEQPACKET)
 371                return -ESOCKTNOSUPPORT;
 372        if (protocol != 0)
 373                return -EPROTONOSUPPORT;
 374
 375        err = -ENOMEM;
 376        sk = sk_alloc(net, PF_ALG, GFP_KERNEL, &alg_proto, kern);
 377        if (!sk)
 378                goto out;
 379
 380        sock->ops = &alg_proto_ops;
 381        sock_init_data(sock, sk);
 382
 383        sk->sk_family = PF_ALG;
 384        sk->sk_destruct = alg_sock_destruct;
 385
 386        return 0;
 387out:
 388        return err;
 389}
 390
 391static const struct net_proto_family alg_family = {
 392        .family =       PF_ALG,
 393        .create =       alg_create,
 394        .owner  =       THIS_MODULE,
 395};
 396
 397int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len)
 398{
 399        size_t off;
 400        ssize_t n;
 401        int npages, i;
 402
 403        n = iov_iter_get_pages(iter, sgl->pages, len, ALG_MAX_PAGES, &off);
 404        if (n < 0)
 405                return n;
 406
 407        npages = (off + n + PAGE_SIZE - 1) >> PAGE_SHIFT;
 408        if (WARN_ON(npages == 0))
 409                return -EINVAL;
 410        /* Add one extra for linking */
 411        sg_init_table(sgl->sg, npages + 1);
 412
 413        for (i = 0, len = n; i < npages; i++) {
 414                int plen = min_t(int, len, PAGE_SIZE - off);
 415
 416                sg_set_page(sgl->sg + i, sgl->pages[i], plen, off);
 417
 418                off = 0;
 419                len -= plen;
 420        }
 421        sg_mark_end(sgl->sg + npages - 1);
 422        sgl->npages = npages;
 423
 424        return n;
 425}
 426EXPORT_SYMBOL_GPL(af_alg_make_sg);
 427
 428void af_alg_link_sg(struct af_alg_sgl *sgl_prev, struct af_alg_sgl *sgl_new)
 429{
 430        sg_unmark_end(sgl_prev->sg + sgl_prev->npages - 1);
 431        sg_chain(sgl_prev->sg, sgl_prev->npages + 1, sgl_new->sg);
 432}
 433EXPORT_SYMBOL_GPL(af_alg_link_sg);
 434
 435void af_alg_free_sg(struct af_alg_sgl *sgl)
 436{
 437        int i;
 438
 439        for (i = 0; i < sgl->npages; i++)
 440                put_page(sgl->pages[i]);
 441}
 442EXPORT_SYMBOL_GPL(af_alg_free_sg);
 443
 444int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
 445{
 446        struct cmsghdr *cmsg;
 447
 448        for_each_cmsghdr(cmsg, msg) {
 449                if (!CMSG_OK(msg, cmsg))
 450                        return -EINVAL;
 451                if (cmsg->cmsg_level != SOL_ALG)
 452                        continue;
 453
 454                switch (cmsg->cmsg_type) {
 455                case ALG_SET_IV:
 456                        if (cmsg->cmsg_len < CMSG_LEN(sizeof(*con->iv)))
 457                                return -EINVAL;
 458                        con->iv = (void *)CMSG_DATA(cmsg);
 459                        if (cmsg->cmsg_len < CMSG_LEN(con->iv->ivlen +
 460                                                      sizeof(*con->iv)))
 461                                return -EINVAL;
 462                        break;
 463
 464                case ALG_SET_OP:
 465                        if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32)))
 466                                return -EINVAL;
 467                        con->op = *(u32 *)CMSG_DATA(cmsg);
 468                        break;
 469
 470                case ALG_SET_AEAD_ASSOCLEN:
 471                        if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32)))
 472                                return -EINVAL;
 473                        con->aead_assoclen = *(u32 *)CMSG_DATA(cmsg);
 474                        break;
 475
 476                default:
 477                        return -EINVAL;
 478                }
 479        }
 480
 481        return 0;
 482}
 483EXPORT_SYMBOL_GPL(af_alg_cmsg_send);
 484
 485/**
 486 * af_alg_alloc_tsgl - allocate the TX SGL
 487 *
 488 * @sk socket of connection to user space
 489 * @return: 0 upon success, < 0 upon error
 490 */
 491int af_alg_alloc_tsgl(struct sock *sk)
 492{
 493        struct alg_sock *ask = alg_sk(sk);
 494        struct af_alg_ctx *ctx = ask->private;
 495        struct af_alg_tsgl *sgl;
 496        struct scatterlist *sg = NULL;
 497
 498        sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl, list);
 499        if (!list_empty(&ctx->tsgl_list))
 500                sg = sgl->sg;
 501
 502        if (!sg || sgl->cur >= MAX_SGL_ENTS) {
 503                sgl = sock_kmalloc(sk,
 504                                   struct_size(sgl, sg, (MAX_SGL_ENTS + 1)),
 505                                   GFP_KERNEL);
 506                if (!sgl)
 507                        return -ENOMEM;
 508
 509                sg_init_table(sgl->sg, MAX_SGL_ENTS + 1);
 510                sgl->cur = 0;
 511
 512                if (sg)
 513                        sg_chain(sg, MAX_SGL_ENTS + 1, sgl->sg);
 514
 515                list_add_tail(&sgl->list, &ctx->tsgl_list);
 516        }
 517
 518        return 0;
 519}
 520EXPORT_SYMBOL_GPL(af_alg_alloc_tsgl);
 521
 522/**
 523 * aead_count_tsgl - Count number of TX SG entries
 524 *
 525 * The counting starts from the beginning of the SGL to @bytes. If
 526 * an offset is provided, the counting of the SG entries starts at the offset.
 527 *
 528 * @sk socket of connection to user space
 529 * @bytes Count the number of SG entries holding given number of bytes.
 530 * @offset Start the counting of SG entries from the given offset.
 531 * @return Number of TX SG entries found given the constraints
 532 */
 533unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset)
 534{
 535        struct alg_sock *ask = alg_sk(sk);
 536        struct af_alg_ctx *ctx = ask->private;
 537        struct af_alg_tsgl *sgl, *tmp;
 538        unsigned int i;
 539        unsigned int sgl_count = 0;
 540
 541        if (!bytes)
 542                return 0;
 543
 544        list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
 545                struct scatterlist *sg = sgl->sg;
 546
 547                for (i = 0; i < sgl->cur; i++) {
 548                        size_t bytes_count;
 549
 550                        /* Skip offset */
 551                        if (offset >= sg[i].length) {
 552                                offset -= sg[i].length;
 553                                bytes -= sg[i].length;
 554                                continue;
 555                        }
 556
 557                        bytes_count = sg[i].length - offset;
 558
 559                        offset = 0;
 560                        sgl_count++;
 561
 562                        /* If we have seen requested number of bytes, stop */
 563                        if (bytes_count >= bytes)
 564                                return sgl_count;
 565
 566                        bytes -= bytes_count;
 567                }
 568        }
 569
 570        return sgl_count;
 571}
 572EXPORT_SYMBOL_GPL(af_alg_count_tsgl);
 573
 574/**
 575 * aead_pull_tsgl - Release the specified buffers from TX SGL
 576 *
 577 * If @dst is non-null, reassign the pages to dst. The caller must release
 578 * the pages. If @dst_offset is given only reassign the pages to @dst starting
 579 * at the @dst_offset (byte). The caller must ensure that @dst is large
 580 * enough (e.g. by using af_alg_count_tsgl with the same offset).
 581 *
 582 * @sk socket of connection to user space
 583 * @used Number of bytes to pull from TX SGL
 584 * @dst If non-NULL, buffer is reassigned to dst SGL instead of releasing. The
 585 *      caller must release the buffers in dst.
 586 * @dst_offset Reassign the TX SGL from given offset. All buffers before
 587 *             reaching the offset is released.
 588 */
 589void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
 590                      size_t dst_offset)
 591{
 592        struct alg_sock *ask = alg_sk(sk);
 593        struct af_alg_ctx *ctx = ask->private;
 594        struct af_alg_tsgl *sgl;
 595        struct scatterlist *sg;
 596        unsigned int i, j = 0;
 597
 598        while (!list_empty(&ctx->tsgl_list)) {
 599                sgl = list_first_entry(&ctx->tsgl_list, struct af_alg_tsgl,
 600                                       list);
 601                sg = sgl->sg;
 602
 603                for (i = 0; i < sgl->cur; i++) {
 604                        size_t plen = min_t(size_t, used, sg[i].length);
 605                        struct page *page = sg_page(sg + i);
 606
 607                        if (!page)
 608                                continue;
 609
 610                        /*
 611                         * Assumption: caller created af_alg_count_tsgl(len)
 612                         * SG entries in dst.
 613                         */
 614                        if (dst) {
 615                                if (dst_offset >= plen) {
 616                                        /* discard page before offset */
 617                                        dst_offset -= plen;
 618                                } else {
 619                                        /* reassign page to dst after offset */
 620                                        get_page(page);
 621                                        sg_set_page(dst + j, page,
 622                                                    plen - dst_offset,
 623                                                    sg[i].offset + dst_offset);
 624                                        dst_offset = 0;
 625                                        j++;
 626                                }
 627                        }
 628
 629                        sg[i].length -= plen;
 630                        sg[i].offset += plen;
 631
 632                        used -= plen;
 633                        ctx->used -= plen;
 634
 635                        if (sg[i].length)
 636                                return;
 637
 638                        put_page(page);
 639                        sg_assign_page(sg + i, NULL);
 640                }
 641
 642                list_del(&sgl->list);
 643                sock_kfree_s(sk, sgl, sizeof(*sgl) + sizeof(sgl->sg[0]) *
 644                                                     (MAX_SGL_ENTS + 1));
 645        }
 646
 647        if (!ctx->used)
 648                ctx->merge = 0;
 649}
 650EXPORT_SYMBOL_GPL(af_alg_pull_tsgl);
 651
 652/**
 653 * af_alg_free_areq_sgls - Release TX and RX SGLs of the request
 654 *
 655 * @areq Request holding the TX and RX SGL
 656 */
 657void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
 658{
 659        struct sock *sk = areq->sk;
 660        struct alg_sock *ask = alg_sk(sk);
 661        struct af_alg_ctx *ctx = ask->private;
 662        struct af_alg_rsgl *rsgl, *tmp;
 663        struct scatterlist *tsgl;
 664        struct scatterlist *sg;
 665        unsigned int i;
 666
 667        list_for_each_entry_safe(rsgl, tmp, &areq->rsgl_list, list) {
 668                atomic_sub(rsgl->sg_num_bytes, &ctx->rcvused);
 669                af_alg_free_sg(&rsgl->sgl);
 670                list_del(&rsgl->list);
 671                if (rsgl != &areq->first_rsgl)
 672                        sock_kfree_s(sk, rsgl, sizeof(*rsgl));
 673        }
 674
 675        tsgl = areq->tsgl;
 676        if (tsgl) {
 677                for_each_sg(tsgl, sg, areq->tsgl_entries, i) {
 678                        if (!sg_page(sg))
 679                                continue;
 680                        put_page(sg_page(sg));
 681                }
 682
 683                sock_kfree_s(sk, tsgl, areq->tsgl_entries * sizeof(*tsgl));
 684        }
 685}
 686EXPORT_SYMBOL_GPL(af_alg_free_areq_sgls);
 687
 688/**
 689 * af_alg_wait_for_wmem - wait for availability of writable memory
 690 *
 691 * @sk socket of connection to user space
 692 * @flags If MSG_DONTWAIT is set, then only report if function would sleep
 693 * @return 0 when writable memory is available, < 0 upon error
 694 */
 695int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags)
 696{
 697        DEFINE_WAIT_FUNC(wait, woken_wake_function);
 698        int err = -ERESTARTSYS;
 699        long timeout;
 700
 701        if (flags & MSG_DONTWAIT)
 702                return -EAGAIN;
 703
 704        sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
 705
 706        add_wait_queue(sk_sleep(sk), &wait);
 707        for (;;) {
 708                if (signal_pending(current))
 709                        break;
 710                timeout = MAX_SCHEDULE_TIMEOUT;
 711                if (sk_wait_event(sk, &timeout, af_alg_writable(sk), &wait)) {
 712                        err = 0;
 713                        break;
 714                }
 715        }
 716        remove_wait_queue(sk_sleep(sk), &wait);
 717
 718        return err;
 719}
 720EXPORT_SYMBOL_GPL(af_alg_wait_for_wmem);
 721
 722/**
 723 * af_alg_wmem_wakeup - wakeup caller when writable memory is available
 724 *
 725 * @sk socket of connection to user space
 726 */
 727void af_alg_wmem_wakeup(struct sock *sk)
 728{
 729        struct socket_wq *wq;
 730
 731        if (!af_alg_writable(sk))
 732                return;
 733
 734        rcu_read_lock();
 735        wq = rcu_dereference(sk->sk_wq);
 736        if (skwq_has_sleeper(wq))
 737                wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN |
 738                                                           EPOLLRDNORM |
 739                                                           EPOLLRDBAND);
 740        sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
 741        rcu_read_unlock();
 742}
 743EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup);
 744
 745/**
 746 * af_alg_wait_for_data - wait for availability of TX data
 747 *
 748 * @sk socket of connection to user space
 749 * @flags If MSG_DONTWAIT is set, then only report if function would sleep
 750 * @return 0 when writable memory is available, < 0 upon error
 751 */
 752int af_alg_wait_for_data(struct sock *sk, unsigned flags)
 753{
 754        DEFINE_WAIT_FUNC(wait, woken_wake_function);
 755        struct alg_sock *ask = alg_sk(sk);
 756        struct af_alg_ctx *ctx = ask->private;
 757        long timeout;
 758        int err = -ERESTARTSYS;
 759
 760        if (flags & MSG_DONTWAIT)
 761                return -EAGAIN;
 762
 763        sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
 764
 765        add_wait_queue(sk_sleep(sk), &wait);
 766        for (;;) {
 767                if (signal_pending(current))
 768                        break;
 769                timeout = MAX_SCHEDULE_TIMEOUT;
 770                if (sk_wait_event(sk, &timeout, (ctx->used || !ctx->more),
 771                                  &wait)) {
 772                        err = 0;
 773                        break;
 774                }
 775        }
 776        remove_wait_queue(sk_sleep(sk), &wait);
 777
 778        sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
 779
 780        return err;
 781}
 782EXPORT_SYMBOL_GPL(af_alg_wait_for_data);
 783
 784/**
 785 * af_alg_data_wakeup - wakeup caller when new data can be sent to kernel
 786 *
 787 * @sk socket of connection to user space
 788 */
 789
 790void af_alg_data_wakeup(struct sock *sk)
 791{
 792        struct alg_sock *ask = alg_sk(sk);
 793        struct af_alg_ctx *ctx = ask->private;
 794        struct socket_wq *wq;
 795
 796        if (!ctx->used)
 797                return;
 798
 799        rcu_read_lock();
 800        wq = rcu_dereference(sk->sk_wq);
 801        if (skwq_has_sleeper(wq))
 802                wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT |
 803                                                           EPOLLRDNORM |
 804                                                           EPOLLRDBAND);
 805        sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
 806        rcu_read_unlock();
 807}
 808EXPORT_SYMBOL_GPL(af_alg_data_wakeup);
 809
 810/**
 811 * af_alg_sendmsg - implementation of sendmsg system call handler
 812 *
 813 * The sendmsg system call handler obtains the user data and stores it
 814 * in ctx->tsgl_list. This implies allocation of the required numbers of
 815 * struct af_alg_tsgl.
 816 *
 817 * In addition, the ctx is filled with the information sent via CMSG.
 818 *
 819 * @sock socket of connection to user space
 820 * @msg message from user space
 821 * @size size of message from user space
 822 * @ivsize the size of the IV for the cipher operation to verify that the
 823 *         user-space-provided IV has the right size
 824 * @return the number of copied data upon success, < 0 upon error
 825 */
 826int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
 827                   unsigned int ivsize)
 828{
 829        struct sock *sk = sock->sk;
 830        struct alg_sock *ask = alg_sk(sk);
 831        struct af_alg_ctx *ctx = ask->private;
 832        struct af_alg_tsgl *sgl;
 833        struct af_alg_control con = {};
 834        long copied = 0;
 835        bool enc = 0;
 836        bool init = 0;
 837        int err = 0;
 838
 839        if (msg->msg_controllen) {
 840                err = af_alg_cmsg_send(msg, &con);
 841                if (err)
 842                        return err;
 843
 844                init = 1;
 845                switch (con.op) {
 846                case ALG_OP_ENCRYPT:
 847                        enc = 1;
 848                        break;
 849                case ALG_OP_DECRYPT:
 850                        enc = 0;
 851                        break;
 852                default:
 853                        return -EINVAL;
 854                }
 855
 856                if (con.iv && con.iv->ivlen != ivsize)
 857                        return -EINVAL;
 858        }
 859
 860        lock_sock(sk);
 861        if (!ctx->more && ctx->used) {
 862                err = -EINVAL;
 863                goto unlock;
 864        }
 865
 866        if (init) {
 867                ctx->enc = enc;
 868                if (con.iv)
 869                        memcpy(ctx->iv, con.iv->iv, ivsize);
 870
 871                ctx->aead_assoclen = con.aead_assoclen;
 872        }
 873
 874        while (size) {
 875                struct scatterlist *sg;
 876                size_t len = size;
 877                size_t plen;
 878
 879                /* use the existing memory in an allocated page */
 880                if (ctx->merge) {
 881                        sgl = list_entry(ctx->tsgl_list.prev,
 882                                         struct af_alg_tsgl, list);
 883                        sg = sgl->sg + sgl->cur - 1;
 884                        len = min_t(size_t, len,
 885                                    PAGE_SIZE - sg->offset - sg->length);
 886
 887                        err = memcpy_from_msg(page_address(sg_page(sg)) +
 888                                              sg->offset + sg->length,
 889                                              msg, len);
 890                        if (err)
 891                                goto unlock;
 892
 893                        sg->length += len;
 894                        ctx->merge = (sg->offset + sg->length) &
 895                                     (PAGE_SIZE - 1);
 896
 897                        ctx->used += len;
 898                        copied += len;
 899                        size -= len;
 900                        continue;
 901                }
 902
 903                if (!af_alg_writable(sk)) {
 904                        err = af_alg_wait_for_wmem(sk, msg->msg_flags);
 905                        if (err)
 906                                goto unlock;
 907                }
 908
 909                /* allocate a new page */
 910                len = min_t(unsigned long, len, af_alg_sndbuf(sk));
 911
 912                err = af_alg_alloc_tsgl(sk);
 913                if (err)
 914                        goto unlock;
 915
 916                sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl,
 917                                 list);
 918                sg = sgl->sg;
 919                if (sgl->cur)
 920                        sg_unmark_end(sg + sgl->cur - 1);
 921
 922                do {
 923                        unsigned int i = sgl->cur;
 924
 925                        plen = min_t(size_t, len, PAGE_SIZE);
 926
 927                        sg_assign_page(sg + i, alloc_page(GFP_KERNEL));
 928                        if (!sg_page(sg + i)) {
 929                                err = -ENOMEM;
 930                                goto unlock;
 931                        }
 932
 933                        err = memcpy_from_msg(page_address(sg_page(sg + i)),
 934                                              msg, plen);
 935                        if (err) {
 936                                __free_page(sg_page(sg + i));
 937                                sg_assign_page(sg + i, NULL);
 938                                goto unlock;
 939                        }
 940
 941                        sg[i].length = plen;
 942                        len -= plen;
 943                        ctx->used += plen;
 944                        copied += plen;
 945                        size -= plen;
 946                        sgl->cur++;
 947                } while (len && sgl->cur < MAX_SGL_ENTS);
 948
 949                if (!size)
 950                        sg_mark_end(sg + sgl->cur - 1);
 951
 952                ctx->merge = plen & (PAGE_SIZE - 1);
 953        }
 954
 955        err = 0;
 956
 957        ctx->more = msg->msg_flags & MSG_MORE;
 958
 959unlock:
 960        af_alg_data_wakeup(sk);
 961        release_sock(sk);
 962
 963        return copied ?: err;
 964}
 965EXPORT_SYMBOL_GPL(af_alg_sendmsg);
 966
 967/**
 968 * af_alg_sendpage - sendpage system call handler
 969 *
 970 * This is a generic implementation of sendpage to fill ctx->tsgl_list.
 971 */
 972ssize_t af_alg_sendpage(struct socket *sock, struct page *page,
 973                        int offset, size_t size, int flags)
 974{
 975        struct sock *sk = sock->sk;
 976        struct alg_sock *ask = alg_sk(sk);
 977        struct af_alg_ctx *ctx = ask->private;
 978        struct af_alg_tsgl *sgl;
 979        int err = -EINVAL;
 980
 981        if (flags & MSG_SENDPAGE_NOTLAST)
 982                flags |= MSG_MORE;
 983
 984        lock_sock(sk);
 985        if (!ctx->more && ctx->used)
 986                goto unlock;
 987
 988        if (!size)
 989                goto done;
 990
 991        if (!af_alg_writable(sk)) {
 992                err = af_alg_wait_for_wmem(sk, flags);
 993                if (err)
 994                        goto unlock;
 995        }
 996
 997        err = af_alg_alloc_tsgl(sk);
 998        if (err)
 999                goto unlock;
1000
1001        ctx->merge = 0;
1002        sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl, list);
1003
1004        if (sgl->cur)
1005                sg_unmark_end(sgl->sg + sgl->cur - 1);
1006
1007        sg_mark_end(sgl->sg + sgl->cur);
1008
1009        get_page(page);
1010        sg_set_page(sgl->sg + sgl->cur, page, size, offset);
1011        sgl->cur++;
1012        ctx->used += size;
1013
1014done:
1015        ctx->more = flags & MSG_MORE;
1016
1017unlock:
1018        af_alg_data_wakeup(sk);
1019        release_sock(sk);
1020
1021        return err ?: size;
1022}
1023EXPORT_SYMBOL_GPL(af_alg_sendpage);
1024
1025/**
1026 * af_alg_free_resources - release resources required for crypto request
1027 */
1028void af_alg_free_resources(struct af_alg_async_req *areq)
1029{
1030        struct sock *sk = areq->sk;
1031
1032        af_alg_free_areq_sgls(areq);
1033        sock_kfree_s(sk, areq, areq->areqlen);
1034}
1035EXPORT_SYMBOL_GPL(af_alg_free_resources);
1036
1037/**
1038 * af_alg_async_cb - AIO callback handler
1039 *
1040 * This handler cleans up the struct af_alg_async_req upon completion of the
1041 * AIO operation.
1042 *
1043 * The number of bytes to be generated with the AIO operation must be set
1044 * in areq->outlen before the AIO callback handler is invoked.
1045 */
1046void af_alg_async_cb(struct crypto_async_request *_req, int err)
1047{
1048        struct af_alg_async_req *areq = _req->data;
1049        struct sock *sk = areq->sk;
1050        struct kiocb *iocb = areq->iocb;
1051        unsigned int resultlen;
1052
1053        /* Buffer size written by crypto operation. */
1054        resultlen = areq->outlen;
1055
1056        af_alg_free_resources(areq);
1057        sock_put(sk);
1058
1059        iocb->ki_complete(iocb, err ? err : resultlen, 0);
1060}
1061EXPORT_SYMBOL_GPL(af_alg_async_cb);
1062
1063/**
1064 * af_alg_poll - poll system call handler
1065 */
1066__poll_t af_alg_poll(struct file *file, struct socket *sock,
1067                         poll_table *wait)
1068{
1069        struct sock *sk = sock->sk;
1070        struct alg_sock *ask = alg_sk(sk);
1071        struct af_alg_ctx *ctx = ask->private;
1072        __poll_t mask;
1073
1074        sock_poll_wait(file, sock, wait);
1075        mask = 0;
1076
1077        if (!ctx->more || ctx->used)
1078                mask |= EPOLLIN | EPOLLRDNORM;
1079
1080        if (af_alg_writable(sk))
1081                mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
1082
1083        return mask;
1084}
1085EXPORT_SYMBOL_GPL(af_alg_poll);
1086
1087/**
1088 * af_alg_alloc_areq - allocate struct af_alg_async_req
1089 *
1090 * @sk socket of connection to user space
1091 * @areqlen size of struct af_alg_async_req + crypto_*_reqsize
1092 * @return allocated data structure or ERR_PTR upon error
1093 */
1094struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
1095                                           unsigned int areqlen)
1096{
1097        struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
1098
1099        if (unlikely(!areq))
1100                return ERR_PTR(-ENOMEM);
1101
1102        areq->areqlen = areqlen;
1103        areq->sk = sk;
1104        areq->last_rsgl = NULL;
1105        INIT_LIST_HEAD(&areq->rsgl_list);
1106        areq->tsgl = NULL;
1107        areq->tsgl_entries = 0;
1108
1109        return areq;
1110}
1111EXPORT_SYMBOL_GPL(af_alg_alloc_areq);
1112
1113/**
1114 * af_alg_get_rsgl - create the RX SGL for the output data from the crypto
1115 *                   operation
1116 *
1117 * @sk socket of connection to user space
1118 * @msg user space message
1119 * @flags flags used to invoke recvmsg with
1120 * @areq instance of the cryptographic request that will hold the RX SGL
1121 * @maxsize maximum number of bytes to be pulled from user space
1122 * @outlen number of bytes in the RX SGL
1123 * @return 0 on success, < 0 upon error
1124 */
1125int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
1126                    struct af_alg_async_req *areq, size_t maxsize,
1127                    size_t *outlen)
1128{
1129        struct alg_sock *ask = alg_sk(sk);
1130        struct af_alg_ctx *ctx = ask->private;
1131        size_t len = 0;
1132
1133        while (maxsize > len && msg_data_left(msg)) {
1134                struct af_alg_rsgl *rsgl;
1135                size_t seglen;
1136                int err;
1137
1138                /* limit the amount of readable buffers */
1139                if (!af_alg_readable(sk))
1140                        break;
1141
1142                seglen = min_t(size_t, (maxsize - len),
1143                               msg_data_left(msg));
1144
1145                if (list_empty(&areq->rsgl_list)) {
1146                        rsgl = &areq->first_rsgl;
1147                } else {
1148                        rsgl = sock_kmalloc(sk, sizeof(*rsgl), GFP_KERNEL);
1149                        if (unlikely(!rsgl))
1150                                return -ENOMEM;
1151                }
1152
1153                rsgl->sgl.npages = 0;
1154                list_add_tail(&rsgl->list, &areq->rsgl_list);
1155
1156                /* make one iovec available as scatterlist */
1157                err = af_alg_make_sg(&rsgl->sgl, &msg->msg_iter, seglen);
1158                if (err < 0) {
1159                        rsgl->sg_num_bytes = 0;
1160                        return err;
1161                }
1162
1163                /* chain the new scatterlist with previous one */
1164                if (areq->last_rsgl)
1165                        af_alg_link_sg(&areq->last_rsgl->sgl, &rsgl->sgl);
1166
1167                areq->last_rsgl = rsgl;
1168                len += err;
1169                atomic_add(err, &ctx->rcvused);
1170                rsgl->sg_num_bytes = err;
1171                iov_iter_advance(&msg->msg_iter, err);
1172        }
1173
1174        *outlen = len;
1175        return 0;
1176}
1177EXPORT_SYMBOL_GPL(af_alg_get_rsgl);
1178
1179static int __init af_alg_init(void)
1180{
1181        int err = proto_register(&alg_proto, 0);
1182
1183        if (err)
1184                goto out;
1185
1186        err = sock_register(&alg_family);
1187        if (err != 0)
1188                goto out_unregister_proto;
1189
1190out:
1191        return err;
1192
1193out_unregister_proto:
1194        proto_unregister(&alg_proto);
1195        goto out;
1196}
1197
1198static void __exit af_alg_exit(void)
1199{
1200        sock_unregister(PF_ALG);
1201        proto_unregister(&alg_proto);
1202}
1203
1204module_init(af_alg_init);
1205module_exit(af_alg_exit);
1206MODULE_LICENSE("GPL");
1207MODULE_ALIAS_NETPROTO(AF_ALG);
1208