⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 secret.inl.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
// Secret.inl : implementation file
//

/////////////////////////////////////////////////////////////////////////////
// CSView

/*
1 系列号结构
	CHECK-RANDM-IDENT-IFYNO
	①不输入系列号,则为试用
	②加密文件保存试用日期和系列号文本,密钥为512位
	③CHECK为RANDM-IDENT-IFYNO以及注册用户名称的Hash函数校验码
	④RANDM为随机数
	⑤IDENT-IFYNO为唯一标识,应该包含年月日时分秒信息,转换成20进制表示,
	  IDENT为高位,IFYNO为低位
	⑥所有字母为A-Z大写字母和0-9数字,不能使用以下字母和数字:
		0、O、2、Z、8、B、6、U、V、C、G、1、I、D、Q、Y
*/

// static functions
_SECRET_INLINE CString sysstrtosysstr( CString strSrc )
{
	CString	strResult;
	for( int i=strSrc.GetLength()-1; i>=0; i-- )
	{
		char	chCur	=	strSrc[i];
		strResult	+=	chCur;
	}
	return strResult;
}

_SECRET_INLINE CString strtostr( CString strSrc )
{
	CString	strResult;
	for( int i=strSrc.GetLength()-1; i>=0; i-- )
	{
		char	chCur	=	strSrc[i];
		chCur	=	char(256-chCur);
		strResult	+=	chCur;
	}
	return strResult;
}

_SECRET_INLINE int int64tostr( unsigned __int64 src, char * s, int len )
{
	char * pbuf = new char[len+1];
	if( 0 == pbuf )
		return -1;

	memset( s, 0, len );

	int n = 0;
	while( src != 0 && n < len-1 )
	{
		*(pbuf+n)	=	(unsigned char)(src % 256);
		src	=	src/256;
		n ++;
	}
	
	for( int i=n-1; i>=0; i-- )
		*(s+n-1-i)	=	*(pbuf+i);
	
	delete [] pbuf;

	if( src != 0 )
		return -1;
	return n;
}

_SECRET_INLINE unsigned __int64 strtoint64( const char * s, int len )
{
	unsigned __int64	x	=	0;
	int n = 0;
	while (n<len)
	{
		x = x * 256 + (unsigned __int64)((unsigned char)*s);
		s += 1;
		n += 1;
	}
	return x;
}

_SECRET_INLINE CString int64tosysstr( unsigned __int64 src )
{
	char	szSystem20[SE_LEN_SYSTEMSTR+1]	=	SE_SYSTEM20_CHAR;

	CString	strResult;
	while( src > 0 )
	{
		strResult	=	szSystem20[ src % SE_LEN_SYSTEMSTR ] + strResult;
		src	=	src / SE_LEN_SYSTEMSTR;
	}
	return strResult;
}

_SECRET_INLINE unsigned __int64 sysstrtoint64( CString strSrc )
{
	char	szSystem20[SE_LEN_SYSTEMSTR+1]	=	SE_SYSTEM20_CHAR;

	unsigned __int64	result	=	0;
	unsigned __int64	w	=	1;
	for( int i=strSrc.GetLength()-1; i>=0; i-- )
	{
		int k;
		for( k=0; k<SE_LEN_SYSTEMSTR; k++ )
		{
			if( strSrc[i] == szSystem20[k] )
			{
				result	+=	k * w;
			}
		}
		if( k == SE_LEN_SYSTEMSTR )
		{
			TRACE( "sysstrtoint64, s is not sysstr.\n" );
		}
		w	*=	SE_LEN_SYSTEMSTR;
	}
	return result;
}

_SECRET_INLINE CString strtosysstr( const char * s, int len )
{
	vlong	vstr( s, len, FALSE );

	CString	strResult;
	char	* psysstr = new char [len*3+2];
	if( psysstr )
	{
		memset( psysstr, 0, len*3+2 );
		vstr.to_sysstr( psysstr, len*3+1 );
		strResult	=	psysstr;
		delete	[] psysstr;
	}
	return strResult;
}

_SECRET_INLINE CSPString CSView::GetS( )
{
	DWORD	id	=	SE_MASK_SOFTNO;
	// WILLDO
	// ::GetVolumeInformation( "C:\\", NULL, 0, &id, NULL, NULL, NULL, 0 );
	// id	=	(DWORD) getHardDriveComputerID ();
	// id	=	id ^ SE_MASK_SOFTNO;

	CString	strSerial	=	int64tosysstr( (unsigned __int64)id );
	return (LPCTSTR)strSerial;
}

