#include "XP_MD5_FUNC.H" #include "WZ_MD5.H" #define CHECK_LIMIT(C_VALUE, C_MAX) (C_VALUE<0?FALSE:C_VALUE>(C_MAX-1)?FALSE:TRUE) extern void printError (SRV_PROC *pSrvProc, CHAR* szErrorMsg); extern void printUsage (SRV_PROC *pSrvProc); extern void BytesToStr(DWORD cb, void* pv, LPSTR sz); //<===================================================== //< Name: bool WZ_MD5_EncodeKeyVal() //< Desc: ƯÁ¤ ¹®ÀÚ¿­À» À妽º¸¦ ÀÌ¿ëÇÏ¿© MD5 °ªÀ¸·Î º¯È¯ //< retval: ¼º°øÇϸé true / ½ÇÆÐÇϸé false //<===================================================== WZ_DECLAREDLL bool XP_MD5_CryptKey( SRV_PROC* pSrvProc ) { // XP Áß ÀÎÀÚüũ¿¡ µé¾î°¡´Â º¯¼öµé BYTE bType[XP_MD5_ENCODE_PARAM_NUM]; ULONG cbMaxLen[XP_MD5_ENCODE_PARAM_NUM]; ULONG cbActualLen[XP_MD5_ENCODE_PARAM_NUM]; BOOL fNull[XP_MD5_ENCODE_PARAM_NUM]; BYTE szInputStr[32] = {0,}; // ÀÔ·Â ¹®ÀÚ¿­ BYTE szInputIndex[32] = {0,}; // À妽º°¡ µÇ´Â ÀÔ·Â ¹®ÀÚ¿­ BYTE szOutputKeyVal[32] = {0,}; // Ãâ·Â ¹öÆÛ INT iInputKeyIndex = 0; // ÀԷ ŰÀ妽º (0~255) // ÀÔ·Â ÆÄ¶ó¸ÞÅÍÀÇ °³¼ö ¼¼±â INT nParams = srv_rpcparams(pSrvProc); if (nParams != XP_MD5_ENCODE_PARAM_NUM) { printError (pSrvProc, "usage: exec XP_MD5_CryptKey @string, @strindex, @keyval OUTPUT\nWhere @keyval is a char of at least 16 bytes."); return (XP_ERROR); } // srv_paraminfo ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Å¸ÀÔ°ú ±æÀÌÁ¤º¸ µîÀ» ¾ò´Â´Ù. for (INT iPNUM = 0 ; iPNUM < XP_MD5_ENCODE_PARAM_NUM ; iPNUM++) { if (srv_paraminfo(pSrvProc, iPNUM+1, &bType[iPNUM], &cbMaxLen[iPNUM], &cbActualLen[iPNUM], NULL, &fNull[iPNUM]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while get data type and length"); return (XP_ERROR); } } // ¸¶Áö¸·(3¹øÂ°) ÀÎÀÚÀÎ @keyval Àº È®½ÇÈ÷ Ãâ·Â°ªÀÎÁö È®ÀÎÇÑ´Ù. if ((srv_paramstatus(pSrvProc, 3) & SRV_PARAMRETURN) == FAIL) { printError (pSrvProc, "usage: exec XP_MD5_CryptKey @string, @strindex, @keyval OUTPUT\nWhere @keyval is a char of at least 16 bytes."); return (XP_ERROR); } // ¸¶Áö¸·(3¹øÂ°) ÀÎÀÚÀÎ @keyval ÀÇ Å©±â°¡ µ¥ÀÌÅ͸¦ ´ã±â¿¡ ÃæºÐÇÑÁö È®ÀÎÇÑ´Ù. if (cbMaxLen[2] < 16) { printError (pSrvProc, "Output param Max. Length should be at least 16 bytes."); return (XP_ERROR); } if (fNull[0] == 0) { // ù¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 1, &bType[0], &cbMaxLen[0], &cbActualLen[0], szInputStr, &fNull[0]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } if (fNull[1] == 0) { // µÎ¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 2, &bType[1], &cbMaxLen[1], &cbActualLen[1], szInputIndex, &fNull[1]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } // ¿©±â¼­ º¯È¯À» ½Ç½ÃÇÑ´Ù. MD5 cMD5; cMD5.EncodeString( szInputStr, cbActualLen[0], szOutputKeyVal, szInputIndex, cbActualLen[1] ); if (srv_paramsetoutput(pSrvProc, 3, szOutputKeyVal, 16, FALSE ) == FAIL) { printError (pSrvProc, "srv_paramsetoutput failed..."); return (XP_ERROR); } return XP_NOERROR; } //<===================================================== //< Name: bool WZ_MD5_EncodeString() //< Desc: ƯÁ¤ ¹®ÀÚ¿­À» À妽º¸¦ ÀÌ¿ëÇÏ¿© MD5·Î º¯È¯ÇÑ ÈÄ À̰ÍÀ» ´Ù½Ã ¹®ÀÚ¿­·Î º¯È¯ //< retval: ¼º°øÇϸé true / ½ÇÆÐÇϸé false //<===================================================== WZ_DECLAREDLL bool XP_MD5_EncodeString( SRV_PROC* pSrvProc ) { // XP Áß ÀÎÀÚüũ¿¡ µé¾î°¡´Â º¯¼öµé BYTE bType[XP_MD5_ENCODE_PARAM_NUM]; ULONG cbMaxLen[XP_MD5_ENCODE_PARAM_NUM]; ULONG cbActualLen[XP_MD5_ENCODE_PARAM_NUM]; BOOL fNull[XP_MD5_ENCODE_PARAM_NUM]; BYTE szInputStr[32] = {0,}; // ÀÔ·Â ¹®ÀÚ¿­ BYTE szInputIndex[32] = {0,}; // À妽º°¡ µÇ´Â ÀÔ·Â ¹®ÀÚ¿­ BYTE szOutputKeyVal[64] = {0,}; // Ãâ·Â ¹öÆÛ INT iInputKeyIndex = 0; // ÀԷ ŰÀ妽º (0~255) // ÀÔ·Â ÆÄ¶ó¸ÞÅÍÀÇ °³¼ö ¼¼±â INT nParams = srv_rpcparams(pSrvProc); if (nParams != XP_MD5_ENCODE_PARAM_NUM) { printError (pSrvProc, "usage: exec XP_MD5_EncodeString @string, @strindex, @keystring OUTPUT\nWhere @keystring is a char of at least 32 bytes."); return (XP_ERROR); } // srv_paraminfo ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Å¸ÀÔ°ú ±æÀÌÁ¤º¸ µîÀ» ¾ò´Â´Ù. for (INT iPNUM = 0 ; iPNUM < XP_MD5_ENCODE_PARAM_NUM ; iPNUM++) { if (srv_paraminfo(pSrvProc, iPNUM+1, &bType[iPNUM], &cbMaxLen[iPNUM], &cbActualLen[iPNUM], NULL, &fNull[iPNUM]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while get data type and length"); return (XP_ERROR); } } // ¸¶Áö¸·(3¹øÂ°) ÀÎÀÚÀÎ @keystring Àº È®½ÇÈ÷ Ãâ·Â°ªÀÎÁö È®ÀÎÇÑ´Ù. if ((srv_paramstatus(pSrvProc, 3) & SRV_PARAMRETURN) == FAIL) { printError (pSrvProc, "usage: exec XP_MD5_EncodeString @string, @strindex, @keystring OUTPUT\nWhere @keystring is a char of at least 32 bytes."); return (XP_ERROR); } // ¸¶Áö¸·(3¹øÂ°) ÀÎÀÚÀÎ @keystring ÀÇ Å©±â°¡ µ¥ÀÌÅ͸¦ ´ã±â¿¡ ÃæºÐÇÑÁö È®ÀÎÇÑ´Ù. if (cbMaxLen[2] < 32) { printError (pSrvProc, "Output param Max. Length should be at least 32 bytes."); return (XP_ERROR); } if (fNull[0] == 0) { // ù¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 1, &bType[0], &cbMaxLen[0], &cbActualLen[0], szInputStr, &fNull[0]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } if (fNull[1] == 0) { // µÎ¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 2, &bType[1], &cbMaxLen[1], &cbActualLen[1], szInputIndex, &fNull[1]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } // ¿©±â¼­ º¯È¯À» ½Ç½ÃÇÑ´Ù. MD5 cMD5; cMD5.EncodeString( szInputStr, cbActualLen[0], szOutputKeyVal, szInputIndex, cbActualLen[1] ); if (srv_paramsetoutput(pSrvProc, 3, szOutputKeyVal, 32, FALSE ) == FAIL) { printError (pSrvProc, "srv_paramsetoutput failed..."); return (XP_ERROR); } return XP_NOERROR; } //<===================================================== //< Name: bool WZ_MD5_CheckValue() //< Desc: ƯÁ¤ MD5°ªÀÌ ¹®ÀÚ¿­°ú À妽º¸¦ ³ÖÀº °á°ú¿Í ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎ //< retval: ¼º°øÇϸé true / ½ÇÆÐÇϸé false //<===================================================== WZ_DECLAREDLL bool XP_MD5_Compare( SRV_PROC* pSrvProc ) { // XP Áß ÀÎÀÚüũ¿¡ µé¾î°¡´Â º¯¼öµé BYTE bType[XP_MD5_CHECK_PARAM_NUM]; ULONG cbMaxLen[XP_MD5_CHECK_PARAM_NUM]; ULONG cbActualLen[XP_MD5_CHECK_PARAM_NUM]; BOOL fNull[XP_MD5_CHECK_PARAM_NUM]; BYTE szInputStr[32] = {0,}; // ÀÔ·Â ¹®ÀÚ¿­ BYTE szInputIndex[32] = {0,}; // À妽º°¡ µÇ´Â ÀÔ·Â ¹®ÀÚ¿­ BYTE szInputKeyVal[64] = {0,}; // ÀÔ·Â MD5°ª INT iInputKeyIndex = 0; // ÀԷ ŰÀ妽º (0~255) BYTE iOutputResult = 0; // Ãâ·Â °á°ú°ª (0:Ʋ¸®´Ù / 1:¸Â´Ù) // ÀÔ·Â ÆÄ¶ó¸ÞÅÍÀÇ °³¼ö ¼¼±â INT nParams = srv_rpcparams(pSrvProc); if (nParams != XP_MD5_CHECK_PARAM_NUM) { printError (pSrvProc, "usage: exec XP_MD5_Compare @string, @keyval, @strindex, @result OUTPUT\nWhere @result is a char of at least 1 bytes."); return (XP_ERROR); } // srv_paraminfo ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Å¸ÀÔ°ú ±æÀÌÁ¤º¸ µîÀ» ¾ò´Â´Ù. for (INT iPNUM = 0 ; iPNUM < XP_MD5_CHECK_PARAM_NUM ; iPNUM++) { if (srv_paraminfo(pSrvProc, iPNUM+1, &bType[iPNUM], &cbMaxLen[iPNUM], &cbActualLen[iPNUM], NULL, &fNull[iPNUM]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while get data type and length"); return (XP_ERROR); } } // ¸¶Áö¸·(4¹øÂ°) ÀÎÀÚÀÎ @result ´Â È®½ÇÈ÷ Ãâ·Â°ªÀÎÁö È®ÀÎÇÑ´Ù. if ((srv_paramstatus(pSrvProc, 4) & SRV_PARAMRETURN) == FAIL) { printError (pSrvProc, "usage: exec XP_MD5_Compare @string, @keyval, @strindex, @result OUTPUT\nWhere @result is a char of at least 1 bytes."); return (XP_ERROR); } // ¸¶Áö¸·(4¹øÂ°) ÀÎÀÚÀÎ @result ÀÇ Å©±â°¡ µ¥ÀÌÅ͸¦ ´ã±â¿¡ ÃæºÐÇÑÁö È®ÀÎÇÑ´Ù. if (cbMaxLen[3] < 1) { printError (pSrvProc, "Output param Max. Length should be at least 1 bytes."); return (XP_ERROR); } if (fNull[0] == 0) { // ù¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 1, &bType[0], &cbMaxLen[0], &cbActualLen[0], szInputStr, &fNull[0]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } if (fNull[1] == 0) { // µÎ¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 2, &bType[1], &cbMaxLen[1], &cbActualLen[1], szInputKeyVal, &fNull[1]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } if (fNull[2] == 0) { // ¼¼¹øÂ° ÀÎÀÚÀÇ ½ÇÁ¦ °ªÀ» ¾ò´Â´Ù. if (srv_paraminfo(pSrvProc, 3, &bType[2], &cbMaxLen[2], &cbActualLen[2], szInputIndex, &fNull[2]) == FAIL) { printError (pSrvProc, "srv_paraminfo failed... : while retrieve data"); return (XP_ERROR); } } MD5 cMD5; iOutputResult = cMD5.Compare( szInputStr, cbActualLen[0], szInputKeyVal, szInputIndex, cbActualLen[2] ); if (srv_paramsetoutput(pSrvProc, 4, (LPBYTE)&iOutputResult, 1, FALSE ) == FAIL) { printError (pSrvProc, "srv_paramsetoutput failed..."); return (XP_ERROR); } return XP_NOERROR; }