123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
-
- package csbhttp
-
- import (
- "bytes"
- "crypto/hmac"
- "crypto/sha1"
- "encoding/base64"
- "hash"
- "io"
- "sort"
- )
-
-
-
-
- type paramsSorter struct {
- Keys []string
- Vals []string
- }
-
-
- func newParamsSorter(m map[string]string) *paramsSorter {
- hs := ¶msSorter{
- Keys: make([]string, 0, len(m)),
- Vals: make([]string, 0, len(m)),
- }
-
- for k, v := range m {
- hs.Keys = append(hs.Keys, k)
- hs.Vals = append(hs.Vals, v)
- }
- return hs
- }
-
-
- func (hs *paramsSorter) Sort() {
- sort.Sort(hs)
- }
-
-
- func (hs *paramsSorter) Len() int {
- return len(hs.Vals)
- }
-
-
- func (hs *paramsSorter) Less(i, j int) bool {
- return bytes.Compare([]byte(hs.Keys[i]), []byte(hs.Keys[j])) < 0
- }
-
-
- func (hs *paramsSorter) Swap(i, j int) {
- hs.Vals[i], hs.Vals[j] = hs.Vals[j], hs.Vals[i]
- hs.Keys[i], hs.Keys[j] = hs.Keys[j], hs.Keys[i]
- }
-
-
- func doSign(params map[string]string, secretKey string) string {
- hs := newParamsSorter(params)
-
-
- hs.Sort()
-
-
- canonicalizedParams := ""
- for i := range hs.Keys {
- if i > 0 {
- canonicalizedParams += "&"
- }
- canonicalizedParams += hs.Keys[i] + "=" + hs.Vals[i]
- }
-
- printDebug("canonicalizedParams", canonicalizedParams)
-
- signStr := canonicalizedParams
-
- h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(secretKey))
- io.WriteString(h, signStr)
- signedStr := base64.StdEncoding.EncodeToString(h.Sum(nil))
-
- return signedStr
- }
|