aboutsummaryrefslogtreecommitdiff
path: root/internal/contentenc/offsets_test.go
blob: 4bc37628877c1f0b716f04f311b0473a2341c67e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package contentenc

import (
	"fmt"
	"testing"

	"github.com/rfjakob/gocryptfs/internal/cryptocore"
)

// TestSizeToSize tests CipherSizeToPlainSize and PlainSizeToCipherSize
func TestSizeToSize(t *testing.T) {
	key := make([]byte, cryptocore.KeyLen)
	cc := cryptocore.New(key, cryptocore.BackendGoGCM, DefaultIVBits, true, false)
	ce := New(cc, DefaultBS, false)

	const rangeMax = 10000

	var c2p [rangeMax]uint64
	var p2c [rangeMax]uint64

	// Calculate values
	for i := range c2p {
		c2p[i] = ce.CipherSizeToPlainSize(uint64(i))
		p2c[i] = ce.PlainSizeToCipherSize(uint64(i))
	}

	// Print data table
	fmt.Print("x\tToPlainSize\tToCipherSize\n")
	for i := range c2p {
		if i > 1 && i < rangeMax-1 {
			// If the point before has value-1 and the point after has value+1,
			// it is not interesting. Don't print it out.
			if c2p[i] == c2p[i-1]+1 && p2c[i] == p2c[i-1]+1 && c2p[i+1] == c2p[i]+1 && p2c[i+1] == p2c[i]+1 {
				continue
			}
		}
		fmt.Printf("%d\t%d\t%d\n", i, c2p[i], p2c[i])
	}

	// Monotonicity check
	for i := range c2p {
		if i < 1 {
			continue
		}
		if c2p[i-1] > c2p[i] {
			t.Errorf("error: c2p is non-monotonic: c2p[%d]=%d c2p[%d]=%d ", i-1, c2p[i-1], i, c2p[i])
		}
		if p2c[i-1] > p2c[i] {
			t.Errorf("error: p2c is non-monotonic: p2c[%d]=%d p2c[%d]=%d ", i-1, p2c[i-1], i, p2c[i])
		}
	}
}