libqaeda

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | README | LICENSE

commit 1ee10d6c9a296ad04180519874704bcb15e942ec
parent cd9d4c42e80622b8a15b28bef31055b3779e2e51
Author: lash <dev@holbrook.no>
Date:   Sat, 19 Apr 2025 16:05:25 +0100

Add envelope deserialize

Diffstat:
Msrc/lq/envelope.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/lq/envelope.h | 2+-
Msrc/test/test_envelope.c | 6+++++-
3 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/src/lq/envelope.c b/src/lq/envelope.c @@ -85,13 +85,13 @@ static int asn_except(asn1_node *node, int err) { r = asn1_delete_structure(node); if (r != ASN1_SUCCESS) { - debug_logerr(LLOG_ERROR, ERR_FAIL, asn1_strerror(err)); + debug_logerr(LLOG_ERROR, ERR_FAIL, (char*)asn1_strerror(err)); } return err; } -int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, const char *out, size_t *out_len) { +int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, char *out, size_t *out_len) { size_t c; int mx; int r; @@ -157,6 +157,68 @@ int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, const char *out, } } +int lq_envelope_deserialize(LQEnvelope **env, LQResolve *resolve, const char *in, size_t in_len) { + int c; + int r; + int i; + char err[LQ_ERRSIZE]; + char tmp[LQ_BLOCKSIZE]; + char node_seq_name[16]; + int hint; + LQCert *cert; + asn1_node item; + + r = asn1_create_element(asn, "Qaeda.Envelope", &item); + if (r != ASN1_SUCCESS) { + return ERR_READ; + } + + r = asn1_der_decoding(&item, in, in_len, err); + if (r != ASN1_SUCCESS) { + return asn_except(&item, ERR_ENCODING); + } + + c = sizeof(int); + r = asn1_read_value(item, "hint", &hint, &c); + if (r != ASN1_SUCCESS) { + return asn_except(&item, ERR_READ); + } + + c = LQ_BLOCKSIZE; + r = asn1_read_value(item, "cert", tmp, &c); + if (r != ASN1_SUCCESS) { + return asn_except(&item, ERR_READ); + } + r = lq_certificate_deserialize(&cert, resolve, tmp, c); + if (r != ERR_OK) { + return asn_except(&item, r); + } + + *env = lq_envelope_new(cert, hint); + + i = 0; + while(++i) { + c = LQ_BLOCKSIZE; + sprintf(node_seq_name, "attach.?%d", i); + r = asn1_read_value(item, node_seq_name, tmp, &c); + if (r != ASN1_SUCCESS) { + break; + } + r = lq_envelope_attach(*env, tmp, c); + if (r != ERR_OK) { + lq_envelope_free(*env); + return ERR_FAIL; + } + } + + r = asn1_delete_structure(&item); + if (r != ASN1_SUCCESS) { + return ERR_FAIL; + } + + return ERR_OK; +} + void lq_envelope_free(LQEnvelope *env) { lq_attach_free(env->attach_start); lq_certificate_free(env->cert); diff --git a/src/lq/envelope.h b/src/lq/envelope.h @@ -32,7 +32,7 @@ LQEnvelope *lq_envelope_new(LQCert *cert, int hint); * \return ERR_OK on success. */ int lq_envelope_attach(LQEnvelope *env, const char *data, size_t data_len); -int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, const char *data, size_t *data_len); +int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, char *data, size_t *data_len); int lq_envelope_deserialize(LQEnvelope **env, LQResolve *resolve, const char *data, size_t data_len); void lq_envelope_free(LQEnvelope *env); diff --git a/src/test/test_envelope.c b/src/test/test_envelope.c @@ -33,7 +33,7 @@ START_TEST(check_envelope) { r = lq_certificate_serialize(cert, NULL, buf, &c); ck_assert_int_eq(r, 0); - env = lq_envelope_new(cert, 0); + env = lq_envelope_new(cert, 42); ck_assert_ptr_nonnull(env); r = lq_envelope_attach(env, data, strlen(data) + 1); ck_assert_int_eq(r, 0); @@ -43,7 +43,11 @@ START_TEST(check_envelope) { c = sizeof(buf); r = lq_envelope_serialize(env, NULL, buf, &c); ck_assert_int_eq(r, 0); + lq_envelope_free(env); + r = lq_envelope_deserialize(&env, NULL, buf, c); + ck_assert_int_eq(r, 0); + ck_assert_int_eq(env->hint, 42); lq_envelope_free(env); } END_TEST