📄 tls.c
字号:
printf("In SSL Connect mode \n"); } */ if (ssn->info.content_type != application_data) { err = BIO_read(ssn->from_ssl, ssn->dirty_out.data, MAX_RECORD_SIZE); if (err > 0) { ssn->dirty_out.used = err; } else { radlog(L_ERR, "rlm_eap_tls: BIO_read Error"); int_ssl_check(ssn->ssl, err); record_init(&ssn->dirty_in); return 0; } } else { radlog(L_INFO, "rlm_eap_tls: Application Data"); /* Its clean application data, do whatever we want */ record_init(&ssn->clean_out); } /* We are done with dirty_in, reinitialize it */ record_init(&ssn->dirty_in); return 1;}/* We have clean data to send. so dirty it before sending. */int tls_handshake_send(tls_session_t *ssn){ int err; /* * Fill the SSL with the clean data to dirt it * Based on Server's logic this clean_in is expected to * contain/filled with the data. */ if (ssn->clean_in.used > 0) { SSL_write(ssn->ssl, ssn->clean_in.data, ssn->clean_in.used); /* Get the dirty data from Bio to send it */ err = BIO_read(ssn->from_ssl, ssn->dirty_out.data, MAX_RECORD_SIZE); if (err > 0) { ssn->dirty_out.used = err; } else { int_ssl_check(ssn->ssl, err); } } if (ssn->dirty_out.used > 0) { record_init(&ssn->dirty_out); } return 1;}void session_init(tls_session_t *ssn){ ssn->ssl = NULL; ssn->into_ssl = ssn->from_ssl = NULL; record_init(&ssn->clean_in); record_init(&ssn->clean_out); record_init(&ssn->dirty_in); record_init(&ssn->dirty_out); memset(&ssn->info, 0, sizeof(ssn->info)); ssn->offset = 0; ssn->fragment = 0; ssn->tls_msg_len = 0; ssn->length_flag = 0;}void session_close(tls_session_t *ssn){ if(ssn->ssl) SSL_free(ssn->ssl);#if 0/* * WARNING: SSL_free seems to decrement the reference counts already, * so doing this might crash the application. */ if(ssn->into_ssl) BIO_free(ssn->into_ssl); if(ssn->from_ssl) BIO_free(ssn->from_ssl);#endif record_close(&ssn->clean_in); record_close(&ssn->clean_out); record_close(&ssn->dirty_in); record_close(&ssn->dirty_out); session_init(ssn);}void session_free(void **ssn){ tls_session_t **sess = (tls_session_t **)ssn; if ((sess == NULL) || (*sess == NULL)) return; session_close(*sess); free(*sess); *sess = NULL;}void record_init(record_t *rec){ rec->used = 0;}void record_close(record_t *rec){ rec->used = 0;}unsigned int record_plus(record_t *rec, const unsigned char *ptr, unsigned int size){ unsigned int added = MAX_RECORD_SIZE - rec->used; if(added > size) added = size; if(added == 0) return 0; memcpy(rec->data + rec->used, ptr, added); rec->used += added; return added;}unsigned int record_minus(record_t *rec, unsigned char *ptr, unsigned int size){ unsigned int taken = rec->used; if(taken > size) taken = size; if(taken == 0) return 0; if(ptr) memcpy(ptr, rec->data, taken); rec->used -= taken; if(rec->used > 0) memmove(rec->data, rec->data + taken, rec->used); return taken;}void tls_session_information(tls_session_t *tls_session){ const char *str_write_p, *str_version, *str_content_type = "", *str_details1 = "", *str_details2= ""; str_write_p = tls_session->info.origin ? ">>>" : "<<<"; switch (tls_session->info.version) { case SSL2_VERSION: str_version = "SSL 2.0"; break; case SSL3_VERSION: str_version = "SSL 3.0 "; break; case TLS1_VERSION: str_version = "TLS 1.0 "; break; default: str_version = "???"; } if (tls_session->info.version == SSL3_VERSION || tls_session->info.version == TLS1_VERSION) { switch (tls_session->info.content_type) { case 20: str_content_type = "ChangeCipherSpec"; break; case 21: str_content_type = "Alert"; break; case 22: str_content_type = "Handshake"; break; } if (tls_session->info.content_type == 21) { /* Alert */ str_details1 = ", ???"; if (tls_session->info.record_len == 2) { switch (tls_session->info.alert_level) { case 1: str_details1 = ", warning"; break; case 2: str_details1 = ", fatal"; break; } str_details2 = " ???"; switch (tls_session->info.alert_description) { case 0: str_details2 = " close_notify"; break; case 10: str_details2 = " unexpected_message"; break; case 20: str_details2 = " bad_record_mac"; break; case 21: str_details2 = " decryption_failed"; break; case 22: str_details2 = " record_overflow"; break; case 30: str_details2 = " decompression_failure"; break; case 40: str_details2 = " handshake_failure"; break; case 42: str_details2 = " bad_certificate"; break; case 43: str_details2 = " unsupported_certificate"; break; case 44: str_details2 = " certificate_revoked"; break; case 45: str_details2 = " certificate_expired"; break; case 46: str_details2 = " certificate_unknown"; break; case 47: str_details2 = " illegal_parameter"; break; case 48: str_details2 = " unknown_ca"; break; case 49: str_details2 = " access_denied"; break; case 50: str_details2 = " decode_error"; break; case 51: str_details2 = " decrypt_error"; break; case 60: str_details2 = " export_restriction"; break; case 70: str_details2 = " protocol_version"; break; case 71: str_details2 = " insufficient_security"; break; case 80: str_details2 = " internal_error"; break; case 90: str_details2 = " user_canceled"; break; case 100: str_details2 = " no_renegotiation"; break; } } } if (tls_session->info.content_type == 22) /* Handshake */ { str_details1 = "???"; if (tls_session->info.record_len > 0) switch (tls_session->info.handshake_type) { case 0: str_details1 = ", HelloRequest"; break; case 1: str_details1 = ", ClientHello"; break; case 2: str_details1 = ", ServerHello"; break; case 11: str_details1 = ", Certificate"; break; case 12: str_details1 = ", ServerKeyExchange"; break; case 13: str_details1 = ", CertificateRequest"; break; case 14: str_details1 = ", ServerHelloDone"; break; case 15: str_details1 = ", CertificateVerify"; break; case 16: str_details1 = ", ClientKeyExchange"; break; case 20: str_details1 = ", Finished"; break; } } } sprintf(tls_session->info.info_description, "%s %s%s [length %04lx]%s%s\n", str_write_p, str_version, str_content_type, (unsigned long)tls_session->info.record_len, str_details1, str_details2); DEBUG2("rlm_eap_tls: %s\n", tls_session->info.info_description);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -