Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

/ray/src/lib/crypto/check_crypto.cc

Go to the documentation of this file.
00001 /*
00002  * check_crypto.cc
00003  * 
00004  * Small test program to check crypto routines. 
00005  * 
00006  * Copyright (c) 2002---2004 by Wolfgang Wieser ] wwieser (a) gmx <*> de [ 
00007  * 
00008  * This file may be distributed and/or modified under the terms of the 
00009  * GNU General Public License version 2 as published by the Free Software 
00010  * Foundation. (See COPYING.GPL for details.)
00011  * 
00012  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00013  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
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 /* BLOWFISH */
00055 struct BlowfishTEST
00056 {
00057     char *key;
00058     char *txt;
00059     char *res;
00060 } blowfish_tst[]=
00061 {
00062     // These are the original test vectors (no need to do any 
00063     // byte swapping, etc. 
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     // Original set_key test stuff for keylength 8,16,24: 
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 /* TWOFISH */
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         //fprintf(stderr,"%s\n%s\n\n",tst[t].res,res);
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 // mat_res: one-million-a - test result
00625 static int test_hash(SecureHashBase *sh,const char *mat_res,HASH_TEST *test)
00626 {
00627     // Do the "1 million `aŽ-test": 
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     //fprintf(stderr,"%02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x  ",
00656     //  hash[0],hash[1],hash[2],hash[3],
00657     //  hash[4],hash[5],hash[6],hash[7],
00658     //  hash[8],hash[9],hash[10],hash[11],
00659     //  hash[12],hash[13],hash[14],hash[15],
00660     //  hash[16],hash[17],hash[18],hash[19]);
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;  // one-million-a-test
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 /* RMD160 */
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 /* SHA0 */
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 /* SHA1 */
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 /* CRC32 */
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 // BASE64: 
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;  // second half for inserted '\n'
00828     char enc[outlen];
00829     
00830     // Encode it: 
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     // Decode it: 
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     // Compare...
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     // First, check if some data when encoded and decoded is the same again: 
00939     // Run a test for different data lengths: 
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     // Next, check if the output is correct: 
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 }

Generated on Sat Feb 19 22:33:45 2005 for Ray by doxygen 1.3.5