Redo config format

This commit is contained in:
Qian Wang 2018-12-03 20:30:06 +00:00
parent 0253f8077a
commit 304f7f38a7
7 changed files with 64 additions and 28 deletions

View File

@ -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...))

30
cmd/keygen/keygen.go Normal file
View File

@ -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))
}

View File

@ -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"

View File

@ -1,5 +1,5 @@
{
"WebServerAddr":"204.79.197.200:443",
"Key":"UGUmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ=",
"PrivateKey":"EN5aPEpNBO+vw+BtFQY2OnK9bQU7rvEj5qmnmgwEtUc=",
"AdminUID":"ugDmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ="
}

View File

@ -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 {

View File

@ -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 {

View File

@ -11,6 +11,8 @@ import (
"log"
)
// FIXME: sanity checks. The server may panic due to user input
/*
0 reserved
1 listActiveUsers none []uids