Skip to content

Commit 4449f2c

Browse files
authored
Merge pull request #103 from neicnordic/del_bugfix
Bugfix; incorrect length was used to check for discarded areas
2 parents 7c6f163 + 8ec0094 commit 4449f2c

File tree

3 files changed

+93
-24
lines changed

3 files changed

+93
-24
lines changed

internal/version/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
// The version in the current branch
10-
var Version = "1.8.6"
10+
var Version = "1.8.7"
1111

1212
// If this is "" (empty string) then it means that it is a final release.
1313
// Otherwise, this is a pre-release e.g. "dev", "beta", "rc1", etc.

streaming/in.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ func (c *crypt4GHInternalReader) read(p []byte) (n int, err error) {
264264
}
265265

266266
canRead := len(p[haveRead:])
267-
remainingInBuffer := c.bufferUse - c.buffer.Len()
267+
remainingInBuffer := c.buffer.Len()
268268

269269
if remainingInBuffer < canRead {
270270
canRead = remainingInBuffer
@@ -297,9 +297,11 @@ func (c *crypt4GHInternalReader) read(p []byte) (n int, err error) {
297297
haveRead++
298298
}
299299
} else {
300-
// We can just read the rest of the buffer
300+
// Read larger chunk from buffer. As precaution, limit to what we
301+
// should be able to read only, as that is the bit we've checked
302+
// if the discard list imposes any holes in
301303

302-
r, err := c.buffer.Read(p[haveRead:])
304+
r, err := c.buffer.Read(p[haveRead : haveRead+canRead])
303305
haveRead += r
304306
c.streamPos += int64(r)
305307

streaming/streaming_test.go

Lines changed: 87 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -285,35 +285,35 @@ func TestReencryptionWithDataEditListAndDiscard(t *testing.T) {
285285
}
286286
writerPrivateKey, err := keys.ReadPrivateKey(strings.NewReader(sshEd25519SecEnc), []byte("123123"))
287287
if err != nil {
288-
t.Error(err)
288+
t.Errorf("Reading private key failed with %v", err)
289289
}
290290
readerPublicKey, err := keys.ReadPublicKey(strings.NewReader(crypt4ghX25519Pub))
291291
if err != nil {
292-
t.Error(err)
292+
t.Errorf("Reading public key failed with %v", err)
293293
}
294294
buffer := bytes.Buffer{}
295295
readerPublicKeyList := [][chacha20poly1305.KeySize]byte{}
296296
readerPublicKeyList = append(readerPublicKeyList, readerPublicKey)
297297
writer, err := NewCrypt4GHWriter(&buffer, writerPrivateKey, readerPublicKeyList, nil)
298298
if err != nil {
299-
t.Error(err)
299+
t.Errorf("Creating writer failed with %v", err)
300300
}
301301
_, err = io.Copy(writer, inFile)
302302
if err != nil {
303-
t.Error(err)
303+
t.Errorf("Copying infile to writer failed with %v", err)
304304
}
305305
err = inFile.Close()
306306
if err != nil {
307-
t.Error(err)
307+
t.Errorf("Closing infile failed with %v", err)
308308
}
309309
err = writer.Close()
310310
if err != nil {
311-
t.Error(err)
311+
t.Errorf("Closing writer failed with %v", err)
312312
}
313313

314314
readerSecretKey, err := keys.ReadPrivateKey(strings.NewReader(crypt4ghX25519Sec), []byte("password"))
315315
if err != nil {
316-
t.Error(err)
316+
t.Errorf("Reading private key failed with %v", err)
317317
}
318318
dataEditListHeaderPacket := headers.DataEditListHeaderPacket{
319319
PacketType: headers.PacketType{PacketType: headers.DataEditList},
@@ -322,54 +322,55 @@ func TestReencryptionWithDataEditListAndDiscard(t *testing.T) {
322322
}
323323
reader, err := NewCrypt4GHReader(&buffer, readerSecretKey, &dataEditListHeaderPacket)
324324
if err != nil {
325-
t.Error(err)
325+
t.Errorf("Creating reader failed with %v", err)
326326
}
327327
discarded, err := reader.Discard(toDiscard)
328328
if err != nil {
329-
t.Error(err)
329+
t.Errorf("Discarding failed with %v", err)
330330
}
331331
if discarded != toDiscard {
332-
t.Fail()
332+
t.Errorf("Discarded return doesn't match was asked for %v != %v", discarded, toDiscard)
333333
}
334334

335335
all, err := io.ReadAll(reader)
336336
if err != nil {
337-
t.Error(err)
337+
t.Errorf("Reading all from reader failed with %v", err)
338338
}
339339
inFile, err = os.Open("../test/sample.txt")
340340
if err != nil {
341-
t.Error(err)
341+
t.Errorf("Opening test sample failed with %v", err)
342342
}
343343
bufioReader := bufio.NewReader(inFile)
344344
_, err = bufioReader.Discard(950 + toDiscard)
345345
if err != nil {
346-
t.Error(err)
346+
t.Errorf("Discarding failed with %v", err)
347347
}
348348
firstLine, _, err := bufioReader.ReadLine()
349349
if err != nil {
350-
t.Error(err)
350+
t.Errorf("First Readline failed with %v", err)
351351
}
352352
_, _, err = bufioReader.ReadLine()
353353
if err != nil {
354-
t.Error(err)
354+
t.Errorf("First Skipped Readline failed with %v", err)
355355
}
356356
_, _, err = bufioReader.ReadLine()
357357
if err != nil {
358-
t.Error(err)
358+
t.Errorf("Second Skipped Readline failed with %v", err)
359359
}
360360
_, _, err = bufioReader.ReadLine()
361361
if err != nil {
362-
t.Error(err)
362+
t.Errorf("Third Skipped Readline failed with %v", err)
363363
}
364364
secondLine, _, err := bufioReader.ReadLine()
365365
if err != nil {
366-
t.Error(err)
366+
t.Errorf("Second used Readline failed with %v", err)
367367
}
368368
expectedText := strings.TrimSpace(string(firstLine) + "\n" + string(secondLine))
369369
actualText := strings.TrimSpace(string(all))
370370

371371
if !strings.EqualFold(expectedText, actualText) {
372-
t.Fail()
372+
t.Errorf("Texts didn't match: %v, %v", expectedText, actualText)
373+
373374
}
374375
}
375376

@@ -399,6 +400,72 @@ func TestGetHeader(t *testing.T) {
399400
}
400401
}
401402

