acpi/nfit, libnvdimm: Add disable passphrase support to Intel nvdimm.
Add support to disable passphrase (security) for the Intel nvdimm. The passphrase used for disabling is pulled from an encrypted-key in the kernel user keyring. The action is triggered by writing "disable <keyid>" to the sysfs attribute "security". Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
这个提交包含在:
@@ -163,6 +163,46 @@ static int intel_security_unlock(struct nvdimm *nvdimm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_security_disable(struct nvdimm *nvdimm,
|
||||
const struct nvdimm_key_data *key_data)
|
||||
{
|
||||
int rc;
|
||||
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
|
||||
struct {
|
||||
struct nd_cmd_pkg pkg;
|
||||
struct nd_intel_disable_passphrase cmd;
|
||||
} nd_cmd = {
|
||||
.pkg = {
|
||||
.nd_command = NVDIMM_INTEL_DISABLE_PASSPHRASE,
|
||||
.nd_family = NVDIMM_FAMILY_INTEL,
|
||||
.nd_size_in = ND_INTEL_PASSPHRASE_SIZE,
|
||||
.nd_size_out = ND_INTEL_STATUS_SIZE,
|
||||
.nd_fw_size = ND_INTEL_STATUS_SIZE,
|
||||
},
|
||||
};
|
||||
|
||||
if (!test_bit(NVDIMM_INTEL_DISABLE_PASSPHRASE, &nfit_mem->dsm_mask))
|
||||
return -ENOTTY;
|
||||
|
||||
memcpy(nd_cmd.cmd.passphrase, key_data->data,
|
||||
sizeof(nd_cmd.cmd.passphrase));
|
||||
rc = nvdimm_ctl(nvdimm, ND_CMD_CALL, &nd_cmd, sizeof(nd_cmd), NULL);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
switch (nd_cmd.cmd.status) {
|
||||
case 0:
|
||||
break;
|
||||
case ND_INTEL_STATUS_INVALID_PASS:
|
||||
return -EINVAL;
|
||||
case ND_INTEL_STATUS_INVALID_STATE:
|
||||
default:
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: define a cross arch wbinvd equivalent when/if
|
||||
* NVDIMM_FAMILY_INTEL command support arrives on another arch.
|
||||
@@ -183,6 +223,7 @@ static const struct nvdimm_security_ops __intel_security_ops = {
|
||||
.state = intel_security_state,
|
||||
.freeze = intel_security_freeze,
|
||||
.change_key = intel_security_change_key,
|
||||
.disable = intel_security_disable,
|
||||
#ifdef CONFIG_X86
|
||||
.unlock = intel_security_unlock,
|
||||
#endif
|
||||
|
在新工单中引用
屏蔽一个用户