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) }