Ai
1 Star 1 Fork 0

emmansun/gmsm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
ansi_x923.go 1.10 KB
一键复制 编辑 原始数据 按行查看 历史
emmansun 提交于 2022-08-13 11:14 +08:00 . sync code from github
package padding
import (
"errors"
"gitee.com/emmansun/gmsm/internal/subtle"
)
// https://www.ibm.com/docs/en/linux-on-systems?topic=processes-ansi-x923-cipher-block-chaining
type ansiX923Padding uint
func (pad ansiX923Padding) BlockSize() int {
return int(pad)
}
func (pad ansiX923Padding) Pad(src []byte) []byte {
overhead := pad.BlockSize() - len(src)%pad.BlockSize()
ret, out := subtle.SliceForAppend(src, overhead)
out[overhead-1] = byte(overhead)
for i := 0; i < overhead-1; i++ {
out[i] = 0
}
return ret
}
// Unpad decrypted plaintext, non-constant-time
func (pad ansiX923Padding) Unpad(src []byte) ([]byte, error) {
srcLen := len(src)
if srcLen == 0 || srcLen%pad.BlockSize() != 0 {
return nil, errors.New("ansi x9.23: src length is not multiple of block size")
}
paddedLen := src[srcLen-1]
if paddedLen == 0 || int(paddedLen) > pad.BlockSize() {
return nil, errors.New("ansi x9.23: invalid padding length")
}
for _, b := range src[srcLen-int(paddedLen) : srcLen-1] {
if b != 0 {
return nil, errors.New("ansi x9.23: invalid padding bytes")
}
}
return src[:srcLen-int(paddedLen)], nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/emmansun/gmsm.git
git@gitee.com:emmansun/gmsm.git
emmansun
gmsm
gmsm
v0.13.6

搜索帮助