Mixe for Privacy and Anonymity in the Internet
CAMiddleMixChannelList.cpp
Go to the documentation of this file.
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