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; }
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; }
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 ); }
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; }
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); }
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(); }
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; }
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; }
CoWork::CoWork() { LLOG("CoWork constructed " << FormatHex(this)); todo = 0; }