// generate an elgamal key pair func ElgamalGenerate(priv *elgamal.PrivateKey, rand io.Reader) (err error) { priv.P = elgp priv.G = elgg xBytes := make([]byte, priv.P.BitLen()/8) _, err = io.ReadFull(rand, xBytes) if err == nil { // set private key priv.X = new(big.Int).SetBytes(xBytes) // compute public key priv.Y = new(big.Int).Exp(priv.G, priv.X, priv.P) } return }
func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) { pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey) priv := new(elgamal.PrivateKey) priv.PublicKey = *pub buf := bytes.NewBuffer(data) x, _, err := readMPI(buf) if err != nil { return } priv.X = new(big.Int).SetBytes(x) pk.PrivateKey = priv pk.Encrypted = false pk.encryptedData = nil return nil }