12345678910111213141516171819202122232425262728293031323334353637383940 |
- package rfc4757
- import (
- "bytes"
- "crypto/hmac"
- "crypto/md5"
- "io"
- )
- // Checksum returns a hash of the data in accordance with RFC 4757
- func Checksum(key []byte, usage uint32, data []byte) ([]byte, error) {
- // Create hashing key
- s := append([]byte(`signaturekey`), byte(0x00)) //includes zero octet at end
- mac := hmac.New(md5.New, key)
- mac.Write(s)
- Ksign := mac.Sum(nil)
- // Format data
- tb := UsageToMSMsgType(usage)
- p := append(tb, data...)
- h := md5.New()
- rb := bytes.NewReader(p)
- _, err := io.Copy(h, rb)
- if err != nil {
- return []byte{}, err
- }
- tmp := h.Sum(nil)
- // Generate HMAC
- mac = hmac.New(md5.New, Ksign)
- mac.Write(tmp)
- return mac.Sum(nil), nil
- }
- // HMAC returns a keyed MD5 checksum of the data
- func HMAC(key []byte, data []byte) []byte {
- mac := hmac.New(md5.New, key)
- mac.Write(data)
- return mac.Sum(nil)
- }
|