ret = gnutls_alert_send(session, GNUTLS_AL_WARNING, GNUTLS_A_USER_CANCELED);
if (ret < 0) {
fail("server: Error sending user cancelled alert: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
ret = gnutls_alert_send(session, GNUTLS_AL_FATAL, GNUTLS_A_DECRYPT_ERROR);
if (ret < 0) {
fail("server: Error sending decrypt error alert: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
close(fd);
if (ret < 0) {
fail("2nd client gnutls_handshake: %s\n",
gnutls_strerror(ret));
- terminate();
+ exit(1);
}
} else {
do {
if (ret < 0) {
fail("2nd client gnutls_handshake: %s\n",
gnutls_strerror(ret));
- terminate();
+ exit(1);
}
} else {
do {
if (ret < 0) {
fail("2nd client gnutls_handshake: %s\n",
gnutls_strerror(ret));
- terminate();
+ exit(1);
}
} else {
do {
if (ret < 0) {
fail("client: Handshake failed: %s\n", strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");
ret = gnutls_cipher_get(session);
if (ret != GNUTLS_CIPHER_AES_128_CBC) {
fprintf(stderr, "negotiated unexpected cipher: %s\n", gnutls_cipher_get_name(ret));
- terminate();
+ exit(1);
}
ret = gnutls_mac_get(session);
if (ret != GNUTLS_MAC_SHA1) {
fprintf(stderr, "negotiated unexpected mac: %s\n", gnutls_mac_get_name(ret));
- terminate();
+ exit(1);
}
iv_size = 16;
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
p = key_material;
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(wseq_number, "\x00\x01\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("wseq:", wseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
ret = gnutls_record_get_state(session, 1, &read_mac_key, &read_iv, &read_cipher_key, rseq_number);
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(rseq_number, "\x00\x01\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("rseq:", rseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
if (hash_size != mac_key.size || memcmp(p, mac_key.data, hash_size) != 0) {
dump("MAC:", mac_key.data, mac_key.size);
dump("Block:", key_material, block_size);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= hash_size;
dump("MAC:", read_mac_key.data, read_mac_key.size);
dump("Block:", key_material, block_size);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= hash_size;
if (key_size != cipher_key.size || memcmp(p, cipher_key.data, key_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= key_size;
if (key_size != read_cipher_key.size || memcmp(p, read_cipher_key.data, key_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= key_size;
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(wseq_number, "\x00\x01\x00\x00\x00\x00\x00\x06", 8) != 0) {
dump("wseq:", wseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
memset(rseq_number, 0xAA, sizeof(rseq_number));
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(rseq_number, "\x00\x01\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("rseq:", rseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
gnutls_bye(session, GNUTLS_SHUT_WR);
if (ret < 0) {
fail("client: Handshake failed: %s\n", strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");
ret = gnutls_cipher_get(session);
if (ret != GNUTLS_CIPHER_AES_128_CBC) {
fprintf(stderr, "negotiated unexpected cipher: %s\n", gnutls_cipher_get_name(ret));
- terminate();
+ exit(1);
}
ret = gnutls_mac_get(session);
if (ret != GNUTLS_MAC_SHA1) {
fprintf(stderr, "negotiated unexpected mac: %s\n", gnutls_mac_get_name(ret));
- terminate();
+ exit(1);
}
/* save state */
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
ret = gnutls_record_get_state(session, 1, NULL, NULL, NULL, rseq_number);
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
/* skip past the sliding window */
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
ret = gnutls_record_set_state(session, 1, rseq_number);
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
ret = gnutls_record_send(session, "ping", 4);
if (ret2 < 0) {
fail("pong: %s\n",
gnutls_strerror(ret));
- terminate();
+ exit(1);
}
}
}
if (ret < 0) {
fail("recv: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
} else {
do {
if (ret < 0) {
fail("ping: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
}
if (ret < 0) {
fail("recv: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
close(fd);
if (recv_msg_seq[current] == -1) {
fail("received message sequence differs\n");
- terminate();
+ exit(1);
}
if (((uint32_t)recv_msg_seq[current]) != useq) {
fail("received message sequence differs (current: %u, got: %u, expected: %u)\n",
(unsigned)current, (unsigned)useq, (unsigned)recv_msg_seq[current]);
- terminate();
+ exit(1);
}
current++;
if (ret < 0) {
fail("client: Handshake failed: %s\n", strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");
ret = gnutls_cipher_get(session);
if (ret != GNUTLS_CIPHER_AES_128_CBC) {
fprintf(stderr, "negotiated unexpected cipher: %s\n", gnutls_cipher_get_name(ret));
- terminate();
+ exit(1);
}
ret = gnutls_mac_get(session);
if (ret != GNUTLS_MAC_SHA1) {
fprintf(stderr, "negotiated unexpected mac: %s\n", gnutls_mac_get_name(ret));
- terminate();
+ exit(1);
}
iv_size = 16;
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
p = key_material;
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(wseq_number, "\x00\x00\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("wseq:", wseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
ret = gnutls_record_get_state(session, 1, &read_mac_key, &read_iv, &read_cipher_key, rseq_number);
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(rseq_number, "\x00\x00\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("rseq:", rseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
if (hash_size != mac_key.size || memcmp(p, mac_key.data, hash_size) != 0) {
dump("MAC:", mac_key.data, mac_key.size);
dump("Block:", key_material, block_size);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= hash_size;
dump("MAC:", read_mac_key.data, read_mac_key.size);
dump("Block:", key_material, block_size);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= hash_size;
if (key_size != cipher_key.size || memcmp(p, cipher_key.data, key_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= key_size;
if (key_size != read_cipher_key.size || memcmp(p, read_cipher_key.data, key_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+= key_size;
if (iv_size != iv.size || memcmp(p, iv.data, iv_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
p+=iv_size;
if (iv_size != read_iv.size || memcmp(p, read_iv.data, iv_size) != 0) {
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
/* check sequence numbers */
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(wseq_number, "\x00\x00\x00\x00\x00\x00\x00\x06", 8) != 0) {
dump("wseq:", wseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
ret = gnutls_record_get_state(session, 1, NULL, NULL, NULL, rseq_number);
if (ret < 0) {
fprintf(stderr, "error in %d\n", __LINE__);
gnutls_perror(ret);
- terminate();
+ exit(1);
}
if (memcmp(rseq_number, "\x00\x00\x00\x00\x00\x00\x00\x01", 8) != 0) {
dump("wseq:", wseq_number, 8);
fprintf(stderr, "error in %d\n", __LINE__);
- terminate();
+ exit(1);
}
gnutls_bye(session, GNUTLS_SHUT_WR);
if (ret < 0) {
fail("server (%s): Error sending %d byte packet: %s\n", prio, i, gnutls_strerror(ret));
- terminate();
+ exit(1);
}
}
if (ret < 0) {
fail("client[%s]: Error sending packet: %s\n", prio, gnutls_strerror(ret));
- terminate();
+ exit(1);
}
gnutls_bye(session, GNUTLS_SHUT_WR);
if (ret < 0) {
fail("server (%s): Error sending %d byte packet: %s\n", prio, i, gnutls_strerror(ret));
- terminate();
+ exit(1);
}
if (ret > 0 && ret != (int)i) {
fail("server (%s): Error sending %d byte packet: sent: %d\n", prio, i, ret);
- terminate();
+ exit(1);
}
}
if (ret < 0) {
fail("client: Handshake failed: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");
goto end;
} else if (ret < 0) {
fail("client: Error: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
}
gnutls_bye(session, GNUTLS_SHUT_WR);
if (ret < 0) {
fail("client: Handshake failed: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");
if (ret < 0) {
fail("client: Handshake failed: %s\n", gnutls_strerror(ret));
- terminate();
+ exit(1);
} else {
if (debug)
success("client: Handshake was completed\n");