| 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|---|
| 2 | /* user-type.h: User-defined key type | 
|---|
| 3 | * | 
|---|
| 4 | * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. | 
|---|
| 5 | * Written by David Howells (dhowells@redhat.com) | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef _KEYS_USER_TYPE_H | 
|---|
| 9 | #define _KEYS_USER_TYPE_H | 
|---|
| 10 |  | 
|---|
| 11 | #include <linux/key.h> | 
|---|
| 12 | #include <linux/rcupdate.h> | 
|---|
| 13 |  | 
|---|
| 14 | #ifdef CONFIG_KEYS | 
|---|
| 15 |  | 
|---|
| 16 | /*****************************************************************************/ | 
|---|
| 17 | /* | 
|---|
| 18 | * the payload for a key of type "user" or "logon" | 
|---|
| 19 | * - once filled in and attached to a key: | 
|---|
| 20 | *   - the payload struct is invariant may not be changed, only replaced | 
|---|
| 21 | *   - the payload must be read with RCU procedures or with the key semaphore | 
|---|
| 22 | *     held | 
|---|
| 23 | *   - the payload may only be replaced with the key semaphore write-locked | 
|---|
| 24 | * - the key's data length is the size of the actual data, not including the | 
|---|
| 25 | *   payload wrapper | 
|---|
| 26 | */ | 
|---|
| 27 | struct user_key_payload { | 
|---|
| 28 | struct rcu_head	rcu;		/* RCU destructor */ | 
|---|
| 29 | unsigned short	datalen;	/* length of this data */ | 
|---|
| 30 | char		data[] __aligned(__alignof__(u64)); /* actual data */ | 
|---|
| 31 | }; | 
|---|
| 32 |  | 
|---|
| 33 | extern struct key_type key_type_user; | 
|---|
| 34 | extern struct key_type key_type_logon; | 
|---|
| 35 |  | 
|---|
| 36 | struct key_preparsed_payload; | 
|---|
| 37 |  | 
|---|
| 38 | extern int user_preparse(struct key_preparsed_payload *prep); | 
|---|
| 39 | extern void user_free_preparse(struct key_preparsed_payload *prep); | 
|---|
| 40 | extern int user_update(struct key *key, struct key_preparsed_payload *prep); | 
|---|
| 41 | extern void user_revoke(struct key *key); | 
|---|
| 42 | extern void user_destroy(struct key *key); | 
|---|
| 43 | extern void user_describe(const struct key *user, struct seq_file *m); | 
|---|
| 44 | extern long user_read(const struct key *key, char *buffer, size_t buflen); | 
|---|
| 45 |  | 
|---|
| 46 | static inline const struct user_key_payload *user_key_payload_rcu(const struct key *key) | 
|---|
| 47 | { | 
|---|
| 48 | return (struct user_key_payload *)dereference_key_rcu(key); | 
|---|
| 49 | } | 
|---|
| 50 |  | 
|---|
| 51 | static inline struct user_key_payload *user_key_payload_locked(const struct key *key) | 
|---|
| 52 | { | 
|---|
| 53 | return (struct user_key_payload *)dereference_key_locked((struct key *)key); | 
|---|
| 54 | } | 
|---|
| 55 |  | 
|---|
| 56 | #endif /* CONFIG_KEYS */ | 
|---|
| 57 |  | 
|---|
| 58 | #endif /* _KEYS_USER_TYPE_H */ | 
|---|
| 59 |  | 
|---|