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
|
||||
}
|
||||
|
||||
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
|
||||
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)
|
||||
b := new(big.Int)
|
||||
idx := 0
|
||||
@@ -188,3 +197,15 @@ func (elg ElgPublicKey) NewEncrypter() (enc Encrypter, err error) {
|
||||
enc, err = createElgamalEncryption(k, rand.Reader)
|
||||
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 {
|
||||
emsg, err := enc.Encrypt(msg)
|
||||
if err == nil {
|
||||
dec, err := ElgamelDecrypt(k, emsg, true)
|
||||
dec, err := elgamalDecrypt(k, emsg, true)
|
||||
if err == nil {
|
||||
if ! bytes.Equal(dec, msg) {
|
||||
t.Logf("%q != %q", dec, msg)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package crypto
|
||||
|
||||
// encrypts data
|
||||
type Encrypter interface {
|
||||
// encrypt a block of data
|
||||
// return encrypted block or nil and error if an error happened
|
||||
|
Reference in New Issue
Block a user