safing-jess/tools/gostdlib/aes-ctr.go
2020-01-13 00:15:58 +01:00

103 lines
2.1 KiB
Go

package gostdlib
import (
"crypto/aes"
"crypto/cipher"
"github.com/safing/jess/tools"
)
//nolint:dupl
func init() {
aesCtrInfo := &tools.ToolInfo{
Purpose: tools.PurposeCipher,
Options: []uint8{tools.OptionHasState},
NonceSize: aes.BlockSize,
Comment: "aka Rijndael, FIPS 197",
Author: "Vincent Rijmen and Joan Daemen, 1998",
}
aesCtrFactory := func() tools.ToolLogic { return &AesCTR{} }
tools.Register(&tools.Tool{
Info: aesCtrInfo.With(&tools.ToolInfo{
Name: "AES128-CTR",
KeySize: 16, // 128 bits
SecurityLevel: 128,
}),
Factory: aesCtrFactory,
})
tools.Register(&tools.Tool{
Info: aesCtrInfo.With(&tools.ToolInfo{
Name: "AES192-CTR",
KeySize: 24, // 192 bits
SecurityLevel: 192,
}),
Factory: aesCtrFactory,
})
tools.Register(&tools.Tool{
Info: aesCtrInfo.With(&tools.ToolInfo{
Name: "AES256-CTR",
KeySize: 32, // 256 bits
SecurityLevel: 256,
}),
Factory: aesCtrFactory,
})
}
// AesCTR implements the cryptographic interface for AES-CTR encryption.
type AesCTR struct {
tools.ToolLogicBase
stream cipher.Stream
key, iv []byte
}
// Setup implements the ToolLogic interface.
func (aesctr *AesCTR) Setup() (err error) {
// get key
aesctr.key, err = aesctr.Helper().NewSessionKey()
if err != nil {
return err
}
// get IV
aesctr.iv, err = aesctr.Helper().NewSessionNonce()
if err != nil {
return err
}
// get cipher.Block
block, err := aes.NewCipher(aesctr.key)
if err != nil {
return err
}
// get cipher.Stream
aesctr.stream = cipher.NewCTR(block, aesctr.iv)
return nil
}
// Reset implements the ToolLogic interface.
func (aesctr *AesCTR) Reset() error {
// clean up keys
aesctr.Helper().Burn(aesctr.key)
aesctr.Helper().Burn(aesctr.iv)
return nil
}
// Encrypt implements the ToolLogic interface.
func (aesctr *AesCTR) Encrypt(data []byte) ([]byte, error) {
// encrypt
aesctr.stream.XORKeyStream(data, data)
return data, nil
}
// Decrypt implements the ToolLogic interface.
func (aesctr *AesCTR) Decrypt(data []byte) ([]byte, error) {
// decrypt
aesctr.stream.XORKeyStream(data, data)
return data, nil
}