00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <vector>
00019
00020 #include "ShareLabelChallengeHandler.h"
00021 #include "ShareLabelChallengeEvent.h"
00022 #include "ServerState.h"
00023 #include "ShareLabelChallenge.h"
00024
00025 using namespace CODEX_Server;
00026
00027 ShareLabelChallengeHandler::ShareLabelChallengeHandler(
00028 CODEX_Events::DeadPileType& deadPile,
00029 CODEX_Events::QType& eventQueue ) :
00030 CODEX_Events::Activity( deadPile, eventQueue )
00031 {
00032 sendEvent( new ShareLabelChallengeEvent( this, this ), 0 );
00033 }
00034
00035 bool
00036 ShareLabelChallengeHandler::handler( ShareLabelChallengeEvent& event )
00037 {
00038 ServerState* serverState = ServerState::instance();
00039 if ( 0 == serverState )
00040 {
00041 return false;
00042 }
00043
00044 typedef vector< const unsigned char* > SVec;
00045
00046 SVec completed;
00047
00048
00049 ServerState::ChallengeMap::const_iterator cItr =
00050 serverState->challengeMap().begin();
00051 ServerState::ChallengeMap::const_iterator cEnd =
00052 serverState->challengeMap().end();
00053 for ( ; cItr != cEnd ; ++cItr )
00054 {
00055
00056
00057
00058
00059 ServerState::ChallengeVector::const_reverse_iterator vItr =
00060 cItr->second.rbegin();
00061 ServerState::ChallengeVector::const_reverse_iterator vEnd =
00062 cItr->second.rend();
00063 for ( ; vItr != vEnd ; ++vItr )
00064 {
00065
00066 ShareLabelChallenge* slc = *vItr;
00067 try
00068 {
00069
00070
00071
00072
00073
00074
00075
00076
00077 bool haveLabel = false;
00078
00079 try
00080 {
00081 serverState->rsaShares( slc->label(), slc->challenger() );
00082 haveLabel = true;
00083 }
00084 catch ( InvalidLabelException& )
00085 {
00086 }
00087 catch ( ... )
00088 {
00089 haveLabel = true;
00090 }
00091
00092 try
00093 {
00094 serverState->elgamalShares( slc->label(), slc->challenger() );
00095 haveLabel = true;
00096 }
00097 catch ( InvalidLabelException& )
00098 {
00099 }
00100 catch ( ... )
00101 {
00102 haveLabel = true;
00103 }
00104
00105 if ( ! haveLabel )
00106 {
00107 continue;
00108 }
00109
00110
00111
00112 sendEvent( slc->event(), event.source() );
00113
00114
00115
00116 slc->zeroData();
00117
00118
00119
00120 completed.push_back( cItr->first );
00121
00122
00123
00124 break;
00125 }
00126 catch ( ... )
00127 {
00128
00129 }
00130 }
00131
00132 }
00133
00134
00135 SVec::iterator sItr = completed.begin();
00136 SVec::iterator sEnd = completed.end();
00137 for ( ; sItr != sEnd ; ++sItr )
00138 {
00139 serverState->removeChallenge( *sItr );
00140 }
00141
00142 return false;
00143 }