Home | History | Annotate | Download | only in tests
      1 /*
      2  * Check decoding of keyctl syscall.
      3  *
      4  * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr (at) gmail.com>
      5  * Copyright (c) 2016-2017 The strace developers.
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. The name of the author may not be used to endorse or promote products
     17  *    derived from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "tests.h"
     32 
     33 #include <asm/unistd.h>
     34 
     35 #ifdef __NR_keyctl
     36 
     37 # include <linux/types.h>
     38 # include <linux/keyctl.h>
     39 
     40 # include <assert.h>
     41 # include <errno.h>
     42 # include <inttypes.h>
     43 # include <stdarg.h>
     44 # include <stdbool.h>
     45 # include <stdio.h>
     46 # include <stdlib.h>
     47 # include <string.h>
     48 # include <unistd.h>
     49 # include <sys/uio.h>
     50 
     51 /* This check should be before #include "xlat/keyctl_commands.h" */
     52 # ifndef KEYCTL_DH_COMPUTE
     53 struct keyctl_dh_params {
     54 	int32_t private;
     55 	int32_t prime;
     56 	int32_t base;
     57 };
     58 # endif
     59 
     60 # ifndef HAVE_STRUCT_KEYCTL_KDF_PARAMS
     61 struct keyctl_kdf_params {
     62 	char *hashname;
     63 	char *otherinfo;
     64 	uint32_t otherinfolen;
     65 	uint32_t __spare[8];
     66 };
     67 # endif
     68 
     69 # include "xlat.h"
     70 # include "xlat/keyctl_commands.h"
     71 
     72 # ifndef KEY_SPEC_REQKEY_AUTH_KEY
     73 #  define KEY_SPEC_REQKEY_AUTH_KEY   -7
     74 # endif
     75 
     76 # ifndef KEY_SPEC_REQUESTOR_KEYRING
     77 #  define KEY_SPEC_REQUESTOR_KEYRING -8
     78 # endif
     79 
     80 static const size_t limit = 10;
     81 
     82 /*
     83  * Well, this is true for DESCRIBE and GET_SECURITY, and false for READ and
     84  * DH_COMPUTE and I see no ability to pass this information without
     85  * significantly breaking interface.
     86  */
     87 bool nul_terminated_buf = true;
     88 bool buf_in_arg;
     89 
     90 /* From ioctl_dm.c */
     91 # define STR32 "AbCdEfGhIjKlMnOpQrStUvWxYz012345"
     92 
     93 /*
     94  * When this is called with positive size, the buffer provided is an "out"
     95  * argument and rc contains resulting size (globally defined nul_terminated_buf
     96  * controls whether it is nul-terminated or not). If size is negative,
     97  * it contains "in" argument.
     98  */
     99 void
    100 print_quoted_string_limit(const char *str, size_t size, long rc)
    101 {
    102 	size_t print_size = ((rc >= 0) && (size > 0)) ?
    103 		((unsigned long) rc > size ? size :
    104 		(unsigned long) rc) : size;
    105 	size_t limited_size = print_size > limit ? limit : print_size;
    106 
    107 	if ((rc == -1) && !buf_in_arg) {
    108 		printf("%p", str);
    109 		return;
    110 	}
    111 
    112 	if (!nul_terminated_buf ||
    113 	    (strnlen(str, limited_size) == limited_size)) {
    114 		print_quoted_memory(str, limited_size);
    115 		if (print_size > limit)
    116 			printf("...");
    117 	} else
    118 		print_quoted_string(str);
    119 }
    120 
    121 static void
    122 print_arg(kernel_ulong_t arg, const char *str, const char *fmt, size_t size,
    123 	long rc)
    124 {
    125 	if (size == (size_t) -1)
    126 		size = 0;
    127 
    128 	if (str) {
    129 		printf("%s", str);
    130 	} else {
    131 		if (size == sizeof(uint64_t))
    132 			printf(fmt, (uint64_t) arg);
    133 		else if (size == sizeof(uint32_t))
    134 			printf(fmt, (uint32_t) arg);
    135 		else
    136 			print_quoted_string_limit((void *) (uintptr_t) arg,
    137 						  size, rc);
    138 	}
    139 }
    140 
    141 /*
    142  * Arguments are passed as sz, val, str, fmt. Arguments are read until 4
    143  * arguments are retrieved or size of 0 is occurred.
    144  *
    145  * str == NULL && fmt == NULL && sz not in {4, 8} - print_quoted_string_limit is
    146  *   used for argument printing. If sz is negative, in argument is assumed, out
    147  *   otherwise.
    148  */
    149 void
    150 do_keyctl(kernel_ulong_t cmd, const char *cmd_str, ...)
    151 {
    152 	kernel_ulong_t args[4] = {
    153 		(kernel_ulong_t) 0xdeadfee1badc0de5ULL,
    154 		(kernel_ulong_t) 0xdeadfee2badc0de6ULL,
    155 		(kernel_ulong_t) 0xdeadfee3badc0de7ULL,
    156 		(kernel_ulong_t) 0xdeadfee4badc0de8ULL,
    157 	};
    158 	const char *arg_str[4] = { NULL };
    159 	const char *arg_fmt[4] = { "%llu", "%llu", "%llu", "%llu" };
    160 	size_t arg_sz[4] = {
    161 		sizeof(kernel_ulong_t),
    162 		sizeof(kernel_ulong_t),
    163 		sizeof(kernel_ulong_t),
    164 		sizeof(kernel_ulong_t),
    165 	};
    166 	unsigned i;
    167 	unsigned cnt = 0;
    168 
    169 	va_list ap;
    170 
    171 	va_start(ap, cmd_str);
    172 
    173 	do {
    174 		arg_sz[cnt] = va_arg(ap, size_t);
    175 		if (!arg_sz[cnt])
    176 			break;
    177 
    178 		if (arg_sz[cnt] == sizeof(uint64_t))
    179 			args[cnt] = va_arg(ap, uint64_t);
    180 		else if (arg_sz[cnt] == sizeof(uint32_t))
    181 			args[cnt] = va_arg(ap, uint32_t);
    182 		else
    183 			args[cnt] = (uintptr_t) va_arg(ap, void *);
    184 
    185 		arg_str[cnt] = va_arg(ap, char *);
    186 		arg_fmt[cnt] = va_arg(ap, char *);
    187 	} while (++cnt < 4);
    188 
    189 	long rc = syscall(__NR_keyctl, cmd, args[0], args[1], args[2], args[3]);
    190 	const char *errstr = sprintrc(rc);
    191 	printf("keyctl(%s", cmd_str);
    192 	for (i = 0; i < cnt; i++) {
    193 		printf(", ");
    194 		print_arg(args[i], arg_str[i], arg_fmt[i], arg_sz[i], rc);
    195 	}
    196 	printf(") = %s\n", errstr);
    197 }
    198 
    199 int
    200 append_str(char **buf, size_t *left, const char *fmt, ...)
    201 {
    202 	int ret;
    203 	va_list ap;
    204 
    205 	va_start(ap, fmt);
    206 	ret = vsnprintf(*buf, *left, fmt, ap);
    207 	va_end(ap);
    208 
    209 	assert((ret >= 0) && ((unsigned) ret < *left));
    210 
    211 	*left -= ret;
    212 	*buf += ret;
    213 
    214 	return ret;
    215 }
    216 
    217 const char *
    218 kckdfp_to_str(struct keyctl_kdf_params *kdf, bool deref_hash, bool deref_oi,
    219 	       bool print_spare, const char *hash_str, const char *oi_str)
    220 {
    221 	static char buf[4096];
    222 
    223 	size_t left = sizeof(buf);
    224 	char *pos = buf;
    225 
    226 	append_str(&pos, &left, "{hashname=");
    227 
    228 	if (deref_hash && hash_str) {
    229 		append_str(&pos, &left, "%s", hash_str);
    230 	} else if (!kdf->hashname) {
    231 		append_str(&pos, &left, "NULL");
    232 	} else if (deref_hash) {
    233 		append_str(&pos, &left, "\"%.*s\"", limit, kdf->hashname);
    234 
    235 		if (strnlen(kdf->hashname, limit + 1) > limit)
    236 			append_str(&pos, &left, "...");
    237 	} else {
    238 		append_str(&pos, &left, "%p", kdf->hashname);
    239 	}
    240 
    241 	append_str(&pos, &left, ", otherinfo=");
    242 
    243 	if (deref_oi && oi_str) {
    244 		append_str(&pos, &left, "%s", oi_str);
    245 	} else if (!kdf->otherinfo) {
    246 		append_str(&pos, &left, "NULL");
    247 	} else if (deref_oi) {
    248 		append_str(&pos, &left, "\"%.*s\"", limit, kdf->otherinfo);
    249 
    250 		if (strnlen(kdf->otherinfo, limit + 1) > limit)
    251 			append_str(&pos, &left, "...");
    252 	} else {
    253 		append_str(&pos, &left, "%p", kdf->otherinfo);
    254 	}
    255 
    256 	append_str(&pos, &left, ", otherinfolen=%u", kdf->otherinfolen);
    257 
    258 	if (print_spare) {
    259 		size_t i;
    260 
    261 		append_str(&pos, &left, ", __spare=[");
    262 
    263 		for (i = 0; i < ARRAY_SIZE(kdf->__spare); i++) {
    264 			if  (i)
    265 				append_str(&pos, &left, ", ");
    266 
    267 			append_str(&pos, &left, "%#x", kdf->__spare[i]);
    268 		}
    269 
    270 		append_str(&pos, &left, "]");
    271 	}
    272 
    273 	append_str(&pos, &left, "}");
    274 
    275 	return buf;
    276 }
    277 
    278 int
    279 main(void)
    280 {
    281 	enum { PR_LIMIT = 10, IOV_SIZE = 11, IOV_STR_SIZE = 4096 };
    282 
    283 	static const char *kulong_fmt =
    284 		sizeof(kernel_ulong_t) == sizeof(uint64_t) ? "%#llx" : "%#x";
    285 	static const char *ksize_fmt =
    286 		sizeof(kernel_ulong_t) == sizeof(uint64_t) ? "%llu" : "%u";
    287 	static const char *ptr_fmt =
    288 		sizeof(void *) == sizeof(uint64_t) ? "%#llx" : "%#x";
    289 	static const char unterminated1[] = { '\1', '\2', '\3', '\4', '\5' };
    290 	static const char unterminated2[] = { '\6', '\7', '\10', '\11', '\12' };
    291 	static const char short_type_str[] = "shrt type";
    292 	static const char short_desc_str[] = "shrt desc";
    293 	static const char long_type_str[] = "overly long key type";
    294 	static const char long_desc_str[] = "overly long key description";
    295 	static const int32_t bogus_key1 = 0xdeadf00d;
    296 	static const int32_t bogus_key2 = 0x1eefdead;
    297 	static const kernel_ulong_t bogus_key3 =
    298 		(kernel_ulong_t) 0xdec0ded1dec0ded2ULL;
    299 	static const char *bogus_key3_str = "-557785390";
    300 
    301 	static const struct keyctl_dh_params kcdhp_data = {
    302 		KEY_SPEC_GROUP_KEYRING, 1234567890, 3141592653U };
    303 	static const char *kcdhp_str = "{private=KEY_SPEC_GROUP_KEYRING, "
    304 		"prime=1234567890, base=-1153374643}";
    305 
    306 	/*
    307 	 * It's bigger than current hash name size limit, but since it's
    308 	 * implementation-dependent and totally internal, we do not rely
    309 	 * on it much.
    310 	 */
    311 	static const char long_hash_data[] = STR32 STR32 STR32 STR32 "xxx";
    312 	static const char short_hash_data[] = "hmac(aes)";
    313 	static const char otherinfo1_data[] = "\1\2 OH HAI THAR\255\0\1";
    314 	static const char otherinfo2_data[] = "\1\2\n\255\0\1";
    315 	static const struct keyctl_kdf_params kckdfp_data[] = {
    316 		[0] = { NULL, NULL, 0, { 0 } },
    317 		[1] = { NULL /* Changed to unaccessible address in copy */,
    318 			NULL, 0xbadc0dedU, { [7] = 0xdeadfeedU } },
    319 		[2] = { NULL /* long_hash_data */,
    320 			NULL /* Changed to unaccessible address in copy */,
    321 			0, { 0 } },
    322 		[3] = { NULL /* unterminated1 */,
    323 			NULL /* otherinfo_data */, 0, { 1 } },
    324 		[4] = { NULL /* short_hash_data */,
    325 			NULL /* otherinfo1_data */, sizeof(otherinfo1_data),
    326 			{ 0, 0xfacebeef, 0, 0xba5e1ead } },
    327 		[5] = { NULL /* short_hash_data */,
    328 			NULL /* otherinfo2_data */, sizeof(otherinfo2_data),
    329 			{ 0 } },
    330 	};
    331 
    332 	char *bogus_str = tail_memdup(unterminated1, sizeof(unterminated1));
    333 	char *bogus_desc = tail_memdup(unterminated2, sizeof(unterminated2));
    334 	char *short_type = tail_memdup(short_type_str, sizeof(short_type_str));
    335 	char *short_desc = tail_memdup(short_desc_str, sizeof(short_desc_str));
    336 	char *long_type = tail_memdup(long_type_str, sizeof(long_type_str));
    337 	char *long_desc = tail_memdup(long_desc_str, sizeof(long_desc_str));
    338 	char *kcdhp = tail_memdup(&kcdhp_data, sizeof(kcdhp_data));
    339 	char *kckdfp_long_hash = tail_memdup(long_hash_data,
    340 					     sizeof(long_hash_data));
    341 	char *kckdfp_short_hash = tail_memdup(short_hash_data,
    342 					      sizeof(short_hash_data));
    343 	char *kckdfp_otherinfo1 = tail_memdup(otherinfo1_data,
    344 					      sizeof(otherinfo1_data));
    345 	char *kckdfp_otherinfo2 = tail_memdup(otherinfo2_data,
    346 					      sizeof(otherinfo2_data));
    347 	char *kckdfp_char = tail_alloc(sizeof(kckdfp_data[0]));
    348 	struct iovec *key_iov = tail_alloc(sizeof(*key_iov) * IOV_SIZE);
    349 	char *bogus_buf1 = tail_alloc(9);
    350 	char *bogus_buf2 = tail_alloc(256);
    351 	char *key_iov_str1;
    352 	char *key_iov_str2 = tail_alloc(4096);
    353 	ssize_t ret;
    354 	ssize_t kis_size = 0;
    355 	size_t i;
    356 
    357 	key_iov[0].iov_base = short_type;
    358 	key_iov[0].iov_len = sizeof(short_type_str);
    359 	key_iov[1].iov_base = long_type;
    360 	key_iov[1].iov_len = sizeof(long_type_str);
    361 	key_iov[2].iov_base = short_desc;
    362 	key_iov[2].iov_len = sizeof(short_desc_str);
    363 	key_iov[3].iov_base = long_desc;
    364 	key_iov[3].iov_len = sizeof(long_desc_str);
    365 	key_iov[4].iov_base = bogus_str;
    366 	key_iov[4].iov_len = 32;
    367 
    368 	for (i = 5; i < IOV_SIZE; i++) {
    369 		key_iov[i].iov_base =
    370 			(void *) (uintptr_t) (0xfffffacefffff00dULL +
    371 			0x100000001ULL * i);
    372 		key_iov[i].iov_len = (size_t) (0xcaffeeeddefaced7ULL +
    373 			0x100000001ULL * i);
    374 	}
    375 
    376 	ret = asprintf(&key_iov_str1, "[{iov_base=%p, iov_len=%zu}, "
    377 		       "{iov_base=%p, iov_len=%zu}, "
    378 		       "{iov_base=%p, iov_len=%zu}, "
    379 		       "{iov_base=%p, iov_len=%zu}]",
    380 		       key_iov[IOV_SIZE - 4].iov_base,
    381 		       key_iov[IOV_SIZE - 4].iov_len,
    382 		       key_iov[IOV_SIZE - 3].iov_base,
    383 		       key_iov[IOV_SIZE - 3].iov_len,
    384 		       key_iov[IOV_SIZE - 2].iov_base,
    385 		       key_iov[IOV_SIZE - 2].iov_len,
    386 		       key_iov[IOV_SIZE - 1].iov_base,
    387 		       key_iov[IOV_SIZE - 1].iov_len);
    388 
    389 	if (ret < 0)
    390 		error_msg_and_fail("asprintf");
    391 
    392 	ret = snprintf(key_iov_str2, IOV_STR_SIZE,
    393 		       "[{iov_base=\"%s\\0\", iov_len=%zu}, "
    394 		       "{iov_base=\"%.10s\"..., iov_len=%zu}, "
    395 		       "{iov_base=\"%s\\0\", iov_len=%zu}, "
    396 		       "{iov_base=\"%.10s\"..., iov_len=%zu}, ",
    397 		       (char *) key_iov[0].iov_base, key_iov[0].iov_len,
    398 		       (char *) key_iov[1].iov_base, key_iov[1].iov_len,
    399 		       (char *) key_iov[2].iov_base, key_iov[2].iov_len,
    400 		       (char *) key_iov[3].iov_base, key_iov[3].iov_len);
    401 
    402 	if ((ret < 0) || (ret >= IOV_STR_SIZE))
    403 		error_msg_and_fail("snprintf");
    404 
    405 	for (i = 4; i < PR_LIMIT; i++) {
    406 		kis_size += ret;
    407 
    408 		ret = snprintf(key_iov_str2 + kis_size, IOV_STR_SIZE - kis_size,
    409 			       "{iov_base=%p, iov_len=%zu}, ",
    410 			       key_iov[i].iov_base, key_iov[i].iov_len);
    411 
    412 		if ((ret < 0) || (ret >= (IOV_STR_SIZE - kis_size)))
    413 			error_msg_and_fail("snprintf");
    414 	}
    415 
    416 	kis_size += ret;
    417 	snprintf(key_iov_str2 + kis_size, IOV_STR_SIZE - kis_size, "...]");
    418 
    419 
    420 	/* Invalid command */
    421 	do_keyctl((kernel_ulong_t) 0xbadc0dedfacefeedULL,
    422 		  "0xfacefeed /* KEYCTL_??? */",
    423 		  sizeof(kernel_ulong_t),
    424 			(kernel_ulong_t) 0xdeadfee1badc0de5ULL, NULL,
    425 			kulong_fmt,
    426 		  sizeof(kernel_ulong_t),
    427 			(kernel_ulong_t) 0xdeadfee2badc0de6ULL, NULL,
    428 			kulong_fmt,
    429 		  sizeof(kernel_ulong_t),
    430 			(kernel_ulong_t) 0xdeadfee3badc0de7ULL, NULL,
    431 			kulong_fmt,
    432 		  sizeof(kernel_ulong_t),
    433 			(kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL,
    434 			kulong_fmt);
    435 
    436 
    437 	/* GET_KEYRING_ID */
    438 	do_keyctl(ARG_STR(KEYCTL_GET_KEYRING_ID),
    439 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    440 		  sizeof(kernel_ulong_t),
    441 			(kernel_ulong_t) 0xbadc0dedffffffffLLU, "-1", NULL,
    442 		  0UL);
    443 	do_keyctl(ARG_STR(KEYCTL_GET_KEYRING_ID),
    444 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), "%d",
    445 		  sizeof(int), 3141592653U, NULL, "%d", NULL,
    446 		  0UL);
    447 
    448 
    449 	/* KEYCTL_JOIN_SESSION_KEYRING */
    450 	do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
    451 		  sizeof(char *), ARG_STR(NULL), NULL,
    452 		  0UL);
    453 	do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
    454 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    455 		  0UL);
    456 	do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
    457 		  sizeof(char *), bogus_str, NULL, ptr_fmt,
    458 		  0UL);
    459 	do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
    460 		  sizeof(char *), ARG_STR("bogus name"), NULL,
    461 		  0UL);
    462 	do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
    463 		  sizeof(char *), "very long keyring name", "\"very long \"...",
    464 			NULL,
    465 		  0UL);
    466 
    467 
    468 	/* KEYCTL_UPDATE */
    469 
    470 	buf_in_arg = true;
    471 
    472 	do_keyctl(ARG_STR(KEYCTL_UPDATE),
    473 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    474 		  sizeof(char *), ARG_STR(NULL), NULL,
    475 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 0, NULL, ksize_fmt,
    476 		  0UL);
    477 	do_keyctl(ARG_STR(KEYCTL_UPDATE),
    478 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    479 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    480 		  sizeof(kernel_ulong_t),
    481 			(kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL, ksize_fmt,
    482 		  0UL);
    483 	do_keyctl(ARG_STR(KEYCTL_UPDATE),
    484 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    485 		  sizeof(char *), bogus_str, NULL, ptr_fmt,
    486 		  sizeof(kernel_ulong_t),
    487 			(kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL, ksize_fmt,
    488 		  0UL);
    489 	do_keyctl(ARG_STR(KEYCTL_UPDATE),
    490 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    491 		  sizeof(short_desc_str), short_desc, NULL, NULL,
    492 		  sizeof(kernel_ulong_t),
    493 		  (kernel_ulong_t) sizeof(short_desc_str) - 1, NULL,
    494 			  ksize_fmt,
    495 		  0UL);
    496 
    497 	buf_in_arg = false;
    498 
    499 
    500 	/* KEYCTL_REVOKE */
    501 	do_keyctl(ARG_STR(KEYCTL_REVOKE),
    502 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    503 		  0UL);
    504 	do_keyctl(ARG_STR(KEYCTL_REVOKE),
    505 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    506 		  0UL);
    507 	do_keyctl(ARG_STR(KEYCTL_REVOKE),
    508 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    509 		  0UL);
    510 	do_keyctl(ARG_STR(KEYCTL_REVOKE),
    511 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    512 		  0UL);
    513 
    514 
    515 	/* KEYCTL_CHOWN */
    516 	do_keyctl(ARG_STR(KEYCTL_CHOWN),
    517 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    518 		  sizeof(uid_t), ARG_STR(-1), NULL,
    519 		  sizeof(gid_t), ARG_STR(-1), NULL,
    520 		  0UL);
    521 	do_keyctl(ARG_STR(KEYCTL_CHOWN),
    522 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    523 		  sizeof(uid_t), 2718281828U, NULL, "%u",
    524 		  sizeof(gid_t), 3141592653U, NULL, "%u",
    525 		  0UL);
    526 
    527 
    528 	/* KEYCTL_SETPERM */
    529 	do_keyctl(ARG_STR(KEYCTL_SETPERM),
    530 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQKEY_AUTH_KEY), NULL,
    531 		  sizeof(uint32_t), 0xffffffffU,
    532 			"KEY_POS_VIEW|KEY_POS_READ|KEY_POS_WRITE|"
    533 			"KEY_POS_SEARCH|KEY_POS_LINK|KEY_POS_SETATTR|"
    534 			"KEY_USR_VIEW|KEY_USR_READ|KEY_USR_WRITE|"
    535 			"KEY_USR_SEARCH|KEY_USR_LINK|KEY_USR_SETATTR|"
    536 			"KEY_GRP_VIEW|KEY_GRP_READ|KEY_GRP_WRITE|"
    537 			"KEY_GRP_SEARCH|KEY_GRP_LINK|KEY_GRP_SETATTR|"
    538 			"KEY_OTH_VIEW|KEY_OTH_READ|KEY_OTH_WRITE|"
    539 			"KEY_OTH_SEARCH|KEY_OTH_LINK|KEY_OTH_SETATTR|"
    540 			"0xc0c0c0c0", NULL,
    541 		  0UL);
    542 	do_keyctl(ARG_STR(KEYCTL_SETPERM),
    543 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    544 		  sizeof(uint32_t), 0, NULL, "%#x",
    545 		  0UL);
    546 	do_keyctl(ARG_STR(KEYCTL_SETPERM),
    547 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    548 		  sizeof(uint32_t), 0xc0c0c0c0, "0xc0c0c0c0 /* KEY_??? */",
    549 			  NULL,
    550 		  0UL);
    551 
    552 
    553 	/* KEYCTL_DESCRIBE */
    554 	do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
    555 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    556 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    557 		  sizeof(kernel_ulong_t),
    558 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    559 		  0UL);
    560 	do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
    561 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    562 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    563 		  sizeof(kernel_ulong_t),
    564 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    565 		  0UL);
    566 	do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
    567 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    568 		  (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
    569 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 9, NULL, ksize_fmt,
    570 		  0UL);
    571 	do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
    572 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    573 		  (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
    574 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 256, NULL, ksize_fmt,
    575 		  0UL);
    576 	do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
    577 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    578 		  (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
    579 		  sizeof(kernel_ulong_t), (kernel_ulong_t) -4, NULL, ksize_fmt,
    580 		  0UL);
    581 
    582 
    583 	/* KEYCTL_CLEAR */
    584 	do_keyctl(ARG_STR(KEYCTL_CLEAR),
    585 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    586 		  0UL);
    587 	do_keyctl(ARG_STR(KEYCTL_CLEAR),
    588 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    589 		  0UL);
    590 	do_keyctl(ARG_STR(KEYCTL_CLEAR),
    591 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    592 		  0UL);
    593 	do_keyctl(ARG_STR(KEYCTL_CLEAR),
    594 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    595 		  0UL);
    596 
    597 
    598 	/* KEYCTL_LINK */
    599 	do_keyctl(ARG_STR(KEYCTL_LINK),
    600 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    601 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    602 		  0UL);
    603 	do_keyctl(ARG_STR(KEYCTL_LINK),
    604 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    605 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    606 		  0UL);
    607 	do_keyctl(ARG_STR(KEYCTL_LINK),
    608 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    609 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    610 		  0UL);
    611 
    612 
    613 	/* KEYCTL_UNLINK */
    614 	do_keyctl(ARG_STR(KEYCTL_UNLINK),
    615 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    616 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    617 		  0UL);
    618 	do_keyctl(ARG_STR(KEYCTL_UNLINK),
    619 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    620 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    621 		  0UL);
    622 	do_keyctl(ARG_STR(KEYCTL_UNLINK),
    623 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    624 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    625 		  0UL);
    626 
    627 
    628 	/* KEYCTL_SEARCH */
    629 	buf_in_arg = true;
    630 
    631 	do_keyctl(ARG_STR(KEYCTL_SEARCH),
    632 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    633 		  sizeof(char *), ARG_STR(NULL), NULL,
    634 		  sizeof(char *), ARG_STR(NULL), NULL,
    635 		  sizeof(int32_t), 0, NULL, "%d");
    636 	do_keyctl(ARG_STR(KEYCTL_SEARCH),
    637 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    638 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    639 		  sizeof(char *), (char *) 0xfffff00dfffff157ULL, NULL, ptr_fmt,
    640 		  sizeof(int32_t), ARG_STR(KEY_SPEC_USER_SESSION_KEYRING),
    641 			  NULL);
    642 	do_keyctl(ARG_STR(KEYCTL_SEARCH),
    643 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    644 		  sizeof(char *), bogus_str, NULL, ptr_fmt,
    645 		  sizeof(char *), bogus_desc, NULL, ptr_fmt,
    646 		  sizeof(int32_t), bogus_key1, NULL, "%d");
    647 	do_keyctl(ARG_STR(KEYCTL_SEARCH),
    648 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    649 		  sizeof(short_type_str), short_type, NULL, NULL,
    650 		  sizeof(short_desc_str), short_desc, NULL, NULL,
    651 		  sizeof(int32_t), bogus_key2, NULL, "%d");
    652 	do_keyctl(ARG_STR(KEYCTL_SEARCH),
    653 		  sizeof(int32_t), 0, NULL, "%d",
    654 		  sizeof(long_type_str), long_type, NULL, NULL,
    655 		  sizeof(long_type_str), long_desc, NULL, NULL,
    656 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
    657 
    658 	/* KEYCTL_RESTRICT_KEYRING */
    659 
    660 	do_keyctl(ARG_STR(KEYCTL_RESTRICT_KEYRING),
    661 		  sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
    662 		  sizeof(char *), ARG_STR(NULL), NULL,
    663 		  sizeof(char *), ARG_STR(NULL), NULL,
    664 			  NULL);
    665 	do_keyctl(ARG_STR(KEYCTL_RESTRICT_KEYRING),
    666 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    667 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    668 		  sizeof(char *), (char *) 0xfffff00dfffff157ULL, NULL, ptr_fmt,
    669 			  NULL);
    670 	do_keyctl(ARG_STR(KEYCTL_RESTRICT_KEYRING),
    671 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    672 		  sizeof(char *), bogus_str, NULL, ptr_fmt,
    673 		  sizeof(char *), bogus_desc, NULL, ptr_fmt,
    674 			  NULL);
    675 	do_keyctl(ARG_STR(KEYCTL_RESTRICT_KEYRING),
    676 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    677 		  sizeof(short_type_str), short_type, NULL, NULL,
    678 		  sizeof(short_desc_str), short_desc, NULL, NULL,
    679 			  NULL);
    680 	do_keyctl(ARG_STR(KEYCTL_RESTRICT_KEYRING),
    681 		  sizeof(int32_t), 0, NULL, "%d",
    682 		  sizeof(long_type_str), long_type, NULL, NULL,
    683 		  sizeof(long_type_str), long_desc, NULL, NULL,
    684 			  NULL);
    685 
    686 	buf_in_arg = false;
    687 
    688 
    689 	/* KEYCTL_READ */
    690 	nul_terminated_buf = false;
    691 
    692 	/* Empty result is expected for these */
    693 	bogus_buf1[0] = '\377';
    694 	bogus_buf2[0] = '\377';
    695 
    696 	do_keyctl(ARG_STR(KEYCTL_READ),
    697 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    698 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    699 		  sizeof(kernel_ulong_t),
    700 		  (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    701 		  0UL);
    702 	do_keyctl(ARG_STR(KEYCTL_READ),
    703 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    704 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    705 		  sizeof(kernel_ulong_t),
    706 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    707 		  0UL);
    708 	do_keyctl(ARG_STR(KEYCTL_READ),
    709 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    710 		  (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
    711 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 9, NULL, ksize_fmt,
    712 		  0UL);
    713 	do_keyctl(ARG_STR(KEYCTL_READ),
    714 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    715 		  (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
    716 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 256, NULL, ksize_fmt,
    717 		  0UL);
    718 	do_keyctl(ARG_STR(KEYCTL_READ),
    719 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    720 		  (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
    721 		  sizeof(kernel_ulong_t), (kernel_ulong_t) -4, NULL, ksize_fmt,
    722 		  0UL);
    723 
    724 	nul_terminated_buf = true;
    725 
    726 	/* KEYCTL_INSTANTIATE */
    727 	buf_in_arg = true;
    728 
    729 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
    730 		  sizeof(int32_t), 0, NULL, "%d",
    731 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    732 		  sizeof(kernel_ulong_t),
    733 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    734 		  sizeof(int32_t), 0, NULL, "%d");
    735 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
    736 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    737 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    738 		  sizeof(kernel_ulong_t),
    739 			(kernel_ulong_t) 0xdeadfeedLLU, NULL, ksize_fmt,
    740 		  sizeof(int32_t), bogus_key1, NULL, "%d");
    741 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
    742 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    743 		  sizeof(char *), bogus_str, NULL, ptr_fmt,
    744 		  sizeof(kernel_ulong_t),
    745 			(kernel_ulong_t) 32LLU, NULL, ksize_fmt,
    746 		  sizeof(int32_t), bogus_key2, NULL, "%d");
    747 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
    748 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    749 		  sizeof(short_type_str), short_desc, NULL, NULL,
    750 		  sizeof(kernel_ulong_t),
    751 			(kernel_ulong_t) sizeof(short_type_str) - 1, NULL,
    752 			ksize_fmt,
    753 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
    754 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
    755 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    756 		  sizeof(long_type_str), long_desc, NULL, NULL,
    757 		  sizeof(kernel_ulong_t),
    758 			(kernel_ulong_t) sizeof(long_type_str), NULL, ksize_fmt,
    759 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL);
    760 
    761 	buf_in_arg = false;
    762 
    763 
    764 	/* KEYCTL_NEGATE */
    765 	do_keyctl(ARG_STR(KEYCTL_NEGATE),
    766 		  sizeof(int32_t), 0, NULL, "%d",
    767 		  sizeof(uint32_t), 0, NULL, "%u",
    768 		  sizeof(int32_t), 0, NULL, "%d",
    769 		  0UL);
    770 	do_keyctl(ARG_STR(KEYCTL_NEGATE),
    771 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    772 		  sizeof(uint32_t), 3141592653U, NULL, "%u",
    773 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    774 		  0UL);
    775 	do_keyctl(ARG_STR(KEYCTL_NEGATE),
    776 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    777 		  sizeof(kernel_ulong_t),
    778 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661",
    779 			NULL,
    780 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    781 		  0UL);
    782 	do_keyctl(ARG_STR(KEYCTL_NEGATE),
    783 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    784 		  sizeof(kernel_ulong_t),
    785 		  (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
    786 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    787 		  0UL);
    788 
    789 
    790 	/* KEYCTL_SET_REQKEY_KEYRING */
    791 	do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
    792 		  sizeof(int32_t), ARG_STR(KEY_REQKEY_DEFL_NO_CHANGE), NULL,
    793 		  0UL);
    794 	/*
    795 	 * Keep it commented out until proper way of faking syscalls is not
    796 	 * implemented.
    797 	 */
    798 	/* do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
    799 		  sizeof(int32_t),
    800 		  ARG_STR(KEY_REQKEY_DEFL_REQUESTOR_KEYRING), NULL, 0UL); */
    801 	do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
    802 		  sizeof(kernel_ulong_t),
    803 		  (kernel_ulong_t) 0xfeedf157badc0dedLLU,
    804 		  "0xbadc0ded /* KEY_REQKEY_DEFL_??? */", NULL, 0UL);
    805 
    806 
    807 	/* KEYCTL_SET_TIMEOUT */
    808 	do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
    809 		  sizeof(int32_t), 0, NULL, "%d",
    810 		  sizeof(uint32_t), 0, NULL, "%u",
    811 		  0UL);
    812 	do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
    813 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    814 		  sizeof(uint32_t), 3141592653U, NULL, "%u",
    815 		  0UL);
    816 	do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
    817 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    818 		  sizeof(kernel_ulong_t),
    819 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661",
    820 			NULL,
    821 		  0UL);
    822 
    823 
    824 	/* KEYCTL_ASSUME_AUTHORITY */
    825 	do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
    826 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    827 		  0UL);
    828 	do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
    829 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    830 		  0UL);
    831 	do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
    832 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    833 		  0UL);
    834 	do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
    835 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    836 		  0UL);
    837 
    838 
    839 	/* KEYCTL_GET_SECURITY */
    840 	do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
    841 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    842 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    843 		  sizeof(uint32_t), 0xbadc0dedU, NULL, "%u",
    844 		  0UL);
    845 	do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
    846 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    847 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    848 		  sizeof(kernel_ulong_t),
    849 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    850 		  0UL);
    851 	do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
    852 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    853 		  (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
    854 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 9, NULL, ksize_fmt,
    855 		  0UL);
    856 	do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
    857 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    858 		  (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
    859 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 256, NULL, ksize_fmt,
    860 		  0UL);
    861 	do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
    862 		  sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
    863 		  (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
    864 		  sizeof(kernel_ulong_t), (kernel_ulong_t) -4, NULL, ksize_fmt,
    865 		  0UL);
    866 
    867 
    868 	/* KEYCTL_SESSION_TO_PARENT */
    869 	do_keyctl(ARG_STR(KEYCTL_SESSION_TO_PARENT), 0UL);
    870 
    871 
    872 	/* KEYCTL_REJECT */
    873 	do_keyctl(ARG_STR(KEYCTL_REJECT),
    874 		  sizeof(int32_t), 0, NULL, "%d",
    875 		  sizeof(uint32_t), 0, NULL, "%u",
    876 		  sizeof(uint32_t), 0, NULL, "%u",
    877 		  sizeof(int32_t), 0, NULL, "%d");
    878 	do_keyctl(ARG_STR(KEYCTL_REJECT),
    879 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    880 		  sizeof(uint32_t), 3141592653U, NULL, "%u",
    881 		  sizeof(uint32_t), 2718281828U, NULL, "%u",
    882 		  sizeof(int32_t), bogus_key1, NULL, "%d");
    883 	do_keyctl(ARG_STR(KEYCTL_REJECT),
    884 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    885 		  sizeof(kernel_ulong_t),
    886 			(kernel_ulong_t) 0xdeadca75facef157LLU, "4207866199",
    887 			NULL,
    888 		  sizeof(kernel_ulong_t),
    889 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661",
    890 			NULL,
    891 		  sizeof(int32_t), bogus_key2, NULL, "%d");
    892 	do_keyctl(ARG_STR(KEYCTL_REJECT),
    893 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    894 		  sizeof(kernel_ulong_t),
    895 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661",
    896 			NULL,
    897 		  sizeof(uint32_t), ARG_STR(ENODEV), NULL,
    898 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
    899 
    900 
    901 	/* KEYCTL_INSTANTIATE_IOV */
    902 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
    903 		  sizeof(int32_t), 0, NULL, "%d",
    904 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    905 		  sizeof(kernel_ulong_t),
    906 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    907 		  sizeof(int32_t), 0, NULL, "%d");
    908 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
    909 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    910 		  sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
    911 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 0xdeadfeedLLU, NULL,
    912 			ksize_fmt,
    913 		  sizeof(int32_t), bogus_key1, NULL, "%d");
    914 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
    915 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    916 		  sizeof(char *), key_iov + IOV_SIZE, NULL, ptr_fmt,
    917 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 32LLU, NULL,
    918 			ksize_fmt,
    919 		  sizeof(int32_t), bogus_key2, NULL, "%d");
    920 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
    921 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    922 		  sizeof(key_iov), key_iov + IOV_SIZE - 4, key_iov_str1, NULL,
    923 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 4, NULL,
    924 			  ksize_fmt,
    925 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
    926 	do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
    927 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    928 		  sizeof(key_iov), key_iov, key_iov_str2, NULL,
    929 		  sizeof(kernel_ulong_t), (kernel_ulong_t) IOV_SIZE, NULL,
    930 			ksize_fmt,
    931 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL);
    932 
    933 
    934 	/* KEYCTL_INVALIDATE */
    935 	do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
    936 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    937 		  0UL);
    938 	do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
    939 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    940 		  0UL);
    941 	do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
    942 		  sizeof(int32_t), bogus_key2, NULL, "%d",
    943 		  0UL);
    944 	do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
    945 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    946 		  0UL);
    947 
    948 
    949 	/* KEYCTL_GET_PERSISTENT */
    950 	do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
    951 		  sizeof(uid_t), ARG_STR(-1), NULL,
    952 		  sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
    953 		  0UL);
    954 	do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
    955 		  sizeof(uid_t), 2718281828U, NULL, "%u",
    956 		  sizeof(int32_t), bogus_key1, NULL, "%d",
    957 		  0UL);
    958 	do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
    959 		  sizeof(uid_t), 2718281828U, NULL, "%u",
    960 		  sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
    961 		  0UL);
    962 
    963 
    964 	/* KEYCTL_DH_COMPUTE */
    965 	nul_terminated_buf = false;
    966 
    967 	/* Empty result is expected for these */
    968 	bogus_buf1[0] = '\377';
    969 	bogus_buf2[0] = '\377';
    970 
    971 	do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
    972 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    973 		  sizeof(char *), ARG_STR(NULL), ptr_fmt,
    974 		  sizeof(kernel_ulong_t),
    975 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    976 		  sizeof(char *), ARG_STR(NULL), ptr_fmt);
    977 	do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
    978 		  sizeof(char *), kcdhp + 1, NULL, ptr_fmt,
    979 		  sizeof(char *), (char *) 0xfffff157ffffdeadULL, NULL, ptr_fmt,
    980 		  sizeof(kernel_ulong_t),
    981 			(kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
    982 		  sizeof(char *), ARG_STR(NULL), ptr_fmt);
    983 	do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
    984 		  sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
    985 		  (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
    986 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 9, NULL, ksize_fmt,
    987 		  sizeof(char *), ARG_STR(NULL), ptr_fmt);
    988 	do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
    989 		  sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
    990 		  (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
    991 		  sizeof(kernel_ulong_t), (kernel_ulong_t) 256, NULL, ksize_fmt,
    992 		  sizeof(char *), ARG_STR(NULL), ptr_fmt);
    993 	do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
    994 		  sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
    995 		  (size_t) -1, (uintptr_t) bogus_buf2, NULL, NULL,
    996 		  sizeof(kernel_ulong_t), (kernel_ulong_t) -1, NULL, ksize_fmt,
    997 		  sizeof(char *), kckdfp_char + 1, NULL, ptr_fmt);
    998 
    999 	/* KEYCTL_DH_COMPUTE + KDF */
   1000 
   1001 	for (i = 0; i < ARRAY_SIZE(kckdfp_data); i++) {
   1002 		struct keyctl_kdf_params *kckdfp =
   1003 			(struct keyctl_kdf_params *) kckdfp_char;
   1004 		bool deref_hash = true;
   1005 		bool deref_opts = true;
   1006 		bool print_spare = false;
   1007 		const char *hash_str = NULL;
   1008 		const char *oi_str = NULL;
   1009 
   1010 		memcpy(kckdfp, kckdfp_data + i, sizeof(kckdfp_data[i]));
   1011 
   1012 		switch (i) {
   1013 		case 1:
   1014 			deref_hash = false;
   1015 			print_spare = true;
   1016 			kckdfp->hashname =
   1017 				kckdfp_short_hash + sizeof(short_hash_data);
   1018 			break;
   1019 		case 2:
   1020 			deref_opts = false;
   1021 			kckdfp->hashname = kckdfp_long_hash;
   1022 			kckdfp->otherinfo =
   1023 				kckdfp_otherinfo1 + sizeof(otherinfo1_data);
   1024 			break;
   1025 		case 3:
   1026 			deref_opts = false;
   1027 			deref_hash = false;
   1028 			print_spare = true;
   1029 			kckdfp->hashname = bogus_str;
   1030 			kckdfp->otherinfo = kckdfp_otherinfo1;
   1031 			break;
   1032 		case 4:
   1033 			oi_str = "\"\\1\\2 OH HAI \"...";
   1034 			print_spare = true;
   1035 			kckdfp->hashname = kckdfp_short_hash;
   1036 			kckdfp->otherinfo = kckdfp_otherinfo1;
   1037 			break;
   1038 		case 5:
   1039 			oi_str = "\"\\1\\2\\n\\255\\0\\1\\0\"";
   1040 			kckdfp->hashname = kckdfp_short_hash;
   1041 			kckdfp->otherinfo = kckdfp_otherinfo2;
   1042 			break;
   1043 		}
   1044 
   1045 		do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
   1046 			  sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
   1047 			  (size_t) -1, (uintptr_t) bogus_buf2, NULL, NULL,
   1048 			  sizeof(kernel_ulong_t), (kernel_ulong_t) -1, NULL,
   1049 				ksize_fmt,
   1050 			  sizeof(kckdfp), kckdfp_char,
   1051 				kckdfp_to_str(kckdfp, deref_hash, deref_opts,
   1052 					      print_spare, hash_str, oi_str),
   1053 				NULL);
   1054 	}
   1055 
   1056 	nul_terminated_buf = true;
   1057 
   1058 	puts("+++ exited with 0 +++");
   1059 
   1060 	return 0;
   1061 }
   1062 
   1063 #else
   1064 
   1065 SKIP_MAIN_UNDEFINED("__NR_keyctl");
   1066 
   1067 #endif
   1068