mirror of
https://github.com/schollz/croc.git
synced 2025-10-11 13:21:00 +02:00
no idea
This commit is contained in:
parent
1fb242308d
commit
6534e6fda6
6 changed files with 83 additions and 22 deletions
6
go.mod
6
go.mod
|
@ -7,8 +7,10 @@ require (
|
||||||
github.com/gorilla/websocket v1.4.1
|
github.com/gorilla/websocket v1.4.1
|
||||||
github.com/json-iterator/go v1.1.6
|
github.com/json-iterator/go v1.1.6
|
||||||
github.com/pion/webrtc/v2 v2.1.12
|
github.com/pion/webrtc/v2 v2.1.12
|
||||||
|
github.com/pkg/errors v0.8.1
|
||||||
github.com/schollz/logger v1.0.1
|
github.com/schollz/logger v1.0.1
|
||||||
github.com/schollz/pake/v2 v2.0.1
|
github.com/schollz/pake/v2 v2.0.2
|
||||||
github.com/stretchr/testify v1.4.0
|
github.com/stretchr/testify v1.4.0
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
|
github.com/tscholl2/siec v0.0.0-20191103131401-2e0c53a9e212 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708
|
||||||
)
|
)
|
||||||
|
|
10
go.sum
10
go.sum
|
@ -80,14 +80,16 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/schollz/logger v1.0.1 h1:BuBAU+euqphM0Ny9qFVScl4RSxatis4nCHIkOxO2cUU=
|
github.com/schollz/logger v1.0.1 h1:BuBAU+euqphM0Ny9qFVScl4RSxatis4nCHIkOxO2cUU=
|
||||||
github.com/schollz/logger v1.0.1/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM=
|
github.com/schollz/logger v1.0.1/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM=
|
||||||
github.com/schollz/pake/v2 v2.0.1 h1:mvDqzFhKdYw2jG7Wk66DD6qtzkKepQ+Q6vd06rURY0E=
|
github.com/schollz/pake/v2 v2.0.2 h1:p9y4Gocc5PWueyhhR7OH+Gwpu2xkP5BM9Pepl9krVfo=
|
||||||
github.com/schollz/pake/v2 v2.0.1/go.mod h1:3uXB571UYJ8Eqh2EEohXe/aO32QID+Varb4GeYA//yw=
|
github.com/schollz/pake/v2 v2.0.2/go.mod h1:3uXB571UYJ8Eqh2EEohXe/aO32QID+Varb4GeYA//yw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90=
|
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90=
|
||||||
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
|
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
|
||||||
|
github.com/tscholl2/siec v0.0.0-20191103131401-2e0c53a9e212 h1:ebnQAc1NSOA6aYucwo4I0qWchsMph9xhENAyjcDQUfs=
|
||||||
|
github.com/tscholl2/siec v0.0.0-20191103131401-2e0c53a9e212/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
|
||||||
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
@ -97,8 +99,8 @@ golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739 h1:Gc7JIyxvWgD6m+QmVryY0M
|
||||||
golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191001170739-f9e2070545dc h1:KyTYo8xkh/2WdbFLUyQwBS0Jfn3qfZ9QmuPbok2oENE=
|
golang.org/x/crypto v0.0.0-20191001170739-f9e2070545dc h1:KyTYo8xkh/2WdbFLUyQwBS0Jfn3qfZ9QmuPbok2oENE=
|
||||||
golang.org/x/crypto v0.0.0-20191001170739-f9e2070545dc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191001170739-f9e2070545dc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
|
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708 h1:pXVtWnwHkrWD9ru3sDxY/qFK/bfc0egRovX91EjWjf4=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
|
|
@ -152,6 +152,7 @@ func (c *Client) connectToRelay() (err error) {
|
||||||
}
|
}
|
||||||
wsreply.Message = "[3] pake1"
|
wsreply.Message = "[3] pake1"
|
||||||
wsreply.Payload = base64.StdEncoding.EncodeToString(c.Pake.Bytes())
|
wsreply.Payload = base64.StdEncoding.EncodeToString(c.Pake.Bytes())
|
||||||
|
log.Debugf("[3] pake payload: %s", wsreply.Payload)
|
||||||
} else if wsmsg.Message == "[3] pake1" || wsmsg.Message == "[4] pake2" || wsmsg.Message == "[5] pake3" {
|
} else if wsmsg.Message == "[3] pake1" || wsmsg.Message == "[4] pake2" || wsmsg.Message == "[5] pake3" {
|
||||||
var pakeBytes []byte
|
var pakeBytes []byte
|
||||||
pakeBytes, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
|
pakeBytes, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
|
||||||
|
@ -193,6 +194,7 @@ func (c *Client) connectToRelay() (err error) {
|
||||||
var sessionKey, salt []byte
|
var sessionKey, salt []byte
|
||||||
salt, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
|
salt, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Debugf("payload: %s", wsmsg.Payload)
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -201,6 +203,7 @@ func (c *Client) connectToRelay() (err error) {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Debugf("using salt: %x", salt)
|
||||||
c.Key, _, err = crypt.New(sessionKey, salt)
|
c.Key, _, err = crypt.New(sessionKey, salt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
|
|
|
@ -125,7 +125,15 @@
|
||||||
var socket;
|
var socket;
|
||||||
var pakeData;
|
var pakeData;
|
||||||
var croc = {
|
var croc = {
|
||||||
"key": "",
|
"SharedSecret": "test1",
|
||||||
|
"Key": "",
|
||||||
|
"Pake": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
var checkErr = e => {
|
||||||
|
if (typeof e === 'error') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sendMessage = msg => {
|
var sendMessage = msg => {
|
||||||
|
@ -143,15 +151,44 @@
|
||||||
|
|
||||||
const socketMessageListener = (event) => {
|
const socketMessageListener = (event) => {
|
||||||
console.log(event.data);
|
console.log(event.data);
|
||||||
var data = JSON.parse(readWebsocketMessage(event.data, croc.key));
|
var data = JSON.parse(readWebsocketMessage(event.data, croc.Key));
|
||||||
console.log(data);
|
console.log(data);
|
||||||
if (!("Message" in data)) {
|
if (!("Message" in data)) {
|
||||||
console.log("no message")
|
console.log("no message")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// if (data.Message == "[1] you are offerer") {
|
var message = "";
|
||||||
|
var payload = "";
|
||||||
// }
|
if (data.Message == "[1] you are offerer") {
|
||||||
|
croc.Pake = pakeInit(croc.SharedSecret, "0")
|
||||||
|
message = "[2] you are answerer"
|
||||||
|
} else if (data.Message == "[2] you are answerer") {
|
||||||
|
croc.Pake = pakeInit(croc.SharedSecret, "1")
|
||||||
|
message = "[3] pake1"
|
||||||
|
payload = pakePublic(croc.Pake);
|
||||||
|
} else if (data.Message == "[3] pake1") {
|
||||||
|
console.log("[3] pake1 payload: " + data.Payload)
|
||||||
|
croc.Pake = pakeUpdate(croc.Pake, data.Payload);
|
||||||
|
message = "[4] pake2"
|
||||||
|
payload = pakePublic(croc.Pake)
|
||||||
|
} else if (data.Message == "[4] pake2") {
|
||||||
|
croc.Pake = pakeUpdate(croc.Pake, data.Payload);
|
||||||
|
message = "[5] pake3"
|
||||||
|
payload = pakePublic(croc.Pake)
|
||||||
|
} else if (data.Message == "[5] pake3") {
|
||||||
|
croc.Pake = pakeUpdate(croc.Pake, data.Payload);
|
||||||
|
keyAndSalt = JSON.parse(pakeSessionKey(croc.Pake, ""));
|
||||||
|
message = "[6] salt";
|
||||||
|
payload = keyAndSalt.Salt;
|
||||||
|
}
|
||||||
|
if (message != "") {
|
||||||
|
console.log(`send '${message}'`);
|
||||||
|
socket.send(writeWebsocketMessage(message, payload, croc.Key));
|
||||||
|
if (message == "[6] salt") {
|
||||||
|
// update the key so future transfers are encrypted
|
||||||
|
croc.Key = keyAndSalt.Key;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
const socketOpenListener = (event) => {
|
const socketOpenListener = (event) => {
|
||||||
log('connected to websockets');
|
log('connected to websockets');
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/schollz/croc/v7/src/box"
|
"github.com/schollz/croc/v7/src/box"
|
||||||
"github.com/schollz/croc/v7/src/crypt"
|
"github.com/schollz/croc/v7/src/crypt"
|
||||||
"github.com/schollz/croc/v7/src/models"
|
"github.com/schollz/croc/v7/src/models"
|
||||||
|
@ -90,7 +91,7 @@ func readWebsocketMessage(this js.Value, inputs []js.Value) interface{} {
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
// initPake(weakPassphrase, role)
|
// pakeInit(weakPassphrase, role)
|
||||||
// returns: pakeBytes
|
// returns: pakeBytes
|
||||||
func pakeInit(this js.Value, inputs []js.Value) interface{} {
|
func pakeInit(this js.Value, inputs []js.Value) interface{} {
|
||||||
// initialize sender P ("0" indicates sender)
|
// initialize sender P ("0" indicates sender)
|
||||||
|
@ -99,13 +100,20 @@ func pakeInit(this js.Value, inputs []js.Value) interface{} {
|
||||||
}
|
}
|
||||||
role := 0
|
role := 0
|
||||||
if inputs[1].String() == "1" {
|
if inputs[1].String() == "1" {
|
||||||
|
log.Debugf("setting role to 1")
|
||||||
role = 1
|
role = 1
|
||||||
}
|
}
|
||||||
P, err := pake.Init([]byte(inputs[0].String()), role, elliptic.P521(), 1*time.Millisecond)
|
P, err := pake.Init([]byte(inputs[0].String()), role, elliptic.P521(), 1*time.Microsecond)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return js.Global().Get("Error").New(err.Error())
|
||||||
|
}
|
||||||
|
log.Debugf("init P: %+v", P)
|
||||||
|
bJSON, err := json.Marshal(P)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
bJSON, _ := json.Marshal(P)
|
|
||||||
return base64.StdEncoding.EncodeToString(bJSON)
|
return base64.StdEncoding.EncodeToString(bJSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +122,7 @@ func pakeUpdate(this js.Value, inputs []js.Value) interface{} {
|
||||||
if len(inputs) != 2 {
|
if len(inputs) != 2 {
|
||||||
return js.Global().Get("Error").New("need two input")
|
return js.Global().Get("Error").New("need two input")
|
||||||
}
|
}
|
||||||
var P, Q *pake.Pake
|
var P *pake.Pake
|
||||||
|
|
||||||
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -124,24 +132,27 @@ func pakeUpdate(this js.Value, inputs []js.Value) interface{} {
|
||||||
err = json.Unmarshal(b, &P)
|
err = json.Unmarshal(b, &P)
|
||||||
P.SetCurve(elliptic.P521())
|
P.SetCurve(elliptic.P521())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err = base64.StdEncoding.DecodeString(inputs[1].String())
|
qbytes, err := base64.StdEncoding.DecodeString(inputs[1].String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("problem with %s: %s", inputs[1].String(), err)
|
log.Errorf("problem with %s: %s", inputs[1].String(), err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, &Q)
|
log.Debugf("P: %+v", P)
|
||||||
Q.SetCurve(elliptic.P521())
|
log.Debugf("qbytes: %s", qbytes)
|
||||||
|
err = P.Update(qbytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
err = P.Update(Q.Bytes())
|
bJSON, err := json.Marshal(P)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
bJSON, _ := json.Marshal(P)
|
|
||||||
return base64.StdEncoding.EncodeToString(bJSON)
|
return base64.StdEncoding.EncodeToString(bJSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,14 +161,16 @@ func pakePublic(this js.Value, inputs []js.Value) interface{} {
|
||||||
var P *pake.Pake
|
var P *pake.Pake
|
||||||
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, &P)
|
err = json.Unmarshal(b, &P)
|
||||||
P.SetCurve(elliptic.P521())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
return base64.StdEncoding.EncodeToString(P.Public().Bytes())
|
P.SetCurve(elliptic.P521())
|
||||||
|
return base64.StdEncoding.EncodeToString(P.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
// pakeSessionKey(pakeBytes,salt)
|
// pakeSessionKey(pakeBytes,salt)
|
||||||
|
@ -168,6 +181,7 @@ func pakeSessionKey(this js.Value, inputs []js.Value) interface{} {
|
||||||
var P *pake.Pake
|
var P *pake.Pake
|
||||||
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
b, err := base64.StdEncoding.DecodeString(inputs[0].String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
err = errors.Wrap(err, "could not decode pakeBytes")
|
||||||
return js.Global().Get("Error").New(err.Error())
|
return js.Global().Get("Error").New(err.Error())
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, &P)
|
err = json.Unmarshal(b, &P)
|
||||||
|
@ -201,6 +215,9 @@ func pakeSessionKey(this js.Value, inputs []js.Value) interface{} {
|
||||||
kas.Key = base64.StdEncoding.EncodeToString(cryptKey)
|
kas.Key = base64.StdEncoding.EncodeToString(cryptKey)
|
||||||
kas.Salt = base64.StdEncoding.EncodeToString(cryptSalt)
|
kas.Salt = base64.StdEncoding.EncodeToString(cryptSalt)
|
||||||
b, _ = json.Marshal(kas)
|
b, _ = json.Marshal(kas)
|
||||||
|
|
||||||
|
log.Debugf("key: %x", cryptKey)
|
||||||
|
log.Debugf("salt: %x", cryptSalt)
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue