package main import ( "crypto/rand" "crypto/sha512" "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 rand.Read(enckey.KeyNum[:]) rand.Read(enckey.Salt[:]) copy(enckey.Checksum[:], digest[:len(enckey.Checksum)]) sb64, err := EncodeB64(enckey) if err != nil { return err } sfile := File{ Comment: comment + " secret key", B64: sb64, } if err := sfile.EncodeFile(seckeyfile); err != nil { return err } pubkey := new(PubKey) copy(pubkey.PKAlg[:], PKAlg[:]) copy(pubkey.KeyNum[:], enckey.KeyNum[:]) copy(pubkey.PubKey[:], pub[:]) pb64, err := EncodeB64(enckey) if err != nil { return err } pfile := File{ Comment: comment + " public key", B64: pb64, } if err := pfile.EncodeFile(pubkeyfile); err != nil { return err } return nil }