diff --git a/fileTransfer/send_test.go b/fileTransfer/send_test.go index f63ebbac224ce3ebd90e074444db3b89c8163232..2e3d3d16d8325be32ba975decb14b3af41f57636 100644 --- a/fileTransfer/send_test.go +++ b/fileTransfer/send_test.go @@ -662,20 +662,20 @@ func TestManager_newCmixMessage(t *testing.T) { "\nexpected: %s\nrecieved: %s", fp, cmixMsg.GetKeyFP()) } - partMsg, err := ftStorage.UnmarshalPartMessage(cmixMsg.GetContents()) + decrPart, err := ftCrypto.DecryptPart(key, cmixMsg.GetContents(), + cmixMsg.GetMac(), 0,cmixMsg.GetKeyFP()) if err != nil { - t.Errorf("Failed to unmarshal part message: %+v", err) + t.Errorf("Failed to decrypt file part: %+v", err) } - decrPart, err := ftCrypto.DecryptPart(key, partMsg.GetPart(), - cmixMsg.GetMac(), partMsg.GetPartNum(),cmixMsg.GetKeyFP()) + partMsg, err := ftStorage.UnmarshalPartMessage(decrPart) if err != nil { - t.Errorf("Failed to decrypt file part: %+v", err) + t.Errorf("Failed to unmarshal part message: %+v", err) } - if !bytes.Equal(decrPart, parts[0]) { + if !bytes.Equal(partMsg.GetPart(), parts[0]) { t.Errorf("Decrypted part does not match expected."+ - "\nexpected: %q\nreceived: %q", parts[0], decrPart) + "\nexpected: %q\nreceived: %q", parts[0], partMsg.GetPart()) } } diff --git a/go.mod b/go.mod index 9d46000c2b3af6cf3edae92ce047c50927524ac5..bdf25bafb72f034150c214017f2053a800817ac1 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 gitlab.com/elixxir/comms v0.0.4-0.20220104174855-044783c5c1e6 - gitlab.com/elixxir/crypto v0.0.7-0.20220108174805-4eafed0c4ff7 + gitlab.com/elixxir/crypto v0.0.7-0.20220108181613-7e3f9b9e7434 gitlab.com/elixxir/ekv v0.1.6 gitlab.com/elixxir/primitives v0.0.3-0.20220104173924-275cb9d7834f gitlab.com/xx_network/comms v0.0.4-0.20211227194445-c099754b3cda diff --git a/go.sum b/go.sum index 4b704150ccf672d79511ac4a4d311d4f611dc6d0..87637052d5f9659571e293559448b8c20c588fed 100644 --- a/go.sum +++ b/go.sum @@ -281,6 +281,8 @@ gitlab.com/elixxir/crypto v0.0.7-0.20220108004933-8da1344a8e69 h1:MweUKTjmKvTxWs gitlab.com/elixxir/crypto v0.0.7-0.20220108004933-8da1344a8e69/go.mod h1:qmW0OGPB21GcaGg1Jvt527/qUw7ke6W8DKCiYBfsx48= gitlab.com/elixxir/crypto v0.0.7-0.20220108174805-4eafed0c4ff7 h1:UnJTclWu96Cj+XmxqG/H5QELl50UNKCfaJtOSPYwLFw= gitlab.com/elixxir/crypto v0.0.7-0.20220108174805-4eafed0c4ff7/go.mod h1:qmW0OGPB21GcaGg1Jvt527/qUw7ke6W8DKCiYBfsx48= +gitlab.com/elixxir/crypto v0.0.7-0.20220108181613-7e3f9b9e7434 h1:4wXhEflExxO5Dzaxmz4WqUFmoRjr3ZNJ8pFBsyRXq+c= +gitlab.com/elixxir/crypto v0.0.7-0.20220108181613-7e3f9b9e7434/go.mod h1:qmW0OGPB21GcaGg1Jvt527/qUw7ke6W8DKCiYBfsx48= gitlab.com/elixxir/ekv v0.1.5 h1:R8M1PA5zRU1HVnTyrtwybdABh7gUJSCvt1JZwUSeTzk= gitlab.com/elixxir/ekv v0.1.5/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/ekv v0.1.6 h1:M2hUSNhH/ChxDd+s8xBqSEKgoPtmE6hOEBqQ73KbN6A= diff --git a/storage/fileTransfer/partStore_test.go b/storage/fileTransfer/partStore_test.go index 5e3eabae208b88c8bfed5c2131727939c7c448e7..597fea4b20a6871cf44310e97cbd3c4f06c8aa59 100644 --- a/storage/fileTransfer/partStore_test.go +++ b/storage/fileTransfer/partStore_test.go @@ -12,6 +12,7 @@ import ( "encoding/binary" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/format" "io" "math/rand" "reflect" @@ -521,7 +522,10 @@ func Test_makePartsKey_consistency(t *testing.T) { func newRandomPartStore(numParts uint16, kv *versioned.KV, prng io.Reader, t *testing.T) (*partStore, []byte) { - partSize := 64 + cmixMsg := format.NewMessage(format.MinimumPrimeSize) + + partData, _ := NewPartMessage(cmixMsg.ContentsSize()) + partSize := partData.GetPartSize() ps, err := newPartStore(kv, numParts) if err != nil { diff --git a/storage/fileTransfer/receiveTransfer.go b/storage/fileTransfer/receiveTransfer.go index b3e387a750d4cb6ba398c28195add01ec5b5763e..0d2f638d81d684d9ff7b3eca3505a6c8af3eceb0 100644 --- a/storage/fileTransfer/receiveTransfer.go +++ b/storage/fileTransfer/receiveTransfer.go @@ -10,6 +10,7 @@ package fileTransfer import ( "bytes" "encoding/binary" + "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces" @@ -328,6 +329,8 @@ func (rt *ReceivedTransfer) GetFile() ([]byte, error) { // Remove extra data added when sending as parts fileData = fileData[:rt.fileSize] + fmt.Println(fileData) + if !ftCrypto.VerifyTransferMAC(fileData, rt.key, rt.transferMAC) { return fileData, errors.New(getTransferMacErr) } diff --git a/storage/fileTransfer/sentTransfer_test.go b/storage/fileTransfer/sentTransfer_test.go index 0885552c781c5f70accd1c6c0a1a4c0f53970a87..033992bf84b42aa4bf54431ac50e3c3c0b132998 100644 --- a/storage/fileTransfer/sentTransfer_test.go +++ b/storage/fileTransfer/sentTransfer_test.go @@ -815,7 +815,7 @@ func TestSentTransfer_GetEncryptedPart(t *testing.T) { for i := uint16(0); i < st.numFps; i++ { partNum := i % st.numParts - encPart, mac, fp, err := st.GetEncryptedPart(partNum, 16) + encPart, mac, fp, err := st.GetEncryptedPart(partNum, 18) if err != nil { t.Fatalf("GetEncryptedPart returned an error for part number "+ "%d (%d): %+v", partNum, i, err) @@ -835,17 +835,24 @@ func TestSentTransfer_GetEncryptedPart(t *testing.T) { } // Attempt to decrypt the part - part, err := ftCrypto.DecryptPart(st.key, encPart, mac, fpNum[0], fp) + partMarshaled, err := ftCrypto.DecryptPart(st.key, encPart, mac, fpNum[0], fp) if err != nil { t.Errorf("Failed to decrypt file part number %d (%d): %+v", partNum, i, err) } + partMsg, _ := UnmarshalPartMessage(partMarshaled) + // Make sure the decrypted part matches the original expectedPart, _ := st.sentParts.getPart(i % st.numParts) - if !bytes.Equal(expectedPart, part) { + if !bytes.Equal(expectedPart, partMsg.GetPart()) { t.Errorf("Decyrpted part number %d does not match expected (%d)."+ - "\nexpected: %+v\nreceived: %+v", partNum, i, expectedPart, part) + "\nexpected: %+v\nreceived: %+v", partNum, i, expectedPart, partMsg.GetPart()) + } + + if partMsg.GetPartNum()!=i % st.numParts{ + t.Errorf("Number of part did not match, expected: %d, " + + "received: %d", i % st.numParts, partMsg.GetPartNum()) } } } @@ -876,7 +883,7 @@ func TestSentTransfer_GetEncryptedPart_NoFingerprintsError(t *testing.T) { // Use up all the fingerprints for i := uint16(0); i < st.numFps; i++ { partNum := i % st.numParts - _, _, _, err := st.GetEncryptedPart(partNum, 16) + _, _, _, err := st.GetEncryptedPart(partNum, 18) if err != nil { t.Errorf("Error when encyrpting part number %d (%d): %+v", partNum, i, err) @@ -884,7 +891,7 @@ func TestSentTransfer_GetEncryptedPart_NoFingerprintsError(t *testing.T) { } // Try to encrypt without any fingerprints - _, _, _, err := st.GetEncryptedPart(5, 16) + _, _, _, err := st.GetEncryptedPart(5, 18) if err != MaxRetriesErr { t.Errorf("GetEncryptedPart did not return MaxRetriesErr when all "+ "fingerprints have been used.\nexpected: %s\nreceived: %+v", @@ -892,31 +899,6 @@ func TestSentTransfer_GetEncryptedPart_NoFingerprintsError(t *testing.T) { } } -// Error path: tests that SentTransfer.GetEncryptedPart returns the expected -// error when encrypting the part fails due to a PRNG error. -func TestSentTransfer_GetEncryptedPart_EncryptPartError(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) - _, st := newRandomSentTransfer(16, 24, kv, t) - - // Create and fill fingerprint map used to check fingerprint validity - // The first item in the uint16 slice is the fingerprint number and the - // second item is the number of times it has been used - fpMap := make(map[format.Fingerprint][]uint16, st.numFps) - for num, fp := range ftCrypto.GenerateFingerprints(st.key, st.numFps) { - fpMap[fp] = []uint16{uint16(num), 0} - } - - partNum := uint16(0) - expectedErr := fmt.Sprintf(encryptPartErr, partNum, "") - - _, _, _, err := st.GetEncryptedPart(partNum, 16) - if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("GetEncryptedPart did not return the expected error when "+ - "the PRNG should have errored.\nexpected: %s\nreceived: %+v", - expectedErr, err) - } -} - // Tests that SentTransfer.SetInProgress correctly adds the part numbers for the // given round ID to the in-progress map and sets the correct parts as // in-progress in the state vector.