diff options
-rw-r--r-- | security/keys/encrypted-keys/encrypted.c | 31 |
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); |
509 | out: | 509 | out: |
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 | } |
547 | out: | 548 | out: |
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, | |||
701 | out: | 703 | out: |
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); |
815 | out: | 818 | out: |
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); |
883 | out: | 885 | out: |
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; |
948 | out: | 951 | out: |
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 | */ |
960 | static void encrypted_destroy(struct key *key) | 961 | static 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 | ||
971 | struct key_type key_type_encrypted = { | 966 | struct key_type key_type_encrypted = { |