commit 94a3550c9a194cfc21191655e0d20a9e49b7dacf
parent 5e31f314003bf2e09ee9915a0e34ffe55141efff
Author: lash <dev@holbrook.no>
Date: Thu, 8 May 2025 20:24:34 +0100
Add verify to example, fix missing pubkey in signature
Diffstat:
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/crypto/gcrypt.c b/src/crypto/gcrypt.c
@@ -983,6 +983,11 @@ LQSig* lq_signature_from_bytes(const char *sig_data, size_t sig_len, LQPubKey *p
lq_zero(sig, sizeof(LQSig));
sig->impl = lq_alloc(LQ_SIGN_LEN);
lq_cpy(sig->impl, sig_data, LQ_SIGN_LEN);
+
+ if (pubkey != NULL) {
+ sig->pubkey = lq_alloc(sizeof(LQPubKey));
+ lq_cpy(sig->pubkey, pubkey, sizeof(LQPubKey));
+ }
return sig;
}
diff --git a/src/example/verify.c b/src/example/verify.c
@@ -42,8 +42,19 @@ int main(int argc, char **argv) {
r = lq_certificate_deserialize(&cert, NULL, b, c);
if (r) {
debug_logerr(LLOG_ERROR, r, "deserialize err");
+ lq_finish();
+ return 1;
+ }
+
+ r = lq_certificate_verify(cert);
+ if (r) {
+ debug_logerr(LLOG_ERROR, r, "verify err");
+ lq_certificate_free(cert);
+ lq_finish();
+ return 1;
}
+ lq_certificate_free(cert);
lq_finish();
return r;
}
diff --git a/src/lq/cert.c b/src/lq/cert.c
@@ -346,6 +346,10 @@ int lq_certificate_serialize(LQCert *cert, LQResolve *resolve, char *out, size_t
return ERR_OK;
}
+/**
+ * \todo pubkey is copied to signature from message, to prevent a double-free. Wastes up to 2x sig bytes.
+ *
+ */
int lq_certificate_deserialize(LQCert **cert, LQResolve *resolve, char *in, size_t in_len) {
int r;
int c;
@@ -393,7 +397,7 @@ int lq_certificate_deserialize(LQCert **cert, LQResolve *resolve, char *in, size
return asn_except(&item, ERR_READ);
}
if (c > 0) {
- p->request_sig = lq_signature_from_bytes(tmp, c, NULL);
+ p->request_sig = lq_signature_from_bytes(tmp, c, p->request->pubkey);
}
}
@@ -420,7 +424,7 @@ int lq_certificate_deserialize(LQCert **cert, LQResolve *resolve, char *in, size
return asn_except(&item, ERR_READ);
}
if (c > 0) {
- p->response_sig = lq_signature_from_bytes(tmp, c, NULL);
+ p->response_sig = lq_signature_from_bytes(tmp, c, p->response->pubkey);
}
}