Skip to content

Commit 0373d6d

Browse files
committed
fix: update sha generation logic
Signed-off-by: Anish Ramasekar <[email protected]>
1 parent 990c893 commit 0373d6d

File tree

1 file changed

+28
-17
lines changed

1 file changed

+28
-17
lines changed

pkg/util/secretutil/secret.go

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ import (
2323
"crypto/x509"
2424
"encoding/pem"
2525
"fmt"
26-
"io"
27-
"sort"
26+
"math"
2827
"strings"
2928

29+
"golang.org/x/crypto/cryptobyte"
3030
"golang.org/x/crypto/pkcs12"
3131
corev1 "k8s.io/api/core/v1"
32+
"k8s.io/apimachinery/pkg/util/sets"
3233

3334
secretsyncv1alpha1 "sigs.k8s.io/secrets-store-sync-controller/api/v1alpha1"
3435
)
@@ -212,23 +213,33 @@ func GetSecretData(secretObjData []secretsyncv1alpha1.SecretObjectData, secretTy
212213

213214
// GetSHAFromSecret gets SHA for the secret data
214215
func GetSHAFromSecret(data map[string][]byte) (string, error) {
215-
values := make([]string, 0, len(data))
216-
for k, v := range data {
217-
values = append(values, k+"="+string(v))
218-
}
219-
// sort the values to always obtain a deterministic SHA for
220-
// same content in different order
221-
sort.Strings(values)
222-
return generateSHA(strings.Join(values, ";"))
223-
}
216+
if len(data) == 0 {
217+
return "", nil
218+
}
219+
220+
b := cryptobyte.NewBuilder(nil)
221+
if len(data) > math.MaxUint32 {
222+
return "", fmt.Errorf("data too large: length exceeds uint32 max")
223+
}
224+
// we are checking the length of the data to be less than uint32 max
225+
// so we can safely cast it to uint32 without worrying about overflow
226+
b.AddUint32(uint32(len(data))) // nolint:gosec
224227

225-
// generateSHA generates SHA from string
226-
func generateSHA(data string) (string, error) {
227-
hasher := sha256.New()
228-
_, err := io.WriteString(hasher, data)
228+
keys := sets.StringKeySet(data).List()
229+
230+
for _, k := range keys {
231+
b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
232+
b.AddBytes([]byte(k))
233+
})
234+
b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
235+
b.AddBytes(data[k])
236+
})
237+
}
238+
239+
hashData, err := b.Bytes()
229240
if err != nil {
230241
return "", err
231242
}
232-
sha := hasher.Sum(nil)
233-
return fmt.Sprintf("%x", sha), nil
243+
244+
return fmt.Sprintf("%x", sha256.Sum256(hashData)), nil
234245
}

0 commit comments

Comments
 (0)