| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 | package utilimport (	"bytes"	"crypto/aes"	"crypto/cipher"	"crypto/rand"	"crypto/rsa"	"crypto/x509"	"encoding/binary"	"encoding/json"	"fmt"	"io")// Signer interfacetype Signer interface {	GetPrivateKey() *rsa.PrivateKey}// Check error functionfunc Check(err error, args ...interface{}) {	if err != nil {		if len(args) == 0 {			panic(err)		} else {			format := args[0].(string)			args[0] = err			panic(fmt.Errorf(format, append(args[1:], err)...))		}	}}// Uint64ToBytes funcfunc Uint64ToBytes(v uint64) []byte {	bb := make([]byte, 8)	binary.LittleEndian.PutUint64(bb, v)	return bb}// UintToBytes funcfunc UintToBytes(v uint) []byte {	bb := make([]byte, 4)	binary.LittleEndian.PutUint32(bb, uint32(v))	return bb}// KeyRSA funcfunc KeyRSA() *rsa.PrivateKey {	var privateKey *rsa.PrivateKey	var err error	if privateKey, err = rsa.GenerateKey(rand.Reader, 2048); err != nil {		panic(err)	}	return privateKey}// MarshalPublicKey funcfunc MarshalPublicKey(key *rsa.PublicKey) []byte {	if data, err := x509.MarshalPKIXPublicKey(key); err != nil {		panic(err)	} else {		return data	}}// UnmarshalPublicKey funcfunc UnmarshalPublicKey(key []byte) *rsa.PublicKey {	var kk interface{}	var err error	if kk, err = x509.ParsePKIXPublicKey(key); err != nil {		panic(err)	}	return kk.(*rsa.PublicKey)}// MarshalPrivateKey funcfunc MarshalPrivateKey(key *rsa.PrivateKey) []byte {	return x509.MarshalPKCS1PrivateKey(key)}// UnmarshalPrivateKey funcfunc UnmarshalPrivateKey(key []byte) *rsa.PrivateKey {	var kk *rsa.PrivateKey	var err error	if kk, err = x509.ParsePKCS1PrivateKey(key); err != nil {		panic(err)	}	return kk}// JSONMarshal funcfunc JSONMarshal(w io.Writer, v interface{}) {	if d, err := json.Marshal(v); err == nil {		w.Write(d)	} else {		panic(err)	}}// JSONUnmarshal funcfunc JSONUnmarshal(b []byte, v interface{}) interface{} {	if err := json.Unmarshal(b, v); err != nil {		panic(err)	}	return v}// PrivateKey funcfunc PrivateKey() *rsa.PrivateKey {	var err error	var privateKey *rsa.PrivateKey	if privateKey, err = rsa.GenerateKey(rand.Reader, 2048); err != nil {		panic(err)	}	return privateKey}// EncryptRSA funcfunc EncryptRSA(key *rsa.PublicKey, data []byte) []byte {	var err error	klen := key.N.BitLen()/8 - 11	if len(data) <= klen {		var bb []byte		if bb, err = rsa.EncryptPKCS1v15(rand.Reader, key, data); err != nil {			panic(err)		}		return bb	}	var buf bytes.Buffer	var bb []byte	for i, w, r := 0, 0, len(data); r > 0; i, r = i+w, r-w {		if r <= klen {			if bb, err = rsa.EncryptPKCS1v15(rand.Reader, key, data[i:]); err != nil {				panic(err)			}			buf.Write(bb)			w = r		} else {			if bb, err = rsa.EncryptPKCS1v15(rand.Reader, key, data[i:i+klen]); err != nil {				panic(err)			}			buf.Write(bb)			w = klen		}	}	return buf.Bytes()}// DecryptRSA funcfunc DecryptRSA(key *rsa.PrivateKey, data []byte) []byte {	var err error	klen := key.N.BitLen() / 8	if len(data) <= klen {		var bb []byte		if bb, err = rsa.DecryptPKCS1v15(rand.Reader, key, data); err != nil {			panic(err)		}		return bb	}	var buf bytes.Buffer	var bb []byte	for i, w, r := 0, 0, len(data); r > 0; i, r = i+w, r-w {		if r <= klen {			if bb, err = rsa.DecryptPKCS1v15(rand.Reader, key, data[i:]); err != nil {				panic(err)			}			buf.Write(bb)			w = r		} else {			if bb, err = rsa.DecryptPKCS1v15(rand.Reader, key, data[i:i+klen]); err != nil {				panic(err)			}			buf.Write(bb)			w = klen		}	}	return buf.Bytes()}// KeyAES funcfunc KeyAES() []byte {	var err error	var key = make([]byte, 32)	if _, err = rand.Read(key); err != nil {		panic(fmt.Errorf("Error generate aes key\n\n%+v", err))	}	return key}// EncryptAES funcfunc EncryptAES(key, data []byte) []byte {	block, err := aes.NewCipher(key)	if err != nil {		panic(err)	}	ciphertext := make([]byte, aes.BlockSize+len(data))	iv := ciphertext[:aes.BlockSize]	if _, err := io.ReadFull(rand.Reader, iv); err != nil {		panic(err)	}	stream := cipher.NewCFBEncrypter(block, iv)	stream.XORKeyStream(ciphertext[aes.BlockSize:], data)	return ciphertext}// DecryptAES funcfunc DecryptAES(key, ciphertext []byte) []byte {	block, err := aes.NewCipher(key)	if err != nil {		panic(fmt.Errorf("Error creating new block cipher\n%v\n", err))	}	if len(ciphertext) < aes.BlockSize {		panic(fmt.Errorf("ciphertext too short"))	}	iv := ciphertext[:aes.BlockSize]	ciphertext = ciphertext[aes.BlockSize:]	stream := cipher.NewCFBDecrypter(block, iv)	// XORKeyStream can work in-place if the two arguments are the same.	stream.XORKeyStream(ciphertext, ciphertext)	return ciphertext}
 |