Skip to content

Commit c7ab51e

Browse files
committed
padding 调整
1 parent 53ad0f5 commit c7ab51e

File tree

2 files changed

+163
-38
lines changed

2 files changed

+163
-38
lines changed

bytes/padding/padding.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ type Zero struct{}
3131
// Pad pads some bytes to the byte slice in zero way.
3232
func (Zero) Pad(data []byte, blockSize int) []byte {
3333
padding := blockSize - (len(data) % blockSize)
34+
if padding == blockSize {
35+
return data
36+
}
37+
3438
for i := 0; i < padding; i++ {
3539
data = append(data, 0)
3640
}
@@ -40,21 +44,12 @@ func (Zero) Pad(data []byte, blockSize int) []byte {
4044

4145
// Unpad unpads some bytes from the byte slice in zero way.
4246
func (Zero) Unpad(data []byte, blockSize int) ([]byte, error) {
43-
length := len(data)
44-
45-
var i int
46-
for i = length; i > 0; i-- {
47-
if data[i-1] != 0 {
48-
break
49-
}
50-
51-
// Remove block size of byte slice at most.
52-
if length-i >= blockSize {
53-
break
54-
}
47+
index := len(data)
48+
for index > 0 && data[index-1] == 0 {
49+
index--
5550
}
5651

57-
return data[:i], nil
52+
return data[:index], nil
5853
}
5954

6055
type PKCS5 struct{}

bytes/padding/padding_test.go

Lines changed: 155 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ type testCase struct {
1414
PaddingData []byte
1515
}
1616

17-
func testPadding(t *testing.T, padding Padding, testCases []testCase) {
18-
blockSize := 8
19-
17+
func testPadding(t *testing.T, blockSize int, padding Padding, testCases []testCase) {
2018
for _, testCase := range testCases {
2119
got := padding.Pad(testCase.Data, blockSize)
2220
want := testCase.PaddingData
2321

2422
if !slices.Equal(got, want) {
25-
t.Fatalf("got %+v != want %+v", got, want)
23+
t.Fatalf("data %+v: got %+v != want %+v", testCase.Data, got, want)
2624
}
2725

2826
got, err := padding.Unpad(got, blockSize)
@@ -32,55 +30,187 @@ func testPadding(t *testing.T, padding Padding, testCases []testCase) {
3230

3331
want = testCase.Data
3432
if !slices.Equal(got, want) {
35-
t.Fatalf("got %+v != want %+v", got, want)
33+
t.Fatalf("data %+v: got %+v != want %+v", testCase.Data, got, want)
3634
}
3735
}
3836
}
3937

4038
// go test -v -cover -run=^TestNone$
4139
func TestNone(t *testing.T) {
4240
testCases := []testCase{
43-
{Data: []byte{}, PaddingData: []byte{}},
44-
{Data: []byte{1, 2, 3, 4, 5}, PaddingData: []byte{1, 2, 3, 4, 5}},
45-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8}},
46-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0}},
41+
{
42+
Data: []byte{},
43+
PaddingData: []byte{},
44+
},
45+
{
46+
Data: []byte{1, 2, 3, 4, 5},
47+
PaddingData: []byte{1, 2, 3, 4, 5},
48+
},
49+
{
50+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
51+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8},
52+
},
53+
{
54+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
55+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
56+
},
57+
}
58+
59+
testPadding(t, 8, None{}, testCases)
60+
61+
testCases = []testCase{
62+
{
63+
Data: []byte{},
64+
PaddingData: []byte{},
65+
},
66+
{
67+
Data: []byte{1, 2, 3, 4, 5},
68+
PaddingData: []byte{1, 2, 3, 4, 5},
69+
},
70+
{
71+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
72+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8},
73+
},
74+
{
75+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
76+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
77+
},
4778
}
4879

49-
testPadding(t, None{}, testCases)
80+
testPadding(t, 16, None{}, testCases)
5081
}
5182

