mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
52 lines
1020 B
Go
52 lines
1020 B
Go
package tools
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/md5"
|
|
"crypto/sha1"
|
|
)
|
|
|
|
func HmacMD5(key []byte, data []byte) []byte {
|
|
hmacMD5 := hmac.New(md5.New, key)
|
|
hmacMD5.Write(data)
|
|
return hmacMD5.Sum(nil)[:16]
|
|
}
|
|
|
|
func HmacSHA1(key []byte, data []byte) []byte {
|
|
hmacSHA1 := hmac.New(sha1.New, key)
|
|
hmacSHA1.Write(data)
|
|
return hmacSHA1.Sum(nil)[:20]
|
|
}
|
|
|
|
func MD5Sum(d []byte) []byte {
|
|
h := md5.New()
|
|
h.Write(d)
|
|
return h.Sum(nil)
|
|
}
|
|
|
|
func SHA1Sum(d []byte) []byte {
|
|
h := sha1.New()
|
|
h.Write(d)
|
|
return h.Sum(nil)
|
|
}
|
|
|
|
func EVPBytesToKey(password string, keyLen int) (key []byte) {
|
|
const md5Len = 16
|
|
|
|
cnt := (keyLen-1)/md5Len + 1
|
|
m := make([]byte, cnt*md5Len)
|
|
copy(m, MD5Sum([]byte(password)))
|
|
|
|
// Repeatedly call md5 until bytes generated is enough.
|
|
// Each call to md5 uses data: prev md5 sum + password.
|
|
d := make([]byte, md5Len+len(password))
|
|
start := 0
|
|
for i := 1; i < cnt; i++ {
|
|
start += md5Len
|
|
copy(d, m[start-md5Len:start])
|
|
copy(d[md5Len:], password)
|
|
copy(m[start:], MD5Sum(d))
|
|
}
|
|
return m[:keyLen]
|
|
}
|