aboutsummaryrefslogtreecommitdiffstats
path: root/security/keys/encrypted-keys/encrypted.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/keys/encrypted-keys/encrypted.c')
-rw-r--r--security/keys/encrypted-keys/encrypted.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c
index 5c98c2fe03f0..bb6324d1ccec 100644
--- a/security/keys/encrypted-keys/encrypted.c
+++ b/security/keys/encrypted-keys/encrypted.c
@@ -375,7 +375,7 @@ static int get_derived_key(u8 *derived_key, enum derived_key_type key_type,
375 memcpy(derived_buf + strlen(derived_buf) + 1, master_key, 375 memcpy(derived_buf + strlen(derived_buf) + 1, master_key,
376 master_keylen); 376 master_keylen);
377 ret = calc_hash(hash_tfm, derived_key, derived_buf, derived_buf_len); 377 ret = calc_hash(hash_tfm, derived_key, derived_buf, derived_buf_len);
378 kfree(derived_buf); 378 kzfree(derived_buf);
379 return ret; 379 return ret;
380} 380}
381 381
@@ -507,6 +507,7 @@ static int datablob_hmac_append(struct encrypted_key_payload *epayload,
507 if (!ret) 507 if (!ret)
508 dump_hmac(NULL, digest, HASH_SIZE); 508 dump_hmac(NULL, digest, HASH_SIZE);
509out: 509out:
510 memzero_explicit(derived_key, sizeof(derived_key));
510 return ret; 511 return ret;
511} 512}
512 513
@@ -545,6 +546,7 @@ static int datablob_hmac_verify(struct encrypted_key_payload *epayload,
545 dump_hmac("calc", digest, HASH_SIZE); 546 dump_hmac("calc", digest, HASH_SIZE);
546 } 547 }
547out: 548out:
549 memzero_explicit(derived_key, sizeof(derived_key));
548 return ret; 550 return ret;
549} 551}
550 552
@@ -701,6 +703,7 @@ static int encrypted_key_decrypt(struct encrypted_key_payload *epayload,
701out: 703out:
702 up_read(&mkey->sem); 704 up_read(&mkey->sem);
703 key_put(mkey); 705 key_put(mkey);
706 memzero_explicit(derived_key, sizeof(derived_key));
704 return ret; 707 return ret;
705} 708}
706 709
@@ -807,13 +810,13 @@ static int encrypted_instantiate(struct key *key,
807 ret = encrypted_init(epayload, key->description, format, master_desc, 810 ret = encrypted_init(epayload, key->description, format, master_desc,
808 decrypted_datalen, hex_encoded_iv); 811 decrypted_datalen, hex_encoded_iv);
809 if (ret < 0) { 812 if (ret < 0) {
810 kfree(epayload); 813 kzfree(epayload);
811 goto out; 814 goto out;
812 } 815 }
813 816
814 rcu_assign_keypointer(key, epayload); 817 rcu_assign_keypointer(key, epayload);
815out: 818out:
816 kfree(datablob); 819 kzfree(datablob);
817 return ret; 820 return ret;
818} 821}
819 822
@@ -822,8 +825,7 @@ static void encrypted_rcu_free(struct rcu_head *rcu)
822 struct encrypted_key_payload *epayload; 825 struct encrypted_key_payload *epayload;
823 826
824 epayload = container_of(rcu, struct encrypted_key_payload, rcu); 827 epayload = container_of(rcu, struct encrypted_key_payload, rcu);
825 memset(epayload->decrypted_data, 0, epayload->decrypted_datalen); 828 kzfree(epayload);
826 kfree(epayload);
827} 829}
828 830
829/* 831/*
@@ -881,7 +883,7 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
881 rcu_assign_keypointer(key, new_epayload); 883 rcu_assign_keypointer(key, new_epayload);
882 call_rcu(&epayload->rcu, encrypted_rcu_free); 884 call_rcu(&epayload->rcu, encrypted_rcu_free);
883out: 885out:
884 kfree(buf); 886 kzfree(buf);
885 return ret; 887 return ret;
886} 888}
887 889
@@ -939,33 +941,26 @@ static long encrypted_read(const struct key *key, char __user *buffer,
939 941
940 up_read(&mkey->sem); 942 up_read(&mkey->sem);
941 key_put(mkey); 943 key_put(mkey);
944 memzero_explicit(derived_key, sizeof(derived_key));
942 945
943 if (copy_to_user(buffer, ascii_buf, asciiblob_len) != 0) 946 if (copy_to_user(buffer, ascii_buf, asciiblob_len) != 0)
944 ret = -EFAULT; 947 ret = -EFAULT;
945 kfree(ascii_buf); 948 kzfree(ascii_buf);
946 949
947 return asciiblob_len; 950 return asciiblob_len;
948out: 951out:
949 up_read(&mkey->sem); 952 up_read(&mkey->sem);
950 key_put(mkey); 953 key_put(mkey);
954 memzero_explicit(derived_key, sizeof(derived_key));
951 return ret; 955 return ret;
952} 956}
953 957
954/* 958/*
955 * encrypted_destroy - before freeing the key, clear the decrypted data 959 * encrypted_destroy - clear and free the key's payload
956 *
957 * Before freeing the key, clear the memory containing the decrypted
958 * key data.
959 */ 960 */
960static void encrypted_destroy(struct key *key) 961static void encrypted_destroy(struct key *key)
961{ 962{
962 struct encrypted_key_payload *epayload = key->payload.data[0]; 963 kzfree(key->payload.data[0]);
963
964 if (!epayload)
965 return;
966
967 memzero_explicit(epayload->decrypted_data, epayload->decrypted_datalen);
968 kfree(key->payload.data[0]);
969} 964}
970 965
971struct key_type key_type_encrypted = { 966struct key_type key_type_encrypted = {