blob: aa4926eda8f2b4feeb48f1f19458d2d464d415e0 [file] [log] [blame]
/*******************************************************************************
*
* Copyright (c) 2011, 2012, 2013, 2014, 2015 Olaf Bergmann (TZI) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
*
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Olaf Bergmann - initial API and implementation
* Hauke Mehrtens - memory optimization, ECC integration
*
*******************************************************************************/
/**
* @file prng.h
* @brief Pseudo Random Numbers
*/
#ifndef _DTLS_PRNG_H_
#define _DTLS_PRNG_H_
#include "tinydtls.h"
/**
* @defgroup prng Pseudo Random Numbers
* @{
*/
#ifndef WITH_CONTIKI
#include <stdlib.h>
/**
* Fills \p buf with \p len random bytes. This is the default
* implementation for prng(). You might want to change prng() to use
* a better PRNG on your specific platform.
*/
static inline int
dtls_prng(unsigned char *buf, size_t len) {
while (len--)
*buf++ = rand() & 0xFF;
return 1;
}
static inline void
dtls_prng_init(unsigned short seed) {
srand(seed);
}
#else /* WITH_CONTIKI */
#include <string.h>
#include "random.h"
#ifdef HAVE_PRNG
static inline int
dtls_prng(unsigned char *buf, size_t len)
{
return contiki_prng_impl(buf, len);
}
#else
/**
* Fills \p buf with \p len random bytes. This is the default
* implementation for prng(). You might want to change prng() to use
* a better PRNG on your specific platform.
*/
static inline int
dtls_prng(unsigned char *buf, size_t len) {
unsigned short v = random_rand();
while (len > sizeof(v)) {
memcpy(buf, &v, sizeof(v));
len -= sizeof(v);
buf += sizeof(v);
v = random_rand();
}
memcpy(buf, &v, len);
return 1;
}
#endif /* HAVE_PRNG */
static inline void
dtls_prng_init(unsigned short seed) {
/* random_init() messes with the radio interface of the CC2538 and
* therefore must not be called after the radio has been
* initialized. */
#ifndef CONTIKI_TARGET_CC2538DK
random_init(seed);
#endif
}
#endif /* WITH_CONTIKI */
/** @} */
#endif /* _DTLS_PRNG_H_ */