1 /*
2 * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com>
3 * Copyright (c) 2017-2021 The strace developers.
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #include "tests.h"
10
11 #include <stdio.h>
12 #include <unistd.h>
13 #include <sys/socket.h>
14 #include <linux/cryptouser.h>
15 #include "test_netlink.h"
16
17 #define XLAT_MACROS_ONLY
18 # include "xlat/netlink_protocols.h"
19 #undef XLAT_MACROS_ONLY
20
21 static void
22 test_nlmsg_type(const int fd)
23 {
24 long rc;
25 struct nlmsghdr nlh = {
26 .nlmsg_len = sizeof(nlh),
27 .nlmsg_type = CRYPTO_MSG_NEWALG,
28 .nlmsg_flags = NLM_F_REQUEST,
29 };
30
31 rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
32 printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_NEWALG"
33 ", nlmsg_flags=NLM_F_REQUEST, nlmsg_seq=0, nlmsg_pid=0}"
34 ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
35 fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
36 }
37
38 static void
39 test_nlmsg_flags(const int fd)
40 {
41 long rc;
42 struct nlmsghdr nlh = {
43 .nlmsg_len = sizeof(nlh),
44 };
45
46 nlh.nlmsg_type = CRYPTO_MSG_GETALG;
47 nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
48 rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
49 printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_GETALG"
50 ", nlmsg_flags=NLM_F_REQUEST|NLM_F_DUMP, nlmsg_seq=0"
51 ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
52 fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
53
54 nlh.nlmsg_type = CRYPTO_MSG_NEWALG;
55 nlh.nlmsg_flags = NLM_F_ECHO | NLM_F_REPLACE;
56 rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
57 printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_NEWALG"
58 ", nlmsg_flags=NLM_F_ECHO|NLM_F_REPLACE, nlmsg_seq=0"
59 ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
60 fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
61
62 nlh.nlmsg_type = CRYPTO_MSG_DELALG;
63 nlh.nlmsg_flags = NLM_F_ECHO | NLM_F_NONREC;
64 rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
65 printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_DELALG"
66 ", nlmsg_flags=NLM_F_ECHO|NLM_F_NONREC, nlmsg_seq=0"
67 ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
68 fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
69
70 nlh.nlmsg_type = CRYPTO_MSG_UPDATEALG;
71 nlh.nlmsg_flags = NLM_F_REPLACE;
72 rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
73 printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_UPDATEALG"
74 ", nlmsg_flags=%#x /* NLM_F_??? */, nlmsg_seq=0, nlmsg_pid=0}"
75 ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
76 fd, nlh.nlmsg_len, NLM_F_REPLACE,
77 (unsigned) sizeof(nlh), sprintrc(rc));
78 }
79
80 static void
81 test_crypto_msg_newalg(const int fd)
82 {
83 struct crypto_user_alg alg = {
84 .cru_name = "abcd",
85 .cru_driver_name = "efgh",
86 .cru_module_name = "dcba",
87 .cru_type = 0xabcdfabc,
88 .cru_mask = 0xfedabacd,
89 .cru_refcnt = 0xbcacfacd,
90 .cru_flags = 0xefacdbad
91 };
92 void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(alg));
93
94 TEST_NETLINK_OBJECT_EX(fd, nlh0,
95 CRYPTO_MSG_NEWALG, NLM_F_REQUEST,
96 alg, print_quoted_memory,
97 printf("{cru_name=\"abcd\""
98 ", cru_driver_name=\"efgh\""
99 ", cru_module_name=\"dcba\"");
100 printf(", ");
101 PRINT_FIELD_X(alg, cru_type);
102 printf(", ");
103 PRINT_FIELD_X(alg, cru_mask);
104 printf(", ");
105 PRINT_FIELD_U(alg, cru_refcnt);
106 printf(", ");
107 PRINT_FIELD_X(alg, cru_flags);
108 printf("}"));
109
110 fill_memory_ex(alg.cru_name, sizeof(alg.cru_name), '0', 10);
111 fill_memory_ex(alg.cru_driver_name, sizeof(alg.cru_driver_name),
112 'a', 'z' - 'a' + 1);
113 fill_memory_ex(alg.cru_module_name, sizeof(alg.cru_module_name),
114 'A', 'Z' - 'A' + 1);
115
116 TEST_NETLINK_OBJECT_EX(fd, nlh0,
117 CRYPTO_MSG_NEWALG, NLM_F_REQUEST,
118 alg, print_quoted_memory,
119 printf("{cru_name=");
120 print_quoted_memory(alg.cru_name,
121 sizeof(alg.cru_name) - 1);
122 printf("..., cru_driver_name=");
123 print_quoted_memory(alg.cru_driver_name,
124 sizeof(alg.cru_driver_name) - 1);
125 printf("..., cru_module_name=");
126 print_quoted_memory(alg.cru_module_name,
127 sizeof(alg.cru_module_name) - 1);
128 printf("..., ");
129 PRINT_FIELD_X(alg, cru_type);
130 printf(", ");
131 PRINT_FIELD_X(alg, cru_mask);
132 printf(", ");
133 PRINT_FIELD_U(alg, cru_refcnt);
134 printf(", ");
135 PRINT_FIELD_X(alg, cru_flags);
136 printf("}"));
137 }
138
139 static void
140 test_crypto_msg_unspec(const int fd)
141 {
142 void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, 4);
143
144 TEST_NETLINK_(fd, nlh0,
145 0xffff, "0xffff /* CRYPTO_MSG_??? */",
146 NLM_F_REQUEST, "NLM_F_REQUEST",
147 4, "abcd", 4, printf("\"\\x61\\x62\\x63\\x64\""));
148 }
149
150 int
151 main(void)
152 {
153 skip_if_unavailable("/proc/self/fd/");
154
155 int fd = create_nl_socket(NETLINK_CRYPTO);
156
157 test_nlmsg_type(fd);
158 test_nlmsg_flags(fd);
159 test_crypto_msg_newalg(fd);
160 test_crypto_msg_unspec(fd);
161
162 printf("+++ exited with 0 +++\n");
163
164 return 0;
165 }