core.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /*
  2. * hw_random/core.c: HWRNG core API
  3. *
  4. * Copyright 2006 Michael Buesch <m@bues.ch>
  5. * Copyright 2005 (c) MontaVista Software, Inc.
  6. *
  7. * Please read Documentation/admin-guide/hw_random.rst for details on use.
  8. *
  9. * This software may be used and distributed according to the terms
  10. * of the GNU General Public License, incorporated herein by reference.
  11. */
  12. #include <linux/delay.h>
  13. #include <linux/device.h>
  14. #include <linux/err.h>
  15. #include <linux/fs.h>
  16. #include <linux/hw_random.h>
  17. #include <linux/kernel.h>
  18. #include <linux/kthread.h>
  19. #include <linux/miscdevice.h>
  20. #include <linux/module.h>
  21. #include <linux/random.h>
  22. #include <linux/sched.h>
  23. #include <linux/sched/signal.h>
  24. #include <linux/slab.h>
  25. #include <linux/string.h>
  26. #include <linux/uaccess.h>
  27. #define RNG_MODULE_NAME "hw_random"
  28. #define RNG_BUFFER_SIZE (SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES)
  29. static struct hwrng *current_rng;
  30. /* the current rng has been explicitly chosen by user via sysfs */
  31. static int cur_rng_set_by_user;
  32. static struct task_struct *hwrng_fill;
  33. /* list of registered rngs */
  34. static LIST_HEAD(rng_list);
  35. /* Protects rng_list and current_rng */
  36. static DEFINE_MUTEX(rng_mutex);
  37. /* Protects rng read functions, data_avail, rng_buffer and rng_fillbuf */
  38. static DEFINE_MUTEX(reading_mutex);
  39. static int data_avail;
  40. static u8 *rng_buffer, *rng_fillbuf;
  41. static unsigned short current_quality;
  42. static unsigned short default_quality = 1024; /* default to maximum */
  43. module_param(current_quality, ushort, 0644);
  44. MODULE_PARM_DESC(current_quality,
  45. "current hwrng entropy estimation per 1024 bits of input -- obsolete, use rng_quality instead");
  46. module_param(default_quality, ushort, 0644);
  47. MODULE_PARM_DESC(default_quality,
  48. "default maximum entropy content of hwrng per 1024 bits of input");
  49. static void drop_current_rng(void);
  50. static int hwrng_init(struct hwrng *rng);
  51. static int hwrng_fillfn(void *unused);
  52. static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
  53. int wait);
  54. static size_t rng_buffer_size(void)
  55. {
  56. return RNG_BUFFER_SIZE;
  57. }
  58. static inline void cleanup_rng(struct kref *kref)
  59. {
  60. struct hwrng *rng = container_of(kref, struct hwrng, ref);
  61. if (rng->cleanup)
  62. rng->cleanup(rng);
  63. complete(&rng->cleanup_done);
  64. }
  65. static int set_current_rng(struct hwrng *rng)
  66. {
  67. int err;
  68. BUG_ON(!mutex_is_locked(&rng_mutex));
  69. err = hwrng_init(rng);
  70. if (err)
  71. return err;
  72. drop_current_rng();
  73. current_rng = rng;
  74. /* if necessary, start hwrng thread */
  75. if (!hwrng_fill) {
  76. hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
  77. if (IS_ERR(hwrng_fill)) {
  78. pr_err("hwrng_fill thread creation failed\n");
  79. hwrng_fill = NULL;
  80. }
  81. }
  82. return 0;
  83. }
  84. static void drop_current_rng(void)
  85. {
  86. BUG_ON(!mutex_is_locked(&rng_mutex));
  87. if (!current_rng)
  88. return;
  89. /* decrease last reference for triggering the cleanup */
  90. kref_put(&current_rng->ref, cleanup_rng);
  91. current_rng = NULL;
  92. }
  93. /* Returns ERR_PTR(), NULL or refcounted hwrng */
  94. static struct hwrng *get_current_rng_nolock(void)
  95. {
  96. if (current_rng)
  97. kref_get(&current_rng->ref);
  98. return current_rng;
  99. }
  100. static struct hwrng *get_current_rng(void)
  101. {
  102. struct hwrng *rng;
  103. if (mutex_lock_interruptible(&rng_mutex))
  104. return ERR_PTR(-ERESTARTSYS);
  105. rng = get_current_rng_nolock();
  106. mutex_unlock(&rng_mutex);
  107. return rng;
  108. }
  109. static void put_rng(struct hwrng *rng)
  110. {
  111. /*
  112. * Hold rng_mutex here so we serialize in case they set_current_rng
  113. * on rng again immediately.
  114. */
  115. mutex_lock(&rng_mutex);
  116. if (rng)
  117. kref_put(&rng->ref, cleanup_rng);
  118. mutex_unlock(&rng_mutex);
  119. }
  120. static int hwrng_init(struct hwrng *rng)
  121. {
  122. if (kref_get_unless_zero(&rng->ref))
  123. goto skip_init;
  124. if (rng->init) {
  125. int ret;
  126. ret = rng->init(rng);
  127. if (ret)
  128. return ret;
  129. }
  130. kref_init(&rng->ref);
  131. reinit_completion(&rng->cleanup_done);
  132. skip_init:
  133. current_quality = rng->quality; /* obsolete */
  134. return 0;
  135. }
  136. static int rng_dev_open(struct inode *inode, struct file *filp)
  137. {
  138. /* enforce read-only access to this chrdev */
  139. if ((filp->f_mode & FMODE_READ) == 0)
  140. return -EINVAL;
  141. if (filp->f_mode & FMODE_WRITE)
  142. return -EINVAL;
  143. return 0;
  144. }
  145. static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
  146. int wait) {
  147. int present;
  148. BUG_ON(!mutex_is_locked(&reading_mutex));
  149. if (rng->read)
  150. return rng->read(rng, (void *)buffer, size, wait);
  151. if (rng->data_present)
  152. present = rng->data_present(rng, wait);
  153. else
  154. present = 1;
  155. if (present)
  156. return rng->data_read(rng, (u32 *)buffer);
  157. return 0;
  158. }
  159. static ssize_t rng_dev_read(struct file *filp, char __user *buf,
  160. size_t size, loff_t *offp)
  161. {
  162. u8 buffer[RNG_BUFFER_SIZE];
  163. ssize_t ret = 0;
  164. int err = 0;
  165. int bytes_read, len;
  166. struct hwrng *rng;
  167. while (size) {
  168. rng = get_current_rng();
  169. if (IS_ERR(rng)) {
  170. err = PTR_ERR(rng);
  171. goto out;
  172. }
  173. if (!rng) {
  174. err = -ENODEV;
  175. goto out;
  176. }
  177. if (mutex_lock_interruptible(&reading_mutex)) {
  178. err = -ERESTARTSYS;
  179. goto out_put;
  180. }
  181. if (!data_avail) {
  182. bytes_read = rng_get_data(rng, rng_buffer,
  183. rng_buffer_size(),
  184. !(filp->f_flags & O_NONBLOCK));
  185. if (bytes_read < 0) {
  186. err = bytes_read;
  187. goto out_unlock_reading;
  188. } else if (bytes_read == 0 &&
  189. (filp->f_flags & O_NONBLOCK)) {
  190. err = -EAGAIN;
  191. goto out_unlock_reading;
  192. }
  193. data_avail = bytes_read;
  194. }
  195. len = data_avail;
  196. if (len) {
  197. if (len > size)
  198. len = size;
  199. data_avail -= len;
  200. memcpy(buffer, rng_buffer + data_avail, len);
  201. }
  202. mutex_unlock(&reading_mutex);
  203. put_rng(rng);
  204. if (len) {
  205. if (copy_to_user(buf + ret, buffer, len)) {
  206. err = -EFAULT;
  207. goto out;
  208. }
  209. size -= len;
  210. ret += len;
  211. }
  212. if (need_resched())
  213. schedule_timeout_interruptible(1);
  214. if (signal_pending(current)) {
  215. err = -ERESTARTSYS;
  216. goto out;
  217. }
  218. }
  219. out:
  220. memzero_explicit(buffer, sizeof(buffer));
  221. return ret ? : err;
  222. out_unlock_reading:
  223. mutex_unlock(&reading_mutex);
  224. out_put:
  225. put_rng(rng);
  226. goto out;
  227. }
  228. static const struct file_operations rng_chrdev_ops = {
  229. .owner = THIS_MODULE,
  230. .open = rng_dev_open,
  231. .read = rng_dev_read,
  232. .llseek = noop_llseek,
  233. };
  234. static const struct attribute_group *rng_dev_groups[];
  235. static struct miscdevice rng_miscdev = {
  236. .minor = HWRNG_MINOR,
  237. .name = RNG_MODULE_NAME,
  238. .nodename = "hwrng",
  239. .fops = &rng_chrdev_ops,
  240. .groups = rng_dev_groups,
  241. };
  242. static int enable_best_rng(void)
  243. {
  244. struct hwrng *rng, *new_rng = NULL;
  245. int ret = -ENODEV;
  246. BUG_ON(!mutex_is_locked(&rng_mutex));
  247. /* no rng to use? */
  248. if (list_empty(&rng_list)) {
  249. drop_current_rng();
  250. cur_rng_set_by_user = 0;
  251. return 0;
  252. }
  253. /* use the rng which offers the best quality */
  254. list_for_each_entry(rng, &rng_list, list) {
  255. if (!new_rng || rng->quality > new_rng->quality)
  256. new_rng = rng;
  257. }
  258. ret = ((new_rng == current_rng) ? 0 : set_current_rng(new_rng));
  259. if (!ret)
  260. cur_rng_set_by_user = 0;
  261. return ret;
  262. }
  263. static ssize_t rng_current_store(struct device *dev,
  264. struct device_attribute *attr,
  265. const char *buf, size_t len)
  266. {
  267. int err;
  268. struct hwrng *rng, *new_rng;
  269. err = mutex_lock_interruptible(&rng_mutex);
  270. if (err)
  271. return -ERESTARTSYS;
  272. if (sysfs_streq(buf, "")) {
  273. err = enable_best_rng();
  274. } else {
  275. list_for_each_entry(rng, &rng_list, list) {
  276. if (sysfs_streq(rng->name, buf)) {
  277. err = set_current_rng(rng);
  278. if (!err)
  279. cur_rng_set_by_user = 1;
  280. break;
  281. }
  282. }
  283. }
  284. new_rng = get_current_rng_nolock();
  285. mutex_unlock(&rng_mutex);
  286. if (new_rng)
  287. put_rng(new_rng);
  288. return err ? : len;
  289. }
  290. static ssize_t rng_current_show(struct device *dev,
  291. struct device_attribute *attr,
  292. char *buf)
  293. {
  294. ssize_t ret;
  295. struct hwrng *rng;
  296. rng = get_current_rng();
  297. if (IS_ERR(rng))
  298. return PTR_ERR(rng);
  299. ret = sysfs_emit(buf, "%s\n", rng ? rng->name : "none");
  300. put_rng(rng);
  301. return ret;
  302. }
  303. static ssize_t rng_available_show(struct device *dev,
  304. struct device_attribute *attr,
  305. char *buf)
  306. {
  307. int err;
  308. struct hwrng *rng;
  309. err = mutex_lock_interruptible(&rng_mutex);
  310. if (err)
  311. return -ERESTARTSYS;
  312. buf[0] = '\0';
  313. list_for_each_entry(rng, &rng_list, list) {
  314. strlcat(buf, rng->name, PAGE_SIZE);
  315. strlcat(buf, " ", PAGE_SIZE);
  316. }
  317. strlcat(buf, "\n", PAGE_SIZE);
  318. mutex_unlock(&rng_mutex);
  319. return strlen(buf);
  320. }
  321. static ssize_t rng_selected_show(struct device *dev,
  322. struct device_attribute *attr,
  323. char *buf)
  324. {
  325. return sysfs_emit(buf, "%d\n", cur_rng_set_by_user);
  326. }
  327. static ssize_t rng_quality_show(struct device *dev,
  328. struct device_attribute *attr,
  329. char *buf)
  330. {
  331. ssize_t ret;
  332. struct hwrng *rng;
  333. rng = get_current_rng();
  334. if (IS_ERR(rng))
  335. return PTR_ERR(rng);
  336. if (!rng) /* no need to put_rng */
  337. return -ENODEV;
  338. ret = sysfs_emit(buf, "%hu\n", rng->quality);
  339. put_rng(rng);
  340. return ret;
  341. }
  342. static ssize_t rng_quality_store(struct device *dev,
  343. struct device_attribute *attr,
  344. const char *buf, size_t len)
  345. {
  346. u16 quality;
  347. int ret = -EINVAL;
  348. if (len < 2)
  349. return -EINVAL;
  350. ret = mutex_lock_interruptible(&rng_mutex);
  351. if (ret)
  352. return -ERESTARTSYS;
  353. ret = kstrtou16(buf, 0, &quality);
  354. if (ret || quality > 1024) {
  355. ret = -EINVAL;
  356. goto out;
  357. }
  358. if (!current_rng) {
  359. ret = -ENODEV;
  360. goto out;
  361. }
  362. current_rng->quality = quality;
  363. current_quality = quality; /* obsolete */
  364. /* the best available RNG may have changed */
  365. ret = enable_best_rng();
  366. out:
  367. mutex_unlock(&rng_mutex);
  368. return ret ? ret : len;
  369. }
  370. static DEVICE_ATTR_RW(rng_current);
  371. static DEVICE_ATTR_RO(rng_available);
  372. static DEVICE_ATTR_RO(rng_selected);
  373. static DEVICE_ATTR_RW(rng_quality);
  374. static struct attribute *rng_dev_attrs[] = {
  375. &dev_attr_rng_current.attr,
  376. &dev_attr_rng_available.attr,
  377. &dev_attr_rng_selected.attr,
  378. &dev_attr_rng_quality.attr,
  379. NULL
  380. };
  381. ATTRIBUTE_GROUPS(rng_dev);
  382. static int hwrng_fillfn(void *unused)
  383. {
  384. size_t entropy, entropy_credit = 0; /* in 1/1024 of a bit */
  385. long rc;
  386. while (!kthread_should_stop()) {
  387. unsigned short quality;
  388. struct hwrng *rng;
  389. rng = get_current_rng();
  390. if (IS_ERR(rng) || !rng)
  391. break;
  392. mutex_lock(&reading_mutex);
  393. rc = rng_get_data(rng, rng_fillbuf,
  394. rng_buffer_size(), 1);
  395. if (current_quality != rng->quality)
  396. rng->quality = current_quality; /* obsolete */
  397. quality = rng->quality;
  398. mutex_unlock(&reading_mutex);
  399. if (rc <= 0)
  400. hwrng_msleep(rng, 10000);
  401. put_rng(rng);
  402. if (rc <= 0)
  403. continue;
  404. /* If we cannot credit at least one bit of entropy,
  405. * keep track of the remainder for the next iteration
  406. */
  407. entropy = rc * quality * 8 + entropy_credit;
  408. if ((entropy >> 10) == 0)
  409. entropy_credit = entropy;
  410. /* Outside lock, sure, but y'know: randomness. */
  411. add_hwgenerator_randomness((void *)rng_fillbuf, rc,
  412. entropy >> 10, true);
  413. }
  414. hwrng_fill = NULL;
  415. return 0;
  416. }
  417. int hwrng_register(struct hwrng *rng)
  418. {
  419. int err = -EINVAL;
  420. struct hwrng *tmp;
  421. if (!rng->name || (!rng->data_read && !rng->read))
  422. goto out;
  423. mutex_lock(&rng_mutex);
  424. /* Must not register two RNGs with the same name. */
  425. err = -EEXIST;
  426. list_for_each_entry(tmp, &rng_list, list) {
  427. if (strcmp(tmp->name, rng->name) == 0)
  428. goto out_unlock;
  429. }
  430. list_add_tail(&rng->list, &rng_list);
  431. init_completion(&rng->cleanup_done);
  432. complete(&rng->cleanup_done);
  433. init_completion(&rng->dying);
  434. /* Adjust quality field to always have a proper value */
  435. rng->quality = min_t(u16, min_t(u16, default_quality, 1024), rng->quality ?: 1024);
  436. if (!current_rng ||
  437. (!cur_rng_set_by_user && rng->quality > current_rng->quality)) {
  438. /*
  439. * Set new rng as current as the new rng source
  440. * provides better entropy quality and was not
  441. * chosen by userspace.
  442. */
  443. err = set_current_rng(rng);
  444. if (err)
  445. goto out_unlock;
  446. }
  447. mutex_unlock(&rng_mutex);
  448. return 0;
  449. out_unlock:
  450. mutex_unlock(&rng_mutex);
  451. out:
  452. return err;
  453. }
  454. EXPORT_SYMBOL_GPL(hwrng_register);
  455. void hwrng_unregister(struct hwrng *rng)
  456. {
  457. struct hwrng *new_rng;
  458. int err;
  459. mutex_lock(&rng_mutex);
  460. list_del(&rng->list);
  461. complete_all(&rng->dying);
  462. if (current_rng == rng) {
  463. err = enable_best_rng();
  464. if (err) {
  465. drop_current_rng();
  466. cur_rng_set_by_user = 0;
  467. }
  468. }
  469. new_rng = get_current_rng_nolock();
  470. if (list_empty(&rng_list)) {
  471. mutex_unlock(&rng_mutex);
  472. if (hwrng_fill)
  473. kthread_stop(hwrng_fill);
  474. } else
  475. mutex_unlock(&rng_mutex);
  476. if (new_rng)
  477. put_rng(new_rng);
  478. wait_for_completion(&rng->cleanup_done);
  479. }
  480. EXPORT_SYMBOL_GPL(hwrng_unregister);
  481. static void devm_hwrng_release(struct device *dev, void *res)
  482. {
  483. hwrng_unregister(*(struct hwrng **)res);
  484. }
  485. static int devm_hwrng_match(struct device *dev, void *res, void *data)
  486. {
  487. struct hwrng **r = res;
  488. if (WARN_ON(!r || !*r))
  489. return 0;
  490. return *r == data;
  491. }
  492. int devm_hwrng_register(struct device *dev, struct hwrng *rng)
  493. {
  494. struct hwrng **ptr;
  495. int error;
  496. ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
  497. if (!ptr)
  498. return -ENOMEM;
  499. error = hwrng_register(rng);
  500. if (error) {
  501. devres_free(ptr);
  502. return error;
  503. }
  504. *ptr = rng;
  505. devres_add(dev, ptr);
  506. return 0;
  507. }
  508. EXPORT_SYMBOL_GPL(devm_hwrng_register);
  509. void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
  510. {
  511. devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
  512. }
  513. EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
  514. long hwrng_msleep(struct hwrng *rng, unsigned int msecs)
  515. {
  516. unsigned long timeout = msecs_to_jiffies(msecs) + 1;
  517. return wait_for_completion_interruptible_timeout(&rng->dying, timeout);
  518. }
  519. EXPORT_SYMBOL_GPL(hwrng_msleep);
  520. long hwrng_yield(struct hwrng *rng)
  521. {
  522. return wait_for_completion_interruptible_timeout(&rng->dying, 1);
  523. }
  524. EXPORT_SYMBOL_GPL(hwrng_yield);
  525. static int __init hwrng_modinit(void)
  526. {
  527. int ret;
  528. /* kmalloc makes this safe for virt_to_page() in virtio_rng.c */
  529. rng_buffer = kmalloc(rng_buffer_size(), GFP_KERNEL);
  530. if (!rng_buffer)
  531. return -ENOMEM;
  532. rng_fillbuf = kmalloc(rng_buffer_size(), GFP_KERNEL);
  533. if (!rng_fillbuf) {
  534. kfree(rng_buffer);
  535. return -ENOMEM;
  536. }
  537. ret = misc_register(&rng_miscdev);
  538. if (ret) {
  539. kfree(rng_fillbuf);
  540. kfree(rng_buffer);
  541. }
  542. return ret;
  543. }
  544. static void __exit hwrng_modexit(void)
  545. {
  546. mutex_lock(&rng_mutex);
  547. BUG_ON(current_rng);
  548. kfree(rng_buffer);
  549. kfree(rng_fillbuf);
  550. mutex_unlock(&rng_mutex);
  551. misc_deregister(&rng_miscdev);
  552. }
  553. fs_initcall(hwrng_modinit); /* depends on misc_register() */
  554. module_exit(hwrng_modexit);
  555. MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver");
  556. MODULE_LICENSE("GPL");