44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package crypto
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// ref: https://golang-examples.tumblr.com/post/98350728789/pkcs7-padding
|
|
// Appends padding.
|
|
func pkcs7Pad(data []byte, blocklen int) ([]byte, error) {
|
|
if blocklen <= 0 {
|
|
return nil, fmt.Errorf("Invalid block length %d", blocklen)
|
|
}
|
|
padlen := 1
|
|
for ((len(data) + padlen) % blocklen) != 0 {
|
|
padlen = padlen + 1
|
|
}
|
|
|
|
pad := bytes.Repeat([]byte{byte(padlen)}, padlen)
|
|
return append(data, pad...), nil
|
|
}
|
|
|
|
// Returns slice of the original data without padding.
|
|
func pkcs7Unpad(data []byte, blocklen int) ([]byte, error) {
|
|
if blocklen <= 0 {
|
|
return nil, fmt.Errorf("Invalid block length %d", blocklen)
|
|
}
|
|
if len(data)%blocklen != 0 || len(data) == 0 {
|
|
return nil, fmt.Errorf("Invalid data length %d", len(data))
|
|
}
|
|
padlen := int(data[len(data)-1])
|
|
if padlen > blocklen || padlen == 0 {
|
|
return nil, fmt.Errorf("Invalid padding")
|
|
}
|
|
// check padding
|
|
pad := data[len(data)-padlen:]
|
|
for i := 0; i < padlen; i++ {
|
|
if pad[i] != byte(padlen) {
|
|
return nil, fmt.Errorf("Invalid padding")
|
|
}
|
|
}
|
|
|
|
return data[:len(data)-padlen], nil
|
|
}
|