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

ClientResponseSigner.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: ClientResponseSigner.cc,v 1.3 2004/05/19 15:56:51 mmarsh Exp $
00008 //
00009 // $Log: ClientResponseSigner.cc,v $
00010 // Revision 1.3  2004/05/19 15:56:51  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:31:49  mmarsh
00014 // *** empty log message ***
00015 //
00016 //
00017 
00018 #include "ClientResponseSigner.h"
00019 #include "CODEX_Server/ServerResponseEvent.h"
00020 #include "CODEX_Server/ServerState.h"
00021 #include "StateInfo.h"
00022 #include "ClientDelegation.h"
00023 
00024 #include "CODEX_Server/ServerExceptions.h"
00025 
00026 using namespace CODEX_KeyService;
00027 
00028 ClientResponseSigner::ClientResponseSigner(
00029    CODEX_Events::DeadPileType& deadPile,
00030    CODEX_Events::QType& eventQueue,
00031    CODEX_Server::ServerResponseHandler* destination ):
00032    CODEX_Events::Activity( deadPile, eventQueue ),
00033    m_destination( destination )
00034 {
00035 }
00036 
00037 ClientResponseSigner::~ClientResponseSigner()
00038 {
00039 }
00040 
00041 /*
00042 bool
00043 ClientResponseSigner::handler( CODEX_Events::CloseEvent& event )
00044 {
00045    // just acknowledge
00046    sendEvent( 0, event.source() );
00047    return true;
00048 }
00049 */
00050 
00051 bool
00052 ClientResponseSigner::handler(
00053    SupportedClientResponseEvent< BoundNameMsg, SignedCreateKeyMsg >& event )
00054 {
00055    return process( event.message().response(),
00056                    event.message().label(),
00057                    event.source(),
00058                    event );
00059 }
00060 
00061 bool
00062 ClientResponseSigner::handler(
00063    SupportedClientResponseEvent< KeyStoredMsg, SignedWriteKeyMsg >& event )
00064 {
00065    // This has to do something different, since it's not doing a threshold
00066    // signature at this point.
00067 
00068    const CODEX_Client::Message& message =
00069       event.message().response();
00070    CODEX_Events::Activity* source =
00071       event.source();
00072    const CODEX_Server::RoutingInfo& routingInfo =
00073       event;
00074 
00075 #ifdef TIMING
00076    ActiveTimer.start();
00077 #endif
00078    unsigned char* server = new unsigned char[CODEX_Server::ServerState::nSID];
00079    if ( NULL == server )
00080    {
00081 #ifdef TIMING
00082       ActiveTimer.stop();
00083 #endif
00084       return false;
00085    }
00086 
00087    StateInfo* stateInfo = StateInfo::instance();
00088    if ( NULL == stateInfo )
00089    {
00090       sendEvent( 0, source, true ); // NACK
00091 #ifdef TIMING
00092       ActiveTimer.stop();
00093 #endif
00094       return true;
00095    }
00096       
00097    CODEX_Server::ServerState* serverState =
00098       CODEX_Server::ServerState::instance();
00099    if ( NULL == serverState )
00100    {
00101       sendEvent( 0, source, true ); // NACK
00102 #ifdef TIMING
00103       ActiveTimer.stop();
00104 #endif
00105       return true;
00106    }
00107    try
00108    {
00109       memcpy( server, routingInfo.server(), CODEX_Server::ServerState::nSID );
00110       // Make sure the "outgoing" mask isn't set.
00111       server[0] &= ~(CODEX_Server::ServerState::OutgoingMask);
00112       unsigned int serverNum = server[0];
00113 
00114       CODEX_Quorum::Message m;
00115 
00116       // Fill message headers.
00117       m.fill( server, CODEX_Server::ServerState::nSID );
00118       delete [] server;
00119       m.fill( routingInfo.seqNum(), CODEX_Server::ServerState::nMID );
00120       m.fill( stateInfo->delegationDomain() );
00121       m.fill( ClientDelegation::kAcceptKeyVerification );
00122 
00123       // Sign the request.
00124       BIGNUM * digest = message.digest( serverState->hashFunc() );
00125       const CODEX_Ciphers::RSAPrivateKey& key = serverState->privateKey();
00126       CODEX_Ciphers::RSASignature* signature = key.sign( digest );
00127       BN_free(digest);
00128       if ( 0 == signature )
00129       {
00130          sendEvent( 0, source, true ); // NACK
00131 #ifdef TIMING
00132          ActiveTimer.stop();
00133 #endif
00134          return true;
00135       }
00136       int length = signature->marshal(0);
00137       unsigned char* buffer = new unsigned char[length];
00138       unsigned char* pBuffer = buffer;
00139       signature->marshal(&pBuffer);
00140       m.fill( buffer, length );
00141       delete [] buffer;
00142       delete signature;
00143 
00144       sendEvent( new CODEX_Server::ServerResponseEvent(
00145          this, m_destination, m, serverNum ),
00146                  source );
00147 #ifdef TIMING
00148       ActiveTimer.stop();
00149 #endif
00150       return true;
00151    }
00152    catch ( ... )
00153    {
00154 #ifdef TIMING
00155       ActiveTimer.stop();
00156 #endif
00157       throw;
00158    }
00159 }
00160 
00161 bool
00162 ClientResponseSigner::handler( SupportedKeyStoredEvent& event )
00163 {
00164    return process( event.message().response(),
00165                    event.message().label(),
00166                    event.source(),
00167                    event );
00168 }
00169 
00170 bool
00171 ClientResponseSigner::handler(
00172    SupportedClientResponseEvent< VerifiableBlindKeyMsg, SignedReadKeyMsg >&
00173    event )
00174 {
00175    return process( event.message().response().upcast(),
00176                    event.message().label(),
00177                    event.source(),
00178                    event );
00179 }
00180 
00181 bool
00182 ClientResponseSigner::process(
00183    const CODEX_Client::Message& message,
00184    const CODEX_Server::ServerState::LSType::LabelType& label,
00185    CODEX_Events::Activity* source,
00186    const CODEX_Server::RoutingInfo& routingInfo )
00187 {
00188 #ifdef TIMING
00189    ActiveTimer.start();
00190 #endif
00191    unsigned char* server = new unsigned char[CODEX_Server::ServerState::nSID];
00192    if ( NULL == server )
00193    {
00194 #ifdef TIMING
00195       ActiveTimer.stop();
00196 #endif
00197       return false;
00198    }
00199 
00200    StateInfo* stateInfo = StateInfo::instance();
00201    if ( NULL == stateInfo )
00202    {
00203       sendEvent( 0, source, true ); // NACK
00204 #ifdef TIMING
00205       ActiveTimer.stop();
00206 #endif
00207       return true;
00208    }
00209       
00210    CODEX_Server::ServerState* serverState =
00211       CODEX_Server::ServerState::instance();
00212    if ( NULL == serverState )
00213    {
00214       sendEvent( 0, source, true ); // NACK
00215 #ifdef TIMING
00216       ActiveTimer.stop();
00217 #endif
00218       return true;
00219    }
00220    try
00221    {
00222       memcpy( server, routingInfo.server(), CODEX_Server::ServerState::nSID );
00223       // Make sure the "outgoing" mask isn't set.
00224       server[0] &= ~(CODEX_Server::ServerState::OutgoingMask);
00225       unsigned int serverNum = server[0];
00226 
00227       const CODEX_Server::ServerState::LSType& keyShares =
00228          serverState->signatureShares( label, serverNum );
00229 
00230       CODEX_Quorum::Message m;
00231 
00232       // Fill message headers.
00233       m.fill( server, CODEX_Server::ServerState::nSID );
00234       delete [] server;
00235       m.fill( routingInfo.seqNum(), CODEX_Server::ServerState::nMID );
00236       m.fill( stateInfo->delegationDomain() );
00237       m.fill( ClientDelegation::kAcceptSignatureRequest );
00238 
00239       // Sign the request.
00240       BIGNUM * digest = message.digest( serverState->hashFunc() );
00241       const CODEX_Server::ServerState::ThresholdSignatureType&
00242          thresholdSignature = serverState->thresholdSignature();
00243       CODEX_Server::ServerState::ShareType signatures;
00244       thresholdSignature.sign( keyShares.share(), digest, signatures );
00245       BN_free(digest);
00246       if ( ! signatures.initialized() )
00247       {
00248          sendEvent( 0, source, true ); // NACK
00249 #ifdef TIMING
00250          ActiveTimer.stop();
00251 #endif
00252          return true;
00253       }
00254       int length = signatures.marshal(0);
00255       unsigned char* buffer = new unsigned char[length];
00256       unsigned char* pBuffer = buffer;
00257       signatures.marshal(&pBuffer);
00258       m.fill( buffer, length );
00259       delete [] buffer;
00260 
00261       sendEvent( new CODEX_Server::ServerResponseEvent(
00262          this, m_destination, m, serverNum ),
00263                  source );
00264 #ifdef TIMING
00265       ActiveTimer.stop();
00266 #endif
00267       return true;
00268    }
00269    catch ( CODEX_Server::InvalidLabelException& e )
00270    {
00271       CODEX_Quorum::Message m;
00272       memcpy( server, routingInfo.server(), CODEX_Server::ServerState::nSID );
00273       // Make sure the "outgoing" mask isn't set.
00274       server[0] &= ~(CODEX_Server::ServerState::OutgoingMask);
00275       int serverNum = server[0];
00276 
00277       // Fill message headers.
00278       m.fill( server, CODEX_Server::ServerState::nSID );
00279       delete [] server;
00280       m.fill( routingInfo.seqNum(), CODEX_Server::ServerState::nMID );
00281       m.fill( stateInfo->delegationDomain() );
00282       m.fill( ClientDelegation::kBadShareLabel );
00283       const CODEX_Server::ServerState::LSType::LabelType& label =
00284          serverState->defaultSignatureLabel();
00285       int length = label.marshal(0);
00286       unsigned char* buffer = new unsigned char[length];
00287       unsigned char* pBuffer = buffer;
00288       label.marshal(&pBuffer);
00289       m.fill( buffer, length );
00290       delete [] buffer;
00291 
00292       sendEvent( new CODEX_Server::ServerResponseEvent(
00293          this, m_destination, m, serverNum ),
00294                  source );
00295 #ifdef TIMING
00296       ActiveTimer.stop();
00297 #endif
00298       return true;
00299    }
00300    catch ( CODEX_Server::KeySharesNotFoundException& )
00301    {
00302       sendEvent( 0, source, true ); // NACK
00303 #ifdef TIMING
00304       ActiveTimer.stop();
00305 #endif
00306       return true;
00307    }
00308    catch ( ... )
00309    {
00310 #ifdef TIMING
00311       ActiveTimer.stop();
00312 #endif
00313       throw;
00314    }
00315 }

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