Path: blob/master/bitget-golang-sdk-api/internal/common/signer.go
735 views
package common12import (3"crypto"4"crypto/hmac"5"crypto/rand"6"crypto/rsa"7"crypto/sha256"8"crypto/x509"9"encoding/base64"10"encoding/pem"11"errors"12"strings"13)1415type Signer struct {16secretKey []byte17}1819func (p *Signer) Init(key string) *Signer {20p.secretKey = []byte(key)21return p22}2324func (p *Signer) Sign(method string, requestPath string, body string, timesStamp string) string {25var payload strings.Builder26payload.WriteString(timesStamp)27payload.WriteString(method)28payload.WriteString(requestPath)29if body != "" && body != "?" {30payload.WriteString(body)31}32hash := hmac.New(sha256.New, p.secretKey)33hash.Write([]byte(payload.String()))34result := base64.StdEncoding.EncodeToString(hash.Sum(nil))35return result36}3738func (p *Signer) SignByRSA(method string, requestPath string, body string, timesStamp string) string {39var payload strings.Builder40payload.WriteString(timesStamp)41payload.WriteString(method)42payload.WriteString(requestPath)43if body != "" && body != "?" {44payload.WriteString(body)45}4647sign, _ := RSASign([]byte(payload.String()), p.secretKey, crypto.SHA256)48result := base64.StdEncoding.EncodeToString(sign)49return result50}5152func RSASign(src []byte, priKey []byte, hash crypto.Hash) ([]byte, error) {53block, _ := pem.Decode(priKey)54if block == nil {55return nil, errors.New("key is invalid format")56}5758var pkixPrivateKey interface{}59var err error60if block.Type == "RSA PRIVATE KEY" {61pkixPrivateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes)62} else if block.Type == "PRIVATE KEY" {63pkixPrivateKey, err = x509.ParsePKCS8PrivateKey(block.Bytes)64}6566h := hash.New()67_, err = h.Write(src)68if err != nil {69return nil, err70}7172bytes := h.Sum(nil)73sign, err := rsa.SignPKCS1v15(rand.Reader, pkixPrivateKey.(*rsa.PrivateKey), hash, bytes)74if err != nil {75return nil, err76}7778return sign, nil79}808182