diff --git a/cmd/ck-client/admin.go b/cmd/ck-client/admin.go index e651fc1..118f3bd 100644 --- a/cmd/ck-client/admin.go +++ b/cmd/ck-client/admin.go @@ -81,6 +81,10 @@ func adminHandshake(sta *client.State) *administrator { func (a *administrator) getCommand() []byte { fmt.Println("Select your command") + fmt.Println(`1 listActiveUsers none []uids +2 listAllUsers none []userinfo +3 getUserInfo uid userinfo +4 addNewUser userinfo ok`) var cmd string fmt.Scanln(&cmd) switch cmd { @@ -97,14 +101,21 @@ func (a *administrator) getCommand() []byte { case "4": var uinfo UserInfo var b64UID string + fmt.Printf("UID:") fmt.Scanln(&b64UID) UID, _ := base64.StdEncoding.DecodeString(b64UID) uinfo.UID = UID + fmt.Printf("SessionsCap:") fmt.Scanf("%d", &uinfo.SessionsCap) + fmt.Printf("UpRate:") fmt.Scanf("%d", &uinfo.UpRate) + fmt.Printf("DownRate:") fmt.Scanf("%d", &uinfo.DownRate) + fmt.Printf("UpCredit:") fmt.Scanf("%d", &uinfo.UpCredit) + fmt.Printf("DownCredit:") fmt.Scanf("%d", &uinfo.DownCredit) + fmt.Printf("ExpiryTime:") fmt.Scanf("%d", &uinfo.ExpiryTime) marshed, _ := json.Marshal(uinfo) return a.request(append([]byte{0x04}, marshed...)) diff --git a/cmd/keygen/keygen.go b/cmd/keygen/keygen.go new file mode 100644 index 0000000..4feb8e8 --- /dev/null +++ b/cmd/keygen/keygen.go @@ -0,0 +1,30 @@ +package main + +import ( + "crypto/rand" + "encoding/base64" + "fmt" + ecdh "github.com/cbeuw/go-ecdh" +) + +var b64 = base64.StdEncoding.EncodeToString + +func main() { + + UID := make([]byte, 32) + rand.Read(UID) + + ec := ecdh.NewCurve25519ECDH() + staticPv, staticPub, _ := ec.GenerateKey(rand.Reader) + marshPub := ec.Marshal(staticPub) + marshPv := staticPv.(*[32]byte)[:] + + fmt.Printf("USER: \n") + fmt.Printf("\"UID\":\"%v\",\n", b64(UID)) + fmt.Printf("\"PublicKey\":\"%v\"\n", b64(marshPub)) + + fmt.Println("=========================================") + + fmt.Printf("SERVER: \n") + fmt.Printf("\"PrivateKey\":\"%v\"\n", b64(marshPv)) +} diff --git a/config/ckclient.json b/config/ckclient.json index 4c1a2bc..d7171b9 100644 --- a/config/ckclient.json +++ b/config/ckclient.json @@ -1,6 +1,7 @@ { + "UID":"iGAO85zysIyR4c09CyZSLdNhtP/ckcYu7nIPI082AHA=", + "PublicKey":"IYoUzkle/T/kriE+Ufdm7AHQtIeGnBWbhhlTbmDpUUI=", "ServerName":"www.bing.com", - "Key":"UNhY4JhezH9gQYqvDMWrWH9CwlcKiECVqejMrND2VFy2wjljjjqJWGiNoAYpWscJ0VEVkewo6o8S/jcNdNxFLQ==", "TicketTimeHint":3600, "NumConn":4, "MaskBrowser":"chrome" diff --git a/config/ckserver.json b/config/ckserver.json index e1e0893..dcfcb83 100644 --- a/config/ckserver.json +++ b/config/ckserver.json @@ -1,5 +1,5 @@ { "WebServerAddr":"204.79.197.200:443", - "Key":"UGUmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ=", + "PrivateKey":"EN5aPEpNBO+vw+BtFQY2OnK9bQU7rvEj5qmnmgwEtUc=", "AdminUID":"ugDmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ=" } diff --git a/internal/client/state.go b/internal/client/state.go index b9074ae..92939ad 100644 --- a/internal/client/state.go +++ b/internal/client/state.go @@ -15,7 +15,8 @@ import ( type rawConfig struct { ServerName string - Key string + UID string + PublicKey string TicketTimeHint int MaskBrowser string NumConn int @@ -105,24 +106,23 @@ func (sta *State) ParseConfig(conf string) (err error) { sta.TicketTimeHint = preParse.TicketTimeHint sta.MaskBrowser = preParse.MaskBrowser sta.NumConn = preParse.NumConn - uid, pub, err := parseKey(preParse.Key) + uid, err := base64.StdEncoding.DecodeString(preParse.UID) if err != nil { - return errors.New("Failed to parse Key: " + err.Error()) + return errors.New("Failed to parse UID: " + err.Error()) } sta.UID = uid - sta.staticPub = pub - return nil -} -// Structure: [UID 32 bytes][marshalled public key 32 bytes] -func parseKey(b64 string) ([]byte, crypto.PublicKey, error) { - b, err := base64.StdEncoding.DecodeString(b64) + pubBytes, err := base64.StdEncoding.DecodeString(preParse.PublicKey) if err != nil { - return nil, nil, err + return errors.New("Failed to parse Public key: " + err.Error()) } ec := ecdh.NewCurve25519ECDH() - pub, _ := ec.Unmarshal(b[32:64]) - return b[0:32], pub, nil + pub, ok := ec.Unmarshal(pubBytes) + if !ok { + return errors.New("Failed to unmarshal Public key") + } + sta.staticPub = pub + return nil } func (sta *State) getKeyPair(tthInterval int64) *keyPair { diff --git a/internal/server/state.go b/internal/server/state.go index 679d061..b0d1167 100644 --- a/internal/server/state.go +++ b/internal/server/state.go @@ -14,7 +14,7 @@ import ( type rawConfig struct { WebServerAddr string - Key string + PrivateKey string AdminUID string } type stateManager interface { @@ -82,17 +82,6 @@ func ssvToJson(ssv string) (ret []byte) { return ret } -// base64 encoded 32 byte private key -func parseKey(b64 string) (crypto.PrivateKey, error) { - b, err := base64.StdEncoding.DecodeString(b64) - if err != nil { - return nil, err - } - var pv [32]byte - copy(pv[:], b) - return &pv, nil -} - // base64 encoded 32 byte adminUID func parseAdminUID(b64 string) ([]byte, error) { uid, err := base64.StdEncoding.DecodeString(b64) @@ -123,11 +112,14 @@ func (sta *State) ParseConfig(conf string) (err error) { } sta.WebServerAddr = preParse.WebServerAddr - pv, err := parseKey(preParse.Key) + + pvBytes, err := base64.StdEncoding.DecodeString(preParse.PrivateKey) if err != nil { return err } - sta.staticPv = pv + var pv [32]byte + copy(pv[:], pvBytes) + sta.staticPv = &pv adminUID, err := parseAdminUID(preParse.AdminUID) if err != nil { diff --git a/internal/server/usermanager/controller.go b/internal/server/usermanager/controller.go index fb09b71..d0f5f7a 100644 --- a/internal/server/usermanager/controller.go +++ b/internal/server/usermanager/controller.go @@ -11,6 +11,8 @@ import ( "log" ) +// FIXME: sanity checks. The server may panic due to user input + /* 0 reserved 1 listActiveUsers none []uids