diff options
author | Taylor Gerring <taylor.gerring@gmail.com> | 2014-12-22 02:06:24 +0800 |
---|---|---|
committer | Taylor Gerring <taylor.gerring@gmail.com> | 2014-12-22 02:06:24 +0800 |
commit | bab78bbeb691d95bdd0222435af0c11cb3485a79 (patch) | |
tree | 804c9689546ce362a2862b00bb4e76160052f5d6 /crypto/crypto.go | |
parent | 7a79428278412ab1f73708af51bce063b000b7a7 (diff) | |
parent | 1360f027d9e365242466ca346b2b56f421729d91 (diff) | |
download | go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.gz go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.bz2 go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.lz go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.xz go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.zst go-tangerine-bab78bbeb691d95bdd0222435af0c11cb3485a79.zip |
Merge branch 'tests' of github.com:ethereum/go-ethereum into tests
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r-- | crypto/crypto.go | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go index e10a9e81f..b8fd78fa2 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -1,15 +1,23 @@ 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" ) -// TODO refactor, remove (bin) +func init() { + // specify the params for the s256 curve + ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256) +} + func Sha3(data []byte) []byte { d := sha3.NewKeccak256() d.Write(data) @@ -45,3 +53,63 @@ func Ecrecover(data []byte) []byte { return r } + +// New methods using proper ecdsa keys from the stdlib +func ToECDSA(prv []byte) *ecdsa.PrivateKey { + if len(prv) == 0 { + return nil + } + + 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 { + if prv == nil { + return nil + } + return prv.D.Bytes() +} + +func ToECDSAPub(pub []byte) *ecdsa.PublicKey { + if len(pub) == 0 { + return nil + } + x, y := elliptic.Unmarshal(S256(), pub) + return &ecdsa.PublicKey{S256(), x, y} +} + +func FromECDSAPub(pub *ecdsa.PublicKey) []byte { + if pub == nil { + return nil + } + return elliptic.Marshal(S256(), pub.X, pub.Y) +} + +func GenerateKey() (*ecdsa.PrivateKey, error) { + return ecdsa.GenerateKey(S256(), rand.Reader) +} + +func SigToPub(hash, sig []byte) *ecdsa.PublicKey { + s := Ecrecover(append(hash, sig...)) + x, y := elliptic.Unmarshal(S256(), s) + + return &ecdsa.PublicKey{S256(), x, y} +} + +func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { + sig, err = secp256k1.Sign(hash, prv.D.Bytes()) + return +} + +func Encrypt(pub *ecdsa.PublicKey, message []byte) ([]byte, error) { + return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(pub), message, nil, nil) +} + +func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) { + key := ecies.ImportECDSA(prv) + return key.Decrypt(rand.Reader, ct, nil, nil) +} |