libqaeda

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

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:
Msrc/lq/cert.c | 48++++++++++++++++++++++++++++--------------------
Msrc/lq/msg.c | 11++++++-----
Msrc/test/test_cert.c | 17++++++++++-------
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);