Contiki-NG
Toggle main menu visibility
Loading...
Searching...
No Matches
sfc32-prng.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2025, Konrad-Felix Krentz
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. Neither the name of the Institute nor the names of its contributors
14
* may be used to endorse or promote products derived from this software
15
* without specific prior written permission.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
/**
31
* \addtogroup random
32
* @{
33
*
34
* \file
35
* Implements sfc32 of PractRand.
36
* \author
37
* Konrad Krentz <konrad.krentz@gmail.com>
38
*/
39
40
#include "
lib/random.h
"
41
#include <stdbool.h>
42
43
enum
{
44
BARREL_SHIFT = 21,
45
RSHIFT = 9,
46
LSHIFT = 3
47
};
48
49
static
bool
cached;
50
static
uint32_t a;
51
static
uint32_t b;
52
static
uint32_t c;
53
static
uint32_t counter;
54
55
/*---------------------------------------------------------------------------*/
56
static
uint_fast16_t
57
rand(
void
)
58
{
59
static
uint32_t tmp;
60
if
(cached) {
61
cached =
false
;
62
return
tmp >> 16;
63
}
64
tmp = a + b + counter++;
65
a = b ^ (b >> RSHIFT);
66
b = c + (c << LSHIFT);
67
c = ((c << BARREL_SHIFT) | (c >> (32 - BARREL_SHIFT))) + tmp;
68
cached =
true
;
69
return
tmp & 0xFFFF;
70
}
71
/*---------------------------------------------------------------------------*/
72
static
void
73
seed(uint64_t seed)
74
{
75
cached =
false
;
76
a = 0;
77
b = seed;
78
c = seed >> 32;
79
counter = 1;
80
for
(uint_fast8_t i = 0; i < 24; i++) {
81
rand();
82
}
83
}
84
/*---------------------------------------------------------------------------*/
85
const
struct
random_prng
sfc32_prng = {
86
seed,
87
rand
88
};
89
/*---------------------------------------------------------------------------*/
90
91
/** @} */
random.h
Header file for generating non-cryptographic random numbers.
random_prng
Structure of PRNG drivers.
Definition
random.h:61
os
lib
sfc32-prng.c
Generated on
for Contiki-NG by
1.17.0