@@ -30,6 +30,7 @@ import (
30
30
"compress/gzip"
31
31
"crypto/rand"
32
32
"crypto/sha1"
33
+ "crypto/sha256"
33
34
"encoding"
34
35
"encoding/binary"
35
36
"encoding/gob"
@@ -62,6 +63,7 @@ const (
62
63
optEncrypted = 0x10
63
64
optCompressed = 0x20
64
65
optPadded = 0x40
66
+ optSHA256 = 0x80
65
67
)
66
68
67
69
var (
@@ -342,7 +344,11 @@ func (s *Storage) OpenManyForUpdate(files []string, objects interface{}) (func(c
342
344
}, nil
343
345
}
344
346
345
- func context (s string ) []byte {
347
+ func context (s string , useSHA2 bool ) []byte {
348
+ if useSHA2 {
349
+ h := sha256 .Sum256 ([]byte (s ))
350
+ return h [:]
351
+ }
346
352
h := sha1 .Sum ([]byte (s ))
347
353
return h [:]
348
354
}
@@ -363,6 +369,7 @@ func (s *Storage) ReadDataFile(filename string, obj interface{}) error {
363
369
return errors .New ("wrong file type" )
364
370
}
365
371
flags := hdr [4 ]
372
+ useSHA2 := flags & optSHA256 != 0
366
373
if flags & optEncrypted != 0 && s .masterKey == nil {
367
374
return errors .New ("file is encrypted, but a master key was not provided" )
368
375
}
@@ -376,7 +383,7 @@ func (s *Storage) ReadDataFile(filename string, obj interface{}) error {
376
383
}
377
384
defer k .Wipe ()
378
385
// Use the file key to decrypt the rest of the file.
379
- if r , err = k .StartReader (context (filename ), f ); err != nil {
386
+ if r , err = k .StartReader (context (filename , useSHA2 ), f ); err != nil {
380
387
return err
381
388
}
382
389
// Read the header again.
@@ -463,7 +470,7 @@ func (s *Storage) ReadDataFile(filename string, obj interface{}) error {
463
470
// SaveDataFile atomically replace an object in a file.
464
471
func (s * Storage ) SaveDataFile (filename string , obj interface {}) error {
465
472
t := fmt .Sprintf ("%s.tmp-%d" , filename , time .Now ().UnixNano ())
466
- if err := s .writeFile (context (filename ), t , obj ); err != nil {
473
+ if err := s .writeFile (context (filename , true ), t , obj ); err != nil {
467
474
return err
468
475
}
469
476
// Atomically replace the file.
@@ -472,7 +479,7 @@ func (s *Storage) SaveDataFile(filename string, obj interface{}) error {
472
479
473
480
// CreateEmptyFile creates an empty file.
474
481
func (s * Storage ) CreateEmptyFile (filename string , empty interface {}) error {
475
- return s .writeFile (context (filename ), filename , empty )
482
+ return s .writeFile (context (filename , true ), filename , empty )
476
483
}
477
484
478
485
// writeFile writes obj to a file.
@@ -482,15 +489,15 @@ func (s *Storage) writeFile(ctx []byte, filename string, obj interface{}) (retEr
482
489
return err
483
490
}
484
491
485
- var flags byte
492
+ flags := byte ( optSHA256 )
486
493
if _ , ok := obj .(encoding.BinaryMarshaler ); ok {
487
- flags = optBinaryEncoded
494
+ flags | = optBinaryEncoded
488
495
} else if _ , ok := obj .(* []byte ); ok {
489
- flags = optRawBytes
496
+ flags | = optRawBytes
490
497
} else if s .useGOB {
491
- flags = optGOBEncoded
498
+ flags | = optGOBEncoded
492
499
} else {
493
- flags = optJSONEncoded
500
+ flags | = optJSONEncoded
494
501
}
495
502
if s .masterKey != nil {
496
503
flags |= optEncrypted
@@ -563,12 +570,12 @@ func (s *Storage) OpenBlobWrite(writeFileName, finalFileName string) (io.WriteCl
563
570
if err := createParentIfNotExist (fn ); err != nil {
564
571
return nil , err
565
572
}
566
- var flags byte = optRawBytes
573
+ var flags byte = optRawBytes | optSHA256
567
574
if s .masterKey != nil {
568
575
flags |= optEncrypted
569
576
flags |= optPadded
570
577
}
571
- return s .openWriteStream (context (finalFileName ), fn , flags , 1024 * 1024 )
578
+ return s .openWriteStream (context (finalFileName , true ), fn , flags , 1024 * 1024 )
572
579
}
573
580
574
581
// OpenBlobRead opens a blob file for reading.
@@ -591,6 +598,7 @@ func (s *Storage) OpenBlobRead(filename string) (stream io.ReadSeekCloser, retEr
591
598
return nil , errors .New ("wrong file type" )
592
599
}
593
600
flags := hdr [4 ]
601
+ useSHA2 := flags & optSHA256 != 0
594
602
if flags & optRawBytes == 0 {
595
603
return nil , errors .New ("blob files is not raw bytes" )
596
604
}
@@ -610,7 +618,7 @@ func (s *Storage) OpenBlobRead(filename string) (stream io.ReadSeekCloser, retEr
610
618
}
611
619
defer k .Wipe ()
612
620
// Use the file key to decrypt the rest of the file.
613
- if r , err = k .StartReader (context (filename ), f ); err != nil {
621
+ if r , err = k .StartReader (context (filename , useSHA2 ), f ); err != nil {
614
622
return nil , err
615
623
}
616
624
// Read the header again.
0 commit comments