fix up elg crypto parts

This commit is contained in:
Jeff Becker
2016-01-28 15:21:01 -05:00
parent 3deb15e012
commit 48d9efe4b4
4 changed files with 39 additions and 2 deletions

15
lib/crypto/decrypt.go Normal file
View File

@@ -0,0 +1,15 @@
package crypto
// decrypts data
type Decrypter interface {
// decrypt a block of data
// return decrypted block or nil and error if error happens
Decrypt(data []byte) ([]byte, error)
}
type PrivateEncryptionKey interface {
// create a new decryption object for this private key to decrypt data encrypted to our public key
// returns decrypter or nil and error if the private key is in a bad format
NewDecrypter() (Decrypter, error)
}

View File

@@ -50,8 +50,17 @@ func ElgamalGenerate(priv *elgamal.PrivateKey, rand io.Reader) (err error) {
return return
} }
type elgDecrypter struct {
k *elgamal.PrivateKey
}
func (elg elgDecrypter) Decrypt(data []byte) (dec []byte, err error) {
dec, err = elgamalDecrypt(elg.k , data, true) // TODO(psi): should this be true or false?
return
}
// decrypt an elgamal encrypted message, i2p style // decrypt an elgamal encrypted message, i2p style
func ElgamelDecrypt(priv *elgamal.PrivateKey, data []byte, zeroPadding bool) (decrypted []byte, err error) { func elgamalDecrypt(priv *elgamal.PrivateKey, data []byte, zeroPadding bool) (decrypted []byte, err error) {
a := new(big.Int) a := new(big.Int)
b := new(big.Int) b := new(big.Int)
idx := 0 idx := 0
@@ -188,3 +197,15 @@ func (elg ElgPublicKey) NewEncrypter() (enc Encrypter, err error) {
enc, err = createElgamalEncryption(k, rand.Reader) enc, err = createElgamalEncryption(k, rand.Reader)
return return
} }
func (elg ElgPrivateKey) Len() int {
return len(elg)
}
func (elg ElgPrivateKey) NewDecrypter() (dec Decrypter, err error) {
dec = elgDecrypter{
k: createElgamalPrivateKey(elg[:]),
}
return
}

View File

@@ -21,7 +21,7 @@ func TestElg(t *testing.T) {
if err == nil { if err == nil {
emsg, err := enc.Encrypt(msg) emsg, err := enc.Encrypt(msg)
if err == nil { if err == nil {
dec, err := ElgamelDecrypt(k, emsg, true) dec, err := elgamalDecrypt(k, emsg, true)
if err == nil { if err == nil {
if ! bytes.Equal(dec, msg) { if ! bytes.Equal(dec, msg) {
t.Logf("%q != %q", dec, msg) t.Logf("%q != %q", dec, msg)

View File

@@ -1,5 +1,6 @@
package crypto package crypto
// encrypts data
type Encrypter interface { type Encrypter interface {
// encrypt a block of data // encrypt a block of data
// return encrypted block or nil and error if an error happened // return encrypted block or nil and error if an error happened