gmsm/padding/pkcs7.go

42 lines
1.0 KiB
Go
Raw Normal View History

2022-02-24 17:41:52 +08:00
package padding
import (
"errors"
2022-08-18 14:49:35 +08:00
"github.com/emmansun/gmsm/internal/alias"
2022-02-24 17:41:52 +08:00
)
2022-04-20 08:36:44 +08:00
// https://datatracker.ietf.org/doc/html/rfc5652#section-6.3
2022-02-24 17:41:52 +08:00
type pkcs7Padding uint
func (pad pkcs7Padding) BlockSize() int {
return int(pad)
}
func (pad pkcs7Padding) Pad(src []byte) []byte {
overhead := pad.BlockSize() - len(src)%pad.BlockSize()
2022-08-18 14:49:35 +08:00
ret, out := alias.SliceForAppend(src, overhead)
2022-02-24 17:41:52 +08:00
for i := 0; i < overhead; i++ {
out[i] = byte(overhead)
}
return ret
}
2022-03-09 08:49:41 +08:00
// Unpad decrypted plaintext, non-constant-time
2022-02-24 17:41:52 +08:00
func (pad pkcs7Padding) Unpad(src []byte) ([]byte, error) {
2022-02-25 10:26:30 +08:00
srcLen := len(src)
if srcLen == 0 || srcLen%pad.BlockSize() != 0 {
2023-12-08 17:55:29 +08:00
return nil, errors.New("padding: src length is not multiple of block size")
2022-02-24 17:41:52 +08:00
}
2022-02-25 10:26:30 +08:00
paddedLen := src[srcLen-1]
if paddedLen == 0 || int(paddedLen) > pad.BlockSize() {
2023-12-08 17:55:29 +08:00
return nil, errors.New("padding: invalid padding byte/length")
2022-02-24 17:41:52 +08:00
}
2022-02-25 10:26:30 +08:00
for _, b := range src[srcLen-int(paddedLen) : srcLen-1] {
if b != paddedLen {
2023-12-08 17:55:29 +08:00
return nil, errors.New("padding: inconsistent padding bytes")
2022-02-25 10:26:30 +08:00
}
2022-02-24 17:41:52 +08:00
}
2022-02-25 10:26:30 +08:00
return src[:srcLen-int(paddedLen)], nil
2022-02-24 17:41:52 +08:00
}