security.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 2018 Intel Corporation. All rights reserved. */
  3. #include <linux/module.h>
  4. #include <linux/device.h>
  5. #include <linux/ndctl.h>
  6. #include <linux/slab.h>
  7. #include <linux/io.h>
  8. #include <linux/mm.h>
  9. #include <linux/cred.h>
  10. #include <linux/key.h>
  11. #include <linux/key-type.h>
  12. #include <keys/user-type.h>
  13. #include <keys/encrypted-type.h>
  14. #include "nd-core.h"
  15. #include "nd.h"
  16. #define NVDIMM_BASE_KEY 0
  17. #define NVDIMM_NEW_KEY 1
  18. static bool key_revalidate = true;
  19. module_param(key_revalidate, bool, 0444);
  20. MODULE_PARM_DESC(key_revalidate, "Require key validation at init.");
  21. static const char zero_key[NVDIMM_PASSPHRASE_LEN];
  22. static void *key_data(struct key *key)
  23. {
  24. struct encrypted_key_payload *epayload = dereference_key_locked(key);
  25. lockdep_assert_held_read(&key->sem);
  26. return epayload->decrypted_data;
  27. }
  28. static void nvdimm_put_key(struct key *key)
  29. {
  30. if (!key)
  31. return;
  32. up_read(&key->sem);
  33. key_put(key);
  34. }
  35. /*
  36. * Retrieve kernel key for DIMM and request from user space if
  37. * necessary. Returns a key held for read and must be put by
  38. * nvdimm_put_key() before the usage goes out of scope.
  39. */
  40. static struct key *nvdimm_request_key(struct nvdimm *nvdimm)
  41. {
  42. struct key *key = NULL;
  43. static const char NVDIMM_PREFIX[] = "nvdimm:";
  44. char desc[NVDIMM_KEY_DESC_LEN + sizeof(NVDIMM_PREFIX)];
  45. struct device *dev = &nvdimm->dev;
  46. sprintf(desc, "%s%s", NVDIMM_PREFIX, nvdimm->dimm_id);
  47. key = request_key(&key_type_encrypted, desc, "");
  48. if (IS_ERR(key)) {
  49. if (PTR_ERR(key) == -ENOKEY)
  50. dev_dbg(dev, "request_key() found no key\n");
  51. else
  52. dev_dbg(dev, "request_key() upcall failed\n");
  53. key = NULL;
  54. } else {
  55. struct encrypted_key_payload *epayload;
  56. down_read(&key->sem);
  57. epayload = dereference_key_locked(key);
  58. if (epayload->decrypted_datalen != NVDIMM_PASSPHRASE_LEN) {
  59. up_read(&key->sem);
  60. key_put(key);
  61. key = NULL;
  62. }
  63. }
  64. return key;
  65. }
  66. static const void *nvdimm_get_key_payload(struct nvdimm *nvdimm,
  67. struct key **key)
  68. {
  69. *key = nvdimm_request_key(nvdimm);
  70. if (!*key)
  71. return zero_key;
  72. return key_data(*key);
  73. }
  74. static struct key *nvdimm_lookup_user_key(struct nvdimm *nvdimm,
  75. key_serial_t id, int subclass)
  76. {
  77. key_ref_t keyref;
  78. struct key *key;
  79. struct encrypted_key_payload *epayload;
  80. struct device *dev = &nvdimm->dev;
  81. keyref = lookup_user_key(id, 0, KEY_NEED_SEARCH);
  82. if (IS_ERR(keyref))
  83. return NULL;
  84. key = key_ref_to_ptr(keyref);
  85. if (key->type != &key_type_encrypted) {
  86. key_put(key);
  87. return NULL;
  88. }
  89. dev_dbg(dev, "%s: key found: %#x\n", __func__, key_serial(key));
  90. down_read_nested(&key->sem, subclass);
  91. epayload = dereference_key_locked(key);
  92. if (epayload->decrypted_datalen != NVDIMM_PASSPHRASE_LEN) {
  93. up_read(&key->sem);
  94. key_put(key);
  95. key = NULL;
  96. }
  97. return key;
  98. }
  99. static const void *nvdimm_get_user_key_payload(struct nvdimm *nvdimm,
  100. key_serial_t id, int subclass, struct key **key)
  101. {
  102. *key = NULL;
  103. if (id == 0) {
  104. if (subclass == NVDIMM_BASE_KEY)
  105. return zero_key;
  106. else
  107. return NULL;
  108. }
  109. *key = nvdimm_lookup_user_key(nvdimm, id, subclass);
  110. if (!*key)
  111. return NULL;
  112. return key_data(*key);
  113. }
  114. static int nvdimm_key_revalidate(struct nvdimm *nvdimm)
  115. {
  116. struct key *key;
  117. int rc;
  118. const void *data;
  119. if (!nvdimm->sec.ops->change_key)
  120. return -EOPNOTSUPP;
  121. data = nvdimm_get_key_payload(nvdimm, &key);
  122. /*
  123. * Send the same key to the hardware as new and old key to
  124. * verify that the key is good.
  125. */
  126. rc = nvdimm->sec.ops->change_key(nvdimm, data, data, NVDIMM_USER);
  127. if (rc < 0) {
  128. nvdimm_put_key(key);
  129. return rc;
  130. }
  131. nvdimm_put_key(key);
  132. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  133. return 0;
  134. }
  135. static int __nvdimm_security_unlock(struct nvdimm *nvdimm)
  136. {
  137. struct device *dev = &nvdimm->dev;
  138. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
  139. struct key *key;
  140. const void *data;
  141. int rc;
  142. /* The bus lock should be held at the top level of the call stack */
  143. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  144. if (!nvdimm->sec.ops || !nvdimm->sec.ops->unlock
  145. || !nvdimm->sec.flags)
  146. return -EIO;
  147. /* cxl_test needs this to pre-populate the security state */
  148. if (IS_ENABLED(CONFIG_NVDIMM_SECURITY_TEST))
  149. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  150. /* No need to go further if security is disabled */
  151. if (test_bit(NVDIMM_SECURITY_DISABLED, &nvdimm->sec.flags))
  152. return 0;
  153. if (test_bit(NDD_SECURITY_OVERWRITE, &nvdimm->flags)) {
  154. dev_dbg(dev, "Security operation in progress.\n");
  155. return -EBUSY;
  156. }
  157. /*
  158. * If the pre-OS has unlocked the DIMM, attempt to send the key
  159. * from request_key() to the hardware for verification. Failure
  160. * to revalidate the key against the hardware results in a
  161. * freeze of the security configuration. I.e. if the OS does not
  162. * have the key, security is being managed pre-OS.
  163. */
  164. if (test_bit(NVDIMM_SECURITY_UNLOCKED, &nvdimm->sec.flags)) {
  165. if (!key_revalidate)
  166. return 0;
  167. return nvdimm_key_revalidate(nvdimm);
  168. } else
  169. data = nvdimm_get_key_payload(nvdimm, &key);
  170. rc = nvdimm->sec.ops->unlock(nvdimm, data);
  171. dev_dbg(dev, "key: %d unlock: %s\n", key_serial(key),
  172. rc == 0 ? "success" : "fail");
  173. if (rc == 0)
  174. set_bit(NDD_INCOHERENT, &nvdimm->flags);
  175. nvdimm_put_key(key);
  176. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  177. return rc;
  178. }
  179. int nvdimm_security_unlock(struct device *dev)
  180. {
  181. struct nvdimm *nvdimm = to_nvdimm(dev);
  182. int rc;
  183. nvdimm_bus_lock(dev);
  184. rc = __nvdimm_security_unlock(nvdimm);
  185. nvdimm_bus_unlock(dev);
  186. return rc;
  187. }
  188. static int check_security_state(struct nvdimm *nvdimm)
  189. {
  190. struct device *dev = &nvdimm->dev;
  191. if (test_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags)) {
  192. dev_dbg(dev, "Incorrect security state: %#lx\n",
  193. nvdimm->sec.flags);
  194. return -EIO;
  195. }
  196. if (test_bit(NDD_SECURITY_OVERWRITE, &nvdimm->flags)) {
  197. dev_dbg(dev, "Security operation in progress.\n");
  198. return -EBUSY;
  199. }
  200. return 0;
  201. }
  202. static int security_disable(struct nvdimm *nvdimm, unsigned int keyid,
  203. enum nvdimm_passphrase_type pass_type)
  204. {
  205. struct device *dev = &nvdimm->dev;
  206. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
  207. struct key *key;
  208. int rc;
  209. const void *data;
  210. /* The bus lock should be held at the top level of the call stack */
  211. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  212. if (!nvdimm->sec.ops || !nvdimm->sec.flags)
  213. return -EOPNOTSUPP;
  214. if (pass_type == NVDIMM_USER && !nvdimm->sec.ops->disable)
  215. return -EOPNOTSUPP;
  216. if (pass_type == NVDIMM_MASTER && !nvdimm->sec.ops->disable_master)
  217. return -EOPNOTSUPP;
  218. rc = check_security_state(nvdimm);
  219. if (rc)
  220. return rc;
  221. data = nvdimm_get_user_key_payload(nvdimm, keyid,
  222. NVDIMM_BASE_KEY, &key);
  223. if (!data)
  224. return -ENOKEY;
  225. if (pass_type == NVDIMM_MASTER) {
  226. rc = nvdimm->sec.ops->disable_master(nvdimm, data);
  227. dev_dbg(dev, "key: %d disable_master: %s\n", key_serial(key),
  228. rc == 0 ? "success" : "fail");
  229. } else {
  230. rc = nvdimm->sec.ops->disable(nvdimm, data);
  231. dev_dbg(dev, "key: %d disable: %s\n", key_serial(key),
  232. rc == 0 ? "success" : "fail");
  233. }
  234. nvdimm_put_key(key);
  235. if (pass_type == NVDIMM_MASTER)
  236. nvdimm->sec.ext_flags = nvdimm_security_flags(nvdimm, NVDIMM_MASTER);
  237. else
  238. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  239. return rc;
  240. }
  241. static int security_update(struct nvdimm *nvdimm, unsigned int keyid,
  242. unsigned int new_keyid,
  243. enum nvdimm_passphrase_type pass_type)
  244. {
  245. struct device *dev = &nvdimm->dev;
  246. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
  247. struct key *key, *newkey;
  248. int rc;
  249. const void *data, *newdata;
  250. /* The bus lock should be held at the top level of the call stack */
  251. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  252. if (!nvdimm->sec.ops || !nvdimm->sec.ops->change_key
  253. || !nvdimm->sec.flags)
  254. return -EOPNOTSUPP;
  255. rc = check_security_state(nvdimm);
  256. if (rc)
  257. return rc;
  258. data = nvdimm_get_user_key_payload(nvdimm, keyid,
  259. NVDIMM_BASE_KEY, &key);
  260. if (!data)
  261. return -ENOKEY;
  262. newdata = nvdimm_get_user_key_payload(nvdimm, new_keyid,
  263. NVDIMM_NEW_KEY, &newkey);
  264. if (!newdata) {
  265. nvdimm_put_key(key);
  266. return -ENOKEY;
  267. }
  268. rc = nvdimm->sec.ops->change_key(nvdimm, data, newdata, pass_type);
  269. dev_dbg(dev, "key: %d %d update%s: %s\n",
  270. key_serial(key), key_serial(newkey),
  271. pass_type == NVDIMM_MASTER ? "(master)" : "(user)",
  272. rc == 0 ? "success" : "fail");
  273. nvdimm_put_key(newkey);
  274. nvdimm_put_key(key);
  275. if (pass_type == NVDIMM_MASTER)
  276. nvdimm->sec.ext_flags = nvdimm_security_flags(nvdimm,
  277. NVDIMM_MASTER);
  278. else
  279. nvdimm->sec.flags = nvdimm_security_flags(nvdimm,
  280. NVDIMM_USER);
  281. return rc;
  282. }
  283. static int security_erase(struct nvdimm *nvdimm, unsigned int keyid,
  284. enum nvdimm_passphrase_type pass_type)
  285. {
  286. struct device *dev = &nvdimm->dev;
  287. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
  288. struct key *key = NULL;
  289. int rc;
  290. const void *data;
  291. /* The bus lock should be held at the top level of the call stack */
  292. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  293. if (!nvdimm->sec.ops || !nvdimm->sec.ops->erase
  294. || !nvdimm->sec.flags)
  295. return -EOPNOTSUPP;
  296. rc = check_security_state(nvdimm);
  297. if (rc)
  298. return rc;
  299. if (!test_bit(NVDIMM_SECURITY_UNLOCKED, &nvdimm->sec.ext_flags)
  300. && pass_type == NVDIMM_MASTER) {
  301. dev_dbg(dev,
  302. "Attempt to secure erase in wrong master state.\n");
  303. return -EOPNOTSUPP;
  304. }
  305. data = nvdimm_get_user_key_payload(nvdimm, keyid,
  306. NVDIMM_BASE_KEY, &key);
  307. if (!data)
  308. return -ENOKEY;
  309. rc = nvdimm->sec.ops->erase(nvdimm, data, pass_type);
  310. if (rc == 0)
  311. set_bit(NDD_INCOHERENT, &nvdimm->flags);
  312. dev_dbg(dev, "key: %d erase%s: %s\n", key_serial(key),
  313. pass_type == NVDIMM_MASTER ? "(master)" : "(user)",
  314. rc == 0 ? "success" : "fail");
  315. nvdimm_put_key(key);
  316. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  317. return rc;
  318. }
  319. static int security_overwrite(struct nvdimm *nvdimm, unsigned int keyid)
  320. {
  321. struct device *dev = &nvdimm->dev;
  322. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
  323. struct key *key = NULL;
  324. int rc;
  325. const void *data;
  326. /* The bus lock should be held at the top level of the call stack */
  327. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  328. if (!nvdimm->sec.ops || !nvdimm->sec.ops->overwrite
  329. || !nvdimm->sec.flags)
  330. return -EOPNOTSUPP;
  331. rc = check_security_state(nvdimm);
  332. if (rc)
  333. return rc;
  334. data = nvdimm_get_user_key_payload(nvdimm, keyid,
  335. NVDIMM_BASE_KEY, &key);
  336. if (!data)
  337. return -ENOKEY;
  338. rc = nvdimm->sec.ops->overwrite(nvdimm, data);
  339. if (rc == 0)
  340. set_bit(NDD_INCOHERENT, &nvdimm->flags);
  341. dev_dbg(dev, "key: %d overwrite submission: %s\n", key_serial(key),
  342. rc == 0 ? "success" : "fail");
  343. nvdimm_put_key(key);
  344. if (rc == 0) {
  345. set_bit(NDD_SECURITY_OVERWRITE, &nvdimm->flags);
  346. set_bit(NDD_WORK_PENDING, &nvdimm->flags);
  347. set_bit(NVDIMM_SECURITY_OVERWRITE, &nvdimm->sec.flags);
  348. /*
  349. * Make sure we don't lose device while doing overwrite
  350. * query.
  351. */
  352. get_device(dev);
  353. queue_delayed_work(system_wq, &nvdimm->dwork, 0);
  354. }
  355. return rc;
  356. }
  357. static void __nvdimm_security_overwrite_query(struct nvdimm *nvdimm)
  358. {
  359. struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(&nvdimm->dev);
  360. int rc;
  361. unsigned int tmo;
  362. /* The bus lock should be held at the top level of the call stack */
  363. lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
  364. /*
  365. * Abort and release device if we no longer have the overwrite
  366. * flag set. It means the work has been canceled.
  367. */
  368. if (!test_bit(NDD_WORK_PENDING, &nvdimm->flags))
  369. return;
  370. tmo = nvdimm->sec.overwrite_tmo;
  371. if (!nvdimm->sec.ops || !nvdimm->sec.ops->query_overwrite
  372. || !nvdimm->sec.flags)
  373. return;
  374. rc = nvdimm->sec.ops->query_overwrite(nvdimm);
  375. if (rc == -EBUSY) {
  376. /* setup delayed work again */
  377. tmo += 10;
  378. queue_delayed_work(system_wq, &nvdimm->dwork, tmo * HZ);
  379. nvdimm->sec.overwrite_tmo = min(15U * 60U, tmo);
  380. return;
  381. }
  382. if (rc < 0)
  383. dev_dbg(&nvdimm->dev, "overwrite failed\n");
  384. else
  385. dev_dbg(&nvdimm->dev, "overwrite completed\n");
  386. /*
  387. * Mark the overwrite work done and update dimm security flags,
  388. * then send a sysfs event notification to wake up userspace
  389. * poll threads to picked up the changed state.
  390. */
  391. nvdimm->sec.overwrite_tmo = 0;
  392. clear_bit(NDD_SECURITY_OVERWRITE, &nvdimm->flags);
  393. clear_bit(NDD_WORK_PENDING, &nvdimm->flags);
  394. nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
  395. nvdimm->sec.ext_flags = nvdimm_security_flags(nvdimm, NVDIMM_MASTER);
  396. if (nvdimm->sec.overwrite_state)
  397. sysfs_notify_dirent(nvdimm->sec.overwrite_state);
  398. put_device(&nvdimm->dev);
  399. }
  400. void nvdimm_security_overwrite_query(struct work_struct *work)
  401. {
  402. struct nvdimm *nvdimm =
  403. container_of(work, typeof(*nvdimm), dwork.work);
  404. nvdimm_bus_lock(&nvdimm->dev);
  405. __nvdimm_security_overwrite_query(nvdimm);
  406. nvdimm_bus_unlock(&nvdimm->dev);
  407. }
  408. #define OPS \
  409. C( OP_FREEZE, "freeze", 1), \
  410. C( OP_DISABLE, "disable", 2), \
  411. C( OP_DISABLE_MASTER, "disable_master", 2), \
  412. C( OP_UPDATE, "update", 3), \
  413. C( OP_ERASE, "erase", 2), \
  414. C( OP_OVERWRITE, "overwrite", 2), \
  415. C( OP_MASTER_UPDATE, "master_update", 3), \
  416. C( OP_MASTER_ERASE, "master_erase", 2)
  417. #undef C
  418. #define C(a, b, c) a
  419. enum nvdimmsec_op_ids { OPS };
  420. #undef C
  421. #define C(a, b, c) { b, c }
  422. static struct {
  423. const char *name;
  424. int args;
  425. } ops[] = { OPS };
  426. #undef C
  427. #define SEC_CMD_SIZE 32
  428. #define KEY_ID_SIZE 10
  429. ssize_t nvdimm_security_store(struct device *dev, const char *buf, size_t len)
  430. {
  431. struct nvdimm *nvdimm = to_nvdimm(dev);
  432. ssize_t rc;
  433. char cmd[SEC_CMD_SIZE+1], keystr[KEY_ID_SIZE+1],
  434. nkeystr[KEY_ID_SIZE+1];
  435. unsigned int key, newkey;
  436. int i;
  437. rc = sscanf(buf, "%"__stringify(SEC_CMD_SIZE)"s"
  438. " %"__stringify(KEY_ID_SIZE)"s"
  439. " %"__stringify(KEY_ID_SIZE)"s",
  440. cmd, keystr, nkeystr);
  441. if (rc < 1)
  442. return -EINVAL;
  443. for (i = 0; i < ARRAY_SIZE(ops); i++)
  444. if (sysfs_streq(cmd, ops[i].name))
  445. break;
  446. if (i >= ARRAY_SIZE(ops))
  447. return -EINVAL;
  448. if (ops[i].args > 1)
  449. rc = kstrtouint(keystr, 0, &key);
  450. if (rc >= 0 && ops[i].args > 2)
  451. rc = kstrtouint(nkeystr, 0, &newkey);
  452. if (rc < 0)
  453. return rc;
  454. if (i == OP_FREEZE) {
  455. dev_dbg(dev, "freeze\n");
  456. rc = nvdimm_security_freeze(nvdimm);
  457. } else if (i == OP_DISABLE) {
  458. dev_dbg(dev, "disable %u\n", key);
  459. rc = security_disable(nvdimm, key, NVDIMM_USER);
  460. } else if (i == OP_DISABLE_MASTER) {
  461. dev_dbg(dev, "disable_master %u\n", key);
  462. rc = security_disable(nvdimm, key, NVDIMM_MASTER);
  463. } else if (i == OP_UPDATE || i == OP_MASTER_UPDATE) {
  464. dev_dbg(dev, "%s %u %u\n", ops[i].name, key, newkey);
  465. rc = security_update(nvdimm, key, newkey, i == OP_UPDATE
  466. ? NVDIMM_USER : NVDIMM_MASTER);
  467. } else if (i == OP_ERASE || i == OP_MASTER_ERASE) {
  468. dev_dbg(dev, "%s %u\n", ops[i].name, key);
  469. if (atomic_read(&nvdimm->busy)) {
  470. dev_dbg(dev, "Unable to secure erase while DIMM active.\n");
  471. return -EBUSY;
  472. }
  473. rc = security_erase(nvdimm, key, i == OP_ERASE
  474. ? NVDIMM_USER : NVDIMM_MASTER);
  475. } else if (i == OP_OVERWRITE) {
  476. dev_dbg(dev, "overwrite %u\n", key);
  477. if (atomic_read(&nvdimm->busy)) {
  478. dev_dbg(dev, "Unable to overwrite while DIMM active.\n");
  479. return -EBUSY;
  480. }
  481. rc = security_overwrite(nvdimm, key);
  482. } else
  483. return -EINVAL;
  484. if (rc == 0)
  485. rc = len;
  486. return rc;
  487. }