ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
src/web/security.c
Go to the documentation of this file.
1#include "security.h"
2#include <ascii-chat/buffer.h>
3#include <emscripten.h>
4#include <string.h>
5
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}
13
15 const uint8_t *packet, size_t length, uint8_t *output, size_t capacity,
16 size_t *out_length, uint64_t *sequence) {
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}
43
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}
53
54asciichat_error_t browser_security_output(crypto_context_t *ctx, uint8_t *output, size_t capacity, size_t *length,
55 uint32_t *channel) {
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}
70
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}
void errno_scope_end(asciichat_errno_scope_t scope, asciichat_errno_outcome_t outcome)
asciichat_errno_scope_t errno_scope_begin(void)
#define SET_ERRNO(code,...)
@ ASCIICHAT_ERRNO_DISMISSED
#define buffer_release(data)
Definition buffer.h:91
unsigned int uint32_t
Definition common.h:62
unsigned long long uint64_t
Definition common.h:63
unsigned char uint8_t
Definition common.h:60
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
struct crypto_session crypto_session_t
For crypto session, this is the live record that ties owner, mutex, records, rotation together....
asciichat_error_t crypto_session_tick(crypto_session_t *session, uint64_t now)
void crypto_session_unlock(crypto_session_t *session)
asciichat_error_t crypto_session_lock(crypto_context_t *crypto, crypto_session_t **output)
asciichat_error_t acip_security_next_control(crypto_context_t *crypto, acip_traffic_class_t *flow, uint8_t **wire, size_t *length)
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
double browser_security_epoch(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_output(crypto_context_t *ctx, uint8_t *output, size_t capacity, size_t *length, uint32_t *channel)
asciichat_error_t browser_security_tick(crypto_context_t *ctx)
asciichat_error_t browser_security_init(crypto_context_t *ctx)
🔤 String Manipulation and Shell Escaping Utilities
When code needs to work with asciichat errno snapshot, it keeps total, copied here instead of scatter...
Endpoint cryptographic state for handshake, packet protection, authentication, and rekeying.
uint64_t key_epoch
Definition record.h:19
Fixed prefix shared by every ACIP packet on the wire.
Definition packet.h:628
acip_traffic_class_t
Definition traffic.h:5
@ ACIP_DELIVERY_DATAGRAM
Definition traffic.h:13