/* * Copyright (c) 2019, The OpenThread Authors. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. *//* ... *//** * @file * This file provides an implementation of OpenThread random number generation manager class. *//* ... */#include"random.hpp"#include<openthread/platform/entropy.h>#include"common/code_utils.hpp"#include"common/debug.hpp"namespaceot{namespaceRandom{uint16_tManager::sInitCount=0;Manager::NonCryptoPrngManager::sPrng;Manager::Manager(void){uint32_tseed;OT_ASSERT(sInitCount<0xffff);VerifyOrExit(sInitCount==0);#if!OPENTHREAD_RADIOotPlatCryptoRandomInit();SuccessOrAssert(Random::Crypto::Fill(seed));/* ... */#elseSuccessOrAssert(otPlatEntropyGet(reinterpret_cast<uint8_t*>(&seed),sizeof(seed)));#endifsPrng.Init(seed);exit:sInitCount++;}{ ... }Manager::~Manager(void){OT_ASSERT(sInitCount>0);sInitCount--;VerifyOrExit(sInitCount==0);#if!OPENTHREAD_RADIOotPlatCryptoRandomDeinit();#endifexit:return;}{ ... }uint32_tManager::NonCryptoGetUint32(void){OT_ASSERT(sInitCount>0);returnsPrng.GetNext();}{ ... }//-------------------------------------------------------------------// NonCryptoPrngvoidManager::NonCryptoPrng::Init(uint32_taSeed){// The PRNG has a cycle of length 1 for the below two initial// seeds. For all other seed values the cycle is ~2^31 long.if((aSeed==0)||(aSeed==0x7fffffff)){aSeed=0x1;}{...}mState=aSeed;}{ ... }uint32_tManager::NonCryptoPrng::GetNext(void){uint32_tmlcg,p,q;uint64_ttmpstate;tmpstate=static_cast<uint64_t>(33614)*static_cast<uint64_t>(mState);q=tmpstate&0xffffffff;q=q>>1;p=tmpstate>>32;mlcg=p+q;if(mlcg&0x80000000){mlcg&=0x7fffffff;mlcg++;}{...}mState=mlcg;returnmlcg;}{ ... }//-------------------------------------------------------------------namespaceNonCrypto{uint8_tGetUint8InRange(uint8_taMin,uint8_taMax){OT_ASSERT(aMax>aMin);return(aMin+(GetUint8()%(aMax-aMin)));}{ ... }uint16_tGetUint16InRange(uint16_taMin,uint16_taMax){OT_ASSERT(aMax>aMin);return(aMin+(GetUint16()%(aMax-aMin)));}{ ... }uint32_tGetUint32InRange(uint32_taMin,uint32_taMax){OT_ASSERT(aMax>aMin);return(aMin+(GetUint32()%(aMax-aMin)));}{ ... }voidFillBuffer(uint8_t*aBuffer,uint16_taSize){while(aSize--!=0){*aBuffer++=GetUint8();}{...}}{ ... }uint32_tAddJitter(uint32_taValue,uint16_taJitter){uint32_tdelay=0;VerifyOrExit(aValue!=0);aJitter=(aJitter<=aValue)?aJitter:static_cast<uint16_t>(aValue);delay=aValue+GetUint32InRange(0,2*aJitter+1)-aJitter;exit:returndelay;}{ ... }}{...}// namespace NonCrypto}{...}// namespace Random}{...}// namespace ot
Details
Show: from
Types: Columns:
All items filtered out
All items filtered out
This file uses the notable symbols shown below. Click anywhere in the file to view more details.