From a1da7deba419d14a21c9da2e8e9b56e024480a5b Mon Sep 17 00:00:00 2001 From: divo <418@cryspace.space> Date: Mon, 6 Oct 2025 18:41:50 -0400 Subject: [PATCH] began sleep.c, worked sleep_crypto.c, sleep_tree.c renamed sleep.3 for conflicting added mock visual for client extra/datthang.png direction: need to save keys, save seckey ~/.datt/secret_keys .datt datt with extra t decided for testing until port complete --- .dat/content.bitfield | Bin 3616 -> 3616 bytes .dat/content.signatures | Bin 8224 -> 8544 bytes .dat/content.tree | Bin 10232 -> 10632 bytes .dat/metadata.bitfield | Bin 3616 -> 3616 bytes .dat/metadata.data | Bin 4538 -> 4949 bytes .dat/metadata.signatures | Bin 4960 -> 5344 bytes .dat/metadata.tree | Bin 6152 -> 6632 bytes docs/{sleep.3 => dat.sleep.3} | 0 extra/datthang.png | Bin 0 -> 16798 bytes src/sleep.c | 46 ++++++++++++++++++++ src/sleep_crypto.c | 31 ++++++++++++++ src/sleep_tree.c | 78 ++++++++++++++++++++++++++++++++-- 12 files changed, 151 insertions(+), 4 deletions(-) rename docs/{sleep.3 => dat.sleep.3} (100%) create mode 100644 extra/datthang.png diff --git a/.dat/content.bitfield b/.dat/content.bitfield index 1a07e8ebde06c3da9aad29f064af224e032041c1..91ce37195210b137e23a3249cbf4adf5bbff8273 100644 GIT binary patch delta 41 xcmZ1=vp{Bo9&_fL9~%w%S(yGcY<6V1$39tshn+LT!GXbnfq@}lvjNWsMgS>t44eP} delta 45 xcmZ1=vp{Bo9#ii8&4DZ*m?tZ+C~OX7InO@PL2$AH4?AZ70|Yp1HsJZd2mnEq3>E+Y diff --git a/.dat/content.signatures b/.dat/content.signatures index 59e73787faedc2c906e9d22d3109927abbdba8b6..2c3a1b74fb03ecfc5581e195364f781978b8ac30 100644 GIT binary patch delta 330 zcmV-Q0k!_1K;S~KARvDfa{Z(nGo;tsy;iy!Kf}H3#|rk=V&WhkxUD-WUY4OVSj1jj zqy)Zm1Nj-Mvp2-3%|*rUy$k7mmV-67xCjHuG0LcM9PBfq&vM1Orm<*`6DrE>hp4pg zJHJ>&{O;Rzm6N0(F9$l;Okzn!$6^;6BCTZt4&iT5ge|^saZL4>3{VdxT7R8v!9{4TqA0z3~ z2QkYjwjf_k^oZ^|u_G&O*neD}f99jDQt7hqT66Pe&E4gCEOseGo#VU(|JR#^JDv(y z96NPUvCEyZpj9o)c%>$Ob$;sDs#9ud0#WCmTTrpN8ajNpRN@{6tW~Kb=jQcV7syXNcpAX7k6EGoUmAy;o3W?&*BoYlmA@ty$Mmr zDxtg(RF!A13WUy_=Jz*YW4kA(8@_Q`g}9EIv7Q7(9mhHd4FgUv1}0dLdRZ!T l;Z&y`v3j!8r;v)u diff --git a/.dat/metadata.bitfield b/.dat/metadata.bitfield index 67a52f9eae94627ffd18ede1e591328b2a2f685e..d8a0ead40a5a36ad8d303c389552a5c71c030885 100644 GIT binary patch delta 43 zcmV+`0M!4W9H1PKDFXlCvq1#)1Ct;G5d{DL{^+wo1m6ddKn#;03(A B5!V0! delta 41 zcmV+^0M`GY9H1PKDFOJiK?L>#lOO~U1OEPivq1#k2a!MxlOPNP0?30 diff --git a/.dat/metadata.data b/.dat/metadata.data index 38ea15db681257b48073f92acfc209a05e3a0165..a799382012e5f4c4b7460e20f73b07245b3e7ace 100644 GIT binary patch delta 405 zcmdm`d{u43F2Q;(Uj3B(D9 zjgT_Ol4d3W1_=g*{frun1`UiBC!VZla+vaQ?cLeN9uP{3pOFJ*5Xc+`E@A!Dijty4 zkVz#OiFxUI1$pU0^(t_)<~4&1Yh<)&f3}{<;XcGL2qneG$ib`*b`%qn5HkZ8kA87c zGStn0jcg+)Iv3j>!R!Xfb`MX9MMuKA^*!D!IJXtA|@~ delta 7 Ocmcbrwo7@#Eu&PpSa6g3ydAoo}hW`U?z|)`GQ$H>{W85QT9IL<{1eqn0Uv25!|dfWoO_0EbquG;zXLh6$;?Oa^#bqh=s8b2)T z7dhCmHZ&zk*jVvVMspiZxQxGkH>gf2ol9QN? zMvrx@YuBlfQ0rAvv(sy?kwt9{6R0YomnY%8AbRUpE3psL&e!Rr(lDEXswPa$iwQF!gkQGhW7~zJl!4ai-JS1|pBJowb>Nb_s>z4Gh(BpkF@OP!<>m!q z5{w#$Ht%^jZB?*Ka)8al4L^I1>NsnB^WAS0?IybNW8B1=sSwpnYLg#`Yt+A*W|H)3 z`kuc#Ow^yfZ`^P!^(N23X=NLk*Ir%6x!zyL8KRgWcTTUD<{Zb{5i7T4ZF{k^i-D!D zZC#29@BXgPDioPx&!dy~{b^zHXoYNf4(ljTmD(Sg)r1WPix<&n=akS@$zc5 z*Q*p>`R4R1-?iBXM0nrcn{zj7yM+`~-IVW^HXT+w|MGBN{Ot3^=w8Ly$9KEepJaGs zI=_&|G^9Uv@&{pqdadjk(-WiK_IEbKaO$&foy}!%N9IgK3^V6$yPIm$-W9ipYgz+U?*{-$P|zO$ delta 32 hcmaE1++nbxLToali2P&$5zfsE#3UGDoXHQwH2|q@2~+?8 diff --git a/docs/sleep.3 b/docs/dat.sleep.3 similarity index 100% rename from docs/sleep.3 rename to docs/dat.sleep.3 diff --git a/extra/datthang.png b/extra/datthang.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e4c537e6644c49794c125982e89c2b47fd98a1 GIT binary patch literal 16798 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

0`=$4dO+yOoLa*0{Mf$vvBfMMYcU$T69!Qu$ zkSb{^>%yvMEWD;Tv>@mlrTc>E-b;6gnTF58cTszyrW>6KqM8Ota?Q6RrElkdZHn^a zJ3UNjq6#htk`W!QLwh?t9#mZkl!_{hE(l(&M^h_H zo^RflTyI_?_NynoPiW2%5%d=(uLThk-JLE7B9}c0LzQ%aQ0Rp%mkcku)9p|DJg94; zQw(vbWg^|-8*{bWgFNPidvCDFls@D345()cUVplc-_PA-e2^AO8EVehd&rMS$ zJImpGOugH;Ik62a*qX&;x+wh?a0BGK9TQ-#`p6sP~iYGgI7|FMJrp9iD<@9_S&BiH|H^8Zzn%Vgc| z9lThE4Ag__S4V86($xuR&_6PD0D#Zse~G;RdF9-mwTcqF|0!1l@wNuKJL?)^gj4+_ z4Ozwc?=m6w|2viO=Svhs{6D$c66tbh2z=G~inkd6puMC-TF_$6RQqnGh?a#LRK!2A zHZC|Zhc^fS0J=A#u{tebuz(dzFxA@huhE$t`bbD3PxPsQy|WxPc?tl~bMjwIO>tcH z-t0iQ-zP-Ay`}ch`yPMgvNUi920*iEtPoPFuc?1)PE*d0U60?ZX;|IHmjg19yc3n0 zrh?GjnM*rn?29XK(=B96n>e1LwHB)>v{frDmRGPBg~xu0PJjE zkjPIa4pUxJ7KVR_a~~Y$TB)OQU9l`f06@o=Uhga&R9$kv;lbbWeXUi~+5q@?+DKK} zS|ZOUkY3gU0H|&M=4?(&9CfDJCIQZ469COt|E?DwQSS=G8QEf(iP1HMONbj>XkdV& zxQxU0*a1L1#s>B`qQeS+_*<&nlAH1}n@7mRw#3XG0D#8_mtD8ZK>_eF`;XQ1zq(5Q c#e*f-K= +#include +#include +#include +#include + +static int write_header(const char *path, uint32_t magicka, uint16_t entry_size, const char *algo) { + FILE *f = fopen(path, "wb"); + if (!f) return -1; + + sleep_header_t h; + memset(&h, 0, sizeof(h)); + h.magicka = ((magicka >> 24) & 0xff) | ((magicka >> 8) & 0xff00) | ((magicka << 8) & 0xff0000) | ((magicka << 24) & 0xff000000); + h.version = 0; + h.entry_size = (entry_size >> 8) | (entry_size << 8); // BE16 + h.algo_len = algo ? (uint8_t)strlen(algo) : 0; + if (algo) strncopy(h.algo, algo, sizeof(h.algo)); + if (fwrite(&h, 1, sizeof(h), f) != sizeof(h)) { + fclose(f); + return -1; + } + fclose(f); + return 0; +} + +int sleep_init(const char *root) { + char path[512]; + + // makedir .dat(t) testing + sprintf(path, sizeof(path), "%s/.datt", root); + if (mkdir(path, 0700) && errno != EEXIST) return -1; + + // content.* signatures, tree, bitfield, key + + // metadata.* signatures, tree, bitfield, key + return 0; +} + +int main(void) { + if (sleep_init(".")) { + perror("sleep_init failed"); + return 1; + } + return 0; +} diff --git a/src/sleep_crypto.c b/src/sleep_crypto.c index 4291cea..df028e1 100644 --- a/src/sleep_crypto.c +++ b/src/sleep_crypto.c @@ -24,3 +24,34 @@ int sleep_load_pubkey(const char *path, uint8_t pubkey[SLEEP_PUBLIC_KEY_BYTES]) return (read == SLEEP_PUBLIC_KEY_BYTES) ? 0 : -1; } +int sleep_blake2b(uint8_t out[SLEEP_BLAKE2B_BYTES], const uint8_t *in, size_t inlen) { + return crypto_generichash(out, SLEEP_BLAKE2B_BYTES, in, inlen, NULL, 0); +} + +int sleep_sign(uint8_t sig[SLEEP_SIGNATURE_BYTES], const uint8_t *msg, size_t msglen, const sleep_keypair_t *kp) { + return crypto_sign_detached(sig, NULL, msg, msglen, kp->seckey); +} + +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]) { + return crypto_sign_verify_detached(sig, msg, msglen, pubkey); +} + +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) { + uint8_t bug[1024]; // FIXME dynamic + size_t ctxlen = strlen(SLEEP_CONTEXT); + memcpy(bug, SLEEP_CONTEXT, ctxlen); + size_t off = ctxlen; // off defined in scope? + off += encode_roots(bug + off, roots, nroots, indices, lengths); + return sleep_sign(sig, bug, off, 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]) { + uint8_t bug[1024]; // FIXME dynamic + size_t ctxlen = strlen(SLEEP_CONTEXT); + memcpy(bug, SLEEP_CONTEXT, ctxlen); + size_t off = ctxlen; // off defined in scope? + off += encode_roots(bug + off, roots, nroots, indices, lengths +); + return sleep_verify(sig, bug, off, kp); +} + diff --git a/src/sleep_tree.c b/src/sleep_tree.c index 8221d8a..1a2ded9 100644 --- a/src/sleep_tree.c +++ b/src/sleep_tree.c @@ -24,7 +24,7 @@ static inline unsigned int _ctzll_fallback(uint64_t x) { } return 1; } -static inline unsigned int flattree_ctzll(uint64_t x) { +static inline unsigned int tree_ctzll(uint64_t x) { #if defined(__GNUC__) || defined(__clang__) || define(__MUSL__) if (x == 0) return 64; return (unsigned int)__builtin_ctzll(x); @@ -33,6 +33,78 @@ static inline unsigned int flattree_ctzll(uint64_t x) { #endif } +static inline uint64_t sleep_tree_index(uint64_t depth, uint64_t offset) { + if (depth >= 63) { + return UINT64_MAX; + } + return (offset << (depth + 1)) | ((depth == 0) ? 0ULL : ((1ULL << depth) - 1ULL)); +} + +static inline uint64_t sleep_tree_depth(uint64_t i) { + uint64_t inverted = ~i; + return (uint64_t)tree_ctzll(inverted); +} + +static inline int tree_is_even(uint64_t i) { + return (i & 1ULL) == 0ULL; } +static inline int tree_is_odd(uint64_t i) { + return (i & 1ULL) != 0ULL; } + +static inline uint64_t sleep_tree_offset(uint64_t i) { + uint64_t d = sleep_tree_depth(i); + if (tree_is_even(i)) { + return i / 2; + } else { + return i >> (d + 1); + } +} + +static inline uint64_t sleep_tree_parent(uint64_t i) { + uint64_t d = sleep_tree_depth(i); + return sleep_tree_index(d, sleep_tree_offset(i) ^ 1ULL); +} + +static inline int sleep_tree_left_child(uint64_t i, uint64_t *out) { // set + if (tree_is_even(i)) return 0; + uint64_t d = sleep_tree_depth(i); + if (d == 0) { + *out = i; + return 1; + } + *out = sleep_tree_index(d - 1, sleep_tree_offset(i) << 1); + return 1; +} + +static inline int sleep_tree_right_child(uint64_t i, uint64_t *out) { // horus + if (tree_is_even(i)) return 0; + uint64_t d = sleep_tree_depth(i); + if (d == 0) { + *out = i; + return 1; + } + *out = sleep_tree_index(d - 1, (slep_tree_offset(i) << 1) + 1ULL); + return 1; +} + +static inline uint64_t sleep_tree_left_span(uint64_t i) { + uint64_t d = sleep_tree_depth(i); + if (d == 0) return i; + return sleep_tree_offset(i) * (2ULL << d); +} + +static inline uint64_t sleep_tree_right_span(uint64_t i) { + uint64_t d = sleep_tree_depth(i); + if (d == 0) return i; + return (sleep_tree_offset(i) + 1ULL) * (2ULL << d) - 2ULL; +} + +static inline void sleep_tree_spans(uint64_t i, uint64_t *left, uint64_t *right) { + *left = sleep_tree_left_span(i); + *right = sleep_tree_right_span(i); +} + +// TODO static inline int sleep_tree_full_roots + // भव न सन हृदयं int sleep_tree_hash_block(const uint8_t *data, size_t len, uint8_t out_hash[32]) { #ifndef SLEEP_SALT @@ -86,7 +158,7 @@ int sleep_tree_build(const uint8_t **blocks, size_t *block_lens, size_t nblocks, free(roots); return -1; } - leaf.index = flattree_index(0, (uint64_t)i); // 2 * i ... FIXME flattree naming conventions, defined in scope? + leaf.index = sleep_tree_index(0, (uint64_t)i); // 2 * i ... leaf.size = (uint64_t)block_lens[i]; if (nodes_len >= max_nodes) { size_t newcap = max_nodes * 2; @@ -120,5 +192,3 @@ int sleep_tree_build(const uint8_t **blocks, size_t *block_lens, size_t nblocks, free(roots); return 0; } - -