diff options
author | Paul Selkirk <paul@psgd.org> | 2016-08-10 17:48:40 -0400 |
---|---|---|
committer | Paul Selkirk <paul@psgd.org> | 2016-08-10 17:49:02 -0400 |
commit | f5a63c380d9091b002949624001b2b1426454b56 (patch) | |
tree | 341e4c50b139559abf8cd230c4e2463fe48a8b05 /csprng.c | |
parent | 9960e43c1a6b7f83b4a345acedbda56fbeaaae0c (diff) | |
parent | 30f8e4e85b6a337291b09d55d8edc15e422b6341 (diff) |
Merge branch 'resource_management'
Diffstat (limited to 'csprng.c')
-rw-r--r-- | csprng.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -43,23 +43,23 @@ #define WAIT_FOR_CSPRNG_VALID 1 #endif -hal_error_t hal_get_random(const hal_core_t *core, void *buffer, const size_t length) +hal_error_t hal_get_random(hal_core_t *core, void *buffer, const size_t length) { uint8_t temp[4], *buf = buffer; hal_error_t err; size_t i; - if ((err = hal_core_check_name(&core, CSPRNG_NAME)) != HAL_OK) + if ((err = hal_core_alloc(CSPRNG_NAME, &core)) != HAL_OK) return err; for (i = 0; i < length; i += 4) { const int last = (length - i) < 4; if (WAIT_FOR_CSPRNG_VALID && (err = hal_io_wait_valid(core)) != HAL_OK) - return err; + goto out; if ((err = hal_io_read(core, CSPRNG_ADDR_RANDOM, (last ? temp : &buf[i]), 4)) != HAL_OK) - return err; + goto out; if (last) for (; i < length; i++) @@ -67,10 +67,15 @@ hal_error_t hal_get_random(const hal_core_t *core, void *buffer, const size_t le } for (i = 0, buf = buffer; i < length; i++, buf++) - if (*buf != 0) - return HAL_OK; + if (*buf != 0) { + err = HAL_OK; + goto out; + } + err = HAL_ERROR_CSPRNG_BROKEN; - return HAL_ERROR_CSPRNG_BROKEN; +out: + hal_core_free(core); + return err; } /* |