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 }