From 23c037e02ee25007bc7275843e3ba744f43e3ed5 Mon Sep 17 00:00:00 2001 From: divo <418@cryspace.space> Date: Sat, 4 Oct 2025 13:28:24 -0400 Subject: [PATCH] added keys.h, sleep_crypto.h; worked sleep.h, sleep_tree.c, sleep_crypto.c --- .dat/content.bitfield | Bin 3616 -> 3616 bytes .dat/content.signatures | Bin 7648 -> 8224 bytes .dat/content.tree | Bin 9512 -> 10232 bytes .dat/metadata.bitfield | Bin 3616 -> 3616 bytes .dat/metadata.data | Bin 3901 -> 4538 bytes .dat/metadata.signatures | Bin 4384 -> 4960 bytes .dat/metadata.tree | Bin 5432 -> 6152 bytes inc/keys.h | 17 +++++++++++ inc/sleep.h | 1 + inc/sleep_crypto.h | 22 ++++++++++++++ src/sleep_crypto.c | 26 +++++++++++++++++ src/sleep_tree.c | 61 ++++++++++++++++++++++++++++++++++++++- 12 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 inc/sleep_crypto.h diff --git a/.dat/content.bitfield b/.dat/content.bitfield index 660fda41c0b35a44875b86a9f397920c2a774011..1a07e8ebde06c3da9aad29f064af224e032041c1 100644 GIT binary patch delta 53 wcmZ1=vp{BoF7t=n`I{YCJ}^&KVBr`1j|Tp2c4WEFK3SfJoiTK?I?qo=01Mw7z5oCK delta 50 zcmZ1=vp{BoF4LE~&5kS|nI|i-@bmxs4*?+h-@g}|9a-+PPnPB3WDMD?&hwKI0HDko A82|tP diff --git a/.dat/content.signatures b/.dat/content.signatures index 240e30cd70f6687d133fef02e43908d41b47661f..59e73787faedc2c906e9d22d3109927abbdba8b6 100644 GIT binary patch delta 588 zcmV-S0<-<#JD@D1Hh3c> zpUhTa{$KYgP2^C-z-cF8t38q6ba=w)7DNX<*c^;<1lWMIwI;8b>TkSW#4e$|;j1ZE zax5$qikI#DZk5Y(4fdH30D?1|(k-Cc^e%xY^P6_Kz1MujuON^mHf?Ca~GF07IGzSK31kfVyB2h{prM35{6C!V+?<> z#;0eUM+Hquj}idJ12E2R$2(hQOcvN(DqAk+tpkR!z%dffkkMk5H&ar3n z-ZNoX)GS2L=LHYNUYp)1QbMh@_BBt6n}8%9^4OEesBPp#OzLOY3^lg_rUh aR3b2Wzp8(tQXhhl|BusQY*{&6Eq?^W?;7I( delta 7 OcmZ4B@W6V*16cqMAOooY diff --git a/.dat/content.tree b/.dat/content.tree index c5e88532d14680627e1890cd076145e787a56323..e21a90ae9c55f480deb4cac0b271bee2be246b43 100644 GIT binary patch delta 960 zcmZ4C^}~O|4`Gcc%X9iXJ<0azfi5j!Q6hR=M}GGhkZ3?ShB$z!vE z$PG>nw&}ZN$ zTX$T15beS-Q#4plPYR-#^ZX=Lje2bzs~n$Ivp>K0X5Y>H>&=>sl*@T4vYNbi^4z+M z5?fOsYFW){J15`mJzu^_V2*9kk{4mu3%$QgWVV~KLU8ufW!b9>t03waRe4pmRr{HG z6lTw7`rhzgv${R*WP?)&m#)yR`H>gSd^iD7=k50*Rj}Wu?__=AYem)g8-O^sFn2ZV0?8zk4ic$#%sI!rhJv>6|(P zQ76#2es$cA!dIKt+uzEr4spBlSny!nP1f0VyBq$->a?@Wmxie0n4Q|M`%pz~HB)n` zK~>`0dU=^#{j!IQml7VT?U9|$diVWqh(dAM#Nf8uCZ(Ly^pyf`PY<2){zc#kH{G4v zqGxZIdpyS@%Ne4MHQ_-^r5#VmgX)yvJ6lt(UJpFubA404=t1%Oyq4!K@yQlL)UnO+ zve8yCPc?sj%3ku%ou$t6r4RjI(^qeCNm*8LdVt{mQ@Rj^j5c%UMXa0>{-8}kS!?I{ zdzU9K)_Q5)KXYSefo9mD&6j*%Le!af+$n0DBJ#6-P3tD<_u=O^?yt3C*nDh5tB^<3 zyhWx{m(75v<2d?CrsaIhhNzCSZ$z1%3EC~&c!u47%T$J7NlmvS^>*K_ZbKCE{4rEs z9l0#3VZRt(%wE0#4^N}b5^HZ4#)Pal7vEBKxnvDQ9gF#r4-b-0)iJ#A*4nuGf0IV_ z-YQvzy^B(uT|KuY9G>ji4N)hnee1!8hj;kTtlN11nP`kc-9NK~?=L+I+5ELD#$<9u z%<(t|28K`u1_q`JH~+u=IcffE7FXtNyKLMAHD7aUOzzly-LmNQ)3 o?!0E(=O4X&&U%)PygRF8*+b_#tdpqu#r5d+oS805A?kSJ0k#5z9{>OV delta 234 ucmez2zrt(74`B@kBEe<_ksF*OsFu6ILV{{#2}Yt-Pfk#&AX@PxRSf{_p$pFd diff --git a/.dat/metadata.bitfield b/.dat/metadata.bitfield index 2607b2770d0c06699571c532679814beb3b958c7..67a52f9eae94627ffd18ede1e591328b2a2f685e 100644 GIT binary patch delta 39 xcmV+?0NDSa9H1PKC<6cZvoQqr1Ct;G5Cs4J{(!SF1ndWsAPfWn(6c2B`vFFU51;@5 delta 38 ucmZ1=vp{Bo2IGg#jx67qCo8ZBF#g-@$a0^3qJzL>1s)bghs~-yzZn4rD-3-A diff --git a/.dat/metadata.data b/.dat/metadata.data index 0fb2e11b42a335b2f8819b857ab24795b07113a5..38ea15db681257b48073f92acfc209a05e3a0165 100644 GIT binary patch delta 650 zcmaixyGz4R6vlH-sDv1(jkQV!DY|580xowEuArcx4(jd@0v4r~wqWZkK1TfqRJvIN z1*4PTW2=LUxT=GXq2S;oiUkKrPSh3!r{8pb_xrwk)_&Z1&>ePU$ru-)iGS3f~(1W8m|8p41e$c@HGUr+B)Um};!)m&G?I+%I3 z^s$fpg{}$T*CK!*D@HP9IYxHMw$q7;n)|JY4rYN>)?DO=Z~p59EfTygB81|ofGEfj zBb%{EGM>xWcEYML-OD0dV9>V zhaDIB>Gk@`R#!jaE0KzTp$-MaXwd7ATIXJ^c~;zYkylAly>>j=FH202oBbsIIOA5P zkj_olB|4IHFc;Y4iHp2+<0m3$YS0V;8@xm@@MJ$D1+ri!$N%rEkPhY|+bFxp%VZ;b e?}QMdnGmIaM!(Z^Fdg=E;Ua$~8R0J(D#9m?(6+?@ delta 7 Ocmdm`yjO06Ek6JZu>!RK diff --git a/.dat/metadata.signatures b/.dat/metadata.signatures index 23c3094b9ab9c176593d756b0db187c43257aae5..11584c9a9f8040c41b8e12caac2cdbb9b45ec4ac 100644 GIT binary patch delta 588 zcmV-S0<-;~BH$*lAQ6B6@6kePZ5+udsBYX{bgu5k2n?&~{SsFIHJ4aR2TI3%n@Ll) z|HIz1kaN0c{&d-K1d?zE2>k}+jLkO-)aU~Fl1CZLzZarI{rs+@iZqGVi|f=fi+#QX z66yt$0WL4jd^_AYL5?ZUIV%?QSBj!)AR2@6;(edFu*nLhR4RW6%iX`BiSrcZ&bQT! zxj9K^({{sjSP)7*S{T>%yQ>-6y(5E}o%!drSN`^k2p~|Mlh+eK4)^&k|8K9874vaPnnu3L@sE8QMyd}0N z`0t*e%=IGY0N#K21tc9nPn^lu@d#_F7?z64^H>>{ma+6Kfq17nqf)6hh!;p=nXiqX z0ko@XDrV6x4rBVsPwMPzd=&es!YC7PO^9}a_?)9yFQ|So()mPBEYvY`f|eY?ldSdQc{01xCE?ip>C*`xkcE*arBGA zL~kT|SR}XYD z?X*Mf>L&wExk;3-!9`7nZCfh0pfuI5>RWc7M~^$^ugV?Xf^E1Mr$wPJ6`B+Zm$V3; z!FyLOb~Z#w&AkN;w9GT>vE7Y63H%aFZO--iX`Z{Or6M$XM!fa}6YF)!h>W;)erx{{ ab?z|JJJHw8TYdw`-J9&QtaWDmt=0ysqa`E& delta 7 OcmaE$wm@lvf*=456auOM diff --git a/.dat/metadata.tree b/.dat/metadata.tree index 83afd7a8f14449c9bfca4f9e9de797461a948140..be4e27e05544ecc34a7bae91afb5273a94f3f903 100644 GIT binary patch delta 670 zcmdm?)nTx~LbTr8vSM*UqqryM6vI20gW4-H_b4d5bgOFEWYwbj!ZbdB0SuUgLtbz! zYJJPKX|nSC>+#N3``(&{vXsTBrns#A{r|6Xm^?%sgSF&Oh3^M)g8Qa?KO%f2R*3Dy z)E{>*D9#Bwp|^OCy_U;4sJcppwVQ*cE(of>vf1iI<*fcgd$vY@X)SX5W8Wrrr*BW% zhBHuwcB#@!=Nf4j)*6zRG zM{n7?Ymr?BP= zn(!?*C1F-p<{zlSNgHq9ODeN{I$2Wr?dv3k9i9tQsy?1R@P9{f?rV*^_1q0mb-t4s zMdT+7h;Y`|9qCz-Yf-rJzE1Xa57!{~?6s~BgQr;shKAkUq);oi1**Ztbg{~#8yn-= zoqH4%dJ`6{FE@N}mH3P)7OJkZBCD{{X_t`3KS8wuFTTffb4{Y$cRc=9 zaMghAQNxAErBHRQEnOcZM6xUE&FPmckWuyV z*0U%0(gKb5?2<_~TTm?f^YaSkq&b(CF#fo6ao^=-5l{ntSrRVS-Vgh-FT;P;!AY)@ zZ|?oNEM~{5gWTP6tIP}IZ4XM_+#Rp*)_LQrMKBit02o^i Ax&QzG delta 7 OcmeA$*rBz-LKFZCv;vp_ diff --git a/inc/keys.h b/inc/keys.h index e69de29..25270a9 100644 --- a/inc/keys.h +++ b/inc/keys.h @@ -0,0 +1,17 @@ +#ifndef KEYS_H +#define KEYS_H + +#include + +#define SLEEP_PUB_KEY_BYTES 32 +#define SLEEP_SECRET_KEY_BYTES 64 +#define SLEEP_SIGNATURE_BYES 64 +#define SLEEP_BLAKE2B_BYES 32 + +typedef struct { + uint8_t pubkey[SLEEP_PUB_KEY_BYTES]; + uint8_t seckey[SLEEP_SECRET_KEY_BYES]; +} sleep_keypair_t; + + +#endif /* KEYS_H */ diff --git a/inc/sleep.h b/inc/sleep.h index 1052862..002d09b 100644 --- a/inc/sleep.h +++ b/inc/sleep.h @@ -1,3 +1,4 @@ +// ॐ सूक्ष्म शरीर #ifndef SLEEP_H #define SLEEP_H // TODO implement SLEEP diff --git a/inc/sleep_crypto.h b/inc/sleep_crypto.h new file mode 100644 index 0000000..b5b62f4 --- /dev/null +++ b/inc/sleep_crypto.h @@ -0,0 +1,22 @@ +#ifndef SLEEP_CRYPTO_H +#define SLEEP_CRYPTO_H + +#include +#include +#include "keys.h" +//#include "sleep.h" +int sleep_gen_keypair(sleep_keypair_t *kp); +int sleep_save_pubkey(const char *path, const uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]); +int sleep_load_pubkey(const char *path, uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]); + +int sleep_blake2b(uint8_t out[SLEEP_BLAKE2B_BYTES], const uint8_t *in, size_t inlen); + +int sleep_sign(uint8_t sig[SLEEP_BLAKE2B_BYTES], const uint8_t *msg, size_t msglen, const sleep_keypair_t *kp); + +int sleep_verify(const uint8_t sig[SLEEP_SIGNATURE_BYTES], const uint8_t *msg, size_t msglen, const uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]); + +int sleep_sign_roots(uint8_t sig[SLEEP_SIGNATURE_BYTES], const uint8_t *roots, size_t nroots, const uint64_t *indices, const uint64_t *lengths, const sleep_keypair_t *kp); + +int sleep_verify_roots(const uint8_t sig[SLEEP_SIGNATURE_BYTES], const uint8_t *roots, size_t nroots, const uint64_t *indices, const uint64_t *lengths, const uint8_t pub[SLEEP_PUBLIC_KEY_BYTES]); + +#endif /* SLEEP_CRYPTO_H */ diff --git a/src/sleep_crypto.c b/src/sleep_crypto.c index e69de29..4291cea 100644 --- a/src/sleep_crypto.c +++ b/src/sleep_crypto.c @@ -0,0 +1,26 @@ +#include "sleep_crypto.h" +#include +#include +#include + +int sleep_generate_keypair(sleep_keypair_t *kp) { + if (crypto_sign_keypair(kp->pubkey, kp->seckey) !=0) + return -1; + return 0; +} + +int sleep_save_pubkey(const char *path, const uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]) { + FILE *f = fopen(path, "wb"); + size_t written = fwrite(pub, 1, SLEEP_PUBLIC_KEY_BYTES, f); + fclose(f); + return (written == SLEEP_PUBLIC_KEY_BYTES) ? 0 : -1; +} + +int sleep_load_pubkey(const char *path, uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]) { + FILE *f = fopen(path, "rb"); + if (!f) return -1; + size_t read = fread(pub, 1, SLEEP_PUBLIC_KEY_BYTES, f); + fclose(f); + return (read == SLEEP_PUBLIC_KEY_BYTES) ? 0 : -1; +} + diff --git a/src/sleep_tree.c b/src/sleep_tree.c index d3b69a5..8221d8a 100644 --- a/src/sleep_tree.c +++ b/src/sleep_tree.c @@ -59,7 +59,66 @@ int sleep_tree_hash_parent(const uint8_t left[32], const uint8_t right[32], uint #endif } -int sleep_tree_build(const uint8_t **blocks, size_t *block_lens, size_t nblocks, /*FIXME*/, size_t *out_count){ +int sleep_tree_build(const uint8_t **blocks, size_t *block_lens, size_t nblocks, sleep_tree_entry_t *out_nodes, size_t *out_count) { + if (!blocks || !block_lens || !out_nodes || !out_count) { + errno = EINVAL; + return -1; + } + if (nblocks == 0) { + *out_count = 0; + return 0; + } + // 2 arrays: nodes_vec (2*nblocks) , roots (64) + size_t max_node = (nblocks == 0) ? 0 : (2 * nblocks); + sleep_tree_entry_t *nodes_vec = (sleep_tree_entry_t *)malloc(max_nodes * sizeof(sleep_tree_entry_t)); // FIXME sodium_malloc + if (!nodes_vec) { errno = ENOMEM; return -1; } + size_t nodes_len = 0; + sleep_tree_entry_t *roots = (sleep_tree_entry_t *)malloc((64 + 2) * sizeof(sleep_tree_entry_t)); // FIXME salt + if (!roots) { free(nodes_vec); errno = ENOMEM; return -1; } + size_t roots_len = 0; + + for (size_t i = 0; i < nblocks; i++) { + sleep_tree_entry_t leaf; + memset(&leaf, 0, sizeof(leaf)); + if (sleep_tree_hash_block(blocks[i], block_lens[i], leaf.hash) != 0) { + free(nodes_vec); + free(roots); + return -1; + } + leaf.index = flattree_index(0, (uint64_t)i); // 2 * i ... FIXME flattree naming conventions, defined in scope? + leaf.size = (uint64_t)block_lens[i]; + if (nodes_len >= max_nodes) { + size_t newcap = max_nodes * 2; + sleep_tree_entry_t *nvec = (sleep_tree_entry_t *)realloc(nodes_vec, newcap * sizeof(slep_tree_entry_t)); + if (!nvec) { free(nodes_vec); free(roots); errno = ENOMEM; return -1; } + nodes_vec = nvec; + max_nodes = newcap; + } + nodes_vec[nodes_len++] = leaf; + + if (roots_len >= 64 + 2) { + size_t newcap = (roots_len + 16); + sleep_tree_entry_t *r = (sleep_tree_entry_t *)realloc(roots, newcap * sizeof(sleep_tree_entry_t)); + if (!r) { free(nodes_vec); free(roots); errno = ENOMEM; return -1; } + roots = r; + } + roots[roots_len++] = leaf; + + while (roots_len >= 2) { + sleep_tree_entry_t *a = &roots[roots_len - 2]; + sleep_tree_entry_t *b = &roots[roots_len - 1]; + + uint64_t ra = /* FIXME tree depth (a->index) */ + uint64_t rb = /*(b->index)*/ + if (ra != rb) break; + } + } + memcpy(out_nodes, nodes_vec, nodes_len * sizeof(sleep_tree_entry_t)); + *out_count = nodes_len; + free(nodes_vec); + free(roots); + return 0; } +