Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

DelegateRequestDistributor.cc

00001 /*
00002  * Copyright 2003 Michael A. Marsh, Cornell University. All rights reserved.
00003  * This software is released under the modified BSD license.
00004  * See the file LICENSE in the top-level directory for details.
00005  */
00006 //
00007 // $Id: DelegateRequestDistributor.cc,v 1.3 2004/05/19 15:56:52 mmarsh Exp $
00008 //
00009 // $Log: DelegateRequestDistributor.cc,v $
00010 // Revision 1.3  2004/05/19 15:56:52  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:15:00  mmarsh
00014 // General code cleanup and reorganization.  The signed ElGamal public key
00015 // was moved to CODEX_Server, decoupling that package from CODEX_Client.
00016 // Since CODEX_Server no longer knows about the cryptosystem used by
00017 // the client, switching between cryptosystems is handled locally by
00018 // CODEX_KeyService.
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    // We only consume close events.
00053    sendEvent( 0, event.source() );
00054    return true;
00055 }
00056 
00057 bool
00058 DelegateRequestDistributor::handler(
00059    ClientMessageEvent< RequestKeyMsg >& event )
00060 {
00061    // We should be able to handle this message here.
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 ); // NACK
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 ); // NACK
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 ); // NACK
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    // Set the server ID, with "outgoing" mask.
00136    unsigned char self = serverState->hostNum();
00137    message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00138 
00139    // Set the unique request ID.
00140    message.fill( seqNum, CODEX_Server::ServerState::nMID );
00141 
00142    // Set the message domain.
00143    message.fill( stateInfo->messageDomain() );
00144 
00145    // Set the message type.
00146    message.fill( CODEX_Client::kCreateKeyMsg | CODEX_Client::SignatureMask );
00147 
00148    // Marshal the request.
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    // Create the outgoing event.
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 ); // NACK
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 ); // NACK
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 ); // NACK
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    // Set the server ID, with "outgoing" mask.
00217    unsigned char self = serverState->hostNum();
00218    message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00219 
00220    // Set the unique request ID.
00221    message.fill( seqNum, CODEX_Server::ServerState::nMID );
00222 
00223    // Set the message domain.
00224    message.fill( stateInfo->messageDomain() );
00225 
00226    // Set the message type.
00227    message.fill( CODEX_Client::kWriteKeyMsg | CODEX_Client::SignatureMask );
00228 
00229    // Marshal the request.
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    // Create the outgoing event.
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 ); // NACK
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 ); // NACK
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 ); // NACK
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    // Set the server ID, with "outgoing" mask.
00302    unsigned char self = serverState->hostNum();
00303    message.fill( self | CODEX_Server::ServerState::OutgoingMask );
00304 
00305    // Set the unique request ID.
00306    message.fill( seqNum, CODEX_Server::ServerState::nMID );
00307 
00308    // Set the message domain.
00309    message.fill( stateInfo->messageDomain() );
00310 
00311    // Set the message type.
00312    message.fill( CODEX_Client::kReadKeyMsg | CODEX_Client::SignatureMask );
00313 
00314    // Marshal the request.
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    // Create the outgoing event.
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 }

Generated on Fri May 6 17:39:03 2005 for COrnell Data EXchange (CODEX) by  doxygen 1.4.1