#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif
+#ifdef DEBUG
+static char *tls_alert_msg_name(int code) {
+ switch (code) {
+ case 0: return "close_notify"; break;
+ case 10: return "unexpected_message"; break;
+ case 20: return "bad_record_mac"; break;
+ default: break;
+ }
+ return "unknown alert";
+}
+#endif
+
static uint16_t get16(const unsigned char *buf) {
uint16_t res;
*buf, struct tls_buffer *pt_buffer) {
int err;
+ ENTER;
+ tls_buffer_expand(pt_buffer, length);
+ DEBUG_PRINTLN("cbc_decrypt(%p, %p, %lu, %p)\n",
+ buf+header_size, pt_buffer->buffer,
+ (unsigned long)length, &context->crypto.ctx_remote.aes_remote);
err = cbc_decrypt(buf+header_size, pt_buffer->buffer, length,
&context->crypto.ctx_remote.aes_remote);
if (err) {
- DEBUG_PRINT("Decryption error %i\n", (int) err);
+ DEBUG_PRINTLN("Decryption error %d %s\n", err,
+ error_to_string(err));
+ LEAVE;
return TLS_BROKEN_PACKET;
}
+ pt_buffer->len = length;
unsigned char padding_byte = pt_buffer->buffer[length - 1];
unsigned char padding = padding_byte + 1;
+ DEBUG_PRINTLN("cbc padding byte = %d\n", (int)padding_byte);
/* poodle check */
int padding_index = length - padding;
int limit = length - 1;
for (i = length - padding; i < limit; i++) {
if (pt_buffer->buffer[i] != padding_byte) {
- DEBUG_PRINT
- ("BROKEN PACKET (POODLE ?)\n");
+ DEBUG_PRINTLN("BROKEN PACKET (POODLE ?)\n");
tls_alert(context, 1, decrypt_error);
+ LEAVE;
return TLS_BROKEN_PACKET;
}
}
pt_buffer->len -= padding;
}
- DEBUG_DUMP_HEX_LABEL("decrypted3", pt_buffer->buffer, decrypted_length);
- ptr = pt_buffer->buffer;
+ DEBUG_DUMP_HEX_LABEL("decrypted", pt_buffer->buffer, decrypted_length);
if (decrypted_length > TLS_AES_IV_LENGTH) {
decrypted_length -= TLS_AES_IV_LENGTH;
- ptr += TLS_AES_IV_LENGTH;
tls_buffer_shift(pt_buffer, TLS_AES_IV_LENGTH);
}
+ ptr = pt_buffer->buffer;
length = decrypted_length;
unsigned int mac_size = tls_mac_length(context);
if (length < mac_size || !mac_size) {
- DEBUG_PRINT("BROKEN PACKET\n");
+ DEBUG_PRINTLN("BROKEN PACKET\n");
tls_alert(context, 1, decrypt_error);
+ LEAVE;
return TLS_BROKEN_PACKET;
}
+ DEBUG_PRINTLN("mac size %u\n", mac_size);
length -= mac_size;
pt_buffer->len -= mac_size;
ptr, length, hmac_out, mac_size);
if (hmac_out_len != mac_size
|| memcmp(message_hmac, hmac_out, mac_size)) {
- DEBUG_PRINT("INTEGRITY CHECK FAILED (msg length %i)\n",
+ DEBUG_PRINTLN("INTEGRITY CHECK FAILED (msg length %i)\n",
length);
DEBUG_DUMP_HEX_LABEL("HMAC RECEIVED", message_hmac, mac_size);
DEBUG_DUMP_HEX_LABEL("HMAC COMPUTED", hmac_out, hmac_out_len);
tls_alert(context, 1, bad_record_mac);
+ LEAVE;
return TLS_INTEGRITY_FAILED;
}
+ LEAVE;
return 0;
}
int header_size = res;
+ ENTER;
+
if (buf_len < res) {
+ LEAVE;
return TLS_NEED_MORE_DATA;
}
buf_pos += 2;
if (!tls_supported_version(version)) {
+ LEAVE;
return TLS_NOT_SAFE;
}
ptr = buf + buf_pos;
- DEBUG_PRINT("Message type: %0x, length: %i\n", (int)type, (int)length);
+ DEBUG_PRINTLN("Message type: %d, length: %d\n", (int)type, (int)length);
/* this buffer can go out of scope */
tls_buffer_init(&pt, 0);
if (!context->crypto.created) {
DEBUG_PRINT("Encryption context not created\n");
random_sleep(TLS_MAX_ERROR_SLEEP_uS);
+ LEAVE;
return TLS_BROKEN_PACKET;
}
if (rv != 0) {
tls_buffer_free(&pt);
random_sleep(TLS_MAX_ERROR_SLEEP_uS);
+ LEAVE;
return rv;
}
if (pt.error) {
tls_buffer_free(&pt);
random_sleep(TLS_MAX_ERROR_SLEEP_uS);
+ LEAVE;
return TLS_NO_MEMORY;
}
break;
/* alert */
case TLS_ALERT:
- DEBUG_PRINT("ALERT MESSAGE\n");
+ DEBUG_PRINTLN("ALERT MESSAGE\n");
if (length >= 2) {
- DEBUG_PRINT("ALERT MESSAGE ...\n");
- DEBUG_DUMP_HEX(ptr, length);
int level = ptr[0];
int code = ptr[1];
- DEBUG_PRINT("level = %d, code = %d\n",
- level, code);
+ DEBUG_PRINTLN("level = %d, code = %d\n", level, code);
if (level == TLS_ALERT_CRITICAL) {
+ DEBUG_PRINTLN("critical error: %s\n",
+ tls_alert_msg_name(code));
context->critical_error = 1;
res = TLS_ERROR_ALERT;
}
tls_buffer_free(&pt);
if (payload_res < 0) {
+ LEAVE;
return payload_res;
}
if (res > 0) {
+ LEAVE;
return header_size + length;
}
+ LEAVE;
return res;
}