From f7be7b843b75b4f2e5bba99457a231360bf9e824 Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Thu, 29 May 2025 14:12:54 +0100 Subject: [PATCH] fixed scalarmultKey() calls in Carrot-specific CLSAG code; added new signing function for T terms in CLSAG --- src/device/device.hpp | 1 + src/device/device_default.cpp | 13 ++++++++++++- src/device/device_default.hpp | 2 ++ src/device/device_ledger.cpp | 3 +++ src/device/device_ledger.hpp | 2 +- src/ringct/rctSigs.cpp | 23 +++++++++++++---------- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/device/device.hpp b/src/device/device.hpp index ddf42d3fb..fc90323b7 100644 --- a/src/device/device.hpp +++ b/src/device/device.hpp @@ -237,6 +237,7 @@ namespace hw { virtual bool clsag_sign(const rct::key &c, const rct::key &a, const rct::key &p, const rct::key &z, const rct::key &mu_P, const rct::key &mu_C, rct::key &s) = 0; virtual bool clsag_prepare_carrot(const rct::key &p, const rct::key &z, rct::key &I, rct::key &D, const rct::key &H, rct::key &a, rct::key &aG, rct::key &b, rct::key &bT, rct::key &aH) = 0; + virtual bool clsag_sign_y(const rct::key &c, const rct::key &b, const rct::key &y, const rct::key &mu_P, rct::key &s) = 0; virtual bool close_tx(void) = 0; diff --git a/src/device/device_default.cpp b/src/device/device_default.cpp index 76504d7c3..d13137bff 100644 --- a/src/device/device_default.cpp +++ b/src/device/device_default.cpp @@ -433,7 +433,7 @@ namespace hw { // bT = b*T rct::skGen(b); - bT = rct::scalarmultKey(b, rct::pk2rct(crypto::get_T())); + bT = rct::scalarmultKey(rct::pk2rct(crypto::get_T()), b); return true; } @@ -454,6 +454,17 @@ namespace hw { return true; } + // In device_default.cpp (implementation) + bool device_default::clsag_sign_y(const rct::key &c, const rct::key &b, const rct::key &y, const rct::key &mu_P, rct::key &s) { + rct::key y_mu_P; + sc_mul(y_mu_P.bytes, mu_P.bytes, y.bytes); // y_mu_P = y * mu_P + + // s = b - c * (y * mu_P) + // This is equivalent to: sc_sub(s.bytes, b.bytes, temp.bytes); where temp = c * y_mu_P + sc_mulsub(s.bytes, c.bytes, y_mu_P.bytes, b.bytes); + return true; + } + bool device_default::close_tx() { return true; } diff --git a/src/device/device_default.hpp b/src/device/device_default.hpp index 65393c620..c08ce7ac8 100644 --- a/src/device/device_default.hpp +++ b/src/device/device_default.hpp @@ -141,6 +141,8 @@ namespace hw { bool clsag_sign(const rct::key &c, const rct::key &a, const rct::key &p, const rct::key &z, const rct::key &mu_P, const rct::key &mu_C, rct::key &s) override; bool clsag_prepare_carrot(const rct::key &p, const rct::key &z, rct::key &I, rct::key &D, const rct::key &H, rct::key &a, rct::key &aG, rct::key &b, rct::key &bT, rct::key &aH); + bool clsag_sign_y(const rct::key &c, const rct::key &b, const rct::key &y, const rct::key &mu_P, rct::key &s); + bool close_tx(void) override; }; diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp index c842a09cd..32eafd653 100644 --- a/src/device/device_ledger.cpp +++ b/src/device/device_ledger.cpp @@ -2350,6 +2350,9 @@ namespace hw { return true; } + bool device_ledger::clsag_sign_y(const rct::key &c, const rct::key &b, const rct::key &y, const rct::key &mu_P, rct::key &s) { + return true; + } bool device_ledger::close_tx() { AUTO_LOCK_CMD(); diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp index 521c52881..9fc830115 100644 --- a/src/device/device_ledger.hpp +++ b/src/device/device_ledger.hpp @@ -283,7 +283,7 @@ namespace hw { bool clsag_sign(const rct::key &c, const rct::key &a, const rct::key &p, const rct::key &z, const rct::key &mu_P, const rct::key &mu_C, rct::key &s) override; bool clsag_prepare_carrot(const rct::key &p, const rct::key &z, rct::key &I, rct::key &D, const rct::key &H, rct::key &a, rct::key &aG, rct::key &b, rct::key &bT, rct::key &aH) override; - + bool clsag_sign_y(const rct::key &c, const rct::key &b, const rct::key &y, const rct::key &mu_P, rct::key &s) override; bool close_tx(void) override; diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp index 5375db91d..0b264fbe0 100644 --- a/src/ringct/rctSigs.cpp +++ b/src/ringct/rctSigs.cpp @@ -482,11 +482,12 @@ namespace rct { precomp(C_precomp.k, C[i]); // Compute L - addKeys_aGbBcC(L, sig.sx[i], c_p, P_precomp.k, c_c, C_precomp.k); - // add the T term - key rT = rct::scalarmultKey(b, rct::pk2rct(crypto::get_T())); - L = addKeys(L, rT); - + key xGyT; + addKeys2(xGyT, sig.sx[i], sig.sy[i], rct::pk2rct(crypto::get_T())); + key temp_precomp; + addKeys3(temp_precomp, c_p, P_precomp.k, c_c, C_precomp.k); + L = addKeys(xGyT, temp_precomp); + // Compute R hash_to_p3(Hi_p3,P[i]); ge_dsm_precomp(H_precomp.k, &Hi_p3); @@ -504,7 +505,7 @@ namespace rct { // Compute final scalars hwdev.clsag_sign(c, a, x, z, mu_P, mu_C, sig.sx[l]); - hwdev.clsag_sign(c, b, y, z, mu_P, mu_C, sig.sy[l]); + hwdev.clsag_sign_y(c, b, y, mu_P, sig.sy[l]); memwipe(&a, sizeof(key)); memwipe(&b, sizeof(key)); @@ -1264,6 +1265,7 @@ namespace rct { } c_to_hash[2*n+1] = C_offset; c_to_hash[2*n+2] = message; + key c_p; // = c[i]*mu_P key c_c; // = c[i]*mu_C key c_new; @@ -1291,10 +1293,11 @@ namespace rct { ge_dsm_precomp(C_precomp.k,&temp_p3); // Compute L - addKeys_aGbBcC(L, sig.sx[i], c_p, P_precomp.k, c_c, C_precomp.k); - // add the T term - key rT = rct::scalarmultKey(sig.sy[i], rct::pk2rct(crypto::get_T())); - L = addKeys(L, rT); + key xGyT; + addKeys2(xGyT, sig.sx[i], sig.sy[i], rct::pk2rct(crypto::get_T())); + key temp_precomp; + addKeys3(temp_precomp, c_p, P_precomp.k, c_c, C_precomp.k); + L = addKeys(xGyT, temp_precomp); // Compute R hash_to_p3(hash8_p3,pubs[i].dest);