-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathhash.go
More file actions
79 lines (72 loc) · 1.91 KB
/
hash.go
File metadata and controls
79 lines (72 loc) · 1.91 KB
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package utils
import (
"bytes"
"encoding/hex"
"io"
"runtime"
"sort"
"github.com/application-stacks/runtime-component-operator/common"
"lukechampine.com/blake3"
)
func HashLockedData(data common.SecretMap) string {
return hash(data, serializeLockedData)
}
func HashData(data map[string][]byte) string {
return hash(data, serializeData)
}
func hash(data any, serializer func(any) []byte) string {
hasher := blake3.New(32, nil)
secretBytes := serializer(data)
io.Copy(hasher, bytes.NewReader(secretBytes))
// clear secret bytes
for i := range secretBytes {
secretBytes[i] = 0
}
hash := hasher.Sum(nil)
// force gc
hasher = nil
runtime.GC()
return hex.EncodeToString(hash)
}
func serializeLockedData(data any) []byte {
if _, ok := data.(common.SecretMap); !ok {
return []byte{}
}
dataObj := data.(common.SecretMap)
// sort data keys
dataKeys := []string{}
for k := range dataObj {
dataKeys = append(dataKeys, k)
}
sort.Strings(dataKeys)
// load dataBuffer delimited by a null character for every key-value pair <key>\0<value>\0
dataBuffer := []byte{}
for _, k := range dataKeys {
dataBuffer = append(dataBuffer, []byte(k)...)
dataBuffer = append(dataBuffer, '\000')
dataBuffer = append(dataBuffer, dataObj[k].Bytes()...)
dataBuffer = append(dataBuffer, '\000')
}
return dataBuffer
}
func serializeData(data any) []byte {
if _, ok := data.(map[string][]byte); !ok {
return []byte{}
}
dataObj := data.(map[string][]byte)
// sort data keys
dataKeys := []string{}
for k := range dataObj {
dataKeys = append(dataKeys, k)
}
sort.Strings(dataKeys)
// load dataBuffer delimited by a null character for every key-value pair <key>\0<value>\0
dataBuffer := []byte{}
for _, k := range dataKeys {
dataBuffer = append(dataBuffer, []byte(k)...)
dataBuffer = append(dataBuffer, '\000')
dataBuffer = append(dataBuffer, dataObj[k]...)
dataBuffer = append(dataBuffer, '\000')
}
return dataBuffer
}