00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <lib/crypto/bcipherbase.h>
00018 #include <lib/crypto/blowfishcipher.h>
00019 #include <lib/crypto/twofishcipher.h>
00020
00021 #include <lib/crypto/shashbase.h>
00022 #include <lib/crypto/rmd160hash.h>
00023 #include <lib/crypto/sha0hash.h>
00024 #include <lib/crypto/sha1hash.h>
00025 #include <lib/crypto/crc32hash.h>
00026
00027 #include <lib/crypto/base64.h>
00028
00029 #include <lib/htime.h>
00030
00031 #include <stdio.h>
00032 #include <string.h>
00033
00034
00035 static void FillRandom(char *_dest,size_t len)
00036 {
00037 if(!len) return;
00038
00039 unsigned char *dest=(unsigned char *)_dest;
00040 unsigned char *destend=dest+len;
00041 for(;;)
00042 {
00043 unsigned int r=random();
00044 for(int _j=0; _j<4; _j++)
00045 {
00046 *(dest++)=(unsigned char)(r & 0xffU);
00047 if(dest>=destend) return;
00048 r>>=8;
00049 }
00050 }
00051 }
00052
00053
00054
00055 struct BlowfishTEST
00056 {
00057 char *key;
00058 char *txt;
00059 char *res;
00060 } blowfish_tst[]=
00061 {
00062
00063
00064 { "0000000000000000","0000000000000000","4EF997456198DD78" },
00065 { "FFFFFFFFFFFFFFFF","FFFFFFFFFFFFFFFF","51866FD5B85ECB8A" },
00066 { "3000000000000000","1000000000000001","7D856F9A613063F2" },
00067 { "1111111111111111","1111111111111111","2466DD878B963C9D" },
00068 { "0123456789ABCDEF","1111111111111111","61F9C3802281B096" },
00069 { "1111111111111111","0123456789ABCDEF","7D0CC630AFDA1EC7" },
00070 { "0000000000000000","0000000000000000","4EF997456198DD78" },
00071 { "FEDCBA9876543210","0123456789ABCDEF","0ACEAB0FC6A0A28D" },
00072 { "7CA110454A1A6E57","01A1D6D039776742","59C68245EB05282B" },
00073 { "0131D9619DC1376E","5CD54CA83DEF57DA","B1B8CC0B250F09A0" },
00074 { "07A1133E4A0B2686","0248D43806F67172","1730E5778BEA1DA4" },
00075 { "3849674C2602319E","51454B582DDF440A","A25E7856CF2651EB" },
00076 { "04B915BA43FEB5B6","42FD443059577FA2","353882B109CE8F1A" },
00077 { "0113B970FD34F2CE","059B5E0851CF143A","48F4D0884C379918" },
00078 { "0170F175468FB5E6","0756D8E0774761D2","432193B78951FC98" },
00079 { "43297FAD38E373FE","762514B829BF486A","13F04154D69D1AE5" },
00080 { "07A7137045DA2A16","3BDD119049372802","2EEDDA93FFD39C79" },
00081 { "04689104C2FD3B2F","26955F6835AF609A","D887E0393C2DA6E3" },
00082 { "37D06BB516CB7546","164D5E404F275232","5F99D04F5B163969" },
00083 { "1F08260D1AC2465E","6B056E18759F5CCA","4A057A3B24D3977B" },
00084 { "584023641ABA6176","004BD6EF09176062","452031C1E4FADA8E" },
00085 { "025816164629B007","480D39006EE762F2","7555AE39F59B87BD" },
00086 { "49793EBC79B3258F","437540C8698F3CFA","53C55F9CB49FC019" },
00087 { "4FB05E1515AB73A7","072D43A077075292","7A8E7BFA937E89A3" },
00088 { "49E95D6D4CA229BF","02FE55778117F12A","CF9C5D7A4986ADB5" },
00089 { "018310DC409B26D6","1D9D5C5018F728C2","D1ABB290658BC778" },
00090 { "1C587F1C13924FEF","305532286D6F295A","55CB3774D13EF201" },
00091 { "0101010101010101","0123456789ABCDEF","FA34EC4847B268B2" },
00092 { "1F1F1F1F0E0E0E0E","0123456789ABCDEF","A790795108EA3CAE" },
00093 { "E0FEE0FEF1FEF1FE","0123456789ABCDEF","C39E072D9FAC631D" },
00094 { "0000000000000000","FFFFFFFFFFFFFFFF","014933E0CDAFF6E4" },
00095 { "FFFFFFFFFFFFFFFF","0000000000000000","F21E9A77B71C49BC" },
00096 { "0123456789ABCDEF","0000000000000000","245946885754369A" },
00097 { "FEDCBA9876543210","FFFFFFFFFFFFFFFF","6B5C5A9C5D9E0A5A" },
00098
00099
00100 { "F0E1D2C3B4A59687", "FEDCBA9876543210","E87A244E2CC85E82" },
00101 { "F0E1D2C3B4A5968778695A4B3C2D1E0F", "FEDCBA9876543210","93142887EE3BE15C" },
00102 { "F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344556677","FEDCBA9876543210","05044B62FA52D080" },
00103
00104 { NULL, NULL, NULL }
00105 };
00106
00107
00108 static int test_blowfish(struct BlowfishTEST *tst,BlowFishCipher *bfc,int *ntests)
00109 {
00110 int failed=0;
00111 for(int t=0; tst[t].key; t++)
00112 {
00113 char *hexkey=tst[t].key;
00114 int keylen=strlen(hexkey)/2;
00115 unsigned char key[keylen];
00116 for(int i=0; i<keylen; i++)
00117 {
00118 unsigned int val;
00119 sscanf(&hexkey[i+i],"%02x",&val);
00120 key[i]=(unsigned char)val;
00121 }
00122 if(bfc->SetKey((char*)key,keylen))
00123 { ++failed; }
00124 char ibuf[8],buf[8];
00125 char *hextxt=tst[t].txt;
00126 for(int i=0; i<8; i++)
00127 {
00128 unsigned int val;
00129 sscanf(&hextxt[i+i],"%02x",&val);
00130 ibuf[i]=(unsigned char)val;
00131 }
00132 bfc->EncryptBlock(ibuf,buf);
00133 char res[32+1];
00134 for(int i=0; i<8; i++)
00135 {
00136 unsigned int val=*((unsigned char*)(buf+i));
00137 sprintf(res+i*2,"%02X",val);
00138 }
00139 if(strlen(res)!=16 || strcmp(res,tst[t].res))
00140 { ++failed; }
00141 bfc->DecryptBlock(buf,buf);
00142 if(memcmp(buf,ibuf,8))
00143 { ++failed; }
00144 ++(*ntests);
00145 }
00146 return(failed);
00147 }
00148
00149 static int do_test_blowfish()
00150 {
00151 BlowFishCipher bfc;
00152 int ntests=0;
00153
00154 fprintf(stderr,"Testing blowfish... ");
00155 int fail=test_blowfish(blowfish_tst,&bfc,&ntests);
00156 if(fail) fprintf(stderr,"*** FAILED; %d ERRORS!\n",fail);
00157 else fprintf(stderr,"passed (%d)\n",ntests);
00158
00159 return(fail ? 1 : 0);
00160 }
00161
00162
00163 struct TwofishTEST
00164 {
00165 char *key;
00166 char *res;
00167 } twofish_tst16[]=
00168 {
00169 { "80000000000000000000000000000000","6BFD32804A1C3206C4BF85EB11241F89" },
00170 { "40000000000000000000000000000000","F097147AE851845984DC97D5FAE40CF9" },
00171 { "20000000000000000000000000000000","6117F1977C5ABD9647C56544D9458444" },
00172 { "10000000000000000000000000000000","75A6240AAE357DEDDF99936705618284" },
00173 { "08000000000000000000000000000000","F026BFDF6BFBC7E50C46C533BD271C24" },
00174 { "04000000000000000000000000000000","F3023228D77045D37D1B9CD77437395A" },
00175 { "02000000000000000000000000000000","F67467BF6B490209809714D50679B2D7" },
00176 { "01000000000000000000000000000000","2C8431B922C5F560095E9867B1A41256" },
00177 { "00800000000000000000000000000000","1FB76E90D207BA4C770F67284D6B1359" },
00178 { "00400000000000000000000000000000","A70AECE1D41DCA9F24BCE8393F6D54BF" },
00179 { "00200000000000000000000000000000","D4580FC395979689221C57A23598358B" },
00180 { "00100000000000000000000000000000","35CA62BA8126F015FABFEF8F9119AE6B" },
00181 { "00080000000000000000000000000000","C81FACB16E087EEFA823CF34E02FE482" },
00182 { "00040000000000000000000000000000","07400F04E4CC6625AE3FB41ECC863F2A" },
00183 { "00020000000000000000000000000000","A0941008068D401DEAB6400C86CA53AD" },
00184 { "00010000000000000000000000000000","2B63BEF50BA87A58BFFCA4CF44C22927" },
00185 { "00008000000000000000000000000000","FD49069AE9F1874A264A7BFD894ED886" },
00186 { "00004000000000000000000000000000","232755C754075BB5CC5B85ABFEA38779" },
00187 { "00002000000000000000000000000000","41358B9C76E959037E13F7E5050E0B42" },
00188 { "00001000000000000000000000000000","8978CD09C054BB1ABDFFBED09D1CF7EC" },
00189 { "00000800000000000000000000000000","9F2A7CE5FD51FD5D7E2D42407EEF8F6A" },
00190 { "00000400000000000000000000000000","6AA2F0627F312A77C68D1F15DF0E1379" },
00191 { "00000200000000000000000000000000","BCD56984E45DBF087BAC8757FC4EFF5A" },
00192 { "00000100000000000000000000000000","9D3C6C8ED48C9DE7A64CD05D8BF41D54" },
00193 { "00000080000000000000000000000000","FCD577A23F455ACDE3732C262EBD2D86" },
00194 { "00000040000000000000000000000000","022E2430D81858888C9E575411D4064F" },
00195 { "00000020000000000000000000000000","5742CA8CF1193491C1FBC148627D856E" },
00196 { "00000010000000000000000000000000","88BD93610040DFE248C2FE05EF9F4FE0" },
00197 { "00000008000000000000000000000000","29A9D577BB3824209FEA64128247CE6C" },
00198 { "00000004000000000000000000000000","AC4CDB534844EA86000B845FCDAD605F" },
00199 { "00000002000000000000000000000000","AAC6098597D46B8145A60F40D4EC5308" },
00200 { "00000001000000000000000000000000","3A7DFD0855A5BE0B16CACBD685FACEF5" },
00201 { "00000000800000000000000000000000","ACEBA627EBA87AD051C3E0CA0DEF6CD7" },
00202 { "00000000400000000000000000000000","F0A55DCDBC513EFDD603EA455EB9228C" },
00203 { "00000000200000000000000000000000","2176DEBC78D6B4A6D0FB37AFA6B51081" },
00204 { "00000000100000000000000000000000","FDB1B57379B85A85392613E8B4597B63" },
00205 { "00000000080000000000000000000000","58AB1112E0598586E07FC8359DDFC7EC" },
00206 { "00000000040000000000000000000000","DD6D1D2629F333528CB66869453BC273" },
00207 { "00000000020000000000000000000000","932218D99553BB2D4BFC69F1EA67CAAE" },
00208 { "00000000010000000000000000000000","399D066426F7FEF66F8983086DC044D8" },
00209 { "00000000008000000000000000000000","3E1BC58269B6B8C8C8D00806975F8337" },
00210 { "00000000004000000000000000000000","D50A1F966058C6D702D1AFCD700DA0E8" },
00211 { "00000000002000000000000000000000","6E7A6BB3554F12AD1F88C289D621CD0F" },
00212 { "00000000001000000000000000000000","9ED4EA506A0CBA89B246C14D1B5B96A9" },
00213 { "00000000000800000000000000000000","C395A92C1A6884857B263F01F43542DB" },
00214 { "00000000000400000000000000000000","06562AC497C60F802B68B47DB5B86B6A" },
00215 { "00000000000200000000000000000000","255A726F2106177FEFA7006BDE05D059" },
00216 { "00000000000100000000000000000000","B8FD6A8227D0565A4C174AD270EC1205" },
00217 { "00000000000080000000000000000000","C2652FDB48B9DDBFC43B3F7CDD831D6F" },
00218 { "00000000000040000000000000000000","913EB9205DB2E17A96A23A724EDF4C84" },
00219 { "00000000000020000000000000000000","9A6694FEB5EA44FF0572124FDB265658" },
00220 { "00000000000010000000000000000000","E347498DECA6B211C30E21FD0B47A333" },
00221 { "00000000000008000000000000000000","E70F0D4ED829A81E05D42E511EDE9376" },
00222 { "00000000000004000000000000000000","140BB7CAD8D6A3553BEF7A3D52347BD8" },
00223 { "00000000000002000000000000000000","5FA55360F440DCCA20925A3E15B42764" },
00224 { "00000000000001000000000000000000","6D5B969DFC3EA0A6682CC66488D221DA" },
00225 { "00000000000000800000000000000000","E2799D5C380B49D2F6997009079D03D3" },
00226 { "00000000000000400000000000000000","06AFBD8077909E847AF467BB2D47E893" },
00227 { "00000000000000200000000000000000","46B1EB96EC9EB10897F1562E59287253" },
00228 { "00000000000000100000000000000000","1793F1D4E1A1606F99C7019C19E85129" },
00229 { "00000000000000080000000000000000","ED785D0BA19553CE73B69F4D570C3A9D" },
00230 { "00000000000000040000000000000000","298DF7334670B7391BE203DF7E8890C7" },
00231 { "00000000000000020000000000000000","150C12DEF6EDC844B0B45361C2B3AECE" },
00232 { "00000000000000010000000000000000","06FFB5E13438BA8DBD8A3EDADFAC73A1" },
00233 { "00000000000000008000000000000000","6C5E5719D5F31E929FF9C44F086EFADB" },
00234 { "00000000000000004000000000000000","4C8D0E13996F4D32CB7984B7BB1B34FB" },
00235 { "00000000000000002000000000000000","C9BDCFFD4B9F3BBBB33A2D2C51BA83F6" },
00236 { "00000000000000001000000000000000","929B29DD0D952161FFDA8CB417B166EC" },
00237 { "00000000000000000800000000000000","87F9DFCB07275916E7A446D3DCE74232" },
00238 { "00000000000000000400000000000000","6FDFD0BC8F49BE420CD68A894C7CA4E9" },
00239 { "00000000000000000200000000000000","CDDC09DE42DC2CBCD9287A2072A30D23" },
00240 { "00000000000000000100000000000000","9B2FF668BA9D77AD1E9F30BA0173EBD4" },
00241 { "00000000000000000080000000000000","DEF29890D59A511B32A30322D7471E38" },
00242 { "00000000000000000040000000000000","5094EAEC9F23D0DBFAB8240A42ED5BF1" },
00243 { "00000000000000000020000000000000","79CB87BC375F58DE8DA780B9BAD3DEA3" },
00244 { "00000000000000000010000000000000","7139B3D980B85D3B77A3BBDB6CB79756" },
00245 { "00000000000000000008000000000000","148ED6E8FEC02168377C96956AE18D93" },
00246 { "00000000000000000004000000000000","0AFED5A710F2BF11C77F152951AE32CB" },
00247 { "00000000000000000002000000000000","C265AC354817550FAE12A51C2DCD749C" },
00248 { "00000000000000000001000000000000","A3B089F79D0A07EA0893BB48D508B35B" },
00249 { "00000000000000000000800000000000","C0A7B6BCE0675A48E95D39A7659CB20A" },
00250 { "00000000000000000000400000000000","6CE0A0BA02041CB5E6C0A46DE1B71A43" },
00251 { "00000000000000000000200000000000","E54045C33A386555C5754ADB0A181244" },
00252 { "00000000000000000000100000000000","BB652196955BB7BE7E8CB8E2E992A750" },
00253 { "00000000000000000000080000000000","594B2917DE6119B62BE3DDF10A1A47E0" },
00254 { "00000000000000000000040000000000","E8B4F95053617F6A10120DB196AAC4D1" },
00255 { "00000000000000000000020000000000","79646B1CC19708973215B9891A2C1019" },
00256 { "00000000000000000000010000000000","5E7E6175F6B548E5389C1B1C391CBEE2" },
00257 { "00000000000000000000008000000000","C0860A7B47544872B9DB5C220088DE5C" },
00258 { "00000000000000000000004000000000","325163F073E5A27EBAF339B1FA53682D" },
00259 { "00000000000000000000002000000000","1A0C4583CEFF5810F3AB42A471415A1D" },
00260 { "00000000000000000000001000000000","F8DDF239D19363957C7C8C9B537893FA" },
00261 { "00000000000000000000000800000000","D3B9999669509564741F236EEF2401F3" },
00262 { "00000000000000000000000400000000","3376DA406D82B76591B610C6C9FC3F9E" },
00263 { "00000000000000000000000200000000","B6AD728D2970637642723FF06204EEAD" },
00264 { "00000000000000000000000100000000","0ADF4A82FFE602BC13002AA8AB24EA71" },
00265 { "00000000000000000000000080000000","D80D1378E30036D92B4A359F68D0CBFE" },
00266 { "00000000000000000000000040000000","EDA13B315897290E4ACEB4B513E9749B" },
00267 { "00000000000000000000000020000000","34589936B79E4F43260DC6CCD1820D6D" },
00268 { "00000000000000000000000010000000","C7A8FF65CD38D008EC6745897E010122" },
00269 { "00000000000000000000000008000000","3AFE23D89E79E9F8A54F103ED51EB14D" },
00270 { "00000000000000000000000004000000","27994D1AA909806C7CC8E4AC4CD5479B" },
00271 { "00000000000000000000000002000000","610D5528725B34FD70ADC66E83BAE266" },
00272 { "00000000000000000000000001000000","3A3064DFF6E0B54D864E81FA76270065" },
00273 { "00000000000000000000000000800000","5E9B5966ED3A2358005C9773F8690AD9" },
00274 { "00000000000000000000000000400000","713738F580CED6E358D2CDCEDA64F99F" },
00275 { "00000000000000000000000000200000","EC7FE3578906291B2DCF0AD7FF8B5358" },
00276 { "00000000000000000000000000100000","0F714C096C244BED865A9E064576FE5D" },
00277 { "00000000000000000000000000080000","B7C226C60B6F3031A1E2160823A62679" },
00278 { "00000000000000000000000000040000","5C78C4BC8F15DC964FE9EC75203AD7D8" },
00279 { "00000000000000000000000000020000","178FB7443FBD17DCF1AF122D4D117239" },
00280 { "00000000000000000000000000010000","C55C99851BD135155A080A9C4E54B919" },
00281 { "00000000000000000000000000008000","AD75C80D72EA278B3EDE380DAAB1F708" },
00282 { "00000000000000000000000000004000","95054D1ECA74F75515AE8C17941D3A54" },
00283 { "00000000000000000000000000002000","8E0B0D4F95C9C9D65420B4B1869A1D3E" },
00284 { "00000000000000000000000000001000","7712EA2F0598CC8CFB9A934DEC848B5F" },
00285 { "00000000000000000000000000000800","9D730E0F7450183C0804D6817CBE058E" },
00286 { "00000000000000000000000000000400","3FA52E9B242F9AF61322FBB6BA583A01" },
00287 { "00000000000000000000000000000200","3D47D74F667D60458188922EE8D8A7A0" },
00288 { "00000000000000000000000000000100","036B4E4E02D84C56AC61007DAC33EC33" },
00289 { "00000000000000000000000000000080","4E171141E51234DE6E4B236643A6DC85" },
00290 { "00000000000000000000000000000040","DB720E7B04462829DFA258ED9E7C7F2F" },
00291 { "00000000000000000000000000000020","8B10E11115FF4336DE57F2EA13AABBFA" },
00292 { "00000000000000000000000000000010","F0E35BFF226C064E08368AF440298DB9" },
00293 { "00000000000000000000000000000008","6C4C8811B4DF74F2A7D7F79A6253CEA7" },
00294 { "00000000000000000000000000000004","7DD12AD3BC7A419F92753D8CC39637F0" },
00295 { "00000000000000000000000000000002","A465B01EA32B2F4F87C85FD06F9B0A02" },
00296 { "00000000000000000000000000000001","8DC902DDAE09F52B1A3A77EE89C1441E" },
00297 { NULL,NULL }
00298 },
00299 twofish_tst32[]=
00300 {
00301 { "8000000000000000000000000000000000000000000000000000000000000000","785229B51B515F30A1FCC88B969A4E47" },
00302 { "4000000000000000000000000000000000000000000000000000000000000000","B095E0619E70CDF5F4BC6E88079CF22F" },
00303 { "2000000000000000000000000000000000000000000000000000000000000000","44F32AEAE82516AC8857C1985B7109EC" },
00304 { "1000000000000000000000000000000000000000000000000000000000000000","B2BBE93B433C8F0415B90282E788C071" },
00305 { "0800000000000000000000000000000000000000000000000000000000000000","9E953EBAA3B13F43F90908B53DAA0C09" },
00306 { "0400000000000000000000000000000000000000000000000000000000000000","4579140290095FB25B3144444505D203" },
00307 { "0200000000000000000000000000000000000000000000000000000000000000","5FD5F687596A9AA9EA105A2F7CF59A94" },
00308 { "0100000000000000000000000000000000000000000000000000000000000000","005EA3AF8AFF3DDA323148690537853C" },
00309 { "0080000000000000000000000000000000000000000000000000000000000000","CD8E33C4F06FC0586E821522B2FEB08D" },
00310 { "0040000000000000000000000000000000000000000000000000000000000000","CABEC07E46D11086778C3E1937CD0797" },
00311 { "0020000000000000000000000000000000000000000000000000000000000000","56BA650835E125201400380C4D2D5D99" },
00312 { "0010000000000000000000000000000000000000000000000000000000000000","EB48A1B279E95EBF8FAAC13D70F8F452" },
00313 { "0008000000000000000000000000000000000000000000000000000000000000","E52435C29F7C9687B268C539BF6598B1" },
00314 { "0004000000000000000000000000000000000000000000000000000000000000","27785BDF6F6258EAC396BFD0F56BEE82" },
00315 { "0002000000000000000000000000000000000000000000000000000000000000","CA16B1969FA373F43EF09D19B3379F3F" },
00316 { "0001000000000000000000000000000000000000000000000000000000000000","6D1B6F14090368034E10CF0C1E4F5744" },
00317 { "0000800000000000000000000000000000000000000000000000000000000000","5AE3ABA331C5D765E3D112B1DA09E7BC" },
00318 { "0000400000000000000000000000000000000000000000000000000000000000","767F9CBDA1BA9914EBA40D7A172A4077" },
00319 { "0000200000000000000000000000000000000000000000000000000000000000","8FAE713F677A82075D773DB73D58763E" },
00320 { "0000100000000000000000000000000000000000000000000000000000000000","616CA9A15D710CA38FCA9A8E0B16A21C" },
00321 { "0000080000000000000000000000000000000000000000000000000000000000","D36754729DB34ECA1ECAC2CE2B381713" },
00322 { "0000040000000000000000000000000000000000000000000000000000000000","E68E3A421462A49AF8D7E544F7789301" },
00323 { "0000020000000000000000000000000000000000000000000000000000000000","69B24511DF9BE48CFDB416F08908315F" },
00324 { "0000010000000000000000000000000000000000000000000000000000000000","1329EA7551CE6C335DB924D563694058" },
00325 { "0000008000000000000000000000000000000000000000000000000000000000","74DA788FB7A6172B65FBB62C7ED4FECC" },
00326 { "0000004000000000000000000000000000000000000000000000000000000000","862703854F75F433135601000CD9363B" },
00327 { "0000002000000000000000000000000000000000000000000000000000000000","824D4C002C401677D5785D6C6DA96C68" },
00328 { "0000001000000000000000000000000000000000000000000000000000000000","7F9F21E8C45D1E8A843060B963CC628B" },
00329 { "0000000800000000000000000000000000000000000000000000000000000000","3F6F7B1157906913B09BD2AE2627C6B0" },
00330 { "0000000400000000000000000000000000000000000000000000000000000000","A1B7E0CC8B69B3C0C6F635F962D0A22F" },
00331 { "0000000200000000000000000000000000000000000000000000000000000000","6FC34DDFF0C74674CE124D85E8A3447F" },
00332 { "0000000100000000000000000000000000000000000000000000000000000000","436A5D315AF443DEA9BEF8D1E817E7E0" },
00333 { "0000000080000000000000000000000000000000000000000000000000000000","8B0434C9C98CDA4B313DAD6F1E64A943" },
00334 { "0000000040000000000000000000000000000000000000000000000000000000","AF9BD15EF1535259C63D688BF67119C4" },
00335 { "0000000020000000000000000000000000000000000000000000000000000000","F61EF2509D173E348E01839A26D033FF" },
00336 { "0000000010000000000000000000000000000000000000000000000000000000","9D37D036C8568D2173654423CC7AAB39" },
00337 { "0000000008000000000000000000000000000000000000000000000000000000","A93D98C055DDAA592390CADB0F0C468D" },
00338 { "0000000004000000000000000000000000000000000000000000000000000000","F19CB2A5067E9FBADBD4F0D103007A54" },
00339 { "0000000002000000000000000000000000000000000000000000000000000000","83C5D584511836263D8B0DE7CEF0AD16" },
00340 { "0000000001000000000000000000000000000000000000000000000000000000","E09206EB6A5E8AC933BAAB46547E4CD9" },
00341 { "0000000000800000000000000000000000000000000000000000000000000000","0A0EBA6ACED7899AA633CE67E8923936" },
00342 { "0000000000400000000000000000000000000000000000000000000000000000","C93968EC0EE02DACD3F3EE9AC2320B88" },
00343 { "0000000000200000000000000000000000000000000000000000000000000000","64D62934D409F36505EEC3B925BE914D" },
00344 { "0000000000100000000000000000000000000000000000000000000000000000","BBADB03D5F0FCF375E671F8B009F3AF1" },
00345 { "0000000000080000000000000000000000000000000000000000000000000000","DAC60B05A1C3A203C6B4FE882E780079" },
00346 { "0000000000040000000000000000000000000000000000000000000000000000","8B650EC280BE261CCED5B5FC7F8A9BA7" },
00347 { "0000000000020000000000000000000000000000000000000000000000000000","35EB82F0BB6735E2DE661AE4E9E9EE57" },
00348 { "0000000000010000000000000000000000000000000000000000000000000000","40B1042CBE87D64DDBEA4BAC8CF1F08C" },
00349 { "0000000000008000000000000000000000000000000000000000000000000000","13D46AE35D868401D23C891ED92621EE" },
00350 { "0000000000004000000000000000000000000000000000000000000000000000","D2C6E9C239B4FA5A1E76D038EA4660F3" },
00351 { "0000000000002000000000000000000000000000000000000000000000000000","DE3BC7CDFAF9AB7143E255DC87645F3E" },
00352 { "0000000000001000000000000000000000000000000000000000000000000000","8FB6CA966B5ACFB180A296EA5D93711F" },
00353 { "0000000000000800000000000000000000000000000000000000000000000000","59F622ACBBA15E522717A9EAF7047949" },
00354 { "0000000000000400000000000000000000000000000000000000000000000000","BB2939FFBD77B308DA93220AD68A21AC" },
00355 { "0000000000000200000000000000000000000000000000000000000000000000","CEBE5EDD9BACF0A0FB75B259DE7097CD" },
00356 { "0000000000000100000000000000000000000000000000000000000000000000","3448844E63AC2BD809E254AC3BAA6B3B" },
00357 { "0000000000000080000000000000000000000000000000000000000000000000","49C27499EEC1989626B1E50435BA0273" },
00358 { "0000000000000040000000000000000000000000000000000000000000000000","39E97018F547A8A802578B80952F2457" },
00359 { "0000000000000020000000000000000000000000000000000000000000000000","9934453FBAAE1CB362A0012204967AE8" },
00360 { "0000000000000010000000000000000000000000000000000000000000000000","E9C98A03713835EB4497346866791190" },
00361 { "0000000000000008000000000000000000000000000000000000000000000000","E026C858938B47D28A8758CCFAEF0FA8" },
00362 { "0000000000000004000000000000000000000000000000000000000000000000","3A84B0A26CEA6A8D8A94D5B791A0D3E8" },
00363 { "0000000000000002000000000000000000000000000000000000000000000000","B054259980B45B9D2D7CD6C13200BAFC" },
00364 { "0000000000000001000000000000000000000000000000000000000000000000","13645DBEDE21FF7C79C06141AD9E4CD1" },
00365 { "0000000000000000800000000000000000000000000000000000000000000000","F29B1370BA8D8CC19AC8DF5DF77F7319" },
00366 { "0000000000000000400000000000000000000000000000000000000000000000","6A2C94C488D5BD32742F143B2E8D0659" },
00367 { "0000000000000000200000000000000000000000000000000000000000000000","27A0BF748F513F18D4F7831527A3608F" },
00368 { "0000000000000000100000000000000000000000000000000000000000000000","0B0D61E162A88E04C38C19CA668C2DDC" },
00369 { "0000000000000000080000000000000000000000000000000000000000000000","4055BA24216EF49FE36E6145A5CD31D4" },
00370 { "0000000000000000040000000000000000000000000000000000000000000000","99699B31EBBE6ABE1F7B2AFEC86DC7E2" },
00371 { "0000000000000000020000000000000000000000000000000000000000000000","C8D70448CBA770CD94088F60CBF8C5AC" },
00372 { "0000000000000000010000000000000000000000000000000000000000000000","56C89F1BA6D3AB20465F01F81D00A894" },
00373 { "0000000000000000008000000000000000000000000000000000000000000000","919FC5BBFAB8C31F8B2A346FBC2AB282" },
00374 { "0000000000000000004000000000000000000000000000000000000000000000","FF57E3AB8751DAA252DD0DD917BEAD8B" },
00375 { "0000000000000000002000000000000000000000000000000000000000000000","90B94853B317FFA8D41F2A32A3A061AB" },
00376 { "0000000000000000001000000000000000000000000000000000000000000000","F4A0257D0CF6C8C87D154746C2C94B52" },
00377 { "0000000000000000000800000000000000000000000000000000000000000000","03666F848F252B501754773CB68CF3B2" },
00378 { "0000000000000000000400000000000000000000000000000000000000000000","F3D0941DDC7412A981C5F6CCAB082DC2" },
00379 { "0000000000000000000200000000000000000000000000000000000000000000","21EDD2A11C57EE97AEADFACEC20A8691" },
00380 { "0000000000000000000100000000000000000000000000000000000000000000","577CF09B5606F1443E8B57952004C68D" },
00381 { "0000000000000000000080000000000000000000000000000000000000000000","0CF408A2FBDA07068BDB13A371867FCC" },
00382 { "0000000000000000000040000000000000000000000000000000000000000000","88542C9E680C27FE8FBE090AD73410B9" },
00383 { "0000000000000000000020000000000000000000000000000000000000000000","7A8BA6DC89A1AD4385D0696AFDD89496" },
00384 { "0000000000000000000010000000000000000000000000000000000000000000","B84FA0FA046D5D77EA94CF3E8FDED147" },
00385 { "0000000000000000000008000000000000000000000000000000000000000000","D73CB079FB7101C933176352A93BB028" },
00386 { "0000000000000000000004000000000000000000000000000000000000000000","A7C8C1A59E141D608BC91BB69E7B2859" },
00387 { "0000000000000000000002000000000000000000000000000000000000000000","B2DA67AFE49B33E5EDFAF148A17BF06B" },
00388 { "0000000000000000000001000000000000000000000000000000000000000000","AC2DB35ED86D358616648D22B52DF012" },
00389 { "0000000000000000000000800000000000000000000000000000000000000000","662EA9D88A9A2C89581502EAAAD074D5" },
00390 { "0000000000000000000000400000000000000000000000000000000000000000","773A30DFDA8EBCE50EDFB925343C9ECC" },
00391 { "0000000000000000000000200000000000000000000000000000000000000000","10B7242D9C7CA610C20F1183BB949514" },
00392 { "0000000000000000000000100000000000000000000000000000000000000000","B7DF971F9C3444EFCC13210292126942" },
00393 { "0000000000000000000000080000000000000000000000000000000000000000","13F7406746C6E0CD5666EC04C0E540E2" },
00394 { "0000000000000000000000040000000000000000000000000000000000000000","9382384DCAF80CF537E24FC5F2F71A8A" },
00395 { "0000000000000000000000020000000000000000000000000000000000000000","3D5819934619E09F10E90C4EA7F30F40" },
00396 { "0000000000000000000000010000000000000000000000000000000000000000","710446D0A254F68975CD6AAAE92212FD" },
00397 { "0000000000000000000000008000000000000000000000000000000000000000","0A44FDEAA17E5F3E536A08D7A5B3267B" },
00398 { "0000000000000000000000004000000000000000000000000000000000000000","BAC72F53EE39296D3A23B126F8D8B20B" },
00399 { "0000000000000000000000002000000000000000000000000000000000000000","88C342961D0EE83902CB78C29539923D" },
00400 { "0000000000000000000000001000000000000000000000000000000000000000","CF3B48A6351C4561752D6A209F93A30F" },
00401 { "0000000000000000000000000800000000000000000000000000000000000000","957B107D23F3694F3FFD9957BBE13168" },
00402 { "0000000000000000000000000400000000000000000000000000000000000000","23675E18C1C66B483D55E14AC7F9CC80" },
00403 { "0000000000000000000000000200000000000000000000000000000000000000","955B8619F99F7609201CEEB338F32795" },
00404 { "0000000000000000000000000100000000000000000000000000000000000000","9F2BCB0C28768DA3B76206979B14EBC2" },
00405 { "0000000000000000000000000080000000000000000000000000000000000000","258F95A0E86EE0EE8FC020B4A01900F2" },
00406 { "0000000000000000000000000040000000000000000000000000000000000000","FD7B1DD7C7FE279E6A5E2926DD890B5E" },
00407 { "0000000000000000000000000020000000000000000000000000000000000000","59CF38A7C863C623991B5392944CB43C" },
00408 { "0000000000000000000000000010000000000000000000000000000000000000","27BCC9206AEC78DA48C1E9AB8D1A7A07" },
00409 { "0000000000000000000000000008000000000000000000000000000000000000","62D8460820B18811DEBB617DE7B8EC8C" },
00410 { "0000000000000000000000000004000000000000000000000000000000000000","782D8A4D30EE841EDB2E7E88C63B851A" },
00411 { "0000000000000000000000000002000000000000000000000000000000000000","4D10D177334397F49211BCB10F207905" },
00412 { "0000000000000000000000000001000000000000000000000000000000000000","C8E608BAFE61254A0DDF866BB4D063DD" },
00413 { "0000000000000000000000000000800000000000000000000000000000000000","05DDAB3DAEA0C64C1077BE22DA7ACDD4" },
00414 { "0000000000000000000000000000400000000000000000000000000000000000","951388F2BE1DD7013A00327FC6DB7905" },
00415 { "0000000000000000000000000000200000000000000000000000000000000000","62F8283651EFDF475DE8511EA7256AD6" },
00416 { "0000000000000000000000000000100000000000000000000000000000000000","5B259EEE6B19EE12D4CE20D2F38D4BCF" },
00417 { "0000000000000000000000000000080000000000000000000000000000000000","704414E13DCAD9DF7F593F630E68E13C" },
00418 { "0000000000000000000000000000040000000000000000000000000000000000","41AD9DAAC24ECCBB454DBAF75D5B9989" },
00419 { "0000000000000000000000000000020000000000000000000000000000000000","919C54C126B54D7A570D8ABA9FCE5D08" },
00420 { "0000000000000000000000000000010000000000000000000000000000000000","BC665541FF0F2E86DBDF4444C01AC0EA" },
00421 { "0000000000000000000000000000008000000000000000000000000000000000","FD30E2D851211506C112D5701B859BC6" },
00422 { "0000000000000000000000000000004000000000000000000000000000000000","7DB7B15E4ACBDBB0BFF4C4EAEDC2231E" },
00423 { "0000000000000000000000000000002000000000000000000000000000000000","F0AFDED56AD72D4C1E57A66EEDF4816E" },
00424 { "0000000000000000000000000000001000000000000000000000000000000000","E53B053D9B2E06656138D4A1EFA58888" },
00425 { "0000000000000000000000000000000800000000000000000000000000000000","4DABE13A3E656E95150440F81DD92666" },
00426 { "0000000000000000000000000000000400000000000000000000000000000000","175D44DFDE1EAD6E0E6862B511AA7007" },
00427 { "0000000000000000000000000000000200000000000000000000000000000000","09B690F493F5C779E8B6ACD09667A997" },
00428 { "0000000000000000000000000000000100000000000000000000000000000000","68D0E4CCA0119EED57ABF3C7574BDA8B" },
00429 { "0000000000000000000000000000000080000000000000000000000000000000","12C00618DA7EBA5EFA5E58D2696D891F" },
00430 { "0000000000000000000000000000000040000000000000000000000000000000","5DCE21AF0D23BC5AEFD4EA331B16219A" },
00431 { "0000000000000000000000000000000020000000000000000000000000000000","A5D7135A053B904D44B40E4E21693751" },
00432 { "0000000000000000000000000000000010000000000000000000000000000000","3257CEC675BF755FEE67A44D7EDF2731" },
00433 { "0000000000000000000000000000000008000000000000000000000000000000","324D30DDC6979F17A3BEAEA3A76AD44C" },
00434 { "0000000000000000000000000000000004000000000000000000000000000000","A1AA0E04E2B61861796FD2AA30FBEB05" },
00435 { "0000000000000000000000000000000002000000000000000000000000000000","90CA81DF4000404B567F5CFA9D193CB3" },
00436 { "0000000000000000000000000000000001000000000000000000000000000000","A2E6864259483D059B57BB921B7FBD99" },
00437 { "0000000000000000000000000000000000800000000000000000000000000000","545690C09C8C396F1273510DA9065C12" },
00438 { "0000000000000000000000000000000000400000000000000000000000000000","16D86FCC5910E2DD0CEA4DD5219B2D03" },
00439 { "0000000000000000000000000000000000200000000000000000000000000000","EC4114C19DD5711CD927B0DBE34AAB4B" },
00440 { "0000000000000000000000000000000000100000000000000000000000000000","A78C62D8FD439E5B10A7EF436714AC22" },
00441 { "0000000000000000000000000000000000080000000000000000000000000000","BA5D708CBA34F782DA00C7643C971DB9" },
00442 { "0000000000000000000000000000000000040000000000000000000000000000","7DB9ADCFA26C1E784E7F485BD0A0A52C" },
00443 { "0000000000000000000000000000000000020000000000000000000000000000","8A025CED99AF1047C5345358A291CDBB" },
00444 { "0000000000000000000000000000000000010000000000000000000000000000","187A1824D390AD2798E4F2264E5F1F21" },
00445 { "0000000000000000000000000000000000008000000000000000000000000000","BA28DE5C32353C65B97A59889E7A7A40" },
00446 { "0000000000000000000000000000000000004000000000000000000000000000","5D486AB86A883029EC74916851FFFA11" },
00447 { "0000000000000000000000000000000000002000000000000000000000000000","F9C79D54CEEE6170B195F4D30FA63FE0" },
00448 { "0000000000000000000000000000000000001000000000000000000000000000","96B8429F476485F8CC2E204534A8B64E" },
00449 { "0000000000000000000000000000000000000800000000000000000000000000","13061D65FEF26F5ACAAF3B55FDB98C36" },
00450 { "0000000000000000000000000000000000000400000000000000000000000000","C72DC86F70B40169B3456783A611DAE9" },
00451 { "0000000000000000000000000000000000000200000000000000000000000000","82AA2DB6FEE9212968D8282A1BF3242B" },
00452 { "0000000000000000000000000000000000000100000000000000000000000000","220C8B197F54F8E86DAE575B07A570EF" },
00453 { "0000000000000000000000000000000000000080000000000000000000000000","873C47F6F75BE9F710F91F2C54A69A7A" },
00454 { "0000000000000000000000000000000000000040000000000000000000000000","0392FA7BB908FEF23774772F74AC968D" },
00455 { "0000000000000000000000000000000000000020000000000000000000000000","A94203746A266C5744C16BF4E8DFA6D7" },
00456 { "0000000000000000000000000000000000000010000000000000000000000000","D3BA78AD6B01CC7221FA7778699C8316" },
00457 { "0000000000000000000000000000000000000008000000000000000000000000","994FDCC09C25400D14C05117B936EECD" },
00458 { "0000000000000000000000000000000000000004000000000000000000000000","4012F67B2A0BEF2623CA6AC5B054BE62" },
00459 { "0000000000000000000000000000000000000002000000000000000000000000","1134AF65E6D3D5E3D3C23A499EE2F677" },
00460 { "0000000000000000000000000000000000000001000000000000000000000000","6B35A344BD8DFD4002F5F22EA288F8E6" },
00461 { "0000000000000000000000000000000000000000800000000000000000000000","D293D438C563B8EB3FF26E23A7323B74" },
00462 { "0000000000000000000000000000000000000000400000000000000000000000","8085B7A7B939FA37BC4E1D746E9F9B37" },
00463 { "0000000000000000000000000000000000000000200000000000000000000000","D628AD150E15F413010BE15E391D3F48" },
00464 { "0000000000000000000000000000000000000000100000000000000000000000","A5C2AC88B6FD4C57CB4F2C2920A584EF" },
00465 { "0000000000000000000000000000000000000000080000000000000000000000","D7F5183F6BAB04B87A1ABAA3914DA848" },
00466 { "0000000000000000000000000000000000000000040000000000000000000000","3B2116BD2E362FC8985A0F0C618DF58A" },
00467 { "0000000000000000000000000000000000000000020000000000000000000000","BF31E8DE8342A32BBD80A8F91507BADA" },
00468 { "0000000000000000000000000000000000000000010000000000000000000000","AA04A56C13507AE5137657546766AE2D" },
00469 { "0000000000000000000000000000000000000000008000000000000000000000","72B9D7628AB21DF89666E50517C50574" },
00470 { "0000000000000000000000000000000000000000004000000000000000000000","2B8DE8D2D3332E6A30215ACC10A69847" },
00471 { "0000000000000000000000000000000000000000002000000000000000000000","AC421C73A789D79B452623DAFD3D6D0B" },
00472 { "0000000000000000000000000000000000000000001000000000000000000000","995207D8CF8C10904C0F47652C9C4287" },
00473 { "0000000000000000000000000000000000000000000800000000000000000000","F83BD19A357BD7901C0E8FBEFCF857ED" },
00474 { "0000000000000000000000000000000000000000000400000000000000000000","F42BB427C894A072C861C1425CBD71BC" },
00475 { "0000000000000000000000000000000000000000000200000000000000000000","3D1EC73B166DC0120DDF24267907C0F9" },
00476 { "0000000000000000000000000000000000000000000100000000000000000000","8EF136AF5D7D1B513FB59FA21F7837A1" },
00477 { "0000000000000000000000000000000000000000000080000000000000000000","EB4BBA7F94CE9429255A583D2F9810CD" },
00478 { "0000000000000000000000000000000000000000000040000000000000000000","5FE1C3BCD24818948514CB5A32FFD0A1" },
00479 { "0000000000000000000000000000000000000000000020000000000000000000","A990117E78D1C5BD7833B96A4A180744" },
00480 { "0000000000000000000000000000000000000000000010000000000000000000","E63684CDC37E6768C45012EA00D008E4" },
00481 { "0000000000000000000000000000000000000000000008000000000000000000","78B711F290DA924CAF1E4F1E11A08F4F" },
00482 { "0000000000000000000000000000000000000000000004000000000000000000","85B7F0D391AF9268643D9C0B72433A99" },
00483 { "0000000000000000000000000000000000000000000002000000000000000000","F51410475B33FBD3DB2117B5C17C82D4" },
00484 { "0000000000000000000000000000000000000000000001000000000000000000","A3C5BF72F39940DC7DAFB474A77A6114" },
00485 { "0000000000000000000000000000000000000000000000800000000000000000","4EFB0E18FB2F96FB6F81514BCE0A7BBD" },
00486 { "0000000000000000000000000000000000000000000000400000000000000000","10112F5ABBF246996860B843FC7159F5" },
00487 { "0000000000000000000000000000000000000000000000200000000000000000","94A91373701569B8C21487A7BDB164B6" },
00488 { "0000000000000000000000000000000000000000000000100000000000000000","A466821BD64F552C0610ADB737C562CD" },
00489 { "0000000000000000000000000000000000000000000000080000000000000000","511BE2BA9F2A272CA2F5C1D0F3E249C1" },
00490 { "0000000000000000000000000000000000000000000000040000000000000000","5578CCF8B92D48363EED4601661EB56E" },
00491 { "0000000000000000000000000000000000000000000000020000000000000000","BF90E87173A45115C811B6319C24FC4A" },
00492 { "0000000000000000000000000000000000000000000000010000000000000000","8029EE840D130319330B432D95DB9AA7" },
00493 { "0000000000000000000000000000000000000000000000008000000000000000","19D6D9F45582481A573D77917E778F3C" },
00494 { "0000000000000000000000000000000000000000000000004000000000000000","556D552FDE7C64227E2B72776488D6C1" },
00495 { "0000000000000000000000000000000000000000000000002000000000000000","3E81B51A214CC1F1CF6F35F9106A84BC" },
00496 { "0000000000000000000000000000000000000000000000001000000000000000","4E48243857ECB700F8F16872E0BB4FA9" },
00497 { "0000000000000000000000000000000000000000000000000800000000000000","681654DF6668CDDF1D3D604483AB483B" },
00498 { "0000000000000000000000000000000000000000000000000400000000000000","BD6CEEFD85A336E4F12D42076573ECA2" },
00499 { "0000000000000000000000000000000000000000000000000200000000000000","7488F9790FEC8AAE2AADDF6A600629B3" },
00500 { "0000000000000000000000000000000000000000000000000100000000000000","669C36695C33B63F16077CAE9AA940AA" },
00501 { "0000000000000000000000000000000000000000000000000080000000000000","7CE998A357384159C9B34A9A8AC7DF78" },
00502 { "0000000000000000000000000000000000000000000000000040000000000000","51BE07BA8106A19CCC2005B8B3932FBF" },
00503 { "0000000000000000000000000000000000000000000000000020000000000000","2634245A6EC3F17A35B7FE1D3E17F769" },
00504 { "0000000000000000000000000000000000000000000000000010000000000000","24D4114760BCE04C0109C06CCE199F6C" },
00505 { "0000000000000000000000000000000000000000000000000008000000000000","3F055452FCD596C6D588BD48BB5D5080" },
00506 { "0000000000000000000000000000000000000000000000000004000000000000","A1D97F66DEF90DE14CC2BFAFF09286BB" },
00507 { "0000000000000000000000000000000000000000000000000002000000000000","80442DC4EBFB53B86E232D886CA166B9" },
00508 { "0000000000000000000000000000000000000000000000000001000000000000","76A593802C6A691152E8A04E5DE2D05A" },
00509 { "0000000000000000000000000000000000000000000000000000800000000000","F923A147E00807D58FB9C686E01F7E07" },
00510 { "0000000000000000000000000000000000000000000000000000400000000000","8EA3B396D561A3CFCE729A0B59647760" },
00511 { "0000000000000000000000000000000000000000000000000000200000000000","4AA735D710704790C060BAD696DACABE" },
00512 { "0000000000000000000000000000000000000000000000000000100000000000","7F7C322D82557737F5407A797069B711" },
00513 { "0000000000000000000000000000000000000000000000000000080000000000","5094418C55B7D591EFDB7097CB95B16D" },
00514 { "0000000000000000000000000000000000000000000000000000040000000000","CC014984ABDFB760A835846668340929" },
00515 { "0000000000000000000000000000000000000000000000000000020000000000","18F86EA6C633228579C5728FF070AC21" },
00516 { "0000000000000000000000000000000000000000000000000000010000000000","AFCF921E4FA24FDEF85EDAC12CD479F1" },
00517 { "0000000000000000000000000000000000000000000000000000008000000000","684085D0BE8AE0D617B2EFEF62CAAC93" },
00518 { "0000000000000000000000000000000000000000000000000000004000000000","04C7B0268EAEFED098C815935D868CF9" },
00519 { "0000000000000000000000000000000000000000000000000000002000000000","39AE859D255487A68093A376D358BBC2" },
00520 { "0000000000000000000000000000000000000000000000000000001000000000","F1218B59E947816041B21AC28685EF36" },
00521 { "0000000000000000000000000000000000000000000000000000000800000000","B9BE024D06447F8965E480B33975E36F" },
00522 { "0000000000000000000000000000000000000000000000000000000400000000","24ECD5B3178150233BD38A4B9F8EBC86" },
00523 { "0000000000000000000000000000000000000000000000000000000200000000","7AD12485E896037A8D1A4ABE8A80B9BB" },
00524 { "0000000000000000000000000000000000000000000000000000000100000000","CEC561C6F4C45CC944371E5D1C18EDF1" },
00525 { "0000000000000000000000000000000000000000000000000000000080000000","F4B1088B0858A3737DF2C90FD919D1D4" },
00526 { "0000000000000000000000000000000000000000000000000000000040000000","5EA6D1B9881CE230B8EABAC59B7F5393" },
00527 { "0000000000000000000000000000000000000000000000000000000020000000","8023134FAC8BF5FDA86368BDA618AEF7" },
00528 { "0000000000000000000000000000000000000000000000000000000010000000","D37285234A927061BEC9F8AAE0E796C8" },
00529 { "0000000000000000000000000000000000000000000000000000000008000000","68AC18DB2FBF0A4A095A4B3344BF035D" },
00530 { "0000000000000000000000000000000000000000000000000000000004000000","563868079C5DF91E3B47B370B0BBB820" },
00531 { "0000000000000000000000000000000000000000000000000000000002000000","86C3BB221834F7507505434E4F98DC92" },
00532 { "0000000000000000000000000000000000000000000000000000000001000000","FD8220818731607D8B69AC5963D0FAC9" },
00533 { "0000000000000000000000000000000000000000000000000000000000800000","550726375ABB0F9A7C010DC4E47833F9" },
00534 { "0000000000000000000000000000000000000000000000000000000000400000","8AB5E8973A5D6648517D151295091C0E" },
00535 { "0000000000000000000000000000000000000000000000000000000000200000","338BB4B5569AA06411B9911381F350B2" },
00536 { "0000000000000000000000000000000000000000000000000000000000100000","332D696EC49DF4B58C5FA9CC84773F47" },
00537 { "0000000000000000000000000000000000000000000000000000000000080000","DEB5AC8F895AFF45BA5815D4912D8371" },
00538 { "0000000000000000000000000000000000000000000000000000000000040000","89A49D3AB772D0FDAE05FC692EAF6C7B" },
00539 { "0000000000000000000000000000000000000000000000000000000000020000","02116E6AEFC21A4D4D64CA27AB7AF31E" },
00540 { "0000000000000000000000000000000000000000000000000000000000010000","58F79FF1810CA4B0E0178F7D9C24A581" },
00541 { "0000000000000000000000000000000000000000000000000000000000008000","686FB1ED659D9BF17DA2BB79AC636C93" },
00542 { "0000000000000000000000000000000000000000000000000000000000004000","1C5C176C4F5796B2C34D2A12858EB511" },
00543 { "0000000000000000000000000000000000000000000000000000000000002000","2A94B92CC9C4776817C0A77D49E24F22" },
00544 { "0000000000000000000000000000000000000000000000000000000000001000","890583A6C9549A3DCAFBD54BF391BC8F" },
00545 { "0000000000000000000000000000000000000000000000000000000000000800","EA88A883197E483B4AA16316EA97CCBB" },
00546 { "0000000000000000000000000000000000000000000000000000000000000400","CC5732CEB99A0A0353BABA6432BCBE9F" },
00547 { "0000000000000000000000000000000000000000000000000000000000000200","88811B506D565779F09DE9BDF8702BD8" },
00548 { "0000000000000000000000000000000000000000000000000000000000000100","E11FEE3AD4A9A03956704B58720C92DD" },
00549 { "0000000000000000000000000000000000000000000000000000000000000080","644555DFB9CE8EDAF888EE142B5577F1" },
00550 { "0000000000000000000000000000000000000000000000000000000000000040","716E2BBCBD8FF7E7335784B767F27CA9" },
00551 { "0000000000000000000000000000000000000000000000000000000000000020","83588863F183ECE04E95629A322F9A09" },
00552 { "0000000000000000000000000000000000000000000000000000000000000010","5E2833EC95ACE6B93AF28C6FCDBCE5D5" },
00553 { "0000000000000000000000000000000000000000000000000000000000000008","B3EFCF17F0E1B275D413DD4D3A5CAE68" },
00554 { "0000000000000000000000000000000000000000000000000000000000000004","3C943E1A2E7E56E4B185302D2D5C5DBD" },
00555 { "0000000000000000000000000000000000000000000000000000000000000002","8CB4E2498382B523DCE6F7C17C91400B" },
00556 { "0000000000000000000000000000000000000000000000000000000000000001","85F345366155D13F8F257734D2CBD6D9" },
00557 { NULL,NULL }
00558 };
00559
00560
00561 int test_twofish(struct TwofishTEST *tst,TwoFishCipher *tfc,int keylen,int *ntests)
00562 {
00563 int failed=0;
00564 for(int t=0; tst[t].key; t++)
00565 {
00566 char *hexkey=tst[t].key;
00567 unsigned char key[keylen];
00568 for(int i=0; i<keylen; i++)
00569 {
00570 unsigned int val;
00571 sscanf(&hexkey[i+i],"%02x",&val);
00572 key[i]=(unsigned char)val;
00573 }
00574 tfc->SetKey((char*)key,keylen);
00575 char ibuf[16],buf[16];
00576 memset(ibuf,0,16);
00577 tfc->EncryptBlock(ibuf,buf);
00578 char res[64+1];
00579 for(int i=0; i<16; i++)
00580 {
00581 unsigned int val=*((unsigned char*)(buf+i));
00582 sprintf(res+i*2,"%02X",val);
00583 }
00584
00585 if(strlen(res)!=32 || strcmp(res,tst[t].res))
00586 { ++failed; }
00587 tfc->DecryptBlock(buf,buf);
00588 if(memcmp(buf,ibuf,16))
00589 { ++failed; }
00590 ++(*ntests);
00591 }
00592 return(failed);
00593 }
00594
00595 static int do_test_twofish()
00596 {
00597 TwoFishCipher tfc;
00598 int fail,failtot=0;
00599 int ntests=0;
00600
00601 fprintf(stderr,"Testing 16byte twofish... ");
00602 fail=test_twofish(twofish_tst16,&tfc,16,&ntests);
00603 failtot+=fail ? 1 : 0;
00604 if(fail) fprintf(stderr,"*** FAILED; %d ERRORS!\n",fail);
00605 else fprintf(stderr,"passed (%d)\n",ntests);
00606
00607 ntests=0;
00608 fprintf(stderr,"Testing 32byte twofish... ");
00609 fail=test_twofish(twofish_tst32,&tfc,32,&ntests);
00610 failtot+=fail ? 1 : 0;
00611 if(fail) fprintf(stderr,"*** FAILED; %d ERRORS!\n",fail);
00612 else fprintf(stderr,"passed (%d)\n",ntests);
00613
00614 return(failtot);
00615 }
00616
00617
00618 struct HASH_TEST
00619 {
00620 const char *msg;
00621 const char *res;
00622 };
00623
00624
00625 static int test_hash(SecureHashBase *sh,const char *mat_res,HASH_TEST *test)
00626 {
00627
00628 unsigned char *msg0=(unsigned char*)malloc(1000000);
00629 CritAssert(msg0);
00630 unsigned char *msg=msg0;
00631 for(int i=0; i<1000000; i++)
00632 { msg[i]='a'; }
00633
00634 for(int ii=0; ii<3; ii++)
00635 {
00636 sh->reset(); msg=msg0;
00637 for(size_t left=1000000;;)
00638 {
00639 size_t len=random()%4096;
00640 if(len>left)
00641 { len=left; }
00642 sh->feed((char*)msg,len);
00643 left-=len;
00644 msg+=len;
00645 if(!left)
00646 { break; }
00647 }
00648 }
00649
00650 sh->final();
00651 size_t hsize=sh->GetPar()->hash_size;
00652 CritAssert(hsize>=4);
00653 unsigned char hash[hsize];
00654 sh->GetHash((char*)hash);
00655
00656
00657
00658
00659
00660
00661 if(memcmp(hash,mat_res,hsize))
00662 {
00663 unsigned const char *_mres=(unsigned const char *)mat_res;
00664 fprintf(stderr,"%02x%02x%02x%02x <-> %02x %02x %02x %02x\n",
00665 (int)hash[0],(int)hash[1],(int)hash[2],(int)hash[3],
00666 (int)_mres[0],(int)_mres[1],(int)_mres[2],(int)_mres[3]);
00667 fprintf(stderr,"*** FAILED! [1]\n");
00668 return(1);
00669 }
00670
00671 int errors=0;
00672 int ntests=1;
00673 for(HASH_TEST *st=test; st->msg; st++)
00674 {
00675 sh->reset();
00676 const unsigned char *msg=(unsigned char*)st->msg;
00677 sh->feed((char*)msg,strlen((char*)msg));
00678 sh->final();
00679
00680 unsigned char hash[hsize];
00681 sh->GetHash((char*)hash);
00682 if(memcmp(st->res,hash,hsize))
00683 {
00684 if(!errors) fprintf(stderr,"\n");
00685 fprintf(stderr,"CALCULATED:");
00686 for(size_t ii=0; ii<hsize; ii++)
00687 {
00688 if(!(ii%4)) fprintf(stderr," ");
00689 fprintf(stderr,"%02x",hash[ii]);
00690 }
00691 unsigned char *res=(unsigned char*)st->res;
00692 fprintf(stderr," SHOULD BE: ");
00693 for(size_t ii=0; ii<hsize; ii++)
00694 {
00695 if(!(ii%4)) fprintf(stderr," ");
00696 fprintf(stderr,"%02x",res[ii]);
00697 }
00698 fprintf(stderr,"\n");
00699 ++errors;
00700 }
00701 ++ntests;
00702 }
00703 if(errors)
00704 {
00705 fprintf(stderr,"FAILED!! (%d ERRORS)!!\n",errors);
00706 return(1);
00707 }
00708 fprintf(stderr,"passed (%d)\n",ntests);
00709 return(0);
00710 }
00711
00712
00713
00714
00715 static struct HASH_TEST rmd160_test[]=
00716 {
00717 { "",
00718 "\x9c\x11\x85\xa5\xc5\xe9\xfc\x54\x61\x28\x08\x97\x7e\xe8\xf5\x48\xb2\x25\x8d\x31" },
00719 { "a",
00720 "\x0b\xdc\x9d\x2d\x25\x6b\x3e\xe9\xda\xae\x34\x7b\xe6\xf4\xdc\x83\x5a\x46\x7f\xfe" },
00721 { "abc",
00722 "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc" },
00723 { "message digest",
00724 "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36" },
00725 { "abcdefghijklmnopqrstuvwxyz",
00726 "\xf7\x1c\x27\x10\x9c\x69\x2c\x1b\x56\xbb\xdc\xeb\x5b\x9d\x28\x65\xb3\x70\x8d\xbc" },
00727 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
00728 "\x12\xa0\x53\x38\x4a\x9c\x0c\x88\xe4\x05\xa0\x6c\x27\xdc\xf4\x9a\xda\x62\xeb\x2b" },
00729 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
00730 "\xb0\xe2\x0b\x6e\x31\x16\x64\x02\x86\xed\x3a\x87\xa5\x71\x30\x79\xb2\x1f\x51\x89" },
00731 { "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
00732 "\x9b\x75\x2e\x45\x57\x3d\x4b\x39\xf4\xdb\xd3\x32\x3c\xab\x82\xbf\x63\x32\x6b\xfb" },
00733 { NULL,NULL }
00734 };
00735
00736 static int do_test_rmd160()
00737 {
00738 fprintf(stderr,"Testing RMD160... ");
00739
00740 RMD160Hash sh;
00741
00742 const char *res=
00743 "\x52\x78\x32\x43\xc1\x69\x7b\xdb\xe1\x6d"
00744 "\x37\xf9\x7f\x68\xf0\x83\x25\xdc\x15\x28";
00745 return(test_hash(&sh,res,rmd160_test));
00746 }
00747
00748
00749
00750 static struct HASH_TEST sha0_test[]=
00751 {
00752 { "abc",
00753 "\x01\x64\xb8\xa9\x14\xcd\x2a\x5e\x74\xc4\xf7\xff\x08\x2c\x4d\x97\xf1\xed\xf8\x80" },
00754 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
00755 "\xd2\x51\x6e\xe1\xac\xfa\x5b\xaf\x33\xdf\xc1\xc4\x71\xe4\x38\x44\x9e\xf1\x34\xc8" },
00756 { NULL,NULL }
00757 };
00758
00759 static int do_test_sha0()
00760 {
00761 fprintf(stderr,"Testing SHA0... ");
00762
00763 SHA0Hash sh;
00764
00765 const char *res=
00766 "\x32\x32\xaf\xfa\x48\x62\x8a\x26\x65\x3b"
00767 "\x5a\xaa\x44\x54\x1f\xd9\x0d\x69\x06\x03";
00768 return(test_hash(&sh,res,sha0_test));
00769 }
00770
00771
00772
00773
00774 static struct HASH_TEST sha1_test[]=
00775 {
00776 { "abc",
00777 "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d" },
00778 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
00779 "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1" },
00780 { NULL,NULL }
00781 };
00782
00783 static int do_test_sha1()
00784 {
00785 fprintf(stderr,"Testing SHA1... ");
00786
00787 SHA1Hash sh;
00788
00789 const char *res=
00790 "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e"
00791 "\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f";
00792 return(test_hash(&sh,res,sha1_test));
00793 }
00794
00795
00796
00797 static struct HASH_TEST crc32_test[]=
00798 {
00799 { "",
00800 "\xff\xff\xff\xff" },
00801 { "a",
00802 "\x48\xc2\x79\xfe" },
00803 { "abc",
00804 "\x48\xaa\x78\xa2" },
00805 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
00806 "\x97\xd3\x2c\x84" },
00807 { "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
00808 "\x73\xa0\xb3\xa8" },
00809 { NULL,NULL }
00810 };
00811
00812 static int do_test_crc32()
00813 {
00814 fprintf(stderr,"Testing CRC32... ");
00815
00816 CRC32Hash sh;
00817
00818 const char *res="\xca\xc5\x5e\x1f";
00819 return(test_hash(&sh,res,crc32_test));
00820 }
00821
00822
00823
00824 static int base64_ctest(const char *str)
00825 {
00826 size_t inlen=strlen(str);
00827 size_t outlen=inlen*4/3+4 + inlen*4/3/32+1;
00828 char enc[outlen];
00829
00830
00831 Base64Encoder encoder(8);
00832 const char *ibuf=str;
00833 const char *ibufend=ibuf+inlen;
00834 char *obuf=enc;
00835 char *obufend=obuf+outlen;
00836 for(;;)
00837 {
00838 int inlen=(random()%22)+1;
00839 if(ibuf+inlen>ibufend)
00840 { inlen=ibufend-ibuf; }
00841 ssize_t rv=encoder.encode(ibuf,inlen,obuf,obufend-obuf);
00842 if(rv<0)
00843 {
00844 fprintf(stderr,"Base64Encode(%d)=%d\n",inlen,rv);
00845 return(1);
00846 }
00847 ibuf+=inlen;
00848 obuf+=rv;
00849 if(!inlen) break;
00850 }
00851 CritAssert(ibuf==ibufend);
00852 CritAssert(obuf<=obufend);
00853
00854 outlen=obuf-enc;
00855
00856 char dec[inlen];
00857
00858
00859 Base64Decoder decoder;
00860 ibuf=enc;
00861 ibufend=enc+outlen;
00862 obuf=dec;
00863 obufend=dec+inlen;
00864 for(;;)
00865 {
00866 int inlen=(random()%23)+1;
00867 if(ibuf+inlen>ibufend)
00868 { inlen=ibufend-ibuf; }
00869 ssize_t rv=decoder.decode(ibuf,inlen,obuf,obufend-obuf);
00870 if(rv<0)
00871 {
00872 fprintf(stderr,"Base64Encode(%d)=%d\n",inlen,rv);
00873 return(1);
00874 }
00875 ibuf+=inlen;
00876 obuf+=rv;
00877 if(!inlen) break;
00878 }
00879 CritAssert(ibuf==ibufend);
00880 CritAssert(obuf<=obufend);
00881
00882
00883 if(inlen!=size_t(obuf-dec))
00884 {
00885 fprintf(stderr,"Length mismatch %u != %u (%u)\n",
00886 inlen,size_t(obuf-dec),outlen);
00887 return(1);
00888 }
00889 if(memcmp(str,dec,inlen))
00890 {
00891 fprintf(stderr,"Compare failed.\n");
00892 return(1);
00893 }
00894 return(0);
00895 }
00896
00897 static struct Base64_TEST
00898 {
00899 const char *txt;
00900 const char *res;
00901 } base64_test[]=
00902 {
00903 { "T", "VA=" },
00904 { "hi", "aGk=" },
00905 { "s i", "cyBp=" },
00906 { "s th", "cyB0aA=" },
00907 { "e tex", "ZSB0ZXg=" },
00908 { "t whic", "dCB3aGlj=" },
00909 { "h shall", "aCBzaGFsbA=" },
00910 { " serve a", "IHNlcnZlIGE=" },
00911 { "s base64 ", "cyBiYXNlNjQg=" },
00912 { "test vecto", "dGVzdCB2ZWN0bw=" },
00913 { "r. Well, t", "ci4gIFdlbGwsIHQ=" },
00914 { "he sentence ", "aGUgc2VudGVuY2Ug=" },
00915 { "here was a bi", "aGVyZSB3YXMgYSBiaQ=" },
00916 { "t short so som", "dCBzaG9ydCBzbyBzb20=" },
00917 { "e blah blah nee", "ZSBibGFoIGJsYWggbmVl=" },
00918 { "ds to be added. ", "ZHMgdG8gYmUgYWRkZWQuIA=" },
00919 { " We want good tes", "IFdlIHdhbnQgZ29vZCB0ZXM=" },
00920 { "ting, don't we? T", "dGluZywgZG9uJ3Qgd2U/ICBU=" },
00921 { "he longer the text ", "aGUgbG9uZ2VyIHRoZSB0ZXh0IA=" },
00922 { "the lesser the chanc", "dGhlIGxlc3NlciB0aGUgY2hhbmM=" },
00923 { "e that things are wro", "ZSB0aGF0IHRoaW5ncyBhcmUgd3Jv=" },
00924 { "ng. Okay, that should", "bmcuICBPa2F5LCB0aGF0IHNob3VsZA=" },
00925 { " be enough now, blah bl", "IGJlIGVub3VnaCBub3csIGJsYWggYmw=" },
00926 { "ah blah blah blah blah..", "YWggYmxhaCBibGFoIGJsYWggYmxhaC4u=" },
00927 { NULL, NULL }
00928 };
00929
00930
00931 static int do_test_base64()
00932 {
00933 int fail=0;
00934 int ntests=0;
00935
00936 fprintf(stderr,"Testing base64");
00937
00938
00939
00940 for(size_t len=1; len<2048; len++)
00941 {
00942 char data[len+1];
00943 FillRandom(data,len);
00944 data[len]='\0';
00945
00946 fail+=base64_ctest(data);
00947 ++ntests;
00948 if(!fail && !(len%128))
00949 { fprintf(stderr,"."); }
00950 }
00951 if(fail)
00952 {
00953 fprintf(stderr," *** FAILED!! (%d errors)\n",fail);
00954 return(1);
00955 }
00956
00957
00958 for(Base64_TEST *ts=base64_test; ts->txt; ts++,ntests++)
00959 {
00960 size_t inlen=strlen(ts->txt);
00961 size_t outlen=inlen*4/3+4;
00962 char enc[outlen+1];
00963
00964 ssize_t rv=Base64Encoder::EncodeBuf(ts->txt,inlen,enc,outlen,0);
00965 if(rv<0)
00966 {
00967 fprintf(stderr,"Base64Decode(%u)=%d\n",inlen,rv);
00968 ++fail;
00969 continue;
00970 }
00971 CritAssert(rv<ssize_t(outlen));
00972 enc[rv]='\0';
00973
00974 int thisfail=0;
00975 if(ssize_t(strlen(ts->res))!=rv)
00976 {
00977 fprintf(stderr,"Length mismatch %d != %d (%u)\n",
00978 rv,strlen(ts->res),inlen);
00979 ++thisfail;
00980 }
00981 else if(strcmp(ts->res,enc))
00982 {
00983 fprintf(stderr,"Wrong result (inlen=%u)\n",inlen);
00984 ++thisfail;
00985 }
00986 if(thisfail)
00987 {
00988 fprintf(stderr,
00989 "Test string: \"%s\"\n"
00990 "Result: \"%s\"\n"
00991 "Expecred: \"%s\"\n",
00992 ts->txt,enc,ts->res);
00993 ++fail;
00994 }
00995 }
00996 if(fail)
00997 {
00998 fprintf(stderr," ***FAILED!! (%d errors)\n",fail);
00999 return(1);
01000 }
01001
01002 fprintf(stderr,". passed (%d)\n",ntests);
01003 return(0);
01004 }
01005
01006
01007 char *prg_name="test_crypto";
01008
01009 int main()
01010 {
01011 fprintf(stderr,"TESTING CRYPTO:\n");
01012 int failed=0;
01013
01014 HTime t(HTime::Curr);
01015 srandom(t.Get(HTime::seconds));
01016
01017 failed+=do_test_blowfish();
01018 failed+=do_test_twofish();
01019
01020 failed+=do_test_rmd160();
01021 failed+=do_test_sha0();
01022 failed+=do_test_sha1();
01023 failed+=do_test_crc32();
01024
01025 failed+=do_test_base64();
01026
01027 if(failed)
01028 { fprintf(stderr,"*** ERRORS. TESTS FAILED.\n"); }
01029 else
01030 { fprintf(stderr,"ALL TESTS PASSED SUCCESSFULLY.\n"); }
01031
01032 return(failed ? 1 :0);
01033 }