_SECRET_INLINE BOOL CSView::Valid( LPCTSTR lpszSrc, LPCTSTR lpszRegCode, public_key & rsapub )
{
	CString	strSrc	=	lpszSrc;
	CString	strRegCode	=	lpszRegCode;

	/* Convert strRegCode to strDest */
	CString	strDest;
	for( int i=0; i<strRegCode.GetLength(); i++ )
	{
		if( strRegCode[i] != '-' )	strDest	+=	strRegCode[i];
	}

	/* Length Valid */
	if( strSrc.GetLength() < SE_MIN_RSASYSSTR || strSrc.GetLength() > SE_MAX_RSASYSSTR
		|| strDest.GetLength() < SE_MIN_RSASYSSTR || strDest.GetLength() > SE_MAX_RSASYSSTR )
		return FALSE;
	
	/* RSA Decrypt With Public Key*/
	vlong	vDest( strDest, strDest.GetLength(), TRUE );
	if( vDest > rsapub.m )
		return FALSE;
	vlong	vSrcCal = rsapub.encrypt( vDest );

	/* Convert vSrcCal to bufSrcCal */
	char	bufSrcCal[SE_MAX_RSASYSSTR+2];
	memset( bufSrcCal, 0, sizeof(bufSrcCal) );
	int	nBufSrcCalLen = vSrcCal.to_sysstr( bufSrcCal, sizeof(bufSrcCal)-1 );
	if( -1 == nBufSrcCalLen /*|| nBufSrcCalLen < SE_MIN_RSASYSSTR*/ || nBufSrcCalLen > SE_MAX_RSASYSSTR )
		return FALSE;

	/* Prepare strSrc */
	strSrc.MakeUpper();
	strSrc	=	sysstrtosysstr( strSrc );

	/* Modified Jan 5, 2003 */
	/* 3 is 0, and is not showed in bufSrcCal */
	char	szSystem20[SE_LEN_SYSTEMSTR+1]	=	SE_SYSTEM20_CHAR;
	while( strSrc.GetLength() > nBufSrcCalLen && strSrc.GetLength() > 0 && szSystem20[0] == strSrc[0] )
		strSrc	=	strSrc.Mid( 1 );

	/* Compare */
	return ( nBufSrcCalLen == strSrc.GetLength()
		&& 0 == strncmp( strSrc, bufSrcCal, nBufSrcCalLen ) );
}

_SECRET_INLINE BOOL CSView::ValidStd( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, LPCTSTR lpszRegCode )
{
	// WILLDO For Standard Versions, No Standard Version Now
	return FALSE;

	CString	strUser	=	lpszUser;
	CString	strSoftNO	=	lpszSoftNO;
	CString	strRegCode	=	lpszRegCode;

	if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
		|| strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
		return FALSE;

	if( -1 == m_mStdlen || -1 == m_eStdlen )
	{
		// ASSERT( FALSE );
		return FALSE;
	}

	public_key	rsapub;
	rsapub.m	=	vlong( m_mStd, m_mStdlen, FALSE );
	rsapub.e	=	vlong( m_eStd, m_eStdlen, FALSE );

	strUser.MakeUpper( );
	return Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub );
}

_SECRET_INLINE BOOL CSView::ValidProf( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, LPCTSTR lpszRegCode )
{
	CString	strUser	=	lpszUser;
	CString	strSoftNO	=	lpszSoftNO;
	CString	strRegCode	=	lpszRegCode;

	if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
		|| strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
		return FALSE;

	if( -1 == m_mProflen || -1 == m_eProflen )
	{
		// ASSERT( FALSE );
		return FALSE;
	}

	public_key	rsapub;
	rsapub.m	=	vlong( m_mProf, m_mProflen, FALSE );
	rsapub.e	=	vlong( m_eProf, m_eProflen, FALSE );

	strUser.MakeUpper( );
	return Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub );
}

////////////////////////////////////////////////////////////////////////////////////
// Function Cannot Dispatched Begin

#define	EVACODE_MASK	0x128932A2

