|
Mixe for Privacy and Anonymity in the Internet
|
00001 #include "StdAfx.h" 00002 #ifndef ONLY_LOCAL_PROXY 00003 #include "CAMiddleMixChannelList.hpp" 00004 #include "CAUtil.hpp" 00005 00006 00007 CAMiddleMixChannelList::~CAMiddleMixChannelList() 00008 { 00009 m_Mutex.lock(); 00010 for(UINT32 i=0;i<0x10000;i++) 00011 { 00012 mmChannelListEntry* pEntry=m_pHashTableIn[i]; 00013 mmChannelListEntry* pTmpEntry; 00014 while(pEntry!=NULL) 00015 { 00016 pTmpEntry=pEntry; 00017 pEntry=pEntry->list_HashTableIn.next; 00018 delete pTmpEntry->pCipher; 00019 pTmpEntry->pCipher = NULL; 00020 delete pTmpEntry; 00021 pTmpEntry = NULL; 00022 } 00023 } 00024 delete m_pHashTableIn; 00025 m_pHashTableIn = NULL; 00026 delete m_pHashTableOut; 00027 m_pHashTableOut = NULL; 00028 m_Mutex.unlock(); 00029 } 00030 00038 SINT32 CAMiddleMixChannelList::add(HCHANNEL channelIn,CASymCipher* pCipher,HCHANNEL* channelOut) 00039 { 00040 m_Mutex.lock(); 00041 mmChannelListEntry* pEntry=new mmChannelListEntry; 00042 pEntry->pCipher=pCipher; 00043 pEntry->channelIn=channelIn; 00044 pEntry->list_HashTableIn.prev=NULL; 00045 pEntry->list_HashTableOut.prev=NULL; 00046 do 00047 { 00048 getRandom(channelOut); 00049 }while(*channelOut<256||getOutToIn_intern_without_lock(NULL,*channelOut,NULL)==E_SUCCESS); 00050 pEntry->channelOut=*channelOut; 00051 00052 mmChannelListEntry* pTmpEntry=m_pHashTableIn[channelIn&0x0000FFFF]; 00053 pEntry->list_HashTableIn.next=pTmpEntry; 00054 if(pTmpEntry!=NULL) 00055 pTmpEntry->list_HashTableIn.prev=pEntry; 00056 m_pHashTableIn[channelIn&0x0000FFFF]=pEntry; 00057 00058 pTmpEntry=m_pHashTableOut[(*channelOut)&0x0000FFFF]; 00059 pEntry->list_HashTableOut.next=pTmpEntry; 00060 if(pTmpEntry!=NULL) 00061 pTmpEntry->list_HashTableOut.prev=pEntry; 00062 m_pHashTableOut[(*channelOut)&0x0000FFFF]=pEntry; 00063 00064 m_Mutex.unlock(); 00065 return E_SUCCESS; 00066 } 00067 00068 SINT32 CAMiddleMixChannelList::getInToOut(HCHANNEL channelIn, HCHANNEL* channelOut,CASymCipher** ppCipher) 00069 { 00070 m_Mutex.lock(); 00071 mmChannelListEntry* pEntry=m_pHashTableIn[channelIn&0x0000FFFF]; 00072 while(pEntry!=NULL) 00073 { 00074 if(pEntry->channelIn==channelIn) 00075 { 00076 if(channelOut!=NULL) 00077 *channelOut=pEntry->channelOut; 00078 if(ppCipher!=NULL) 00079 { 00080 *ppCipher=pEntry->pCipher; 00081 (*ppCipher)->lock(); 00082 } 00083 m_Mutex.unlock(); 00084 return E_SUCCESS; 00085 } 00086 pEntry=pEntry->list_HashTableIn.next; 00087 } 00088 m_Mutex.unlock(); 00089 return E_UNKNOWN; 00090 } 00091 00097 SINT32 CAMiddleMixChannelList::remove(HCHANNEL channelIn) 00098 { 00099 m_Mutex.lock(); 00100 mmChannelListEntry* pEntry=m_pHashTableIn[channelIn&0x0000FFFF]; 00101 while(pEntry!=NULL) 00102 { 00103 if(pEntry->channelIn==channelIn) 00104 { 00105 delete pEntry->pCipher; 00106 pEntry->pCipher = NULL; 00107 if(pEntry->list_HashTableIn.prev==NULL) 00108 { 00109 if(pEntry->list_HashTableIn.next==NULL) 00110 { 00111 m_pHashTableIn[channelIn&0x0000FFFF]=NULL; 00112 } 00113 else 00114 { 00115 m_pHashTableIn[channelIn&0x0000FFFF]=pEntry->list_HashTableIn.next; 00116 pEntry->list_HashTableIn.next->list_HashTableIn.prev=NULL; 00117 } 00118 } 00119 else 00120 { 00121 if(pEntry->list_HashTableIn.next==NULL) 00122 { 00123 pEntry->list_HashTableIn.prev->list_HashTableIn.next=NULL; 00124 } 00125 else 00126 { 00127 pEntry->list_HashTableIn.prev->list_HashTableIn.next=pEntry->list_HashTableIn.next; 00128 pEntry->list_HashTableIn.next->list_HashTableIn.prev=pEntry->list_HashTableIn.prev; 00129 } 00130 } 00131 if(pEntry->list_HashTableOut.prev==NULL) 00132 { 00133 if(pEntry->list_HashTableOut.next==NULL) 00134 { 00135 m_pHashTableOut[pEntry->channelOut&0x0000FFFF]=NULL; 00136 } 00137 else 00138 { 00139 m_pHashTableOut[pEntry->channelOut&0x0000FFFF]=pEntry->list_HashTableOut.next; 00140 pEntry->list_HashTableOut.next->list_HashTableOut.prev=NULL; 00141 } 00142 } 00143 else 00144 { 00145 if(pEntry->list_HashTableOut.next==NULL) 00146 { 00147 pEntry->list_HashTableOut.prev->list_HashTableOut.next=NULL; 00148 } 00149 else 00150 { 00151 pEntry->list_HashTableOut.prev->list_HashTableOut.next=pEntry->list_HashTableOut.next; 00152 pEntry->list_HashTableOut.next->list_HashTableOut.prev=pEntry->list_HashTableOut.prev; 00153 } 00154 } 00155 delete pEntry; 00156 pEntry = NULL; 00157 m_Mutex.unlock(); 00158 return E_SUCCESS; 00159 } 00160 pEntry=pEntry->list_HashTableIn.next; 00161 } 00162 m_Mutex.unlock(); 00163 return E_UNKNOWN; 00164 } 00165 00166 SINT32 CAMiddleMixChannelList::test() 00167 { 00168 CAMiddleMixChannelList oList; 00169 UINT32 c; 00170 UINT32 d; 00171 UINT32 rand; 00172 int i,j; 00173 for(i=0;i<1000;i++) 00174 { 00175 getRandom(&c); 00176 oList.add(c,NULL,&d); 00177 } 00178 for(i=0;i<100;i++) 00179 { 00180 getRandom(&rand); 00181 if(rand<0x0FFFFFFF) 00182 for(j=0;j<5;j++) 00183 { 00184 getRandom(&c); 00185 oList.add(c,NULL,&d); 00186 } 00187 getRandom(&rand); 00188 if(rand<0x7FFFFFFF) 00189 for(int j=0;j<100000;j++) 00190 { 00191 getRandom(&c); 00192 oList.remove(c); 00193 } 00194 } 00195 return 0; 00196 } 00197 #endif //ONLY_LOCAL_PROXY
1.7.6.1