42 lines
972 B
Go
42 lines
972 B
Go
package padding
|
|
|
|
import "fmt"
|
|
|
|
type P7Padding struct {
|
|
}
|
|
|
|
func (P7Padding) Pad(src []byte, blockSize int) (dst []byte) {
|
|
if blockSize < MIN_BLOCK_SIZE || blockSize > MAX_BLOCK_SIZE {
|
|
panic("blocksize error")
|
|
}
|
|
// if blocksize == 2^n, then paddingsize = -len(src) & (blocksize - 1)
|
|
paddingSize := byte(blockSize - (len(src) % blockSize))
|
|
for i := 0; i < int(paddingSize); i++ {
|
|
src = append(src, paddingSize)
|
|
}
|
|
return src
|
|
}
|
|
|
|
func (P7Padding) Unpad(src []byte, blockSize int) (dst []byte, err error) {
|
|
if blockSize < MIN_BLOCK_SIZE || blockSize > MAX_BLOCK_SIZE {
|
|
panic("blocksize error")
|
|
}
|
|
|
|
if len(src) == 0 {
|
|
return src, nil
|
|
}
|
|
paddingSize := int(uint(src[len(src)-1]))
|
|
|
|
if paddingSize > len(src) || paddingSize == 0 {
|
|
return src, fmt.Errorf("unpadding error")
|
|
}
|
|
|
|
for i := len(src) - paddingSize; i < len(src)-1; i++ {
|
|
if int(src[i]) != paddingSize {
|
|
return src, fmt.Errorf("unpadding error")
|
|
}
|
|
}
|
|
|
|
return src[:len(src)-paddingSize], nil
|
|
}
|