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