aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/crypto/openpgp/packet/private_key.go
diff options
context:
space:
mode:
authorAdam Langley <agl@golang.org>2011-06-21 21:00:49 -0400
committerAdam Langley <agl@golang.org>2011-06-21 21:00:49 -0400
commitf2e94de6d62be39044b28ca61b8659cd295253c2 (patch)
tree84c849976f554ba61599c666faf2dfbdfdcdd6f8 /src/pkg/crypto/openpgp/packet/private_key.go
parent10b5519d3a15e9489c998a720fe19989af89da11 (diff)
downloadgo-f2e94de6d62be39044b28ca61b8659cd295253c2.tar.xz
crypto/openpgp: add ElGamal support.
R=bradfitz, r CC=golang-dev https://golang.org/cl/4639049
Diffstat (limited to 'src/pkg/crypto/openpgp/packet/private_key.go')
-rw-r--r--src/pkg/crypto/openpgp/packet/private_key.go22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/pkg/crypto/openpgp/packet/private_key.go b/src/pkg/crypto/openpgp/packet/private_key.go
index 6244661320..6f8133d981 100644
--- a/src/pkg/crypto/openpgp/packet/private_key.go
+++ b/src/pkg/crypto/openpgp/packet/private_key.go
@@ -9,6 +9,7 @@ import (
"bytes"
"crypto/cipher"
"crypto/dsa"
+ "crypto/openpgp/elgamal"
"crypto/openpgp/error"
"crypto/openpgp/s2k"
"crypto/rsa"
@@ -224,6 +225,8 @@ func (pk *PrivateKey) parsePrivateKey(data []byte) (err os.Error) {
return pk.parseRSAPrivateKey(data)
case PubKeyAlgoDSA:
return pk.parseDSAPrivateKey(data)
+ case PubKeyAlgoElGamal:
+ return pk.parseElGamalPrivateKey(data)
}
panic("impossible")
}
@@ -277,3 +280,22 @@ func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err os.Error) {
return nil
}
+
+func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err os.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
+}