1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * af_alg: User-space algorithm interface
5 * This file provides the user-space API for algorithms.
7 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
10 #include <linux/atomic.h>
11 #include <crypto/if_alg.h>
12 #include <linux/crypto.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/key.h>
16 #include <linux/key-type.h>
17 #include <linux/list.h>
18 #include <linux/module.h>
19 #include <linux/net.h>
20 #include <linux/rwsem.h>
21 #include <linux/sched.h>
22 #include <linux/sched/signal.h>
23 #include <linux/security.h>
24 #include <linux/string.h>
25 #include <keys/user-type.h>
26 #include <keys/trusted-type.h>
27 #include <keys/encrypted-type.h>
29 struct alg_type_list
{
30 const struct af_alg_type
*type
;
31 struct list_head list
;
34 static struct proto alg_proto
= {
37 .obj_size
= sizeof(struct alg_sock
),
40 static LIST_HEAD(alg_types
);
41 static DECLARE_RWSEM(alg_types_sem
);
43 static const struct af_alg_type
*alg_get_type(const char *name
)
45 const struct af_alg_type
*type
= ERR_PTR(-ENOENT
);
46 struct alg_type_list
*node
;
48 down_read(&alg_types_sem
);
49 list_for_each_entry(node
, &alg_types
, list
) {
50 if (strcmp(node
->type
->name
, name
))
53 if (try_module_get(node
->type
->owner
))
57 up_read(&alg_types_sem
);
62 int af_alg_register_type(const struct af_alg_type
*type
)
64 struct alg_type_list
*node
;
67 down_write(&alg_types_sem
);
68 list_for_each_entry(node
, &alg_types
, list
) {
69 if (!strcmp(node
->type
->name
, type
->name
))
73 node
= kmalloc(sizeof(*node
), GFP_KERNEL
);
78 type
->ops
->owner
= THIS_MODULE
;
80 type
->ops_nokey
->owner
= THIS_MODULE
;
82 list_add(&node
->list
, &alg_types
);
86 up_write(&alg_types_sem
);
90 EXPORT_SYMBOL_GPL(af_alg_register_type
);
92 int af_alg_unregister_type(const struct af_alg_type
*type
)
94 struct alg_type_list
*node
;
97 down_write(&alg_types_sem
);
98 list_for_each_entry(node
, &alg_types
, list
) {
99 if (strcmp(node
->type
->name
, type
->name
))
102 list_del(&node
->list
);
107 up_write(&alg_types_sem
);
111 EXPORT_SYMBOL_GPL(af_alg_unregister_type
);
113 static void alg_do_release(const struct af_alg_type
*type
, void *private)
118 type
->release(private);
119 module_put(type
->owner
);
122 int af_alg_release(struct socket
*sock
)
130 EXPORT_SYMBOL_GPL(af_alg_release
);
132 void af_alg_release_parent(struct sock
*sk
)
134 struct alg_sock
*ask
= alg_sk(sk
);
135 unsigned int nokey
= atomic_read(&ask
->nokey_refcnt
);
141 atomic_dec(&ask
->nokey_refcnt
);
143 if (atomic_dec_and_test(&ask
->refcnt
))
146 EXPORT_SYMBOL_GPL(af_alg_release_parent
);
148 static int alg_bind(struct socket
*sock
, struct sockaddr
*uaddr
, int addr_len
)
150 const u32 allowed
= CRYPTO_ALG_KERN_DRIVER_ONLY
;
151 struct sock
*sk
= sock
->sk
;
152 struct alg_sock
*ask
= alg_sk(sk
);
153 struct sockaddr_alg_new
*sa
= (void *)uaddr
;
154 const struct af_alg_type
*type
;
158 if (sock
->state
== SS_CONNECTED
)
161 BUILD_BUG_ON(offsetof(struct sockaddr_alg_new
, salg_name
) !=
162 offsetof(struct sockaddr_alg
, salg_name
));
163 BUILD_BUG_ON(offsetof(struct sockaddr_alg
, salg_name
) != sizeof(*sa
));
165 if (addr_len
< sizeof(*sa
) + 1)
168 /* If caller uses non-allowed flag, return error. */
169 if ((sa
->salg_feat
& ~allowed
) || (sa
->salg_mask
& ~allowed
))
172 sa
->salg_type
[sizeof(sa
->salg_type
) - 1] = 0;
173 sa
->salg_name
[addr_len
- sizeof(*sa
) - 1] = 0;
175 type
= alg_get_type(sa
->salg_type
);
176 if (PTR_ERR(type
) == -ENOENT
) {
177 request_module("algif-%s", sa
->salg_type
);
178 type
= alg_get_type(sa
->salg_type
);
182 return PTR_ERR(type
);
184 private = type
->bind(sa
->salg_name
, sa
->salg_feat
, sa
->salg_mask
);
185 if (IS_ERR(private)) {
186 module_put(type
->owner
);
187 return PTR_ERR(private);
192 if (atomic_read(&ask
->refcnt
))
195 swap(ask
->type
, type
);
196 swap(ask
->private, private);
203 alg_do_release(type
, private);
208 static int alg_setkey(struct sock
*sk
, sockptr_t ukey
, unsigned int keylen
)
210 struct alg_sock
*ask
= alg_sk(sk
);
211 const struct af_alg_type
*type
= ask
->type
;
215 key
= sock_kmalloc(sk
, keylen
, GFP_KERNEL
);
220 if (copy_from_sockptr(key
, ukey
, keylen
))
223 err
= type
->setkey(ask
->private, key
, keylen
);
226 sock_kzfree_s(sk
, key
, keylen
);
233 static const u8
*key_data_ptr_user(const struct key
*key
,
234 unsigned int *datalen
)
236 const struct user_key_payload
*ukp
;
238 ukp
= user_key_payload_locked(key
);
239 if (IS_ERR_OR_NULL(ukp
))
240 return ERR_PTR(-EKEYREVOKED
);
242 *datalen
= key
->datalen
;
247 static const u8
*key_data_ptr_encrypted(const struct key
*key
,
248 unsigned int *datalen
)
250 const struct encrypted_key_payload
*ekp
;
252 ekp
= dereference_key_locked(key
);
253 if (IS_ERR_OR_NULL(ekp
))
254 return ERR_PTR(-EKEYREVOKED
);
256 *datalen
= ekp
->decrypted_datalen
;
258 return ekp
->decrypted_data
;
261 static const u8
*key_data_ptr_trusted(const struct key
*key
,
262 unsigned int *datalen
)
264 const struct trusted_key_payload
*tkp
;
266 tkp
= dereference_key_locked(key
);
267 if (IS_ERR_OR_NULL(tkp
))
268 return ERR_PTR(-EKEYREVOKED
);
270 *datalen
= tkp
->key_len
;
275 static struct key
*lookup_key(key_serial_t serial
)
279 key_ref
= lookup_user_key(serial
, 0, KEY_NEED_SEARCH
);
281 return ERR_CAST(key_ref
);
283 return key_ref_to_ptr(key_ref
);
286 static int alg_setkey_by_key_serial(struct alg_sock
*ask
, sockptr_t optval
,
289 const struct af_alg_type
*type
= ask
->type
;
291 unsigned int key_datalen
;
297 if (optlen
!= sizeof(serial
))
300 if (copy_from_sockptr(&serial
, optval
, optlen
))
303 key
= lookup_key(serial
);
307 down_read(&key
->sem
);
309 ret
= ERR_PTR(-ENOPROTOOPT
);
310 if (!strcmp(key
->type
->name
, "user") ||
311 !strcmp(key
->type
->name
, "logon")) {
312 ret
= key_data_ptr_user(key
, &key_datalen
);
313 } else if (IS_REACHABLE(CONFIG_ENCRYPTED_KEYS
) &&
314 !strcmp(key
->type
->name
, "encrypted")) {
315 ret
= key_data_ptr_encrypted(key
, &key_datalen
);
316 } else if (IS_REACHABLE(CONFIG_TRUSTED_KEYS
) &&
317 !strcmp(key
->type
->name
, "trusted")) {
318 ret
= key_data_ptr_trusted(key
, &key_datalen
);
327 key_data
= sock_kmalloc(&ask
->sk
, key_datalen
, GFP_KERNEL
);
334 memcpy(key_data
, ret
, key_datalen
);
339 err
= type
->setkey(ask
->private, key_data
, key_datalen
);
341 sock_kzfree_s(&ask
->sk
, key_data
, key_datalen
);
348 static inline int alg_setkey_by_key_serial(struct alg_sock
*ask
,
357 static int alg_setsockopt(struct socket
*sock
, int level
, int optname
,
358 sockptr_t optval
, unsigned int optlen
)
360 struct sock
*sk
= sock
->sk
;
361 struct alg_sock
*ask
= alg_sk(sk
);
362 const struct af_alg_type
*type
;
366 if (atomic_read(&ask
->refcnt
) != atomic_read(&ask
->nokey_refcnt
))
372 if (level
!= SOL_ALG
|| !type
)
377 case ALG_SET_KEY_BY_KEY_SERIAL
:
378 if (sock
->state
== SS_CONNECTED
)
383 if (optname
== ALG_SET_KEY_BY_KEY_SERIAL
)
384 err
= alg_setkey_by_key_serial(ask
, optval
, optlen
);
386 err
= alg_setkey(sk
, optval
, optlen
);
388 case ALG_SET_AEAD_AUTHSIZE
:
389 if (sock
->state
== SS_CONNECTED
)
391 if (!type
->setauthsize
)
393 err
= type
->setauthsize(ask
->private, optlen
);
395 case ALG_SET_DRBG_ENTROPY
:
396 if (sock
->state
== SS_CONNECTED
)
398 if (!type
->setentropy
)
401 err
= type
->setentropy(ask
->private, optval
, optlen
);
410 int af_alg_accept(struct sock
*sk
, struct socket
*newsock
,
411 struct proto_accept_arg
*arg
)
413 struct alg_sock
*ask
= alg_sk(sk
);
414 const struct af_alg_type
*type
;
426 sk2
= sk_alloc(sock_net(sk
), PF_ALG
, GFP_KERNEL
, &alg_proto
, arg
->kern
);
431 sock_init_data(newsock
, sk2
);
432 security_sock_graft(sk2
, newsock
);
433 security_sk_clone(sk
, sk2
);
436 * newsock->ops assigned here to allow type->accept call to override
437 * them when required.
439 newsock
->ops
= type
->ops
;
440 err
= type
->accept(ask
->private, sk2
);
442 nokey
= err
== -ENOKEY
;
443 if (nokey
&& type
->accept_nokey
)
444 err
= type
->accept_nokey(ask
->private, sk2
);
449 if (atomic_inc_return_relaxed(&ask
->refcnt
) == 1)
452 atomic_inc(&ask
->nokey_refcnt
);
453 atomic_set(&alg_sk(sk2
)->nokey_refcnt
, 1);
455 alg_sk(sk2
)->parent
= sk
;
456 alg_sk(sk2
)->type
= type
;
458 newsock
->state
= SS_CONNECTED
;
461 newsock
->ops
= type
->ops_nokey
;
470 EXPORT_SYMBOL_GPL(af_alg_accept
);
472 static int alg_accept(struct socket
*sock
, struct socket
*newsock
,
473 struct proto_accept_arg
*arg
)
475 return af_alg_accept(sock
->sk
, newsock
, arg
);
478 static const struct proto_ops alg_proto_ops
= {
480 .owner
= THIS_MODULE
,
482 .connect
= sock_no_connect
,
483 .socketpair
= sock_no_socketpair
,
484 .getname
= sock_no_getname
,
485 .ioctl
= sock_no_ioctl
,
486 .listen
= sock_no_listen
,
487 .shutdown
= sock_no_shutdown
,
488 .mmap
= sock_no_mmap
,
489 .sendmsg
= sock_no_sendmsg
,
490 .recvmsg
= sock_no_recvmsg
,
493 .release
= af_alg_release
,
494 .setsockopt
= alg_setsockopt
,
495 .accept
= alg_accept
,
498 static void alg_sock_destruct(struct sock
*sk
)
500 struct alg_sock
*ask
= alg_sk(sk
);
502 alg_do_release(ask
->type
, ask
->private);
505 static int alg_create(struct net
*net
, struct socket
*sock
, int protocol
,
511 if (sock
->type
!= SOCK_SEQPACKET
)
512 return -ESOCKTNOSUPPORT
;
514 return -EPROTONOSUPPORT
;
517 sk
= sk_alloc(net
, PF_ALG
, GFP_KERNEL
, &alg_proto
, kern
);
521 sock
->ops
= &alg_proto_ops
;
522 sock_init_data(sock
, sk
);
524 sk
->sk_destruct
= alg_sock_destruct
;
531 static const struct net_proto_family alg_family
= {
533 .create
= alg_create
,
534 .owner
= THIS_MODULE
,
537 static void af_alg_link_sg(struct af_alg_sgl
*sgl_prev
,
538 struct af_alg_sgl
*sgl_new
)
540 sg_unmark_end(sgl_prev
->sgt
.sgl
+ sgl_prev
->sgt
.nents
- 1);
541 sg_chain(sgl_prev
->sgt
.sgl
, sgl_prev
->sgt
.nents
+ 1, sgl_new
->sgt
.sgl
);
544 void af_alg_free_sg(struct af_alg_sgl
*sgl
)
550 for (i
= 0; i
< sgl
->sgt
.nents
; i
++)
551 unpin_user_page(sg_page(&sgl
->sgt
.sgl
[i
]));
552 if (sgl
->sgt
.sgl
!= sgl
->sgl
)
553 kvfree(sgl
->sgt
.sgl
);
557 EXPORT_SYMBOL_GPL(af_alg_free_sg
);
559 static int af_alg_cmsg_send(struct msghdr
*msg
, struct af_alg_control
*con
)
561 struct cmsghdr
*cmsg
;
563 for_each_cmsghdr(cmsg
, msg
) {
564 if (!CMSG_OK(msg
, cmsg
))
566 if (cmsg
->cmsg_level
!= SOL_ALG
)
569 switch (cmsg
->cmsg_type
) {
571 if (cmsg
->cmsg_len
< CMSG_LEN(sizeof(*con
->iv
)))
573 con
->iv
= (void *)CMSG_DATA(cmsg
);
574 if (cmsg
->cmsg_len
< CMSG_LEN(con
->iv
->ivlen
+
580 if (cmsg
->cmsg_len
< CMSG_LEN(sizeof(u32
)))
582 con
->op
= *(u32
*)CMSG_DATA(cmsg
);
585 case ALG_SET_AEAD_ASSOCLEN
:
586 if (cmsg
->cmsg_len
< CMSG_LEN(sizeof(u32
)))
588 con
->aead_assoclen
= *(u32
*)CMSG_DATA(cmsg
);
600 * af_alg_alloc_tsgl - allocate the TX SGL
602 * @sk: socket of connection to user space
603 * Return: 0 upon success, < 0 upon error
605 static int af_alg_alloc_tsgl(struct sock
*sk
)
607 struct alg_sock
*ask
= alg_sk(sk
);
608 struct af_alg_ctx
*ctx
= ask
->private;
609 struct af_alg_tsgl
*sgl
;
610 struct scatterlist
*sg
= NULL
;
612 sgl
= list_entry(ctx
->tsgl_list
.prev
, struct af_alg_tsgl
, list
);
613 if (!list_empty(&ctx
->tsgl_list
))
616 if (!sg
|| sgl
->cur
>= MAX_SGL_ENTS
) {
617 sgl
= sock_kmalloc(sk
,
618 struct_size(sgl
, sg
, (MAX_SGL_ENTS
+ 1)),
623 sg_init_table(sgl
->sg
, MAX_SGL_ENTS
+ 1);
627 sg_chain(sg
, MAX_SGL_ENTS
+ 1, sgl
->sg
);
629 list_add_tail(&sgl
->list
, &ctx
->tsgl_list
);
636 * af_alg_count_tsgl - Count number of TX SG entries
638 * The counting starts from the beginning of the SGL to @bytes. If
639 * an @offset is provided, the counting of the SG entries starts at the @offset.
641 * @sk: socket of connection to user space
642 * @bytes: Count the number of SG entries holding given number of bytes.
643 * @offset: Start the counting of SG entries from the given offset.
644 * Return: Number of TX SG entries found given the constraints
646 unsigned int af_alg_count_tsgl(struct sock
*sk
, size_t bytes
, size_t offset
)
648 const struct alg_sock
*ask
= alg_sk(sk
);
649 const struct af_alg_ctx
*ctx
= ask
->private;
650 const struct af_alg_tsgl
*sgl
;
652 unsigned int sgl_count
= 0;
657 list_for_each_entry(sgl
, &ctx
->tsgl_list
, list
) {
658 const struct scatterlist
*sg
= sgl
->sg
;
660 for (i
= 0; i
< sgl
->cur
; i
++) {
664 if (offset
>= sg
[i
].length
) {
665 offset
-= sg
[i
].length
;
666 bytes
-= sg
[i
].length
;
670 bytes_count
= sg
[i
].length
- offset
;
675 /* If we have seen requested number of bytes, stop */
676 if (bytes_count
>= bytes
)
679 bytes
-= bytes_count
;
685 EXPORT_SYMBOL_GPL(af_alg_count_tsgl
);
688 * af_alg_pull_tsgl - Release the specified buffers from TX SGL
690 * If @dst is non-null, reassign the pages to @dst. The caller must release
691 * the pages. If @dst_offset is given only reassign the pages to @dst starting
692 * at the @dst_offset (byte). The caller must ensure that @dst is large
693 * enough (e.g. by using af_alg_count_tsgl with the same offset).
695 * @sk: socket of connection to user space
696 * @used: Number of bytes to pull from TX SGL
697 * @dst: If non-NULL, buffer is reassigned to dst SGL instead of releasing. The
698 * caller must release the buffers in dst.
699 * @dst_offset: Reassign the TX SGL from given offset. All buffers before
700 * reaching the offset is released.
702 void af_alg_pull_tsgl(struct sock
*sk
, size_t used
, struct scatterlist
*dst
,
705 struct alg_sock
*ask
= alg_sk(sk
);
706 struct af_alg_ctx
*ctx
= ask
->private;
707 struct af_alg_tsgl
*sgl
;
708 struct scatterlist
*sg
;
709 unsigned int i
, j
= 0;
711 while (!list_empty(&ctx
->tsgl_list
)) {
712 sgl
= list_first_entry(&ctx
->tsgl_list
, struct af_alg_tsgl
,
716 for (i
= 0; i
< sgl
->cur
; i
++) {
717 size_t plen
= min_t(size_t, used
, sg
[i
].length
);
718 struct page
*page
= sg_page(sg
+ i
);
724 * Assumption: caller created af_alg_count_tsgl(len)
728 if (dst_offset
>= plen
) {
729 /* discard page before offset */
732 /* reassign page to dst after offset */
734 sg_set_page(dst
+ j
, page
,
736 sg
[i
].offset
+ dst_offset
);
742 sg
[i
].length
-= plen
;
743 sg
[i
].offset
+= plen
;
752 sg_assign_page(sg
+ i
, NULL
);
755 list_del(&sgl
->list
);
756 sock_kfree_s(sk
, sgl
, struct_size(sgl
, sg
, MAX_SGL_ENTS
+ 1));
761 ctx
->init
= ctx
->more
;
763 EXPORT_SYMBOL_GPL(af_alg_pull_tsgl
);
766 * af_alg_free_areq_sgls - Release TX and RX SGLs of the request
768 * @areq: Request holding the TX and RX SGL
770 static void af_alg_free_areq_sgls(struct af_alg_async_req
*areq
)
772 struct sock
*sk
= areq
->sk
;
773 struct alg_sock
*ask
= alg_sk(sk
);
774 struct af_alg_ctx
*ctx
= ask
->private;
775 struct af_alg_rsgl
*rsgl
, *tmp
;
776 struct scatterlist
*tsgl
;
777 struct scatterlist
*sg
;
780 list_for_each_entry_safe(rsgl
, tmp
, &areq
->rsgl_list
, list
) {
781 atomic_sub(rsgl
->sg_num_bytes
, &ctx
->rcvused
);
782 af_alg_free_sg(&rsgl
->sgl
);
783 list_del(&rsgl
->list
);
784 if (rsgl
!= &areq
->first_rsgl
)
785 sock_kfree_s(sk
, rsgl
, sizeof(*rsgl
));
790 for_each_sg(tsgl
, sg
, areq
->tsgl_entries
, i
) {
793 put_page(sg_page(sg
));
796 sock_kfree_s(sk
, tsgl
, areq
->tsgl_entries
* sizeof(*tsgl
));
801 * af_alg_wait_for_wmem - wait for availability of writable memory
803 * @sk: socket of connection to user space
804 * @flags: If MSG_DONTWAIT is set, then only report if function would sleep
805 * Return: 0 when writable memory is available, < 0 upon error
807 static int af_alg_wait_for_wmem(struct sock
*sk
, unsigned int flags
)
809 DEFINE_WAIT_FUNC(wait
, woken_wake_function
);
810 int err
= -ERESTARTSYS
;
813 if (flags
& MSG_DONTWAIT
)
816 sk_set_bit(SOCKWQ_ASYNC_NOSPACE
, sk
);
818 add_wait_queue(sk_sleep(sk
), &wait
);
820 if (signal_pending(current
))
822 timeout
= MAX_SCHEDULE_TIMEOUT
;
823 if (sk_wait_event(sk
, &timeout
, af_alg_writable(sk
), &wait
)) {
828 remove_wait_queue(sk_sleep(sk
), &wait
);
834 * af_alg_wmem_wakeup - wakeup caller when writable memory is available
836 * @sk: socket of connection to user space
838 void af_alg_wmem_wakeup(struct sock
*sk
)
840 struct socket_wq
*wq
;
842 if (!af_alg_writable(sk
))
846 wq
= rcu_dereference(sk
->sk_wq
);
847 if (skwq_has_sleeper(wq
))
848 wake_up_interruptible_sync_poll(&wq
->wait
, EPOLLIN
|
851 sk_wake_async_rcu(sk
, SOCK_WAKE_WAITD
, POLL_IN
);
854 EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup
);
857 * af_alg_wait_for_data - wait for availability of TX data
859 * @sk: socket of connection to user space
860 * @flags: If MSG_DONTWAIT is set, then only report if function would sleep
861 * @min: Set to minimum request size if partial requests are allowed.
862 * Return: 0 when writable memory is available, < 0 upon error
864 int af_alg_wait_for_data(struct sock
*sk
, unsigned flags
, unsigned min
)
866 DEFINE_WAIT_FUNC(wait
, woken_wake_function
);
867 struct alg_sock
*ask
= alg_sk(sk
);
868 struct af_alg_ctx
*ctx
= ask
->private;
870 int err
= -ERESTARTSYS
;
872 if (flags
& MSG_DONTWAIT
)
875 sk_set_bit(SOCKWQ_ASYNC_WAITDATA
, sk
);
877 add_wait_queue(sk_sleep(sk
), &wait
);
879 if (signal_pending(current
))
881 timeout
= MAX_SCHEDULE_TIMEOUT
;
882 if (sk_wait_event(sk
, &timeout
,
883 ctx
->init
&& (!ctx
->more
||
884 (min
&& ctx
->used
>= min
)),
890 remove_wait_queue(sk_sleep(sk
), &wait
);
892 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA
, sk
);
896 EXPORT_SYMBOL_GPL(af_alg_wait_for_data
);
899 * af_alg_data_wakeup - wakeup caller when new data can be sent to kernel
901 * @sk: socket of connection to user space
903 static void af_alg_data_wakeup(struct sock
*sk
)
905 struct alg_sock
*ask
= alg_sk(sk
);
906 struct af_alg_ctx
*ctx
= ask
->private;
907 struct socket_wq
*wq
;
913 wq
= rcu_dereference(sk
->sk_wq
);
914 if (skwq_has_sleeper(wq
))
915 wake_up_interruptible_sync_poll(&wq
->wait
, EPOLLOUT
|
918 sk_wake_async_rcu(sk
, SOCK_WAKE_SPACE
, POLL_OUT
);
923 * af_alg_sendmsg - implementation of sendmsg system call handler
925 * The sendmsg system call handler obtains the user data and stores it
926 * in ctx->tsgl_list. This implies allocation of the required numbers of
927 * struct af_alg_tsgl.
929 * In addition, the ctx is filled with the information sent via CMSG.
931 * @sock: socket of connection to user space
932 * @msg: message from user space
933 * @size: size of message from user space
934 * @ivsize: the size of the IV for the cipher operation to verify that the
935 * user-space-provided IV has the right size
936 * Return: the number of copied data upon success, < 0 upon error
938 int af_alg_sendmsg(struct socket
*sock
, struct msghdr
*msg
, size_t size
,
941 struct sock
*sk
= sock
->sk
;
942 struct alg_sock
*ask
= alg_sk(sk
);
943 struct af_alg_ctx
*ctx
= ask
->private;
944 struct af_alg_tsgl
*sgl
;
945 struct af_alg_control con
= {};
951 if (msg
->msg_controllen
) {
952 err
= af_alg_cmsg_send(msg
, &con
);
968 if (con
.iv
&& con
.iv
->ivlen
!= ivsize
)
973 if (ctx
->init
&& !ctx
->more
) {
980 "%s sent an empty control message without MSG_MORE.\n",
988 memcpy(ctx
->iv
, con
.iv
->iv
, ivsize
);
990 ctx
->aead_assoclen
= con
.aead_assoclen
;
994 struct scatterlist
*sg
;
998 /* use the existing memory in an allocated page */
999 if (ctx
->merge
&& !(msg
->msg_flags
& MSG_SPLICE_PAGES
)) {
1000 sgl
= list_entry(ctx
->tsgl_list
.prev
,
1001 struct af_alg_tsgl
, list
);
1002 sg
= sgl
->sg
+ sgl
->cur
- 1;
1003 len
= min_t(size_t, len
,
1004 PAGE_SIZE
- sg
->offset
- sg
->length
);
1006 err
= memcpy_from_msg(page_address(sg_page(sg
)) +
1007 sg
->offset
+ sg
->length
,
1013 ctx
->merge
= (sg
->offset
+ sg
->length
) &
1022 if (!af_alg_writable(sk
)) {
1023 err
= af_alg_wait_for_wmem(sk
, msg
->msg_flags
);
1028 /* allocate a new page */
1029 len
= min_t(unsigned long, len
, af_alg_sndbuf(sk
));
1031 err
= af_alg_alloc_tsgl(sk
);
1035 sgl
= list_entry(ctx
->tsgl_list
.prev
, struct af_alg_tsgl
,
1039 sg_unmark_end(sg
+ sgl
->cur
- 1);
1041 if (msg
->msg_flags
& MSG_SPLICE_PAGES
) {
1042 struct sg_table sgtable
= {
1045 .orig_nents
= sgl
->cur
,
1048 plen
= extract_iter_to_sg(&msg
->msg_iter
, len
, &sgtable
,
1049 MAX_SGL_ENTS
- sgl
->cur
, 0);
1055 for (; sgl
->cur
< sgtable
.nents
; sgl
->cur
++)
1056 get_page(sg_page(&sg
[sgl
->cur
]));
1065 unsigned int i
= sgl
->cur
;
1067 plen
= min_t(size_t, len
, PAGE_SIZE
);
1069 pg
= alloc_page(GFP_KERNEL
);
1075 sg_assign_page(sg
+ i
, pg
);
1077 err
= memcpy_from_msg(
1078 page_address(sg_page(sg
+ i
)),
1081 __free_page(sg_page(sg
+ i
));
1082 sg_assign_page(sg
+ i
, NULL
);
1086 sg
[i
].length
= plen
;
1092 } while (len
&& sgl
->cur
< MAX_SGL_ENTS
);
1094 ctx
->merge
= plen
& (PAGE_SIZE
- 1);
1098 sg_mark_end(sg
+ sgl
->cur
- 1);
1103 ctx
->more
= msg
->msg_flags
& MSG_MORE
;
1106 af_alg_data_wakeup(sk
);
1109 return copied
?: err
;
1111 EXPORT_SYMBOL_GPL(af_alg_sendmsg
);
1114 * af_alg_free_resources - release resources required for crypto request
1115 * @areq: Request holding the TX and RX SGL
1117 void af_alg_free_resources(struct af_alg_async_req
*areq
)
1119 struct sock
*sk
= areq
->sk
;
1120 struct af_alg_ctx
*ctx
;
1122 af_alg_free_areq_sgls(areq
);
1123 sock_kfree_s(sk
, areq
, areq
->areqlen
);
1125 ctx
= alg_sk(sk
)->private;
1126 ctx
->inflight
= false;
1128 EXPORT_SYMBOL_GPL(af_alg_free_resources
);
1131 * af_alg_async_cb - AIO callback handler
1132 * @data: async request completion data
1133 * @err: if non-zero, error result to be returned via ki_complete();
1134 * otherwise return the AIO output length via ki_complete().
1136 * This handler cleans up the struct af_alg_async_req upon completion of the
1139 * The number of bytes to be generated with the AIO operation must be set
1140 * in areq->outlen before the AIO callback handler is invoked.
1142 void af_alg_async_cb(void *data
, int err
)
1144 struct af_alg_async_req
*areq
= data
;
1145 struct sock
*sk
= areq
->sk
;
1146 struct kiocb
*iocb
= areq
->iocb
;
1147 unsigned int resultlen
;
1149 /* Buffer size written by crypto operation. */
1150 resultlen
= areq
->outlen
;
1152 af_alg_free_resources(areq
);
1155 iocb
->ki_complete(iocb
, err
? err
: (int)resultlen
);
1157 EXPORT_SYMBOL_GPL(af_alg_async_cb
);
1160 * af_alg_poll - poll system call handler
1161 * @file: file pointer
1162 * @sock: socket to poll
1165 __poll_t
af_alg_poll(struct file
*file
, struct socket
*sock
,
1168 struct sock
*sk
= sock
->sk
;
1169 struct alg_sock
*ask
= alg_sk(sk
);
1170 struct af_alg_ctx
*ctx
= ask
->private;
1173 sock_poll_wait(file
, sock
, wait
);
1176 if (!ctx
->more
|| ctx
->used
)
1177 mask
|= EPOLLIN
| EPOLLRDNORM
;
1179 if (af_alg_writable(sk
))
1180 mask
|= EPOLLOUT
| EPOLLWRNORM
| EPOLLWRBAND
;
1184 EXPORT_SYMBOL_GPL(af_alg_poll
);
1187 * af_alg_alloc_areq - allocate struct af_alg_async_req
1189 * @sk: socket of connection to user space
1190 * @areqlen: size of struct af_alg_async_req + crypto_*_reqsize
1191 * Return: allocated data structure or ERR_PTR upon error
1193 struct af_alg_async_req
*af_alg_alloc_areq(struct sock
*sk
,
1194 unsigned int areqlen
)
1196 struct af_alg_ctx
*ctx
= alg_sk(sk
)->private;
1197 struct af_alg_async_req
*areq
;
1199 /* Only one AIO request can be in flight. */
1201 return ERR_PTR(-EBUSY
);
1203 areq
= sock_kmalloc(sk
, areqlen
, GFP_KERNEL
);
1204 if (unlikely(!areq
))
1205 return ERR_PTR(-ENOMEM
);
1207 ctx
->inflight
= true;
1209 areq
->areqlen
= areqlen
;
1211 areq
->first_rsgl
.sgl
.sgt
.sgl
= areq
->first_rsgl
.sgl
.sgl
;
1212 areq
->last_rsgl
= NULL
;
1213 INIT_LIST_HEAD(&areq
->rsgl_list
);
1215 areq
->tsgl_entries
= 0;
1219 EXPORT_SYMBOL_GPL(af_alg_alloc_areq
);
1222 * af_alg_get_rsgl - create the RX SGL for the output data from the crypto
1225 * @sk: socket of connection to user space
1226 * @msg: user space message
1227 * @flags: flags used to invoke recvmsg with
1228 * @areq: instance of the cryptographic request that will hold the RX SGL
1229 * @maxsize: maximum number of bytes to be pulled from user space
1230 * @outlen: number of bytes in the RX SGL
1231 * Return: 0 on success, < 0 upon error
1233 int af_alg_get_rsgl(struct sock
*sk
, struct msghdr
*msg
, int flags
,
1234 struct af_alg_async_req
*areq
, size_t maxsize
,
1237 struct alg_sock
*ask
= alg_sk(sk
);
1238 struct af_alg_ctx
*ctx
= ask
->private;
1241 while (maxsize
> len
&& msg_data_left(msg
)) {
1242 struct af_alg_rsgl
*rsgl
;
1246 /* limit the amount of readable buffers */
1247 if (!af_alg_readable(sk
))
1250 seglen
= min_t(size_t, (maxsize
- len
),
1251 msg_data_left(msg
));
1253 if (list_empty(&areq
->rsgl_list
)) {
1254 rsgl
= &areq
->first_rsgl
;
1256 rsgl
= sock_kmalloc(sk
, sizeof(*rsgl
), GFP_KERNEL
);
1257 if (unlikely(!rsgl
))
1261 rsgl
->sgl
.need_unpin
=
1262 iov_iter_extract_will_pin(&msg
->msg_iter
);
1263 rsgl
->sgl
.sgt
.sgl
= rsgl
->sgl
.sgl
;
1264 rsgl
->sgl
.sgt
.nents
= 0;
1265 rsgl
->sgl
.sgt
.orig_nents
= 0;
1266 list_add_tail(&rsgl
->list
, &areq
->rsgl_list
);
1268 sg_init_table(rsgl
->sgl
.sgt
.sgl
, ALG_MAX_PAGES
);
1269 err
= extract_iter_to_sg(&msg
->msg_iter
, seglen
, &rsgl
->sgl
.sgt
,
1272 rsgl
->sg_num_bytes
= 0;
1276 sg_mark_end(rsgl
->sgl
.sgt
.sgl
+ rsgl
->sgl
.sgt
.nents
- 1);
1278 /* chain the new scatterlist with previous one */
1279 if (areq
->last_rsgl
)
1280 af_alg_link_sg(&areq
->last_rsgl
->sgl
, &rsgl
->sgl
);
1282 areq
->last_rsgl
= rsgl
;
1284 atomic_add(err
, &ctx
->rcvused
);
1285 rsgl
->sg_num_bytes
= err
;
1291 EXPORT_SYMBOL_GPL(af_alg_get_rsgl
);
1293 static int __init
af_alg_init(void)
1295 int err
= proto_register(&alg_proto
, 0);
1300 err
= sock_register(&alg_family
);
1302 goto out_unregister_proto
;
1307 out_unregister_proto
:
1308 proto_unregister(&alg_proto
);
1312 static void __exit
af_alg_exit(void)
1314 sock_unregister(PF_ALG
);
1315 proto_unregister(&alg_proto
);
1318 module_init(af_alg_init
);
1319 module_exit(af_alg_exit
);
1320 MODULE_DESCRIPTION("Crypto userspace interface");
1321 MODULE_LICENSE("GPL");
1322 MODULE_ALIAS_NETPROTO(AF_ALG
);