go-passwd/utils_test.go

171 lines
4.5 KiB
Go

package passwd
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestBase64(t *testing.T) {
tests := []struct {
name string
input []byte
}{
{"Empty", []byte{}},
{"1 byte", []byte{'A'}},
{"2 bytes", []byte{1, 2}},
{"3 bytes", []byte{'A', 'B', 'C'}},
{"4 bytes", []byte{'A', 'B', 'C', 'D'}},
{"5 bytes", []byte{1, 2, 3, 4, 5}},
{"16 bytes", []byte{140, 150, 169, 113, 54, 237, 5, 115, 223, 241, 60, 27, 242, 218, 42, 110}},
{"11 bytes", make([]byte, 11)},
{"SHA1 style 20 bytes", make([]byte, 20)},
{"Hello (5 bytes)", []byte("hello")},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := Base64Encode(tc.input)
if len(encoded) == 0 && len(tc.input) > 0 {
t.Logf("Skipping validation for lossy encode")
return
}
decoded, err := Base64Decode(encoded)
require.NoError(t, err, "Base64Decode should not return an error for valid input")
reEncoded := Base64Encode(decoded)
assert.Equal(t, string(encoded), string(reEncoded), "Round-trip failed")
})
}
t.Run("Invalid", func(t *testing.T) {
invalidInputs := []string{
"::::", // Invalid character ':'
"abcde", // Invalid length (5 % 4 == 1)
}
for _, input := range invalidInputs {
_, err := Base64Decode([]byte(input))
assert.Error(t, err, "Expected error for invalid input: %s", input)
}
})
}
func TestMD5Base64(t *testing.T) {
tests := []struct {
name string
input []byte
}{
{"All Zeros", make([]byte, 16)},
{"Sequence", []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}},
{"Randomish", []byte{0xde, 0xad, 0xbe, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0xaa, 0xbb, 0xcc, 0xdd}},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := MD5Base64Encode(tc.input)
decoded, err := MD5Base64Decode(encoded)
require.NoError(t, err)
assert.Equal(t, tc.input, decoded, "Round-trip failed")
})
}
t.Run("Invalid", func(t *testing.T) {
_, err := MD5Base64Decode([]byte("too short"))
assert.Error(t, err)
})
}
func TestBase64Rotate(t *testing.T) {
tests := []struct {
name string
input []byte
order bool
}{
{"SHA256 order false", make([]byte, 32), false},
{"SHA512 order false", make([]byte, 64), false},
{"Sequence 32 false", []byte{0, 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}, false},
{"Sequence 32 true", []byte{0, 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}, true},
{"Small 4 false", []byte{1, 2, 3, 4}, false},
{"Small 5 false", []byte{1, 2, 3, 4, 5}, false},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := Base64RotateEncode(tc.input, tc.order)
decoded, err := Base64RotateDecode(encoded, tc.order)
require.NoError(t, err)
assert.Equal(t, tc.input, decoded, "Round-trip failed")
})
}
}
func TestBCryptBase64(t *testing.T) {
tests := []struct {
name string
input []byte
}{
{"Empty", []byte{}},
{"Short", []byte{1, 2, 3}},
{"Bcrypt Salt", make([]byte, 16)},
{"Randomish", []byte("this is a test for bcrypt base64")},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := BCryptBase64Encode(tc.input)
decoded, err := BCryptBase64Decode(encoded)
require.NoError(t, err)
assert.Equal(t, tc.input, decoded, "Round-trip failed")
})
}
t.Run("Invalid", func(t *testing.T) {
_, err := BCryptBase64Decode([]byte("invalid!"))
assert.Error(t, err)
})
}
func TestSCryptBase64(t *testing.T) {
tests := []struct {
name string
input []byte
}{
{"Empty", []byte{}},
{"Short", []byte{1, 2, 3}},
{"Scrypt Data", make([]byte, 32)},
{"Randomish", []byte("scrypt base64 should handle any data")},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := SCryptBase64Encode(tc.input)
decoded := SCryptBase64Decode(encoded)
assert.Equal(t, tc.input, decoded, "Round-trip failed")
})
}
}
func TestBase64Uint32(t *testing.T) {
tests := []struct {
name string
value uint32
bits uint32
}{
{"Small 6 bits", 42, 6},
{"Medium 12 bits", 1234, 12},
{"Large 24 bits", 0xABCDEF, 24},
{"Full 32 bits", 0xFFFFFFFF, 32},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
encoded := Base64Uint32Encode(tc.value, tc.bits)
decoded := Base64Uint32Decode(encoded, tc.bits)
assert.Equal(t, tc.value, decoded, "Round-trip failed")
})
}
}