aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tim Segers <tsegers@pm.me>2025-10-31 18:36:13 +0100
committerGravatar Tim Segers <tsegers@pm.me>2025-11-07 14:03:27 +0100
commitfd6ada706fe3d9fa91141bdd14e12529e93df42e (patch)
tree9718af415ffeba4d68276ecced4016e79a31c988
parent65cbfdc36700c4df4ae1eb9f94b017164501b28c (diff)
downloadtweetpipe-fd6ada706fe3d9fa91141bdd14e12529e93df42e.tar.gz
Add diagrams
-rw-r--r--src/tweetpipe.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/tweetpipe.c b/src/tweetpipe.c
index f146cd7..b74bbaf 100644
--- a/src/tweetpipe.c
+++ b/src/tweetpipe.c
@@ -76,14 +76,54 @@ stream_encrypt(Context *ctx)
max_chunk_size = ctx->sizeof_buf - 4 - crypto_secretbox_NONCEBYTES + crypto_secretbox_BOXZEROBYTES - crypto_secretbox_ZEROBYTES;
assert(max_chunk_size <= 0x7fffffff);
chunk_id = 0;
+ /*
+ * L: chunk_size
+ * ?: Undefined
+ * 0: 0 bytes
+ * M: Message
+ * C: Ciphertext
+ * N: Nonce
+ *
+ * load message and chunk_size into buffer:
+ *
+ * +- chunk_size_p
+ * | +- chunk_nonce
+ * | | +- chunk_base +- chunk_msg
+ * | | | |
+ * 0 4 12 28 44
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * |LLL|???????|000000000000000|000000000000000|MMMMMMMMMMMMMMMMMM
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * | 4 | 8 | 16 | 16 | chunk_size
+ * | ZEROBYTES |
+ * | BOXZEROBYTES |
+ * | NONCEBYTES |
+ * | NB-BZ |
+ */
while ((chunk_size = safe_read_partial(ctx->fd_in, chunk_msg, max_chunk_size)) >= 0) {
STORE32_LE(chunk_size_p, (uint32_t) chunk_size);
memzero(chunk_nonce, crypto_secretbox_NONCEBYTES - crypto_secretbox_BOXZEROBYTES + crypto_secretbox_ZEROBYTES);
randombytes(nonce, crypto_secretbox_NONCEBYTES);
+ /*
+ * encrypt with crypto_secretbox()
+ *
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * |LLL|???????|000000000000000|CCCCCCCCCCCCCCC|CCCCCCCCCCCCCCCCCC
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * | 4 | 8 | 16 | 16 | chunk_size
+ */
if (crypto_secretbox(chunk_base, chunk_base, chunk_size + crypto_secretbox_ZEROBYTES, nonce, ctx->key) !=
0) {
die(0, "Encryption error");
}
+ /*
+ * copy nonce into empty space:
+ *
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * |LLL|NNNNNNN|NNNNNNNNNNNNNNN|CCCCCCCCCCCCCCC|CCCCCCCCCCCCCCCCCC
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
+ * | 4 | 8 | 16 | 16 | chunk_size
+ */
memcpy(chunk_nonce, nonce, crypto_secretbox_NONCEBYTES);
if (safe_write(ctx->fd_out, chunk_size_p, 4 + crypto_secretbox_NONCEBYTES - crypto_secretbox_BOXZEROBYTES + crypto_secretbox_ZEROBYTES + chunk_size,
-1) < 0) {