From 303013a518ac564997707efde79bfb30f428e789 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Fri, 20 Mar 2026 15:30:09 -0400 Subject: [PATCH] Fix Cashu hash_to_curve to NUT-00 spec and align live helper for send-proof compatibility --- VERSION | 2 +- nostr_core/cashu_mint.c | 18 +++++++----------- nostr_core/nostr_core.h | 4 ++-- tests/nip60_live_receive_test | Bin 206664 -> 206664 bytes tests/nip60_live_receive_test.c | 19 +++++++------------ 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/VERSION b/VERSION index 659914ae..416bfb0a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.8 +0.5.9 diff --git a/nostr_core/cashu_mint.c b/nostr_core/cashu_mint.c index 3f0bd372..d37a1c4f 100644 --- a/nostr_core/cashu_mint.c +++ b/nostr_core/cashu_mint.c @@ -1797,14 +1797,15 @@ static int cashu_hash_to_curve_pubkey(const char* secret, nostr_secp256k1_pubkey } unsigned char candidate[33] = {0}; - for (int counter = 0; counter < 1024; counter++) { + for (int counter = 0; counter < 65536; counter++) { unsigned char h[32] = {0}; - unsigned char data[36] = {0}; - memcpy(data, digest, 32); - data[32] = (unsigned char)((counter >> 24) & 0xff); - data[33] = (unsigned char)((counter >> 16) & 0xff); + unsigned char data[37] = {0}; + data[0] = 0x02; + memcpy(data + 1, digest, 32); + data[33] = (unsigned char)(counter & 0xff); data[34] = (unsigned char)((counter >> 8) & 0xff); - data[35] = (unsigned char)(counter & 0xff); + data[35] = (unsigned char)((counter >> 16) & 0xff); + data[36] = (unsigned char)((counter >> 24) & 0xff); if (nostr_sha256(data, sizeof(data), h) != 0) { return NOSTR_ERROR_CRYPTO_FAILED; } @@ -1814,11 +1815,6 @@ static int cashu_hash_to_curve_pubkey(const char* secret, nostr_secp256k1_pubkey if (nostr_secp256k1_ec_pubkey_parse(out_y, candidate, sizeof(candidate))) { return NOSTR_SUCCESS; } - - candidate[0] = 0x03; - if (nostr_secp256k1_ec_pubkey_parse(out_y, candidate, sizeof(candidate))) { - return NOSTR_SUCCESS; - } } return NOSTR_ERROR_CRYPTO_FAILED; diff --git a/nostr_core/nostr_core.h b/nostr_core/nostr_core.h index a6d6c5ed..91d42793 100644 --- a/nostr_core/nostr_core.h +++ b/nostr_core/nostr_core.h @@ -2,10 +2,10 @@ #define NOSTR_CORE_H // Version information (auto-updated by increment_and_push.sh) -#define VERSION "v0.5.8" +#define VERSION "v0.5.9" #define VERSION_MAJOR 0 #define VERSION_MINOR 5 -#define VERSION_PATCH 8 +#define VERSION_PATCH 9 /* * NOSTR Core Library - Complete API Reference diff --git a/tests/nip60_live_receive_test b/tests/nip60_live_receive_test index 4a7e5800fe3a79f22ee0d72677e1b72a66f770bc..c539e6948f99438612bd169cf49796e46abe9156 100755 GIT binary patch delta 31181 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 F{vU`zh>!pP delta 31202 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%0AU&!xRGObDZ^va0lnRtqYW z+FLwEX>A;fbt4=USZ2UG8h)~>340kGpU_*w57Y6ZbiARXhIec}X6X1U{WQE|ueM0X zdvsUvt=0HuS!*4HNUecm-?vrAZzpj_YTvqziqKz2*?-POsmQ z`bh!t^ywXSeq4YU-%|cl7yRz1|6(^s9Y`mzYRlIbc-37Mp^C23rSx>!n?ErvXcF&?=TR1Ax*;D3R^zquMP zSamMsJ#hJY4AAh782MHwm(u%ajbJ;i0dW`1VS40l(KYr&E7llCp?9VJzNNAz>#9!P zsgt+RdTw2ycgrzke1PHBrF4kNh6t_o$9n6(b#e^dgYbr7dLZ!f#J|ocaBGjTH1sbx zrGS?ICAAL?(7XGk#%0*5vt9Afq&rrZTpgcFSO0?YT>iofKmN~X@vlfH7m#NOd>KPQ zCDLoYrCM+q9NU@2?vDPyUjk<((`hjKhIG|reWQso{Hb%TBm7rlI2rhsVq9YMNoCf# zB5~B={)EwZkTHeVgBe+zJ}t#IBbV->>Ko8S6YZFZ1$v`g3cM#Z2o2E(;458bZ5)>htSk}YE*6k@XfuhaqZE7VVTYa7eP2ywqo8uAdra%t*A7S>A>#(OpX z37mMCtCaSF%eOR4BY&Y$4NY}&2wi0%Vf2KBggn)_(siz6ohyOD|AzSqG>1U}z5h2R zbqrE3|8Q-l{$9W_NFAF2_`(hGi#+s5747>7q7Coroz;LLS?5ls@!)E>r?!UQpbI4-gV97WWA^T)UNIl9nE$FJi*Sj5la zRI`rHrSQk-(mLIZUus;2Svon4<}kUSn}%2KQXplmP7a~>nVkEQMov*x7!2R&@ z@-m%l=t75|NbMw#4s;(7AshG<#%=$XBMWu*0vZA`qHXF^jEaZ8mLrX;zy5gL!|o2F zy&!i8h}D$c(8;TGa@@bVMmpZ`D%E`k8`e?yGjn2}wG^aUCj??p_!~1n{ zx@G0?{xi%3Dq??{1>^ieyj)rff>)5U1*Oh9BG1y!2FJH&U(D-sS zDi@VY?Hd~Ke`VlbsQRzL&=BWJwg11-;c|2Ys|mP$L-Z&crn4pMY;pKtkvno)lM;Zv z7yrK0$uTtKIh-7zFQ&Zv<)16^F)JyhEle(WQNy>orn{k;PHu^d8f_#_YdQ*9M@W_? zWVy~|(YdgmD-cqk@5wsrBG;I2J`utnaMq3LOHuM$93N+@7u~ zQcK@3eI4Ga%Uq~)@7WaS(jY1>Ut`u2li@?18t||1{L0Zv_rh#POz8O1P0L-d4c@fH zrN1cMbQR@wo1VC|_g$wiaY4HFIk<#lTlY}7a6y1(%@HnTf#NJpZRXOxrpZMMO&p~@ KXy)>f%l`tGiIzhE diff --git a/tests/nip60_live_receive_test.c b/tests/nip60_live_receive_test.c index d21e0f7d..418257f7 100644 --- a/tests/nip60_live_receive_test.c +++ b/tests/nip60_live_receive_test.c @@ -36,14 +36,15 @@ static int secret_to_Y_hex(const char* secret, char out_Y_hex[67]) { } unsigned char candidate[33] = {0}; - for (int counter = 0; counter < 1024; counter++) { + for (int counter = 0; counter < 65536; counter++) { unsigned char h[32] = {0}; - unsigned char data[36] = {0}; - memcpy(data, digest, 32); - data[32] = (unsigned char)((counter >> 24) & 0xff); - data[33] = (unsigned char)((counter >> 16) & 0xff); + unsigned char data[37] = {0}; + data[0] = 0x02; + memcpy(data + 1, digest, 32); + data[33] = (unsigned char)(counter & 0xff); data[34] = (unsigned char)((counter >> 8) & 0xff); - data[35] = (unsigned char)(counter & 0xff); + data[35] = (unsigned char)((counter >> 16) & 0xff); + data[36] = (unsigned char)((counter >> 24) & 0xff); if (nostr_sha256(data, sizeof(data), h) != 0) { return NOSTR_ERROR_CRYPTO_FAILED; @@ -57,12 +58,6 @@ static int secret_to_Y_hex(const char* secret, char out_Y_hex[67]) { nostr_bytes_to_hex(candidate, sizeof(candidate), out_Y_hex); return NOSTR_SUCCESS; } - - candidate[0] = 0x03; - if (nostr_secp256k1_ec_pubkey_parse(&pub, candidate, sizeof(candidate))) { - nostr_bytes_to_hex(candidate, sizeof(candidate), out_Y_hex); - return NOSTR_SUCCESS; - } } return NOSTR_ERROR_CRYPTO_FAILED;