These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / security / keys / encrypted-keys / encrypted.c
index 7bed4ad..696ccfa 100644 (file)
@@ -303,10 +303,10 @@ out:
  *
  * Use a user provided key to encrypt/decrypt an encrypted-key.
  */
-static struct key *request_user_key(const char *master_desc, u8 **master_key,
+static struct key *request_user_key(const char *master_desc, const u8 **master_key,
                                    size_t *master_keylen)
 {
-       struct user_key_payload *upayload;
+       const struct user_key_payload *upayload;
        struct key *ukey;
 
        ukey = request_key(&key_type_user, master_desc, NULL);
@@ -314,7 +314,7 @@ static struct key *request_user_key(const char *master_desc, u8 **master_key,
                goto error;
 
        down_read(&ukey->sem);
-       upayload = ukey->payload.data;
+       upayload = user_key_payload(ukey);
        *master_key = upayload->data;
        *master_keylen = upayload->datalen;
 error:
@@ -426,7 +426,7 @@ static int init_blkcipher_desc(struct blkcipher_desc *desc, const u8 *key,
 }
 
 static struct key *request_master_key(struct encrypted_key_payload *epayload,
-                                     u8 **master_key, size_t *master_keylen)
+                                     const u8 **master_key, size_t *master_keylen)
 {
        struct key *mkey = NULL;
 
@@ -653,7 +653,7 @@ static int encrypted_key_decrypt(struct encrypted_key_payload *epayload,
 {
        struct key *mkey;
        u8 derived_key[HASH_SIZE];
-       u8 *master_key;
+       const u8 *master_key;
        u8 *hmac;
        const char *hex_encoded_data;
        unsigned int encrypted_datalen;
@@ -837,7 +837,7 @@ static void encrypted_rcu_free(struct rcu_head *rcu)
  */
 static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
 {
-       struct encrypted_key_payload *epayload = key->payload.data;
+       struct encrypted_key_payload *epayload = key->payload.data[0];
        struct encrypted_key_payload *new_epayload;
        char *buf;
        char *new_master_desc = NULL;
@@ -845,6 +845,8 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
        size_t datalen = prep->datalen;
        int ret = 0;
 
+       if (test_bit(KEY_FLAG_NEGATIVE, &key->flags))
+               return -ENOKEY;
        if (datalen <= 0 || datalen > 32767 || !prep->data)
                return -EINVAL;
 
@@ -896,7 +898,7 @@ static long encrypted_read(const struct key *key, char __user *buffer,
 {
        struct encrypted_key_payload *epayload;
        struct key *mkey;
-       u8 *master_key;
+       const u8 *master_key;
        size_t master_keylen;
        char derived_key[HASH_SIZE];
        char *ascii_buf;
@@ -957,13 +959,13 @@ out:
  */
 static void encrypted_destroy(struct key *key)
 {
-       struct encrypted_key_payload *epayload = key->payload.data;
+       struct encrypted_key_payload *epayload = key->payload.data[0];
 
        if (!epayload)
                return;
 
        memset(epayload->decrypted_data, 0, epayload->decrypted_datalen);
-       kfree(key->payload.data);
+       kfree(key->payload.data[0]);
 }
 
 struct key_type key_type_encrypted = {