commit 6f1ce1d85c777ae3930081b5c2f9297482d26927
parent b85c58127a1560acedb12369098b5f1ed31c34af
Author: lash <dev@holbrook.no>
Date: Sat, 5 Apr 2025 05:41:22 +0100
WIP false dup in deserialize, need msg init flag
Diffstat:
3 files changed, 44 insertions(+), 32 deletions(-)
diff --git a/src/lq/cert.c b/src/lq/cert.c
@@ -253,7 +253,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve
r = lq_msg_serialize(msg, buf, &c, resolve);
if (r != ERR_OK) {
return asn_except(&item, r);
- }
+ }
*out_len += c;
if (*out_len > mx) {
return asn_except(&item, ERR_OVERFLOW);
@@ -384,15 +384,19 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve
if (r != ERR_OK) {
return asn_except(&item, r);
}
-
- c = LQ_BLOCKSIZE;
- r = asn1_read_value(item, "request_sig", tmp, &c);
- if (r != ASN1_SUCCESS) {
+ if (!lq_cmp(p->request, &nomsg, sizeof(LQMsg))) {
lq_msg_free(p->request);
- return asn_except(&item, ERR_READ);
- }
- if (c > 0) {
- p->request_sig = lq_signature_from_bytes(tmp, c, NULL);
+ p->request = NULL;
+ } else {
+ c = LQ_BLOCKSIZE;
+ r = asn1_read_value(item, "request_sig", tmp, &c);
+ if (r != ASN1_SUCCESS) {
+ lq_msg_free(p->request);
+ return asn_except(&item, ERR_READ);
+ }
+ if (c > 0) {
+ p->request_sig = lq_signature_from_bytes(tmp, c, NULL);
+ }
}
c = LQ_BLOCKSIZE;
@@ -408,17 +412,21 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve
lq_msg_free(p->request);
return asn_except(&item, r);
}
-
- c = 4096;
- r = asn1_read_value(item, "response_sig", tmp, &c);
- if (r != ASN1_SUCCESS) {
+ if (!lq_cmp(p->response, &nomsg, sizeof(LQMsg))) {
lq_msg_free(p->response);
- lq_signature_free(p->request_sig);
- lq_msg_free(p->request);
- return asn_except(&item, ERR_READ);
- }
- if (c > 0) {
- p->response_sig = lq_signature_from_bytes(tmp, c, NULL);
+ p->response = NULL;
+ } else {
+ c = LQ_BLOCKSIZE;
+ r = asn1_read_value(item, "response_sig", tmp, &c);
+ if (r != ASN1_SUCCESS) {
+ lq_msg_free(p->response);
+ lq_signature_free(p->request_sig);
+ lq_msg_free(p->request);
+ return asn_except(&item, ERR_READ);
+ }
+ if (c > 0) {
+ p->response_sig = lq_signature_from_bytes(tmp, c, NULL);
+ }
}
c = 4096;
@@ -432,7 +440,7 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve
}
p->parent = NULL;
if (c == 1) {
- lq_set(p->parent_hash, 0, LQ_DIGEST_LEN);
+ lq_zero(p->parent_hash, LQ_DIGEST_LEN);
} else {
lq_cpy(p->parent_hash, tmp, LQ_DIGEST_LEN);
}
diff --git a/src/lq/msg.c b/src/lq/msg.c
@@ -151,9 +151,11 @@ int lq_msg_serialize(LQMsg *msg, char *out, size_t *out_len, LQResolve *resolve)
if (*out_len > mx) {
return asn_except(&item, ERR_OVERFLOW);
}
- r = lq_digest(msg->data, msg->len, tmp);
- if (r != ERR_OK) {
- return asn_except(&item, r);
+ if (msg->len > 0) {
+ r = lq_digest(msg->data, msg->len, tmp);
+ if (r != ERR_OK) {
+ return asn_except(&item, r);
+ }
}
resolve_active = resolve;
@@ -168,8 +170,6 @@ int lq_msg_serialize(LQMsg *msg, char *out, size_t *out_len, LQResolve *resolve)
if (resolved & LQ_MSG_DIGESTONLY) {
debug(LLOG_DEBUG, "msg", "no resolver");
- c = msg->len;
- lq_cpy(tmp, msg->data, c);
}
r = asn1_write_value(item, "Msg.data", tmp, c);
@@ -253,6 +253,7 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re
c = LQ_DIGEST_LEN;
r = asn1_read_value(item, "data", z, (int*)&c);
if (r != ASN1_SUCCESS) {
+ debug_logerr(LLOG_WARNING, ERR_READ, asn1_strerror(r));
return asn_except(&item, ERR_READ);
}
c = LQ_BLOCKSIZE;
diff --git a/src/test/test_cert.c b/src/test/test_cert.c
@@ -190,23 +190,27 @@ START_TEST(check_cert_symmetric_ser_rsp_onesig) {
char buf[4096];
pk = lq_privatekey_new(passphrase, 32);
+ ck_assert_ptr_nonnull(pk);
req = lq_msg_new(data, strlen(data) + 1);
+ ck_assert_ptr_nonnull(req);
res = lq_msg_new(data_two, strlen(data_two) + 1);
+ ck_assert_ptr_nonnull(res);
+
cert = lq_certificate_new(NULL);
- lq_privatekey_unlock(pk, passphrase, 32);
+ lq_privatekey_unlock(pk, passphrase, strlen(passphrase));
r = lq_certificate_request(cert, req, pk);
ck_assert_int_eq(r, 0);
- c = 4096;
+ c = LQ_BLOCKSIZE;
r = lq_certificate_serialize(cert, buf, &c, NULL);
ck_assert_int_eq(r, 0);
lq_certificate_free(cert);
- cert = lq_certificate_new(NULL);
r = lq_certificate_deserialize(&cert, buf, c, NULL);
ck_assert_int_eq(r, 0);
r = lq_certificate_respond(cert, res, pk);
ck_assert_int_eq(r, 0);
+
lq_certificate_free(cert);
lq_privatekey_free(pk);
}
@@ -238,12 +242,11 @@ START_TEST(check_cert_symmetric_ser_rsp_bothsig) {
r = lq_certificate_respond(cert, res, NULL);
ck_assert_int_eq(r, 0);
- c = 4096;
+ c = LQ_BLOCKSIZE;
r = lq_certificate_serialize(cert, buf, &c, NULL);
ck_assert_int_eq(r, 0);
lq_certificate_free(cert);
- cert = lq_certificate_new(NULL);
r = lq_certificate_deserialize(&cert, buf, c, NULL);
ck_assert_int_eq(r, 0);
lq_certificate_free(cert);
@@ -263,8 +266,8 @@ Suite * common_suite(void) {
tc = tcase_create("serialize");
// tcase_add_test(tc, check_cert_symmetric_ser_nomsg);
// tcase_add_test(tc, check_cert_symmetric_ser_req_nosig);
- tcase_add_test(tc, check_cert_symmetric_ser_req_sig);
-// tcase_add_test(tc, check_cert_symmetric_ser_rsp_onesig);
+// tcase_add_test(tc, check_cert_symmetric_ser_req_sig);
+ tcase_add_test(tc, check_cert_symmetric_ser_rsp_onesig);
// tcase_add_test(tc, check_cert_symmetric_ser_rsp_bothsig);
suite_add_tcase(s, tc);