commit 1ee10d6c9a296ad04180519874704bcb15e942ec
parent cd9d4c42e80622b8a15b28bef31055b3779e2e51
Author: lash <dev@holbrook.no>
Date: Sat, 19 Apr 2025 16:05:25 +0100
Add envelope deserialize
Diffstat:
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