7
7
"crypto/rand"
8
8
"crypto/sha256"
9
9
"encoding/hex"
10
+ "errors"
10
11
"fmt"
11
12
"io"
12
13
@@ -19,6 +20,14 @@ import (
19
20
"google.golang.org/protobuf/proto"
20
21
)
21
22
23
+ const (
24
+ hkdfSaltLength = 16
25
+ )
26
+
27
+ var (
28
+ hkdfInfo = []byte ("neofs-s3-gw" )
29
+ )
30
+
22
31
// Box represents friendly AccessBox.
23
32
type Box struct {
24
33
Gate * GateData
@@ -257,16 +266,21 @@ func generateShared256(prv *keys.PrivateKey, pub *keys.PublicKey) (sk []byte, er
257
266
return sk , nil
258
267
}
259
268
260
- func deriveKey (secret []byte ) ([]byte , error ) {
269
+ func deriveKey (secret []byte , hkdfSalt [] byte ) ([]byte , error ) {
261
270
hash := sha256 .New
262
- kdf := hkdf .New (hash , secret , nil , nil )
271
+ kdf := hkdf .New (hash , secret , hkdfSalt , hkdfInfo )
263
272
key := make ([]byte , 32 )
264
273
_ , err := io .ReadFull (kdf , key )
265
274
return key , err
266
275
}
267
276
268
277
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 )
270
284
if err != nil {
271
285
return nil , fmt .Errorf ("get chiper: %w" , err )
272
286
}
@@ -276,14 +290,19 @@ func encrypt(owner *keys.PrivateKey, sender *keys.PublicKey, data []byte) ([]byt
276
290
return nil , fmt .Errorf ("generate random nonce: %w" , err )
277
291
}
278
292
279
- return enc .Seal (nonce , nonce , data , nil ), nil
293
+ return append ( hkdfSalt , enc .Seal (nonce , nonce , data , nil ) ... ), nil
280
294
}
281
295
282
296
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 ])
284
302
if err != nil {
285
303
return nil , fmt .Errorf ("get chiper: %w" , err )
286
304
}
305
+ data = data [hkdfSaltLength :]
287
306
288
307
if ld , ns := len (data ), dec .NonceSize (); ld < ns {
289
308
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
293
312
return dec .Open (nil , nonce , cypher , nil )
294
313
}
295
314
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 ) {
297
316
secret , err := generateShared256 (owner , sender )
298
317
if err != nil {
299
318
return nil , fmt .Errorf ("generate shared key: %w" , err )
300
319
}
301
320
302
- key , err := deriveKey (secret )
321
+ key , err := deriveKey (secret , hkdfSalt )
303
322
if err != nil {
304
323
return nil , fmt .Errorf ("derive key: %w" , err )
305
324
}
0 commit comments