diff options
author | obscuren <geffobscura@gmail.com> | 2014-12-10 07:03:21 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-12-10 07:03:21 +0800 |
commit | 87adff7e189ee0a1fd50a3ef30ba22482e60f314 (patch) | |
tree | c0296eda7253cd468bf05bf08fa5580d4cfec7d5 /crypto/crypto.go | |
parent | c24018e273e5457f7c5bf6af1b541bb55b19ec8d (diff) | |
download | go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar.gz go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar.bz2 go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar.lz go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar.xz go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.tar.zst go-tangerine-87adff7e189ee0a1fd50a3ef30ba22482e60f314.zip |
Added Encrypt & Decrypt using the ECIES w/ tests
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r-- | crypto/crypto.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go index e10a9e81f..87dd72dc7 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -1,14 +1,35 @@ package crypto import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" "crypto/sha256" "code.google.com/p/go.crypto/ripemd160" "github.com/ethereum/go-ethereum/ethutil" + "github.com/obscuren/ecies" "github.com/obscuren/secp256k1-go" "github.com/obscuren/sha3" ) +func init() { + // specify the params for the s256 curve + ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256) +} + +func ToECDSA(prv []byte) *ecdsa.PrivateKey { + priv := new(ecdsa.PrivateKey) + priv.PublicKey.Curve = S256() + priv.D = ethutil.BigD(prv) + priv.PublicKey.X, priv.PublicKey.Y = S256().ScalarBaseMult(prv) + return priv +} + +func FromECDSA(prv *ecdsa.PrivateKey) []byte { + return prv.D.Bytes() +} + // TODO refactor, remove (bin) func Sha3(data []byte) []byte { d := sha3.NewKeccak256() @@ -45,3 +66,24 @@ func Ecrecover(data []byte) []byte { return r } + +func SigToPub(hash, sig []byte) []byte { + return Ecrecover(append(hash, sig...)) +} + +func Sign(hash, prv []byte) (sig []byte, err error) { + sig, err = secp256k1.Sign(hash, prv) + return +} + +func Encrypt(pub, message []byte) ([]byte, error) { + x, y := elliptic.Unmarshal(S256(), pub) + epub := &ecdsa.PublicKey{S256(), x, y} + + return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(epub), message, nil, nil) +} + +func Decrypt(prv, ct []byte) ([]byte, error) { + key := ecies.ImportECDSA(ToECDSA(prv)) + return key.Decrypt(rand.Reader, ct, nil, nil) +} |