5283
// go test -v -cover -run=^TestZero$
5384
func TestZero(t *testing.T) {
5485
testCases := []testCase{
55-
{Data: []byte{}, PaddingData: []byte{0, 0, 0, 0, 0, 0, 0, 0}},
56-
{Data: []byte{1, 2, 3, 4, 5}, PaddingData: []byte{1, 2, 3, 4, 5, 0, 0, 0}},
57-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0}},
58-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
86+
{
87+
Data: []byte{},
88+
PaddingData: []byte{},
89+
},
90+
{
91+
Data: []byte{1, 2, 3, 4, 5},
92+
PaddingData: []byte{1, 2, 3, 4, 5, 0, 0, 0},
93+
},
94+
{
95+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
96+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8},
97+
},
98+
{
99+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
100+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
101+
},
102+
}
103+
104+
testPadding(t, 8, Zero{}, testCases)
105+
106+
testCases = []testCase{
107+
{
108+
Data: []byte{},
109+
PaddingData: []byte{},
110+
},
111+
{
112+
Data: []byte{1, 2, 3, 4, 5},
113+
PaddingData: []byte{1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
114+
},
115+
{
116+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
117+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
118+
},
119+
{
120+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
121+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
122+
},
59123
}
60124

61-
testPadding(t, Zero{}, testCases)
125+
testPadding(t, 16, Zero{}, testCases)
62126
}
63127

64128
// go test -v -cover -run=^TestPKCS5$
65129
func TestPKCS5(t *testing.T) {
66130
testCases := []testCase{
67-
{Data: []byte{}, PaddingData: []byte{8, 8, 8, 8, 8, 8, 8, 8}},
68-
{Data: []byte{1, 2, 3, 4, 5}, PaddingData: []byte{1, 2, 3, 4, 5, 3, 3, 3}},
69-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8}},
70-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}},
131+
{
132+
Data: []byte{},
133+
PaddingData: []byte{8, 8, 8, 8, 8, 8, 8, 8},
134+
},
135+
{
136+
Data: []byte{1, 2, 3, 4, 5},
137+
PaddingData: []byte{1, 2, 3, 4, 5, 3, 3, 3},
138+
},
139+
{
140+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
141+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
142+
},
143+
{
144+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
145+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8},
146+
},
71147
}
72148

73-
testPadding(t, PKCS5{}, testCases)
149+
testPadding(t, 8, PKCS5{}, testCases)
150+
151+
testCases = []testCase{
152+
{
153+
Data: []byte{},
154+
PaddingData: []byte{16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
155+
},
156+
{
157+
Data: []byte{1, 2, 3, 4, 5},
158+
PaddingData: []byte{1, 2, 3, 4, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
159+
},
160+
{
161+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
162+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
163+
},
164+
{
165+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
166+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
167+
},
168+
}
169+
170+
testPadding(t, 16, PKCS5{}, testCases)
74171
}
75172

76173
// go test -v -cover -run=^TestPKCS7$
77174
func TestPKCS7(t *testing.T) {
78175
testCases := []testCase{
79-
{Data: []byte{}, PaddingData: []byte{8, 8, 8, 8, 8, 8, 8, 8}},
80-
{Data: []byte{1, 2, 3, 4, 5}, PaddingData: []byte{1, 2, 3, 4, 5, 3, 3, 3}},
81-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8}},
82-
{Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8}, PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}},
176+
{
177+
Data: []byte{},
178+
PaddingData: []byte{8, 8, 8, 8, 8, 8, 8, 8},
179+
},
180+
{
181+
Data: []byte{1, 2, 3, 4, 5},
182+
PaddingData: []byte{1, 2, 3, 4, 5, 3, 3, 3},
183+
},
184+
{
185+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
186+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
187+
},
188+
{
189+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
190+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8},
191+
},
192+
}
193+
194+
testPadding(t, 8, PKCS7{}, testCases)
195+
196+
testCases = []testCase{
197+
{
198+
Data: []byte{},
199+
PaddingData: []byte{16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
200+
},
201+
{
202+
Data: []byte{1, 2, 3, 4, 5},
203+
PaddingData: []byte{1, 2, 3, 4, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
204+
},
205+
{
206+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8},
207+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
208+
},
209+
{
210+
Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1},
211+
PaddingData: []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
212+
},
83213
}
84214

85-
testPadding(t, PKCS7{}, testCases)
215+
testPadding(t, 16, PKCS7{}, testCases)
86216
}

0 commit comments

Comments
 (0)