Docs for tls.h and trace.h.

This commit is contained in:
Cory McWilliams 2024-02-28 19:12:41 -05:00
parent 402a898d96
commit 6182ffa1d4
2 changed files with 201 additions and 2 deletions

128
src/tls.h
View File

@ -9,9 +9,19 @@
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
/**
** A TLS context. May have many tf_tls_session_t instances.
*/
typedef struct _tf_tls_context_t tf_tls_context_t; typedef struct _tf_tls_context_t tf_tls_context_t;
/**
** A TLS session. Belongs to one tf_tls_context_t and represents a single connection.
*/
typedef struct _tf_tls_session_t tf_tls_session_t; typedef struct _tf_tls_session_t tf_tls_session_t;
/**
** The state of a TLS handshake.
*/
typedef enum _tf_tls_handshake_t typedef enum _tf_tls_handshake_t
{ {
k_tls_handshake_done, k_tls_handshake_done,
@ -19,31 +29,149 @@ typedef enum _tf_tls_handshake_t
k_tls_handshake_failed, k_tls_handshake_failed,
} tf_tls_handshake_t; } tf_tls_handshake_t;
/**
** Possible error statuses from tf_tls_session_read_plain.
*/
typedef enum _tf_tls_read_t typedef enum _tf_tls_read_t
{ {
k_tls_read_zero = -1, k_tls_read_zero = -1,
k_tls_read_failed = -2, k_tls_read_failed = -2,
} tf_tls_read_t; } tf_tls_read_t;
/**
** Create a TLS context. Clean up with tf_tls_context_destroy().
** @return A new TLS context.
*/
tf_tls_context_t* tf_tls_context_create(); tf_tls_context_t* tf_tls_context_create();
/**
** Set the TLS context's server certificate.
** @param context The TLS context.
** @param certificate The certificate in PEM format.
** @return true if set successfully.
*/
bool tf_tls_context_set_certificate(tf_tls_context_t* context, const char* certificate); bool tf_tls_context_set_certificate(tf_tls_context_t* context, const char* certificate);
/**
** Set the TLS context's server certificate's private key.
** @param context The TLS context.
** @param private_key The private key in PEM format.
** @return true if set successfully.
*/
bool tf_tls_context_set_private_key(tf_tls_context_t* context, const char* private_key); bool tf_tls_context_set_private_key(tf_tls_context_t* context, const char* private_key);
/**
** Add a trusted certificate.
** @param context The TLS context.
** @param certificate The certificate in PEM format.
** @return true if the certificate was added to the trusted list successfully.
*/
bool tf_tls_context_add_trusted_certificate(tf_tls_context_t* context, const char* certificate); bool tf_tls_context_add_trusted_certificate(tf_tls_context_t* context, const char* certificate);
/**
** Create a TLS session from a context. Once created, call
** tf_tls_session_handshake() until it returns k_tls_handshake_done. Call
** tf_tls_session_[read/write]_[plain/encrypted]() as data is available.
** @param context The TLS context. Clean up with tf_tls_session_destroy().
** @return A new TLS session.
*/
tf_tls_session_t* tf_tls_context_create_session(tf_tls_context_t* context); tf_tls_session_t* tf_tls_context_create_session(tf_tls_context_t* context);
/**
** Destroy a TLS context.
** @param context The TLS contextx created by tf_tls_context_create().
*/
void tf_tls_context_destroy(tf_tls_context_t* context); void tf_tls_context_destroy(tf_tls_context_t* context);
/**
** Destroy a TLS session.
** @param session A TLS sesssion created by tf_tls_context_create_session().
*/
void tf_tls_session_destroy(tf_tls_session_t* session); void tf_tls_session_destroy(tf_tls_session_t* session);
/**
** Set the remote hostname for a session.
** @param session The TLS session.
** @param hostname The hostname.
*/
void tf_tls_session_set_hostname(tf_tls_session_t* session, const char* hostname); void tf_tls_session_set_hostname(tf_tls_session_t* session, const char* hostname);
/**
** Begin an outgoing TLS session.
** @param session The TLS session.
*/
void tf_tls_session_start_accept(tf_tls_session_t* session); void tf_tls_session_start_accept(tf_tls_session_t* session);
/**
** Begin an incoming TLS session.
** @param session The TLS session.
*/
void tf_tls_session_start_connect(tf_tls_session_t* session); void tf_tls_session_start_connect(tf_tls_session_t* session);
/**
** Begin the clean shutdown process for a TLS session.
** @param session The TLS session.
*/
void tf_tls_session_shutdown(tf_tls_session_t* session); void tf_tls_session_shutdown(tf_tls_session_t* session);
/**
** Get the certificate from the remote end of a TLS session if available.
** @param session The TLS session.
** @param buffer A buffer to receive the certificate.
** @param bytes The size of the buffer.
** @return The size of the returned certificate, or -1 on failure.
*/
int tf_tls_session_get_peer_certificate(tf_tls_session_t* session, char* buffer, size_t bytes); int tf_tls_session_get_peer_certificate(tf_tls_session_t* session, char* buffer, size_t bytes);
/**
** Update the TLS handshake. Call repeatedly as new data is available until it returns done.
** @param session The TLS session.
** @return The current state of the handshake process.
*/
tf_tls_handshake_t tf_tls_session_handshake(tf_tls_session_t* session); tf_tls_handshake_t tf_tls_session_handshake(tf_tls_session_t* session);
/**
** Read decrypted data from the TLS session.
** @param session The TLS session.
** @param buffer A buffer to receive the data.
** @param bytes The size of the buffer.
** @return The number of bytes returned.
*/
int tf_tls_session_read_plain(tf_tls_session_t* session, char* buffer, size_t bytes); int tf_tls_session_read_plain(tf_tls_session_t* session, char* buffer, size_t bytes);
/**
** Write unencrypted data to the TLS session.
** @param session The TLS session.
** @param buffer The data to encrypt.
** @param bytes The size of the data.
** @return 1 on success, 0 on failure.
*/
int tf_tls_session_write_plain(tf_tls_session_t* session, const char* buffer, size_t bytes); int tf_tls_session_write_plain(tf_tls_session_t* session, const char* buffer, size_t bytes);
/**
** Read encrypted data from the TLS session that needs to be sent.
** @param session The TLS session.
** @param buffer A buffer to receive the data.
** @param bytes The size of the buffer.
** @return The number of bytes returned.
*/
int tf_tls_session_read_encrypted(tf_tls_session_t* session, char* buffer, size_t bytes); int tf_tls_session_read_encrypted(tf_tls_session_t* session, char* buffer, size_t bytes);
/**
** Write encrypted data to the TLS session.
** @param session The TLS session.
** @param buffer The encrypted data.
** @param bytes The number of bytes written.
*/
int tf_tls_session_write_encrypted(tf_tls_session_t* session, const char* buffer, size_t bytes); int tf_tls_session_write_encrypted(tf_tls_session_t* session, const char* buffer, size_t bytes);
/**
** Retrieve the last error from a TLS session.
** @param session The TLS session.
** @param buffer A buffer to receive the error text.
** @param bytes The size of the buffer.
** @return true if an error was retrieved.
*/
bool tf_tls_session_get_error(tf_tls_session_t* session, char* buffer, size_t bytes); bool tf_tls_session_get_error(tf_tls_session_t* session, char* buffer, size_t bytes);
/** @} */ /** @} */

