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  }