403+
func TestReencryptionWithDataEditListInCrypt4GHReaderDiscardStart(t *testing.T) {
404+
inFile, err := os.Open("../test/sample.txt")
405+
if err != nil {
406+
t.Error(err)
407+
}
408+
writerPrivateKey, err := keys.ReadPrivateKey(strings.NewReader(sshEd25519SecEnc), []byte("123123"))
409+
if err != nil {
410+
t.Error(err)
411+
}
412+
readerPublicKey, err := keys.ReadPublicKey(strings.NewReader(crypt4ghX25519Pub))
413+
if err != nil {
414+
t.Error(err)
415+
}
416+
buffer := bytes.Buffer{}
417+
readerPublicKeyList := [][chacha20poly1305.KeySize]byte{}
418+
readerPublicKeyList = append(readerPublicKeyList, readerPublicKey)
419+
writer, err := NewCrypt4GHWriter(&buffer, writerPrivateKey, readerPublicKeyList, nil)
420+
if err != nil {
421+
t.Error(err)
422+
}
423+
_, err = io.Copy(writer, inFile)
424+
if err != nil {
425+
t.Error(err)
426+
}
427+
err = inFile.Close()
428+
if err != nil {
429+
t.Error(err)
430+
}
431+
err = writer.Close()
432+
if err != nil {
433+
t.Error(err)
434+
}
435+
436+
readerSecretKey, err := keys.ReadPrivateKey(strings.NewReader(crypt4ghX25519Sec), []byte("password"))
437+
if err != nil {
438+
t.Error(err)
439+
}
440+
dataEditListHeaderPacket := headers.DataEditListHeaderPacket{
441+
PacketType: headers.PacketType{PacketType: headers.DataEditList},
442+
NumberLengths: 3,
443+
Lengths: []uint64{0, 100, 300},
444+
}
445+
reader, err := NewCrypt4GHReader(&buffer, readerSecretKey, &dataEditListHeaderPacket)
446+
if err != nil {
447+
t.Error(err)
448+
}
449+
all, err := io.ReadAll(reader)
450+
if err != nil {
451+
t.Error(err)
452+
}
453+
inFile, err = os.Open("../test/sample.txt")
454+
if err != nil {
455+
t.Error(err)
456+
}
457+
inBytes, err := io.ReadAll(inFile)
458+
if err != nil {
459+
t.Error(err)
460+
}
461+
if !bytes.Equal(all[:100], inBytes[:100]) {
462+
t.Errorf("Different data before discard: %v vs %v", all[:100], inBytes[:100])
463+
}
464+
if !bytes.Equal(all[100:], inBytes[400:]) {
465+
t.Errorf("Different data after discard: %v vs %v (truncated)", all[400:500], inBytes[100:200])
466+
}
467+
}
468+
402469
func TestNewCrypt4GHWriterWithoutPrivateKey(t *testing.T) {
403470
inFile, err := os.Open("../test/sample.txt")
404471
if err != nil {
@@ -856,7 +923,7 @@ func TestSeek(t *testing.T) {
856923
t.Error(err)
857924
}
858925

859-
if r, err := writer.Write(inBytes[:70225]); err != nil || r != len(inBytes) {
926+
if r, err := writer.Write(inBytes[:70225]); err != nil || r != 70225 {
860927
t.Errorf("Problem when writing to cryptgh writer, r=%d, err=%v", r, err)
861928
}
862929

0 commit comments

Comments
 (0)