static int receive_cid(struct key* csession_secret) { struct key ssession_public; struct key tmpkey; if (!receive_packet(CID1, 8 + keyex->size + AUTH_LENGTH, 8 + keyex->size + AUTH_LENGTH)) return 0; if (!pkt_validate(&rpacket, &cid_authenticator)) { debug1(DEBUG_PACKET, "Received CID failed validation"); return 0; } pkt_get_key(&rpacket, 8, &ssession_public, keyex); key_exchange(&tmpkey, &ssession_public, csession_secret); auth_start(&msg_authenticator, &tmpkey); encr_init(&encryptor, &tmpkey); debug1(DEBUG_PACKET, "Received CID packet"); seq_last = 0; return 1; }
int main(int argc, char **argv) { int mode, sock; size_t length; // Alice's public and secret keys unsigned char *a_pk; unsigned char *a_sk; // Bob's public key unsigned char *b_pk; if (argc != 1 + 6) { fprintf(stderr, usage); return EXIT_FAILURE; } // read all the keys off the disk if (read_from_file(argv[2], &a_pk, &length)) { fprintf(stderr, "Failed to read sender's public key\n"); return EXIT_FAILURE; } if (length != crypto_box_PUBLICKEYBYTES) { fprintf(stderr, "Failed to read sender's public key: incorrect size\n"); return EXIT_FAILURE; } if (read_from_file(argv[3], &a_sk, &length)) { fprintf(stderr, "Failed to read sender's private key\n"); return EXIT_FAILURE; } if (length != crypto_box_SECRETKEYBYTES) { fprintf(stderr, "Failed to read sender's private key: incorrect size\n"); return EXIT_FAILURE; } if (read_from_file(argv[4], &b_pk, &length)) { fprintf(stderr, "Failed to read recipient's public key\n"); return EXIT_FAILURE; } if (length != crypto_box_PUBLICKEYBYTES) { fprintf(stderr, "Failed to read recipient's public key: incorrect size\n"); } if (!strcmp(argv[1], "client")) { mode = client_mode; } else if (!strcmp(argv[1], "server")) { mode = server_mode; } else { fprintf(stderr, usage); return EXIT_FAILURE; } // Connect if(start_networking(mode, argv[5], argv[6], &sock)) { puts("Could not network.."); close(sock); return EXIT_FAILURE; } unsigned char key[crypto_secretbox_KEYBYTES + crypto_box_ZEROBYTES] = {0}; key_exchange(a_sk, b_pk, key, mode, sock); write_to_file((mode ? "alice.asymm" : "bob.asymm"), key + crypto_box_ZEROBYTES, crypto_secretbox_KEYBYTES); return 0; }