00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "DelegateRequestDistributor.h"
00023 #include "CODEX_Server/BroadcastRequestEvent.h"
00024 #include "ClientResponseEvent.h"
00025 #include "ClientActivity.h"
00026 #include "LabeledReadKeyMsg.h"
00027 #include "CODEX_Server/ServerState.h"
00028 #include "StateInfo.h"
00029
00030 #include "ClientCreateCallback.h"
00031 #include "ClientWriteCallback.h"
00032 #include "ClientReadCallback.h"
00033
00034 #include "timing.h"
00035
00036 using namespace CODEX_KeyService;
00037
00038 DelegateRequestDistributor::DelegateRequestDistributor(
00039 CODEX_Events::DeadPileType& deadPile,
00040 CODEX_Events::QType& eventQueue,
00041 CODEX_Server::BroadcastRequestHandler* destination,
00042 CODEX_Server::SignRequestHandler* srHandler ) :
00043 CODEX_Events::Activity( deadPile, eventQueue ),
00044 m_destination( destination ),
00045 m_srHandler( srHandler )
00046 {
00047 }
00048
00049 bool
00050 DelegateRequestDistributor::handler( CODEX_Events::CloseEvent& event )
00051 {
00052
00053 sendEvent( 0, event.source() );
00054 return true;
00055 }
00056
00057 bool
00058 DelegateRequestDistributor::handler(
00059 ClientMessageEvent< RequestKeyMsg >& event )
00060 {
00061
00062 CODEX_Server::ServerState* serverState =
00063 CODEX_Server::ServerState::instance();
00064 StateInfo* stateInfo = StateInfo::instance();
00065 if ( ( NULL != serverState ) &&
00066 ( NULL != stateInfo ) )
00067 {
00068 const CODEX_Server::SignedAugmentedEGPublicKey& pkMsg =
00069 serverState->signedEGKey();
00070 if ( pkMsg.initialized() )
00071 {
00072 ClientActivity* ca = stateInfo->getClient( event.source() );
00073 if ( NULL != ca )
00074 {
00075 typedef
00076 ClientResponseEvent< CODEX_Server::SignedAugmentedEGPublicKey >
00077 EvtType;
00078 EvtType* outEvt = new EvtType(this,ca,pkMsg);
00079 sendEvent( outEvt, event.source() );
00080 return true;
00081 }
00082 }
00083 }
00084 sendEvent( 0, event.source() );
00085 return true;
00086 }
00087
00088 bool
00089 DelegateRequestDistributor::handler(
00090 ClientMessageEvent< SignedCreateKeyMsg >& event )
00091 {
00092 #ifdef TIMING
00093 ActiveTimer.start();
00094 #endif
00095 CODEX_Server::ServerState* serverState =
00096 CODEX_Server::ServerState::instance();
00097 if ( NULL == serverState )
00098 {
00099 sendEvent( 0, event.source(), true );
00100 #ifdef TIMING
00101 ActiveTimer.stop();
00102 #endif
00103 return true;
00104 }
00105
00106 StateInfo* stateInfo = StateInfo::instance();
00107 if ( NULL == stateInfo )
00108 {
00109 sendEvent( 0, event.source(), true );
00110 #ifdef TIMING
00111 ActiveTimer.stop();
00112 #endif
00113 return true;
00114 }
00115
00116 ClientActivity* ca = stateInfo->getClient( event.source() );
00117 if ( NULL == ca )
00118 {
00119 sendEvent( 0, event.source(), true );
00120 #ifdef TIMING
00121 ActiveTimer.stop();
00122 #endif
00123 return true;
00124 }
00125 const unsigned char* seqNum = serverState->newSequenceNumber();
00126 stateInfo->registerSequenceNumber( seqNum, ca );
00127 ClientCreateCallback* cb = new ClientCreateCallback( m_deadPile,
00128 m_queue,
00129 m_srHandler,
00130 ca,
00131 event.message(),
00132 seqNum );
00133 CODEX_Quorum::Message message;
00134
00135
00136 unsigned char self = serverState->hostNum();
00137 message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00138
00139
00140 message.fill( seqNum, CODEX_Server::ServerState::nMID );
00141
00142
00143 message.fill( stateInfo->messageDomain() );
00144
00145
00146 message.fill( CODEX_Client::kCreateKeyMsg | CODEX_Client::SignatureMask );
00147
00148
00149 int length = event.message().marshal(0);
00150 unsigned char* buffer = new unsigned char[length];
00151 unsigned char* pBuffer = buffer;
00152 event.message().marshal(&pBuffer);
00153 message.fill( buffer, length );
00154 delete [] buffer;
00155
00156
00157 CODEX_Server::BroadcastRequestEvent* evt =
00158 new CODEX_Server::BroadcastRequestEvent( this,
00159 m_destination,
00160 message,
00161 cb );
00162 sendEvent( evt, event.source() );
00163 #ifdef TIMING
00164 ActiveTimer.stop();
00165 #endif
00166 return true;
00167 }
00168
00169 bool
00170 DelegateRequestDistributor::handler(
00171 ClientMessageEvent< SignedWriteKeyMsg >& event )
00172 {
00173 #ifdef TIMING
00174 ActiveTimer.start();
00175 #endif
00176 CODEX_Server::ServerState* serverState =
00177 CODEX_Server::ServerState::instance();
00178 if ( NULL == serverState )
00179 {
00180 sendEvent( 0, event.source(), true );
00181 #ifdef TIMING
00182 ActiveTimer.stop();
00183 #endif
00184 return true;
00185 }
00186
00187 StateInfo* stateInfo = StateInfo::instance();
00188 if ( NULL == stateInfo )
00189 {
00190 sendEvent( 0, event.source(), true );
00191 #ifdef TIMING
00192 ActiveTimer.stop();
00193 #endif
00194 return true;
00195 }
00196
00197 ClientActivity* ca = stateInfo->getClient( event.source() );
00198 if ( NULL == ca )
00199 {
00200 sendEvent( 0, event.source(), true );
00201 #ifdef TIMING
00202 ActiveTimer.stop();
00203 #endif
00204 return true;
00205 }
00206 const unsigned char* seqNum = serverState->newSequenceNumber();
00207 stateInfo->registerSequenceNumber( seqNum, ca );
00208 ClientWriteCallback* cb = new ClientWriteCallback( m_deadPile,
00209 m_queue,
00210 m_srHandler,
00211 ca,
00212 event.message(),
00213 seqNum );
00214 CODEX_Quorum::Message message;
00215
00216
00217 unsigned char self = serverState->hostNum();
00218 message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00219
00220
00221 message.fill( seqNum, CODEX_Server::ServerState::nMID );
00222
00223
00224 message.fill( stateInfo->messageDomain() );
00225
00226
00227 message.fill( CODEX_Client::kWriteKeyMsg | CODEX_Client::SignatureMask );
00228
00229
00230 int length = event.message().marshal(0);
00231 unsigned char* buffer = new unsigned char[length];
00232 unsigned char* pBuffer = buffer;
00233 event.message().marshal(&pBuffer);
00234 message.fill( buffer, length );
00235 delete [] buffer;
00236
00237
00238 CODEX_Server::BroadcastRequestEvent* evt =
00239 new CODEX_Server::BroadcastRequestEvent( this,
00240 m_destination,
00241 message,
00242 cb );
00243 sendEvent( evt, event.source() );
00244 #ifdef TIMING
00245 ActiveTimer.stop();
00246 #endif
00247 return true;
00248 }
00249
00250 bool
00251 DelegateRequestDistributor::handler(
00252 ClientMessageEvent< SignedReadKeyMsg >& event )
00253 {
00254 #ifdef TIMING
00255 ActiveTimer.start();
00256 #endif
00257 CODEX_Server::ServerState* serverState =
00258 CODEX_Server::ServerState::instance();
00259 if ( NULL == serverState )
00260 {
00261 sendEvent( 0, event.source(), true );
00262 #ifdef TIMING
00263 ActiveTimer.stop();
00264 #endif
00265 return true;
00266 }
00267
00268 StateInfo* stateInfo = StateInfo::instance();
00269 if ( NULL == stateInfo )
00270 {
00271 sendEvent( 0, event.source(), true );
00272 #ifdef TIMING
00273 ActiveTimer.stop();
00274 #endif
00275 return true;
00276 }
00277
00278 ClientActivity* ca = stateInfo->getClient( event.source() );
00279 if ( NULL == ca )
00280 {
00281 sendEvent( 0, event.source(), true );
00282 #ifdef TIMING
00283 ActiveTimer.stop();
00284 #endif
00285 return true;
00286 }
00287 const unsigned char* seqNum = serverState->newSequenceNumber();
00288 stateInfo->registerSequenceNumber( seqNum, ca );
00289 const StateInfo::LSType::LabelType& label =
00290 stateInfo->defaultDecryptionLabel();
00291 LabeledReadKeyMsg rkm( event.message(), label );
00292 ClientReadCallback* cb = new ClientReadCallback( m_deadPile,
00293 m_queue,
00294 m_srHandler,
00295 ca,
00296 rkm,
00297 seqNum,
00298 m_destination );
00299 CODEX_Quorum::Message message;
00300
00301
00302 unsigned char self = serverState->hostNum();
00303 message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00304
00305
00306 message.fill( seqNum, CODEX_Server::ServerState::nMID );
00307
00308
00309 message.fill( stateInfo->messageDomain() );
00310
00311
00312 message.fill( CODEX_Client::kReadKeyMsg | CODEX_Client::SignatureMask );
00313
00314
00315 int length = rkm.marshal(0);
00316 unsigned char* buffer = new unsigned char[length];
00317 unsigned char* pBuffer = buffer;
00318 rkm.marshal(&pBuffer);
00319 message.fill( buffer, length );
00320 delete [] buffer;
00321
00322
00323 CODEX_Server::BroadcastRequestEvent* evt =
00324 new CODEX_Server::BroadcastRequestEvent( this,
00325 m_destination,
00326 message,
00327 cb );
00328 sendEvent( evt, event.source() );
00329 #ifdef TIMING
00330 ActiveTimer.stop();
00331 #endif
00332 return true;
00333 }