xref: /minix3/minix/lib/liblwip/dist/src/netif/ppp/magic.c (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
1*5d5fbe79SDavid van Moolenbroek /*
2*5d5fbe79SDavid van Moolenbroek  * magic.c - PPP Magic Number routines.
3*5d5fbe79SDavid van Moolenbroek  *
4*5d5fbe79SDavid van Moolenbroek  * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
5*5d5fbe79SDavid van Moolenbroek  *
6*5d5fbe79SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
7*5d5fbe79SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
8*5d5fbe79SDavid van Moolenbroek  * are met:
9*5d5fbe79SDavid van Moolenbroek  *
10*5d5fbe79SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
11*5d5fbe79SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
12*5d5fbe79SDavid van Moolenbroek  *
13*5d5fbe79SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
14*5d5fbe79SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in
15*5d5fbe79SDavid van Moolenbroek  *    the documentation and/or other materials provided with the
16*5d5fbe79SDavid van Moolenbroek  *    distribution.
17*5d5fbe79SDavid van Moolenbroek  *
18*5d5fbe79SDavid van Moolenbroek  * 3. The name "Carnegie Mellon University" must not be used to
19*5d5fbe79SDavid van Moolenbroek  *    endorse or promote products derived from this software without
20*5d5fbe79SDavid van Moolenbroek  *    prior written permission. For permission or any legal
21*5d5fbe79SDavid van Moolenbroek  *    details, please contact
22*5d5fbe79SDavid van Moolenbroek  *      Office of Technology Transfer
23*5d5fbe79SDavid van Moolenbroek  *      Carnegie Mellon University
24*5d5fbe79SDavid van Moolenbroek  *      5000 Forbes Avenue
25*5d5fbe79SDavid van Moolenbroek  *      Pittsburgh, PA  15213-3890
26*5d5fbe79SDavid van Moolenbroek  *      (412) 268-4387, fax: (412) 268-7395
27*5d5fbe79SDavid van Moolenbroek  *      tech-transfer@andrew.cmu.edu
28*5d5fbe79SDavid van Moolenbroek  *
29*5d5fbe79SDavid van Moolenbroek  * 4. Redistributions of any form whatsoever must retain the following
30*5d5fbe79SDavid van Moolenbroek  *    acknowledgment:
31*5d5fbe79SDavid van Moolenbroek  *    "This product includes software developed by Computing Services
32*5d5fbe79SDavid van Moolenbroek  *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
33*5d5fbe79SDavid van Moolenbroek  *
34*5d5fbe79SDavid van Moolenbroek  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
35*5d5fbe79SDavid van Moolenbroek  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
36*5d5fbe79SDavid van Moolenbroek  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
37*5d5fbe79SDavid van Moolenbroek  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
38*5d5fbe79SDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
39*5d5fbe79SDavid van Moolenbroek  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
40*5d5fbe79SDavid van Moolenbroek  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
41*5d5fbe79SDavid van Moolenbroek  */
42*5d5fbe79SDavid van Moolenbroek /*****************************************************************************
43*5d5fbe79SDavid van Moolenbroek * randm.c - Random number generator program file.
44*5d5fbe79SDavid van Moolenbroek *
45*5d5fbe79SDavid van Moolenbroek * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
46*5d5fbe79SDavid van Moolenbroek * Copyright (c) 1998 by Global Election Systems Inc.
47*5d5fbe79SDavid van Moolenbroek *
48*5d5fbe79SDavid van Moolenbroek * The authors hereby grant permission to use, copy, modify, distribute,
49*5d5fbe79SDavid van Moolenbroek * and license this software and its documentation for any purpose, provided
50*5d5fbe79SDavid van Moolenbroek * that existing copyright notices are retained in all copies and that this
51*5d5fbe79SDavid van Moolenbroek * notice and the following disclaimer are included verbatim in any
52*5d5fbe79SDavid van Moolenbroek * distributions. No written agreement, license, or royalty fee is required
53*5d5fbe79SDavid van Moolenbroek * for any of the authorized uses.
54*5d5fbe79SDavid van Moolenbroek *
55*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
56*5d5fbe79SDavid van Moolenbroek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
57*5d5fbe79SDavid van Moolenbroek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
58*5d5fbe79SDavid van Moolenbroek * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
59*5d5fbe79SDavid van Moolenbroek * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
60*5d5fbe79SDavid van Moolenbroek * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
61*5d5fbe79SDavid van Moolenbroek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62*5d5fbe79SDavid van Moolenbroek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
63*5d5fbe79SDavid van Moolenbroek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
64*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65*5d5fbe79SDavid van Moolenbroek *
66*5d5fbe79SDavid van Moolenbroek ******************************************************************************
67*5d5fbe79SDavid van Moolenbroek * REVISION HISTORY
68*5d5fbe79SDavid van Moolenbroek *
69*5d5fbe79SDavid van Moolenbroek * 03-01-01 Marc Boucher <marc@mbsi.ca>
70*5d5fbe79SDavid van Moolenbroek *   Ported to lwIP.
71*5d5fbe79SDavid van Moolenbroek * 98-06-03 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
72*5d5fbe79SDavid van Moolenbroek *   Extracted from avos.
73*5d5fbe79SDavid van Moolenbroek *****************************************************************************/
74*5d5fbe79SDavid van Moolenbroek 
75*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/ppp_opts.h"
76*5d5fbe79SDavid van Moolenbroek #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
77*5d5fbe79SDavid van Moolenbroek 
78*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/ppp_impl.h"
79*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/magic.h"
80*5d5fbe79SDavid van Moolenbroek 
81*5d5fbe79SDavid van Moolenbroek #if PPP_MD5_RANDM /* Using MD5 for better randomness if enabled */
82*5d5fbe79SDavid van Moolenbroek 
83*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/pppcrypt.h"
84*5d5fbe79SDavid van Moolenbroek 
85*5d5fbe79SDavid van Moolenbroek #define MD5_HASH_SIZE 16
86*5d5fbe79SDavid van Moolenbroek static char magic_randpool[MD5_HASH_SIZE];   /* Pool of randomness. */
87*5d5fbe79SDavid van Moolenbroek static long magic_randcount;      /* Pseudo-random incrementer */
88*5d5fbe79SDavid van Moolenbroek static u32_t magic_randomseed;    /* Seed used for random number generation. */
89*5d5fbe79SDavid van Moolenbroek 
90*5d5fbe79SDavid van Moolenbroek /*
91*5d5fbe79SDavid van Moolenbroek  * Churn the randomness pool on a random event.  Call this early and often
92*5d5fbe79SDavid van Moolenbroek  *  on random and semi-random system events to build randomness in time for
93*5d5fbe79SDavid van Moolenbroek  *  usage.  For randomly timed events, pass a null pointer and a zero length
94*5d5fbe79SDavid van Moolenbroek  *  and this will use the system timer and other sources to add randomness.
95*5d5fbe79SDavid van Moolenbroek  *  If new random data is available, pass a pointer to that and it will be
96*5d5fbe79SDavid van Moolenbroek  *  included.
97*5d5fbe79SDavid van Moolenbroek  *
98*5d5fbe79SDavid van Moolenbroek  * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
99*5d5fbe79SDavid van Moolenbroek  */
magic_churnrand(char * rand_data,u32_t rand_len)100*5d5fbe79SDavid van Moolenbroek static void magic_churnrand(char *rand_data, u32_t rand_len) {
101*5d5fbe79SDavid van Moolenbroek   lwip_md5_context md5_ctx;
102*5d5fbe79SDavid van Moolenbroek 
103*5d5fbe79SDavid van Moolenbroek   /* LWIP_DEBUGF(LOG_INFO, ("magic_churnrand: %u@%P\n", rand_len, rand_data)); */
104*5d5fbe79SDavid van Moolenbroek   lwip_md5_init(&md5_ctx);
105*5d5fbe79SDavid van Moolenbroek   lwip_md5_starts(&md5_ctx);
106*5d5fbe79SDavid van Moolenbroek   lwip_md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));
107*5d5fbe79SDavid van Moolenbroek   if (rand_data) {
108*5d5fbe79SDavid van Moolenbroek     lwip_md5_update(&md5_ctx, (u_char *)rand_data, rand_len);
109*5d5fbe79SDavid van Moolenbroek   } else {
110*5d5fbe79SDavid van Moolenbroek     struct {
111*5d5fbe79SDavid van Moolenbroek       /* INCLUDE fields for any system sources of randomness */
112*5d5fbe79SDavid van Moolenbroek       u32_t jiffies;
113*5d5fbe79SDavid van Moolenbroek #ifdef LWIP_RAND
114*5d5fbe79SDavid van Moolenbroek       u32_t rand;
115*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
116*5d5fbe79SDavid van Moolenbroek     } sys_data;
117*5d5fbe79SDavid van Moolenbroek     magic_randomseed += sys_jiffies();
118*5d5fbe79SDavid van Moolenbroek     sys_data.jiffies = magic_randomseed;
119*5d5fbe79SDavid van Moolenbroek #ifdef LWIP_RAND
120*5d5fbe79SDavid van Moolenbroek     sys_data.rand = LWIP_RAND();
121*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
122*5d5fbe79SDavid van Moolenbroek     /* Load sys_data fields here. */
123*5d5fbe79SDavid van Moolenbroek     lwip_md5_update(&md5_ctx, (u_char *)&sys_data, sizeof(sys_data));
124*5d5fbe79SDavid van Moolenbroek   }
125*5d5fbe79SDavid van Moolenbroek   lwip_md5_finish(&md5_ctx, (u_char *)magic_randpool);
126*5d5fbe79SDavid van Moolenbroek   lwip_md5_free(&md5_ctx);
127*5d5fbe79SDavid van Moolenbroek /*  LWIP_DEBUGF(LOG_INFO, ("magic_churnrand: -> 0\n")); */
128*5d5fbe79SDavid van Moolenbroek }
129*5d5fbe79SDavid van Moolenbroek 
130*5d5fbe79SDavid van Moolenbroek /*
131*5d5fbe79SDavid van Moolenbroek  * Initialize the random number generator.
132*5d5fbe79SDavid van Moolenbroek  */
magic_init(void)133*5d5fbe79SDavid van Moolenbroek void magic_init(void) {
134*5d5fbe79SDavid van Moolenbroek   magic_churnrand(NULL, 0);
135*5d5fbe79SDavid van Moolenbroek }
136*5d5fbe79SDavid van Moolenbroek 
137*5d5fbe79SDavid van Moolenbroek /*
138*5d5fbe79SDavid van Moolenbroek  * Randomize our random seed value.
139*5d5fbe79SDavid van Moolenbroek  */
magic_randomize(void)140*5d5fbe79SDavid van Moolenbroek void magic_randomize(void) {
141*5d5fbe79SDavid van Moolenbroek   magic_churnrand(NULL, 0);
142*5d5fbe79SDavid van Moolenbroek }
143*5d5fbe79SDavid van Moolenbroek 
144*5d5fbe79SDavid van Moolenbroek /*
145*5d5fbe79SDavid van Moolenbroek  * magic_random_bytes - Fill a buffer with random bytes.
146*5d5fbe79SDavid van Moolenbroek  *
147*5d5fbe79SDavid van Moolenbroek  * Use the random pool to generate random data.  This degrades to pseudo
148*5d5fbe79SDavid van Moolenbroek  *  random when used faster than randomness is supplied using magic_churnrand().
149*5d5fbe79SDavid van Moolenbroek  * Note: It's important that there be sufficient randomness in magic_randpool
150*5d5fbe79SDavid van Moolenbroek  *  before this is called for otherwise the range of the result may be
151*5d5fbe79SDavid van Moolenbroek  *  narrow enough to make a search feasible.
152*5d5fbe79SDavid van Moolenbroek  *
153*5d5fbe79SDavid van Moolenbroek  * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
154*5d5fbe79SDavid van Moolenbroek  *
155*5d5fbe79SDavid van Moolenbroek  * XXX Why does he not just call magic_churnrand() for each block?  Probably
156*5d5fbe79SDavid van Moolenbroek  *  so that you don't ever publish the seed which could possibly help
157*5d5fbe79SDavid van Moolenbroek  *  predict future values.
158*5d5fbe79SDavid van Moolenbroek  * XXX Why don't we preserve md5 between blocks and just update it with
159*5d5fbe79SDavid van Moolenbroek  *  magic_randcount each time?  Probably there is a weakness but I wish that
160*5d5fbe79SDavid van Moolenbroek  *  it was documented.
161*5d5fbe79SDavid van Moolenbroek  */
magic_random_bytes(unsigned char * buf,u32_t buf_len)162*5d5fbe79SDavid van Moolenbroek void magic_random_bytes(unsigned char *buf, u32_t buf_len) {
163*5d5fbe79SDavid van Moolenbroek   lwip_md5_context md5_ctx;
164*5d5fbe79SDavid van Moolenbroek   u_char tmp[MD5_HASH_SIZE];
165*5d5fbe79SDavid van Moolenbroek   u32_t n;
166*5d5fbe79SDavid van Moolenbroek 
167*5d5fbe79SDavid van Moolenbroek   while (buf_len > 0) {
168*5d5fbe79SDavid van Moolenbroek     lwip_md5_init(&md5_ctx);
169*5d5fbe79SDavid van Moolenbroek     lwip_md5_starts(&md5_ctx);
170*5d5fbe79SDavid van Moolenbroek     lwip_md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));
171*5d5fbe79SDavid van Moolenbroek     lwip_md5_update(&md5_ctx, (u_char *)&magic_randcount, sizeof(magic_randcount));
172*5d5fbe79SDavid van Moolenbroek     lwip_md5_finish(&md5_ctx, tmp);
173*5d5fbe79SDavid van Moolenbroek     lwip_md5_free(&md5_ctx);
174*5d5fbe79SDavid van Moolenbroek     magic_randcount++;
175*5d5fbe79SDavid van Moolenbroek     n = LWIP_MIN(buf_len, MD5_HASH_SIZE);
176*5d5fbe79SDavid van Moolenbroek     MEMCPY(buf, tmp, n);
177*5d5fbe79SDavid van Moolenbroek     buf += n;
178*5d5fbe79SDavid van Moolenbroek     buf_len -= n;
179*5d5fbe79SDavid van Moolenbroek   }
180*5d5fbe79SDavid van Moolenbroek }
181*5d5fbe79SDavid van Moolenbroek 
182*5d5fbe79SDavid van Moolenbroek /*
183*5d5fbe79SDavid van Moolenbroek  * Return a new random number.
184*5d5fbe79SDavid van Moolenbroek  */
magic(void)185*5d5fbe79SDavid van Moolenbroek u32_t magic(void) {
186*5d5fbe79SDavid van Moolenbroek   u32_t new_rand;
187*5d5fbe79SDavid van Moolenbroek 
188*5d5fbe79SDavid van Moolenbroek   magic_random_bytes((unsigned char *)&new_rand, sizeof(new_rand));
189*5d5fbe79SDavid van Moolenbroek 
190*5d5fbe79SDavid van Moolenbroek   return new_rand;
191*5d5fbe79SDavid van Moolenbroek }
192*5d5fbe79SDavid van Moolenbroek 
193*5d5fbe79SDavid van Moolenbroek #else /* PPP_MD5_RANDM */
194*5d5fbe79SDavid van Moolenbroek 
195*5d5fbe79SDavid van Moolenbroek /*****************************/
196*5d5fbe79SDavid van Moolenbroek /*** LOCAL DATA STRUCTURES ***/
197*5d5fbe79SDavid van Moolenbroek /*****************************/
198*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_RAND
199*5d5fbe79SDavid van Moolenbroek static int  magic_randomized;       /* Set when truely randomized. */
200*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
201*5d5fbe79SDavid van Moolenbroek static u32_t magic_randomseed;      /* Seed used for random number generation. */
202*5d5fbe79SDavid van Moolenbroek 
203*5d5fbe79SDavid van Moolenbroek 
204*5d5fbe79SDavid van Moolenbroek /***********************************/
205*5d5fbe79SDavid van Moolenbroek /*** PUBLIC FUNCTION DEFINITIONS ***/
206*5d5fbe79SDavid van Moolenbroek /***********************************/
207*5d5fbe79SDavid van Moolenbroek 
208*5d5fbe79SDavid van Moolenbroek /*
209*5d5fbe79SDavid van Moolenbroek  * Initialize the random number generator.
210*5d5fbe79SDavid van Moolenbroek  *
211*5d5fbe79SDavid van Moolenbroek  * Here we attempt to compute a random number seed but even if
212*5d5fbe79SDavid van Moolenbroek  * it isn't random, we'll randomize it later.
213*5d5fbe79SDavid van Moolenbroek  *
214*5d5fbe79SDavid van Moolenbroek  * The current method uses the fields from the real time clock,
215*5d5fbe79SDavid van Moolenbroek  * the idle process counter, the millisecond counter, and the
216*5d5fbe79SDavid van Moolenbroek  * hardware timer tick counter.  When this is invoked
217*5d5fbe79SDavid van Moolenbroek  * in startup(), then the idle counter and timer values may
218*5d5fbe79SDavid van Moolenbroek  * repeat after each boot and the real time clock may not be
219*5d5fbe79SDavid van Moolenbroek  * operational.  Thus we call it again on the first random
220*5d5fbe79SDavid van Moolenbroek  * event.
221*5d5fbe79SDavid van Moolenbroek  */
magic_init(void)222*5d5fbe79SDavid van Moolenbroek void magic_init(void) {
223*5d5fbe79SDavid van Moolenbroek   magic_randomseed += sys_jiffies();
224*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_RAND
225*5d5fbe79SDavid van Moolenbroek   /* Initialize the Borland random number generator. */
226*5d5fbe79SDavid van Moolenbroek   srand((unsigned)magic_randomseed);
227*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
228*5d5fbe79SDavid van Moolenbroek }
229*5d5fbe79SDavid van Moolenbroek 
230*5d5fbe79SDavid van Moolenbroek /*
231*5d5fbe79SDavid van Moolenbroek  * magic_init - Initialize the magic number generator.
232*5d5fbe79SDavid van Moolenbroek  *
233*5d5fbe79SDavid van Moolenbroek  * Randomize our random seed value.  Here we use the fact that
234*5d5fbe79SDavid van Moolenbroek  * this function is called at *truely random* times by the polling
235*5d5fbe79SDavid van Moolenbroek  * and network functions.  Here we only get 16 bits of new random
236*5d5fbe79SDavid van Moolenbroek  * value but we use the previous value to randomize the other 16
237*5d5fbe79SDavid van Moolenbroek  * bits.
238*5d5fbe79SDavid van Moolenbroek  */
magic_randomize(void)239*5d5fbe79SDavid van Moolenbroek void magic_randomize(void) {
240*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_RAND
241*5d5fbe79SDavid van Moolenbroek   if (!magic_randomized) {
242*5d5fbe79SDavid van Moolenbroek     magic_randomized = !0;
243*5d5fbe79SDavid van Moolenbroek     magic_init();
244*5d5fbe79SDavid van Moolenbroek     /* The initialization function also updates the seed. */
245*5d5fbe79SDavid van Moolenbroek   } else {
246*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
247*5d5fbe79SDavid van Moolenbroek     magic_randomseed += sys_jiffies();
248*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_RAND
249*5d5fbe79SDavid van Moolenbroek   }
250*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
251*5d5fbe79SDavid van Moolenbroek }
252*5d5fbe79SDavid van Moolenbroek 
253*5d5fbe79SDavid van Moolenbroek /*
254*5d5fbe79SDavid van Moolenbroek  * Return a new random number.
255*5d5fbe79SDavid van Moolenbroek  *
256*5d5fbe79SDavid van Moolenbroek  * Here we use the Borland rand() function to supply a pseudo random
257*5d5fbe79SDavid van Moolenbroek  * number which we make truely random by combining it with our own
258*5d5fbe79SDavid van Moolenbroek  * seed which is randomized by truely random events.
259*5d5fbe79SDavid van Moolenbroek  * Thus the numbers will be truely random unless there have been no
260*5d5fbe79SDavid van Moolenbroek  * operator or network events in which case it will be pseudo random
261*5d5fbe79SDavid van Moolenbroek  * seeded by the real time clock.
262*5d5fbe79SDavid van Moolenbroek  */
magic(void)263*5d5fbe79SDavid van Moolenbroek u32_t magic(void) {
264*5d5fbe79SDavid van Moolenbroek #ifdef LWIP_RAND
265*5d5fbe79SDavid van Moolenbroek   return LWIP_RAND() + magic_randomseed;
266*5d5fbe79SDavid van Moolenbroek #else /* LWIP_RAND */
267*5d5fbe79SDavid van Moolenbroek   return ((u32_t)rand() << 16) + (u32_t)rand() + magic_randomseed;
268*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_RAND */
269*5d5fbe79SDavid van Moolenbroek }
270*5d5fbe79SDavid van Moolenbroek 
271*5d5fbe79SDavid van Moolenbroek /*
272*5d5fbe79SDavid van Moolenbroek  * magic_random_bytes - Fill a buffer with random bytes.
273*5d5fbe79SDavid van Moolenbroek  */
magic_random_bytes(unsigned char * buf,u32_t buf_len)274*5d5fbe79SDavid van Moolenbroek void magic_random_bytes(unsigned char *buf, u32_t buf_len) {
275*5d5fbe79SDavid van Moolenbroek   u32_t new_rand, n;
276*5d5fbe79SDavid van Moolenbroek 
277*5d5fbe79SDavid van Moolenbroek   while (buf_len > 0) {
278*5d5fbe79SDavid van Moolenbroek     new_rand = magic();
279*5d5fbe79SDavid van Moolenbroek     n = LWIP_MIN(buf_len, sizeof(new_rand));
280*5d5fbe79SDavid van Moolenbroek     MEMCPY(buf, &new_rand, n);
281*5d5fbe79SDavid van Moolenbroek     buf += n;
282*5d5fbe79SDavid van Moolenbroek     buf_len -= n;
283*5d5fbe79SDavid van Moolenbroek   }
284*5d5fbe79SDavid van Moolenbroek }
285*5d5fbe79SDavid van Moolenbroek #endif /* PPP_MD5_RANDM */
286*5d5fbe79SDavid van Moolenbroek 
287*5d5fbe79SDavid van Moolenbroek /*
288*5d5fbe79SDavid van Moolenbroek  * Return a new random number between 0 and (2^pow)-1 included.
289*5d5fbe79SDavid van Moolenbroek  */
magic_pow(u8_t pow)290*5d5fbe79SDavid van Moolenbroek u32_t magic_pow(u8_t pow) {
291*5d5fbe79SDavid van Moolenbroek   return magic() & ~(~0UL<<pow);
292*5d5fbe79SDavid van Moolenbroek }
293*5d5fbe79SDavid van Moolenbroek 
294*5d5fbe79SDavid van Moolenbroek #endif /* PPP_SUPPORT */
295