_SECRET_INLINE BOOL CSView::DumpEva( long tm, CSPString &strRegCode )
{
	__int64	t		=	tm / 86400;
	__int64 rand	=	tm % 86400;
	t	^=	EVACODE_MASK;
	t	|=	(rand << 32);
	CString str = int64tosysstr( t );
	strRegCode = sysstrtosysstr( str );
	return (strRegCode.GetLength() > 0);
}

_SECRET_INLINE BOOL CSView::Dump( LPCTSTR lpszSrc, CSPString &strRegCode, private_key & rsapri )
{
	CString	strSrc	=	lpszSrc;

	if( strSrc.GetLength() < SE_MIN_RSASYSSTR || strSrc.GetLength() > SE_MAX_RSASYSSTR )
		return FALSE;

	// Prepare strSrc
	strSrc.MakeUpper();
	strSrc	=	sysstrtosysstr( strSrc );

	// RSA Encrypt With Private Key
	vlong	vSrc( strSrc, strSrc.GetLength(), TRUE );
	if( vSrc >= rsapri.m )
		return FALSE;
	vlong vDest = rsapri.decrypt( vSrc );

	// Convert vDest to bufDest
	char	bufDest[SE_MAX_RSASYSSTR+2];
	memset( bufDest, 0, sizeof(bufDest) );
	int	nBufDestLen = vDest.to_sysstr( bufDest, sizeof(bufDest)-1 );
	if( -1 == nBufDestLen || nBufDestLen < SE_MIN_RSASYSSTR || nBufDestLen > SE_MAX_RSASYSSTR )
		return FALSE;

	// Convert bufDest to strDest
	CSPString	strDest	=	bufDest;

	// Convert strDest to strDest
	strRegCode.Empty();
	while( strDest.GetLength() > 0 )
	{
		if( strDest.GetLength() <= SE_LEN_SEPREGCODE )
		{
			strRegCode	+=	strDest;
			strDest.Empty();
		}
		else
		{
			strRegCode	+=	strDest.Left( SE_LEN_SEPREGCODE );
			strRegCode	+=	'-';
			strDest	=	strDest.Mid( SE_LEN_SEPREGCODE );
		}
	}

	return TRUE;
}

_SECRET_INLINE BOOL CSView::Dump( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode,
									const char * r1, const char *r2 )
{
	CString	strUser	=	lpszUser;
	CString	strSoftNO	=	lpszSoftNO;

	if( strUser.GetLength() < SE_MIN_USERNAME || strUser.GetLength() > SE_MAX_USERNAME
		|| strSoftNO.GetLength() < SE_MIN_SOFTNO || strSoftNO.GetLength() > SE_MAX_SOFTNO )
		return FALSE;

	private_key	rsapri;
	rsapri.create( r1, r2 );
	strUser.MakeUpper( );
	BOOL b = Dump( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapri );

	public_key	rsapub;
	rsapub.m	=	rsapri.m;
	rsapub.e	=	rsapri.e;
	return ( b && Valid( strtosysstr( strUser, 2 ) + strSoftNO, strRegCode, rsapub ) );
}

_SECRET_INLINE BOOL CSView::DumpStd( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode )
{
	return Dump( lpszUser, lpszSoftNO, strRegCode, SE_SEED_STD1, SE_SEED_STD2 );
}

_SECRET_INLINE BOOL CSView::DumpProf( LPCTSTR lpszUser, LPCTSTR lpszSoftNO, CSPString &strRegCode )
{
	return Dump( lpszUser, lpszSoftNO, strRegCode, SE_SEED_PROF1, SE_SEED_PROF2 );
}

_SECRET_INLINE BOOL CSView::SetME( )
{
	private_key	rsapriStd;
	rsapriStd.create( SE_SEED_STD1, SE_SEED_STD2 );

	m_mStdlen	=	rsapriStd.m.to_str( m_mStd, sizeof(m_mStd)-1 );
	m_eStdlen	=	rsapriStd.e.to_str( m_eStd, sizeof(m_eStd)-1 );

	private_key	rsapriProf;
	rsapriProf.create( SE_SEED_PROF1, SE_SEED_PROF2 );

	m_mProflen	=	rsapriProf.m.to_str( m_mProf, sizeof(m_mProf)-1 );
	m_eProflen	=	rsapriProf.e.to_str( m_eProf, sizeof(m_eProf)-1 );

	return TRUE;
}

_SECRET_INLINE BOOL CSView::SetURDir( LPCTSTR lpszUser, LPCTSTR lpszRegCode )
{
	m_strU	=	strtostr( lpszUser );
	m_strR	=	strtostr( lpszRegCode );
	return TRUE;
}

