103 lines
2.1 KiB
Go
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
|
|
}
|