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:
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);