ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
security.c File Reference

Go to the source code of this file.

Functions

asciichat_error_t browser_security_init (crypto_context_t *ctx)
asciichat_error_t browser_security_packet (crypto_context_t *ctx, bool seal, uint32_t channel, uint32_t delivery, const uint8_t *packet, size_t length, uint8_t *output, size_t capacity, size_t *out_length, uint64_t *sequence)
asciichat_error_t browser_security_tick (crypto_context_t *ctx)
asciichat_error_t browser_security_output (crypto_context_t *ctx, uint8_t *output, size_t capacity, size_t *length, uint32_t *channel)
double browser_security_epoch (crypto_context_t *ctx)

Function Documentation

◆ browser_security_epoch()

double browser_security_epoch ( crypto_context_t * ctx)

Definition at line 71 of file src/web/security.c.

71 {
72 crypto_session_t *session;
73 if (crypto_session_lock(ctx, &session) != ASCIICHAT_OK)
74 return -1;
75 double epoch = (double)session->records.key_epoch;
76 crypto_session_unlock(session);
77 return epoch;
78}
@ ASCIICHAT_OK
Definition error_codes.h:46
struct crypto_session crypto_session_t
For crypto session, this is the live record that ties owner, mutex, records, rotation together....
void crypto_session_unlock(crypto_session_t *session)
asciichat_error_t crypto_session_lock(crypto_context_t *crypto, crypto_session_t **output)
uint64_t key_epoch
Definition record.h:19

References ASCIICHAT_OK, crypto_session_lock(), crypto_session_unlock(), crypto_record::key_epoch, and crypto_session::records.

Referenced by PeerCryptoBinding::quicEpoch().

◆ browser_security_init()

asciichat_error_t browser_security_init ( crypto_context_t * ctx)

Definition at line 6 of file src/web/security.c.

6 {
7 crypto_session_t *session;
8 asciichat_error_t result = crypto_session_lock(ctx, &session);
9 if (result == ASCIICHAT_OK)
10 crypto_session_unlock(session);
11 return result;
12}
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44

References ASCIICHAT_OK, crypto_session_lock(), and crypto_session_unlock().

Referenced by PeerCryptoBinding::initQuic().

◆ browser_security_output()

asciichat_error_t browser_security_output ( crypto_context_t * ctx,
uint8_t * output,
size_t capacity,
size_t * length,
uint32_t * channel )

Definition at line 54 of file src/web/security.c.

55 {
56 // The largest control is a public key plus the common framing and record overhead.
57 if (!output || !length || !channel || capacity < 256)
58 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid browser security control buffer");
59 uint8_t *packet = NULL;
61 *length = 0;
62 asciichat_error_t result = acip_security_next_control(ctx, &flow, &packet, length);
63 if (result == ASCIICHAT_OK && *length) {
64 memcpy(output, packet, *length);
65 *channel = flow;
66 }
67 buffer_release(packet);
68 return result;
69}
#define SET_ERRNO(code,...)
#define buffer_release(data)
Definition buffer.h:91
unsigned char uint8_t
Definition common.h:60
@ ERROR_INVALID_PARAM
asciichat_error_t acip_security_next_control(crypto_context_t *crypto, acip_traffic_class_t *flow, uint8_t **wire, size_t *length)
acip_traffic_class_t
Definition traffic.h:5

References acip_security_next_control(), ASCIICHAT_OK, buffer_release, ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by network_quic_output().

◆ browser_security_packet()

asciichat_error_t browser_security_packet ( crypto_context_t * ctx,
bool seal,
uint32_t channel,
uint32_t delivery,
const uint8_t * packet,
size_t length,
uint8_t * output,
size_t capacity,
size_t * out_length,
uint64_t * sequence )

Definition at line 14 of file src/web/security.c.

16 {
17 const size_t overhead = sizeof(packet_header_t) + 32 + CRYPTO_NONCE_SIZE + CRYPTO_MAC_SIZE;
18 if (!packet || !output || !out_length || !sequence || length > SIZE_MAX - overhead ||
19 capacity < length + (seal ? overhead : 0))
20 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid browser security packet buffer");
21 *out_length = 0;
22 *sequence = 0;
23 uint8_t *result_packet = NULL;
24 size_t result_length = 0;
25 bool consumed = false;
26 bool quiet = !seal && delivery == ACIP_DELIVERY_DATAGRAM;
28 if (quiet)
29 scope = errno_scope_begin();
30 asciichat_error_t result =
31 seal ? acip_security_seal(ctx, channel, delivery, packet, length, &result_packet, &result_length)
32 : acip_security_open(ctx, channel, delivery, packet, length, &result_packet, &result_length, sequence,
33 &consumed);
34 if (quiet)
36 if (result == ASCIICHAT_OK && !consumed) {
37 memcpy(output, result_packet, result_length);
38 *out_length = result_length;
39 }
40 buffer_release(result_packet);
41 return result;
42}
void errno_scope_end(asciichat_errno_scope_t scope, asciichat_errno_outcome_t outcome)
asciichat_errno_scope_t errno_scope_begin(void)
@ ASCIICHAT_ERRNO_DISMISSED
asciichat_error_t acip_security_seal(crypto_context_t *crypto, acip_traffic_class_t flow, acip_delivery_t delivery, const void *packet, size_t length, uint8_t **output, size_t *written)
asciichat_error_t acip_security_open(crypto_context_t *crypto, acip_traffic_class_t flow, acip_delivery_t delivery, const void *packet, size_t length, uint8_t **output, size_t *written, uint64_t *sequence, bool *consumed)
#define CRYPTO_NONCE_SIZE
Nonce size (XSalsa20).
Definition sizes.h:79
#define CRYPTO_MAC_SIZE
MAC size (Poly1305).
Definition sizes.h:85
When code needs to work with asciichat errno snapshot, it keeps total, copied here instead of scatter...
Fixed prefix shared by every ACIP packet on the wire.
Definition packet.h:628
@ ACIP_DELIVERY_DATAGRAM
Definition traffic.h:13

References ACIP_DELIVERY_DATAGRAM, acip_security_open(), acip_security_seal(), ASCIICHAT_ERRNO_DISMISSED, ASCIICHAT_OK, buffer_release, CRYPTO_MAC_SIZE, CRYPTO_NONCE_SIZE, errno_scope_begin(), errno_scope_end(), ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by network_quic_packet().

◆ browser_security_tick()

asciichat_error_t browser_security_tick ( crypto_context_t * ctx)

Definition at line 44 of file src/web/security.c.

44 {
45 crypto_session_t *session;
46 asciichat_error_t result = crypto_session_lock(ctx, &session);
47 if (result == ASCIICHAT_OK) {
48 result = crypto_session_tick(session, time_get_ns());
49 crypto_session_unlock(session);
50 }
51 return result;
52}
asciichat_error_t crypto_session_tick(crypto_session_t *session, uint64_t now)

References ASCIICHAT_OK, crypto_session_lock(), crypto_session_tick(), and crypto_session_unlock().

Referenced by PeerCryptoBinding::tickQuic().