Ejemplo n.º 1
0
BOOL GetNextTcpInfo(HTCPINFO* p_pHTcp, T_TCPINFO* p_pTcpInfo, TcpState p_nTcpState)
{
	if(p_pHTcp == NULL)
		return FALSE;

	struct socket *   tmpso = ((struct socket *)(*p_pHTcp))->next;
	*p_pHTcp = NULL;

	LOCK_NET_RESOURCE(NET_RESID);
	ENTER_CRIT_SECTION();
	//locknet_check(&soq);  /* make sure queue is protected */

	for(;tmpso != NULL;tmpso=tmpso->next)
	{
		if((tmpso->so_domain == AF_INET6) && (tmpso->so_type==SOCK_STREAM)) //just ipv6 tcp connections
		{
			if(p_nTcpState == TCP_STATE_LISTEN)
			{
				if (((struct tcpcb *)tmpso->so_pcb->inp_ppcb)->t_state == TCPS_LISTEN)
				{
					strcpy(p_pTcpInfo->pcLocalAddr,FormatHex((void*)tmpso->so_pcb->ip6_laddr.addr,IPV6_ADDR_LEN,-1));
					p_pTcpInfo->shLocalPort = ntohs(tmpso->so_pcb->inp_lport);

					strcpy(p_pTcpInfo->pcForeignAddr,FormatHex((void*)tmpso->so_pcb->ip6_faddr.addr,IPV6_ADDR_LEN,-1));
					p_pTcpInfo->shForeignPort= ntohs(tmpso->so_pcb->inp_fport);

					*p_pHTcp = tmpso;
					break;
				}
			}

			if(p_nTcpState == TCP_STATE_ACTIVE)
			{
				if (((struct tcpcb *)tmpso->so_pcb->inp_ppcb)->t_state == TCPS_ESTABLISHED)
				{
					strcpy(p_pTcpInfo->pcLocalAddr,FormatHex((void*)tmpso->so_pcb->ip6_laddr.addr,IPV6_ADDR_LEN,-1));
					p_pTcpInfo->shLocalPort = ntohs(tmpso->so_pcb->inp_lport);

					strcpy(p_pTcpInfo->pcForeignAddr,FormatHex((void*)tmpso->so_pcb->ip6_faddr.addr,IPV6_ADDR_LEN,-1));
					p_pTcpInfo->shForeignPort= ntohs(tmpso->so_pcb->inp_fport);

					*p_pHTcp = tmpso;
					break;
				}
			}
		}
	}

	//queue_check(&soq);         /* make sure queue is not corrupted */
	EXIT_CRIT_SECTION();   /* restore int state */
	UNLOCK_NET_RESOURCE(NET_RESID);

   if(*p_pHTcp == NULL)
	   return FALSE;

	return TRUE;
}
Ejemplo n.º 2
0
void CRplRootApp::registerToNMS( )
{
	if ( !g_pApp->m_stCfg.m_nUseUplinkIpv6ForFar ||
		 g_pApp->m_stCfg.m_nBHManagerEnabled )
	{
		return;
	}

	const TIpv6Prefix& farAddr = GetFarAddress( );

	//1) register far with parent nms
	uint8_t nmsId[IPv6_HOST_ID_LEN];
	memset( nmsId, 0, IPv6_HOST_ID_LEN );
	nmsId[IPv6_HOST_ID_LEN - 1] = 1;
	nmsId[IPv6_HOST_ID_LEN - 5] = 1;


	NLOG_DBG( "Registering far, addr=%s as child of nms, id=%s",
			  FormatIPv6Prefix( farAddr.m_oIPv6Addr.m_pucBytes, PrefixLenInBytes( farAddr.m_u8PrefixLen ) ),
			  FormatHex( nmsId, IPv6_HOST_ID_LEN, DELIM_NONE ) );

	AddTopologyNotificationEncap( MgmtProtocol::CMgmtPMessage::EVENT_REGISTER,
								  GetFarId( ), farAddr, MgmtProtocol::TYPE_GR,
								  nmsId, MgmtProtocol::TYPE_NMS );

	//2) register root with parent far

	const TIpv6Prefix& rootAddr = GetRootAddress( );

	NLOG_DBG( "Registering root, addr %s as child of far, id %s",
			 FormatIPv6Prefix( rootAddr.m_oIPv6Addr.m_pucBytes, PrefixLenInBytes( rootAddr.m_u8PrefixLen ) ),
			 FormatHex( GetFarId( ), IPv6_HOST_ID_LEN, DELIM_NONE ) );

	AddTopologyNotificationEncap( MgmtProtocol::CMgmtPMessage::EVENT_REGISTER, NULL,
								 rootAddr, MgmtProtocol::TYPE_RplRoot, GetFarId( ),
								 MgmtProtocol::TYPE_GR );

    m_shpoCnsTopoNotifMsg->m_uSendMaxRetries = SEND_INFINITE_RETRIES;
	m_pMgmtClientLink->SendMessage( m_shpoCnsTopoNotifMsg );
	m_shpoCnsTopoNotifMsg->OptionListReset( );
    m_shpoCnsTopoNotifMsg->m_uSendMaxRetries = DEFAULT_SEND_MAX_RETRIES;
}
Ejemplo n.º 3
0
void CRplRootApp::SendNotificationForMac ( const uint8_t* p_pu8Mac, CMapShortAddrMgr::DeviceType4E p_pDeviceType4E )
{
    CRplTopology::CRplTopologyNode* pNode = g_pApp->m_pRplTopology->GetNewestNodeOnlyByMac ( p_pu8Mac );
    if ( !pNode )
    {
        NLOG_WARN ( "SendNotificationForMac, mac=%s is not RPL registered yet", FormatHex ( p_pu8Mac, 8, -1 ) );
        return;
    }

   AddTopologyNotificationEncap ( MgmtProtocol::CMgmtPMessage::EVENT_REGISTER,
            NULL,
            pNode->m_oAddress,
            DeviceType4EToDeviceTypeMgmtP ( p_pDeviceType4E, (const TIpv6Addr *)&pNode->m_oAddress),
            GetFarId ( ),
            MgmtProtocol::TYPE_GR );
}
Ejemplo n.º 4
0
 bool isRadio (const TIpv6Addr *p_poIPv6Addr)
 {
 	FILE *tmp = fopen("/opt/iprf/activity_files/tranceivers.txt", "r");
 	const char* mac = FormatHex(p_poIPv6Addr->m_pucBytes + 8, MAC_ADDR_LEN, -1);
 	NLOG_DBG("looking for MAC %s.", mac);
 	if (tmp)
 	{
 		char ip[255] = {0};
 		const char* address = FormatIPv6(p_poIPv6Addr);
 		while (fgets( ip, sizeof(ip),tmp) != NULL)
 		{
 			if ((strstr(ip, address) != NULL) || (strstr(ip, mac) != NULL))
 			{
 				NLOG_DBG("%s is a  transceiver.", address);
 				fclose (tmp);
 				return true;
 			}
 		}

 		fclose (tmp);
 		NLOG_DBG("%s is NOT a  transceiver.", address);
 	}
 	return false;
 }
