mirror of
https://github.com/muun/recovery.git
synced 2025-02-23 11:32:33 -05:00
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
package libwallet
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func encrypt(key []byte, iv []byte, plaintext []byte) ([]byte, error) {
|
|
|
|
plaintext = pkcs7Padding(plaintext)
|
|
|
|
block, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ciphertext := make([]byte, len(plaintext))
|
|
|
|
mode := cipher.NewCBCEncrypter(block, iv)
|
|
mode.CryptBlocks(ciphertext, plaintext)
|
|
|
|
return ciphertext, nil
|
|
}
|
|
|
|
func decrypt(key []byte, iv []byte, cypertext []byte) ([]byte, error) {
|
|
|
|
block, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
plaintext := make([]byte, len(cypertext))
|
|
|
|
mode := cipher.NewCBCDecrypter(block, iv)
|
|
mode.CryptBlocks(plaintext, cypertext)
|
|
|
|
plaintext, err = pkcs7UnPadding(plaintext)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return plaintext, nil
|
|
}
|
|
|
|
func pkcs7Padding(src []byte) []byte {
|
|
padding := aes.BlockSize - len(src)%aes.BlockSize
|
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
|
return append(src, padtext...)
|
|
}
|
|
|
|
func pkcs7UnPadding(src []byte) ([]byte, error) {
|
|
length := len(src)
|
|
unpadding := int(src[length-1])
|
|
|
|
if unpadding > aes.BlockSize || unpadding == 0 {
|
|
return nil, errors.New("invalid pkcs7 padding (unpadding > aes.BlockSize || unpadding == 0)")
|
|
}
|
|
|
|
pad := src[len(src)-unpadding:]
|
|
for i := 0; i < unpadding; i++ {
|
|
if pad[i] != byte(unpadding) {
|
|
return nil, errors.New("invalid pkcs7 padding (pad[i] != unpadding)")
|
|
}
|
|
}
|
|
|
|
return src[:(length - unpadding)], nil
|
|
}
|