ADM.inc 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. /**********************************************************************************************************************************
  2. * *
  3. * )( ADM Encryption File )( *
  4. * *
  5. * Copyright © 2017 Abyss Morgan. All rights reserved. *
  6. * *
  7. * Download: https://github.com/AbyssMorgan/SA-MP/tree/master/include/SAM *
  8. * Publication: http://forum.sa-mp.com/showthread.php?t=595203 *
  9. * Website: http://8.ct8.pl *
  10. * *
  11. * Plugins: SScanf *
  12. * Modules: MD5 *
  13. * *
  14. * File Version: 2.3.0 *
  15. * SA:MP Version: 0.3.7 *
  16. * SScanf Version: 2.8.2 *
  17. * *
  18. * File Functions: *
  19. * ADM:InvertFile(const input[], const output[]); *
  20. * ADM:HexNegativeFile(const input[], const output[], key[]); *
  21. * ADM:RollXFile(const input[], const output[], key[]); *
  22. * ADM:ADMx32(const input[], const output[], key[]); *
  23. * ADM:ADMx64(const input[], const output[], key[]); *
  24. * ADM:ADMx128(const input[], const output[], key[]); *
  25. * ADM:ADMx256(const input[], const output[], key[]); *
  26. * ADM:ADMx512(const input[], const output[], password[], bool:invertpassword = false); *
  27. * ADM:MergeFile(const first_file[],const second_file[],bool:erase_second=false); *
  28. * ADM:MergeFileGroup(const group_name[],const output[],upperbound_index,bool:erase_input=false); *
  29. * ADM:SplitFile(const input[],const output[],max_size,&upperbound_index=0); *
  30. * *
  31. * String Functions: *
  32. * ADM:InvertString(input[], output[], maxdest = sizeof(output)); *
  33. * ADM:HexNegativeString(input[], output[], key[], maxdest = sizeof(output)); *
  34. * ADM:RollXString(input[], output[], key[], maxdest = sizeof(output)); *
  35. * ADM:ADMx32String(input[], output[], key[], maxdest = sizeof(output)); *
  36. * ADM:ADMx64String(input[], output[], key[], maxdest = sizeof(output)); *
  37. * ADM:ADMx128String(input[], output[], key[], maxdest = sizeof(output)); *
  38. * ADM:ADMx256String(input[], output[], key[], maxdest = sizeof(output)); *
  39. * ADM:ADMx512String(input[], output[], password[], bool:invertpassword = false, maxdest = sizeof(output)); *
  40. * ADM:StringToHexString(input[], output[], maxdest = sizeof(output)); *
  41. * ADM:HexStringToString(input[], output[], maxdest = sizeof(output)); *
  42. * *
  43. * Dump Functions: *
  44. * DMP:FindFreeDumpFileID(); *
  45. * GetDumpFileType(const name[]); *
  46. * bool:IsDumpFileOpen(DMP:index); *
  47. * bool:IsValidDumpFile(const name[]); *
  48. * DMP:DumpFileCreate(const name[], key[], type = KEY_TYPE_ADMx32); *
  49. * bool:DumpFileDestroy(&DMP:index); *
  50. * DMP:DumpFileOpen(const name[], key[], type = KEY_TYPE_ADMx32); *
  51. * bool:DumpFileClose(&DMP:index); *
  52. * ADM:DumpFileWrite(DMP:index, string[]); *
  53. * bool:IsDumpFileEmpty(const name[]); *
  54. * DMPToInt(DMP:dmpvar); *
  55. * *
  56. * Extended Functions: *
  57. * ADM_fcreate(const name[]); *
  58. * ADMToInt(ADM:admvar); *
  59. * bool:IsValidADMKey(key[], type); *
  60. * GetADMKeyType(key[], bool:distorted = false); *
  61. * GetADMErrorName(ADM:code); *
  62. * ADM:DecodeADMKey(inputkey[], outputkey[], type, maxdest = sizeof(outputkey)); *
  63. * ADM:CreateADMKey(key[], type, maxdest = sizeof(key)); *
  64. * *
  65. * Return value: *
  66. * ERROR_CODE_ADM_UNEXEC //Function unexecutable *
  67. * ERROR_CODE_ADM_OK //Success *
  68. * ERROR_CODE_ADM_INPUT //Input file not exist *
  69. * ERROR_CODE_ADM_OUTPUT //Output file exist *
  70. * ERROR_CODE_ADM_KEY //Invalid key *
  71. * ERROR_CODE_ADM_SIZE //Invalid file size *
  72. * ERROR_CODE_ADM_DEST //Destination size *
  73. * ERROR_CODE_ADM_OPEN_INPUT //Open input file *
  74. * ERROR_CODE_ADM_OPEN_OUTPUT //Open output file *
  75. * ERROR_CODE_ADM_INVALID_TYPE //Invalid key type *
  76. * ERROR_CODE_ADM_PASSWORD //Invalid password len *
  77. * ERROR_CODE_ADM_MD5 //Invalid MD5 Load *
  78. * ERROR_CODE_ADM_DMP_NAME //Invalid dump file name *
  79. * ERROR_CODE_ADM_DMP_IDX //Invalid dump file index *
  80. * *
  81. * Key Generator: *
  82. * http://8.ct8.pl/admkg *
  83. * *
  84. **********************************************************************************************************************************/
  85. /*
  86. //Check Version ADM.inc
  87. #if !defined _adm_encryption
  88. #error [ADM] You need ADM.inc v2.3.0
  89. #elseif !defined ADM_Encryption_Version
  90. #error [ADM] Update you ADM.inc to v2.3.0
  91. #elseif (ADM_Encryption_Version < 20300)
  92. #error [ADM] Update you ADM.inc to v2.3.0
  93. #endif
  94. */
  95. #if defined _adm_encryption
  96. #endinput
  97. #endif
  98. #define _adm_encryption
  99. #define ADM_Encryption_Version (20300) //a.b.c 10000*a+100*b+c
  100. #if !defined sscanf
  101. #error [ADM] You need SScanf v2.8.2 (github.com/AbyssMorgan/SA-MP/tree/master/plugins)
  102. #endif
  103. #define ADM_Function:: stock
  104. #define ADM:: ADM:
  105. #define DMP:: DMP:
  106. #define DUMP DMP
  107. #define MAX_FILE_SIZE (68157440) //64 MB
  108. #define KEY_TYPE_UNKNOWN (0)
  109. #define KEY_TYPE_HEXNEGATIVE (4)
  110. #define KEY_TYPE_ROLLX (8)
  111. #define KEY_TYPE_ADMx32 (32)
  112. #define KEY_TYPE_ADMx64 (64)
  113. #define KEY_TYPE_ADMx128 (128)
  114. #define KEY_TYPE_ADMx256 (256)
  115. #define MAX_MODE_ADMx32 (4)
  116. #define MAX_MODE_ADMx64 (8)
  117. #define MAX_MODE_ADMx128 (16)
  118. #define MAX_MODE_ADMx256 (32)
  119. #define MAX_MODE_ADMx512 (64)
  120. #define MAX_KEY_LEN_HEXNEGATIVE (4)
  121. #define MAX_KEY_LEN_ROLLX (4)
  122. #define MAX_KEY_LEN_ADMx32 (16)
  123. #define MAX_KEY_LEN_ADMx64 (32)
  124. #define MAX_KEY_LEN_ADMx128 (64)
  125. #define MAX_KEY_LEN_ADMx256 (128)
  126. #define MAX_KEY_LEN_ADMx512 (36)
  127. #define MAX_LEN_BINARY_ADMx512 (20)
  128. #define ERROR_CODE_ADM_UNEXEC (ADM:0) //function unexecutable
  129. #define ERROR_CODE_ADM_OK (ADM:1) //success
  130. #define ERROR_CODE_ADM_INPUT (ADM:-1) //input file not exist
  131. #define ERROR_CODE_ADM_OUTPUT (ADM:-2) //output file exist
  132. #define ERROR_CODE_ADM_KEY (ADM:-3) //invalid key
  133. #define ERROR_CODE_ADM_SIZE (ADM:-4) //invalid file size
  134. #define ERROR_CODE_ADM_DEST (ADM:-5) //error destination size
  135. #define ERROR_CODE_ADM_OPEN_INPUT (ADM:-6) //error open input file
  136. #define ERROR_CODE_ADM_OPEN_OUTPUT (ADM:-7) //error open output file
  137. #define ERROR_CODE_ADM_INVALID_TYPE (ADM:-8) //invalid key type
  138. #define ERROR_CODE_ADM_PASSWORD (ADM:-9) //invalid password length
  139. #define ERROR_CODE_ADM_MD5 (ADM:-10) //invalid MD5 Load
  140. #define ERROR_CODE_ADM_DMP_NAME (ADM:-11) //invalid dump file name
  141. #define ERROR_CODE_ADM_DMP_IDX (ADM:-12) //invalid dump file index
  142. #if !defined MAX_DUMP_FILE
  143. #define MAX_DUMP_FILE (DMP:100)
  144. #endif
  145. #define MAX_DUMP_FILE_NAME (80)
  146. #define MAX_DUMP_HEADER_SIZE (14)
  147. #define INVALID_DUMP_FILE (DMP:-1)
  148. #define DUMP_HEADER_x32 "SAMP_DUMPx32 "
  149. #define DUMP_HEADER_x64 "SAMP_DUMPx64 "
  150. #define DUMP_HEADER_x128 "SAMP_DUMPx128 "
  151. #define DUMP_HEADER_x256 "SAMP_DUMPx256 "
  152. new ADMErrorList[][] = {
  153. "Success", //1
  154. "Function unexecutable", //0
  155. "Input file not exist", //-1
  156. "Output file exist", //-2
  157. "Invalid key", //-3
  158. "Invalid file size", //-4
  159. "Destination size", //-5
  160. "Open input file", //-6
  161. "Open output file", //-7
  162. "Invalid key type", //-8
  163. "Invalid password len", //-9
  164. "Invalid MD5 Load", //-10
  165. "Invalid dump file name", //-11
  166. "Invalid dump file index" //-12
  167. };
  168. #define GetADMErrorName(%0) ADMErrorList[(((_:(%0))*-1)+1)]
  169. #pragma unused ADMErrorList
  170. #if !defined isnull
  171. #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  172. #endif
  173. new bool:DumpFileStatus[MAX_DUMP_FILE] = false,
  174. DumpFileType[MAX_DUMP_FILE],
  175. DumpFileName[MAX_DUMP_FILE][MAX_DUMP_FILE_NAME],
  176. DumpFileKey[MAX_DUMP_FILE][MAX_KEY_LEN_ADMx256];
  177. /************************************************************************************************************************************
  178. * *
  179. * Extended Functions *
  180. * *
  181. ************************************************************************************************************************************/
  182. //Remove ADM: tag
  183. #define ADMToInt(%0) (_:%0)
  184. //Remove DMP: tag
  185. #define DMPToInt(%0) (_:%0)
  186. ADM_Function:: ADM_fcreate(const name[]){
  187. if(!fexist(name)){
  188. new File:cfile = fopen(name,io_readwrite);
  189. fwrite(cfile,"");
  190. fclose(cfile);
  191. return 1;
  192. }
  193. return 0;
  194. }
  195. ADM_Function:: bool:IsValidADMKey(key[], type){
  196. switch(type){
  197. case KEY_TYPE_HEXNEGATIVE: {
  198. new mode;
  199. sscanf(key,"D(0)",mode);
  200. if(mode < 1 || mode > 15){
  201. return false;
  202. }
  203. }
  204. case KEY_TYPE_ROLLX: {
  205. new mode;
  206. sscanf(key,"D(0)",mode);
  207. if(mode < 1 || mode > 255){
  208. return false;
  209. }
  210. }
  211. case KEY_TYPE_ADMx32: {
  212. new mode[MAX_MODE_ADMx32];
  213. sscanf(key,"D(0)D(0)D(0)D(0)",
  214. mode[0],mode[1],mode[2],mode[3]
  215. );
  216. for(new i = 0; i < MAX_MODE_ADMx32; i++){
  217. if(mode[i] < 1 || mode[i] > 255){
  218. return false;
  219. }
  220. }
  221. }
  222. case KEY_TYPE_ADMx64: {
  223. new mode[MAX_MODE_ADMx64];
  224. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  225. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]
  226. );
  227. for(new i = 0; i < MAX_MODE_ADMx64; i++){
  228. if(mode[i] < 1 || mode[i] > 255){
  229. return false;
  230. }
  231. }
  232. }
  233. case KEY_TYPE_ADMx128: {
  234. new mode[MAX_MODE_ADMx128];
  235. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  236. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  237. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15]
  238. );
  239. for(new i = 0; i < MAX_MODE_ADMx128; i++){
  240. if(mode[i] < 1 || mode[i] > 255){
  241. return false;
  242. }
  243. }
  244. }
  245. case KEY_TYPE_ADMx256: {
  246. new mode[MAX_MODE_ADMx256];
  247. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  248. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  249. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  250. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  251. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  252. );
  253. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  254. if(mode[i] < 1 || mode[i] > 255){
  255. return false;
  256. }
  257. }
  258. }
  259. default: return false;
  260. }
  261. return true;
  262. }
  263. ADM_Function:: GetADMKeyType(key[], bool:distorted = false){
  264. new mode[MAX_MODE_ADMx256], cnt = 0;
  265. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  266. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  267. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  268. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  269. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  270. );
  271. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  272. if(mode[i] >= 1 && mode[i] <= 255){
  273. cnt++;
  274. }
  275. }
  276. switch(cnt){
  277. case 1: {
  278. if(mode[0] >= 1 && mode[0] <= 15){
  279. return KEY_TYPE_HEXNEGATIVE;
  280. }
  281. if(mode[0] >= 1 && mode[0] <= 255){
  282. return KEY_TYPE_ROLLX;
  283. }
  284. }
  285. case MAX_MODE_ADMx32: return KEY_TYPE_ADMx32;
  286. case MAX_MODE_ADMx64: return KEY_TYPE_ADMx64;
  287. case MAX_MODE_ADMx128: return KEY_TYPE_ADMx128;
  288. case MAX_MODE_ADMx256: return KEY_TYPE_ADMx256;
  289. }
  290. if(distorted){
  291. return (cnt*8); //returns the number of key bits
  292. } else {
  293. return KEY_TYPE_UNKNOWN;
  294. }
  295. }
  296. ADM_Function:: ADM:DecodeADMKey(inputkey[], outputkey[], type, maxdest = sizeof(outputkey)){
  297. switch(type){
  298. case KEY_TYPE_HEXNEGATIVE: {
  299. if(maxdest < MAX_KEY_LEN_HEXNEGATIVE) return ERROR_CODE_ADM_DEST;
  300. new mode;
  301. sscanf(inputkey,"D(0)",mode);
  302. if(mode < 1 || mode > 15){
  303. outputkey[0] = EOS;
  304. return ERROR_CODE_ADM_KEY;
  305. } else {
  306. format(outputkey,maxdest,"%d",(0xF & (16-mode)));
  307. }
  308. }
  309. case KEY_TYPE_ROLLX: {
  310. if(maxdest < MAX_KEY_LEN_ROLLX) return ERROR_CODE_ADM_DEST;
  311. new mode;
  312. sscanf(inputkey,"D(0)",mode);
  313. if(mode < 1 || mode > 255){
  314. outputkey[0] = EOS;
  315. return ERROR_CODE_ADM_KEY;
  316. } else {
  317. format(outputkey,maxdest,"%d",(0xFF & (256-mode)));
  318. }
  319. }
  320. case KEY_TYPE_ADMx32: {
  321. if(maxdest < MAX_KEY_LEN_ADMx32) return ERROR_CODE_ADM_DEST;
  322. new mode[MAX_MODE_ADMx32];
  323. sscanf(inputkey,"D(0)D(0)D(0)D(0)",
  324. mode[0],mode[1],mode[2],mode[3]
  325. );
  326. for(new i = 0; i < MAX_MODE_ADMx32; i++){
  327. if(mode[i] < 1 || mode[i] > 255){
  328. outputkey[0] = EOS;
  329. return ERROR_CODE_ADM_KEY;
  330. } else {
  331. if(i == 0){
  332. format(outputkey,maxdest,"%d",(0xFF & (256-mode[i])));
  333. } else {
  334. format(outputkey,maxdest,"%s %d",outputkey,(0xFF & (256-mode[i])));
  335. }
  336. }
  337. }
  338. }
  339. case KEY_TYPE_ADMx64: {
  340. if(maxdest < MAX_KEY_LEN_ADMx64) return ERROR_CODE_ADM_DEST;
  341. new mode[MAX_MODE_ADMx64];
  342. sscanf(inputkey,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  343. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]
  344. );
  345. for(new i = 0; i < MAX_MODE_ADMx64; i++){
  346. if(mode[i] < 1 || mode[i] > 255){
  347. outputkey[0] = EOS;
  348. return ERROR_CODE_ADM_KEY;
  349. } else {
  350. if(i == 0){
  351. format(outputkey,maxdest,"%d",(0xFF & (256-mode[i])));
  352. } else {
  353. format(outputkey,maxdest,"%s %d",outputkey,(0xFF & (256-mode[i])));
  354. }
  355. }
  356. }
  357. }
  358. case KEY_TYPE_ADMx128: {
  359. if(maxdest < MAX_KEY_LEN_ADMx128) return ERROR_CODE_ADM_DEST;
  360. new mode[MAX_MODE_ADMx128];
  361. sscanf(inputkey,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  362. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  363. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15]
  364. );
  365. for(new i = 0; i < MAX_MODE_ADMx128; i++){
  366. if(mode[i] < 1 || mode[i] > 255){
  367. outputkey[0] = EOS;
  368. return ERROR_CODE_ADM_KEY;
  369. } else {
  370. if(i == 0){
  371. format(outputkey,maxdest,"%d",(0xFF & (256-mode[i])));
  372. } else {
  373. format(outputkey,maxdest,"%s %d",outputkey,(0xFF & (256-mode[i])));
  374. }
  375. }
  376. }
  377. }
  378. case KEY_TYPE_ADMx256: {
  379. if(maxdest < MAX_KEY_LEN_ADMx256) return ERROR_CODE_ADM_DEST;
  380. new mode[MAX_MODE_ADMx256];
  381. sscanf(inputkey,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  382. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  383. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  384. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  385. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  386. );
  387. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  388. if(mode[i] < 1 || mode[i] > 255){
  389. outputkey[0] = EOS;
  390. return ERROR_CODE_ADM_KEY;
  391. } else {
  392. if(i == 0){
  393. format(outputkey,maxdest,"%d",(0xFF & (256-mode[i])));
  394. } else {
  395. format(outputkey,maxdest,"%s %d",outputkey,(0xFF & (256-mode[i])));
  396. }
  397. }
  398. }
  399. }
  400. default: return ERROR_CODE_ADM_INVALID_TYPE;
  401. }
  402. return ERROR_CODE_ADM_OK;
  403. }
  404. ADM_Function:: ADM:CreateADMKey(key[], type, maxdest = sizeof(key)){
  405. switch(type){
  406. case KEY_TYPE_HEXNEGATIVE: {
  407. if(maxdest < MAX_KEY_LEN_HEXNEGATIVE) return ERROR_CODE_ADM_DEST;
  408. format(key,maxdest,"%d",random(15)+1);
  409. }
  410. case KEY_TYPE_ROLLX: {
  411. if(maxdest < MAX_KEY_LEN_ROLLX) return ERROR_CODE_ADM_DEST;
  412. format(key,maxdest,"%d",random(255)+1);
  413. }
  414. case KEY_TYPE_ADMx32: {
  415. if(maxdest < MAX_KEY_LEN_ADMx32) return ERROR_CODE_ADM_DEST;
  416. for(new i = 0; i < MAX_MODE_ADMx32; i++){
  417. if(i == 0){
  418. format(key,maxdest,"%d",random(255)+1);
  419. } else {
  420. format(key,maxdest,"%s %d",key,random(255)+1);
  421. }
  422. }
  423. }
  424. case KEY_TYPE_ADMx64: {
  425. if(maxdest < MAX_KEY_LEN_ADMx64) return ERROR_CODE_ADM_DEST;
  426. for(new i = 0; i < MAX_MODE_ADMx64; i++){
  427. if(i == 0){
  428. format(key,maxdest,"%d",random(255)+1);
  429. } else {
  430. format(key,maxdest,"%s %d",key,random(255)+1);
  431. }
  432. }
  433. }
  434. case KEY_TYPE_ADMx128: {
  435. if(maxdest < MAX_KEY_LEN_ADMx128) return ERROR_CODE_ADM_DEST;
  436. for(new i = 0; i < MAX_MODE_ADMx128; i++){
  437. if(i == 0){
  438. format(key,maxdest,"%d",random(255)+1);
  439. } else {
  440. format(key,maxdest,"%s %d",key,random(255)+1);
  441. }
  442. }
  443. }
  444. case KEY_TYPE_ADMx256: {
  445. if(maxdest < MAX_KEY_LEN_ADMx256) return ERROR_CODE_ADM_DEST;
  446. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  447. if(i == 0){
  448. format(key,maxdest,"%d",random(255)+1);
  449. } else {
  450. format(key,maxdest,"%s %d",key,random(255)+1);
  451. }
  452. }
  453. }
  454. default: return ERROR_CODE_ADM_INVALID_TYPE;
  455. }
  456. return ERROR_CODE_ADM_OK;
  457. }
  458. /************************************************************************************************************************************
  459. * *
  460. * String Functions *
  461. * *
  462. ************************************************************************************************************************************/
  463. ADM_Function:: ADM:StringToHexString(input[], output[], maxdest = sizeof(output)){
  464. new asize = strlen(input), offset = 0;
  465. if((asize*2) > maxdest) return ERROR_CODE_ADM_DEST;
  466. for(new i = 0; i < asize; i++){
  467. output[offset] = (0xF & (input[i] >> 4));
  468. if(output[offset] < 10){
  469. output[offset] += 48;
  470. } else {
  471. output[offset] += 55;
  472. }
  473. output[offset+1] = (0xF & input[i]);
  474. if(output[offset+1] < 10){
  475. output[offset+1] += 48;
  476. } else {
  477. output[offset+1] += 55;
  478. }
  479. offset += 2;
  480. }
  481. output[asize*2] = EOS;
  482. return ERROR_CODE_ADM_OK;
  483. }
  484. ADM_Function:: ADM:HexStringToString(input[], output[], maxdest = sizeof(output)){
  485. new asize = (strlen(input)/2), offset = 0, unit[2];
  486. if(asize > maxdest) return ERROR_CODE_ADM_DEST;
  487. for(new i = 0; i < asize; i++){
  488. if(input[offset] >= 97){
  489. unit[0] = (input[offset]-87);
  490. } else if(input[offset] < 58){
  491. unit[0] = (input[offset]-48);
  492. } else {
  493. unit[0] = (input[offset]-55);
  494. }
  495. if(input[offset+1] >= 97){
  496. unit[1] = (input[offset+1]-87);
  497. } else if(input[offset+1] < 58){
  498. unit[1] = (input[offset+1]-48);
  499. } else {
  500. unit[1] = (input[offset+1]-55);
  501. }
  502. output[i] = (unit[0]*16)+unit[1];
  503. offset += 2;
  504. }
  505. output[asize] = EOS;
  506. return ERROR_CODE_ADM_OK;
  507. }
  508. ADM_Function:: ADM:InvertString(input[], output[], maxdest = sizeof(output)){
  509. new asize = strlen(input);
  510. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  511. for(new i = 0; i < asize; i++){
  512. output[i] = (input[i] ^ 0xFF);
  513. }
  514. output[asize] = EOS;
  515. return ERROR_CODE_ADM_OK;
  516. }
  517. ADM_Function:: ADM:HexNegativeString(input[], output[], key[], maxdest = sizeof(output)){
  518. new mode;
  519. sscanf(key,"D(0)",mode);
  520. if(mode < 1 || mode > 15) return ERROR_CODE_ADM_KEY;
  521. new asize = strlen(input);
  522. if(asize > maxdest) return ERROR_CODE_ADM_DEST;
  523. for(new i = 0; i < asize; i++){
  524. output[i] = (((0xF & ((input[i] >> 4)+mode))*16) + (0xF & ((input[i] & 0xF)+mode)));
  525. }
  526. output[asize] = EOS;
  527. return ERROR_CODE_ADM_OK;
  528. }
  529. ADM_Function:: ADM:RollXString(input[], output[], key[], maxdest = sizeof(output)){
  530. new mode;
  531. sscanf(key,"D(0)",mode);
  532. if(mode < 1 || mode > 255) return ERROR_CODE_ADM_KEY;
  533. new asize = strlen(input);
  534. if(asize > maxdest) return ERROR_CODE_ADM_DEST;
  535. for(new i = 0; i < asize; i++){
  536. output[i] = (0xFF & (input[i]+mode));
  537. }
  538. output[strlen(input)] = EOS;
  539. return ERROR_CODE_ADM_OK;
  540. }
  541. ADM_Function:: ADM:ADMx32String(input[], output[], key[], maxdest = sizeof(output)){
  542. new asize = strlen(input);
  543. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  544. new mode[MAX_MODE_ADMx32];
  545. sscanf(key,"D(0)D(0)D(0)D(0)",
  546. mode[0],mode[1],mode[2],mode[3]
  547. );
  548. for(new i = 0; i < MAX_MODE_ADMx32; i++){
  549. if(mode[i] < 1 || mode[i] > 255){
  550. return ERROR_CODE_ADM_KEY;
  551. }
  552. }
  553. new s = 0;
  554. for(new i = 0; i < asize; i++){
  555. output[i] = ((input[i]+mode[s]) & 0xFF);
  556. s++;
  557. if(s >= MAX_MODE_ADMx32) s = 0;
  558. }
  559. output[asize] = EOS;
  560. return ERROR_CODE_ADM_OK;
  561. }
  562. ADM_Function:: ADM:ADMx64String(input[], output[], key[], maxdest = sizeof(output)){
  563. new asize = strlen(input);
  564. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  565. new mode[MAX_MODE_ADMx64];
  566. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  567. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]
  568. );
  569. for(new i = 0; i < MAX_MODE_ADMx64; i++){
  570. if(mode[i] < 1 || mode[i] > 255){
  571. return ERROR_CODE_ADM_KEY;
  572. }
  573. }
  574. new s = 0;
  575. for(new i = 0; i < asize; i++){
  576. output[i] = ((input[i]+mode[s]) & 0xFF);
  577. s++;
  578. if(s >= MAX_MODE_ADMx64) s = 0;
  579. }
  580. output[asize] = EOS;
  581. return ERROR_CODE_ADM_OK;
  582. }
  583. ADM_Function:: ADM:ADMx128String(input[], output[], key[], maxdest = sizeof(output)){
  584. new asize = strlen(input);
  585. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  586. new mode[MAX_MODE_ADMx128];
  587. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  588. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  589. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15]
  590. );
  591. for(new i = 0; i < MAX_MODE_ADMx128; i++){
  592. if(mode[i] < 1 || mode[i] > 255){
  593. return ERROR_CODE_ADM_KEY;
  594. }
  595. }
  596. new s = 0;
  597. for(new i = 0; i < asize; i++){
  598. output[i] = ((input[i]+mode[s]) & 0xFF);
  599. s++;
  600. if(s >= MAX_MODE_ADMx128) s = 0;
  601. }
  602. output[asize] = EOS;
  603. return ERROR_CODE_ADM_OK;
  604. }
  605. ADM_Function:: ADM:ADMx256String(input[], output[], key[], maxdest = sizeof(output)){
  606. new asize = strlen(input);
  607. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  608. new mode[MAX_MODE_ADMx256];
  609. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  610. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  611. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  612. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  613. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  614. );
  615. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  616. if(mode[i] < 1 || mode[i] > 255){
  617. return ERROR_CODE_ADM_KEY;
  618. }
  619. }
  620. new s = 0;
  621. for(new i = 0; i < asize; i++){
  622. output[i] = ((input[i]+mode[s]) & 0xFF);
  623. s++;
  624. if(s >= MAX_MODE_ADMx256) s = 0;
  625. }
  626. output[asize] = EOS;
  627. return ERROR_CODE_ADM_OK;
  628. }
  629. #if defined MD5_Hash
  630. ADM_Function:: ADM:ADMx512String(input[], output[], password[], bool:invertpassword = false, maxdest = sizeof(output)){
  631. new asize = strlen(input);
  632. if(maxdest < asize) return ERROR_CODE_ADM_DEST;
  633. new psize = strlen(password);
  634. if(psize < 1 || psize > 255) return ERROR_CODE_ADM_PASSWORD;
  635. new mode[MAX_MODE_ADMx512],
  636. hash[MAX_KEY_LEN_ADMx512],
  637. BinKeyAlfa[MAX_LEN_BINARY_ADMx512],
  638. BinKeyBeta[MAX_LEN_BINARY_ADMx512],
  639. BinKeyGamma[MAX_LEN_BINARY_ADMx512],
  640. BinKeyDelta[MAX_LEN_BINARY_ADMx512];
  641. //Create Bin Key Alfa
  642. format(hash,sizeof(hash),"%s",MD5_Hash(password));
  643. HexStringToString(hash,BinKeyAlfa);
  644. //Create Bin Key Beta
  645. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  646. BinKeyBeta[i] = (BinKeyAlfa[i] ^ 0xFF);
  647. }
  648. //Create Bin Key Gamma
  649. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  650. BinKeyGamma[i] = (((0xF & ((BinKeyAlfa[i] >> 4)+8))*16) + (0xF & ((BinKeyAlfa[i] & 0xF)+8)));
  651. }
  652. //Create Bin Key Delta
  653. for(new i = 0, j = strlen(BinKeyBeta); i < j; i++){
  654. BinKeyDelta[i] = (((0xF & ((BinKeyBeta[i] >> 4)+8))*16) + (0xF & ((BinKeyBeta[i] & 0xF)+8)));
  655. }
  656. //Decode password
  657. if(invertpassword){
  658. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  659. BinKeyAlfa[i] = (0xFF & (256-BinKeyAlfa[i]));
  660. BinKeyBeta[i] = (0xFF & (256-BinKeyBeta[i]));
  661. BinKeyGamma[i] = (0xFF & (256-BinKeyGamma[i]));
  662. BinKeyDelta[i] = (0xFF & (256-BinKeyDelta[i]));
  663. }
  664. }
  665. //Allocate key address
  666. new tid = 0;
  667. for(new i = 0; i < MAX_MODE_ADMx512; i++){
  668. switch(i % 8){
  669. case 0: mode[i] = BinKeyAlfa[tid];
  670. case 1: mode[i] = BinKeyGamma[tid];
  671. case 2: mode[i] = BinKeyBeta[tid];
  672. case 3: mode[i] = BinKeyDelta[tid];
  673. case 4: mode[i] = BinKeyGamma[tid];
  674. case 5: mode[i] = BinKeyBeta[tid];
  675. case 6: mode[i] = BinKeyAlfa[tid];
  676. case 7: mode[i] = BinKeyDelta[tid];
  677. }
  678. if((i+1) % 8 == 0) tid++;
  679. }
  680. new s = 0;
  681. for(new i = 0; i < asize; i++){
  682. output[i] = ((input[i]+mode[s]) & 0xFF);
  683. s++;
  684. if(s >= MAX_MODE_ADMx512) s = 0;
  685. }
  686. output[asize] = EOS;
  687. return ERROR_CODE_ADM_OK;
  688. }
  689. #else
  690. ADM_Function:: ADM:ADMx512String(input[], output[], password[], bool:invertpassword = false, maxdest = sizeof(output)){
  691. #pragma unused input, output, password, invertpassword, maxdest
  692. return ERROR_CODE_ADM_MD5;
  693. }
  694. #endif
  695. /************************************************************************************************************************************
  696. * *
  697. * File Functions *
  698. * *
  699. ************************************************************************************************************************************/
  700. ADM_Function:: ADM:InvertFile(const input[], const output[]){
  701. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  702. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  703. new File:inpf = fopen(input,io_read);
  704. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  705. new asize = flength(inpf), idx = 0;
  706. if(asize > MAX_FILE_SIZE || asize < 0){
  707. fclose(inpf);
  708. return ERROR_CODE_ADM_SIZE;
  709. }
  710. new File:outf = fopen(output,io_write);
  711. if(!outf){
  712. fclose(inpf);
  713. return ERROR_CODE_ADM_OPEN_OUTPUT;
  714. }
  715. while(idx < asize){
  716. fputchar(outf,(fgetchar(inpf,0,false) ^ 0xFF),false);
  717. idx++;
  718. }
  719. fclose(inpf);
  720. fclose(outf);
  721. return ERROR_CODE_ADM_OK;
  722. }
  723. ADM_Function:: ADM:HexNegativeFile(const input[], const output[], key[]){
  724. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  725. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  726. new mode;
  727. sscanf(key,"D(0)",mode);
  728. if(mode < 1 || mode > 15) return ERROR_CODE_ADM_KEY;
  729. new File:inpf = fopen(input,io_read);
  730. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  731. new asize = flength(inpf), idx = 0;
  732. if(asize > MAX_FILE_SIZE || asize < 0){
  733. fclose(inpf);
  734. return ERROR_CODE_ADM_SIZE;
  735. }
  736. new File:outf = fopen(output,io_write);
  737. if(!outf){
  738. fclose(inpf);
  739. return ERROR_CODE_ADM_OPEN_OUTPUT;
  740. }
  741. while(idx < asize){
  742. fputchar(outf,(((0xF & ((fgetchar(inpf,0,false) >> 4)+mode))*16) + (0xF & ((fgetchar(inpf,0,false) & 0xF)+mode))),false);
  743. idx++;
  744. }
  745. fclose(inpf);
  746. fclose(outf);
  747. return ERROR_CODE_ADM_OK;
  748. }
  749. ADM_Function:: ADM:RollXFile(const input[], const output[], key[]){
  750. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  751. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  752. new mode;
  753. sscanf(key,"D(0)",mode);
  754. if(mode < 1 || mode > 255) return ERROR_CODE_ADM_KEY;
  755. new File:inpf = fopen(input,io_read);
  756. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  757. new asize = flength(inpf), idx = 0;
  758. if(asize > MAX_FILE_SIZE || asize < 0){
  759. fclose(inpf);
  760. return ERROR_CODE_ADM_SIZE;
  761. }
  762. new File:outf = fopen(output,io_write);
  763. if(!outf){
  764. fclose(inpf);
  765. return ERROR_CODE_ADM_OPEN_OUTPUT;
  766. }
  767. while(idx < asize){
  768. fputchar(outf,((fgetchar(inpf,0,false)+mode) & 0xFF),false);
  769. idx++;
  770. }
  771. fclose(inpf);
  772. fclose(outf);
  773. return ERROR_CODE_ADM_OK;
  774. }
  775. ADM_Function:: ADM:ADMx32(const input[], const output[], key[]){
  776. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  777. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  778. new mode[MAX_MODE_ADMx32];
  779. sscanf(key,"D(0)D(0)D(0)D(0)",
  780. mode[0],mode[1],mode[2],mode[3]
  781. );
  782. for(new i = 0; i < MAX_MODE_ADMx32; i++){
  783. if(mode[i] < 1 || mode[i] > 255){
  784. return ERROR_CODE_ADM_KEY;
  785. }
  786. }
  787. new File:inpf = fopen(input,io_read);
  788. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  789. new asize = flength(inpf), idx = 0, s = 0;
  790. if(asize > MAX_FILE_SIZE || asize < 0){
  791. fclose(inpf);
  792. return ERROR_CODE_ADM_SIZE;
  793. }
  794. new File:outf = fopen(output,io_write);
  795. if(!outf){
  796. fclose(inpf);
  797. return ERROR_CODE_ADM_OPEN_OUTPUT;
  798. }
  799. while(idx < asize){
  800. fputchar(outf,((fgetchar(inpf,0,false)+mode[s]) & 0xFF),false);
  801. idx++;
  802. s++;
  803. if(s >= MAX_MODE_ADMx32) s = 0;
  804. }
  805. fclose(inpf);
  806. fclose(outf);
  807. return ERROR_CODE_ADM_OK;
  808. }
  809. ADM_Function:: ADM:ADMx64(const input[], const output[], key[]){
  810. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  811. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  812. new mode[MAX_MODE_ADMx64];
  813. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  814. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]
  815. );
  816. for(new i = 0; i < MAX_MODE_ADMx64; i++){
  817. if(mode[i] < 1 || mode[i] > 255){
  818. return ERROR_CODE_ADM_KEY;
  819. }
  820. }
  821. new File:inpf = fopen(input,io_read);
  822. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  823. new asize = flength(inpf), idx = 0, s = 0;
  824. if(asize > MAX_FILE_SIZE || asize < 0){
  825. fclose(inpf);
  826. return ERROR_CODE_ADM_SIZE;
  827. }
  828. new File:outf = fopen(output,io_write);
  829. if(!outf){
  830. fclose(inpf);
  831. return ERROR_CODE_ADM_OPEN_OUTPUT;
  832. }
  833. while(idx < asize){
  834. fputchar(outf,((fgetchar(inpf,0,false)+mode[s]) & 0xFF),false);
  835. idx++;
  836. s++;
  837. if(s >= MAX_MODE_ADMx64) s = 0;
  838. }
  839. fclose(inpf);
  840. fclose(outf);
  841. return ERROR_CODE_ADM_OK;
  842. }
  843. ADM_Function:: ADM:ADMx128(const input[], const output[], key[]){
  844. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  845. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  846. new mode[MAX_MODE_ADMx128];
  847. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  848. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  849. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15]
  850. );
  851. for(new i = 0; i < MAX_MODE_ADMx128; i++){
  852. if(mode[i] < 1 || mode[i] > 255){
  853. return ERROR_CODE_ADM_KEY;
  854. }
  855. }
  856. new File:inpf = fopen(input,io_read);
  857. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  858. new asize = flength(inpf), idx = 0, s = 0;
  859. if(asize > MAX_FILE_SIZE || asize < 0){
  860. fclose(inpf);
  861. return ERROR_CODE_ADM_SIZE;
  862. }
  863. new File:outf = fopen(output,io_write);
  864. if(!outf){
  865. fclose(inpf);
  866. return ERROR_CODE_ADM_OPEN_OUTPUT;
  867. }
  868. while(idx < asize){
  869. fputchar(outf,((fgetchar(inpf,0,false)+mode[s]) & 0xFF),false);
  870. idx++;
  871. s++;
  872. if(s >= MAX_MODE_ADMx128) s = 0;
  873. }
  874. fclose(inpf);
  875. fclose(outf);
  876. return ERROR_CODE_ADM_OK;
  877. }
  878. ADM_Function:: ADM:ADMx256(const input[], const output[], key[]){
  879. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  880. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  881. new mode[MAX_MODE_ADMx256];
  882. sscanf(key,"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  883. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  884. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  885. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  886. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  887. );
  888. for(new i = 0; i < MAX_MODE_ADMx256; i++){
  889. if(mode[i] < 1 || mode[i] > 255){
  890. return ERROR_CODE_ADM_KEY;
  891. }
  892. }
  893. new File:inpf = fopen(input,io_read);
  894. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  895. new asize = flength(inpf), idx = 0, s = 0;
  896. if(asize > MAX_FILE_SIZE || asize < 0){
  897. fclose(inpf);
  898. return ERROR_CODE_ADM_SIZE;
  899. }
  900. new File:outf = fopen(output,io_write);
  901. if(!outf){
  902. fclose(inpf);
  903. return ERROR_CODE_ADM_OPEN_OUTPUT;
  904. }
  905. while(idx < asize){
  906. fputchar(outf,((fgetchar(inpf,0,false)+mode[s]) & 0xFF),false);
  907. idx++;
  908. s++;
  909. if(s >= MAX_MODE_ADMx256) s = 0;
  910. }
  911. fclose(inpf);
  912. fclose(outf);
  913. return ERROR_CODE_ADM_OK;
  914. }
  915. #if defined MD5_Hash
  916. ADM_Function:: ADM:ADMx512(const input[], const output[], password[], bool:invertpassword = false){
  917. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  918. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  919. new psize = strlen(password);
  920. if(psize < 1 || psize > 255) return ERROR_CODE_ADM_PASSWORD;
  921. new mode[MAX_MODE_ADMx512],
  922. hash[MAX_KEY_LEN_ADMx512],
  923. BinKeyAlfa[MAX_LEN_BINARY_ADMx512],
  924. BinKeyBeta[MAX_LEN_BINARY_ADMx512],
  925. BinKeyGamma[MAX_LEN_BINARY_ADMx512],
  926. BinKeyDelta[MAX_LEN_BINARY_ADMx512];
  927. //Create Bin Key Alfa
  928. format(hash,sizeof(hash),"%s",MD5_Hash(password));
  929. HexStringToString(hash,BinKeyAlfa);
  930. //Create Bin Key Beta
  931. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  932. BinKeyBeta[i] = (BinKeyAlfa[i] ^ 0xFF);
  933. }
  934. //Create Bin Key Gamma
  935. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  936. BinKeyGamma[i] = (((0xF & ((BinKeyAlfa[i] >> 4)+8))*16) + (0xF & ((BinKeyAlfa[i] & 0xF)+8)));
  937. }
  938. //Create Bin Key Delta
  939. for(new i = 0, j = strlen(BinKeyBeta); i < j; i++){
  940. BinKeyDelta[i] = (((0xF & ((BinKeyBeta[i] >> 4)+8))*16) + (0xF & ((BinKeyBeta[i] & 0xF)+8)));
  941. }
  942. //Decode password
  943. if(invertpassword){
  944. for(new i = 0, j = strlen(BinKeyAlfa); i < j; i++){
  945. BinKeyAlfa[i] = (0xFF & (256-BinKeyAlfa[i]));
  946. BinKeyBeta[i] = (0xFF & (256-BinKeyBeta[i]));
  947. BinKeyGamma[i] = (0xFF & (256-BinKeyGamma[i]));
  948. BinKeyDelta[i] = (0xFF & (256-BinKeyDelta[i]));
  949. }
  950. }
  951. //Allocate key address
  952. new tid = 0;
  953. for(new i = 0; i < MAX_MODE_ADMx512; i++){
  954. switch(i % 8){
  955. case 0: mode[i] = BinKeyAlfa[tid];
  956. case 1: mode[i] = BinKeyGamma[tid];
  957. case 2: mode[i] = BinKeyBeta[tid];
  958. case 3: mode[i] = BinKeyDelta[tid];
  959. case 4: mode[i] = BinKeyGamma[tid];
  960. case 5: mode[i] = BinKeyBeta[tid];
  961. case 6: mode[i] = BinKeyAlfa[tid];
  962. case 7: mode[i] = BinKeyDelta[tid];
  963. }
  964. if((i+1) % 8 == 0) tid++;
  965. }
  966. new File:inpf = fopen(input,io_read);
  967. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  968. new asize = flength(inpf), idx = 0, s = 0;
  969. if(asize > MAX_FILE_SIZE || asize < 0){
  970. fclose(inpf);
  971. return ERROR_CODE_ADM_SIZE;
  972. }
  973. new File:outf = fopen(output,io_write);
  974. if(!outf){
  975. fclose(inpf);
  976. return ERROR_CODE_ADM_OPEN_OUTPUT;
  977. }
  978. while(idx < asize){
  979. fputchar(outf,((fgetchar(inpf,0,false)+mode[s]) & 0xFF),false);
  980. idx++;
  981. s++;
  982. if(s >= MAX_MODE_ADMx512) s = 0;
  983. }
  984. fclose(inpf);
  985. fclose(outf);
  986. return ERROR_CODE_ADM_OK;
  987. }
  988. #else
  989. ADM_Function:: ADM:ADMx512(const input[], const output[], password[], bool:invertpassword = false){
  990. #pragma unused input, output, password, invertpassword
  991. return ERROR_CODE_ADM_MD5;
  992. }
  993. #endif
  994. ADM_Function:: ADM:MergeFile(const first_file[],const second_file[],bool:erase_second=false){
  995. if(!fexist(first_file)) return ERROR_CODE_ADM_OUTPUT;
  996. if(!fexist(second_file)) return ERROR_CODE_ADM_INPUT;
  997. new File:inpf = fopen(second_file,io_read);
  998. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  999. new asize = flength(inpf), idx = 0;
  1000. if(asize > MAX_FILE_SIZE || asize < 0){
  1001. fclose(inpf);
  1002. return ERROR_CODE_ADM_SIZE;
  1003. }
  1004. new File:outf = fopen(first_file,io_append);
  1005. if(!outf){
  1006. fclose(inpf);
  1007. return ERROR_CODE_ADM_OPEN_OUTPUT;
  1008. }
  1009. while(idx < asize){
  1010. fputchar(outf,fgetchar(inpf,0,false),false);
  1011. idx++;
  1012. }
  1013. fclose(inpf);
  1014. fclose(outf);
  1015. if(erase_second){
  1016. fremove(second_file);
  1017. }
  1018. return ERROR_CODE_ADM_OK;
  1019. }
  1020. ADM_Function:: ADM:MergeFileGroup(const group_name[],const output[],upperbound_index,bool:erase_input=false){
  1021. if(fexist(output)) return ERROR_CODE_ADM_OUTPUT;
  1022. ADM_fcreate(output);
  1023. new part_file[256], File:inpf, idx, asize;
  1024. for(new i = 0; i <= upperbound_index; i++){
  1025. new File:outf = fopen(output,io_append);
  1026. format(part_file,sizeof(part_file),"%s_%04d",group_name,i);
  1027. if(!fexist(part_file)){
  1028. fclose(inpf);
  1029. return ERROR_CODE_ADM_INPUT;
  1030. }
  1031. inpf = fopen(part_file,io_read);
  1032. idx = 0, asize = flength(inpf);
  1033. while(idx < asize){
  1034. fputchar(outf,fgetchar(inpf,0,false),false);
  1035. idx++;
  1036. }
  1037. fclose(inpf);
  1038. fclose(outf);
  1039. if(erase_input){
  1040. fremove(part_file);
  1041. }
  1042. }
  1043. return ERROR_CODE_ADM_OK;
  1044. }
  1045. ADM_Function:: ADM:SplitFile(const input[],const output[],max_size,&upperbound_index=0){
  1046. if(!fexist(input)) return ERROR_CODE_ADM_INPUT;
  1047. new File:inpf = fopen(input,io_read);
  1048. if(!inpf) return ERROR_CODE_ADM_OPEN_INPUT;
  1049. new asize = flength(inpf), idx = 0;
  1050. if(asize > MAX_FILE_SIZE || asize < 0){
  1051. fclose(inpf);
  1052. return ERROR_CODE_ADM_SIZE;
  1053. }
  1054. new used_mem = 0, part_file[256], current_status = false;
  1055. upperbound_index = 0;
  1056. format(part_file,sizeof(part_file),"%s_%04d",output,upperbound_index);
  1057. ADM_fcreate(part_file);
  1058. new File:outf = fopen(part_file,io_write);
  1059. if(!outf){
  1060. fclose(inpf);
  1061. return ERROR_CODE_ADM_OPEN_OUTPUT;
  1062. }
  1063. current_status = true;
  1064. while(idx < asize){
  1065. fputchar(outf,fgetchar(inpf,0,false),false);
  1066. used_mem++;
  1067. idx++;
  1068. if(used_mem >= max_size){
  1069. used_mem = 0;
  1070. fclose(outf);
  1071. current_status = false;
  1072. if(idx < asize){
  1073. upperbound_index++;
  1074. format(part_file,sizeof(part_file),"%s_%04d",output,upperbound_index);
  1075. ADM_fcreate(part_file);
  1076. outf = fopen(part_file,io_write);
  1077. current_status = true;
  1078. }
  1079. }
  1080. }
  1081. fclose(inpf);
  1082. if(current_status) fclose(outf);
  1083. return ERROR_CODE_ADM_OK;
  1084. }
  1085. /************************************************************************************************************************************
  1086. * *
  1087. * Dump Functions *
  1088. * *
  1089. ************************************************************************************************************************************/
  1090. ADM_Function:: DMP:FindFreeDumpFileID(){
  1091. for(new DMP:i = DMP:0; i < MAX_DUMP_FILE; i = DMP:(DMPToInt(i)+1)){
  1092. if(DumpFileStatus[i] == false) return i;
  1093. }
  1094. return INVALID_DUMP_FILE;
  1095. }
  1096. ADM_Function:: bool:IsDumpFileOpen(DMP:index){
  1097. if(index < DMP:0 || index >= MAX_DUMP_FILE) return false;
  1098. if(!fexist(DumpFileName[index])) return false;
  1099. return DumpFileStatus[index];
  1100. }
  1101. ADM_Function:: DMP:DumpFileCreate(const name[], key[], type = KEY_TYPE_ADMx32){
  1102. if(fexist(name)) return INVALID_DUMP_FILE;
  1103. new File:dmpfile = fopen(name,io_write);
  1104. if(dmpfile){
  1105. new buffer[20];
  1106. switch(type){
  1107. case KEY_TYPE_ADMx32: format(buffer,sizeof buffer,"%s",DUMP_HEADER_x32);
  1108. case KEY_TYPE_ADMx64: format(buffer,sizeof buffer,"%s",DUMP_HEADER_x64);
  1109. case KEY_TYPE_ADMx128: format(buffer,sizeof buffer,"%s",DUMP_HEADER_x128);
  1110. case KEY_TYPE_ADMx256: format(buffer,sizeof buffer,"%s",DUMP_HEADER_x256);
  1111. }
  1112. for(new i = 0, j = strlen(buffer); i < j; i++){
  1113. fputchar(dmpfile,buffer[i],false);
  1114. }
  1115. fclose(dmpfile);
  1116. new DMP:idx = FindFreeDumpFileID();
  1117. if(idx == INVALID_DUMP_FILE) return INVALID_DUMP_FILE;
  1118. DumpFileStatus[idx] = true;
  1119. DumpFileType[idx] = type;
  1120. format(DumpFileName[idx],MAX_DUMP_FILE_NAME,"%s",name);
  1121. format(DumpFileKey[idx],MAX_KEY_LEN_ADMx256,"%s",key);
  1122. return idx;
  1123. } else {
  1124. return INVALID_DUMP_FILE;
  1125. }
  1126. }
  1127. ADM_Function:: bool:DumpFileDestroy(&DMP:index){
  1128. if(index < DMP:0 || index >= MAX_DUMP_FILE) return false;
  1129. new tid = fremove(DumpFileName[index]);
  1130. DumpFileName[index] = "";
  1131. DumpFileKey[index] = "";
  1132. DumpFileStatus[index] = false;
  1133. DumpFileType[index] = KEY_TYPE_UNKNOWN;
  1134. index = INVALID_DUMP_FILE;
  1135. return bool:tid;
  1136. }
  1137. ADM_Function:: bool:IsValidDumpFile(const name[]){
  1138. if(!fexist(name)) return false;
  1139. new File:dmpfile = fopen(name,io_read), midi = 0, buffer[20];
  1140. if(dmpfile){
  1141. for(new i = 0; i < MAX_DUMP_HEADER_SIZE; i++){
  1142. buffer[i] = fgetchar(dmpfile,0,false);
  1143. midi = (i+1);
  1144. }
  1145. fclose(dmpfile);
  1146. buffer[midi] = EOS;
  1147. if(!strcmp(buffer,DUMP_HEADER_x32,true)){
  1148. return true;
  1149. } else if(!strcmp(buffer,DUMP_HEADER_x64,true)){
  1150. return true;
  1151. } else if(!strcmp(buffer,DUMP_HEADER_x128,true)){
  1152. return true;
  1153. } else if(!strcmp(buffer,DUMP_HEADER_x256,true)){
  1154. return true;
  1155. } else {
  1156. return false;
  1157. }
  1158. } else {
  1159. return false;
  1160. }
  1161. }
  1162. ADM_Function:: GetDumpFileType(const name[]){
  1163. if(!fexist(name)) return KEY_TYPE_UNKNOWN;
  1164. new File:dmpfile = fopen(name,io_read), midi = 0, buffer[20];
  1165. if(dmpfile){
  1166. for(new i = 0; i < MAX_DUMP_HEADER_SIZE; i++){
  1167. buffer[i] = fgetchar(dmpfile,0,false);
  1168. midi = (i+1);
  1169. }
  1170. fclose(dmpfile);
  1171. buffer[midi] = EOS;
  1172. if(!strcmp(buffer,DUMP_HEADER_x32,true)){
  1173. return KEY_TYPE_ADMx32;
  1174. } else if(!strcmp(buffer,DUMP_HEADER_x64,true)){
  1175. return KEY_TYPE_ADMx64;
  1176. } else if(!strcmp(buffer,DUMP_HEADER_x128,true)){
  1177. return KEY_TYPE_ADMx128;
  1178. } else if(!strcmp(buffer,DUMP_HEADER_x256,true)){
  1179. return KEY_TYPE_ADMx256;
  1180. } else {
  1181. return KEY_TYPE_UNKNOWN;
  1182. }
  1183. } else {
  1184. return KEY_TYPE_UNKNOWN;
  1185. }
  1186. }
  1187. ADM_Function:: DMP:DumpFileOpen(const name[], key[], type = KEY_TYPE_ADMx32){
  1188. if(!fexist(name)) return INVALID_DUMP_FILE;
  1189. if(!IsValidDumpFile(name)) return INVALID_DUMP_FILE;
  1190. new DMP:idx = FindFreeDumpFileID();
  1191. if(idx == INVALID_DUMP_FILE) return INVALID_DUMP_FILE;
  1192. DumpFileStatus[idx] = true;
  1193. DumpFileType[idx] = type;
  1194. format(DumpFileName[idx],MAX_DUMP_FILE_NAME,"%s",name);
  1195. format(DumpFileKey[idx],MAX_KEY_LEN_ADMx256,"%s",key);
  1196. return idx;
  1197. }
  1198. ADM_Function:: bool:DumpFileClose(&DMP:index){
  1199. if(index < DMP:0 || index >= MAX_DUMP_FILE) return false;
  1200. DumpFileName[index] = "";
  1201. DumpFileKey[index] = "";
  1202. DumpFileStatus[index] = false;
  1203. DumpFileType[index] = KEY_TYPE_UNKNOWN;
  1204. index = INVALID_DUMP_FILE;
  1205. return true;
  1206. }
  1207. ADM_Function:: ADM:DumpFileWrite(DMP:index, string[]){
  1208. if(index < DMP:0 || index >= MAX_DUMP_FILE) return ERROR_CODE_ADM_DMP_IDX;
  1209. if(isnull(DumpFileName[index])) return ERROR_CODE_ADM_DMP_NAME;
  1210. if(!IsValidADMKey(DumpFileKey[index],DumpFileType[index])) return ERROR_CODE_ADM_KEY;
  1211. new File:dmpfile = fopen(DumpFileName[index],io_append);
  1212. if(dmpfile){
  1213. new mod = (DumpFileType[index]/8),
  1214. idx = flength(dmpfile),
  1215. s = (idx % mod),
  1216. mode[MAX_MODE_ADMx256];
  1217. switch(DumpFileType[index]){
  1218. case KEY_TYPE_ADMx32: {
  1219. sscanf(DumpFileKey[index],"D(0)D(0)D(0)D(0)",
  1220. mode[0],mode[1],mode[2],mode[3]
  1221. );
  1222. }
  1223. case KEY_TYPE_ADMx64: {
  1224. sscanf(DumpFileKey[index],"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  1225. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]
  1226. );
  1227. }
  1228. case KEY_TYPE_ADMx128: {
  1229. sscanf(DumpFileKey[index],"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  1230. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  1231. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15]
  1232. );
  1233. }
  1234. case KEY_TYPE_ADMx256: {
  1235. sscanf(DumpFileKey[index],"D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)D(0)",
  1236. mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7],
  1237. mode[8],mode[9],mode[10],mode[11],mode[12],mode[13],mode[14],mode[15],
  1238. mode[16],mode[17],mode[18],mode[19],mode[20],mode[21],mode[22],mode[23],
  1239. mode[24],mode[25],mode[26],mode[27],mode[28],mode[29],mode[30],mode[31]
  1240. );
  1241. }
  1242. }
  1243. for(new i = 0, j = strlen(string); i < j; i++){
  1244. fputchar(dmpfile,((string[i]+mode[s]) & 0xFF),false);
  1245. idx++;
  1246. s++;
  1247. if(s >= mod) s = 0;
  1248. }
  1249. fclose(dmpfile);
  1250. return ERROR_CODE_ADM_OK;
  1251. } else {
  1252. return ERROR_CODE_ADM_OPEN_OUTPUT;
  1253. }
  1254. }
  1255. ADM_Function:: bool:IsDumpFileEmpty(const name[]){
  1256. if(!IsValidDumpFile(name)) return false;
  1257. new File:inpf = fopen(name,io_read), asize = flength(inpf);
  1258. fclose(inpf);
  1259. if(asize > MAX_DUMP_HEADER_SIZE) return false;
  1260. return true;
  1261. }
  1262. //EOF