package main import ( "crypto/rand" "crypto/sha512" "encoding/binary" "golang.org/x/crypto/ed25519" ) func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error { pub, sec, err := ed25519.GenerateKey(rand.Reader) if err != nil { return err } digest := sha512.Sum512(sec) enckey := new(EncKey) copy(enckey.PKAlg[:], PKAlg[:]) copy(enckey.KDFAlg[:], KDFAlg[:]) copy(enckey.SecKey[:], sec[:]) enckey.KDFRounds = uint32(rounds) // KDF binary.Read(rand.Reader, binary.BigEndian, &enckey.KeyNum) rand.Read(enckey.Salt[:]) copy(enckey.Checksum[:], digest[:len(enckey.Checksum)]) sb64, err := Marshal(enckey) if err != nil { return err } sfile := File{ Comment: comment + " secret key", B64: sb64, } if err := sfile.WriteFile(seckeyfile, SecMode); err != nil { return err } pubkey := new(PubKey) copy(pubkey.PKAlg[:], PKAlg[:]) pubkey.KeyNum = enckey.KeyNum copy(pubkey.PubKey[:], pub[:]) pb64, err := Marshal(enckey) if err != nil { return err } pfile := File{ Comment: comment + " public key", B64: pb64, } if err := pfile.WriteFile(pubkeyfile, PubMode); err != nil { return err } return nil }