Secret.inl
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:12k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // Secret.inl : implementation file
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. // CSView
  5. /*
  6. 1 系列号结构
  7. CHECK-RANDM-IDENT-IFYNO
  8. ①不输入系列号,则为试用
  9. ②加密文件保存试用日期和系列号文本,密钥为512位
  10. ③CHECK为RANDM-IDENT-IFYNO以及注册用户名称的Hash函数校验码
  11. ④RANDM为随机数
  12. ⑤IDENT-IFYNO为唯一标识,应该包含年月日时分秒信息,转换成20进制表示,
  13.   IDENT为高位,IFYNO为低位
  14. ⑥所有字母为A-Z大写字母和0-9数字,不能使用以下字母和数字:
  15. 0、O、2、Z、8、B、6、U、V、C、G、1、I、D、Q、Y
  16. */
  17. // static functions
  18. _SECRET_INLINE CString sysstrtosysstr( CString strSrc )
  19. {
  20. CString strResult;
  21. for( int i=strSrc.GetLength()-1; i>=0; i-- )
  22. {
  23. char chCur = strSrc[i];
  24. strResult += chCur;
  25. }
  26. return strResult;
  27. }
  28. _SECRET_INLINE CString strtostr( CString strSrc )
  29. {
  30. CString strResult;
  31. for( int i=strSrc.GetLength()-1; i>=0; i-- )
  32. {
  33. char chCur = strSrc[i];
  34. chCur = char(256-chCur);
  35. strResult += chCur;
  36. }
  37. return strResult;
  38. }
  39. _SECRET_INLINE int int64tostr( unsigned __int64 src, char * s, int len )
  40. {
  41. char * pbuf = new char[len+1];
  42. if( 0 == pbuf )
  43. return -1;
  44. memset( s, 0, len );
  45. int n = 0;
  46. while( src != 0 && n < len-1 )
  47. {
  48. *(pbuf+n) = (unsigned char)(src % 256);
  49. src = src/256;
  50. n ++;
  51. }
  52. for( int i=n-1; i>=0; i-- )
  53. *(s+n-1-i) = *(pbuf+i);
  54. delete [] pbuf;
  55. if( src != 0 )
  56. return -1;
  57. return n;
  58. }
  59. _SECRET_INLINE unsigned __int64 strtoint64( const char * s, int len )
  60. {
  61. unsigned __int64 x = 0;
  62. int n = 0;
  63. while (n<len)
  64. {
  65. x = x * 256 + (unsigned __int64)((unsigned char)*s);
  66. s += 1;
  67. n += 1;
  68. }
  69. return x;
  70. }
  71. _SECRET_INLINE CString int64tosysstr( unsigned __int64 src )
  72. {
  73. char szSystem20[SE_LEN_SYSTEMSTR+1] = SE_SYSTEM20_CHAR;
  74. CString strResult;
  75. while( src > 0 )
  76. {
  77. strResult = szSystem20[ src % SE_LEN_SYSTEMSTR ] + strResult;
  78. src = src / SE_LEN_SYSTEMSTR;
  79. }
  80. return strResult;
  81. }
  82. _SECRET_INLINE unsigned __int64 sysstrtoint64( CString strSrc )
  83. {
  84. char szSystem20[SE_LEN_SYSTEMSTR+1] = SE_SYSTEM20_CHAR;
  85. unsigned __int64 result = 0;
  86. unsigned __int64 w = 1;
  87. for( int i=strSrc.GetLength()-1; i>=0; i-- )
  88. {
  89. for( int k=0; k<SE_LEN_SYSTEMSTR; k++ )
  90. {
  91. if( strSrc[i] == szSystem20[k] )
  92. {
  93. result += k * w;
  94. }
  95. }
  96. if( k == SE_LEN_SYSTEMSTR )
  97. {
  98. TRACE( "sysstrtoint64, s is not sysstr.n" );
  99. }
  100. w *= SE_LEN_SYSTEMSTR;
  101. }
  102. return result;
  103. }
  104. _SECRET_INLINE CString strtosysstr( const char * s, int len )
  105. {
  106. vlong vstr( s, len, FALSE );
  107. CString strResult;
  108. char * psysstr = new char [len*3+2];
  109. if( psysstr )
  110. {
  111. memset( psysstr, 0, len*3+2 );
  112. vstr.to_sysstr( psysstr, len*3+1 );
  113. strResult = psysstr;
  114. delete [] psysstr;
  115. }
  116. return strResult;
  117. }
  118. _SECRET_INLINE CSPString CSView::GetS( )
  119. {
  120. DWORD id = SE_MASK_SOFTNO;
  121. // WILLDO
  122. // ::GetVolumeInformation( "C:\", NULL, 0, &id, NULL, NULL, NULL, 0 );
  123. // id = (DWORD) getHardDriveComputerID ();
  124. // id = id ^ SE_MASK_SOFTNO;
  125. CString strSerial = int64tosysstr( (unsigned __int64)id );
  126. return (LPCTSTR)strSerial;
  127. }
  128. _SECRET_INLINE BOOL CSView::Valid( LPCTSTR lpszSrc, LPCTSTR lpszRegCode, public_key & rsapub )
  129. {
  130. CString strSrc = lpszSrc;
  131. CString strRegCode = lpszRegCode;
  132. /* Convert strRegCode to strDest */
  133. CString strDest;
  134. for( int i=0; i<strRegCode.GetLength(); i++ )
  135. {
  136. if( strRegCode[i] != '-' ) strDest += strRegCode[i];
  137. }
  138. /* Length Valid */
  139. if( strSrc.GetLength() < SE_MIN_RSASYSSTR || strSrc.GetLength() > SE_MAX_RSASYSSTR
  140. || strDest.GetLength() < SE_MIN_RSASYSSTR || strDest.GetLength() > SE_MAX_RSASYSSTR )
  141. return FALSE;
  142. /* RSA Decrypt With Public Key*/
  143. vlong vDest( strDest, strDest.GetLength(), TRUE );
  144. if( vDest > rsapub.m )
  145. return FALSE;
  146. vlong vSrcCal = rsapub.encrypt( vDest );
  147. /* Convert vSrcCal to bufSrcCal */
  148. char bufSrcCal[SE_MAX_RSASYSSTR+2];
  149. memset( bufSrcCal, 0, sizeof(bufSrcCal) );
  150. int nBufSrcCalLen = vSrcCal.to_sysstr( bufSrcCal, sizeof(bufSrcCal)-1 );
  151. if( -1 == nBufSrcCalLen /*|| nBufSrcCalLen < SE_MIN_RSASYSSTR*/ || nBufSrcCalLen > SE_MAX_RSASYSSTR )
  152. return FALSE;
  153. /* Prepare strSrc */
  154. strSrc.MakeUpper();
  155. strSrc = sysstrtosysstr( strSrc );
  156. /* Modified Jan 5, 2003 */
  157. /* 3 is 0, and is not showed in bufSrcCal */
  158. char szSystem20[SE_LEN_SYSTEMSTR+1] = SE_SYSTEM20_CHAR;
  159. while( strSrc.GetLength() > nBufSrcCalLen && strSrc.GetLength() > 0 && szSystem20[0] == strSrc[0] )
  160. strSrc = strSrc.Mid( 1 );
  161. /* Compare */
  162. return ( nBufSrcCalLen == strSrc.GetLength()
  163. && 0 == strncmp( strSrc, bufSrcCal, nBufSrcCalLen ) );
  164. }
  165. _SECRET_INLINE BOOL CSView::ValidStd( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, LPCTSTR lpszRegCode )
  166. {
  167. // WILLDO For Standard Versions, No Standard Version Now
  168. return FALSE;
  169. CString strUser = lpszUser;
  170. CString strSoftNO = lpszSoftNO;
  171. CString strRegCode = lpszRegCode;
  172. if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
  173. || strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
  174. return FALSE;
  175. if( -1 == m_mStdlen || -1 == m_eStdlen )
  176. {
  177. // ASSERT( FALSE );
  178. return FALSE;
  179. }
  180. public_key rsapub;
  181. rsapub.m = vlong( m_mStd, m_mStdlen, FALSE );
  182. rsapub.e = vlong( m_eStd, m_eStdlen, FALSE );
  183. strUser.MakeUpper( );
  184. return Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub );
  185. }
  186. _SECRET_INLINE BOOL CSView::ValidProf( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, LPCTSTR lpszRegCode )
  187. {
  188. CString strUser = lpszUser;
  189. CString strSoftNO = lpszSoftNO;
  190. CString strRegCode = lpszRegCode;
  191. if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
  192. || strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
  193. return FALSE;
  194. if( -1 == m_mProflen || -1 == m_eProflen )
  195. {
  196. // ASSERT( FALSE );
  197. return FALSE;
  198. }
  199. public_key rsapub;
  200. rsapub.m = vlong( m_mProf, m_mProflen, FALSE );
  201. rsapub.e = vlong( m_eProf, m_eProflen, FALSE );
  202. strUser.MakeUpper( );
  203. return Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub );
  204. }
  205. ////////////////////////////////////////////////////////////////////////////////////
  206. // Function Cannot Dispatched Begin
  207. #define EVACODE_MASK 0x128932A2
  208. _SECRET_INLINE BOOL CSView::DumpEva( long tm, CSPString &strRegCode )
  209. {
  210. __int64 t = tm / 86400;
  211. __int64 rand = tm % 86400;
  212. t ^= EVACODE_MASK;
  213. t |= (rand << 32);
  214. CString str = int64tosysstr( t );
  215. strRegCode = sysstrtosysstr( str );
  216. return (strRegCode.GetLength() > 0);
  217. }
  218. _SECRET_INLINE BOOL CSView::Dump( LPCTSTR lpszSrc, CSPString &strRegCode, private_key & rsapri )
  219. {
  220. CString strSrc = lpszSrc;
  221. if( strSrc.GetLength() < SE_MIN_RSASYSSTR || strSrc.GetLength() > SE_MAX_RSASYSSTR )
  222. return FALSE;
  223. // Prepare strSrc
  224. strSrc.MakeUpper();
  225. strSrc = sysstrtosysstr( strSrc );
  226. // RSA Encrypt With Private Key
  227. vlong vSrc( strSrc, strSrc.GetLength(), TRUE );
  228. if( vSrc >= rsapri.m )
  229. return FALSE;
  230. vlong vDest = rsapri.decrypt( vSrc );
  231. // Convert vDest to bufDest
  232. char bufDest[SE_MAX_RSASYSSTR+2];
  233. memset( bufDest, 0, sizeof(bufDest) );
  234. int nBufDestLen = vDest.to_sysstr( bufDest, sizeof(bufDest)-1 );
  235. if( -1 == nBufDestLen || nBufDestLen < SE_MIN_RSASYSSTR || nBufDestLen > SE_MAX_RSASYSSTR )
  236. return FALSE;
  237. // Convert bufDest to strDest
  238. CSPString strDest = bufDest;
  239. // Convert strDest to strDest
  240. strRegCode.Empty();
  241. while( strDest.GetLength() > 0 )
  242. {
  243. if( strDest.GetLength() <= SE_LEN_SEPREGCODE )
  244. {
  245. strRegCode += strDest;
  246. strDest.Empty();
  247. }
  248. else
  249. {
  250. strRegCode += strDest.Left( SE_LEN_SEPREGCODE );
  251. strRegCode += '-';
  252. strDest = strDest.Mid( SE_LEN_SEPREGCODE );
  253. }
  254. }
  255. return TRUE;
  256. }
  257. _SECRET_INLINE BOOL CSView::Dump( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode,
  258. const char * r1, const char *r2 )
  259. {
  260. CString strUser = lpszUser;
  261. CString strSoftNO = lpszSoftNO;
  262. if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
  263. || strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
  264. return FALSE;
  265. private_key rsapri;
  266. rsapri.create( r1, r2 );
  267. strUser.MakeUpper( );
  268. BOOL b = Dump( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapri );
  269. public_key rsapub;
  270. rsapub.m = rsapri.m;
  271. rsapub.e = rsapri.e;
  272. return ( b && Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub ) );
  273. }
  274. _SECRET_INLINE BOOL CSView::DumpStd( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode )
  275. {
  276. return Dump( lpszUser, lpszSoftNO, strRegCode, SE_SEED_STD1, SE_SEED_STD2 );
  277. }
  278. _SECRET_INLINE BOOL CSView::DumpProf( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode )
  279. {
  280. return Dump( lpszUser, lpszSoftNO, strRegCode, SE_SEED_PROF1, SE_SEED_PROF2 );
  281. }
  282. _SECRET_INLINE BOOL CSView::SetME( )
  283. {
  284. private_key rsapriStd;
  285. rsapriStd.create( SE_SEED_STD1, SE_SEED_STD2 );
  286. m_mStdlen = rsapriStd.m.to_str( m_mStd, sizeof(m_mStd)-1 );
  287. m_eStdlen = rsapriStd.e.to_str( m_eStd, sizeof(m_eStd)-1 );
  288. private_key rsapriProf;
  289. rsapriProf.create( SE_SEED_PROF1, SE_SEED_PROF2 );
  290. m_mProflen = rsapriProf.m.to_str( m_mProf, sizeof(m_mProf)-1 );
  291. m_eProflen = rsapriProf.e.to_str( m_eProf, sizeof(m_eProf)-1 );
  292. return TRUE;
  293. }
  294. _SECRET_INLINE BOOL CSView::SetURDir( LPCTSTR lpszUser, LPCTSTR lpszRegCode )
  295. {
  296. m_strU = strtostr( lpszUser );
  297. m_strR = strtostr( lpszRegCode );
  298. return TRUE;
  299. }
  300. // Function Cannot Dispatched Ended
  301. ////////////////////////////////////////////////////////////////////////////////////
  302. _SECRET_INLINE CSPString CSView::GetU( )
  303. {
  304. return (LPCTSTR)strtostr(m_strU);
  305. }
  306. _SECRET_INLINE CSPString CSView::GetR( )
  307. {
  308. return (LPCTSTR)strtostr(m_strR);
  309. }
  310. _SECRET_INLINE BOOL CSView::SetUR( LPCTSTR lpszUser, LPCTSTR lpszRegCode )
  311. {
  312. if( !ValidStd( lpszUser, GetS(), lpszRegCode )
  313. && !ValidProf( lpszUser, GetS(), lpszRegCode ) )
  314. return FALSE;
  315. m_strU = strtostr( lpszUser );
  316. m_strR = strtostr( lpszRegCode );
  317. return TRUE;
  318. }
  319. _SECRET_INLINE void CSView::SetInsTimeIfNull( )
  320. {
  321. CSPTime tmNow = CSPTime::GetCurrentTime();
  322. if( NULL == m_tmIns.GetTime() )
  323. m_tmIns = tmNow;
  324. if( NULL == m_tmExp.GetTime() )
  325. m_tmExp = m_tmIns+CSPTimeSpan(GetMaxEvaDays(),23,0,0);
  326. }
  327. _SECRET_INLINE void CSView::ResetInsTime( )
  328. {
  329. CSPTime tmNow = CSPTime::GetCurrentTime();
  330. m_tmIns = tmNow;
  331. m_tmExp = m_tmIns+CSPTimeSpan(GetMaxEvaDays(),23,0,0);
  332. }
  333. _SECRET_INLINE BOOL CSView::IsEva( )
  334. {
  335. if( !ValidStd( strtostr(m_strU), GetS(), strtostr(m_strR) )
  336. && !ValidProf( strtostr(m_strU), GetS(), strtostr(m_strR) ) )
  337. return TRUE;
  338. return FALSE;
  339. }
  340. _SECRET_INLINE BOOL CSView::IsStd( )
  341. {
  342. return ValidStd( strtostr(m_strU), GetS(), strtostr(m_strR) );
  343. }
  344. _SECRET_INLINE BOOL CSView::IsProf( )
  345. {
  346. return ValidProf( strtostr(m_strU), GetS(), strtostr(m_strR) );
  347. }
  348. _SECRET_INLINE BOOL CSView::AssertValid( )
  349. {
  350. if( IsEva() && GetLeft() <= 0 )
  351. return FALSE;
  352. return TRUE;
  353. }
  354. _SECRET_INLINE int CSView::GetLeft( )
  355. {
  356. // WILLDO
  357. // return GetMaxEvaDays() + 10; // No Time Limit
  358. SetInsTimeIfNull( );
  359. CSPTime tmNow = CSPTime::GetCurrentTime();
  360. CSPTimeSpan used = tmNow - m_tmIns;
  361. if( used.GetDays() > GetMaxEvaDays() )
  362. return 0;
  363. CSPTimeSpan left = m_tmExp - tmNow;
  364. if( left.GetDays() > GetMaxEvaDays() || left.GetDays() < 0 )
  365. return 0;
  366. return (int)left.GetDays();
  367. }
  368. _SECRET_INLINE BOOL CSView::SetEvaCode( LPCTSTR lpszRegCode )
  369. {
  370. //如果不允许用户连续试用,取消下面两行的注释。
  371. //if( GetMaxEvaDays() > 0 )
  372. // return FALSE;
  373. CString strRegCode = lpszRegCode;
  374. strRegCode = sysstrtosysstr( strRegCode );
  375. __int64 t = sysstrtoint64( strRegCode );
  376. t &= 0xFFFFFFFF;
  377. t ^= EVACODE_MASK;
  378. __int64 now = CSPTime::GetCurrentTime().GetTime();
  379. __int64 days = t - (now/86400);
  380. if( days < 0 || days > 3650 )
  381. return FALSE;
  382. m_strR = strRegCode;
  383. SetMaxEvaDays( );
  384. ResetInsTime( );
  385. return TRUE;
  386. }
  387. _SECRET_INLINE void CSView::SetMaxEvaDays(int nDays)
  388. {
  389. m_nMaxEvaDays = nDays;
  390. }
  391. _SECRET_INLINE int CSView::GetMaxEvaDays()
  392. {
  393. return m_nMaxEvaDays;
  394. }
  395. _SECRET_INLINE CSPString CSView::GetNSAText( )
  396. {
  397. return (LPCTSTR)m_strNSAText;
  398. }
  399. _SECRET_INLINE void CSView::SetNSAText( LPCTSTR lpszNSAText )
  400. {
  401. m_strNSAText = lpszNSAText;
  402. }