diff --git a/Api/go.mod b/Api/go.mod index 942f9f7..4e2e82a 100644 --- a/Api/go.mod +++ b/Api/go.mod @@ -3,6 +3,7 @@ module 51m0n.com/EnvironmentManagerAPI/v2 go 1.15 require ( + github.com/coocood/freecache v1.1.1 github.com/gin-gonic/gin v1.7.4 go.mongodb.org/mongo-driver v1.7.2 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 diff --git a/Api/go.sum b/Api/go.sum index 43719c4..f12862d 100644 --- a/Api/go.sum +++ b/Api/go.sum @@ -1,4 +1,9 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= +github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -80,6 +85,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -109,8 +115,11 @@ golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -125,8 +134,13 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/Api/main.go b/Api/main.go index 63727f2..60cbf41 100644 --- a/Api/main.go +++ b/Api/main.go @@ -17,8 +17,8 @@ func main() { } func initializeRoutes(r *gin.Engine) { - //r.POST("/data", src.CreateData) - //r.PUT("/data/:id", src.CreateEnvironmentData) + r.POST("/data", src.CreateData) + r.PUT("/data/:id", src.CreateEnvironmentData) r.Use(src.AEADHandler) { r.PUT("/data/authed/:id", src.CreateEnvironmentData) diff --git a/Api/src/database.go b/Api/src/database.go index f67e5a1..a884821 100644 --- a/Api/src/database.go +++ b/Api/src/database.go @@ -6,7 +6,9 @@ import ( "os" "encoding/base64" + "encoding/binary" + "github.com/coocood/freecache" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -16,9 +18,16 @@ import ( const salt = "ENVIRONMENT" +// 30m +const timeout = 1800 + +// 10m +const cacheSize = 10 * 1024 * 1024 + var dbCollection *mongo.Collection var dbDevices *mongo.Collection var mongoClient *mongo.Client +var cache *freecache.Cache func DbConnect() { mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(getMongoURI())) @@ -33,21 +42,36 @@ func DbConnect() { db := mongoClient.Database("Environment") dbCollection = db.Collection("Main") dbDevices = db.Collection("Devices") + cache = freecache.NewCache(cacheSize) } func GetDeviceKey(api uint64) ([]byte, error) { - apiSigned := int64(api) - filter := bson.D{{"ApiID", apiSigned}} - var result bson.M - err := dbDevices.FindOne(context.TODO(), filter).Decode(&result) - if err != nil { - return nil, err - } + cacheKey := Uint64ToBytes(api) + // Check the cache for the user + val, err := cache.Get(cacheKey) + if err == nil { + return val, err + } else { + apiSigned := int64(api) + filter := bson.D{{"ApiID", apiSigned}} + var result bson.M + err := dbDevices.FindOne(context.TODO(), filter).Decode(&result) + if err != nil { + return nil, err + } - key, err := DeriveKey(result["Passcode"].(string)) - fmt.Printf(base64.StdEncoding.EncodeToString(key)) - // We should cache this! - return key, err + key, err := DeriveKey(result["Passcode"].(string)) + fmt.Printf(base64.StdEncoding.EncodeToString(key)) + // We should cache this! + _ = cache.Set(cacheKey, key, timeout) + return key, err + } +} + +func Uint64ToBytes(num uint64) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, num) + return buf } func DeriveKey(passcode string) ([]byte, error) { diff --git a/EnvTest/go.mod b/EnvTest/go.mod new file mode 100644 index 0000000..0aa95ea --- /dev/null +++ b/EnvTest/go.mod @@ -0,0 +1,5 @@ +module 51m0n.com/EnvironmentManagerTest/v2 + +go 1.15 + +require golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 diff --git a/EnvTest/go.sum b/EnvTest/go.sum new file mode 100644 index 0000000..a06bcfd --- /dev/null +++ b/EnvTest/go.sum @@ -0,0 +1,9 @@ +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/EnvTest/main.go b/EnvTest/main.go new file mode 100644 index 0000000..9de012a --- /dev/null +++ b/EnvTest/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "bytes" + "crypto/rand" + "encoding/json" + "fmt" + "io" + "net/http" + + "golang.org/x/crypto/blake2s" + "golang.org/x/crypto/chacha20poly1305" +) + +type EnvironmentData struct { + Temp float64 `json:"t" binding:"required"` + Humidity float64 `json:"h" binding:"required"` +} + +const passcode = "pass2" +const salt = "ENVIRONMENT" + +func main() { + data := EnvironmentData{Temp: 25, Humidity: 40} + b, err := json.Marshal(data) + if err != nil { + panic(err) + } + + pass, err := DeriveKey(passcode) + if err != nil { + panic(err) + } + + aead, err := chacha20poly1305.New([]byte(pass)) + if err != nil { + panic(err) + } + + iv := make([]byte, chacha20poly1305.NonceSize) + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + panic(err) + } + + cypher := aead.Seal(nil, iv, b, nil) + cypher = append(iv, cypher...) + request, err := http.NewRequest(http.MethodPut, "http://localhost:8080/data/authed/7701238505945920037", bytes.NewReader(cypher)) + + if err == nil { + resp, err := http.DefaultClient.Do(request) + if err != nil { + panic(err) + } + defer resp.Body.Close() + fmt.Printf("Sent, code: %s", resp.Status) + } else { + panic(err) + } +} + +func DeriveKey(passcode string) ([]byte, error) { + + hash, err := blake2s.New256(nil) + if err != nil { + return nil, err + } + hash.Write([]byte(salt)) + hash.Write([]byte(passcode)) + + fmt.Printf("SALT %s PASS %s\n", salt, passcode) + + return hash.Sum(nil), nil +} diff --git a/ManagementPage/ManagementPage/Pages/DevicePage.cshtml b/ManagementPage/ManagementPage/Pages/DevicePage.cshtml index 935b3ec..2519d52 100644 --- a/ManagementPage/ManagementPage/Pages/DevicePage.cshtml +++ b/ManagementPage/ManagementPage/Pages/DevicePage.cshtml @@ -8,10 +8,10 @@

@Model.device.Name

Current Conditions

- Temp: @Model.data.LastOrDefault()?.Temperature.ToString("N1")°C + Temp: @Model.data.FirstOrDefault()?.Temperature.ToString("N1")°C
- Humidity: @Model.data.LastOrDefault()?.Humidity.ToString("N1")% + Humidity: @Model.data.FirstOrDefault()?.Humidity.ToString("N1")%
@@ -19,8 +19,8 @@
- - + +