79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package algos
|
|
|
|
// PKCS7DataLength 获取PKCS7填充数据的实际长度
|
|
func PKCS7DataLength(buffer []byte, bufferSize, modulus int) int {
|
|
if bufferSize%modulus != 0 || bufferSize < modulus {
|
|
return 0
|
|
}
|
|
|
|
paddingValue := buffer[bufferSize-1]
|
|
if paddingValue < 1 || int(paddingValue) > modulus {
|
|
return 0
|
|
}
|
|
|
|
if bufferSize < int(paddingValue)+1 {
|
|
return 0
|
|
}
|
|
|
|
count := 1
|
|
bufferSize--
|
|
|
|
for i := count; i < int(paddingValue); i++ {
|
|
bufferSize--
|
|
if buffer[bufferSize] != paddingValue {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
return bufferSize
|
|
}
|
|
|
|
// PKCS7PadBuffer 对缓冲区进行PKCS7填充
|
|
func PKCS7PadBuffer(buffer []byte, dataLength, bufferSize, modulus int) int {
|
|
padByte := modulus - (dataLength % modulus)
|
|
if dataLength+padByte > bufferSize {
|
|
return -padByte
|
|
}
|
|
|
|
for i := 0; i < padByte; i++ {
|
|
buffer[dataLength+i] = byte(padByte)
|
|
}
|
|
|
|
return padByte
|
|
}
|
|
|
|
// PaddingSize 计算填充后的大小
|
|
func PaddingSize(size int) int {
|
|
mod := size % 16
|
|
if mod > 0 {
|
|
return size + (16 - mod)
|
|
}
|
|
return size
|
|
}
|
|
|
|
// RemovePKCS7Padding 移除PKCS7填充
|
|
func RemovePKCS7Padding(data []byte) []byte {
|
|
length := len(data)
|
|
if length == 0 {
|
|
return data
|
|
}
|
|
|
|
paddingLen := int(data[length-1])
|
|
if paddingLen > length || paddingLen > 16 {
|
|
return data
|
|
}
|
|
|
|
return data[:length-paddingLen]
|
|
}
|
|
|
|
// AddPKCS7Padding 添加PKCS7填充
|
|
func AddPKCS7Padding(data []byte, blockSize int) []byte {
|
|
padding := blockSize - len(data)%blockSize
|
|
padText := make([]byte, padding)
|
|
for i := range padText {
|
|
padText[i] = byte(padding)
|
|
}
|
|
return append(data, padText...)
|
|
}
|
|
|