libqaeda

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

commit b85c58127a1560acedb12369098b5f1ed31c34af
parent 9a590888fa48b9c17a156126c4de493cedff6b76
Author: lash <dev@holbrook.no>
Date:   Sat,  5 Apr 2025 04:09:47 +0100

WIP Resolved crashes, publickey in serialize still missing

Diffstat:
Msrc/crypto/gcrypt.c | 10++++++----
Msrc/lq/base.c | 14+++++++-------
Msrc/lq/cert.c | 35+++++++++++++++++++++++------------
Msrc/lq/err.c | 3++-
Msrc/lq/msg.c | 26+++++++++++++++-----------
Msrc/test/test_cert.c | 18+++++++++---------
6 files changed, 62 insertions(+), 44 deletions(-)

diff --git a/src/crypto/gcrypt.c b/src/crypto/gcrypt.c @@ -970,7 +970,7 @@ LQSig* lq_signature_from_bytes(const char *sig_data, size_t sig_len, LQPubKey *p sig = lq_alloc(sizeof(LQSig)); lq_zero(sig, sizeof(LQSig)); - sig->impl = lq_alloc(sizeof(LQ_SIGN_LEN)); + sig->impl = lq_alloc(LQ_SIGN_LEN); lq_cpy(sig->impl, sig_data, LQ_SIGN_LEN); return sig; } @@ -1125,10 +1125,13 @@ LQPubKey* lq_publickey_new(const char *full) { LQPubKey *pubk; struct gpg_store *gpg; - pubk = lq_alloc(sizeof(LQPubKey)); gpg = lq_alloc(sizeof(struct gpg_store)); - lq_zero(gpg, sizeof(struct gpg_store)); + lq_cpy(gpg->public_key, full, LQ_PUBKEY_LEN); + + pubk = lq_alloc(sizeof(LQPubKey)); + lq_zero(pubk, sizeof(LQPubKey)); + c = 0; e = gcry_sexp_build(&gpg->k, &c, "(key-data(public-key(ecc(curve Ed25519)(q %b))))", LQ_PUBKEY_LEN, full); if (e != GPG_ERR_NO_ERROR) { @@ -1136,7 +1139,6 @@ LQPubKey* lq_publickey_new(const char *full) { debug_logerr(LLOG_DEBUG, ERR_KEYFAIL, (char*)p); return NULL; } - lq_cpy(gpg->public_key, full, LQ_PUBKEY_LEN); r = (char*)gcry_pk_get_keygrip(gpg->k, (unsigned char*)gpg->fingerprint); if (r == NULL) { diff --git a/src/lq/base.c b/src/lq/base.c @@ -24,12 +24,12 @@ int lq_init() { } void lq_finish() { - int r; - - r = asn1_delete_structure(&asn); - if (r != ASN1_SUCCESS) { - debug_logerr(LLOG_ERROR, ERR_UNCLEAN, "asn exit"); - } - +// int r; +// +// r = asn1_delete_structure(&asn); +// if (r != ASN1_SUCCESS) { +// debug_logerr(LLOG_ERROR, ERR_UNCLEAN, "asn exit"); +// } +// lq_config_free(); } diff --git a/src/lq/cert.c b/src/lq/cert.c @@ -208,7 +208,7 @@ static int asn_except(asn1_node *node, int err) { r = asn1_delete_structure(node); if (r != ASN1_SUCCESS) { - debug_logerr(LLOG_ERROR, ERR_FAIL, "free asn"); + debug_logerr(LLOG_ERROR, ERR_FAIL, "free cert asn"); } return err; @@ -229,7 +229,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve *out_len = 0; lq_zero(&item, sizeof(item)); - r = asn1_create_element(asn, "Qaeda.Cert", &item); + r = asn1_create_element(asn, "Qaeda", &item); if (r != ASN1_SUCCESS) { return ERR_READ; } @@ -239,7 +239,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve if (*out_len > mx) { return asn_except(&item, ERR_OVERFLOW); } - r = asn1_write_value(item, "domain", cert->domain, c); + r = asn1_write_value(item, "Cert.domain", cert->domain, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -258,7 +258,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve if (*out_len > mx) { return asn_except(&item, ERR_OVERFLOW); } - r = asn1_write_value(item, "request", buf, c); + r = asn1_write_value(item, "Cert.request", buf, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -274,7 +274,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve if (*out_len > mx) { return asn_except(&item, ERR_OVERFLOW); } - r = asn1_write_value(item, "request_sig", sigdata, c); + r = asn1_write_value(item, "Cert.request_sig", sigdata, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -292,7 +292,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve if (*out_len > mx) { return asn_except(&item, ERR_OVERFLOW); } - r = asn1_write_value(item, "response", buf, c); + r = asn1_write_value(item, "Cert.response", buf, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -308,14 +308,14 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve if (*out_len > mx) { return asn_except(&item, ERR_OVERFLOW); } - r = asn1_write_value(item, "response_sig", sigdata, c); + r = asn1_write_value(item, "Cert.response_sig", sigdata, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } if (cert->parent == NULL) { c = 0; - r = asn1_write_value(item, "parent", &c, 1); + r = asn1_write_value(item, "Cert.parent", &c, 1); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -325,7 +325,7 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve return asn_except(&item, r); } c = LQ_DIGEST_LEN; - r = asn1_write_value(item, "parent", cert->parent_hash, c); + r = asn1_write_value(item, "Cert.parent", cert->parent_hash, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -371,7 +371,8 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve return asn_except(&item, ERR_READ); } - p = lq_certificate_new(NULL); + *cert = lq_certificate_new(NULL); + p = *cert; lq_certificate_set_domain(p, tmp); c = LQ_BLOCKSIZE; @@ -387,6 +388,7 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve 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) { @@ -396,16 +398,23 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve c = LQ_BLOCKSIZE; r = asn1_read_value(item, "response", tmp, &c); if (r != ASN1_SUCCESS) { + lq_signature_free(p->request_sig); + lq_msg_free(p->request); return asn_except(&item, ERR_READ); } r = lq_msg_deserialize(&p->response, tmp, c, resolve); if (r != ERR_OK) { + lq_signature_free(p->request_sig); + 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) { + 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) { @@ -415,6 +424,10 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve c = 4096; r = asn1_read_value(item, "parent", tmp, &c); if (r != ASN1_SUCCESS) { + lq_signature_free(p->response_sig); + lq_msg_free(p->response); + lq_signature_free(p->request_sig); + lq_msg_free(p->request); return asn_except(&item, ERR_READ); } p->parent = NULL; @@ -425,8 +438,6 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve } // \todo render parent if set - *cert = p; - r = asn1_delete_structure(&item); if (r != ASN1_SUCCESS) { return ERR_FAIL; diff --git a/src/lq/err.c b/src/lq/err.c @@ -4,11 +4,12 @@ #ifdef RERR -static char *_rerr[4] = { +static char *_rerr[5] = { "", "Invalid request", "Invalid response", "Not resolved", + "Unclean exit", }; static char *_rerr_crypto[12] = { diff --git a/src/lq/msg.c b/src/lq/msg.c @@ -117,7 +117,7 @@ static int asn_except(asn1_node *node, int err) { r = asn1_delete_structure(node); if (r != ASN1_SUCCESS) { - debug_logerr(LLOG_ERROR, ERR_FAIL, "free asn"); + debug_logerr(LLOG_ERROR, ERR_FAIL, "free msg asn"); } return err; @@ -141,7 +141,7 @@ int lq_msg_serialize(LQMsg *msg, char *out, size_t *out_len, LQResolve *resolve) *out_len = 0; lq_set(&item, 0, sizeof(item)); - r = asn1_create_element(asn, "Qaeda.Msg", &item); + r = asn1_create_element(asn, "Qaeda", &item); if (r != ASN1_SUCCESS) { return ERR_READ; } @@ -168,9 +168,11 @@ 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, "data", tmp, c); + r = asn1_write_value(item, "Msg.data", tmp, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -191,7 +193,7 @@ 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 = asn1_write_value(item, "timestamp", &timedata, c); + r = asn1_write_value(item, "Msg.timestamp", &timedata, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } @@ -205,14 +207,15 @@ 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 = asn1_write_value(item, "pubkey", keydata, c); + r = asn1_write_value(item, "Msg.pubkey", keydata, c); if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_WRITE); } *out_len = mx; - r = asn1_der_coding(item, "Qaeda.Msg", out, (int*)out_len, err); + r = asn1_der_coding(item, "Msg", out, (int*)out_len, err); if (r != ASN1_SUCCESS) { + debug_logerr(LLOG_WARNING, ERR_ENCODING, asn1_strerror(r)); return asn_except(&item, ERR_ENCODING); } @@ -298,16 +301,17 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re if (r != ASN1_SUCCESS) { return asn_except(&item, ERR_READ); } - (*msg)->pubkey = lq_publickey_new(tmp); - r = asn1_delete_structure(&item); - if (r != ASN1_SUCCESS) { - debug(LLOG_WARNING, "cert", "delete msg asn item"); + (*msg)->pubkey = lq_publickey_new(tmp); + if ((*msg)->pubkey == NULL) { + return asn_except(&item, ERR_NOKEY); } + r = asn1_delete_structure(&item); if (r != ASN1_SUCCESS) { + debug(LLOG_WARNING, "msg", "delete msg asn item"); return ERR_FAIL; - }; + } return ERR_OK; } diff --git a/src/test/test_cert.c b/src/test/test_cert.c @@ -153,9 +153,10 @@ START_TEST(check_cert_symmetric_ser_req_sig) { LQPrivKey *pk; char buf[4096]; - pk = lq_privatekey_new(passphrase, 32); + pk = lq_privatekey_new(passphrase, sizeof(passphrase)); ck_assert_ptr_nonnull(pk); - r = lq_privatekey_unlock(pk, passphrase, 32); + + r = lq_privatekey_unlock(pk, passphrase, sizeof(passphrase)); ck_assert_int_eq(r, 0); req = lq_msg_new(data, strlen(data) + 1); @@ -171,10 +172,9 @@ START_TEST(check_cert_symmetric_ser_req_sig) { ck_assert_int_eq(r, 0); lq_certificate_free(cert); - cert = lq_certificate_new(NULL); - ck_assert_ptr_nonnull(cert); r = lq_certificate_deserialize(&cert, buf, c, NULL); ck_assert_int_eq(r, 0); + lq_certificate_free(cert); lq_privatekey_free(pk); } @@ -222,21 +222,21 @@ START_TEST(check_cert_symmetric_ser_rsp_bothsig) { char buf[4096]; pk = lq_privatekey_new(passphrase, 32); - req = lq_msg_new(data, strlen(data) + 1); - ck_assert_ptr_nonnull(req); + ck_assert_ptr_nonnull(pk); cert = lq_certificate_new(NULL); ck_assert_ptr_nonnull(cert); + + req = lq_msg_new(data, strlen(data) + 1); + ck_assert_ptr_nonnull(req); + lq_privatekey_unlock(pk, passphrase, 32); r = lq_certificate_request(cert, req, NULL); - r = lq_certificate_sign(cert, pk); ck_assert_int_eq(r, 0); res = lq_msg_new(data_two, strlen(data_two) + 1); ck_assert_ptr_nonnull(res); r = lq_certificate_respond(cert, res, NULL); ck_assert_int_eq(r, 0); - r = lq_certificate_sign(cert, pk); - ck_assert_int_eq(r, 0); c = 4096; r = lq_certificate_serialize(cert, buf, &c, NULL);