summaryrefslogtreecommitdiff
path: root/utils/crypto
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-12-19 18:01:24 +0530
committerBobby <[email protected]>2025-12-19 18:01:24 +0530
commitb1bfec1ce2987d9fe0cc52e5ae9115977fdf8c24 (patch)
tree7080b7dc97522ffe0837a1e0b2965489d7e67664 /utils/crypto
parent767297e28d47ee9cf3722054e41caa837f0e68d2 (diff)
downloadlain-b1bfec1ce2987d9fe0cc52e5ae9115977fdf8c24.tar.xz
lain-b1bfec1ce2987d9fe0cc52e5ae9115977fdf8c24.zip
added utils, templates, routes, types, middleware, processors and a whole lot of things for a basic login page
Diffstat (limited to 'utils/crypto')
-rw-r--r--utils/crypto/crypto.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/utils/crypto/crypto.go b/utils/crypto/crypto.go
new file mode 100644
index 0000000..54d2eec
--- /dev/null
+++ b/utils/crypto/crypto.go
@@ -0,0 +1,71 @@
+package crypto
+
+import (
+ "crypto/aes"
+ "crypto/cipher"
+ "crypto/rand"
+ "crypto/sha256"
+ "encoding/base64"
+ "fmt"
+ "io"
+ "lain/config"
+)
+
+func getKey() []byte {
+ hash := sha256.Sum256([]byte(config.Server.AppSecret))
+ return hash[:]
+}
+
+func Encrypt(plaintext string) (string, error) {
+ key := getKey()
+
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ return "", err
+ }
+
+ gcm, err := cipher.NewGCM(block)
+ if err != nil {
+ return "", err
+ }
+
+ nonce := make([]byte, gcm.NonceSize())
+ if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
+ return "", err
+ }
+
+ ciphertext := gcm.Seal(nonce, nonce, []byte(plaintext), nil)
+ return base64.URLEncoding.EncodeToString(ciphertext), nil
+}
+
+func Decrypt(ciphertext string) (string, error) {
+ key := getKey()
+
+ ciphertextBytes, err := base64.URLEncoding.DecodeString(ciphertext)
+ if err != nil {
+ return "", err
+ }
+
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ return "", err
+ }
+
+ gcm, err := cipher.NewGCM(block)
+ if err != nil {
+ return "", err
+ }
+
+ nonceSize := gcm.NonceSize()
+ if len(ciphertextBytes) < nonceSize {
+ return "", fmt.Errorf("ciphertext too short")
+ }
+
+ nonce, ciphertextBytes := ciphertextBytes[:nonceSize], ciphertextBytes[nonceSize:]
+ plaintextBytes, err := gcm.Open(nil, nonce, ciphertextBytes, nil)
+ if err != nil {
+ return "", err
+ }
+
+ return string(plaintextBytes), nil
+}