libnvdimm/security: provide fix for secure-erase to use zero-key
Add a zero key in order to standardize hardware that want a key of 0's to be passed. Some platforms defaults to a zero-key with security enabled rather than allow the OS to enable the security. The zero key would allow us to manage those platform as well. This also adds a fix to secure erase so it can use the zero key to do crypto erase. Some other security commands already use zero keys. This introduces a standard zero-key to allow unification of semantics cross nvdimm security commands. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
@@ -22,6 +22,8 @@ static bool key_revalidate = true;
|
||||
module_param(key_revalidate, bool, 0444);
|
||||
MODULE_PARM_DESC(key_revalidate, "Require key validation at init.");
|
||||
|
||||
static const char zero_key[NVDIMM_PASSPHRASE_LEN];
|
||||
|
||||
static void *key_data(struct key *key)
|
||||
{
|
||||
struct encrypted_key_payload *epayload = dereference_key_locked(key);
|
||||
@@ -286,8 +288,9 @@ int nvdimm_security_erase(struct nvdimm *nvdimm, unsigned int keyid,
|
||||
{
|
||||
struct device *dev = &nvdimm->dev;
|
||||
struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
|
||||
struct key *key;
|
||||
struct key *key = NULL;
|
||||
int rc;
|
||||
const void *data;
|
||||
|
||||
/* The bus lock should be held at the top level of the call stack */
|
||||
lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
|
||||
@@ -319,11 +322,15 @@ int nvdimm_security_erase(struct nvdimm *nvdimm, unsigned int keyid,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
key = nvdimm_lookup_user_key(nvdimm, keyid, NVDIMM_BASE_KEY);
|
||||
if (!key)
|
||||
return -ENOKEY;
|
||||
if (keyid != 0) {
|
||||
key = nvdimm_lookup_user_key(nvdimm, keyid, NVDIMM_BASE_KEY);
|
||||
if (!key)
|
||||
return -ENOKEY;
|
||||
data = key_data(key);
|
||||
} else
|
||||
data = zero_key;
|
||||
|
||||
rc = nvdimm->sec.ops->erase(nvdimm, key_data(key), pass_type);
|
||||
rc = nvdimm->sec.ops->erase(nvdimm, data, pass_type);
|
||||
dev_dbg(dev, "key: %d erase%s: %s\n", key_serial(key),
|
||||
pass_type == NVDIMM_MASTER ? "(master)" : "(user)",
|
||||
rc == 0 ? "success" : "fail");
|
||||
|
Reference in New Issue
Block a user