EnvronmentManagement/Api/src/middleware.go
2021-10-02 01:43:52 +01:00

59 lines
1.4 KiB
Go

package src
import (
"bytes"
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/chacha20poly1305"
)
const ivSize = 12
const DecryptedData = "DecryptedData"
func AEADHandler(c *gin.Context) {
// get id
uintID, err := strconv.ParseUint(c.Param("id"), 10, 64)
if err != nil {
fmt.Printf("ERR %s", err.Error())
c.AbortWithStatus(http.StatusUnauthorized)
} else {
// get key
passcode, err := GetDeviceKey(uintID)
if err != nil {
fmt.Printf("ERR %s", err.Error())
c.AbortWithStatus(http.StatusNotFound)
} else {
// get content
data, err := c.GetRawData()
if err != nil {
fmt.Printf("ERR %s", err.Error())
c.AbortWithStatus(http.StatusBadRequest)
} else {
// decrypt
iv, ciphertext := data[:ivSize], data[ivSize:]
aead, err := chacha20poly1305.New(passcode)
if err != nil {
fmt.Printf("ERR %s", err.Error())
c.AbortWithStatus(http.StatusInternalServerError)
} else {
fmt.Printf("iv: %s cypher: %s", base64.StdEncoding.EncodeToString(iv), base64.StdEncoding.EncodeToString(ciphertext))
plaintext, err := aead.Open(nil, iv, ciphertext, nil)
if err != nil {
fmt.Printf("ERR %s", err.Error())
c.AbortWithStatus(http.StatusBadRequest)
} else {
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(plaintext))
}
}
}
}
}
}