github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/crypto/keys/aes256.go (about)

     1  package keys
     2  
     3  import (
     4  	"crypto/aes"
     5  	"crypto/cipher"
     6  )
     7  
     8  // aesEncrypt encrypts the key with the given source.
     9  func aesEncrypt(src, key []byte) ([]byte, error) {
    10  	block, err := aes.NewCipher(key)
    11  	if err != nil {
    12  		return nil, err
    13  	}
    14  
    15  	ecb := newECBEncrypter(block)
    16  	out := make([]byte, len(src))
    17  	ecb.CryptBlocks(out, src)
    18  
    19  	return out, nil
    20  }
    21  
    22  // aesDecrypt decrypts the encrypted source with the given key.
    23  func aesDecrypt(crypted, key []byte) ([]byte, error) {
    24  	block, err := aes.NewCipher(key)
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  
    29  	blockMode := newECBDecrypter(block)
    30  	out := make([]byte, len(crypted))
    31  	blockMode.CryptBlocks(out, crypted)
    32  	return out, nil
    33  }
    34  
    35  type ecb struct {
    36  	b         cipher.Block
    37  	blockSize int
    38  }
    39  
    40  func newECB(b cipher.Block) *ecb {
    41  	return &ecb{
    42  		b:         b,
    43  		blockSize: b.BlockSize(),
    44  	}
    45  }
    46  
    47  type ecbEncrypter ecb
    48  
    49  func newECBEncrypter(b cipher.Block) cipher.BlockMode {
    50  	return (*ecbEncrypter)(newECB(b))
    51  }
    52  
    53  func (ecb *ecbEncrypter) BlockSize() int {
    54  	return ecb.blockSize
    55  }
    56  
    57  func (ecb *ecbEncrypter) CryptBlocks(dst, src []byte) {
    58  	if len(src)%ecb.blockSize != 0 {
    59  		panic("crypto/cipher: input not full blocks")
    60  	}
    61  	if len(dst) < len(src) {
    62  		panic("crypto/cipher: output smaller than input")
    63  	}
    64  	for len(src) > 0 {
    65  		ecb.b.Encrypt(dst, src[:ecb.blockSize])
    66  		src = src[ecb.blockSize:]
    67  		dst = dst[ecb.blockSize:]
    68  	}
    69  }
    70  
    71  type ecbDecrypter ecb
    72  
    73  func newECBDecrypter(b cipher.Block) cipher.BlockMode {
    74  	return (*ecbDecrypter)(newECB(b))
    75  }
    76  
    77  func (ecb ecbDecrypter) BlockSize() int {
    78  	return ecb.blockSize
    79  }
    80  
    81  func (ecb *ecbDecrypter) CryptBlocks(dst, src []byte) {
    82  	if len(src)%ecb.blockSize != 0 {
    83  		panic("crypto/cipher: input not full blocks")
    84  	}
    85  	if len(dst) < len(src) {
    86  		panic("crypto/cipher: output smaller than input")
    87  	}
    88  	for len(src) > 0 {
    89  		ecb.b.Decrypt(dst, src[:ecb.blockSize])
    90  		src = src[ecb.blockSize:]
    91  		dst = dst[ecb.blockSize:]
    92  	}
    93  }