I'm done creating the message encryption system as previously described, all lives here https://github.com/Indra-Labs/indra/blob/main/pkg/sifr/message.go
The serialisation to put on the wire is not in there yet, that will be done shortly.
The frame format now has two fields, Seen and Expires, and these are used to communicate to peers they can forget previous private keys as they won't be used again. They are in the clear but the truncated hash does not provide any reverse path to identifying it, and this allows the peers to stay lean and purge stale data storage quickly.
The details of the encryption/decryption will be tidied up shortly. The encrypted message encrypt/decrypt is tested and its output is embedded in the frame.
The last little tidbit is I was looking at the go.mod and saw a nasty blake256 hash function imported. I dug around and discovered that the particular Schnorr signature implementation devised by Decred, which I borrowed, as they have the nice secp256k1 (bitcoin elliptic curve group) signature implementation uses blake256 for signature hashes and their specific version of schnorr.
That's not bitcoin!
So I have copied out and modified their code, swapped the blake256es for sha256es. and changed everything that is practical to change easily, there is just some tests that will require regenerating things because the blake hash output will be different to sha256 outputs so all the signatures both the hash of the message and the output signatures will not work so there is two tests currently disabled waiting for me to deal with this later.
It's not critically important because the code otherwise works and I am anyway not a fan of pre-defined test-results, I prefer to make tests that wherever possible use cryptographically random data to test algorithms on as they are far less likely to trip on edge cases and don't need the tedium of regenerating values if a bug in the algorithm changes the outputs.