fix up elg crypto parts
This commit is contained in:
15
lib/crypto/decrypt.go
Normal file
15
lib/crypto/decrypt.go
Normal 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)
|
||||||
|
}
|
@@ -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
|
||||||
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user