github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/kbfscrypto/pad_test.go (about) 1 // Copyright 2016 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package kbfscrypto 6 7 import ( 8 "bytes" 9 "testing" 10 "testing/quick" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 // Test padding of blocks results in a larger block, with length 16 // equal to power of 2 + 4. 17 func TestBlockPadding(t *testing.T) { 18 f := func(b []byte) bool { 19 padded, err := PadBlock(b) 20 if err != nil { 21 t.Logf("padBlock err: %s", err) 22 return false 23 } 24 n := len(padded) 25 if n <= len(b) { 26 t.Logf("padBlock padded block len %d <= input block len %d", n, len(b)) 27 return false 28 } 29 // len of slice without uint32 prefix: 30 h := n - 4 31 if h&(h-1) != 0 { 32 t.Logf("padBlock padded block len %d not a power of 2", h) 33 return false 34 } 35 return true 36 } 37 38 err := quick.Check(f, nil) 39 require.NoError(t, err) 40 } 41 42 // Tests padding -> depadding results in same block data. 43 func TestBlockDepadding(t *testing.T) { 44 f := func(b []byte) bool { 45 padded, err := PadBlock(b) 46 if err != nil { 47 t.Logf("padBlock err: %s", err) 48 return false 49 } 50 depadded, err := DepadBlock(padded) 51 if err != nil { 52 t.Logf("depadBlock err: %s", err) 53 return false 54 } 55 if !bytes.Equal(b, depadded) { 56 return false 57 } 58 return true 59 } 60 61 err := quick.Check(f, nil) 62 require.NoError(t, err) 63 } 64 65 // Test padding of blocks results in blocks at least 2^8. 66 func TestBlockPadMinimum(t *testing.T) { 67 for i := 0; i < 256; i++ { 68 b := make([]byte, i) 69 err := RandRead(b) 70 require.NoError(t, err) 71 padded, err := PadBlock(b) 72 require.NoError(t, err) 73 require.Equal(t, 260, len(padded)) 74 } 75 }