github.com/pavlo67/common@v0.5.3/common/encrlib/ecdsa.go (about) 1 package encrlib 2 3 import ( 4 "crypto/ecdsa" 5 "crypto/elliptic" 6 "crypto/md5" 7 "crypto/rand" 8 "encoding/json" 9 "io" 10 "math/big" 11 ) 12 13 func ECDSAPublicKey(privKey ecdsa.PrivateKey) []byte { 14 return append(privKey.PublicKey.X.Bytes(), privKey.PublicKey.Y.Bytes()...) 15 } 16 17 func ECDSASign(data string, privKey ecdsa.PrivateKey) ([]byte, error) { 18 h := md5.New() 19 io.WriteString(h, data) 20 21 r, s, err := ecdsa.Sign(rand.Reader, &privKey, h.Sum(nil)) 22 if err != nil { 23 return nil, err 24 } 25 26 return append(r.Bytes(), s.Bytes()...), nil 27 } 28 29 func ECDSAVerify(data string, publKey, signature []byte) bool { 30 h := md5.New() 31 io.WriteString(h, data) 32 dataSum := h.Sum(nil) 33 34 // build key and verify dataSum 35 sigLen := len(signature) 36 37 s := big.Int{} 38 s.SetBytes(signature[(sigLen / 2):]) 39 40 r := big.Int{} 41 r.SetBytes(signature[:(sigLen / 2)]) 42 43 x := big.Int{} 44 y := big.Int{} 45 keyLen := len(publKey) 46 x.SetBytes(publKey[:(keyLen / 2)]) 47 y.SetBytes(publKey[(keyLen / 2):]) 48 49 rawPubKey := ecdsa.PublicKey{Curve: elliptic.P256(), X: &x, Y: &y} 50 51 return ecdsa.Verify(&rawPubKey, dataSum, &r, &s) 52 } 53 54 func ECDSASerialize(privKey ecdsa.PrivateKey) ([]byte, error) { 55 privKey.Curve = nil 56 57 return json.Marshal(privKey) 58 59 //var encoded bytes.Buffer 60 // gob.Register(privKey.Curve) 61 //enc := gob.NewEncoder(&encoded) 62 //err := enc.Encode(privKey) 63 //if err != nil { 64 // return nil, err 65 //} 66 //return encoded.Bytes(), nil 67 } 68 69 func ECDSADeserialize(data []byte) (*ecdsa.PrivateKey, error) { 70 //decoder := gob.NewDecoder(bytes.NewReader(data)) 71 //err := decoder.Decode(privKey) 72 //if err != nil { 73 // return err 74 //} 75 76 privKey := ecdsa.PrivateKey{} 77 78 err := json.Unmarshal(data, &privKey) 79 if err != nil { 80 return nil, err 81 } 82 83 // it's not necessary if privKey.Curve would be serialized instead "nilled" 84 privKey.Curve = elliptic.P256() 85 86 return &privKey, nil 87 }