crypto/weakcrypto/source/random/randsvr.cpp
author hgs
Thu, 24 Jun 2010 15:39:07 +0530
changeset 72 de46a57f75fb
permissions -rw-r--r--
201023_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     1
/*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     3
* All rights reserved.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     8
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    11
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    12
* Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    13
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    14
* Description: 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    15
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    16
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    17
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    18
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    19
/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    20
 @file
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    21
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    22
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    23
#include "randsvr.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    24
#include "randcliserv.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    25
#include <e32math.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    26
#include "randsvrimpl.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    27
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    28
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    29
//const TInt KFastTickTimer=1000000;			// These are testing numbers!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    30
//const TInt KSlowTickTimer=30000000;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    31
const TInt KThreshold=1024;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    32
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    33
const TInt KFastTickTimer=30000000;			// These are the real numbers!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    34
const TInt KSlowTickTimer=0x7fffffff;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    35
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    36
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    37
void SignalClient()
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    38
//
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    39
// Signal the owning thread that the server has started successfully
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    40
// This may itself fail
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    41
//
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    42
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    43
	RProcess::Rendezvous(KErrNone);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    44
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    45
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    46
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    47
EXPORT_C TInt RunRandomServer(TAny* /*aUnused*/)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    48
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    49
	CTrapCleanup* cleanup=CTrapCleanup::New();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    50
	if (!cleanup)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    51
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    52
		return KErrNoMemory;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    53
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    54
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    55
	TInt ret = User::RenameThread(KRandomServerName);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    56
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    57
	__ASSERT_ALWAYS(ret==KErrNone,User::Panic(KRandomServerName,KErrServerTerminated));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    58
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    59
	if (CRandomScheduler::New())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    60
		return KErrNoMemory;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    61
	ret = CRandomServer::New();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    62
	if (ret != KErrNone )
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    63
		return ret;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    64
	// Initialisation complete, now signal the client
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    65
	SignalClient();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    66
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    67
	CRandomScheduler::Start();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    68
	delete cleanup;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    69
	return KErrNone;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    70
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    71
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    72
TBool CRandomScheduler::New(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    73
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    74
	CRandomScheduler* rs;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    75
	rs=new CRandomScheduler;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    76
	CRandomScheduler::Install(rs);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    77
	return (rs == NULL);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    78
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    79
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    80
void CRandomScheduler::Error(TInt /*aError*/) const 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    81
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    82
	User::Panic(KRandomServerName, 3);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    83
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    84
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    85
CRandomServer::CRandomServer(void) : CServer2(EPriorityLow)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    86
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    87
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    88
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    89
CRandomServer::~CRandomServer(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    90
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    91
	// This should never happen....but in case it does:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    92
	delete iHash;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    93
	delete iTicker;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    94
	delete iPool;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    95
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    96
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    97
TInt CRandomServer::New(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    98
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    99
	CRandomServer* self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   100
	self=new CRandomServer;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   101
	if (!self)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   102
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   103
		return KErrNoMemory;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   104
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   105
	TRAPD(ret,self->ConstructL());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   106
	if (ret)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   107
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   108
		return ret;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   109
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   110
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   111
	return self->Start(KRandomServerName);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   112
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   113
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   114
void CRandomServer::ConstructL(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   115
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   116
	iPool=new (ELeave) TUint8[KRandomPoolSize];
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   117
	iHash=CSHA1::NewL();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   118
	iPoolIn=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   119
	iPoolOut=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   120
	iTicker=CPeriodic::NewL(EPriorityLow);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   121
	TCallBack callback(Tick,this);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   122
	iTicker->Start(KFastTickTimer,KFastTickTimer,callback);		// **** these figures might need tweaking!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   123
	iQuality=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   124
	iFast=ETrue;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   125
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   126
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   127
TInt CRandomServer::Tick(TAny* aServer)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   128
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   129
	CRandomServer* svr=(CRandomServer*)aServer;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   130
	svr->Stir();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   131
	svr->iQuality+=30;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   132
	if (svr->iFast)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   133
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   134
		if (svr->iQuality>KThreshold)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   135
			{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   136
			TCallBack callback(Tick,svr);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   137
			svr->iTicker->Cancel();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   138
			svr->iTicker->Start(KSlowTickTimer,KSlowTickTimer,callback);		// **** these figures might need tweaking!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   139
			svr->iFast=EFalse;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   140
			}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   141
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   142
	if (svr->iQuality>(KRandomPoolSize<<3))
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   143
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   144
		svr->iQuality=(KRandomPoolSize<<3);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   145
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   146
	return ETrue;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   147
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   148
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   149
CSession2* CRandomServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   150
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   151
	return CRandomSession::NewL(const_cast<CRandomServer*>(this));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   152
	//CRandomSession::NewL(CONST_CAST(CRandomServer*,this),Message().Client());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   153
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   154
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   155
TPtrC8 CRandomServer::GetRandom(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   156
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   157
	TPtr8 res(&iPool[iPoolOut],iHash->HashSize(),iHash->HashSize());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   158
	iPoolOut+=iHash->HashSize();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   159
	if ((iPoolOut+iHash->HashSize())>KRandomPoolSize)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   160
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   161
		iPoolOut=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   162
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   163
	return iHash->Hash(res);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   164
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   165
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   166
CMessageDigest* CRandomServer::Hash(void) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   167
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   168
	return iHash;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   169
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   170
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   171
void CRandomServer::Stir(void) 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   172
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   173
	TInt rnd;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   174
	rnd=Math::Random();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   175
	TPtrC8 r((TUint8*)&rnd,sizeof(TInt));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   176
	iHash->Hash(r);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   177
	TPtr8 dest(&iPool[iPoolIn],iHash->HashSize());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   178
	dest.Copy(iHash->Hash(dest));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   179
	iPoolIn+=iHash->HashSize();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   180
	if ((iPoolIn+iHash->HashSize())>KRandomPoolSize)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   181
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   182
		iPoolIn=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   183
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   184
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   185
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   186
CRandomSession* CRandomSession::NewL(CRandomServer* aServer)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   187
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   188
	CRandomSession* self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   189
	self=new (ELeave) CRandomSession(aServer);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   190
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   191
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   192
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   193
CRandomSession::CRandomSession(CRandomServer* aServer) : CSession2(), iServer(aServer)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   194
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   195
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   196
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   197
CRandomSession::~CRandomSession(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   198
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   199
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   200
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   201
void CRandomSession::ServiceL(const RMessage2& aMessage)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   202
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   203
	switch (aMessage.Function())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   204
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   205
	case KRandomRequest:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   206
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   207
		TInt ret = FillBuffer(aMessage);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   208
		aMessage.Complete(ret);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   209
		break;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   210
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   211
	default:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   212
		aMessage.Complete(KErrNotSupported);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   213
		break;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   214
		};
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   215
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   216
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   217
TInt CRandomSession::FillBuffer(const RMessage2& aMessage)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   218
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   219
	TInt length = aMessage.Int1();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   220
	if (length < 0 || length > KRandomBlockSize)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   221
		return KErrArgument;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   222
	iServer->iQuality -= length;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   223
	if (iServer->iQuality<0)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   224
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   225
		iServer->iQuality=0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   226
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   227
	if (!iServer->iFast)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   228
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   229
		if (iServer->iQuality<KThreshold)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   230
			{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   231
			TCallBack callback(CRandomServer::Tick,iServer);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   232
			iServer->iTicker->Cancel();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   233
			iServer->iTicker->Start(KFastTickTimer,KFastTickTimer,callback);		// **** these figures might need tweaking!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   234
			iServer->iFast=ETrue;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   235
			}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   236
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   237
	TBuf8<KRandomBlockSize> buf(0);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   238
	iServer->Stir();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   239
	TInt i;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   240
	TInt hashsize=iServer->Hash()->HashSize();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   241
	for (i=0; i+hashsize < length; i+=hashsize)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   242
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   243
		buf.Append(iServer->GetRandom());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   244
		iServer->Stir();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   245
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   246
	TPtrC8 ptr(iServer->GetRandom().Ptr(), length-i);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   247
	buf.Append(ptr);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   248
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   249
	TRAPD(ret, aMessage.WriteL(0, buf));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   250
	return ret;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   251
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   252
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   253
GLDEF_C TInt E32Main(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   254
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   255
	return RunRandomServer(NULL);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   256
	}