mirror of
https://github.com/mainflux/mainflux.git
synced 2025-05-14 19:29:11 +08:00

* NOISSUE- Add OPC-UA adapter Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * NOISSUE - Add opc-adapter PoC, docker and vendor Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Convert OPC messages to SenML Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add gopcua package Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * lora-adapter typo Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add OPC Reader Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Typo fix Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Typo fix Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Update copyright headers Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Fix reviews Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Fix reviews Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add opc config Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add all opc envars in the config Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Config typo Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add route map Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Use opcua package instead of opc Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Fix OPCUA typo Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Rm MQTT sub Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Move interefaces to root Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Fix revieews and typo Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Update Gopkg.toml Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com> * Add all envars into .env Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com>
64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package uapolicy
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
|
|
"github.com/gopcua/opcua/errors"
|
|
)
|
|
|
|
const (
|
|
AESBlockSize = aes.BlockSize
|
|
AESMinPadding = 0
|
|
)
|
|
|
|
type AES struct {
|
|
KeyLength int
|
|
IV []byte
|
|
Secret []byte
|
|
}
|
|
|
|
func (a *AES) Decrypt(src []byte) ([]byte, error) {
|
|
paddedKey := make([]byte, a.KeyLength/8)
|
|
copy(paddedKey, a.Secret)
|
|
|
|
block, err := aes.NewCipher(a.Secret)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(src) < aes.BlockSize {
|
|
return nil, errors.New("ciphertext too short")
|
|
}
|
|
|
|
// CBC mode always works in whole blocks.
|
|
if len(src)%aes.BlockSize != 0 {
|
|
return nil, errors.New("ciphertext is not a multiple of the block size")
|
|
}
|
|
|
|
dst := make([]byte, len(src))
|
|
mode := cipher.NewCBCDecrypter(block, a.IV)
|
|
mode.CryptBlocks(dst, src)
|
|
return dst, nil
|
|
}
|
|
|
|
func (a *AES) Encrypt(src []byte) ([]byte, error) {
|
|
paddedKey := make([]byte, a.KeyLength/8)
|
|
copy(paddedKey, a.Secret)
|
|
|
|
// CBC mode always works in whole blocks.
|
|
if len(src)%aes.BlockSize != 0 {
|
|
return nil, errors.New("plaintext is not a multiple of the block size")
|
|
}
|
|
|
|
block, err := aes.NewCipher(paddedKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dst := make([]byte, len(src))
|
|
mode := cipher.NewCBCEncrypter(block, a.IV)
|
|
mode.CryptBlocks(dst, src)
|
|
return dst, nil
|
|
}
|