-
Notifications
You must be signed in to change notification settings - Fork 26
/
rendezvous.go
45 lines (34 loc) · 942 Bytes
/
rendezvous.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package rendezvous
import (
"crypto/hmac"
"crypto/sha256"
"encoding/binary"
"time"
)
const DefaultRotationInterval = time.Hour * 24
func RoundTimePeriod(date time.Time, interval time.Duration) time.Time {
if interval < 0 {
interval = -interval
}
intervalSeconds := int64(interval.Seconds())
periodsElapsed := date.Unix() / intervalSeconds
totalTime := periodsElapsed * intervalSeconds
return time.Unix(totalTime, 0).In(date.Location())
}
func NextTimePeriod(date time.Time, interval time.Duration) time.Time {
if interval < 0 {
interval = -interval
}
return RoundTimePeriod(date, interval).Add(interval)
}
func GenerateRendezvousPointForPeriod(topic, seed []byte, date time.Time) []byte {
buf := make([]byte, 8)
mac := hmac.New(sha256.New, append(topic, seed...))
binary.BigEndian.PutUint64(buf, uint64(date.Unix()))
_, err := mac.Write(buf)
if err != nil {
panic(err)
}
sum := mac.Sum(nil)
return sum
}