unsigned int GenIV() { unsigned int SeedA, SeedB, InitialIV; SeedA = GetTickCount(); SeedB = BytesRandom(); InitialIV = SeedB ^ SeedA; InitialIV = Update(Update(Update(InitialIV))); return (InitialIV); }
unsigned short BytesRandomWord() { unsigned short RandomW; unsigned int RandomDW; RandomDW = BytesRandom(); RandomW = *(unsigned short *)&RandomDW; RandomW += 0; return (RandomW); }
void GenSessionKey(uchar *Buffer, uint Size) { uint Idx, Rander; Rander = BytesRandom(); for (Idx = 0; Idx < Size; Idx++) { Rander = Update(Rander); Buffer[Idx] = ((uchar *)&Rander)[sizeof(Rander) - 1]; //Buffer[Idx] = (uchar)(Idx + 1); } Buffer[0] = 0x01; }
void GetSessionKey(uchar *Buffer) { static int Init = 0; uint Idx, Rander; if (!Init) { Rander = BytesRandom(); for (Idx = 0; Idx < SK_SZ; Idx++) { Rander = Update(Rander); SessionKey[Idx] = ((uchar *)&Rander)[sizeof(Rander) - 1]; //SessionKey[Idx] = (uchar)(Idx + 1); //SessionKey[Idx] = 0; } SessionKey[0] = 0x01; Init = 1; } for (Idx = 0; Idx < SK_SZ; Idx++) Buffer[Idx] = SessionKey[Idx]; }
void HandleQuery(Host Session_SN, uchar *Query, int Size) { uchar *Browser; SResponse Response; CLocation TesterLocation; Host Tested; SessProp *SessionProposal; uint Idx = 0; uint Rank = 0; Browser = Query; while (Size > 0) { Response.Objs = NULL; Response.NbObj = 0; TCPResponseManager(&Browser, (uint *)&Size, &Response); uint Idx = 0; switch (Response.Cmd / 8) { case CMD_QUERY_IPING: printf("Received Incoming Initial Ping..\n"); for (Idx = 0; Idx < Response.NbObj; Idx++) { switch (Response.Objs[Idx].Id) { case OBJ_ID_PINGER: printf("Ping Coming From : %s.. Let's Reply..\n", Response.Objs[Idx].Value.Memory.Memory); PingReply(Session_SN, Response.Reply2ID); break; default: break; } } break; case CMD_QUERY_SESSION: printf("Received session proposal..\n"); SessionProposal = (SessProp *)malloc(sizeof(SessProp)); SessionProposal->Relays = new queue<Host>; SessionProposal->SessID = BytesRandomWord() % 0x7FFF; *(uint *)(SessionProposal->PeerChallenge) = BytesRandom(); *(uint *)(SessionProposal->PeerChallenge + 4) = BytesRandom(); printf("Challenge to propose to Peer : "); showmem((uchar *)SessionProposal->PeerChallenge, 0x08); SessionProposal->CreatedSID = 0x00; SessionProposal->LocalCreatedSID = 0x00; for (Idx = 0; Idx < Response.NbObj; Idx++) { if (Response.Objs[Idx].ObjListInfos.Id == -1) { switch(Response.Objs[Idx].Id) { case OBJ_ID_SESPROPOSER: LocationBlob2Location(Response.Objs[Idx].Value.Memory.Memory, &(SessionProposal->ProposerLocation), Response.Objs[Idx].Value.Memory.MsZ); printf("Proposer Node : "); DumpLocation(&(SessionProposal->ProposerLocation)); break; case OBJ_ID_SESCHALLENG: printf("Session Challenge : "); showmem(Response.Objs[Idx].Value.Table, sizeof(Response.Objs[Idx].Value.Table)); memcpy_s(SessionProposal->Challenge, sizeof(SessionProposal->Challenge), Response.Objs[Idx].Value.Table, sizeof(SessionProposal->Challenge)); break; case OBJ_ID_PEERSESSID: printf("Peer Choosen Session ID : 0x%x\n", Response.Objs[Idx].Value.Nbr); SessionProposal->PeerSessID = Response.Objs[Idx].Value.Nbr; default: break; } } } uint NbObjLists; Memory_U RelaysInfos; RelaysInfos.Memory = (uchar *)malloc(0xFF); ZeroMemory(RelaysInfos.Memory, 0xFF); RelaysInfos.MsZ = 0xFF; Browser = RelaysInfos.Memory; NbObjLists = DefNbObjList(Response); for (Rank = 0; Rank < NbObjLists + 1; Rank++) { Host Relay; uint State, ObjOccur; State = ObjOccur = 0; for (uint Idx = 0; Idx < Response.NbObj; Idx++) { if ((Response.Objs[Idx].ObjListInfos.Id == 0x07) && (Response.Objs[Idx].ObjListInfos.Rank == Rank)) { if (!ObjOccur) { memcpy_s(Browser, 0xFF, "\x05\x07\x41\x03", 0x04); Browser += 0x04; ObjOccur = 1; } WriteObject(&Browser, Response.Objs[Idx]); switch(Response.Objs[Idx].Id) { case OBJ_ID_RELAY: printf("Proposed Relay : %s:%d\n", Response.Objs[Idx].Value.Addr.ip, Response.Objs[Idx].Value.Addr.port); strcpy_s(Relay.ip, MAX_IP_LEN + 1, Response.Objs[Idx].Value.Addr.ip); Relay.port = Response.Objs[Idx].Value.Addr.port; State += 1; break; case OBJ_ID_SID2DEC: printf("Session To Declare on this relay : 0x%x\n", Response.Objs[Idx].Value.Nbr); Relay.SessionID2Declare = Response.Objs[Idx].Value.Nbr; State += 1; default: break; } } } if (State == 2) SessionProposal->Relays->push(Relay); } RelaysInfos.MsZ = (uint)(Browser - RelaysInfos.Memory); SessionProposal->RelaysInfos = RelaysInfos; printf("Accepted session.. Let's initialize..\n"); uchar RecvCopy[0xFFFF]; int RecvSzCopy; ZeroMemory(RecvCopy, 0xFFFF); memcpy_s(RecvCopy, 0xFFFF, Query, Size); RecvSzCopy = Size; SessionPropReply(Session_SN, Response.Reply2ID); InitSession(SessionProposal); ZeroMemory(RecvBuffer, 0xFFFF); memcpy_s(Query, 0xFFFF, RecvCopy, RecvSzCopy); Size = RecvSzCopy; break; case CMD_QUERY_UDPTEST: printf("Received UDP Test report..\n"); Tested.port = 0; for (Idx = 0; Idx < Response.NbObj; Idx++) { switch(Response.Objs[Idx].Id) { case OBJ_ID_TESTED: printf("Peer Tested my UDP Address : %s:%d\n", Response.Objs[Idx].Value.Addr.ip, Response.Objs[Idx].Value.Addr.port); if (Tested.port == 0) Tested = Response.Objs[Idx].Value.Addr; break; case OBJ_ID_TESTER: LocationBlob2Location(Response.Objs[Idx].Value.Memory.Memory, &TesterLocation, Response.Objs[Idx].Value.Memory.MsZ); printf("Tester Node : "); DumpLocation(&TesterLocation); printf("Should UDP Test %s:%d\n", TesterLocation.PVAddr.ip, TesterLocation.PVAddr.port); break; default: break; } } UDPTestReply(Session_SN, Response.Reply2ID, Tested); break; default: printf("Unhandled Query.. Sending ACK..\n"); SendACK(Response.PacketID, Session_SN.socket, Session_SN, HTTPS_PORT, &(Session_SN.Connected), &Keys); break; } printf("\n"); } }
int ManageSessionCMD(Host Relay, SessProp *SessionProposal, uchar **ResponseBuffer, SResponse Response, uint *BRSize) { uint Idx, Cmd, SessID; uchar ResponseCMDDatas[0xFFF] = {0}; ObjectDesc *SoughtObj; ObjectDesc ObjSid, ObjSeq, ObjBlob, ObjV, ObjPrevSid; SResponse SessCMDDatas; Memory_U Tmp; static uint SeqNbr = 0; static uint InitialHeaderID = 0; static char *ChatPeerName = NULL; Idx = 0; printf("Session Cmd received..\n"); SoughtObj = GetObjByID(Response, 0x01, -1, -1); if (SoughtObj == NULL) return (-1); SessID = SoughtObj->Value.Nbr; if ((SessionProposal->CreatedSID == 0) && (SessionProposal->LocalCreatedSID == 0)) { SessionProposal->CreatedSID = Response.Objs[Idx].Value.Nbr; SessionProposal->LocalCreatedSID = BytesRandom(); printf("Created Session SID : 0x%x(%u) {Local SID : 0x%x(%u)}\n\n", Response.Objs[Idx].Value.Nbr, Response.Objs[Idx].Value.Nbr, SessionProposal->LocalCreatedSID, SessionProposal->LocalCreatedSID); } else printf("Command's SID : 0x%x(%u)..\n\n", Response.Objs[Idx].Value.Nbr, Response.Objs[Idx].Value.Nbr); SoughtObj = GetObjByID(Response, 0x04, -1, -1); if (SoughtObj == NULL) { cprintf(FOREGROUND_BLUE, "No SessionCMD..\n\n"); return (0); } SessCMDDatas.Objs = NULL; SessCMDDatas.NbObj = 0; Tmp = SoughtObj->Value.Memory; ManageObjects(&(Tmp.Memory), Tmp.MsZ, &SessCMDDatas); SoughtObj = GetObjByID(SessCMDDatas, 0x01, -1, -1); if (SoughtObj == NULL) return (-1); Cmd = SoughtObj->Value.Nbr; ObjectDesc RCDObjNbr; uchar *RCDBrowser; uchar *RCDMark; uint ObjListIdx; switch(Cmd) { case 0x0D: //LetBeSyncBuddies (-> SendMeCredentialsAndStuff (0x23)) cprintf(FOREGROUND_BLUE, "LetBeSyncBuddies Received.. Response : SendMeCredentialsAndStuff..\n"); SoughtObj = GetObjByID(SessCMDDatas, 0x02, -1, -1); if (SoughtObj == NULL) { printf("No String ID for created session..\n"); return (-1); } SessionProposal->CreatedSStrID = _strdup((char *)SoughtObj->Value.Memory.Memory); printf("Created Session String ID : %s\n", SessionProposal->CreatedSStrID); ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x01); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x23; //SendMeCredentialsAndStuff WriteObject(&RCDBrowser, RCDObjNbr); ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); ObjV.Family = OBJ_FAMILY_NBR; ObjV.Id = 0x07; ObjV.Value.Nbr = 0x08; ObjPrevSid.Family = OBJ_FAMILY_NBR; ObjPrevSid.Id = 0x02; ObjPrevSid.Value.Nbr = SessionProposal->CreatedSID; *BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 5, ObjSid, ObjSeq, ObjBlob, ObjV, ObjPrevSid); SessionProposal->AesStreamOut->IvecIdx = 0; break; case 0x2A: //HereAreMyCredentials cprintf(FOREGROUND_BLUE, "HereAreMyCredentials (FROM CRED) Received.. Response : [SESSIONCMDACK]..\n"); printf("Skipping (FROM) Credentials Saving..\n"); //SEND SESSION CMD ACK NOT INDISPENSABLE break; case 0x13: //HereAreSomeHeaders (-> SendMeBodies (0x15)) uint NbHeaders; ObjectDesc *SObj9, *SObjA, *SObj; cprintf(FOREGROUND_BLUE, "HereAreSomeHeaders Received.. Response : SendMeBodies..\n"); NbHeaders = 0; for (Idx = 0; Idx < SessCMDDatas.NbObj; Idx++) { if ((SessCMDDatas.Objs[Idx].Id == 0x0A) && (SessCMDDatas.Objs[Idx].ObjListInfos.Id == 0x14)) NbHeaders++; } SoughtObj = GetObjByID(SessCMDDatas, 0x0F, -1, -1); if (SoughtObj == NULL) { printf("No ID for Headers List..\n"); return (-1); } InitialHeaderID = SoughtObj->Value.Nbr; printf("Headers List (0x%x) Size : #%d..\n", SoughtObj->Value.Nbr, NbHeaders); ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x01 + NbHeaders); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x15; //SendMeBodies WriteObject(&RCDBrowser, RCDObjNbr); ObjListIdx = 1; SObj9 = SObjA = SObj = NULL; while (NbHeaders--) { RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x0A; SObj9 = GetObjByID(SessCMDDatas, 0x09, 0x14, ObjListIdx); SObjA = GetObjByID(SessCMDDatas, 0x0A, 0x14, ObjListIdx); if ((SObj9 == NULL) && (SObjA == NULL)) { printf("Error Getting Header's Body To Request ID..\n"); return (-1); } SObj = (SObjA == NULL) ? SObjA : SObj9; RCDObjNbr.Value.Nbr = SObj->Value.Nbr; WriteObject(&RCDBrowser, RCDObjNbr); ObjListIdx += 1; } ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); *BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 3, ObjSid, ObjSeq, ObjBlob); SessionProposal->AesStreamOut->IvecIdx = 0; break; case 0x2B: //HereAreBodies (-> IAmSyncingHere(0x10)) uint NbBodies; cprintf(FOREGROUND_BLUE, "HereAreBodies Received.. Response : [SESSIONCMDACK]..\n"); NbBodies = 0; for (Idx = 0; Idx < SessCMDDatas.NbObj; Idx++) { if ((SessCMDDatas.Objs[Idx].Id == 0x0A) && (SessCMDDatas.Objs[Idx].ObjListInfos.Id == 0x20)) NbBodies++; } ObjListIdx = 1; while (NbBodies--) { uint MId; MId = 0x00; printf("Message #%d Properties :\n", ObjListIdx); SoughtObj = GetObjByID(SessCMDDatas, 0x00, 0x20, ObjListIdx); if (SoughtObj == NULL) printf("No STORE_AGE..\n"); else printf("STORE_AGE : 0x%x\n", SoughtObj->Value.Nbr); SoughtObj = GetObjByID(SessCMDDatas, 0x02, 0x20, ObjListIdx); if (SoughtObj == NULL) printf("No UID_CRC..\n"); else printf("UID_CRC : 0x%x\n", SoughtObj->Value.Nbr); SoughtObj = GetObjByID(SessCMDDatas, 0x0A, 0x20, ObjListIdx); if (SoughtObj == NULL) printf("No MID..\n"); else { printf("MID : 0x%x\n", SoughtObj->Value.Nbr); MId = SoughtObj->Value.Nbr; } SoughtObj = GetObjByID(SessCMDDatas, 0x03, 0x20, ObjListIdx); if (SoughtObj == NULL) printf("No Message Body (?!?)..\n"); else { RSA *SkypeRSA; uchar UnRSA[0xFFF]; uchar *PostProcessed; uint PPsZ, Save; int Suite; printf("RSA PUB KEY FROM [HEREAREBODIES]\n"); showmem(SessionProposal->PeerContact->RsaPubKey.Memory, SessionProposal->PeerContact->RsaPubKey.MsZ); printf("\n"); SkypeRSA = RSA_new(); BN_hex2bn(&(SkypeRSA->n), Bin2HexStr(SessionProposal->PeerContact->RsaPubKey.Memory, MODULUS_SZ)); BN_hex2bn(&(SkypeRSA->e), "10001"); PPsZ = SoughtObj->Value.Memory.MsZ; SoughtObj->Value.Memory.MsZ -= PPsZ; Save = PPsZ; PPsZ = 0x80; ZeroMemory(UnRSA, 0xFFF); PPsZ = RSA_public_decrypt(PPsZ, SoughtObj->Value.Memory.Memory, UnRSA, SkypeRSA, RSA_NO_PADDING); RSA_free(SkypeRSA); printf("UnRSA :\n"); showmem(UnRSA, PPsZ); printf("\n"); if (PPsZ == 0xFFFFFFFF) { printf("Unable To UnRSA Message Body..\n"); goto UnRSAFailed; } Suite = Save - PPsZ; SoughtObj->Value.Memory.Memory += PPsZ; printf("Suite :\n"); showmem(SoughtObj->Value.Memory.Memory, Suite); printf("\n"); PostProcessed = FinalizeLoginDatas(UnRSA, &PPsZ, (Suite > 0) ? SoughtObj->Value.Memory.Memory : NULL, Suite); if (PostProcessed == NULL) { printf("Bad Datas [METADATAS] Finalization..\n"); PPsZ = 0x80; PostProcessed = FinalizeLoginDatas(UnRSA, &PPsZ, (Suite > 0) ? SoughtObj->Value.Memory.Memory : NULL, Suite); goto UnRSAFailed; } PostProcessed += SHA_DIGEST_LENGTH; PPsZ -= SHA_DIGEST_LENGTH; PostProcessed += (uint)strlen(SessionProposal->CreatedSStrID); PPsZ -= (uint)strlen(SessionProposal->CreatedSStrID); showmem(PostProcessed, PPsZ); printf("\n"); SResponse ChatMsgDatas; ChatMsgDatas.Objs = NULL; ChatMsgDatas.NbObj = 0; ManageObjects(&PostProcessed, PPsZ, &ChatMsgDatas); if (MId == InitialHeaderID) { ChatPeerName = _strdup((char *)SessionProposal->PeerContact->DisplayName); /*SoughtObj = GetObjByID(ChatMsgDatas, 0x01, -1, -1); if (SoughtObj == NULL) { printf("No ChatPeer Name Specified.. Using Peer DisplayName\n\n"); ChatPeerName = _strdup((char *)SessionProposal->PeerContact->DisplayName); } else ChatPeerName = _strdup((char *)SoughtObj->Value.Memory.Memory);*/ } else { SoughtObj = GetObjByID(ChatMsgDatas, 0x02, -1, -1); if (SoughtObj == NULL) printf("Empty Message..\n\n"); else { cprintf(YELLOW, "%s says :\n", ChatPeerName); cprintf(YELLOW, "%s\n\n", SoughtObj->Value.Memory.Memory); } } if (MId != 0) { ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x06); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x10; //IAmSyncingHere WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x0A; RCDObjNbr.Value.Nbr = MId; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x13; RCDObjNbr.Value.Nbr = 0x10; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x22; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x23; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x25; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); //*BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 3, ObjSid, ObjSeq, ObjBlob); //SessionProposal->AesStreamOut->IvecIdx = 0; } } UnRSAFailed: ObjListIdx += 1; } break; case 0x24: //HereAreCredentialsAndStuff (-> WeAreSyncBuddies (0x0F), SendYourCredentials(0x29), IAmSyncingHere(0x10)) cprintf(FOREGROUND_BLUE, "HereAreCredentialsAndStuff (TO CRED) Received.. Response : WeAreSyncBuddies + SendYourCredentials + IAmSyncingHere..\n"); printf("Skipping (TO) Credentials Saving..\n"); ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x03); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x0F; //WeAreSyncBuddies WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x1C; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x1D; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); *BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 3, ObjSid, ObjSeq, ObjBlob); SessionProposal->AesStreamOut->IvecIdx = 0; ZeroMemory(ResponseCMDDatas, sizeof(ResponseCMDDatas)); ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x01); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x29; //SendYourCredentials WriteObject(&RCDBrowser, RCDObjNbr); ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); *BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 3, ObjSid, ObjSeq, ObjBlob); SessionProposal->AesStreamOut->IvecIdx = 0; ZeroMemory(ResponseCMDDatas, sizeof(ResponseCMDDatas)); ObjSid.Family = OBJ_FAMILY_NBR; ObjSid.Id = 0x01; ObjSid.Value.Nbr = SessionProposal->LocalCreatedSID; ObjSeq.Family = OBJ_FAMILY_NBR; ObjSeq.Id = 0x03; ObjSeq.Value.Nbr = SeqNbr; SeqNbr += 1; RCDBrowser = ResponseCMDDatas; RCDMark = RCDBrowser; *RCDBrowser++ = RAW_PARAMS; WriteValue(&RCDBrowser, 0x06); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x01; RCDObjNbr.Value.Nbr = 0x10; //IAmSyncingHere WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x0A; RCDObjNbr.Value.Nbr = 0xFFFFFFFF; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x13; RCDObjNbr.Value.Nbr = 0x10; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x22; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x23; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); RCDObjNbr.Family = OBJ_FAMILY_NBR; RCDObjNbr.Id = 0x25; RCDObjNbr.Value.Nbr = 0x01; WriteObject(&RCDBrowser, RCDObjNbr); ObjBlob.Family = OBJ_FAMILY_BLOB; ObjBlob.Id = 0x04; ObjBlob.Value.Memory.Memory = RCDMark; ObjBlob.Value.Memory.MsZ = (uint)(RCDBrowser - RCDMark); *BRSize += BuildUserPacket(Relay, ResponseBuffer, 0xFFFF, 0x6D, SessionProposal->AesStreamOut, 3, ObjSid, ObjSeq, ObjBlob); SessionProposal->AesStreamOut->IvecIdx = 0; //SEND SESSION CMD ACK NOT INDISPENSABLE break; default : printf("UnManaged SessionCMD 0x%x..\n", Cmd); break; } return (1); }