forked from lestrrat-go/jwx
-
Notifications
You must be signed in to change notification settings - Fork 1
/
padbuf.go
61 lines (47 loc) · 1.05 KB
/
padbuf.go
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
53
54
55
56
57
58
59
60
61
// Package padbuf implements a simple buffer that knows how to pad/unpad
// itself so that the buffer size aligns with an arbitrary block size.
package padbuf
import "errors"
type PadBuffer []byte
func (pb PadBuffer) Len() int {
return len(pb)
}
func (pb PadBuffer) Pad(n int) PadBuffer {
rem := n - pb.Len()%n
if rem == 0 {
return pb
}
newpb := pb.Resize(pb.Len() + rem)
pad := make([]byte, rem)
for i := 0; i < rem; i++ {
pad[i] = byte(rem)
}
copy(newpb[pb.Len():], pad)
return newpb
}
func (pb PadBuffer) Resize(newlen int) PadBuffer {
if pb.Len() == newlen {
return pb
}
buf := make([]byte, newlen)
copy(buf, pb)
return PadBuffer(buf)
}
func (pb PadBuffer) Unpad(n int) (PadBuffer, error) {
rem := pb.Len() % n
if rem != 0 {
return pb, errors.New("buffer should be multiple block size")
}
last := pb[pb.Len()-1]
count := 0
for i := pb.Len() - 1; i >= 0; i-- {
if pb[i] != last {
break
}
count++
}
if count != int(last) {
return pb, errors.New("invalid padding")
}
return PadBuffer(pb[:pb.Len()-int(last)]), nil
}