@@ -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
214215func 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