From 40c6f395db0f671effe02bcad084ca6d239a6bd9 Mon Sep 17 00:00:00 2001 From: Davis Mosenkovs Date: Wed, 4 Nov 2026 00:45:48 +0200 Subject: [PATCH] Mix entropy in Dice PRNG on every Roll This improves entropy of Dice and makes PRNG state recovery harder. As a pleasant side effect this also makes the Dice app more like a physical dice - dependent on how it is shaken, but in a hard to predict manner. Using PRNG output as one of the seeds preserves 32-bits of previous PRNG entropy when reseeding. For std::minstd_rand that means entire entropy. --- src/displayapp/screens/Dice.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/displayapp/screens/Dice.cpp b/src/displayapp/screens/Dice.cpp index 302c5f3fb2..05d34e5b49 100644 --- a/src/displayapp/screens/Dice.cpp +++ b/src/displayapp/screens/Dice.cpp @@ -43,12 +43,6 @@ Dice::Dice(Controllers::MotionController& motionController, Controllers::MotorController& motorController, Controllers::Settings& settingsController) : motorController {motorController}, motionController {motionController}, settingsController {settingsController} { - std::seed_seq sseq {static_cast(xTaskGetTickCount()), - static_cast(motionController.X()), - static_cast(motionController.Y()), - static_cast(motionController.Z())}; - gen.seed(sseq); - lv_obj_t* nCounterLabel = MakeLabel(&jetbrains_mono_bold_20, LV_COLOR_WHITE, LV_LABEL_LONG_EXPAND, @@ -155,6 +149,13 @@ void Dice::Refresh() { } void Dice::Roll() { + std::seed_seq sseq {static_cast(xTaskGetTickCount()), + static_cast(motionController.X()), + static_cast(motionController.Y()), + static_cast(motionController.Z()), + static_cast(gen())}; + gen.seed(sseq); + uint8_t resultIndividual; uint16_t resultTotal = 0; std::uniform_int_distribution<> distrib(1, dCounter.GetValue());