Skip to content

Commit

Permalink
Fixed server object signature check
Browse files Browse the repository at this point in the history
  • Loading branch information
dominicletz committed Jul 25, 2024
1 parent f1ce4dd commit b280772
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 8 deletions.
25 changes: 17 additions & 8 deletions edge/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,11 +357,12 @@ func doParseServerObjResponse(buffer []byte) (obj *ServerObj, err error) {
}

obj = &ServerObj{
Host: data[1].([]byte),
EdgePort: parseUint(data[2].([]byte)),
ServerPort: parseUint(data[3].([]byte)),
Sig: data[len(data)-1].([]byte),
Extra: map[string]big.Int{},
Host: data[1].([]byte),
EdgePort: parseUint(data[2].([]byte)),
ServerPort: parseUint(data[3].([]byte)),
Sig: data[len(data)-1].([]byte),
Extra: map[string]big.Int{},
ExtraString: map[string]string{},
}

var bertdata []byte
Expand All @@ -377,9 +378,16 @@ func doParseServerObjResponse(buffer []byte) (obj *ServerObj, err error) {
tuples := make([]bert.Term, len(extra))
for i, elem := range extra {
slice := elem.([]interface{})
value := parseBigUint(slice[1].([]byte))
obj.Extra[string(slice[0].([]byte))] = value
tuples[i] = [2]bert.Term{slice[0].([]byte), value}
key := string(slice[0].([]byte))
if key == "name" {
value := slice[1].([]byte)
obj.ExtraString[key] = string(value)
tuples[i] = [2]bert.Term{slice[0].([]byte), value}
} else {
value := parseBigUint(slice[1].([]byte))
obj.Extra[key] = value
tuples[i] = [2]bert.Term{slice[0].([]byte), value}
}
}

bertdata, err = bert.Encode([5]bert.Term{
Expand All @@ -401,6 +409,7 @@ func doParseServerObjResponse(buffer []byte) (obj *ServerObj, err error) {
return
}
obj.ServerPubKey = pubkey
obj.Node = util.PubkeyToAddress(pubkey)
return obj, nil
}

Expand Down
25 changes: 25 additions & 0 deletions edge/ticket_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Diode Network Client
// Copyright 2023 Diode
// Licensed under the Diode License, Version 1.1
package edge

import (
"bytes"
"encoding/hex"
"testing"
)

func TestCheckSignature(t *testing.T) {
const node = `ae699211c62156b8f29ce17be47d2f069a27f2a6`
nodeAddress, _ := hex.DecodeString(node)
buffer, _ := hex.DecodeString(`f8cc01f8c988726573706f6e7365f8be867365727665728f3230372e3138302e3233372e31313282a05682c76f85312e322e34f856d0877469636b6574738794d05000000000cc86757074696d658405f8a4afce8474696d658817e52745e11f051fdd846e616d65976665656c5f70616e746865724064696f64652d65753262ca85626c6f636b83668b73b84101479f8124bf9efab248b3e080784468d910458bd2cb7022797749f6d4808132126e116ac3a2d15436e0c4cbfa0dad091ebd39ac34464a32e26a5d7ee767dcee8d`)
obj, err := doParseServerObjResponse(buffer)

if err != nil {
t.Fatalf("Failed to parse server object response: %v", err)
}

if !bytes.Equal(obj.Node[:], nodeAddress) {
t.Errorf("Host signature recovery failed")
}
}
2 changes: 2 additions & 0 deletions edge/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,14 @@ type Goodbye struct {
}

type ServerObj struct {
Node util.Address
Host []byte
EdgePort uint64
ServerPort uint64
Sig []byte
ServerPubKey []byte
Extra map[string]big.Int
ExtraString map[string]string
}

type StateRoots struct {
Expand Down
1 change: 1 addition & 0 deletions rpc/client_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ func (cm *ClientManager) GetClientOrConnect(nodeID util.Address) (client *Client
fclient.Log().Error("GetServer(): failed to getnode %v", err)
return
}

if util.PubkeyToAddress(serverObj.ServerPubKey) != nodeID {
err = fmt.Errorf("GetServer(): wrong signature in server object %+v", serverObj)
return
Expand Down

0 comments on commit b280772

Please sign in to comment.