package main import ( "bytes" "io" //"encoding/base64" "encoding/binary" "dim13.org/signify/base64" "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 } func (v *EncKey) Unmarshal(b []byte) error { buf := bytes.NewBuffer(b) dec := base64.NewDecoder(base64.StdEncoding, buf) io.ReadFull(dec, v.PKAlg[:]) io.ReadFull(dec, v.KDFAlg[:]) binary.Read(dec, binary.BigEndian, &v.KDFRounds) io.ReadFull(dec, v.Salt[:]) io.ReadFull(dec, v.Checksum[:]) io.ReadFull(dec, v.KeyNum[:]) io.ReadFull(dec, v.SecKey[:]) return nil } func (v *EncKey) Marshal() ([]byte, error) { buf := new(bytes.Buffer) enc := base64.NewEncoder(base64.StdEncoding, buf) enc.Write(v.PKAlg[:]) enc.Write(v.KDFAlg[:]) binary.Write(enc, binary.BigEndian, v.KDFRounds) enc.Write(v.Salt[:]) enc.Write(v.Checksum[:]) enc.Write(v.KeyNum[:]) enc.Write(v.SecKey[:]) enc.Close() return buf.Bytes(), nil }