int main(int argc, char ** argv) { int i; const char * szWhere = NULL; bool fDir = false; bool fCorners = false; bool fMemory = false; for (i = 1; i < argc; i++) { printf("arg: '%s'\n", argv[i]); if (argv[i][0] == '-') { if (strcmp(argv[i], "--dir") == 0) { fDir = true; } else if (strcmp(argv[i], "--corners") == 0) { fCorners = true; } else if (strcmp(argv[i], "--memory") == 0) { fMemory = true; } } else { szWhere = argv[i]; } } // // If we are given a file name, then process the file name // if (fMemory) { if (szWhere == NULL) { fprintf(stderr, "Must specify a file name\n"); exit(1); } RunMemoryTest(szWhere); } else if (szWhere != NULL) { if (szWhere == NULL) { fprintf(stderr, "Must specify a file name\n"); exit(1); } if (fDir) RunTestsInDirectory(szWhere); else RunFileTest(szWhere); } else if (fCorners) { RunCorners(); } else { #ifdef USE_CBOR_CONTEXT context = CreateContext((unsigned int) -1); #endif #if INCLUDE_MAC MacMessage(); #endif #if INCLUDE_SIGN SignMessage(); #endif #if INCLUDE_ENCRYPT EncryptMessage(); #endif #ifdef USE_CBOR_CONTEXT FreeContext(context); #endif } if (CFails > 0) fprintf(stderr, "Failed %d tests\n", CFails); else fprintf(stderr, "SUCCESS\n"); exit(CFails); }
// called on the servers to create a league message void nKrawall::SendLeagueMessage(const tString& message) { // z-man: disabled for now, we want no central league messages sent to my master return; int i; REAL time = tSysTimeFloat(); // bend the network port to the master server nServerInfo *master = nServerInfo::GetMasters(); if (!master) return; sn_Bend(master->GetConnectionName(), master->GetPort()); // Resend old messages for (i=0; i < S_WFA.Len(); i++) { nLM& resend = S_WFA(i); if (resend.sentTime + 2 < time) { // resend the mesage nMessage *m = tNEW(nMessage) (nLeagueMessage); (*m) << resend.id; (*m) << resend.message; // sign the message nKrawall::nScrambledPassword signature; SignMessage(resend.id, resend.message, signature); nKrawall::WriteScrambledPassword(signature, *m); m->SendImmediately(0, false); // update send time resend.sentTime = time; } } if (!&message) return; // make a new ack-waiting entry and fill it nLM& send = S_WFA[S_WFA.Len()]; send.id = S_NextID++; send.sentTime = time; send.message = message; // sign the message nKrawall::nScrambledPassword signature; SignMessage(send.id, message, signature); // pack a message and go nMessage *m = tNEW(nMessage) (nLeagueMessage); (*m) << send.id; (*m) << message; nKrawall::WriteScrambledPassword(signature, *m); m->SendImmediately(0, false); nMessage::SendCollected(0); }
void ReceiveLeagueMessage(nMessage &m) { int i; // get the adress of the sender tString senderAdr; sn_GetAdr(m.SenderID(), senderAdr); unsigned int senderPort = sn_GetPort(m.SenderID()); unsigned int id; tString message; // read the message m >> id; m >> message; // do nothing if the message is from an unknown location if (!nKrawall::IsFromKrawall(senderAdr, senderPort)) { con << "Rejecting league message " << id << " from " << senderAdr << ":" << senderPort << " : not from Krawall.\n"; return; } // return an ack nMessage *ret = tNEW(nMessage)(nLeagueMessageAck); (*ret) << id; ret->SendImmediately(m.SenderID(), false); nMessage::SendCollected(m.SenderID()); // check the signature nKrawall::nScrambledPassword realsignature, receivedsignature; SignMessage(id, message, realsignature); nKrawall::ReadScrambledPassword(m, receivedsignature); if (!nKrawall::ArePasswordsEqual(realsignature, receivedsignature)) { con << "Rejecting league message " << id << " from " << senderAdr << ":" << senderPort << " : invalid signature.\n"; return; } // find/create the nLastLeagueMessage entry nLastLeagueMessage* lastFromThisSender = NULL; for (i=S_LLM.Len()-1; i>=0 && !lastFromThisSender; i--) if (S_LLM(i).adr == senderAdr && S_LLM(i).port == senderPort) lastFromThisSender = &(S_LLM(i)); // not found: create it if (!lastFromThisSender) { lastFromThisSender = &(S_LLM[S_LLM.Len()]); lastFromThisSender->adr = senderAdr; lastFromThisSender->port = senderPort; for (i = STOREBACK-1; i>=0; i--) lastFromThisSender->ids[i] = id - i - 10000; } // check if the id is new for (i = STOREBACK-1; i>=0; i--) if (lastFromThisSender->ids[i] == id) { con << "Ignoring league message " << id << " from " << senderAdr << ":" << senderPort << " : already processed.\n"; return; } // store the ID for (i = STOREBACK-2; i>=0; i--) lastFromThisSender->ids[i+1] = lastFromThisSender->ids[i]; lastFromThisSender->ids[0] = id; #ifdef DEBUG con << "Receiving league message " << id << "\n"; #endif // evaluate it nKrawall::ReceiveLeagueMessage(message); }
ClientConf *DoAuthenticateServer(int net_fd, struct sockaddr_in *from) { ClientConf *Client = NULL; int dcr_size = 0, cr_size = 0, i = 0; char ConnectionID[MED_BUF]; unsigned char cr_buffer[BUFSIZ], dcr_buffer[BUFSIZ], orig_buffer[BUFSIZ], signature[MED_BUF]; unsigned int siglen = 0; memset(dcr_buffer, 0, sizeof(dcr_buffer)); memset(orig_buffer, 0, sizeof(orig_buffer)); /* Get the connection ID */ if ((i = ReadN(net_fd, (struct sockaddr *)from, (unsigned char *)ConnectionID, MED_BUF)) <= 0) { fprintf(stderr, "DoAuthenticateServer : ReadN\n"); return NULL; } ConnectionID[i] = '\0'; /* Load the client setup */ if ((Client = ReadClientConf(SrvSetup.cfgfile, ConnectionID)) == NULL) { fprintf(stderr, "DoAuthenticateServer : ReadClientConf\n"); return NULL; } if (LoadPublicKeyFromFile(Client->fpubkey, &(Client->pub), CLIENT_LOAD_SERVER_PUBLIC_KEYFILE_ERR)) { fprintf(stderr, "DoAuthenticateServer : LoadPublicKeyFromFile\n"); return NULL; } /* Create a random message, sign it, encrypt it and send it with its signature */ if (CreateRandomMessage(orig_buffer, MIN_BUF) < 0) { fprintf(stderr, "DoAuthenticateServer : CreateRandomMessage\n"); return NULL; } if (SignMessage(SrvSetup.priv, orig_buffer, MIN_BUF, signature, &siglen) < 0) { fprintf(stderr, "DoAuthenticateServer : SignMesage\n"); return NULL; } if (EncryptMessageWithPublicKey(Client->pub, orig_buffer, MIN_BUF, cr_buffer, &cr_size) < 0) { fprintf(stderr, "DoAuthenticateServer : EncryptMessageWithPublicKey\n"); return NULL; } if (WriteH(net_fd, (struct sockaddr *)from, cr_buffer, cr_size) < 0) { fprintf(stderr, "DoAuthenticateServer : WriteH\n"); return NULL; } if (WriteH(net_fd, (struct sockaddr *)from, signature, siglen) <= 0) { fprintf(stderr, "DoAuthenticateServer : WriteH\n"); return NULL; } /* Read the answer and decrypt it */ if ((cr_size = ReadN(net_fd, (struct sockaddr *)from, cr_buffer, BUFSIZ)) < 0) { fprintf(stderr, "DoAuthenticateServer : ReadN\n"); return NULL; } else if (cr_size == 0) { fprintf(stderr, "Authentication failed. Access denied!\n"); fprintf(stderr, "Disconnecting client\n"); return NULL; } if (DecryptMessageWithPrivateKey(SrvSetup.priv, cr_buffer, cr_size, dcr_buffer, &dcr_size)) { fprintf(stderr, "DoAuthenticateServer : DecryptMessageWithPrivateKey\n"); return NULL; } /* Check if the message is ok */ if (memcmp(orig_buffer, dcr_buffer, MIN_BUF)) { fprintf(stderr, "Access denied!\n"); return NULL; } /* Save the origin information in the client's structure */ memcpy(&(Client->ns.data), from, sizeof(struct sockaddr_in)); inet_aton(Client->ns.ip, &Client->ns.data.sin_addr); /* Create a key, arrange a network setup for the client and send it over */ if (CreateRandomKey(Client->PrivKey, KEYSIZE)) { fprintf(stderr, "DoAuthenticateServer : CreateRandomKey\n"); return NULL; } /*sprintf((char *)dcr_buffer, "key=%s,ip=%s,netmask=%s,broadcast=%s,mtu=%s", Client->PrivKey, Client->ns.ip, Client->ns.msk, Client->ns.brd, Client->ns.mtu);*/ memset(dcr_buffer, '\0', sizeof(dcr_buffer)); memcpy(dcr_buffer, "key=", 4); memcpy(dcr_buffer + 4, Client->PrivKey, KEYSIZE); sprintf((char *)dcr_buffer + 4 + KEYSIZE, ",ip=%s,netmask=%s,broadcast=%s", Client->ns.ip, Client->ns.msk, Client->ns.brd); dcr_size = 4 + KEYSIZE + strlen(((char *)dcr_buffer) + 4 + KEYSIZE); if (EncryptMessageWithPublicKey(Client->pub, dcr_buffer, dcr_size, cr_buffer, &cr_size) < 0) { fprintf(stderr, "DoAuthenticateServer : EncryptMessageWithPublicKey\n"); return NULL; } if (WriteH(net_fd, (struct sockaddr *)from, cr_buffer, cr_size) < 0) { fprintf(stderr, "DoAuthenticateServer : WriteH\n"); return NULL; } CryptoInit(&(Client->ctx), Client->PrivKey, &(Client->IV)); return Client; }