示例#1
0
文件: test.c 项目: cose-wg/COSE-C
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);
}
示例#2
0
// 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);
}
示例#3
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);
}
示例#4
0
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;
}