Skip to content

Commit

Permalink
crypto: drbg - use memzero_explicit() for clearing sensitive data
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
nicryptolaus authored and herbertx committed Nov 27, 2014
1 parent 0653a7c commit 421d82f
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions crypto/drbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
*/

#include <crypto/drbg.h>
#include <linux/string.h>

/***************************************************************
* Backend cipher definitions available to DRBG
Expand Down Expand Up @@ -497,9 +498,9 @@ static int drbg_ctr_df(struct drbg_state *drbg,
ret = 0;

out:
memset(iv, 0, drbg_blocklen(drbg));
memset(temp, 0, drbg_statelen(drbg));
memset(pad, 0, drbg_blocklen(drbg));
memzero_explicit(iv, drbg_blocklen(drbg));
memzero_explicit(temp, drbg_statelen(drbg));
memzero_explicit(pad, drbg_blocklen(drbg));
return ret;
}

Expand Down Expand Up @@ -573,9 +574,9 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
ret = 0;

out:
memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
memzero_explicit(temp, drbg_statelen(drbg) + drbg_blocklen(drbg));
if (2 != reseed)
memset(df_data, 0, drbg_statelen(drbg));
memzero_explicit(df_data, drbg_statelen(drbg));
return ret;
}

Expand Down Expand Up @@ -633,7 +634,7 @@ static int drbg_ctr_generate(struct drbg_state *drbg,
len = ret;

out:
memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
return len;
}

Expand Down Expand Up @@ -871,7 +872,7 @@ static int drbg_hash_df(struct drbg_state *drbg,
}

out:
memset(tmp, 0, drbg_blocklen(drbg));
memzero_explicit(tmp, drbg_blocklen(drbg));
return ret;
}

Expand Down Expand Up @@ -915,7 +916,7 @@ static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,
ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);

out:
memset(drbg->scratchpad, 0, drbg_statelen(drbg));
memzero_explicit(drbg->scratchpad, drbg_statelen(drbg));
return ret;
}

Expand Down Expand Up @@ -950,7 +951,7 @@ static int drbg_hash_process_addtl(struct drbg_state *drbg,
drbg->scratchpad, drbg_blocklen(drbg));

out:
memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
return ret;
}

Expand Down Expand Up @@ -997,7 +998,7 @@ static int drbg_hash_hashgen(struct drbg_state *drbg,
}

out:
memset(drbg->scratchpad, 0,
memzero_explicit(drbg->scratchpad,
(drbg_statelen(drbg) + drbg_blocklen(drbg)));
return len;
}
Expand Down Expand Up @@ -1046,7 +1047,7 @@ static int drbg_hash_generate(struct drbg_state *drbg,
drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8);

out:
memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
memzero_explicit(drbg->scratchpad, drbg_blocklen(drbg));
return len;
}

Expand Down

0 comments on commit 421d82f

Please sign in to comment.