init: v1.0.0
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
package padding
|
||||
|
||||
// TODO
|
||||
|
||||
type P5Padding struct {
|
||||
}
|
||||
|
||||
func (P5Padding) Pad(src []byte, blockSize int) (dst []byte) {
|
||||
// panic("P5Padding is not support now")
|
||||
// return src
|
||||
return P7Padding{}.Pad(src, blockSize)
|
||||
}
|
||||
|
||||
func (P5Padding) Unpad(src []byte, blockSize int) (dst []byte, err error) {
|
||||
// panic("P5Padding is not support now")
|
||||
// return nil, nil
|
||||
return P7Padding{}.Unpad(src, blockSize)
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package padding
|
||||
|
||||
const (
|
||||
MIN_BLOCK_SIZE = 8
|
||||
MAX_BLOCK_SIZE = 128
|
||||
)
|
||||
|
||||
type Padding interface {
|
||||
// Pad 补码,一般用法 data = Pad(data, sm4.ByteSize),
|
||||
// 但返回时dst和src可能内存地址相同,也可能不同。
|
||||
Pad(src []byte, blockSize int) (dst []byte)
|
||||
|
||||
// Unpad 去补码,一般用法 data = Unpad(data, sm4.ByteSize),
|
||||
// 如出错,则dst = src,不改变src。
|
||||
Unpad(src []byte, blockSize int) (dst []byte, err error)
|
||||
}
|
||||
|
||||
var P7 Padding = P7Padding{}
|
||||
var P5 Padding = P5Padding{}
|
||||
var None Padding = NonePadding{}
|
||||
|
||||
type NonePadding struct{}
|
||||
|
||||
func (NonePadding) Pad(src []byte, blockSize int) (dst []byte) {
|
||||
return src
|
||||
}
|
||||
func (NonePadding) Unpad(src []byte, blockSize int) (dst []byte, err error) {
|
||||
return src, nil
|
||||
}
|
||||
Reference in New Issue
Block a user