package main import ( "bytes" "crypto/sha512" "encoding/base64" "encoding/binary" "errors" "golang.org/x/crypto/ed25519" ) type EncKey struct { PKAlg [2]byte KDFAlg [2]byte KDFRounds uint32 // network byte order Salt [16]byte Checksum [8]byte KeyNum [KeyNumLen]byte SecKey [ed25519.PrivateKeySize]byte } var ErrChecksum = errors.New("checksum mismatch") func (v *EncKey) Unmarshal(b []byte) error { buf := bytes.NewBuffer(b) dec := base64.NewDecoder(base64.StdEncoding, buf) err := binary.Read(dec, binary.BigEndian, v) sum := sha512.Sum512(v.SecKey[:]) if !bytes.Equal(sum[:len(v.Checksum)], v.Checksum[:]) { err = ErrChecksum } return err } func (v *EncKey) Marshal() ([]byte, error) { buf := new(bytes.Buffer) enc := base64.NewEncoder(base64.StdEncoding, buf) err := binary.Write(enc, binary.BigEndian, v) enc.Close() return buf.Bytes(), err }