Use constant size generic parameter for random bytes generation
All uses of `get_random()` were in the form of: `&get_random(vec![0u8; SIZE])` with `SIZE` being a constant. Building a `Vec` is unnecessary for two reasons. First, it uses a very short-lived dynamic memory allocation. Second, a `Vec` is a resizable object, which is useless in those context when random data have a fixed size and will only be read. `get_random_bytes()` takes a constant as a generic parameter and returns an array with the requested number of random bytes. Stack safety analysis: the random bytes will be allocated on the caller stack for a very short time (until the encoding function has been called on the data). In some cases, the random bytes take less room than the `Vec` did (a `Vec` is 24 bytes on a 64 bit computer). The maximum used size is 180 bytes, which makes it for 0.008% of the default stack size for a Rust thread (2MiB), so this is a non-issue. Also, most of the uses of those random bytes are to encode them using an `Encoding`. The function `crypto::encode_random_bytes()` generates random bytes and encode them with the provided `Encoding`, leading to code deduplication. `generate_id()` has also been converted to use a constant generic parameter as well since the length of the requested String is always a constant.
Showing
- src/api/core/two_factor/authenticator.rs 1 addition, 1 deletionsrc/api/core/two_factor/authenticator.rs
- src/api/core/two_factor/mod.rs 1 addition, 1 deletionsrc/api/core/two_factor/mod.rs
- src/api/notifications.rs 1 addition, 1 deletionsrc/api/notifications.rs
- src/crypto.rs 14 additions, 7 deletionssrc/crypto.rs
- src/db/models/device.rs 2 additions, 2 deletionssrc/db/models/device.rs
Loading
Please register or sign in to comment