// Function Cannot Dispatched Ended
////////////////////////////////////////////////////////////////////////////////////

_SECRET_INLINE CSPString	CSView::GetU( )
{
	return (LPCTSTR)strtostr(m_strU);
}

_SECRET_INLINE CSPString	CSView::GetR( )
{
	return (LPCTSTR)strtostr(m_strR);
}

_SECRET_INLINE BOOL CSView::SetUR( LPCTSTR lpszUser, LPCTSTR lpszRegCode )
{
	if( !ValidStd( lpszUser, GetS(), lpszRegCode )
		&& !ValidProf( lpszUser, GetS(), lpszRegCode ) )
		return FALSE;

	m_strU	=	strtostr( lpszUser );
	m_strR	=	strtostr( lpszRegCode );
	return TRUE;
}

_SECRET_INLINE void CSView::SetInsTimeIfNull( )
{
	CSPTime	tmNow	=	CSPTime::GetCurrentTime();

	if( NULL == m_tmIns.GetTime() )
		m_tmIns	=	tmNow;
	if( NULL == m_tmExp.GetTime() )
		m_tmExp	=	m_tmIns+CSPTimeSpan(GetMaxEvaDays(),23,0,0);
}

_SECRET_INLINE void CSView::ResetInsTime( )
{
	CSPTime	tmNow	=	CSPTime::GetCurrentTime();

	m_tmIns	=	tmNow;
	m_tmExp	=	m_tmIns+CSPTimeSpan(GetMaxEvaDays(),23,0,0);
}

_SECRET_INLINE BOOL CSView::IsEva( )
{
	if( !ValidStd( strtostr(m_strU), GetS(), strtostr(m_strR) )
		&& !ValidProf( strtostr(m_strU), GetS(), strtostr(m_strR) ) )
		return TRUE;

	return FALSE;
}

_SECRET_INLINE BOOL CSView::IsStd( )
{
	return ValidStd( strtostr(m_strU), GetS(), strtostr(m_strR) );
}

_SECRET_INLINE BOOL CSView::IsProf( )
{
	return ValidProf( strtostr(m_strU), GetS(), strtostr(m_strR) );
}

_SECRET_INLINE BOOL CSView::AssertValid( )
{
	if( IsEva() && GetLeft() <= 0 )
		return FALSE;
	return TRUE;
}

_SECRET_INLINE int CSView::GetLeft( )
{
	// WILLDO
	// return	GetMaxEvaDays() + 10;	//	No Time Limit

	SetInsTimeIfNull( );

	CSPTime	tmNow	=	CSPTime::GetCurrentTime();

	CSPTimeSpan	used	=	tmNow - m_tmIns;
	if( used.GetDays() > GetMaxEvaDays() )
		return 0;

	CSPTimeSpan	left	=	m_tmExp - tmNow;
	if( left.GetDays() > GetMaxEvaDays() || left.GetDays() < 0 )
		return 0;
	return (int)left.GetDays();
}

_SECRET_INLINE BOOL CSView::SetEvaCode( LPCTSTR lpszRegCode )
{
	//如果不允许用户连续试用,取消下面两行的注释。
	//if( GetMaxEvaDays() > 0 )
	//	return FALSE;

	CString	strRegCode = lpszRegCode;

	strRegCode = sysstrtosysstr( strRegCode );
	__int64 t = sysstrtoint64( strRegCode );
	t	&=	0xFFFFFFFF;
	t	^=	EVACODE_MASK;
	__int64 now = CSPTime::GetCurrentTime().GetTime();
	__int64	days = t - (now/86400);

	if( days < 0 || days > 3650 )
		return FALSE;

	m_strR = strRegCode;
	SetMaxEvaDays( );
	ResetInsTime( );
	return TRUE;
}

_SECRET_INLINE void CSView::SetMaxEvaDays(int nDays)
{
	m_nMaxEvaDays = nDays;
}

_SECRET_INLINE int CSView::GetMaxEvaDays()
{
	return m_nMaxEvaDays;
}

_SECRET_INLINE CSPString	CSView::GetNSAText( )
{
	return (LPCTSTR)m_strNSAText;
}

_SECRET_INLINE void CSView::SetNSAText( LPCTSTR lpszNSAText )
{
	m_strNSAText	=	lpszNSAText;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -