padding.go 986 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package padding
  2. import "errors"
  3. var (
  4. ErrPaddingSize = errors.New("pkcs5 padding size error")
  5. PKCS5 = &pkcs5{}
  6. )
  7. // pkcs5Padding is a pkcs5 padding struct.
  8. type pkcs5 struct{}
  9. // Padding is interface used for crypto.
  10. type Padding interface {
  11. Padding(src []byte, blockSize int) []byte
  12. Unpadding(src []byte, blockSize int) ([]byte, error)
  13. }
  14. // Padding implements the Padding interface Padding method.
  15. func (p *pkcs5) Padding(src []byte, blockSize int) []byte {
  16. srcLen := len(src)
  17. padLen := byte(blockSize - (srcLen % blockSize))
  18. pd := make([]byte, srcLen+int(padLen))
  19. copy(pd, src)
  20. for i := srcLen; i < len(pd); i++ {
  21. pd[i] = padLen
  22. }
  23. return pd
  24. }
  25. // Unpadding implements the Padding interface Unpadding method.
  26. func (p *pkcs5) Unpadding(src []byte, blockSize int) ([]byte, error) {
  27. srcLen := len(src)
  28. paddingLen := int(src[srcLen-1])
  29. if paddingLen >= srcLen || paddingLen > blockSize {
  30. return nil, ErrPaddingSize
  31. }
  32. return src[:srcLen-paddingLen], nil
  33. }