]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - security/keys/encrypted-keys/encrypted.c
KEYS: Add payload preparsing opportunity prior to key instantiate or update
[karo-tx-linux.git] / security / keys / encrypted-keys / encrypted.c
index 2d1bb8af7696d5d431394cfbe8ac6d5e40f24da2..9e1e005c75967d497831fb67146020aeed4bc4a8 100644 (file)
@@ -773,8 +773,8 @@ static int encrypted_init(struct encrypted_key_payload *epayload,
  *
  * On success, return 0. Otherwise return errno.
  */
-static int encrypted_instantiate(struct key *key, const void *data,
-                                size_t datalen)
+static int encrypted_instantiate(struct key *key,
+                                struct key_preparsed_payload *prep)
 {
        struct encrypted_key_payload *epayload = NULL;
        char *datablob = NULL;
@@ -782,16 +782,17 @@ static int encrypted_instantiate(struct key *key, const void *data,
        char *master_desc = NULL;
        char *decrypted_datalen = NULL;
        char *hex_encoded_iv = NULL;
+       size_t datalen = prep->datalen;
        int ret;
 
-       if (datalen <= 0 || datalen > 32767 || !data)
+       if (datalen <= 0 || datalen > 32767 || !prep->data)
                return -EINVAL;
 
        datablob = kmalloc(datalen + 1, GFP_KERNEL);
        if (!datablob)
                return -ENOMEM;
        datablob[datalen] = 0;
-       memcpy(datablob, data, datalen);
+       memcpy(datablob, prep->data, datalen);
        ret = datablob_parse(datablob, &format, &master_desc,
                             &decrypted_datalen, &hex_encoded_iv);
        if (ret < 0)
@@ -834,16 +835,17 @@ static void encrypted_rcu_free(struct rcu_head *rcu)
  *
  * On success, return 0. Otherwise return errno.
  */
-static int encrypted_update(struct key *key, const void *data, size_t datalen)
+static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
 {
        struct encrypted_key_payload *epayload = key->payload.data;
        struct encrypted_key_payload *new_epayload;
        char *buf;
        char *new_master_desc = NULL;
        const char *format = NULL;
+       size_t datalen = prep->datalen;
        int ret = 0;
 
-       if (datalen <= 0 || datalen > 32767 || !data)
+       if (datalen <= 0 || datalen > 32767 || !prep->data)
                return -EINVAL;
 
        buf = kmalloc(datalen + 1, GFP_KERNEL);
@@ -851,7 +853,7 @@ static int encrypted_update(struct key *key, const void *data, size_t datalen)
                return -ENOMEM;
 
        buf[datalen] = 0;
-       memcpy(buf, data, datalen);
+       memcpy(buf, prep->data, datalen);
        ret = datablob_parse(buf, &format, &new_master_desc, NULL, NULL);
        if (ret < 0)
                goto out;