@@ -23,15 +23,16 @@ import (
23
23
"crypto/x509"
24
24
"encoding/pem"
25
25
"fmt"
26
- "io "
26
+ "math "
27
27
"os"
28
- "sort"
29
28
"strings"
30
29
31
30
secretsstorev1 "sigs.k8s.io/secrets-store-csi-driver/apis/v1"
32
31
32
+ "golang.org/x/crypto/cryptobyte"
33
33
"golang.org/x/crypto/pkcs12"
34
34
corev1 "k8s.io/api/core/v1"
35
+ "k8s.io/apimachinery/pkg/util/sets"
35
36
)
36
37
37
38
const (
@@ -217,23 +218,33 @@ func GetSecretData(secretObjData []*secretsstorev1.SecretObjectData, secretType
217
218
218
219
// GetSHAFromSecret gets SHA for the secret data
219
220
func GetSHAFromSecret (data map [string ][]byte ) (string , error ) {
220
- var values []string
221
- for k , v := range data {
222
- values = append (values , k + "=" + string (v ))
223
- }
224
- // sort the values to always obtain a deterministic SHA for
225
- // same content in different order
226
- sort .Strings (values )
227
- return generateSHA (strings .Join (values , ";" ))
228
- }
221
+ if len (data ) == 0 {
222
+ return "" , nil
223
+ }
224
+
225
+ b := cryptobyte .NewBuilder (nil )
226
+ if len (data ) > math .MaxUint32 {
227
+ return "" , fmt .Errorf ("data too large: length exceeds uint32 max" )
228
+ }
229
+ // we are checking the length of the data to be less than uint32 max
230
+ // so we can safely cast it to uint32 without worrying about overflow
231
+ b .AddUint32 (uint32 (len (data ))) // nolint:gosec
229
232
230
- // generateSHA generates SHA from string
231
- func generateSHA (data string ) (string , error ) {
232
- hasher := sha256 .New ()
233
- _ , err := io .WriteString (hasher , data )
233
+ keys := sets .StringKeySet (data ).List ()
234
+
235
+ for _ , k := range keys {
236
+ b .AddUint16LengthPrefixed (func (b * cryptobyte.Builder ) {
237
+ b .AddBytes ([]byte (k ))
238
+ })
239
+ b .AddUint16LengthPrefixed (func (b * cryptobyte.Builder ) {
240
+ b .AddBytes (data [k ])
241
+ })
242
+ }
243
+
244
+ hashData , err := b .Bytes ()
234
245
if err != nil {
235
246
return "" , err
236
247
}
237
- sha := hasher . Sum ( nil )
238
- return fmt .Sprintf ("%x" , sha ), nil
248
+
249
+ return fmt .Sprintf ("%x" , sha256 . Sum256 ( hashData ) ), nil
239
250
}
0 commit comments