hmac.go raw
1 package hmac
2
3 import "common/crypto/sha256"
4
5 const blockSize = 64
6
7 // Sum computes HMAC-SHA256(key, message).
8 func Sum(key, message []byte) [32]byte {
9 // If key > blockSize, hash it.
10 var k [blockSize]byte
11 if len(key) > blockSize {
12 h := sha256.Sum(key)
13 copy(k[:], h[:])
14 } else {
15 copy(k[:], key)
16 }
17
18 var ipad, opad [blockSize]byte
19 for i := 0; i < blockSize; i++ {
20 ipad[i] = k[i] ^ 0x36
21 opad[i] = k[i] ^ 0x5c
22 }
23
24 // inner = SHA256(ipad || message)
25 inner := make([]byte, blockSize+len(message))
26 copy(inner, ipad[:])
27 copy(inner[blockSize:], message)
28 innerHash := sha256.Sum(inner)
29
30 // outer = SHA256(opad || inner_hash)
31 var outer [blockSize + 32]byte
32 copy(outer[:blockSize], opad[:])
33 copy(outer[blockSize:], innerHash[:])
34 return sha256.Sum(outer[:])
35 }
36