|
@@ -18,6 +18,8 @@
|
|
|
#include <asm/uaccess.h>
|
|
|
#include "internal.h"
|
|
|
|
|
|
+static int logon_vet_description(const char *desc);
|
|
|
+
|
|
|
/*
|
|
|
* user defined keys take an arbitrary string as the description and an
|
|
|
* arbitrary blob of data as the payload
|
|
@@ -35,6 +37,24 @@ struct key_type key_type_user = {
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(key_type_user);
|
|
|
|
|
|
+/*
|
|
|
+ * This key type is essentially the same as key_type_user, but it does
|
|
|
+ * not define a .read op. This is suitable for storing username and
|
|
|
+ * password pairs in the keyring that you do not want to be readable
|
|
|
+ * from userspace.
|
|
|
+ */
|
|
|
+struct key_type key_type_logon = {
|
|
|
+ .name = "logon",
|
|
|
+ .instantiate = user_instantiate,
|
|
|
+ .update = user_update,
|
|
|
+ .match = user_match,
|
|
|
+ .revoke = user_revoke,
|
|
|
+ .destroy = user_destroy,
|
|
|
+ .describe = user_describe,
|
|
|
+ .vet_description = logon_vet_description,
|
|
|
+};
|
|
|
+EXPORT_SYMBOL_GPL(key_type_logon);
|
|
|
+
|
|
|
/*
|
|
|
* instantiate a user defined key
|
|
|
*/
|
|
@@ -189,3 +209,20 @@ long user_read(const struct key *key, char __user *buffer, size_t buflen)
|
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(user_read);
|
|
|
+
|
|
|
+/* Vet the description for a "logon" key */
|
|
|
+static int logon_vet_description(const char *desc)
|
|
|
+{
|
|
|
+ char *p;
|
|
|
+
|
|
|
+ /* require a "qualified" description string */
|
|
|
+ p = strchr(desc, ':');
|
|
|
+ if (!p)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* also reject description with ':' as first char */
|
|
|
+ if (p == desc)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|