Starting data structures
This commit is contained in:
parent
8f8fb83c8c
commit
61eacf3202
115
.gitignore
vendored
Normal file
115
.gitignore
vendored
Normal file
@ -0,0 +1,115 @@
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/intellij+all,go
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=intellij+all,go
|
||||
|
||||
### Go ###
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
### Go Patch ###
|
||||
/vendor/
|
||||
/Godeps/
|
||||
|
||||
### Intellij+all ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij+all Patch ###
|
||||
# Ignores the whole .idea folder and all .iml files
|
||||
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
|
||||
|
||||
.idea/
|
||||
|
||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||
|
||||
*.iml
|
||||
modules.xml
|
||||
.idea/misc.xml
|
||||
*.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/intellij+all,go
|
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
||||
module mbpl3p
|
||||
|
||||
go 1.15
|
||||
|
||||
require golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
|
8
go.sum
Normal file
8
go.sum
Normal file
@ -0,0 +1,8 @@
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
7
main.go
Normal file
7
main.go
Normal file
@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("hello world")
|
||||
}
|
52
proxy/packet.go
Normal file
52
proxy/packet.go
Normal file
@ -0,0 +1,52 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Packet struct {
|
||||
Data []byte
|
||||
timestamp time.Time
|
||||
}
|
||||
|
||||
func NewPacket(data []byte) Packet {
|
||||
return Packet{
|
||||
Data: data,
|
||||
timestamp: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func UnmarshalPacket(raw []byte, verifier MacVerifier) *Packet {
|
||||
// the MAC is the last N bytes
|
||||
data := raw[:len(raw)-verifier.CodeLength()]
|
||||
sum := raw[len(raw)-verifier.CodeLength():]
|
||||
|
||||
if !verifier.Verify(data, sum) {
|
||||
return nil
|
||||
}
|
||||
|
||||
p := Packet{
|
||||
Data: data[:8],
|
||||
}
|
||||
|
||||
unixTime := int64(binary.LittleEndian.Uint64(data[len(data)-8:]))
|
||||
p.timestamp = time.Unix(unixTime, 0)
|
||||
|
||||
return &p
|
||||
}
|
||||
|
||||
func (p Packet) Marshal(generator MacGenerator) []byte {
|
||||
// length of data + length of timestamp (8 byte) + length of checksum
|
||||
slice := make([]byte, len(p.Data)+8+generator.CodeLength())
|
||||
|
||||
copy(slice, p.Data)
|
||||
|
||||
unixTime := uint64(p.timestamp.Unix())
|
||||
binary.LittleEndian.PutUint64(slice[len(p.Data):], unixTime)
|
||||
|
||||
mac := generator.Generate(slice)
|
||||
copy(slice[len(p.Data)+8:], mac)
|
||||
|
||||
return slice
|
||||
}
|
35
proxy/proxy.go
Normal file
35
proxy/proxy.go
Normal file
@ -0,0 +1,35 @@
|
||||
package proxy
|
||||
|
||||
const ChecksumLength = 16
|
||||
|
||||
type Producer interface {
|
||||
IsAlive() bool
|
||||
Produce(chan Packet)
|
||||
}
|
||||
|
||||
type Consumer interface {
|
||||
IsAlive() bool
|
||||
Consume(chan Packet)
|
||||
}
|
||||
|
||||
type MacGenerator interface {
|
||||
CodeLength() int
|
||||
Generate([]byte) []byte
|
||||
}
|
||||
|
||||
type MacVerifier interface {
|
||||
CodeLength() int
|
||||
Verify(data []byte, sum []byte) bool
|
||||
}
|
||||
|
||||
type Source interface {
|
||||
}
|
||||
|
||||
type Sink interface {
|
||||
Release(packet Packet)
|
||||
}
|
||||
|
||||
type Proxy struct {
|
||||
proxyChan chan Packet
|
||||
sinkChan chan Packet
|
||||
}
|
Loading…
Reference in New Issue
Block a user