From 163fa188454f31e5f0216d7d39eaf6b2a55aff8c Mon Sep 17 00:00:00 2001 From: Mathis Maquenne <124215603+mathismqn@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:20:49 +0200 Subject: [PATCH] feat: add AES-ECB crypto helpers for email/password login --- internal/crypto/ecb.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 internal/crypto/ecb.go diff --git a/internal/crypto/ecb.go b/internal/crypto/ecb.go new file mode 100644 index 0000000..14c994c --- /dev/null +++ b/internal/crypto/ecb.go @@ -0,0 +1,42 @@ +package crypto + +import ( + "crypto/aes" + "crypto/cipher" + "fmt" +) + +func ZeroPad(data []byte) []byte { + bs := aes.BlockSize + padded := make([]byte, len(data)+(bs-len(data)%bs)%bs) + copy(padded, data) + + return padded +} + +func EncryptECB(key, data []byte) ([]byte, error) { + return ecbTransform(key, data, (cipher.Block).Encrypt) +} + +func DecryptECB(key, data []byte) ([]byte, error) { + return ecbTransform(key, data, (cipher.Block).Decrypt) +} + +func ecbTransform(key, data []byte, op func(cipher.Block, []byte, []byte)) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + bs := block.BlockSize() + if len(data)%bs != 0 { + return nil, fmt.Errorf("data length %d is not a multiple of the AES block size", len(data)) + } + + out := make([]byte, len(data)) + for i := 0; i < len(data); i += bs { + op(block, out[i:i+bs], data[i:i+bs]) + } + + return out, nil +}