59 lines
1.4 KiB
Go
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))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|