From 9d5f99a5b4f86e5a880296c0d52d55848791871a Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Tue, 24 Oct 2023 22:19:22 -0700 Subject: crypto: add pkcs7 --- crypto/pkcs7/padding.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 crypto/pkcs7/padding.go diff --git a/crypto/pkcs7/padding.go b/crypto/pkcs7/padding.go new file mode 100644 index 0000000..1f90643 --- /dev/null +++ b/crypto/pkcs7/padding.go @@ -0,0 +1,41 @@ +package pkcs7 + +// Shamelessly stolen from: https://wgallagher86.medium.com/pkcs-7-padding-in-go-6da5d1d14590 + +import "errors" + +func Unpad(input []byte) ([]byte, error) { + if input == nil || len(input) == 0 { + return nil, nil + } + + pc := input[len(input)-1] + pl := int(pc) + err := checkPaddingIsValid(input, pl) + if err != nil { + return nil, err + } + return input[:len(input)-pl], nil +} + +func checkPaddingIsValid(input []byte, paddingLength int) error { + if len(input) < paddingLength { + return errors.New("invalid padding") + } + p := input[len(input)-(paddingLength):] + for _, pc := range p { + if uint(pc) != uint(len(p)) { + return errors.New("invalid padding") + } + } + return nil +} + +func Pad(input []byte, blockSize int) []byte { + r := len(input) % blockSize + pl := blockSize - r + for i := 0; i < pl; i++ { + input = append(input, byte(pl)) + } + return input +} -- cgit v1.2.3