View File

@ -3,32 +3,103 @@
/** /**
** \defgroup trace Performance Tracing ** \defgroup trace Performance Tracing
** Generates trace output that is compatible with speedscope.app, ** Generates trace output that is compatible with speedscope.app,
** chrome://tracing or ui.perfetto.dev for scrutining what each thread is doing ** chrome://tracing or ui.perfetto.dev for scrutinizing what each thread is
** for optimization purposes. ** doing for optimization purposes.
** @{ ** @{
*/ */
#include <inttypes.h> #include <inttypes.h>
#include <stddef.h> #include <stddef.h>
/**
** A trace instance.
*/
typedef struct _tf_trace_t tf_trace_t; typedef struct _tf_trace_t tf_trace_t;
/**
** An SQLite database instance.
*/
typedef struct sqlite3 sqlite3; typedef struct sqlite3 sqlite3;
/**
** Create a trace instance. Can be used to produce a Chrome trace event
** document for analyzing performance. Clean up with tf_trace_destroy().
** @return A trace instance.
*/
tf_trace_t* tf_trace_create(); tf_trace_t* tf_trace_create();
/**
** Destroy a trace instance that was created with tf_trace_create().
*/
void tf_trace_destroy(tf_trace_t* trace); void tf_trace_destroy(tf_trace_t* trace);
/**
** Set the name of the current process.
** @param trace The trace instance.
** @param name The name of the process.
*/
void tf_trace_set_process_name(tf_trace_t* trace, const char* name); void tf_trace_set_process_name(tf_trace_t* trace, const char* name);
/**
** Record counter values.
** @param trace The trace instance.
** @param name The counter group name.
** @param argc The number of counters.
** @param arg_names The counter names.
** @param arg_values The counter values.
*/
void tf_trace_counter(tf_trace_t* trace, const char* name, int argc, const char** arg_names, const int64_t* arg_values); void tf_trace_counter(tf_trace_t* trace, const char* name, int argc, const char** arg_names, const int64_t* arg_values);
/**
** Begin tracing a time interval. End with tf_trace_end().
** @param trace The trace instance.
** @param name The interval name.
*/
void tf_trace_begin(tf_trace_t* trace, const char* name); void tf_trace_begin(tf_trace_t* trace, const char* name);
/**
** End tracing the next time interval previously started with tf_trace_begin().
** @param trace The trace instance.
*/
void tf_trace_end(tf_trace_t* trace); void tf_trace_end(tf_trace_t* trace);
/**
** Export all currently stored trace data to a string.
** @param trace The trace instance.
** @return A string representation of the trace data.
*/
char* tf_trace_export(tf_trace_t* trace); char* tf_trace_export(tf_trace_t* trace);
/**
** A callback to collect trace data.
** @param trace The trace instance.
** @param buffer The trace data.
** @param size The size of the trace data.
** @param user_data User data registered with the callback.
*/
typedef void(tf_trace_write_callback_t)(tf_trace_t* trace, const char* buffer, size_t size, void* user_data); typedef void(tf_trace_write_callback_t)(tf_trace_t* trace, const char* buffer, size_t size, void* user_data);
/**
** Replace the trace recording behavior.
** @param trace The trace instance.
** @param callback A callback that will be called instead of collecting the trace data in a buffer.
** @param user_data User data to pass to the callback.
*/
void tf_trace_set_write_callback(tf_trace_t* trace, tf_trace_write_callback_t* callback, void* user_data); void tf_trace_set_write_callback(tf_trace_t* trace, tf_trace_write_callback_t* callback, void* user_data);
/**
** Inject raw trace data.
** @param trace The trace instance.
** @param buffer The trace data.
** @param size The size of the trace data.
*/
void tf_trace_raw(tf_trace_t* trace, const char* buffer, size_t size); void tf_trace_raw(tf_trace_t* trace, const char* buffer, size_t size);
/**
** Register for trace-worthy events from sqlite and record them going forward.
** @param trace The trace instance.
** @param sqlite The SQLite database.
*/
void tf_trace_sqlite(tf_trace_t* trace, sqlite3* sqlite); void tf_trace_sqlite(tf_trace_t* trace, sqlite3* sqlite);
/** @} */ /** @} */