Skip to content

Commit 2ed8aba

Browse files
authoredJul 24, 2024··
951 potentially insecure hkdf use (#972)
Closes #951.
2 parents b7bc216 + 6aff768 commit 2ed8aba

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed
 

‎.golangci.yml

+2-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ run:
1212
# output configuration options
1313
output:
1414
# colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
15-
format: tab
15+
formats:
16+
- format: tab
1617

1718
# all available settings of specific linters
1819
linters-settings:
@@ -21,9 +22,6 @@ linters-settings:
2122
# 'default' case is present, even if all enum members aren't listed in the
2223
# switch
2324
default-signifies-exhaustive: true
24-
govet:
25-
# report about shadowed variables
26-
check-shadowing: false
2725

2826
linters:
2927
enable:

‎creds/accessbox/accessbox.go

+26-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"crypto/rand"
88
"crypto/sha256"
99
"encoding/hex"
10+
"errors"
1011
"fmt"
1112
"io"
1213

@@ -19,6 +20,14 @@ import (
1920
"google.golang.org/protobuf/proto"
2021
)
2122

23+
const (
24+
hkdfSaltLength = 16
25+
)
26+
27+
var (
28+
hkdfInfo = []byte("neofs-s3-gw")
29+
)
30+
2231
// Box represents friendly AccessBox.
2332
type Box struct {
2433
Gate *GateData
@@ -257,16 +266,21 @@ func generateShared256(prv *keys.PrivateKey, pub *keys.PublicKey) (sk []byte, er
257266
return sk, nil
258267
}
259268

260-
func deriveKey(secret []byte) ([]byte, error) {
269+
func deriveKey(secret []byte, hkdfSalt []byte) ([]byte, error) {
261270
hash := sha256.New
262-
kdf := hkdf.New(hash, secret, nil, nil)
271+
kdf := hkdf.New(hash, secret, hkdfSalt, hkdfInfo)
263272
key := make([]byte, 32)
264273
_, err := io.ReadFull(kdf, key)
265274
return key, err
266275
}
267276

268277
func encrypt(owner *keys.PrivateKey, sender *keys.PublicKey, data []byte) ([]byte, error) {
269-
enc, err := getCipher(owner, sender)
278+
hkdfSalt := make([]byte, hkdfSaltLength)
279+
if _, err := rand.Read(hkdfSalt); err != nil {
280+
return nil, fmt.Errorf("generate hkdf salt: %w", err)
281+
}
282+
283+
enc, err := getCipher(owner, sender, hkdfSalt)
270284
if err != nil {
271285
return nil, fmt.Errorf("get chiper: %w", err)
272286
}
@@ -276,14 +290,19 @@ func encrypt(owner *keys.PrivateKey, sender *keys.PublicKey, data []byte) ([]byt
276290
return nil, fmt.Errorf("generate random nonce: %w", err)
277291
}
278292

279-
return enc.Seal(nonce, nonce, data, nil), nil
293+
return append(hkdfSalt, enc.Seal(nonce, nonce, data, nil)...), nil
280294
}
281295

282296
func decrypt(owner *keys.PrivateKey, sender *keys.PublicKey, data []byte) ([]byte, error) {
283-
dec, err := getCipher(owner, sender)
297+
if len(data) < hkdfSaltLength {
298+
return nil, errors.New("invalid data length")
299+
}
300+
301+
dec, err := getCipher(owner, sender, data[:hkdfSaltLength])
284302
if err != nil {
285303
return nil, fmt.Errorf("get chiper: %w", err)
286304
}
305+
data = data[hkdfSaltLength:]
287306

288307
if ld, ns := len(data), dec.NonceSize(); ld < ns {
289308
return nil, fmt.Errorf("wrong data size (%d), should be greater than %d", ld, ns)
@@ -293,13 +312,13 @@ func decrypt(owner *keys.PrivateKey, sender *keys.PublicKey, data []byte) ([]byt
293312
return dec.Open(nil, nonce, cypher, nil)
294313
}
295314

296-
func getCipher(owner *keys.PrivateKey, sender *keys.PublicKey) (cipher.AEAD, error) {
315+
func getCipher(owner *keys.PrivateKey, sender *keys.PublicKey, hkdfSalt []byte) (cipher.AEAD, error) {
297316
secret, err := generateShared256(owner, sender)
298317
if err != nil {
299318
return nil, fmt.Errorf("generate shared key: %w", err)
300319
}
301320

302-
key, err := deriveKey(secret)
321+
key, err := deriveKey(secret, hkdfSalt)
303322
if err != nil {
304323
return nil, fmt.Errorf("derive key: %w", err)
305324
}

0 commit comments

Comments
 (0)
Please sign in to comment.