how on earth does openssh not only have incredibly fucked versioning but is the only package i've ever seen to mention a "privilege separation" chroot path which actively breaks non-root builds. are you fucking kidding me bruh. "privilege separation chroot" defaulting to /var/empty and it immediately errors if it can't create it????? why are your version strings like that bruh?????
in fact, i think i'm literally not going to call them hash functions at all, but message digests
the fact that they (usually) reduce the bit width of a message is not really significant at all
in fact i wouldn't say a message digest satisfying indifferentiability "reduces the bit width of a message" because that absolutely implies that bits of the message are simply compressed lossily, which IS how the COOL fucking hash functions work
a message digest like SHA-512 is initialized to a fixed or maybe random value, and then it does something much much closer to stream encryption
like it's not "cryptographic" just because it does more work. anything can be "cryptographic". it specifically produces output that does not leak the input bytes. i suppose the distinction between digests and encryption, to cryptographers, is very much just that its output can be smaller than the input
BOOOO WIKIPEDIA IS INCORRECTLY OVERSPECIFIC https://en.wikipedia.org/wiki/Hash_function
A hash function is any function that can be used to map data of arbitrary size to fixed-size values, though there are some hash functions that support variable-length output.[1]
this is definitionally a message digest. variable-length output doesn't even make sense for something like a bloom filter which often consumes the output of a message digest
wikipedia also said some oxford guy in the 70s did computational logic "more general" than turing 'because it didn't impose a specific model of computation". that's called a non-constructive proof. every wikipedia "mathematician" is british and homophobic
i checked the blake3 paper to see what they call the step that makes each fixed-length chunk into a smaller fixed length https://raw.githubusercontent.com/BLAKE3-team/BLAKE3-specs/master/blake3.pdf they call it the "compression" function. good fucking grief
The compression function applies a 7 round keyed permutation
v0 = E(m, v)to the statev0 ... v15, keyed by the messagem0 ... m15.
i would call that an iterated keyed permutation, not a "compression"
The output of the compression function is most often truncated to produce 256-bit chaining values.
[2 pages later] "the output of the compression function is truncated in order to achieve the compression which is attributed to the function" very good. more like this please
see i kept trying to start this implementation of BLAKE3 for AMD's aocl-crypto library because of intel hater reasons (and because the library seems good and i want to support cpu vendors doing this) but my eyes kept glazing over and now i see it's because they keep fucking around like this.
there are 8 rounds. see this matrix of 8 values below. this element is called a quarter-round. we will never mention or refer to that term again
so of course i'm gonna refer to the reference implementation and having it in rust and in c is in fact a cool thing to do because rust does in fact have nice modelling capabilities appropriate for this problem. i'm gonna have to translate my ring buffer into C and while it will be happier there the lack of a trait system will be difficult
c++ with concepts is just incredibly goated because they're like traits but strictly more powerful, and then you still have standard templates for backcompat
fucking blew my goddamn mind when thephd explained their formalization of generics and compile time reflection for rust https://soasis.org/posts/a-mirror-for-rust-a-plan-for-generic-compile-time-introspection-in-rust/ i had not been able to verbalize rust's refusal of the very standard template specialization mechanism in c++, probably because they special-case it for generic const parameters
oh actually i think they don't i think you just might have to support any possible N: usize and then error if it's an N you don't like. but i think compile_error!() doesn't respect if conditionals in const fn without nightly and it somehow only respects the LITERAL GARBAGE AND INVISIBLE TO THE COMPILER cfg attrs