/* * This file is part of the TREZOR project. * * Copyright (C) 2014 Pavol Rusnak <stick@satoshilabs.com> * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see <http://www.gnu.org/licenses/>. */ #include <libopencm3/cm3/common.h> #include <libopencm3/stm32/memorymap.h> #include <libopencm3/stm32/f2/rng.h> #include "rng.h" uint32_t random32(void) { static uint32_t last = 0, new = 0; while (new == last) { if (((RNG_SR & (RNG_SR_SEIS | RNG_SR_CEIS)) == 0) && ((RNG_SR & RNG_SR_DRDY) > 0)) { new = RNG_DR; } } last = new; return new; } uint32_t random_uniform(uint32_t n) { uint32_t x, max = 0xFFFFFFFF - (0xFFFFFFFF % n); while ((x = random32()) >= max); return x / (max / n); } void random_buffer(uint8_t *buf, size_t len) { size_t i; uint32_t r = 0; for (i = 0; i < len; i++) { if (i % 4 == 0) { r = random32(); } buf[i] = (r >> ((i % 4) * 8)) & 0xFF; } } void random_permute(char *str, size_t len) { int i, j; char t; for (i = len - 1; i >= 1; i--) { j = random_uniform(i + 1); t = str[j]; str[j] = str[i]; str[i] = t; } }