|  | /******************************************************************************* | 
|  | * | 
|  | * 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_ */ |