summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ffi/examples/armor.c20
-rw-r--r--ffi/examples/encrypt-for.c45
-rw-r--r--ffi/examples/example.c15
-rw-r--r--ffi/examples/parser.c24
-rw-r--r--ffi/examples/reader.c20
-rw-r--r--ffi/include/sequoia/core.h8
-rw-r--r--ffi/include/sequoia/openpgp.h86
-rw-r--r--ffi/src/core.rs29
-rw-r--r--ffi/src/lib.rs13
-rw-r--r--ffi/src/openpgp/armor.rs69
-rw-r--r--ffi/src/openpgp/crypto.rs7
-rw-r--r--ffi/src/openpgp/mod.rs115
-rw-r--r--ffi/src/openpgp/packet_pile.rs21
-rw-r--r--ffi/src/openpgp/tpk.rs89
-rw-r--r--ffi/src/openpgp/tsk.rs11
15 files changed, 195 insertions, 377 deletions
diff --git a/ffi/examples/armor.c b/ffi/examples/armor.c
index a2643667..5a1b9339 100644
--- a/ffi/examples/armor.c
+++ b/ffi/examples/armor.c
@@ -20,7 +20,6 @@ int
main (int argc, char **argv)
{
sq_error_t err;
- sq_context_t ctx;
sq_reader_t bytes;
sq_reader_t armor;
sq_armor_kind_t kind;
@@ -28,18 +27,12 @@ main (int argc, char **argv)
sq_armor_header_t *header;
size_t header_len;
- ctx = sq_context_new ("org.sequoia-pgp.example", &err);
- if (ctx == NULL)
- error (1, 0, "Initializing sequoia failed: %s",
- sq_error_string (err));
-
bytes = sq_reader_from_bytes ((uint8_t *) armored, strlen (armored));
armor = sq_armor_reader_new (bytes, SQ_ARMOR_KIND_ANY);
- header = sq_armor_reader_headers (ctx, armor, &header_len);
+ header = sq_armor_reader_headers (&err, armor, &header_len);
if (header == NULL)
- error (1, 0, "Getting headers failed: %s",
- sq_error_string (err));
+ error (1, 0, "Getting headers failed: %s", sq_error_string (err));
assert (header_len == 2);
assert (strcmp (header[0].key, "Key0") == 0
@@ -56,17 +49,12 @@ main (int argc, char **argv)
kind = sq_armor_reader_kind (armor);
assert (kind == SQ_ARMOR_KIND_FILE);
- if (sq_reader_read (ctx, armor, (uint8_t *) message, 12) < 0)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "Reading failed: %s",
- sq_error_string (err));
- }
+ if (sq_reader_read (&err, armor, (uint8_t *) message, 12) < 0)
+ error (1, 0, "Reading failed: %s", sq_error_string (err));
assert (memcmp (message, "Hello world!", 12) == 0);
sq_reader_free (armor);
sq_reader_free (bytes);
- sq_context_free (ctx);
return 0;
}
diff --git a/ffi/examples/encrypt-for.c b/ffi/examples/encrypt-for.c
index 15ff3ef6..f0c34449 100644
--- a/ffi/examples/encrypt-for.c
+++ b/ffi/examples/encrypt-for.c
@@ -22,7 +22,6 @@ main (int argc, char **argv)
uint8_t *b;
sq_status_t rc;
sq_error_t err;
- sq_context_t ctx;
int use_armor = 1;
sq_tpk_t tpk;
sq_writer_t sink;
@@ -33,11 +32,6 @@ main (int argc, char **argv)
if (argc != 2)
error (1, 0, "Usage: %s <keyfile> <plain >cipher", argv[0]);
- ctx = sq_context_new ("org.sequoia-pgp.example", &err);
- if (ctx == NULL)
- error (1, 0, "Initializing sequoia failed: %s",
- sq_error_string (err));
-
if (stat (argv[1], &st))
error (1, errno, "%s", argv[1]);
@@ -50,37 +44,28 @@ main (int argc, char **argv)
if (b == MAP_FAILED)
error (1, errno, "mmap");
- tpk = sq_tpk_from_bytes (ctx, b, st.st_size);
+ tpk = sq_tpk_from_bytes (&err, b, st.st_size);
if (tpk == NULL)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_packet_parser_from_bytes: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_packet_parser_from_bytes: %s", sq_error_string (err));
sink = sq_writer_alloc (&cipher, &cipher_bytes);
if (use_armor)
- sink = sq_armor_writer_new (ctx, sink, SQ_ARMOR_KIND_MESSAGE,
+ sink = sq_armor_writer_new (&err, sink, SQ_ARMOR_KIND_MESSAGE,
NULL, 0);
writer = sq_writer_stack_message (sink);
- writer = sq_encryptor_new (ctx,
+ writer = sq_encryptor_new (&err,
writer,
NULL, 0, /* no passwords */
&tpk, 1,
SQ_ENCRYPTION_MODE_FOR_TRANSPORT);
if (writer == NULL)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_encryptor_new: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_encryptor_new: %s", sq_error_string (err));
- writer = sq_literal_writer_new (ctx, writer);
+ writer = sq_literal_writer_new (&err, writer);
if (writer == NULL)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_literal_writer_new: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_literal_writer_new: %s", sq_error_string (err));
size_t nread;
uint8_t buf[4096];
@@ -90,28 +75,22 @@ main (int argc, char **argv)
while (nread)
{
ssize_t written;
- written = sq_writer_stack_write (ctx, writer, b, nread);
+ written = sq_writer_stack_write (&err, writer, b, nread);
if (written < 0)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_writer_stack_write: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_writer_stack_write: %s", sq_error_string (err));
+
b += written;
nread -= written;
}
}
- rc = sq_writer_stack_finalize (ctx, writer);
+ rc = sq_writer_stack_finalize (&err, writer);
writer = NULL;
if (rc)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_writer_stack_write: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_writer_stack_write: %s", sq_error_string (err));
fwrite (cipher, 1, cipher_bytes, stdout);
- sq_context_free (ctx);
munmap (b, st.st_size);
return 0;
}
diff --git a/ffi/examples/example.c b/ffi/examples/example.c
index 2b4d8126..8636d011 100644
--- a/ffi/examples/example.c
+++ b/ffi/examples/example.c
@@ -17,17 +17,11 @@ main (int argc, char **argv)
int fd;
uint8_t *b;
sq_error_t err;
- sq_context_t ctx;
sq_tpk_t tpk;
if (argc != 2)
error (1, 0, "Usage: %s <file>", argv[0]);
- ctx = sq_context_new("org.sequoia-pgp.example", &err);
- if (ctx == NULL)
- error (1, 0, "Initializing sequoia failed: %s",
- sq_error_string (err));
-
if (stat (argv[1], &st))
error (1, errno, "%s", argv[1]);
@@ -39,15 +33,12 @@ main (int argc, char **argv)
if (b == MAP_FAILED)
error (1, errno, "mmap");
- tpk = sq_tpk_from_bytes (ctx, b, st.st_size);
+ tpk = sq_tpk_from_bytes (&err, b, st.st_size);
if (tpk == NULL)
- {
- sq_error_t err = sq_context_last_error (ctx);
- error (1, 0, "sq_tpk_from_bytes: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_tpk_from_bytes: %s", sq_error_string (err));
+
sq_tpk_dump (tpk);
sq_tpk_free (tpk);
- sq_context_free (ctx);
munmap (b, st.st_size);
close (fd);
return 0;
diff --git a/ffi/examples/parser.c b/ffi/examples/parser.c
index e26dd646..8d953422 100644
--- a/ffi/examples/parser.c
+++ b/ffi/examples/parser.c
@@ -22,18 +22,12 @@ main (int argc, char **argv)
uint8_t *b;
sq_status_t rc;
sq_error_t err;
- sq_context_t ctx;
sq_packet_parser_result_t ppr;
sq_packet_parser_t pp;
if (argc != 2)
error (1, 0, "Usage: %s <file>", argv[0]);
- ctx = sq_context_new ("org.sequoia-pgp.example", &err);
- if (ctx == NULL)
- error (1, 0, "Initializing sequoia failed: %s",
- sq_error_string (err));
-
if (stat (argv[1], &st))
error (1, errno, "%s", argv[1]);
@@ -51,7 +45,7 @@ main (int argc, char **argv)
time_t elapsed;
size_t tens_of_s = 0;
- ppr = sq_packet_parser_from_bytes (ctx, b, st.st_size);
+ ppr = sq_packet_parser_from_bytes (&err, b, st.st_size);
while (ppr && (pp = sq_packet_parser_result_packet_parser (ppr)))
{
// Get a reference to the packet that is currently being parsed.
@@ -64,13 +58,10 @@ main (int argc, char **argv)
// Finish parsing the current packet (returned in p), and read
// the header of the next packet (returned in ppr).
- rc = sq_packet_parser_next (ctx, pp, &p, &ppr);
+ rc = sq_packet_parser_next (&err, pp, &p, &ppr);
if (rc)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_packet_parser_from_bytes: %s",
- sq_error_string (err));
- }
+ error (1, 0, "sq_packet_parser_from_bytes: %s",
+ sq_error_string (err));
// We now own p. If we want, we can save it in some structure.
// This would be useful when collecting PKESK packets. Either
@@ -91,17 +82,12 @@ main (int argc, char **argv)
}
}
if (ppr == NULL)
- {
- err = sq_context_last_error (ctx);
- error (1, 0, "sq_packet_parser_from_bytes: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_packet_parser_from_bytes: %s", sq_error_string (err));
fprintf (stderr, "Parsed %ld packets in %ld seconds, %.2f packets/s.\n",
n, elapsed, (double) n / (double) elapsed);
sq_packet_parser_result_free (ppr);
-
- sq_context_free (ctx);
munmap (b, st.st_size);
return 0;
}
diff --git a/ffi/examples/reader.c b/ffi/examples/reader.c
index 1587979b..8e458620 100644
--- a/ffi/examples/reader.c
+++ b/ffi/examples/reader.c
@@ -17,18 +17,12 @@ main (int argc, char **argv)
int fd;
uint8_t *b;
sq_error_t err;
- sq_context_t ctx;
sq_reader_t reader;
sq_tpk_t tpk;
if (argc != 2)
error (1, 0, "Usage: %s <file>", argv[0]);
- ctx = sq_context_new("org.sequoia-pgp.example", &err);
- if (ctx == NULL)
- error (1, 0, "Initializing sequoia failed: %s",
- sq_error_string (err));
-
if (stat (argv[1], &st))
error (1, errno, "%s", argv[1]);
@@ -41,23 +35,13 @@ main (int argc, char **argv)
error (1, errno, "mmap");
reader = sq_reader_from_bytes (b, st.st_size);
- if (reader == NULL)
- {
- sq_error_t err = sq_context_last_error (ctx);
- error (1, 0, "sq_reader_from_bytes: %s", sq_error_string (err));
- }
-
- tpk = sq_tpk_from_reader (ctx, reader);
+ tpk = sq_tpk_from_reader (&err, reader);
if (tpk == NULL)
- {
- sq_error_t err = sq_context_last_error (ctx);
- error (1, 0, "sq_tpk_from_reader: %s", sq_error_string (err));
- }
+ error (1, 0, "sq_tpk_from_reader: %s", sq_error_string (err));
sq_tpk_dump (tpk);
sq_tpk_free (tpk);
sq_reader_free (reader);
- sq_context_free (ctx);
munmap (b, st.st_size);
close (fd);
return 0;
diff --git a/ffi/include/sequoia/core.h b/ffi/include/sequoia/core.h
index 829d7104..9d7d261b 100644
--- a/ffi/include/sequoia/core.h
+++ b/ffi/include/sequoia/core.h
@@ -229,7 +229,7 @@ typedef struct sq_reader *sq_reader_t;
/*/
/// Opens a file returning a reader.
/*/
-sq_reader_t sq_reader_from_file (sq_context_t ctx, const char *filename);
+sq_reader_t sq_reader_from_file (sq_error_t *errp, const char *filename);
/*/
/// Opens a file descriptor returning a reader.
@@ -249,7 +249,7 @@ void sq_reader_free (sq_reader_t reader);
/*/
/// Reads up to `len` bytes into `buf`.
/*/
-ssize_t sq_reader_read (sq_context_t ctx, sq_reader_t reader,
+ssize_t sq_reader_read (sq_error_t *errp, sq_reader_t reader,
uint8_t *buf, size_t len);
/*/
@@ -263,7 +263,7 @@ typedef struct sq_writer *sq_writer_t;
/// The file will be created if it does not exist, or be truncated
/// otherwise. If you need more control, use `sq_writer_from_fd`.
/*/
-sq_writer_t sq_writer_from_file (sq_context_t ctx, const char *filename);
+sq_writer_t sq_writer_from_file (sq_error_t *errp, const char *filename);
/*/
/// Opens a file descriptor returning a writer.
@@ -295,7 +295,7 @@ void sq_writer_free (sq_writer_t writer);
/*/
/// Writes up to `len` bytes of `buf` into `writer`.
/*/
-ssize_t sq_writer_write (sq_context_t ctx, sq_writer_t writer,
+ssize_t sq_writer_write (sq_error_t *errp, sq_writer_t writer,
const uint8_t *buf, size_t len);
#endif
diff --git a/ffi/include/sequoia/openpgp.h b/ffi/include/sequoia/openpgp.h
index 6fe71f6b..2632a58a 100644
--- a/ffi/include/sequoia/openpgp.h
+++ b/ffi/include/sequoia/openpgp.h
@@ -257,7 +257,7 @@ sq_reader_t sq_armor_reader_new (sq_reader_t inner, sq_armor_kind_t kind);
/*/
/// Creates a `Reader` from a file.
/*/
-sq_reader_t sq_armor_reader_from_file (sq_context_t ctx,
+sq_reader_t sq_armor_reader_from_file (sq_error_t *errp,
const char *filename,
sq_armor_kind_t kind);
@@ -290,7 +290,7 @@ sq_armor_kind_t sq_armor_reader_kind (sq_reader_t reader);
/// allocated with `malloc`, and the caller is responsible for freeing
/// both the array and the strings.
/*/
-sq_armor_header_t *sq_armor_reader_headers (sq_context_t ctx,
+sq_armor_header_t *sq_armor_reader_headers (sq_error_t *errp,
sq_reader_t reader,
size_t *len);
@@ -300,7 +300,7 @@ sq_armor_header_t *sq_armor_reader_headers (sq_context_t ctx,
///
/// A filter that applies ASCII Armor to the data written to it.
/*/
-sq_writer_t sq_armor_writer_new (sq_context_t ctx, sq_writer_t inner,
+sq_writer_t sq_armor_writer_new (sq_error_t *errp, sq_writer_t inner,
sq_armor_kind_t kind,
sq_armor_header_t *header, size_t header_len);
@@ -498,7 +498,7 @@ typedef struct sq_packet_pile *sq_packet_pile_t;
///
/// Note: this interface *does* buffer the contents of packets.
/*/
-sq_packet_pile_t sq_packet_pile_from_reader (sq_context_t ctx,
+sq_packet_pile_t sq_packet_pile_from_reader (sq_error_t *errp,
sq_reader_t reader);
/*/
@@ -507,7 +507,7 @@ sq_packet_pile_t sq_packet_pile_from_reader (sq_context_t ctx,
///
/// See `sq_packet_pile_from_reader` for more details and caveats.
/*/
-sq_packet_pile_t sq_packet_pile_from_file (sq_context_t ctx,
+sq_packet_pile_t sq_packet_pile_from_file (sq_error_t *errp,
const char *filename);
/*/
@@ -515,7 +515,7 @@ sq_packet_pile_t sq_packet_pile_from_file (sq_context_t ctx,
///
/// See `sq_packet_pile_from_reader` for more details and caveats.
/*/
-sq_packet_pile_t sq_packet_pile_from_bytes (sq_context_t ctx,
+sq_packet_pile_t sq_packet_pile_from_bytes (sq_error_t *errp,
const uint8_t *b, size_t len);
/*/
@@ -531,7 +531,7 @@ sq_packet_pile_t sq_packet_pile_clone (sq_packet_pile_t message);
/*/
/// Serializes the packet pile.
/*/
-sq_status_t sq_packet_pile_serialize (sq_context_t ctx,
+sq_status_t sq_packet_pile_serialize (sq_error_t *errp,
const sq_packet_pile_t message,
sq_writer_t writer);
@@ -647,7 +647,7 @@ sq_keyid_t sq_pkesk_recipient(sq_pkesk_t pkesk);
/// is not written to it. Either way, `key_len` is set to the size of
/// the session key.
/*/
-sq_status_t sq_pkesk_decrypt (sq_context_t ctx, sq_pkesk_t pkesk,
+sq_status_t sq_pkesk_decrypt (sq_error_t *errp, sq_pkesk_t pkesk,
sq_p_key_t secret_key,
uint8_t *algo, /* XXX */
uint8_t *key, size_t *key_len);
@@ -774,13 +774,13 @@ typedef struct sq_tsk *sq_tsk_t;
/*/
/// Returns the first TPK encountered in the reader.
/*/
-sq_tpk_t sq_tpk_from_reader (sq_context_t ctx,
+sq_tpk_t sq_tpk_from_reader (sq_error_t *errp,
sq_reader_t reader);
/*/
/// Returns the first TPK encountered in the file.
/*/
-sq_tpk_t sq_tpk_from_file (sq_context_t ctx,
+sq_tpk_t sq_tpk_from_file (sq_error_t *errp,
const char *filename);
/*/
@@ -788,7 +788,7 @@ sq_tpk_t sq_tpk_from_file (sq_context_t ctx,
///
/// Consumes `m`.
/*/
-sq_tpk_t sq_tpk_from_packet_pile (sq_context_t ctx,
+sq_tpk_t sq_tpk_from_packet_pile (sq_error_t *errp,
sq_packet_pile_t m);
/*/
@@ -796,7 +796,7 @@ sq_tpk_t sq_tpk_from_packet_pile (sq_context_t ctx,
///
/// `buf` must be an OpenPGP-encoded TPK.
/*/
-sq_tpk_t sq_tpk_from_bytes (sq_context_t ctx,
+sq_tpk_t sq_tpk_from_bytes (sq_error_t *errp,
const uint8_t *b, size_t len);
/*/
@@ -804,7 +804,7 @@ sq_tpk_t sq_tpk_from_bytes (sq_context_t ctx,
///
/// Consumes the packet parser result.
/*/
-sq_tpk_t sq_tpk_from_packet_parser (sq_context_t ctx,
+sq_tpk_t sq_tpk_from_packet_parser (sq_error_t *errp,
sq_packet_parser_result_t ppr);
/*/
@@ -825,7 +825,7 @@ int sq_tpk_equal (const sq_tpk_t a, const sq_tpk_t b);
/*/
/// Serializes the TPK.
/*/
-sq_status_t sq_tpk_serialize (sq_context_t ctx,
+sq_status_t sq_tpk_serialize (sq_error_t *errp,
const sq_tpk_t tpk,
sq_writer_t writer);
@@ -837,7 +837,7 @@ sq_status_t sq_tpk_serialize (sq_context_t ctx,
///
/// Consumes `tpk` and `other`.
/*/
-sq_tpk_t sq_tpk_merge (sq_context_t ctx,
+sq_tpk_t sq_tpk_merge (sq_error_t *errp,
sq_tpk_t tpk,
sq_tpk_t other);
@@ -850,7 +850,7 @@ sq_tpk_t sq_tpk_merge (sq_context_t ctx,
/// Consumes `tpk` and the packets in `packets`. The buffer, however,
/// must be freed by the caller.
/*/
-sq_tpk_t sq_tpk_merge_packets (sq_context_t ctx,
+sq_tpk_t sq_tpk_merge_packets (sq_error_t *errp,
sq_tpk_t tpk,
sq_packet_t *packets,
size_t packets_len);
@@ -893,7 +893,7 @@ sq_revocation_status_t sq_tpk_revocation_status (sq_tpk_t tpk);
///
/// This function consumes the writer. It does *not* consume tpk.
/*/
-sq_signature_t sq_tpk_revoke (sq_context_t ctx,
+sq_signature_t sq_tpk_revoke (sq_error_t *errp,
sq_tpk_t tpk,
sq_signer_t primary_signer,
sq_reason_for_revocation_t code,
@@ -904,7 +904,7 @@ sq_signature_t sq_tpk_revoke (sq_context_t ctx,
///
/// This function consumes the tpk.
/*/
-sq_tpk_t sq_tpk_revoke_in_place (sq_context_t ctx,
+sq_tpk_t sq_tpk_revoke_in_place (sq_error_t *errp,
sq_tpk_t tpk,
sq_signer_t primary_signer,
sq_reason_for_revocation_t code,
@@ -938,7 +938,7 @@ int sq_tpk_alive_at(sq_tpk_t tpk, time_t at);
///
/// This function consumes `tpk` and returns a new `TPK`.
/*/
-sq_tpk_t sq_tpk_set_expiry(sq_context_t ctx,
+sq_tpk_t sq_tpk_set_expiry(sq_error_t *errp,
sq_tpk_t tpk,
uint32_t expiry);
@@ -1033,7 +1033,7 @@ void sq_tpk_builder_add_certification_subkey(sq_tpk_builder_t *tpkb);
///
/// Consumes `tpkb`.
/*/
-sq_tpk_t sq_tpk_builder_generate(sq_context_t ctx, sq_tpk_builder_t tpkb,
+sq_tpk_t sq_tpk_builder_generate(sq_error_t *errp, sq_tpk_builder_t tpkb,
sq_tpk_t *tpk, sq_signature_t *revocation);
@@ -1042,7 +1042,7 @@ sq_tpk_t sq_tpk_builder_generate(sq_context_t ctx, sq_tpk_builder_t tpkb,
/*/
/// Generates a new RSA 3072 bit key with UID `primary_uid`.
/*/
-sq_status_t sq_tsk_new (sq_context_t ctx, char *primary_uid,
+sq_status_t sq_tsk_new (sq_error_t *errp, char *primary_uid,
sq_tsk_t *tpk, sq_signature_t *revocation);
/*/
@@ -1063,7 +1063,7 @@ sq_tpk_t sq_tsk_into_tpk (sq_tsk_t tsk);
/*/
/// Serializes the TSK.
/*/
-sq_status_t sq_tsk_serialize (sq_context_t ctx,
+sq_status_t sq_tsk_serialize (sq_error_t *errp,
const sq_tsk_t tsk,
sq_writer_t writer);
@@ -1188,7 +1188,7 @@ int sq_p_key_public_key_bits(sq_p_key_t key);
///
/// Fails if the secret key is missing, or encrypted.
/*/
-sq_key_pair_t sq_p_key_into_key_pair (sq_context_t ctx, sq_p_key_t key);
+sq_key_pair_t sq_p_key_into_key_pair (sq_error_t *errp, sq_p_key_t key);
/*/
/// Returns the value of the User ID Packet.
@@ -1216,7 +1216,7 @@ const uint8_t *sq_user_attribute_value (sq_user_attribute_t ua,
/// is not written to it. Either way, `key_len` is set to the size of
/// the session key.
/*/
-sq_status_t sq_skesk_decrypt (sq_context_t ctx, sq_skesk_t skesk,
+sq_status_t sq_skesk_decrypt (sq_error_t *errp, sq_skesk_t skesk,
const uint8_t *password, size_t password_len,
uint8_t *algo, /* XXX */
uint8_t *key, size_t *key_len);
@@ -1231,19 +1231,19 @@ uint32_t sq_p_key_creation_time (sq_p_key_t p);
/*/
/// Starts parsing an OpenPGP message stored in a `sq_reader_t` object.
/*/
-sq_packet_parser_result_t sq_packet_parser_from_reader (sq_context_t ctx,
+sq_packet_parser_result_t sq_packet_parser_from_reader (sq_error_t *errp,
sq_reader_t reader);
/*/
/// Starts parsing an OpenPGP message stored in a file named `path`.
/*/
-sq_packet_parser_result_t sq_packet_parser_from_file (sq_context_t ctx,
+sq_packet_parser_result_t sq_packet_parser_from_file (sq_error_t *errp,
const char *filename);
/*/
/// Starts parsing an OpenPGP message stored in a buffer.
/*/
-sq_packet_parser_result_t sq_packet_parser_from_bytes (sq_context_t ctx,
+sq_packet_parser_result_t sq_packet_parser_from_bytes (sq_error_t *errp,
const uint8_t *b,
size_t len);
@@ -1392,7 +1392,7 @@ uint8_t sq_packet_parser_recursion_depth (sq_packet_parser_t pp);
///
/// Consumes the given packet parser.
/*/
-sq_status_t sq_packet_parser_next (sq_context_t ctx,
+sq_status_t sq_packet_parser_next (sq_error_t *errp,
sq_packet_parser_t pp,
sq_packet_t *old_packet,
sq_packet_parser_result_t *ppr);
@@ -1419,7 +1419,7 @@ sq_status_t sq_packet_parser_next (sq_context_t ctx,
///
/// Consumes the given packet parser.
/*/
-sq_status_t sq_packet_parser_recurse (sq_context_t ctx,
+sq_status_t sq_packet_parser_recurse (sq_error_t *errp,
sq_packet_parser_t pp,
sq_packet_t *old_packet,
sq_packet_parser_result_t *ppr);
@@ -1432,7 +1432,7 @@ sq_status_t sq_packet_parser_recurse (sq_context_t ctx,
/// prefer streaming its content unless you are certain that the
/// content is small.
/*/
-uint8_t *sq_packet_parser_buffer_unread_content (sq_context_t ctx,
+uint8_t *sq_packet_parser_buffer_unread_content (sq_error_t *errp,
sq_packet_parser_t pp,
size_t *len);
@@ -1442,7 +1442,7 @@ uint8_t *sq_packet_parser_buffer_unread_content (sq_context_t ctx,
/// By default, this drops any unread content. Use, for instance,
/// `PacketParserBuild` to customize the default behavior.
/*/
-sq_status_t sq_packet_parser_finish (sq_context_t ctx,
+sq_status_t sq_packet_parser_finish (sq_error_t *errp,
sq_packet_parser_t pp,
sq_packet_t **packet);
@@ -1457,7 +1457,7 @@ sq_status_t sq_packet_parser_finish (sq_context_t ctx,
/// encrypted data, or some of the data was already read, then it
/// returns `Error::InvalidOperation`.
/*/
-sq_status_t sq_packet_parser_decrypt (sq_context_t ctx,
+sq_status_t sq_packet_parser_decrypt (sq_error_t *errp,
sq_packet_parser_t pp,
uint8_t algo, /* XXX */
uint8_t *key, size_t key_len);
@@ -1472,7 +1472,7 @@ sq_writer_stack_t sq_writer_stack_message (sq_writer_t writer);
/*/
/// Writes up to `len` bytes of `buf` into `writer`.
/*/
-ssize_t sq_writer_stack_write (sq_context_t ctx, sq_writer_stack_t writer,
+ssize_t sq_writer_stack_write (sq_error_t *errp, sq_writer_stack_t writer,
const uint8_t *buf, size_t len);
/*/
@@ -1482,20 +1482,20 @@ ssize_t sq_writer_stack_write (sq_context_t ctx, sq_writer_stack_t writer,
/// buffer will be written. Also, this version automatically catches
/// EINTR.
/*/
-sq_status_t sq_writer_stack_write_all (sq_context_t ctx,
+sq_status_t sq_writer_stack_write_all (sq_error_t *errp,
sq_writer_stack_t writer,
const uint8_t *buf, size_t len);
/*/
/// Finalizes this writer, returning the underlying writer.
/*/
-sq_writer_stack_t sq_writer_stack_finalize_one (sq_context_t ctx,
+sq_writer_stack_t sq_writer_stack_finalize_one (sq_error_t *errp,
sq_writer_stack_t writer);
/*/
/// Finalizes all writers, tearing down the whole stack.
/*/
-sq_status_t sq_writer_stack_finalize (sq_context_t ctx,
+sq_status_t sq_writer_stack_finalize (sq_error_t *errp,
sq_writer_stack_t writer);
/*/
@@ -1505,7 +1505,7 @@ sq_status_t sq_writer_stack_finalize (sq_context_t ctx,
/// The body will be written using partial length encoding, or, if the
/// body is short, using full length encoding.
/*/
-sq_writer_stack_t sq_arbitrary_writer_new (sq_context_t ctx,
+sq_writer_stack_t sq_arbitrary_writer_new (sq_error_t *errp,
sq_writer_stack_t inner,
sq_tag_t tag);
@@ -1516,14 +1516,14 @@ sq_writer_stack_t sq_arbitrary_writer_new (sq_context_t ctx,
/// packet, then hashes and emits the data stream, then for every key
/// writes a signature packet.
/*/
-sq_writer_stack_t sq_signer_new (sq_context_t ctx,
+sq_writer_stack_t sq_signer_new (sq_error_t *errp,
sq_writer_stack_t inner,
sq_tpk_t *signers, size_t signers_len);
/*/
/// Creates a signer for a detached signature.
/*/
-sq_writer_stack_t sq_signer_new_detached (sq_context_t ctx,
+sq_writer_stack_t sq_signer_new_detached (sq_error_t *errp,
sq_writer_stack_t inner,
sq_tpk_t *signers,
size_t signers_len);
@@ -1534,7 +1534,7 @@ sq_writer_stack_t sq_signer_new_detached (sq_context_t ctx,
/// The body will be written using partial length encoding, or, if the
/// body is short, using full length encoding.
/*/
-sq_writer_stack_t sq_literal_writer_new (sq_context_t ctx,<