keyctl01.c revision da7d01b0afd7b89edfca1fe0344d8d376f669b3a
1da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis/******************************************************************************
2da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * Copyright (c) Crackerjack Project., 2007				      *
3da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *									      *
4da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * This program is free software;  you can redistribute it and/or modify      *
5da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * it under the terms of the GNU General Public License as published by       *
6da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * the Free Software Foundation; either version 2 of the License, or	      *
7da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * (at your option) any later version.					      *
8da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *									      *
9da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * This program is distributed in the hope that it will be useful,	      *
10da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * but WITHOUT ANY WARRANTY;  without even the implied warranty of	      *
11da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See		      *
12da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * the GNU General Public License for more details.			      *
13da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *									      *
14da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * You should have received a copy of the GNU General Public License	      *
15da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * along with this program;  if not, write to the Free Software Foundation,   *
16da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
17da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *                                                                            *
18da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis ******************************************************************************/
19da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis/*
20da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * Description: This tests the keyctl() syscall
21da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *		Manipulate the kernel's key management facility
22da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *
23da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis * History:     Porting from Crackerjack to LTP is done by
24da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis *	      Manas Kumar Nayak maknayak@in.ibm.com>
25da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis */
265c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
27020a4da94272edfc2066bc6c36f7db33bea9e067Garrett Cooper#include "config.h"
286340c2a410a504efd154804f36910c5a8dabce6bGarrett Cooper#include <sys/types.h>
29e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
305c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include <linux/keyctl.h>
31e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#endif
32da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <errno.h>
33e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
344e7726497211222385eaee5e7cf2968842702a46Garrett Cooper#include <keyutils.h>
35e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#endif
36da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <limits.h>
37da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <stdio.h>
384e7726497211222385eaee5e7cf2968842702a46Garrett Cooper
395c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "test.h"
405c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "usctest.h"
415c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "linux_syscall_numbers.h"
425c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
43fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "keyctl01";
44354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint testno;
45fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 2;
465c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
47e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
482c28215423293e443469a07ae7011135d058b671Garrett Cooper
49da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubisstatic void cleanup(void)
50da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis{
51faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_CLEANUP;
52faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_rmdir();
535c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
545c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
55da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubisstatic void setup(void)
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
57faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_PAUSE;
58faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_tmpdir();
595c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
605c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int ac, char **av)
62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
63c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya	int ret;
6489af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
65da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	key_serial_t ne_key;
660b9589f3f9c0345b29cfcf7da5a1253c708303ebCyril Hrubis	const char *msg;
67faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
68da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
6960fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
70faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
71faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	setup();
72faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
73faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	for (lc = 0; TEST_LOOPING(lc); lc++) {
74faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
75d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
76faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
77faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		for (testno = 1; testno < TST_TOTAL; ++testno) {
78da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
79faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl() and ask for a keyring's ID. */
80359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek			ret = ltp_syscall(__NR_keyctl, KEYCTL_GET_KEYRING_ID,
81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				      KEY_SPEC_USER_SESSION_KEYRING);
82c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TPASS,
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "KEYCTL_GET_KEYRING_ID succeeded");
85faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			} else {
86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TFAIL | TERRNO,
87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "KEYCTL_GET_KEYRING_ID");
88da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			}
89da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			for (ne_key = INT32_MAX; ne_key > INT32_MIN; ne_key--) {
91359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek				ret = ltp_syscall(__NR_keyctl, KEYCTL_READ,
92359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek					ne_key);
93da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				if (ret == -1 && errno == ENOKEY)
94da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					break;
95faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
96faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
97faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl. */
98359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek			ret = ltp_syscall(__NR_keyctl, KEYCTL_REVOKE, ne_key);
99c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TFAIL | TERRNO,
101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "KEYCTL_REVOKE succeeded unexpectedly");
102c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			} else {
103faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				/* Check for the correct error num. */
104c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya				if (errno == ENOKEY) {
105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					tst_resm(TPASS | TERRNO,
106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 "KEYCTL_REVOKE got expected "
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 "errno");
108faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				} else {
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					tst_resm(TFAIL | TERRNO,
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 "KEYCTL_REVOKE got unexpected "
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 "errno");
1125c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak				}
1135c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
114faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
115faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
116faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		}
1175c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
118faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	}
119faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	cleanup();
120da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis	tst_exit();
121faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya}
122e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#else
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(void)
124e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper{
125da7d01b0afd7b89edfca1fe0344d8d376f669b3aCyril Hrubis	tst_brkm(TCONF, NULL, "keyctl syscall support not available on system");
126e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper}
127ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman#endif
128