aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorNickolaus Woodruff <nickolauswoodruff@gmail.com>2014-11-26 13:40:57 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2014-11-27 09:26:18 -0500
commit421d82f5b3e75f94e31875e37d45cdf6a557c120 (patch)
treedaf8400560e56d726b40b103b4d67d16a6e15c32 /crypto
parent0653a7cf6fa49bc769628b6078c3ea9e1489cb7b (diff)
crypto: drbg - use memzero_explicit() for clearing sensitive data
Compiler dead store optimization can sometimes remove final calls to memset() used to clear sensitive data at the end of a function. Replace trailing memset() calls with memzero_explicit() to preclude unwanted removal. Signed-off-by: Nickolaus Woodruff <nickolauswoodruff@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/drbg.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/crypto/drbg.c b/crypto/drbg.c
index c90e3cf5967f..d748a1d0ca24 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -98,6 +98,7 @@
98 */ 98 */
99 99
100#include <crypto/drbg.h> 100#include <crypto/drbg.h>
101#include <linux/string.h>
101 102
102/*************************************************************** 103/***************************************************************
103 * Backend cipher definitions available to DRBG 104 * Backend cipher definitions available to DRBG
@@ -497,9 +498,9 @@ static int drbg_ctr_df(struct drbg_state *drbg,
497 ret = 0; 498 ret = 0;
498 499
499out: 500out:
500 memset(iv, 0, drbg_blocklen(drbg)); 501 memzero_explicit(iv, drbg_blocklen(drbg));
501 memset(temp, 0, drbg_statelen(drbg)); 502 memzero_explicit(temp, drbg_statelen(drbg));
502 memset(pad, 0, drbg_blocklen(drbg)); 503 memzero_explicit(pad, drbg_blocklen(drbg));
503 return ret; 504 return ret;
504} 505}
505 506
@@ -573,9 +574,9 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
573 ret = 0; 574 ret = 0;
574 575
575out: 576out:
576 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg)); 577 memzero_explicit(temp, drbg_statelen(drbg) + drbg_blocklen(drbg));
577 if (2 != reseed) 578 if (2 != reseed)
578 memset(df_data, 0, drbg_statelen(drbg)); 579 memzero_explicit(df_data, drbg_statelen(drbg));
579 return ret; 580 return ret;
580} 581}
581 582
@@ -633,7 +634,7 @@ static int drbg_ctr_generate(struct drbg_state *drbg,
633 len = ret; 634 len = ret;
634 635
635out: 636out:
636 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); 637 memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
637 return len; 638 return len;
638} 639}
639 640
@@ -871,7 +872,7 @@ static int drbg_hash_df(struct drbg_state *drbg,
871 } 872 }
872 873
873out: 874out:
874 memset(tmp, 0, drbg_blocklen(drbg)); 875 memzero_explicit(tmp, drbg_blocklen(drbg));
875 return ret; 876 return ret;
876} 877}
877 878
@@ -915,7 +916,7 @@ static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,
915 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2); 916 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);
916 917
917out: 918out:
918 memset(drbg->scratchpad, 0, drbg_statelen(drbg)); 919 memzero_explicit(drbg->scratchpad, drbg_statelen(drbg));
919 return ret; 920 return ret;
920} 921}
921 922
@@ -950,7 +951,7 @@ static int drbg_hash_process_addtl(struct drbg_state *drbg,
950 drbg->scratchpad, drbg_blocklen(drbg)); 951 drbg->scratchpad, drbg_blocklen(drbg));
951 952
952out: 953out:
953 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); 954 memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
954 return ret; 955 return ret;
955} 956}
956 957
@@ -997,7 +998,7 @@ static int drbg_hash_hashgen(struct drbg_state *drbg,
997 } 998 }
998 999
999out: 1000out:
1000 memset(drbg->scratchpad, 0, 1001 memzero_explicit(drbg->scratchpad,
1001 (drbg_statelen(drbg) + drbg_blocklen(drbg))); 1002 (drbg_statelen(drbg) + drbg_blocklen(drbg)));
1002 return len; 1003 return len;
1003} 1004}
@@ -1046,7 +1047,7 @@ static int drbg_hash_generate(struct drbg_state *drbg,
1046 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8); 1047 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8);
1047 1048
1048out: 1049out:
1049 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); 1050 memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
1050 return len; 1051 return len;
1051} 1052}
1052 1053