00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
00043
00044
00045
00046
00047
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
00066
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 );
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 );
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
00111 server[0] &= ~(CODEX_Server::ServerState::OutgoingMask);
00112 unsigned int serverNum = server[0];
00113
00114 CODEX_Quorum::Message m;
00115
00116
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
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 );
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 );
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 );
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
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
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
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 );
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
00274 server[0] &= ~(CODEX_Server::ServerState::OutgoingMask);
00275 int serverNum = server[0];
00276
00277
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 );
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 }