Ejemplo n.º 5
0
void SixLPRPCDiscIn_RS(const uint8_t* p_pPayload, uint16_t p_uwPayloadLength,
									   const TIpv6Addr* p_pSrcAddr,
									   const TIpv6Addr* p_pDstAddr,
									   StackNetIF p_NetIF)
{
	//
    uint8_t allRoutersMulticast[] = { 0xFF, 0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2};
    if (!Ipv6Addr_islinklocal(p_pDstAddr) && memcmp(allRoutersMulticast, p_pDstAddr, IPV6_ADDR_LEN))
    {	C_NLOG_ERR("In_RS: No Unicast/FF02::2");
		return;
    }
	    
    //
	if(p_uwPayloadLength != sizeof(TRSMsg) + sizeof(TSLLAOpt64))
    {   C_NLOG_ERR("In_RS: size %d != %d", p_uwPayloadLength, sizeof(TRSMsg) + sizeof(TSLLAOpt64));
		return;
	}

	//ntoh
	if (!SixLPanData_NToH((uint8_t*)p_pPayload, p_uwPayloadLength))
    {   C_NLOG_ERR("In_RS: ntoh");
		return;
    }

	C_NLOG_INFO("In_RS: %s <- %s", FormatIPv6(p_pDstAddr), FormatIPv6(p_pSrcAddr));

    //
	TSLLAOpt64*  pSLLAO = (TSLLAOpt64*)(p_pPayload + sizeof(TRSMsg));


	//search Neighbor entry
	TRplNeighbor*	pNeigh;
	pNeigh = RplNeighborsSet_FindByIPv6 (&g_oRplNeighborsSet, p_pSrcAddr->m_pucBytes);
	if(!pNeigh)
	{	pNeigh = RplNeighborsSet_Add(&g_oRplNeighborsSet,GET_HOST_ID_FROM_IPV6(p_pSrcAddr));
		if(!pNeigh)
        {   C_NLOG_ERR("In_RS: NTable is full!");
			return;
		}
		//
        if (memcmp(GET_HOST_ID_FROM_IPV6(p_pSrcAddr), pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN) == 0)
		{	pNeigh->m_u1HostEqualMAC = 1;		
		}
		else
		{	pNeigh->m_u1ObsMacSet = 1;
			memcpy(pNeigh->m_pu8ObsMacAddr, pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN);
			C_NLOG_WARN("In_RS: HostId=%s != ObsMac=%s", 
					FormatHex (GET_HOST_ID_FROM_IPV6(p_pSrcAddr), IPv6_HOST_ID_LEN, DELIM_NONE), 
					FormatHex (pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN, DELIM_NONE));
		}
		pNeigh->m_NetIF				= p_NetIF;
		pNeigh->m_nLastRecv			= os_adapt_time();
		//
        if (Ipv6Addr_IsMulticast(p_pDstAddr))
        {   pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_TENT;
            pNeigh->m_6LPanNDNeighInf.neighb.tenthost.m_u32TentLifetime = os_adapt_time() + _6LPND_TENTATIVE_NCE_LIFETIME;
        }
        else
        {   pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_GCOLLECT;
            pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime = 0;
        }
	}
    else
    {  //check mac
        if (pNeigh->m_u1ObsMacSet)
        {   if (memcmp(pNeigh->m_pu8ObsMacAddr, pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN))
            {   C_NLOG_ERR("In_RS: ObsMac is different!!!");
                return;
            }
        }
        if (Ipv6Addr_IsMulticast(p_pDstAddr))
        {   pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_TENT;
            pNeigh->m_6LPanNDNeighInf.neighb.tenthost.m_u32TentLifetime = os_adapt_time() + _6LPND_TENTATIVE_NCE_LIFETIME;
        }
        else
        {	
	        if (pNeigh->m_6LPanNDNeighInf.m_state == _6LPND_NEIGHBOR_STATE_NONE)
            {   pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_GCOLLECT;
	        	pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime = 0;
            }
        }
    }

    //send solicit ra_msg?
    if ( !GET_ISTR( &g_oRplNodeInstance.m_pRplInstBase->m_oRplConfig ) )
    {	if (!g_6LPanNDNodeConfig.m_u86LPNDEnableSolicitRA)
			return;
    }
    //do send...
	C_NLOG_INFO("In_RS: RA->%s", FormatIPv6(p_pSrcAddr));
	do
	{	TSixLPanNDRPCElem* pRPCElem = NULL;
		HNDRPCElem hElem = SixLPanNDRPCTable_GetFirstElem(&g_6LPanNDRPCTable, &pRPCElem);
		if (hElem == HNDRPCElem_NO_ELEM)
		{	C_NLOG_WARN("In_RS: NO DATA(RA->%s)", FormatIPv6(p_pSrcAddr));
			break;
		}
		uint32_t unDataLen = SixLPNDCreateRAOnNode(g_pu8RplTmpBuffer, MAX_TMP_BUFF_SIZE, &pRPCElem->m_oRAAdv, &pRPCElem->m_oBRouter, &pRPCElem->m_oOffLinkPrefixInfo, &pRPCElem->m_oContextList);
		SixLPNDSendMsg(p_pDstAddr, p_pSrcAddr, g_pu8RplTmpBuffer, unDataLen, MAX_TMP_BUFF_SIZE, 1/*Add SLLA*/, p_NetIF);
				
    	while(1)
		{	hElem = SixLPanNDRPCTable_GetNextElem(&g_6LPanNDRPCTable, hElem, &pRPCElem);
			if (hElem == HNDRPCElem_NO_ELEM)
				break;
			unDataLen = SixLPNDCreateRAOnNode(g_pu8RplTmpBuffer, MAX_TMP_BUFF_SIZE, &pRPCElem->m_oRAAdv, &pRPCElem->m_oBRouter, &pRPCElem->m_oOffLinkPrefixInfo, &pRPCElem->m_oContextList);
			SixLPNDSendMsg(p_pDstAddr, p_pSrcAddr, g_pu8RplTmpBuffer, unDataLen, MAX_TMP_BUFF_SIZE, 1/*Add SLLA*/, p_NetIF);
		}
	}while(0);
}
Ejemplo n.º 6
0
void SixLPRPCDiscIn_RA(const uint8_t* p_pPayload, uint16_t p_uwPayloadLength,
									   const TIpv6Addr* p_pSrcAddr,
									   const TIpv6Addr* p_pDstAddr,
									   StackNetIF p_NetIF)
{
	//
    uint8_t allRoutersMulticast[] = { 0xFF, 0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2 };
    if (!Ipv6Addr_islinklocal(p_pDstAddr) && memcmp(allRoutersMulticast, p_pDstAddr, IPV6_ADDR_LEN))
    {	C_NLOG_ERR("In_RA: No Unicast/FF01::2");
		return;
    }

    //ntoh
	if (!SixLPanData_NToH((uint8_t*)p_pPayload, p_uwPayloadLength))
    {   C_NLOG_ERR("In_RA: ntoh");
		return;
    }

	C_NLOG_INFO("In_RA: %s <- %s", FormatIPv6(p_pDstAddr), FormatIPv6(p_pSrcAddr));
	if (C_NLOG_IS_ENABLED(RPL_NLOG_LVL_DBG))
		SixLPanData_Log( p_pPayload, p_uwPayloadLength);

        
    //
    uint32_t unSmallestRelExpTimerSec = 0xFFFFFFFF;
	TRAMsg* pRA = (TRAMsg*)p_pPayload;
	TABROpt* pABR = NULL;
	TPIOpt* pPI = NULL;
	TContextOption* pC =  NULL;
	TSLLAOpt64 *pSLLAO = NULL;
	int nOffset = sizeof(TRAMsg);
	while (nOffset < p_uwPayloadLength)
	{	switch(p_pPayload[nOffset])
		{	case ABRO_TYPE:
				pABR = (TABROpt*)(p_pPayload + nOffset);
				if (pABR->m_u16ValidLifetime * 60 < unSmallestRelExpTimerSec)
					unSmallestRelExpTimerSec = pABR->m_u16ValidLifetime * 60;
				break;
			case PREF_INFO_TYPE:
				pPI = (TPIOpt*)(p_pPayload + nOffset);
				if (pPI->m_u32ValidLife < unSmallestRelExpTimerSec)
					unSmallestRelExpTimerSec = pPI->m_u32ValidLife;
				break;
			case OPTION_CONTEXT:
				pC = (TContextOption*)(p_pPayload + nOffset);
				if (pC->m_u16ValidLifetime * 60 < unSmallestRelExpTimerSec)
					unSmallestRelExpTimerSec = pC->m_u16ValidLifetime * 60;
				break;
			case SLLAO_TYPE:
				pSLLAO = (TSLLAOpt64*)(p_pPayload + nOffset);
				break;
			default:
				break;
		}
		nOffset += p_pPayload[nOffset + 1]*8;
	}
	if (pRA->m_u16Lifetime < unSmallestRelExpTimerSec)
		unSmallestRelExpTimerSec = pRA->m_u16Lifetime;
	if (pABR == NULL || pPI == NULL || pC == NULL || pSLLAO == NULL)
	{	C_NLOG_ERR("In_RA: missing opt(s)!");
	    return;
	}
	
	
    //search Neighbor entry
	TRplNeighbor*	pNeigh;
	pNeigh = RplNeighborsSet_FindByIPv6 (&g_oRplNeighborsSet, p_pSrcAddr->m_pucBytes);
	if(!pNeigh)
	{	pNeigh = RplNeighborsSet_Add(&g_oRplNeighborsSet,GET_HOST_ID_FROM_IPV6(p_pSrcAddr));
		if(!pNeigh)
        {   C_NLOG_ERR("In_RA: NTable is full!");
			return;
		}
        
		//
	    if (memcmp(GET_HOST_ID_FROM_IPV6(p_pSrcAddr), pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN) == 0)
		{	pNeigh->m_u1HostEqualMAC = 1;		
		}
		else
		{	pNeigh->m_u1ObsMacSet = 1;
			memcpy(pNeigh->m_pu8ObsMacAddr, pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN);
			C_NLOG_WARN("In_RA: HostId=%s != ObsMac=%s", 
					FormatHex (GET_HOST_ID_FROM_IPV6(p_pSrcAddr), IPv6_HOST_ID_LEN, DELIM_NONE), 
					FormatHex (pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN, DELIM_NONE));
		}
		pNeigh->m_NetIF				= p_NetIF;
		pNeigh->m_nLastRecv			= os_adapt_time();
		//
        pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_GCOLLECT;
        pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime = 0;
	}
    else
    {
        //check mac
        if (pNeigh->m_u1ObsMacSet)
        {   if (memcmp(pNeigh->m_pu8ObsMacAddr, pSLLAO->m_pu8LLAddr, MAC_ADDR_LEN))
            {   C_NLOG_ERR("In_RA: ObsMac different!!!");
                return;
            }
        }
        if (pNeigh->m_6LPanNDNeighInf.m_state == _6LPND_NEIGHBOR_STATE_NONE)
        {   pNeigh->m_6LPanNDNeighInf.m_state = _6LPND_NEIGHBOR_STATE_GCOLLECT;
            pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime = 0;
        }
    }

    
    //
    unsigned int unCrntTime = (unsigned int) os_adapt_time();
    
    //check input
	if (!memcmp(&allRoutersMulticast, p_pDstAddr, IPV6_ADDR_LEN))
	{	return;	//we are done
	}
    if (pNeigh->m_6LPanNDNeighInf.m_state == _6LPND_NEIGHBOR_STATE_GCOLLECT &&
            pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime > unCrntTime)
    {   C_NLOG_WARN("In_RA: penalty");
        return;
    }
    if (pNeigh->m_6LPanNDNeighInf.m_state != _6LPND_NEIGHBOR_STATE_GCOLLECT)
    {   C_NLOG_WARN("In_RA: No GCollect State");
        return;
    }
    if (PrefixInformationOption_L_GET((TPrefixInformationOption*)pPI) || !PrefixInformationOption_A_GET((TPrefixInformationOption*)pPI))
	{	C_NLOG_ERR ("In_RA: L=%d A=%d not usable", PrefixInformationOption_L_GET((TPrefixInformationOption*)pPI), !PrefixInformationOption_A_GET((TPrefixInformationOption*)pPI));
		return;
	}
    

	//we have router info
	int nStartRA = 0;
	TSixLPanNDBRouter	oBRouter;
    memcpy(oBRouter.m_pu8IPv6Addr, pABR->m_pu8BorderRouterAddr, IPV6_ADDR_LEN);
    TSixLPanNDRPCElem* pSixLPanNDRPCElem = SixLPanNDRPCTable_FindElem(&g_6LPanNDRPCTable, &oBRouter);
    //new info
    if (!pSixLPanNDRPCElem)
    {	if (SixLPanNDRPCTable_IsFull(&g_6LPanNDRPCTable))
    	{	C_NLOG_WARN("In_RA: RPCTable is FULL");
	    	return;
    	}	
	    C_NLOG_WARN("In_RA: no context, add it");
	    
        TSixLPanNDRPCElem	oSixLPanNDRPCElem;
		
        //
        SixLPanNDRAAdv_FromOption_ND(&oSixLPanNDRPCElem.m_oRAAdv, pRA, unCrntTime);
        SixLPanNDBRouter_FromOption_ND(&oSixLPanNDRPCElem.m_oBRouter, pABR, unCrntTime);
        PrefixInformation_FromOption_ND(&oSixLPanNDRPCElem.m_oOffLinkPrefixInfo, (TPrefixInformationOption*)pPI, unCrntTime);
        NList_Init(&oSixLPanNDRPCElem.m_oContextList);
		NList_Clear(&oSixLPanNDRPCElem.m_oContextList);
        TContext *pContext = os_adapt_alloc(sizeof(TContext));
        if (pContext == NULL)
        {   C_NLOG_ERR("In_RA: allocate ctxt");
            return;
        }
        Context_FromOption(pContext, pC, unCrntTime);
	    NList_Add(&oSixLPanNDRPCElem.m_oContextList, pContext);
	    SixLPanNDRPCTable_AddElem(&g_6LPanNDRPCTable, &oSixLPanNDRPCElem);

	    //
	    netifs_switch_offline_prefixes (NULL, &oSixLPanNDRPCElem.m_oOffLinkPrefixInfo);
	    
	    //
	    nStartRA = 1;
    }
    else
    {
	    //ABR PROCESSING
	    int nAbrLowerVerion = pSixLPanNDRPCElem->m_oBRouter.m_u16VersionHigh > pABR->m_u16VersionHigh;
	    int nAbrHigherVerion = 0;
        if (pSixLPanNDRPCElem->m_oBRouter.m_u16VersionHigh == pABR->m_u16VersionHigh)
        {	nAbrLowerVerion = pSixLPanNDRPCElem->m_oBRouter.m_u16VersionLow > pABR->m_u16VersionLow;
        	nAbrHigherVerion = !(pSixLPanNDRPCElem->m_oBRouter.m_u16VersionLow == pABR->m_u16VersionLow);
    	}else
    	{	nAbrHigherVerion = 1;
		}
        if (nAbrLowerVerion)
        {	C_NLOG_WARN ("In_RA: abro_ver is lower");
        	return;
    	}
	    if (pSixLPanNDRPCElem->m_oBRouter.m_u32ValidLifetime < unCrntTime || nAbrHigherVerion)
        {	SixLPanNDBRouter_FromOption_ND(&pSixLPanNDRPCElem->m_oBRouter, pABR, unCrntTime);   
            nStartRA = 1;
        }
        else
        {	if (pSixLPanNDRPCElem->m_oBRouter.m_u32ValidLifetime < (pABR->m_u16ValidLifetime*60 + unCrntTime)) //because it decrements
        		pSixLPanNDRPCElem->m_oBRouter.m_u32ValidLifetime = (pABR->m_u16ValidLifetime*60 + unCrntTime);
        }
	    
        //RA PROCESSING
	    if (pRA->m_u16Lifetime == 0)
	    {	C_NLOG_ERR ("In_RA: unexpected value");
	    	return;
	    }
	    if (pSixLPanNDRPCElem->m_oRAAdv.m_u32ValidLifetime < unCrntTime ||
	    		pSixLPanNDRPCElem->m_oRAAdv.m_un6LPNDAdvReachableTimerMs != pRA->m_u32ReachableTime || 
	    		pSixLPanNDRPCElem->m_oRAAdv.m_un6LPNDAdvRetransTimerMS != pRA->m_u32RetransTimer)
        {	SixLPanNDRAAdv_FromOption_ND(&pSixLPanNDRPCElem->m_oRAAdv, pRA, unCrntTime);
	    	nStartRA = 1;
        }
        else
        {	if (pSixLPanNDRPCElem->m_oRAAdv.m_u32ValidLifetime < (pRA->m_u16Lifetime + unCrntTime)) //because it decrements
        		pSixLPanNDRPCElem->m_oRAAdv.m_u32ValidLifetime = (pABR->m_u16ValidLifetime + unCrntTime);
        }
        
	    
	    //PIO PROCESSING
        int nPIOChanged = 0;
    	TPrefixInformationOption* pOption = (TPrefixInformationOption*)pPI;
		TPrefixInformation oOffLinkPrefixInfo = pSixLPanNDRPCElem->m_oOffLinkPrefixInfo;
		if (pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u1ValidPrefixInfo == 0)
		{	PrefixInformation_FromOption_ND(&pSixLPanNDRPCElem->m_oOffLinkPrefixInfo, pOption, unCrntTime);
            nPIOChanged = 1;
            nStartRA = 1;
		}
		else
		{	int nSamePrefix = 0;
			int nPrefixBytes = PrefixLenInBytes(pOption->m_u8PrefixLength );
			if (pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_oPrefix.m_u8PrefixLen == pOption->m_u8PrefixLength )
				nSamePrefix = memcmp( pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_oPrefix.m_oIPv6Addr.m_pucBytes, pOption->m_pu8Prefix, nPrefixBytes) == 0;
			uint32_t nPrefLife = LifeTime_RelToAbs (pOption->m_u32PreferredLifetime, unCrntTime);
			uint32_t nValidLife = LifeTime_RelToAbs (pOption->m_u32ValidLifetime, unCrntTime);
			if (nSamePrefix)
			{	// as per rfc4862
				if (pOption->m_u32ValidLifetime < 2* 60 * 60 && pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u32ValidLifetime <= nValidLife)
				{	pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u32PreferredLifetime = nPrefLife;
					pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u32ValidLifetime = nValidLife;
				}
			}
            else
            {    if (pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u32PreferredLifetime <= nPrefLife || 
					    pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_u32ValidLifetime <= nValidLife)
			    {
				    PrefixInformation_FromOption_ND(&pSixLPanNDRPCElem->m_oOffLinkPrefixInfo, pOption, unCrntTime);
                    nPIOChanged = 1;
                    nStartRA = 1;
			    }
            }
		}
		if (nPIOChanged == 1)
		{	netifs_switch_offline_prefixes (&oOffLinkPrefixInfo, &pSixLPanNDRPCElem->m_oOffLinkPrefixInfo);
#ifdef	UDP_TEST_APP
			uint8_t u8Prefix[16] = {0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1};
			memcpy(u8Prefix, pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_oPrefix.m_oIPv6Addr.m_pucBytes, 8);
			udp_node_set_dest(u8Prefix, 30003);
#endif
		}
		else
		{	if (!netifs_IsRplIP6PrefixSet(&pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_oPrefix))	//it is necessary because when rpl is on and Dio comes in first then it will be nPIOChanged=0
			{	netifs_switch_offline_prefixes (NULL, &pSixLPanNDRPCElem->m_oOffLinkPrefixInfo);
#ifdef	UDP_TEST_APP
				uint8_t u8Prefix[16] = {0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1};
				memcpy(u8Prefix, pSixLPanNDRPCElem->m_oOffLinkPrefixInfo.m_oPrefix.m_oIPv6Addr.m_pucBytes, 8);
				udp_node_set_dest(u8Prefix, 30003);
#endif
			}
		}
        
		//CONTEXT PROCESSING
		nStartRA = SixLPanContext_Update(&pSixLPanNDRPCElem->m_oContextList, pC);
	}
    
	//FIND ROUTER
	if (pNeigh->m_6LPanNDNeighInf.m_state == _6LPND_NEIGHBOR_STATE_GCOLLECT && 
			pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime > unCrntTime)
	{	C_NLOG_ERR("In_RA: Mac=%s, Ptime=%u, CrtTSec=%u", 
						FormatHex (pNeigh->m_u1HostEqualMAC ? pNeigh->m_pu8IPv6HostId : pNeigh->m_pu8ObsMacAddr, MAC_ADDR_LEN, DELIM_NONE),
						pNeigh->m_6LPanNDNeighInf.neighb.gcollrouter.m_u32Penaltime, 
						unCrntTime);
		return;
	}
    int i = 0;
    int nFreeRouterSlot = FREE_ROUTER_SLOT_NONE;
    int nFreeRouterSlotNo = 0;
 	for (; i < _6LPND_HTOR_MAX_INF; ++i)
 	{	switch(g_6LPanNDNodeInst.m_6LPanNDHToRInf[i].m_u8State)
        {   case _6LPND_HTOR_STATE_DISCOVER:
                if (nFreeRouterSlot == FREE_ROUTER_SLOT_NONE)
                    nFreeRouterSlot = i;
                nFreeRouterSlotNo++;
                break;
            default:
				if (!memcmp(g_6LPanNDNodeInst.m_6LPanNDHToRInf[i].m_pu8RMac, pNeigh->m_u1HostEqualMAC ? pNeigh->m_pu8IPv6HostId : pNeigh->m_pu8ObsMacAddr, MAC_ADDR_LEN))
 			    {	
					//SET NEXT RS
					C_NLOG_INFO("In_RA: RMac=%s CrtRSTSec=%u NextRSTSec=%d", 
						FormatHex (pNeigh->m_u1HostEqualMAC ? pNeigh->m_pu8IPv6HostId : pNeigh->m_pu8ObsMacAddr, MAC_ADDR_LEN, DELIM_NONE),
						unCrntTime, unCrntTime + unSmallestRelExpTimerSec);
 			    	if (unSmallestRelExpTimerSec <= g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit)
 			    	{	C_NLOG_WARN("In_RA: RMac=%s SmallTim: %u,%u", unSmallestRelExpTimerSec, 
								g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit);
 			    		g_6LPanNDNodeInst.m_6LPanNDHToRInf[i].m_states.m_UpdState.m_u32RSTimer = unCrntTime + g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec;
 			    	}
 			    	else
 			    	{	g_6LPanNDNodeInst.m_6LPanNDHToRInf[i].m_states.m_UpdState.m_u32RSTimer = unCrntTime + unSmallestRelExpTimerSec - 
 			    										g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit;
 			    	}
                    g_6LPanNDNodeInst.m_6LPanNDHToRInf[i].m_states.m_UpdState.m_u8NoRSSent = 0;
                    return;
 			    }
                break;
        }
 	}
 	
 	//NEW ROUTER
 	if (nFreeRouterSlot != FREE_ROUTER_SLOT_NONE)
 	{	
	 	memcpy(g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_pu8RMac, pNeigh->m_u1HostEqualMAC ? pNeigh->m_pu8IPv6HostId : pNeigh->m_pu8ObsMacAddr, MAC_ADDR_LEN);
 		g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_u8State = _6LPND_HTOR_STATE_REGISTER;
 		
 		//SET NEXT NS
 		g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_states.m_RegState.m_u32RegTime = unCrntTime; //register now
        g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_states.m_RegState.m_u8NoNsSent = 0;
        
        //SET NEXT RS
		C_NLOG_INFO("In_RA: NEW RMac=%s CurrTSec=%u, NextRSTSec=%u", 
		        FormatHex (g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_pu8RMac, MAC_ADDR_LEN, DELIM_NONE),
		        unCrntTime,
		        unCrntTime + unSmallestRelExpTimerSec);
        if (unSmallestRelExpTimerSec < g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit)
		{	C_NLOG_WARN("In_RA: RMac=%s SmallTim: %u,%u", unSmallestRelExpTimerSec, 
					g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit);
			g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_states.m_UpdState.m_u32RSTimer = unCrntTime + g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec;
		}
		else
		{	g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_states.m_UpdState.m_u32RSTimer = unCrntTime + unSmallestRelExpTimerSec - 
														g_6LPanNDNodeConfig.m_u86LPNDHToRRetransTimerSec*g_6LPanNDNodeConfig.m_u86LPNDMaxUnicastSolicit;
		}
        g_6LPanNDNodeInst.m_6LPanNDHToRInf[nFreeRouterSlot].m_states.m_UpdState.m_u8NoRSSent = 0;
 	}
 	
 	//
    if (nStartRA)
        StartAdvertiseNow();
}
Ejemplo n.º 7
0
BOOL CALLBACK DlgAnalysis(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
    {
        SetLevelList(hwndDlg);
        SetDlgItemTextA(hwndDlg, IDC_EDT_HWID, "0000-0000");
        keyinfo_level=0;
    }
    return TRUE;

    case WM_CLOSE:
    {
        EndDialog(hwndDlg, 0);
    }
    return TRUE;

    case WM_HELP:
    {
        char id[10]="";
        sprintf(id, "%d", IDS_HELPANALYZE);
        SetEnvironmentVariableA("HELPID", id);
        SetEnvironmentVariableA("HELPTITLE", "Analysis Help");
        DialogBox(hInst, MAKEINTRESOURCE(DLG_HELP), hwndDlg, DlgHelp);
    }
    return TRUE;

    case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
        case IDC_BTN_ANALYZE:
        {
            NoFocus();
            char keyinfo_name[1024]="";
            char keyinfo_hwid[10]="";
            char keyinfo_key[1024]="";
            unsigned hwid=0;

            GetDlgItemTextA(hwndDlg, IDC_EDT_NAME, keyinfo_name, 1024);
            if(!GetDlgItemTextA(hwndDlg, IDC_EDT_SERIAL, keyinfo_key, 1024))
            {
                SetDlgItemTextA(hwndDlg, IDC_EDT_ADVLOG, "You need to enter a serial!");
                return TRUE;
            }
            int len=GetDlgItemTextA(hwndDlg, IDC_EDT_HWID, keyinfo_hwid, 10);
            if(len)
            {
                FormatHex(keyinfo_hwid);
                sscanf(keyinfo_hwid, "%X", &hwid);
            }

            KeyInformation info= {0};

            if(RetrieveKeyInfo(keyinfo_level, keyinfo_name, hwid, keyinfo_key, &info, hwndDlg, IDC_EDT_ADVLOG))
            {
                char temp[100]="";
                HWND log=GetDlgItem(hwndDlg, IDC_EDT_ADVLOG);
                bool xorsym=false;
                if(hwid)
                {
                    if(!xorsym)
                    {
                        xorsym=true;
                        AddLogMessage(log, "Symmetric key changes:", false);
                    }
                    sprintf(temp, "%.8X^%.8X=%.8X (keytemplateID^hwid=sym)", (unsigned int)info.symkey^hwid, (unsigned int)hwid, (unsigned int)info.symkey);
                    AddLogMessage(log, temp, false);
                }
                if(sym_xorval)
                {
                    if(!xorsym)
                    {
                        xorsym=true; //TODO: remove?
                        AddLogMessage(log, "Symmetric key changes:", false);
                    }
                    sprintf(temp, "%.8X^%.8X=%.8X (sym^xorval=newsym)", (unsigned int)info.symkey, (unsigned int)sym_xorval, (unsigned int)info.symkey^sym_xorval);
                    AddLogMessage(log, temp, false);
                }
                sprintf(temp, "%.8X", (unsigned int)info.symkey^sym_xorval);
                SetDlgItemTextA(hwndDlg, IDC_EDT_SYM, temp);
                sprintf(temp, "%.4d-%.2d-%.2d", info.createdyear, info.createdmonth, info.createdday);
                SetDlgItemTextA(hwndDlg, IDC_EDT_DATE, temp);
                sprintf(temp, "%d", info.otherinfo[0]);
                SetDlgItemTextA(hwndDlg, IDC_EDT_OTHER0, temp);
                sprintf(temp, "%d", info.otherinfo[1]);
                SetDlgItemTextA(hwndDlg, IDC_EDT_OTHER1, temp);
                sprintf(temp, "%d", info.otherinfo[2]);
                SetDlgItemTextA(hwndDlg, IDC_EDT_OTHER2, temp);
                sprintf(temp, "%d", info.otherinfo[3]);
                SetDlgItemTextA(hwndDlg, IDC_EDT_OTHER3, temp);
                sprintf(temp, "%d", info.otherinfo[4]);
                SetDlgItemTextA(hwndDlg, IDC_EDT_OTHER4, temp);
                sprintf(temp, "%.8X", (unsigned int)info.uninstallcode);
                SetDlgItemTextA(hwndDlg, IDC_EDT_UNINSTALLCODE, temp);
                if(info.keystring_length)
                    SetDlgItemTextA(hwndDlg, IDC_EDT_KEYSTRING, info.keystring);
                else
                    SetDlgItemTextA(hwndDlg, IDC_EDT_KEYSTRING, "No KeyString embedded in this key...");
                sprintf(temp, "%d", info.keystring_length);
                SetDlgItemTextA(hwndDlg, IDC_EDT_KEYSTRING_LENGTH, temp);
                SendMessageA(log, WM_VSCROLL, SB_BOTTOM, 0);
            }
        }
        return TRUE;

        case IDC_CHK_DIGITALRIVER: ///Digital River checkbox.
        {
            NoFocus();
            if(IsDlgButtonChecked(hwndDlg, LOWORD(wParam)))
            {
                CheckDlgButton(hwndDlg, IDC_CHK_ESELLERATE, BST_UNCHECKED);
                sym_xorval=0x91827364; ///Official XOR value of DigitalRiver tagged keys...
            }
            else
                sym_xorval=0;
        }
        return TRUE;

        case IDC_CHK_ESELLERATE: ///eSellerate checkbox.
        {
            NoFocus();
            if(IsDlgButtonChecked(hwndDlg, LOWORD(wParam)))
            {
                CheckDlgButton(hwndDlg, IDC_CHK_DIGITALRIVER, BST_UNCHECKED);
                sym_xorval=0x19283746; ///Official XOR value of eSellerate tagged keys...
            }
            else
                sym_xorval=0;
        }
        return TRUE;

        case IDC_COMBO_LEVEL:
        {
            switch(HIWORD(wParam))
            {
            case CBN_SELCHANGE:
            {
                bool isNoSeperator=true;
                keyinfo_level=SendDlgItemMessageA(hwndDlg, LOWORD(wParam), CB_GETCURSEL, 0, 0);
                if(keyinfo_level==1 or keyinfo_level==6 or keyinfo_level==16)
                    isNoSeperator=false;
                bool en=isNoSeperator;
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_NAME), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_SERIAL), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_HWID), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_ANALYZE), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_CHK_DIGITALRIVER), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_CHK_ESELLERATE), en);

                if(keyinfo_level>1 and keyinfo_level<6)
                    keyinfo_level--;
                else if(keyinfo_level>6 and keyinfo_level<16)
                    keyinfo_level-=2;
                else if(keyinfo_level>16)
                    keyinfo_level-=3;
            }
            return TRUE;
            }
        }
        return TRUE;
        }
    }
    return TRUE;
    }
    return FALSE;
}
Ejemplo n.º 8
0
BOOL CALLBACK KG_DlgKeyGenerate(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
    {
        SetLevelList(hwndDlg);
        SetDlgItemTextA(hwndDlg, IDC_EDT_HWID, "0000-0000");
        bool en = false;
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER1), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER2), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER3), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER4), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_KEYSTRING), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_PVT), en);
        EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_Y), en);
        ShowWindow(GetDlgItem(hwndDlg, IDC_CHK_BABOON), 0);
        keygenerate_level = -1;
        SYSTEMTIME systime = {0};
        GetSystemTime(&systime);
        char temp[20] = "";
        sprintf(temp, "%d", MakeDate(systime.wYear, systime.wMonth, systime.wDay));
        SetDlgItemTextA(hwndDlg, IDC_EDT_DATE, temp);
        sprintf(temp, "%.4d-%.2d-%.2d", systime.wYear, systime.wMonth, systime.wDay);
        SetDlgItemTextA(hwndDlg, IDC_EDT_DATEYMD, temp);
        SendDlgItemMessageA(hwndDlg, IDC_EDT_KEYSTRING, EM_SETLIMITTEXT, 255, 0);
    }
    return TRUE;

    case WM_CONTEXTMENU:
    {
        if(GetDlgCtrlID((HWND)wParam) == IDC_EDT_SERIAL)
        {
            char serial[2048] = "";
            int len = GetDlgItemTextA(hwndDlg, IDC_EDT_SERIAL, serial, 2048);
            if(!len)
                return TRUE;
            HMENU myMenu = 0;
            myMenu = CreatePopupMenu();
            AppendMenu(myMenu, MF_STRING, 1, "Copy Serial");
            POINT cursorPos;
            GetCursorPos(&cursorPos);
            SetForegroundWindow(hwndDlg);
            UINT MenuItemClicked = TrackPopupMenu(myMenu, TPM_RETURNCMD | TPM_NONOTIFY, cursorPos.x, cursorPos.y, 0, hwndDlg, 0);
            SendMessage(hwndDlg, WM_NULL, 0, 0);
            if(MenuItemClicked == 1)
            {
                CopyToClipboard(serial);
                MessageBeep(MB_ICONINFORMATION);
            }
        }
    }
    return TRUE;

    case WM_HELP:
    {
        char id[10] = "";
        sprintf(id, "%d", IDS_HELPKEYGEN);
        SetEnvironmentVariableA("HELPID", id);
        SetEnvironmentVariableA("HELPTITLE", "KeyGen Help");
        DialogBox(hInst, MAKEINTRESOURCE(DLG_HELP), hwndDlg, DlgHelp);
    }
    return TRUE;

    case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
        case IDC_BTN_GENERATE:
        {
            NoFocus();
            char name[512] = "";
            char keystring[512] = "";
            char pvt[512] = "";
            char y[512] = "";
            char hwid[10] = "";
            char sym[10] = "";
            char templ[512] = "";
            unsigned int sy = 0, hw = 0;

            GetDlgItemTextA(hwndDlg, IDC_EDT_NAME, name, 512);
            GetDlgItemTextA(hwndDlg, IDC_EDT_KEYSTRING, keystring, 256);
            GetDlgItemTextA(hwndDlg, IDC_EDT_HWID, hwid, 10);
            GetDlgItemTextA(hwndDlg, IDC_EDT_SYM, sym, 10);
            FormatHex(hwid);
            FormatHex(sym);

            sscanf(hwid, "%X", &hw);
            sscanf(sym, "%X", &sy);
            sprintf(sym, "%.8X", sy);
            SetDlgItemTextA(hwndDlg, IDC_EDT_SYM, sym);

            GetDlgItemTextA(hwndDlg, IDC_EDT_PVT, pvt, 512);
            int len = GetDlgItemTextA(hwndDlg, IDC_EDT_Y, y, 512);
            int comma_count = 0;
            for(int i = 0; i < len; i++)
                if(y[i] == ',')
                    comma_count++;
            bool baboon = !!IsDlgButtonChecked(hwndDlg, IDC_CHK_BABOON);
            if(keygenerate_level == 29 and comma_count != 2 and !baboon)
            {
                AddLogMessage(GetDlgItem(hwndDlg, IDC_EDT_ADVLOG), "Invalid ECDSA Public format...\nUse: ", true);
                return TRUE;
            }
            if(((!*pvt) or (!*y)) and keygenerate_level != -1 and !baboon)
            {
                if(GetDlgItemTextA(hwndDlg, IDC_EDT_TEMPLATE, templ, 512))
                {
                    KG_GeneratePvtY(keygenerate_level, templ, pvt, y);
                    SetDlgItemTextA(hwndDlg, IDC_EDT_PVT, pvt);
                    SetDlgItemTextA(hwndDlg, IDC_EDT_Y, y);
                }
                else
                {
                    AddLogMessage(GetDlgItem(hwndDlg, IDC_EDT_ADVLOG), "You should enter the values for the key signing...", true);
                    return TRUE;
                }
            }

            int date = GetDlgItemInt(hwndDlg, IDC_EDT_DATE, 0, 0);
            int other0 = GetDlgItemInt(hwndDlg, IDC_EDT_OTHER0, 0, 0) & 65535;
            int other1 = GetDlgItemInt(hwndDlg, IDC_EDT_OTHER1, 0, 0) & 65535;
            int other2 = GetDlgItemInt(hwndDlg, IDC_EDT_OTHER2, 0, 0) & 65535;
            int other3 = GetDlgItemInt(hwndDlg, IDC_EDT_OTHER3, 0, 0) & 65535;
            int other4 = GetDlgItemInt(hwndDlg, IDC_EDT_OTHER4, 0, 0) & 65535;

            SetDlgItemInt(hwndDlg, IDC_EDT_DATE, date, 1);
            if(IsDlgButtonChecked(hwndDlg, IDC_CHK_MODKEY))
                date = 65344;
            SetDlgItemInt(hwndDlg, IDC_EDT_OTHER0, other0, 0);
            if(keygenerate_level != -1)
            {
                SetDlgItemInt(hwndDlg, IDC_EDT_OTHER1, other1, 0);
                SetDlgItemInt(hwndDlg, IDC_EDT_OTHER2, other2, 0);
                SetDlgItemInt(hwndDlg, IDC_EDT_OTHER3, other3, 0);
                SetDlgItemInt(hwndDlg, IDC_EDT_OTHER4, other4, 0);
            }
            SetDlgItemTextA(hwndDlg, IDC_EDT_SERIAL, CreateSignedKey(keygenerate_level, sy, keygenerate_sym_xorval, pvt, y, keystring, date, name, hw, other0, other1, other2, other3, other4, baboon, GetDlgItem(hwndDlg, IDC_EDT_ADVLOG)));
            SendMessageA(GetDlgItem(hwndDlg, IDC_EDT_ADVLOG), WM_VSCROLL, SB_BOTTOM, 0);
        }
        return TRUE;

        case IDC_BTN_MAKEDATE:
        {
            NoFocus();
            char date_text[20] = "";
            char new_date[20] = "";
            int len = GetDlgItemTextA(hwndDlg, IDC_EDT_DATEYMD, date_text, 20);
            for(int i = 0, j = 0; i < len; i++)
                if(date_text[i] != '-')
                    j += sprintf(new_date + j, "%c", date_text[i]);
            len = strlen(new_date);
            UINT dest_id;

            HMENU myMenu = 0;
            myMenu = CreatePopupMenu();

            if(len != 8)
                AppendMenuA(myMenu, MF_STRING | MF_GRAYED, 3, "Error!");
            else
            {
                AppendMenu(myMenu, MF_STRING, 1, "Date");
                AppendMenu(myMenu, MF_STRING, 2, "oth0");
            }
            POINT cursorPos;
            GetCursorPos(&cursorPos);
            SetForegroundWindow(hwndDlg);
            UINT MenuItemClicked = TrackPopupMenu(myMenu, TPM_RETURNCMD | TPM_NONOTIFY, cursorPos.x, cursorPos.y, 0, hwndDlg, 0);
            SendMessage(hwndDlg, WM_NULL, 0, 0);
            switch(MenuItemClicked)
            {
            case 1:
                dest_id = IDC_EDT_DATE;
                break;
            case 2:
                dest_id = IDC_EDT_OTHER0;
                break;
            case 3:
                return TRUE;
                break;
            }

            char y[5] = "", m[3] = "", d[3] = "";
            int y_ = 0, m_ = 0, d_ = 0;
            strncpy(y, new_date, 4);
            strncpy(m, new_date + 4, 2);
            strncpy(d, new_date + 6, 2);
            sscanf(y, "%d", &y_);
            sscanf(m, "%d", &m_);
            sscanf(d, "%d", &d_);
            sprintf(date_text, "%d", MakeDate(y_, m_, d_));
            SetDlgItemTextA(hwndDlg, dest_id, date_text);
        }
        return TRUE;

        case IDC_CHK_BABOON:
        {
            NoFocus();
            bool baboon = true;
            if(IsDlgButtonChecked(hwndDlg, IDC_CHK_BABOON))
                baboon = false;
            EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_PVT), baboon);
            EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_Y), baboon);
        }
        return TRUE;

        case IDC_BTN_CALC:
        {
            NoFocus();
            char temp[1024] = "";
            char temp2[256] = "";
            UINT MenuItemClicked = 1;
            HMENU myMenu = 0;
            char clipboard[256] = "";
            char pvt[1024] = "";
            char y[1024] = "";

            if(!GetDlgItemTextA(hwndDlg, IDC_EDT_TEMPLATE, temp, 1024))
                return TRUE;

            KG_GeneratePvtY(keygenerate_level, temp, pvt, y);
            sprintf(temp, "%.8X", KG_GenerateSymmetric(keygenerate_level, temp));

            if(keygenerate_level >= 0)
            {
                myMenu = CreatePopupMenu();
                AppendMenuA(myMenu, MF_STRING, 4, "Sym Only");
                if(keygenerate_level == 29)
                    AppendMenu(myMenu, MF_STRING, 1, "Pvt, ECDSA, Sym");
                else
                    AppendMenu(myMenu, MF_STRING, 1, "Pvt, Y, Sym");
                if(keygenerate_level == 29)
                    AppendMenu(myMenu, MF_STRING, 2, "Pvt, ECDSA");
                else
                    AppendMenu(myMenu, MF_STRING, 2, "Pvt, Y");
                PasteFromClipboard(clipboard, 256);
                FormatHex(clipboard);
                int len = strlen(clipboard);
                if(len and len < 9)
                {
                    unsigned int clipboard_sym = 0;
                    sscanf(clipboard, "%X", &clipboard_sym);
                    if(keygenerate_level == 29)
                        sprintf(temp2, "Pvt, ECDSA, Sym: %.8X", clipboard_sym);
                    else
                        sprintf(temp2, "Pvt, Y, Sym: %.8X", clipboard_sym);
                    AppendMenu(myMenu, MF_STRING, 3, temp2);
                }
                POINT cursorPos;
                GetCursorPos(&cursorPos);
                SetForegroundWindow(hwndDlg);
                MenuItemClicked = TrackPopupMenu(myMenu, TPM_RETURNCMD | TPM_NONOTIFY, cursorPos.x, cursorPos.y, 0, hwndDlg, 0);
                SendMessage(hwndDlg, WM_NULL, 0, 0);
            }
            switch(MenuItemClicked)
            {
            case 1:
            {
                SetDlgItemTextA(hwndDlg, IDC_EDT_Y, y);
                SetDlgItemTextA(hwndDlg, IDC_EDT_PVT, pvt);
                SetDlgItemTextA(hwndDlg, IDC_EDT_SYM, temp);
            }
            break;

            case 2:
            {
                SetDlgItemTextA(hwndDlg, IDC_EDT_Y, y);
                SetDlgItemTextA(hwndDlg, IDC_EDT_PVT, pvt);
            }
            break;

            case 3:
            {
                SetDlgItemTextA(hwndDlg, IDC_EDT_Y, y);
                SetDlgItemTextA(hwndDlg, IDC_EDT_PVT, pvt);
                SetDlgItemTextA(hwndDlg, IDC_EDT_SYM, clipboard);
            }
            break;

            case 4:
            {
                SetDlgItemTextA(hwndDlg, IDC_EDT_SYM, temp);
            }
            break;
            }
            if(keygenerate_level >= 0)
                DestroyMenu(myMenu);
        }
        return TRUE;

        case IDC_CHK_DIGITALRIVER: ///Digital River checkbox.
        {
            NoFocus();
            if(IsDlgButtonChecked(hwndDlg, LOWORD(wParam)))
            {
                CheckDlgButton(hwndDlg, IDC_CHK_ESELLERATE, 0);
                keygenerate_sym_xorval = 0x91827364; ///Official XOR value of DigitalRiver tagged keys...
            }
            else
                keygenerate_sym_xorval = 0;
        }
        return TRUE;

        case IDC_CHK_ESELLERATE: ///eSellerate checkbox.
        {
            NoFocus();
            if(IsDlgButtonChecked(hwndDlg, LOWORD(wParam)))
            {
                CheckDlgButton(hwndDlg, IDC_CHK_DIGITALRIVER, 0);
                keygenerate_sym_xorval = 0x19283746; ///Official XOR value of eSellerate tagged keys...
            }
            else
                keygenerate_sym_xorval = 0;
        }
        return TRUE;

        case IDC_CHK_MODKEY:
        {
            NoFocus();
        }
        return TRUE;

        case IDC_COMBO_LEVEL:
        {
            switch(HIWORD(wParam))
            {
            case CBN_SELCHANGE:
            {
                bool isNoSeperator = true;
                keygenerate_level = SendDlgItemMessageA(hwndDlg, LOWORD(wParam), CB_GETCURSEL, 0, 0);
                if(keygenerate_level == 1 or keygenerate_level == 6 or keygenerate_level == 16)
                    isNoSeperator = false;

                if(!keygenerate_level)
                    keygenerate_level--;
                else if(keygenerate_level > 1 and keygenerate_level < 6) //signed v2
                    keygenerate_level -= 2;
                else if(keygenerate_level > 6 and keygenerate_level < 16) //signed v3
                    keygenerate_level += 3;
                else if(keygenerate_level > 16) //short v3
                    keygenerate_level += 3;
                bool en = isNoSeperator;
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_NAME), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_HWID), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_TEMPLATE), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_CALC), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_CHK_DIGITALRIVER), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_CHK_ESELLERATE), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_SYM), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_DATEYMD), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_DATE), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_MAKEDATE), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER0), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_GENERATE), en);

                if(keygenerate_level == -1)
                    en = false;
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER1), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER2), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER3), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_OTHER4), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_PVT), en);
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_Y), en);
                en = false;
                if(keygenerate_level > 18 and isNoSeperator)
                    en = true;
                EnableWindow(GetDlgItem(hwndDlg, IDC_EDT_KEYSTRING), en);

                /*char temp[10]="";
                sprintf(temp, "%d", keygenerate_level);*/
                if(isNoSeperator)
                {
                    SetDlgItemTextA(hwndDlg, IDC_EDT_PVT, "");
                    SetDlgItemTextA(hwndDlg, IDC_EDT_Y, "");
                }
                bool baboon = false;
                if(keygenerate_level == 29)
                {
                    SetDlgItemTextA(hwndDlg, IDC_STC_YPUB, "ECDSA Public:");
                    baboon = true;
                }
                else
                {
                    SetDlgItemTextA(hwndDlg, IDC_STC_YPUB, "Y:");
                    CheckDlgButton(hwndDlg, IDC_CHK_BABOON, 0);
                }
                ShowWindow(GetDlgItem(hwndDlg, IDC_CHK_BABOON), baboon);
            }
            return TRUE;
            }
        }
        return TRUE;
        }
    }
    return TRUE;
    }
    return FALSE;
}
Ejemplo n.º 9
0
CoWork::CoWork()
{
	LLOG("CoWork constructed " << FormatHex(this));
	todo = 0;
}