diff options
-rw-r--r-- | crypto/asymmetric_keys/asymmetric_type.c | 25 | ||||
-rw-r--r-- | include/linux/key-type.h | 2 | ||||
-rw-r--r-- | security/keys/key.c | 30 |
3 files changed, 33 insertions, 24 deletions
diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c index b77eb5304788..c1fe0fcee8e3 100644 --- a/crypto/asymmetric_keys/asymmetric_type.c +++ b/crypto/asymmetric_keys/asymmetric_type.c | |||
@@ -164,29 +164,6 @@ static void asymmetric_key_free_preparse(struct key_preparsed_payload *prep) | |||
164 | } | 164 | } |
165 | 165 | ||
166 | /* | 166 | /* |
167 | * Instantiate a asymmetric_key defined key. The key was preparsed, so we just | ||
168 | * have to transfer the data here. | ||
169 | */ | ||
170 | static int asymmetric_key_instantiate(struct key *key, struct key_preparsed_payload *prep) | ||
171 | { | ||
172 | int ret; | ||
173 | |||
174 | pr_devel("==>%s()\n", __func__); | ||
175 | |||
176 | ret = key_payload_reserve(key, prep->quotalen); | ||
177 | if (ret == 0) { | ||
178 | key->type_data.p[0] = prep->type_data[0]; | ||
179 | key->type_data.p[1] = prep->type_data[1]; | ||
180 | key->payload.data = prep->payload; | ||
181 | prep->type_data[0] = NULL; | ||
182 | prep->type_data[1] = NULL; | ||
183 | prep->payload = NULL; | ||
184 | } | ||
185 | pr_devel("<==%s() = %d\n", __func__, ret); | ||
186 | return ret; | ||
187 | } | ||
188 | |||
189 | /* | ||
190 | * dispose of the data dangling from the corpse of a asymmetric key | 167 | * dispose of the data dangling from the corpse of a asymmetric key |
191 | */ | 168 | */ |
192 | static void asymmetric_key_destroy(struct key *key) | 169 | static void asymmetric_key_destroy(struct key *key) |
@@ -205,7 +182,7 @@ struct key_type key_type_asymmetric = { | |||
205 | .name = "asymmetric", | 182 | .name = "asymmetric", |
206 | .preparse = asymmetric_key_preparse, | 183 | .preparse = asymmetric_key_preparse, |
207 | .free_preparse = asymmetric_key_free_preparse, | 184 | .free_preparse = asymmetric_key_free_preparse, |
208 | .instantiate = asymmetric_key_instantiate, | 185 | .instantiate = generic_key_instantiate, |
209 | .match = asymmetric_key_match, | 186 | .match = asymmetric_key_match, |
210 | .destroy = asymmetric_key_destroy, | 187 | .destroy = asymmetric_key_destroy, |
211 | .describe = asymmetric_key_describe, | 188 | .describe = asymmetric_key_describe, |
diff --git a/include/linux/key-type.h b/include/linux/key-type.h index a74c3a84dfdd..88503dca2a57 100644 --- a/include/linux/key-type.h +++ b/include/linux/key-type.h | |||
@@ -159,5 +159,7 @@ static inline int key_negate_and_link(struct key *key, | |||
159 | return key_reject_and_link(key, timeout, ENOKEY, keyring, instkey); | 159 | return key_reject_and_link(key, timeout, ENOKEY, keyring, instkey); |
160 | } | 160 | } |
161 | 161 | ||
162 | extern int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep); | ||
163 | |||
162 | #endif /* CONFIG_KEYS */ | 164 | #endif /* CONFIG_KEYS */ |
163 | #endif /* _LINUX_KEY_TYPE_H */ | 165 | #endif /* _LINUX_KEY_TYPE_H */ |
diff --git a/security/keys/key.c b/security/keys/key.c index 2048a110e7f1..7c9acbf106b6 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -1024,6 +1024,36 @@ void key_invalidate(struct key *key) | |||
1024 | EXPORT_SYMBOL(key_invalidate); | 1024 | EXPORT_SYMBOL(key_invalidate); |
1025 | 1025 | ||
1026 | /** | 1026 | /** |
1027 | * generic_key_instantiate - Simple instantiation of a key from preparsed data | ||
1028 | * @key: The key to be instantiated | ||
1029 | * @prep: The preparsed data to load. | ||
1030 | * | ||
1031 | * Instantiate a key from preparsed data. We assume we can just copy the data | ||
1032 | * in directly and clear the old pointers. | ||
1033 | * | ||
1034 | * This can be pointed to directly by the key type instantiate op pointer. | ||
1035 | */ | ||
1036 | int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep) | ||
1037 | { | ||
1038 | int ret; | ||
1039 | |||
1040 | pr_devel("==>%s()\n", __func__); | ||
1041 | |||
1042 | ret = key_payload_reserve(key, prep->quotalen); | ||
1043 | if (ret == 0) { | ||
1044 | key->type_data.p[0] = prep->type_data[0]; | ||
1045 | key->type_data.p[1] = prep->type_data[1]; | ||
1046 | rcu_assign_keypointer(key, prep->payload); | ||
1047 | prep->type_data[0] = NULL; | ||
1048 | prep->type_data[1] = NULL; | ||
1049 | prep->payload = NULL; | ||
1050 | } | ||
1051 | pr_devel("<==%s() = %d\n", __func__, ret); | ||
1052 | return ret; | ||
1053 | } | ||
1054 | EXPORT_SYMBOL(generic_key_instantiate); | ||
1055 | |||
1056 | /** | ||
1027 | * register_key_type - Register a type of key. | 1057 | * register_key_type - Register a type of key. |
1028 | * @ktype: The new key type. | 1058 | * @ktype: The new key type. |
1029 | * | 1059 | * |