arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/core/keys.go
core/keys.goRaw
  1package core
  2
  3import (
  4	"crypto/ecdsa"
  5	"crypto/elliptic"
  6	"crypto/rand"
  7	"encoding/hex"
  8	"errors"
  9	"math/big"
 10)
 11
 12// Address is the type data for addresses
 13type Address [32]byte
 14
 15func (addr Address) String() string {
 16	return hex.EncodeToString(addr[:])
 17}
 18
 19func NewKey() (*ecdsa.PrivateKey, error) {
 20	curve := elliptic.P256()
 21
 22	// privatekey := new(ecdsa.PrivateKey)
 23	privatekey, err := ecdsa.GenerateKey(curve, rand.Reader)
 24	if err != nil {
 25		return nil, err
 26	}
 27
 28	return privatekey, err
 29}
 30
 31func PackPubK(pubK *ecdsa.PublicKey) []byte {
 32	return elliptic.Marshal(pubK.Curve, pubK.X, pubK.Y)
 33}
 34func UnpackPubK(b []byte) *ecdsa.PublicKey {
 35	x, y := elliptic.Unmarshal(elliptic.P256(), b)
 36	return &ecdsa.PublicKey{
 37		Curve: elliptic.P256(),
 38		X:     x,
 39		Y:     y,
 40	}
 41}
 42
 43func AddressFromPrivK(privK *ecdsa.PrivateKey) Address {
 44	h := HashBytes(PackPubK(&privK.PublicKey))
 45	return Address(h)
 46}
 47
 48func AddressFromPubK(pubK *ecdsa.PublicKey) Address {
 49	h := HashBytes(PackPubK(pubK))
 50	return Address(h)
 51}
 52
 53func (sig *Signature) Bytes() []byte {
 54	b := sig.R.Bytes()
 55	b = append(b, sig.S.Bytes()...)
 56	return b
 57}
 58
 59func SignatureFromBytes(b []byte) (*Signature, error) {
 60	if len(b) != 64 {
 61		return nil, errors.New("Invalid signature")
 62	}
 63	rBytes := b[:32]
 64	sBytes := b[32:]
 65
 66	r := new(big.Int).SetBytes(rBytes)
 67	s := new(big.Int).SetBytes(sBytes)
 68
 69	sig := &Signature{
 70		R: r,
 71		S: s,
 72	}
 73	return sig, nil
 74}
 75
 76type Signature struct {
 77	R *big.Int
 78	S *big.Int
 79}
 80
 81func Sign(privK *ecdsa.PrivateKey, m []byte) (*Signature, error) {
 82	// r := big.NewInt(0)
 83	// s := big.NewInt(0)
 84
 85	hashMsg := HashBytes(m)
 86
 87	r, s, err := ecdsa.Sign(rand.Reader, privK, hashMsg[:])
 88	if err != nil {
 89		return nil, err
 90	}
 91	sig := &Signature{
 92		R: r,
 93		S: s,
 94	}
 95
 96	return sig, nil
 97
 98}
 99
100func VerifySignature(pubK *ecdsa.PublicKey, m []byte, sig Signature) bool {
101	hashMsg := HashBytes(m)
102	verified := ecdsa.Verify(pubK, hashMsg[:], sig.R, sig.S)
103	return verified
104}