mirror of
https://github.com/number571/go-peer.git
synced 2026-09-14 11:05:42 +05:00
update
This commit is contained in:
parent
419c70b1c4
commit
3eaf40d5b4
@ -6,6 +6,10 @@
|
||||
|
||||
*??? ??, ????*
|
||||
|
||||
### CHANGES
|
||||
|
||||
- Update `pkg/client/message`: delete proof of work
|
||||
|
||||
<!-- ... -->
|
||||
|
||||
## v1.5.21
|
||||
|
||||
1
TODO.md
1
TODO.md
@ -10,3 +10,4 @@
|
||||
8. HLF: Hidden Lake Forum
|
||||
9. Append example of use functions (godoc)
|
||||
10. Append errors (as traffic/database) for all interface methods
|
||||
11. Errors change to standard
|
||||
|
||||
@ -43,7 +43,8 @@ $ make docker-run
|
||||
<th>Network key</th>
|
||||
<th>Connections</th>
|
||||
<th>Provider</th>
|
||||
<th>Country/City</th>
|
||||
<th>Country</th>
|
||||
<th>City</th>
|
||||
<th>Characteristics</th>
|
||||
<th>Expired time</th>
|
||||
</tr>
|
||||
@ -56,7 +57,8 @@ $ make docker-run
|
||||
<td>8Jkl93Mdk93md1bz</td>
|
||||
<td>[]</td>
|
||||
<td><a href="https://vdsina.ru">vdsina.ru</a></td>
|
||||
<td>Russia/Moscow</td>
|
||||
<td>Russia</td>
|
||||
<td>Moscow</td>
|
||||
<td>1x4.0GHz, 1.0GB RAM, 30GB HDD</td>
|
||||
<td>±eternal</td>
|
||||
</tr>
|
||||
@ -69,7 +71,8 @@ $ make docker-run
|
||||
<td>8Jkl93Mdk93md1bz</td>
|
||||
<td>[1]</td>
|
||||
<td><a href="https://ruvds.com">ruvds.ru</a></td>
|
||||
<td>Russia/Moscow</td>
|
||||
<td>Russia</td>
|
||||
<td>Moscow</td>
|
||||
<td>1x2.2GHz, 0.5GB RAM, 10GB HDD</td>
|
||||
<td>±28.07.2027</td>
|
||||
</tr>
|
||||
@ -82,7 +85,8 @@ $ make docker-run
|
||||
<td>oi4r9NW9Le7fKF9d</td>
|
||||
<td>[]</td>
|
||||
<td><a href="https://eternalhost.net">eternalhost.net</a></td>
|
||||
<td>Russia/Moscow</td>
|
||||
<td>Russia</td>
|
||||
<td>Moscow</td>
|
||||
<td>1x2.8GHz, 1.0GB RAM, 16GB HDD</td>
|
||||
<td>±eternal</td>
|
||||
</tr>
|
||||
@ -95,7 +99,8 @@ $ make docker-run
|
||||
<td>oi4r9NW9Le7fKF9d</td>
|
||||
<td>[3]</td>
|
||||
<td><a href="https://4vps.su">4vps.su</a></td>
|
||||
<td>Russia/Novosibirsk</td>
|
||||
<td>Russia</td>
|
||||
<td>Novosibirsk</td>
|
||||
<td>1x2.5GHz, 1.0GB RAM, 5GB VNMe</td>
|
||||
<td>±07.08.2027</td>
|
||||
</tr>
|
||||
|
||||
@ -20,6 +20,7 @@ type IEditor interface {
|
||||
type IConfigSettings interface {
|
||||
message.ISettings
|
||||
|
||||
GetWorkSizeBits() uint64
|
||||
GetKeySizeBits() uint64
|
||||
GetQueuePeriodMS() uint64
|
||||
GetLimitVoidSizeBytes() uint64
|
||||
|
||||
@ -214,7 +214,6 @@ func testNewNode(dbPath, addr string) anonymity.INode {
|
||||
}),
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
|
||||
@ -64,7 +64,6 @@ func initNode(pCfg config.IConfig, pPrivKey asymmetric.IPrivKey, pLogger logger.
|
||||
}),
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: cfgSettings.GetWorkSizeBits(),
|
||||
FMessageSizeBytes: cfgSettings.GetMessageSizeBytes(),
|
||||
}),
|
||||
pPrivKey,
|
||||
|
||||
@ -18,6 +18,7 @@ type IConfig interface {
|
||||
type IConfigSettings interface {
|
||||
message.ISettings
|
||||
|
||||
GetWorkSizeBits() uint64
|
||||
GetQueuePeriodMS() uint64
|
||||
GetMessagesCapacity() uint64
|
||||
GetLimitVoidSizeBytes() uint64
|
||||
|
||||
@ -211,7 +211,6 @@ func TestDatabasePush(t *testing.T) {
|
||||
|
||||
clTest := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: 1,
|
||||
FMessageSizeBytes: (10 << 10),
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -230,7 +229,6 @@ func TestDatabasePush(t *testing.T) {
|
||||
|
||||
cl := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -294,7 +292,6 @@ func TestDatabase(t *testing.T) {
|
||||
|
||||
cl := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -346,9 +343,9 @@ func TestDatabase(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
loadMsg := message.LoadMessage(cl.GetSettings(), loadNetMsg.GetPayload().GetBody())
|
||||
if loadMsg == nil {
|
||||
t.Error("got invalid message from load")
|
||||
loadMsg, err := message.LoadMessage(cl.GetSettings(), loadNetMsg.GetPayload().GetBody())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -161,7 +161,6 @@ func testNewClient() client.IClient {
|
||||
return client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
}),
|
||||
privKey,
|
||||
)
|
||||
|
||||
@ -31,7 +31,6 @@ func TestHandleHashesAPI(t *testing.T) {
|
||||
client := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
}),
|
||||
privKey,
|
||||
)
|
||||
|
||||
@ -48,12 +48,12 @@ func TestHandleMessageAPI(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
gotEncMsg := message.LoadMessage(
|
||||
gotEncMsg, err := message.LoadMessage(
|
||||
client.GetSettings(),
|
||||
gotNetMsg.GetPayload().GetBody(),
|
||||
)
|
||||
if gotEncMsg == nil {
|
||||
t.Error("failed to load encrypted message")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -30,18 +30,18 @@ func HandleServiceTCP(pCfg config.IConfig, pWrapperDB database.IWrapperDB, pLogg
|
||||
WithConn(pConn).
|
||||
WithSize(len(pNetMsg.ToBytes()))
|
||||
|
||||
msg := message.LoadMessage(
|
||||
_, err := message.LoadMessage(
|
||||
pCfg.GetSettings(),
|
||||
pNetMsg.GetPayload().GetBody(),
|
||||
)
|
||||
if msg == nil {
|
||||
if err != nil {
|
||||
pLogger.PushWarn(logBuilder.WithType(anon_logger.CLogWarnMessageNull))
|
||||
return errors.NewError("message is nil")
|
||||
return errors.WrapError(err, "load message")
|
||||
}
|
||||
|
||||
var (
|
||||
hash = msg.GetBody().GetHash()
|
||||
proof = msg.GetBody().GetProof()
|
||||
hash = pNetMsg.GetHash()
|
||||
proof = pNetMsg.GetProof()
|
||||
hltDB = pWrapperDB.Get()
|
||||
)
|
||||
|
||||
|
||||
@ -15,10 +15,6 @@ import (
|
||||
"github.com/number571/go-peer/pkg/payload"
|
||||
)
|
||||
|
||||
const (
|
||||
cWorkSize = 20 // bits
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) != 3 {
|
||||
panic(fmt.Sprintf(
|
||||
@ -57,7 +53,6 @@ func main() {
|
||||
|
||||
dataValue := readUntilEOF()
|
||||
sett := message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: cWorkSize,
|
||||
FMessageSizeBytes: getMessageSize(param, dataValue),
|
||||
})
|
||||
|
||||
@ -71,7 +66,11 @@ func main() {
|
||||
fmt.Println(string(msg.ToBytes()))
|
||||
case "D":
|
||||
c := client.NewClient(sett, privKey)
|
||||
_, pld, err := c.DecryptMessage(message.LoadMessage(sett, dataValue))
|
||||
msg, err := message.LoadMessage(sett, dataValue)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
_, pld, err := c.DecryptMessage(msg)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@ -27,7 +27,6 @@ const (
|
||||
|
||||
func main() {
|
||||
sett := message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: 20,
|
||||
FMessageSizeBytes: (8 << 10),
|
||||
})
|
||||
|
||||
@ -102,8 +101,8 @@ func main() {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
msg := message.LoadMessage(client.GetSettings(), netMsg.GetPayload().GetBody())
|
||||
if msg == nil {
|
||||
msg, err := message.LoadMessage(client.GetSettings(), netMsg.GetPayload().GetBody())
|
||||
if err != nil {
|
||||
panic("load message is nil")
|
||||
}
|
||||
|
||||
|
||||
@ -30,12 +30,11 @@ func TestConvert(t *testing.T) {
|
||||
|
||||
params := message.NewSettings(&message.SSettings{
|
||||
FMessageSizeBytes: (2 << 10),
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
})
|
||||
|
||||
msg1 := message.LoadMessage(params, FromBytesToString(testutils.TCBinaryMessage))
|
||||
if msg1 == nil {
|
||||
t.Error("fromBytesToString result is invalid")
|
||||
msg1, err := message.LoadMessage(params, FromBytesToString(testutils.TCBinaryMessage))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
if !bytes.Equal(msg1.ToBytes(), testutils.TCBinaryMessage) {
|
||||
@ -43,9 +42,9 @@ func TestConvert(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
msg2 := message.LoadMessage(params, FromStringToBytes(testutils.TCStringMessage))
|
||||
if msg2 == nil {
|
||||
t.Error("fromStringToBytes result is invalid")
|
||||
msg2, err := message.LoadMessage(params, FromStringToBytes(testutils.TCStringMessage))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
if msg2.ToString() != testutils.TCStringMessage {
|
||||
|
||||
@ -7,7 +7,6 @@ import (
|
||||
"github.com/number571/go-peer/pkg/client/message"
|
||||
"github.com/number571/go-peer/pkg/crypto/asymmetric"
|
||||
"github.com/number571/go-peer/pkg/crypto/hashing"
|
||||
"github.com/number571/go-peer/pkg/crypto/puzzle"
|
||||
"github.com/number571/go-peer/pkg/crypto/random"
|
||||
"github.com/number571/go-peer/pkg/crypto/symmetric"
|
||||
"github.com/number571/go-peer/pkg/encoding"
|
||||
@ -38,7 +37,6 @@ func NewClient(pSett message.ISettings, pPrivKey asymmetric.IPrivKey) IClient {
|
||||
client.GetPubKey(),
|
||||
payload.NewPayload(0, []byte{}),
|
||||
0,
|
||||
0,
|
||||
)
|
||||
|
||||
client.fStructSize = uint64(len(encMsg.ToBytes()))
|
||||
@ -92,12 +90,11 @@ func (p *sClient) EncryptPayload(pRecv asymmetric.IPubKey, pPld payload.IPayload
|
||||
return p.encryptWithParams(
|
||||
pRecv,
|
||||
pPld,
|
||||
p.fSettings.GetWorkSizeBits(),
|
||||
msgLimitSize-resultSize,
|
||||
), nil
|
||||
}
|
||||
|
||||
func (p *sClient) encryptWithParams(pRecv asymmetric.IPubKey, pPld payload.IPayload, pWorkSize, pPadd uint64) message.IMessage {
|
||||
func (p *sClient) encryptWithParams(pRecv asymmetric.IPubKey, pPld payload.IPayload, pPadd uint64) message.IMessage {
|
||||
var (
|
||||
rand = random.NewStdPRNG()
|
||||
salt = rand.GetBytes(symmetric.CAESKeySize)
|
||||
@ -126,21 +123,13 @@ func (p *sClient) encryptWithParams(pRecv asymmetric.IPubKey, pPld payload.IPayl
|
||||
)).ToBytes()
|
||||
|
||||
cipher := symmetric.NewAESCipher(session)
|
||||
bProof := encoding.Uint64ToBytes(puzzle.NewPoWPuzzle(pWorkSize).ProofBytes(hash))
|
||||
|
||||
return &message.SMessage{
|
||||
FHead: message.SHeadMessage{
|
||||
FSender: encoding.HexEncode(cipher.EncryptBytes(p.GetPubKey().ToBytes())),
|
||||
FSession: encoding.HexEncode(pRecv.EncryptBytes(session)),
|
||||
FSalt: encoding.HexEncode(cipher.EncryptBytes(salt)),
|
||||
},
|
||||
FBody: message.SBodyMessage{
|
||||
FHash: encoding.HexEncode(hash),
|
||||
FSign: encoding.HexEncode(cipher.EncryptBytes(p.fPrivKey.SignBytes(hash))),
|
||||
FProof: encoding.HexEncode(bProof[:]),
|
||||
},
|
||||
// JSON field to raw Body (no need HEX encode)
|
||||
FPayload: cipher.EncryptBytes(doublePayload.ToBytes()),
|
||||
FPubKey: encoding.HexEncode(cipher.EncryptBytes(p.GetPubKey().ToBytes())),
|
||||
FEncKey: encoding.HexEncode(pRecv.EncryptBytes(session)),
|
||||
FSalt: encoding.HexEncode(cipher.EncryptBytes(salt)),
|
||||
FHash: encoding.HexEncode(hash),
|
||||
FSign: encoding.HexEncode(cipher.EncryptBytes(p.fPrivKey.SignBytes(hash))),
|
||||
FPayload: cipher.EncryptBytes(doublePayload.ToBytes()), // JSON field to raw Body (no need HEX encode)
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,14 +142,14 @@ func (p *sClient) DecryptMessage(pMsg message.IMessage) (asymmetric.IPubKey, pay
|
||||
}
|
||||
|
||||
// Decrypt session key by private key of receiver.
|
||||
session := p.fPrivKey.DecryptBytes(pMsg.GetHead().GetSession())
|
||||
session := p.fPrivKey.DecryptBytes(pMsg.GetEncKey())
|
||||
if session == nil {
|
||||
return nil, nil, errors.NewError("failed decrypt session key")
|
||||
}
|
||||
|
||||
// Decrypt public key of sender by decrypted session key.
|
||||
cipher := symmetric.NewAESCipher(session)
|
||||
publicBytes := cipher.DecryptBytes(pMsg.GetHead().GetSender())
|
||||
publicBytes := cipher.DecryptBytes(pMsg.GetPubKey())
|
||||
if publicBytes == nil {
|
||||
return nil, nil, errors.NewError("failed decrypt public key")
|
||||
}
|
||||
@ -189,7 +178,7 @@ func (p *sClient) DecryptMessage(pMsg message.IMessage) (asymmetric.IPubKey, pay
|
||||
}
|
||||
|
||||
// Decrypt salt.
|
||||
salt := cipher.DecryptBytes(pMsg.GetHead().GetSalt())
|
||||
salt := cipher.DecryptBytes(pMsg.GetSalt())
|
||||
if salt == nil {
|
||||
return nil, nil, errors.NewError("failed decrypt salt")
|
||||
}
|
||||
@ -203,17 +192,17 @@ func (p *sClient) DecryptMessage(pMsg message.IMessage) (asymmetric.IPubKey, pay
|
||||
},
|
||||
[]byte{},
|
||||
)).ToBytes()
|
||||
if !bytes.Equal(check, pMsg.GetBody().GetHash()) {
|
||||
if !bytes.Equal(check, pMsg.GetHash()) {
|
||||
return nil, nil, errors.NewError("invalid msg hash")
|
||||
}
|
||||
|
||||
// Decrypt sign of message and verify this
|
||||
// by public key of sender and hash of message.
|
||||
sign := cipher.DecryptBytes(pMsg.GetBody().GetSign())
|
||||
sign := cipher.DecryptBytes(pMsg.GetSign())
|
||||
if sign == nil {
|
||||
return nil, nil, errors.NewError("failed decrypt sign")
|
||||
}
|
||||
if !pubKey.VerifyBytes(pMsg.GetBody().GetHash(), sign) {
|
||||
if !pubKey.VerifyBytes(pMsg.GetHash(), sign) {
|
||||
return nil, nil, errors.NewError("invalid msg sign")
|
||||
}
|
||||
|
||||
|
||||
@ -61,7 +61,6 @@ func TestClientWithMessageSize(t *testing.T) {
|
||||
}()
|
||||
_ = NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: 1024,
|
||||
}),
|
||||
tgPrivKey,
|
||||
@ -119,35 +118,28 @@ func TestDecrypt(t *testing.T) {
|
||||
sMsg := msg.(*message.SMessage)
|
||||
|
||||
sMsg1 := *sMsg
|
||||
sMsg1.FBody.FHash = "0"
|
||||
sMsg1.FHash = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg1); err == nil {
|
||||
t.Error("success decrypt message with incorrect hash")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg2 := *sMsg
|
||||
sMsg2.FBody.FProof = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg2); err == nil {
|
||||
t.Error("success decrypt message with incorrect proof")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg3 := *sMsg
|
||||
sMsg3.FHead.FSession = "0"
|
||||
sMsg3.FEncKey = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg3); err == nil {
|
||||
t.Error("success decrypt message with incorrect session key")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg4 := *sMsg
|
||||
sMsg4.FHead.FSender = "0"
|
||||
sMsg4.FPubKey = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg4); err == nil {
|
||||
t.Error("success decrypt message with incorrect sender key (iv block)")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg5 := *sMsg
|
||||
sMsg5.FHead.FSender = "11111111111111111111111111111111"
|
||||
sMsg5.FPubKey = "11111111111111111111111111111111"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg5); err == nil {
|
||||
t.Error("success decrypt message with incorrect sender key (public key is nil)")
|
||||
return
|
||||
@ -168,28 +160,28 @@ func TestDecrypt(t *testing.T) {
|
||||
}
|
||||
|
||||
sMsg8 := *sMsg
|
||||
sMsg8.FHead.FSalt = "0"
|
||||
sMsg8.FSalt = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg8); err == nil {
|
||||
t.Error("success decrypt message with incorrect salt")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg9 := *sMsg
|
||||
sMsg9.FBody.FHash = "111da32433c2d7f99b38042d7b73db291bd803c55f3c83745ae3ebae6ba111"
|
||||
sMsg9.FHash = "111da32433c2d7f99b38042d7b73db291bd803c55f3c83745ae3ebae6ba111"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg9); err == nil {
|
||||
t.Error("success decrypt message with incorrect hash check")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg10 := *sMsg
|
||||
sMsg10.FBody.FSign = "0"
|
||||
sMsg10.FSign = "0"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg10); err == nil {
|
||||
t.Error("success decrypt message with incorrect sign")
|
||||
return
|
||||
}
|
||||
|
||||
sMsg11 := *sMsg
|
||||
sMsg11.FBody.FSign = "111ce5d111c74a0b8638f24f8ff200f64ca0e88cda1fd483783930b08e465fa9fc9565a0a3afbdfdf3f463bc77e526f2c41c6ddd2dae5d6f90e741442e2939731cbdad4071c29eff83dff932589b2cbfd8fa8a5fac19de4c40c3adde4cde1235c0bbf053b0e04e826993f8060a50c671c6bf56ce24fe4e921b60f6ca2239932ebd1b8c8556d5a2ac13e5ef1d8ea9c111"
|
||||
sMsg11.FSign = "111ce5d111c74a0b8638f24f8ff200f64ca0e88cda1fd483783930b08e465fa9fc9565a0a3afbdfdf3f463bc77e526f2c41c6ddd2dae5d6f90e741442e2939731cbdad4071c29eff83dff932589b2cbfd8fa8a5fac19de4c40c3adde4cde1235c0bbf053b0e04e826993f8060a50c671c6bf56ce24fe4e921b60f6ca2239932ebd1b8c8556d5a2ac13e5ef1d8ea9c111"
|
||||
if _, _, err := client1.DecryptMessage(&sMsg11); err == nil {
|
||||
t.Error("success decrypt message with incorrect sign check")
|
||||
return
|
||||
@ -247,7 +239,6 @@ func TestGetMessageLimit(t *testing.T) {
|
||||
func testNewClient() IClient {
|
||||
return NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: tcMessageSize,
|
||||
}),
|
||||
tgPrivKey,
|
||||
|
||||
@ -36,7 +36,6 @@ func newClient() client.IClient {
|
||||
return client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FMessageSizeBytes: (1 << 12),
|
||||
FWorkSizeBits: 10,
|
||||
}),
|
||||
asymmetric.NewRSAPrivKey(1024),
|
||||
)
|
||||
|
||||
@ -6,8 +6,8 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/number571/go-peer/pkg/crypto/hashing"
|
||||
"github.com/number571/go-peer/pkg/crypto/puzzle"
|
||||
"github.com/number571/go-peer/pkg/encoding"
|
||||
"github.com/number571/go-peer/pkg/errors"
|
||||
"github.com/number571/go-peer/pkg/payload"
|
||||
)
|
||||
|
||||
@ -16,37 +16,26 @@ var (
|
||||
)
|
||||
|
||||
const (
|
||||
CSeparator = "==="
|
||||
CSeparator = "@"
|
||||
cSeparatorLen = len(CSeparator)
|
||||
)
|
||||
|
||||
var (
|
||||
_ IMessage = &SMessage{}
|
||||
_ IHead = SHeadMessage{}
|
||||
_ IBody = SBodyMessage{}
|
||||
)
|
||||
|
||||
// Basic structure of transport package.
|
||||
type SMessage struct {
|
||||
FHead SHeadMessage `json:"head"`
|
||||
FBody SBodyMessage `json:"body"`
|
||||
FPayload []byte `json:"-"`
|
||||
}
|
||||
|
||||
type SHeadMessage struct {
|
||||
FPubKey string `json:"pubk"`
|
||||
FEncKey string `json:"enck"`
|
||||
FSalt string `json:"salt"`
|
||||
FSession string `json:"session"`
|
||||
FSender string `json:"sender"`
|
||||
}
|
||||
|
||||
type SBodyMessage struct {
|
||||
FSign string `json:"sign"`
|
||||
FHash string `json:"hash"`
|
||||
FProof string `json:"proof"`
|
||||
FHash string `json:"hash"`
|
||||
FSign string `json:"sign"`
|
||||
FPayload []byte `json:"-"`
|
||||
}
|
||||
|
||||
// Message can be created only with client module.
|
||||
func LoadMessage(psett ISettings, pMsg interface{}) IMessage {
|
||||
func LoadMessage(psett ISettings, pMsg interface{}) (IMessage, error) {
|
||||
msg := new(SMessage)
|
||||
|
||||
var recvMsg []byte
|
||||
@ -56,16 +45,16 @@ func LoadMessage(psett ISettings, pMsg interface{}) IMessage {
|
||||
case string:
|
||||
recvMsg = []byte(x)
|
||||
default:
|
||||
return nil
|
||||
return nil, errors.NewError("unknown type of message")
|
||||
}
|
||||
|
||||
i := bytes.Index(recvMsg, []byte(CSeparator))
|
||||
if i == -1 {
|
||||
return nil
|
||||
return nil, errors.NewError("undefined separator")
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(recvMsg[:i], msg); err != nil {
|
||||
return nil
|
||||
return nil, errors.NewError("unmarshal message")
|
||||
}
|
||||
|
||||
switch x := pMsg.(type) {
|
||||
@ -75,25 +64,41 @@ func LoadMessage(psett ISettings, pMsg interface{}) IMessage {
|
||||
encStr := strings.TrimSpace(x[i+cSeparatorLen:])
|
||||
msg.FPayload = encoding.HexDecode(encStr)
|
||||
if msg.FPayload == nil {
|
||||
return nil
|
||||
return nil, errors.NewError("hex decode payload")
|
||||
}
|
||||
default:
|
||||
panic("got unknown type")
|
||||
}
|
||||
|
||||
if !msg.IsValid(psett) {
|
||||
return nil
|
||||
return nil, errors.NewError("message is invalid")
|
||||
}
|
||||
|
||||
return msg
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
func (p *SMessage) GetHead() IHead {
|
||||
return p.FHead
|
||||
func (p *SMessage) GetPubKey() []byte {
|
||||
return encoding.HexDecode(p.FPubKey)
|
||||
}
|
||||
|
||||
func (p *SMessage) GetBody() IBody {
|
||||
return p.FBody
|
||||
func (p *SMessage) GetEncKey() []byte {
|
||||
return encoding.HexDecode(p.FEncKey)
|
||||
}
|
||||
|
||||
func (p *SMessage) GetSalt() []byte {
|
||||
return encoding.HexDecode(p.FSalt)
|
||||
}
|
||||
|
||||
func (p *SMessage) GetHash() []byte {
|
||||
return encoding.HexDecode(p.FHash)
|
||||
}
|
||||
|
||||
func (p *SMessage) GetSign() []byte {
|
||||
return encoding.HexDecode(p.FSign)
|
||||
}
|
||||
|
||||
func (p *SMessage) GetPayload() payload.IPayload {
|
||||
return payload.LoadPayload(p.FPayload)
|
||||
}
|
||||
|
||||
func (p *SMessage) ToBytes() []byte {
|
||||
@ -117,50 +122,12 @@ func (p *SMessage) ToString() string {
|
||||
}
|
||||
|
||||
func (p *SMessage) IsValid(psett ISettings) bool {
|
||||
if uint64(len(p.ToBytes())) != psett.GetMessageSizeBytes() {
|
||||
switch {
|
||||
case uint64(len(p.ToBytes())) != psett.GetMessageSizeBytes():
|
||||
fallthrough
|
||||
case len(p.GetHash()) != hashing.CSHA256Size:
|
||||
return false
|
||||
default:
|
||||
return true
|
||||
}
|
||||
if len(p.GetBody().GetHash()) != hashing.CSHA256Size {
|
||||
return false
|
||||
}
|
||||
puzzle := puzzle.NewPoWPuzzle(psett.GetWorkSizeBits())
|
||||
return puzzle.VerifyBytes(p.GetBody().GetHash(), p.GetBody().GetProof())
|
||||
}
|
||||
|
||||
func (p *SMessage) GetPayload() payload.IPayload {
|
||||
return payload.LoadPayload(p.FPayload)
|
||||
}
|
||||
|
||||
// IHead
|
||||
|
||||
func (p SHeadMessage) GetSender() []byte {
|
||||
return encoding.HexDecode(p.FSender)
|
||||
}
|
||||
|
||||
func (p SHeadMessage) GetSession() []byte {
|
||||
return encoding.HexDecode(p.FSession)
|
||||
}
|
||||
|
||||
func (p SHeadMessage) GetSalt() []byte {
|
||||
return encoding.HexDecode(p.FSalt)
|
||||
}
|
||||
|
||||
// IBody
|
||||
|
||||
func (p SBodyMessage) GetHash() []byte {
|
||||
return encoding.HexDecode(p.FHash)
|
||||
}
|
||||
|
||||
func (p SBodyMessage) GetSign() []byte {
|
||||
return encoding.HexDecode(p.FSign)
|
||||
}
|
||||
|
||||
func (p SBodyMessage) GetProof() uint64 {
|
||||
bProof := encoding.HexDecode(p.FProof)
|
||||
if len(bProof) != encoding.CSizeUint64 {
|
||||
return 0
|
||||
}
|
||||
res := [encoding.CSizeUint64]byte{}
|
||||
copy(res[:], bProof)
|
||||
return encoding.BytesToUint64(res)
|
||||
}
|
||||
|
||||
@ -10,16 +10,15 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
tcSalt = "2823c693930a2d230415368221c36f5c1c77accd82c949e5de13bbe8ef00275b72d182d79759b1aef582649c99afd409"
|
||||
tcSession = "21273151593d606632e0015107c1f204af68dd1a4977a6e7717260936dc4043e1f57410914f0dcffe372d4fc948ce0b12e9449e9e35556416d6e0f4f1d6c08807b0e98588aeea85c3f4a62512d82d159734d80ea16af0380a0d77f57c5444eaaf4cd9eed67f13fbc4699c608736286cba3e962fdc1642beac195ec59dd2d926a"
|
||||
tcSender = "bc2ebe882b76fd7ab77ec19416328902f685dfedec57285d60ac154d7fa67a9d735bd3f22ba4f7394fead3c35bbcc30b8f67dccd15c8a663f4014785124eaf098ed83027870949ed4bc0a0516a9ac901f185b71d7765e14b00edf2743cd02b266695977c8730f891d76c9a69795806edb61426b8bc2f3d32de0a074995844eed93a5648532ff0ba8ee5b1ebd6bd3b33620b7d938852776b8b99276fa"
|
||||
tcSalt = "327d3d5fa3e8df5012ca12a8d65d0644669861797f659ac13adf15c2508bec5bd43538ba6c5c6871992c35ebafdaf019"
|
||||
tcSession = "58e578980580a793c01765b6d8709784d41dbcb53f3fe87e7e4e4d4b33c4f93295bac351966d6cd70f5e352cae1d290bec3b8234d4048807e5aa4d3bb983ab0d668be1f2843b77aea181ea8b92ffbf641aa5f8e25e12243ade696cbace216c5148cb68d0ae93342da9712561b1ca806dd992ce6d14b1cb0d6211780faae7ca15"
|
||||
tcSender = "ac2a318e0e0f4548f07b5444d293304b52bde3e22e23da82147d03a4b6721b98dc43a53adbc1ff33a3819f0c3899b3e2dc9b7cb18b0da96ad6c4ff93123764b68ec660314ee13167c7ece3bb73c72258e05c273155b2bb13860820aebf9c9400158f38b3208826e176ef5b90ea209c5fc302e8162f75ae8fa2bf4c50f5c16256d5d413e6bf69592ed90ae9f91af590c06faf71b5e87ba3dc4a4f96b3"
|
||||
|
||||
tcSign = "fb3ce5d111c74a0b8638f24f8ff200f64ca0e88cda1fd483783930b08e465fa9fc9565a0a3afbdfdf3f463bc77e526f2c41c6ddd2dae5d6f90e741442e2939731cbdad4071c29eff83dff932589b2cbfd8fa8a5fac19de4c40c3adde4cde1235c0bbf053b0e04e826993f8060a50c671c6bf56ce24fe4e921b60f6ca2239932ebd1b8c8556d5a2ac13e5ef1d8ea9cca8"
|
||||
tcHash = "e1cc8da32433c2d7f99b38042d7b73db291bd803c55f3c83745ae3ebae6baffe"
|
||||
tcProof = 4512
|
||||
tcSign = "cd18d99ec9af3dabd548a5e2b8e4f34add2605671c733342968159eb9fc23484ca14b7b6e465fa3527bcc03a50aa6203240077c5118e18f28d48939df5bfab4fa3d59ed3b23a0bc6a8ba08275256a6c3577bcb887ed7657578e7de711eac7af88de9f75f0fce0428134aa24fe5c9655256c7753d54b49a5504c8d1a2a1d242c8d4459431474ebe9f5e4bd005d7a94681"
|
||||
tcHash = "3d90d389b7454bd3f1a84c4509c0afdc2a92d6acafdd387a541590ed6caf34e0"
|
||||
|
||||
// -1 byte from hash
|
||||
tcInvalidPrefix = `{"head":{"salt":"2823c693930a2d230415368221c36f5c1c77accd82c949e5de13bbe8ef00275b72d182d79759b1aef582649c99afd409","session":"21273151593d606632e0015107c1f204af68dd1a4977a6e7717260936dc4043e1f57410914f0dcffe372d4fc948ce0b12e9449e9e35556416d6e0f4f1d6c08807b0e98588aeea85c3f4a62512d82d159734d80ea16af0380a0d77f57c5444eaaf4cd9eed67f13fbc4699c608736286cba3e962fdc1642beac195ec59dd2d926a","sender":"bc2ebe882b76fd7ab77ec19416328902f685dfedec57285d60ac154d7fa67a9d735bd3f22ba4f7394fead3c35bbcc30b8f67dccd15c8a663f4014785124eaf098ed83027870949ed4bc0a0516a9ac901f185b71d7765e14b00edf2743cd02b266695977c8730f891d76c9a69795806edb61426b8bc2f3d32de0a074995844eed93a5648532ff0ba8ee5b1ebd6bd3b33620b7d938852776b8b99276fa"},"body":{"sign":"fb3ce5d111c74a0b8638f24f8ff200f64ca0e88cda1fd483783930b08e465fa9fc9565a0a3afbdfdf3f463bc77e526f2c41c6ddd2dae5d6f90e741442e2939731cbdad4071c29eff83dff932589b2cbfd8fa8a5fac19de4c40c3adde4cde1235c0bbf053b0e04e826993f8060a50c671c6bf56ce24fe4e921b60f6ca2239932ebd1b8c8556d5a2ac13e5ef1d8ea9cca8","hash":"cc8da32433c2d7f99b38042d7b73db291bd803c55f3c83745ae3ebae6baffe","proof":"00000000000011a0"}}===`
|
||||
tcInvalidPrefix = `{"pubk":"ac2a318e0e0f4548f07b5444d293304b52bde3e22e23da82147d03a4b6721b98dc43a53adbc1ff33a3819f0c3899b3e2dc9b7cb18b0da96ad6c4ff93123764b68ec660314ee13167c7ece3bb73c72258e05c273155b2bb13860820aebf9c9400158f38b3208826e176ef5b90ea209c5fc302e8162f75ae8fa2bf4c50f5c16256d5d413e6bf69592ed90ae9f91af590c06faf71b5e87ba3dc4a4f96b3","enck":"58e578980580a793c01765b6d8709784d41dbcb53f3fe87e7e4e4d4b33c4f93295bac351966d6cd70f5e352cae1d290bec3b8234d4048807e5aa4d3bb983ab0d668be1f2843b77aea181ea8b92ffbf641aa5f8e25e12243ade696cbace216c5148cb68d0ae93342da9712561b1ca806dd992ce6d14b1cb0d6211780faae7ca15","salt":"327d3d5fa3e8df5012ca12a8d65d0644669861797f659ac13adf15c2508bec5bd43538ba6c5c6871992c35ebafdaf019","hash":"3dd389b7454bd3f1a84c4509c0afdc2a92d6acafdd387a541590ed6caf34e0","sign":"cd18d99ec9af3dabd548a5e2b8e4f34add2605671c733342968159eb9fc23484ca14b7b6e465fa3527bcc03a50aa6203240077c5118e18f28d48939df5bfab4fa3d59ed3b23a0bc6a8ba08275256a6c3577bcb887ed7657578e7de711eac7af88de9f75f0fce0428134aa24fe5c9655256c7753d54b49a5504c8d1a2a1d242c8d4459431474ebe9f5e4bd005d7a94681"}@`
|
||||
)
|
||||
|
||||
func TestSettings(t *testing.T) {
|
||||
@ -48,36 +47,35 @@ func TestInvalidMessage(t *testing.T) {
|
||||
|
||||
params := NewSettings(&SSettings{
|
||||
FMessageSizeBytes: (2 << 10),
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
})
|
||||
|
||||
if msg := LoadMessage(params, struct{}{}); msg != nil {
|
||||
if _, err := LoadMessage(params, struct{}{}); err == nil {
|
||||
t.Error("success load message with unknown type")
|
||||
return
|
||||
}
|
||||
|
||||
if msg := LoadMessage(params, []byte{123}); msg != nil {
|
||||
if _, err := LoadMessage(params, []byte{123}); err == nil {
|
||||
t.Error("success load invalid message")
|
||||
return
|
||||
}
|
||||
|
||||
if msg := LoadMessage(params, []byte(CSeparator)); msg != nil {
|
||||
if _, err := LoadMessage(params, []byte(CSeparator)); err == nil {
|
||||
t.Error("success unmarshal invalid message")
|
||||
return
|
||||
}
|
||||
|
||||
if msg := LoadMessage(params, tcInvalidPrefix+"!@#"); msg != nil {
|
||||
if _, err := LoadMessage(params, tcInvalidPrefix+"!@#"); err == nil {
|
||||
t.Error("success decode body in invalid message")
|
||||
return
|
||||
}
|
||||
|
||||
if msg := LoadMessage(params, []byte(tcInvalidPrefix+"12")); msg != nil {
|
||||
if _, err := LoadMessage(params, []byte(tcInvalidPrefix+"12")); err == nil {
|
||||
t.Error("success decode body with invalid message size")
|
||||
return
|
||||
}
|
||||
|
||||
prng := random.NewStdPRNG()
|
||||
if msg := LoadMessage(params, []byte(tcInvalidPrefix+"12"+prng.GetString(928))); msg != nil {
|
||||
if _, err := LoadMessage(params, []byte(tcInvalidPrefix+"12"+prng.GetString(928))); err == nil {
|
||||
t.Error("success decode body with invalid message size")
|
||||
return
|
||||
}
|
||||
@ -88,67 +86,55 @@ func TestMessage(t *testing.T) {
|
||||
|
||||
params := NewSettings(&SSettings{
|
||||
FMessageSizeBytes: (2 << 10),
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
})
|
||||
|
||||
msg1 := LoadMessage(params, testutils.TCBinaryMessage)
|
||||
if msg1 == nil {
|
||||
t.Error("failed load message")
|
||||
msg1, err := LoadMessage(params, testutils.TCBinaryMessage)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
testMessage(t, msg1)
|
||||
|
||||
msg2 := LoadMessage(params, testutils.TCStringMessage)
|
||||
if msg2 == nil {
|
||||
t.Error("failed load message")
|
||||
msg2, err := LoadMessage(params, testutils.TCStringMessage)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
testMessage(t, msg2)
|
||||
}
|
||||
|
||||
func testMessage(t *testing.T, msg IMessage) {
|
||||
if !bytes.Equal(msg.GetHead().GetSalt(), encoding.HexDecode(tcSalt)) {
|
||||
if !bytes.Equal(msg.GetSalt(), encoding.HexDecode(tcSalt)) {
|
||||
t.Error("incorrect salt value")
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(msg.GetHead().GetSession(), encoding.HexDecode(tcSession)) {
|
||||
if !bytes.Equal(msg.GetEncKey(), encoding.HexDecode(tcSession)) {
|
||||
t.Error("incorrect session value")
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(msg.GetHead().GetSender(), encoding.HexDecode(tcSender)) {
|
||||
if !bytes.Equal(msg.GetPubKey(), encoding.HexDecode(tcSender)) {
|
||||
t.Error("incorrect sender value")
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(msg.GetBody().GetSign(), encoding.HexDecode(tcSign)) {
|
||||
if !bytes.Equal(msg.GetSign(), encoding.HexDecode(tcSign)) {
|
||||
t.Error("incorrect sign value")
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(msg.GetBody().GetHash(), encoding.HexDecode(tcHash)) {
|
||||
if !bytes.Equal(msg.GetHash(), encoding.HexDecode(tcHash)) {
|
||||
t.Error("incorrect hash value")
|
||||
return
|
||||
}
|
||||
|
||||
if msg.GetBody().GetProof() != tcProof {
|
||||
t.Error("incorrect proof value")
|
||||
return
|
||||
}
|
||||
|
||||
if msg.GetPayload() == nil {
|
||||
t.Error("failed get encrypted payload")
|
||||
return
|
||||
}
|
||||
|
||||
msg1 := msg.(*SMessage)
|
||||
msg1.FBody.FProof = "111"
|
||||
if msg.GetBody().GetProof() != 0 {
|
||||
t.Error("got not null value with incorrect proof")
|
||||
return
|
||||
}
|
||||
|
||||
msg1.FPayload = []byte{123}
|
||||
if msg.GetPayload() != nil {
|
||||
t.Error("success got incorrect payload")
|
||||
|
||||
@ -6,13 +6,11 @@ var (
|
||||
|
||||
type SSettings sSettings
|
||||
type sSettings struct {
|
||||
FWorkSizeBits uint64
|
||||
FMessageSizeBytes uint64
|
||||
}
|
||||
|
||||
func NewSettings(pSett *SSettings) ISettings {
|
||||
return (&sSettings{
|
||||
FWorkSizeBits: pSett.FWorkSizeBits,
|
||||
FMessageSizeBytes: pSett.FMessageSizeBytes,
|
||||
}).mustNotNull()
|
||||
}
|
||||
@ -24,10 +22,6 @@ func (p *sSettings) mustNotNull() ISettings {
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *sSettings) GetWorkSizeBits() uint64 {
|
||||
return p.FWorkSizeBits
|
||||
}
|
||||
|
||||
func (p *sSettings) GetMessageSizeBytes() uint64 {
|
||||
return p.FMessageSizeBytes
|
||||
}
|
||||
|
||||
@ -5,28 +5,17 @@ import (
|
||||
"github.com/number571/go-peer/pkg/types"
|
||||
)
|
||||
|
||||
type ISettings interface {
|
||||
GetMessageSizeBytes() uint64
|
||||
}
|
||||
|
||||
type IMessage interface {
|
||||
types.IConverter
|
||||
IsValid(ISettings) bool
|
||||
|
||||
GetHead() IHead
|
||||
GetBody() IBody
|
||||
GetPayload() payload.IPayload
|
||||
}
|
||||
|
||||
type ISettings interface {
|
||||
GetMessageSizeBytes() uint64
|
||||
GetWorkSizeBits() uint64
|
||||
}
|
||||
|
||||
type IHead interface {
|
||||
GetSender() []byte
|
||||
GetSession() []byte
|
||||
GetSalt() []byte
|
||||
}
|
||||
|
||||
type IBody interface {
|
||||
GetHash() []byte
|
||||
GetSign() []byte
|
||||
GetProof() uint64
|
||||
GetPubKey() []byte // Public key of the sender.
|
||||
GetEncKey() []byte // One-time key of encryption data.
|
||||
GetSalt() []byte // Random bytes for hide data of the hash.
|
||||
GetHash() []byte // Hash of the (sender + receiver + payload).
|
||||
GetSign() []byte // Sign of the hash.
|
||||
GetPayload() payload.IPayload // Main data.
|
||||
}
|
||||
|
||||
@ -25,7 +25,6 @@ func main() {
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FMessageSizeBytes: (1 << 12),
|
||||
FWorkSizeBits: 10,
|
||||
}),
|
||||
asymmetric.NewRSAPrivKey(1024),
|
||||
),
|
||||
|
||||
@ -52,7 +52,6 @@ func TestRunStopQueue(t *testing.T) {
|
||||
|
||||
client := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -113,7 +112,6 @@ func TestQueue(t *testing.T) {
|
||||
|
||||
oldClient := client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -151,7 +149,7 @@ func testQueue(queue IMessageQueue) error {
|
||||
|
||||
for i := 0; i < len(msgs)-1; i++ {
|
||||
for j := i + 1; j < len(msgs); j++ {
|
||||
if bytes.Equal(msgs[i].GetBody().GetHash(), msgs[j].GetBody().GetHash()) {
|
||||
if bytes.Equal(msgs[i].GetHash(), msgs[j].GetHash()) {
|
||||
return fmt.Errorf("hash of messages equals (%d and %d)", i, i)
|
||||
}
|
||||
}
|
||||
@ -166,13 +164,13 @@ func testQueue(queue IMessageQueue) error {
|
||||
return err
|
||||
}
|
||||
|
||||
hash := msg.GetBody().GetHash()
|
||||
hash := msg.GetHash()
|
||||
for i := 0; i < 3; i++ {
|
||||
queue.EnqueueMessage(msg)
|
||||
}
|
||||
for i := 0; i < 3; i++ {
|
||||
msg := <-queue.DequeueMessage()
|
||||
if !bytes.Equal(msg.GetBody().GetHash(), hash) {
|
||||
if !bytes.Equal(msg.GetHash(), hash) {
|
||||
return fmt.Errorf("hash of messages not equals (%d)", i)
|
||||
}
|
||||
}
|
||||
|
||||
@ -169,16 +169,6 @@ func (p *sNode) recv(pActionKey string) ([]byte, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *sNode) newNetworkMessage(pSett net_message.ISettings, pMsg message.IMessage) net_message.IMessage {
|
||||
return net_message.NewMessage(
|
||||
pSett,
|
||||
payload.NewPayload(
|
||||
p.fSettings.GetNetworkMask(),
|
||||
pMsg.ToBytes(),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func (p *sNode) runQueue() error {
|
||||
if err := p.fQueue.Run(); err != nil {
|
||||
return errors.WrapError(err, "run queue")
|
||||
@ -227,10 +217,13 @@ func (p *sNode) handleWrapper() network.IHandlerF {
|
||||
logBuilder.WithConn(pConn)
|
||||
|
||||
client := p.fQueue.GetClient()
|
||||
msg := message.LoadMessage(
|
||||
msg, err := message.LoadMessage(
|
||||
client.GetSettings(),
|
||||
pMsg.GetPayload().GetBody(),
|
||||
)
|
||||
if err != nil {
|
||||
return errors.WrapError(err, "load message")
|
||||
}
|
||||
|
||||
// try store hash of message
|
||||
if ok, err := p.storeHashWithBroadcast(logBuilder, msg, pMsg); !ok {
|
||||
@ -345,15 +338,13 @@ func (p *sNode) enqueuePayload(pType iDataType, pRecv asymmetric.IPubKey, pPld p
|
||||
}
|
||||
|
||||
var (
|
||||
size = len(msg.ToBytes())
|
||||
hash = msg.GetBody().GetHash()
|
||||
proof = msg.GetBody().GetProof()
|
||||
size = len(msg.ToBytes())
|
||||
hash = msg.GetHash()
|
||||
)
|
||||
|
||||
// enrich logger
|
||||
logBuilder.
|
||||
WithHash(hash).
|
||||
WithProof(proof).
|
||||
WithSize(size).
|
||||
WithType(logType)
|
||||
|
||||
@ -374,8 +365,8 @@ func (p *sNode) storeHashWithBroadcast(pLogBuilder anon_logger.ILogBuilder, pMsg
|
||||
|
||||
var (
|
||||
size = len(pMsg.ToBytes())
|
||||
hash = pMsg.GetBody().GetHash()
|
||||
proof = pMsg.GetBody().GetProof()
|
||||
hash = pNetMsg.GetHash()
|
||||
proof = pNetMsg.GetProof()
|
||||
database = p.fWrapperDB.Get()
|
||||
myAddress = p.fQueue.GetClient().GetPubKey().GetAddress().ToBytes()
|
||||
)
|
||||
|
||||
@ -14,6 +14,7 @@ import (
|
||||
"github.com/number571/go-peer/pkg/errors"
|
||||
"github.com/number571/go-peer/pkg/logger"
|
||||
"github.com/number571/go-peer/pkg/network"
|
||||
"github.com/number571/go-peer/pkg/payload"
|
||||
"github.com/number571/go-peer/pkg/queue_set"
|
||||
"github.com/number571/go-peer/pkg/storage"
|
||||
"github.com/number571/go-peer/pkg/storage/database"
|
||||
@ -375,7 +376,7 @@ func TestHandleWrapper(t *testing.T) {
|
||||
}
|
||||
|
||||
sett := net_message.NewSettings(&net_message.SSettings{})
|
||||
netMsg := node.newNetworkMessage(sett, msg)
|
||||
netMsg := node.testNewNetworkMessage(sett, msg)
|
||||
if err := handler(nil, nil, netMsg); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
@ -405,7 +406,7 @@ func TestHandleWrapper(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
netMsg2 := node.newNetworkMessage(sett, msg2)
|
||||
netMsg2 := node.testNewNetworkMessage(sett, msg2)
|
||||
if err := handler(nil, nil, netMsg2); err != nil {
|
||||
t.Error(err) // works only logger
|
||||
return
|
||||
@ -423,7 +424,7 @@ func TestHandleWrapper(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
netMsg3 := node.newNetworkMessage(sett, msg3)
|
||||
netMsg3 := node.testNewNetworkMessage(sett, msg3)
|
||||
if err := handler(nil, nil, netMsg3); err != nil {
|
||||
t.Error(err) // works only logger
|
||||
return
|
||||
@ -441,7 +442,7 @@ func TestHandleWrapper(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
netMsg4 := node.newNetworkMessage(sett, msg4)
|
||||
netMsg4 := node.testNewNetworkMessage(sett, msg4)
|
||||
if err := handler(nil, nil, netMsg4); err != nil {
|
||||
t.Error(err) // works only logger
|
||||
return
|
||||
@ -470,7 +471,7 @@ func TestStoreHashWithBroadcastMessage(t *testing.T) {
|
||||
}
|
||||
|
||||
sett := net_message.NewSettings(&net_message.SSettings{})
|
||||
netMsg := node.newNetworkMessage(sett, msg)
|
||||
netMsg := node.testNewNetworkMessage(sett, msg)
|
||||
logBuilder := anon_logger.NewLogBuilder("_")
|
||||
|
||||
if ok, err := node.storeHashWithBroadcast(logBuilder, nil, nil); ok || err == nil {
|
||||
@ -673,7 +674,6 @@ func testNewNode(timeWait time.Duration, addr string, typeDB, numDB int) INode {
|
||||
}),
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: testutils.TCWorkSize,
|
||||
FMessageSizeBytes: testutils.TCMessageSize,
|
||||
}),
|
||||
asymmetric.LoadRSAPrivKey(testutils.Tc1PrivKey1024),
|
||||
@ -701,3 +701,13 @@ func testDeleteDB(typeDB int) {
|
||||
os.RemoveAll(fmt.Sprintf(tcPathDBTemplate, typeDB, i))
|
||||
}
|
||||
}
|
||||
|
||||
func (p *sNode) testNewNetworkMessage(pSett net_message.ISettings, pMsg message.IMessage) net_message.IMessage {
|
||||
return net_message.NewMessage(
|
||||
pSett,
|
||||
payload.NewPayload(
|
||||
p.fSettings.GetNetworkMask(),
|
||||
pMsg.ToBytes(),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@ -132,7 +132,6 @@ func newNode(serviceAddress, name, dbPath string) anonymity.INode {
|
||||
}),
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: 10,
|
||||
FMessageSizeBytes: msgSize,
|
||||
}),
|
||||
asymmetric.NewRSAPrivKey(1024),
|
||||
|
||||
@ -170,7 +170,6 @@ func newNode(serviceAddress, name, dbPath string) anonymity.INode {
|
||||
}),
|
||||
client.NewClient(
|
||||
message.NewSettings(&message.SSettings{
|
||||
FWorkSizeBits: 10,
|
||||
FMessageSizeBytes: msgSize,
|
||||
}),
|
||||
asymmetric.NewRSAPrivKey(1024),
|
||||
|
||||
@ -4,7 +4,7 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/number571/go-peer/pkg/network/message"
|
||||
net_message "github.com/number571/go-peer/pkg/network/message"
|
||||
"github.com/number571/go-peer/pkg/types"
|
||||
)
|
||||
|
||||
@ -14,12 +14,12 @@ type IConn interface {
|
||||
GetSettings() ISettings
|
||||
GetSocket() net.Conn
|
||||
|
||||
WriteMessage(message.IMessage) error
|
||||
ReadMessage(chan struct{}) (message.IMessage, error)
|
||||
WriteMessage(net_message.IMessage) error
|
||||
ReadMessage(chan struct{}) (net_message.IMessage, error)
|
||||
}
|
||||
|
||||
type ISettings interface {
|
||||
message.ISettings
|
||||
net_message.ISettings
|
||||
|
||||
// for subsequent inheritance on multiple connections
|
||||
SetNetworkKey(string)
|
||||
|
||||
Binary file not shown.
@ -1 +1 @@
|
||||
{"head":{"salt":"2823c693930a2d230415368221c36f5c1c77accd82c949e5de13bbe8ef00275b72d182d79759b1aef582649c99afd409","session":"21273151593d606632e0015107c1f204af68dd1a4977a6e7717260936dc4043e1f57410914f0dcffe372d4fc948ce0b12e9449e9e35556416d6e0f4f1d6c08807b0e98588aeea85c3f4a62512d82d159734d80ea16af0380a0d77f57c5444eaaf4cd9eed67f13fbc4699c608736286cba3e962fdc1642beac195ec59dd2d926a","sender":"bc2ebe882b76fd7ab77ec19416328902f685dfedec57285d60ac154d7fa67a9d735bd3f22ba4f7394fead3c35bbcc30b8f67dccd15c8a663f4014785124eaf098ed83027870949ed4bc0a0516a9ac901f185b71d7765e14b00edf2743cd02b266695977c8730f891d76c9a69795806edb61426b8bc2f3d32de0a074995844eed93a5648532ff0ba8ee5b1ebd6bd3b33620b7d938852776b8b99276fa"},"body":{"sign":"fb3ce5d111c74a0b8638f24f8ff200f64ca0e88cda1fd483783930b08e465fa9fc9565a0a3afbdfdf3f463bc77e526f2c41c6ddd2dae5d6f90e741442e2939731cbdad4071c29eff83dff932589b2cbfd8fa8a5fac19de4c40c3adde4cde1235c0bbf053b0e04e826993f8060a50c671c6bf56ce24fe4e921b60f6ca2239932ebd1b8c8556d5a2ac13e5ef1d8ea9cca8","hash":"e1cc8da32433c2d7f99b38042d7b73db291bd803c55f3c83745ae3ebae6baffe","proof":"00000000000011a0"}}===6108f8caf8c3c7e782c52e3d0bfa50542b7edca7082639943e7121a44e4de2e004f24eb5b64afc0626d828c4e4c600e962a5c1571c5524d2c296e01f91220860a3b4ca64189dae6b64b39cb316cbef0d608f88979df1781be22e111f3150b0212051bc8e09a605a9d0a596216d539d99fa978b147a89882f4eee6244fa6d2afc608520b3661b8e4c58badaf889a3d6db23b0b08542efaf5c5e9a25e055cd5f29b4866b5dffcbae7c62bd6a3bfc2aaf99f8a51c5379fa4a390b63c54fc91e3ea3dc9ddb2afd24441cee7d41fa5544df038562ef02996829c0dbaa28c0ea3ffc0cabe4ae7b40f8ccdaa9e2be82fcc52558ff509f2a8947a6e91807cce0031f65a02f239b3188b108a7dd0343667738be1678c0b1cceab950366460eb30f699e8c4e3ad0aaa2903a6cb5f1e8245299178e6c18d1dba848d17e451da17ef5f2b0690b5bc7ef8bb0bc80fe3829d726a1c6e94196428a4a29224c7e09684f1731706d104f0cda3f6fe66f4b99f5091edfd8bcdf1a49d8bb0ac289dda9fd0c99e352a3f768c4f4a77bcbdeb68406f89e3f12b94e32be568b76b4076c149f725dbb7e88919f8f66d47b5e774a2954a8dd507ac1589a246f86d31fe40d6080fbc8710c70276c3670a4b5045dc20ced33d7dfef2d88fa54d12dbd57095c7369456eb00b4f6b5e222916d5324ff390ad79110c9a8b967aaf4814b6f345d1aba181f6ea7f665e33d3a62ca7d52f8ee3f9d1dc727d0874eb61a99903d3bfa5685f1709379776d05466e91a47fe2a8e4fee6d407611c645aab7076882028fac6829466b678ef89f8b80c185335e380effa6d8527f9f2c8170edbd5162969ed4ab8ee062cd4e7bb46328b295651df74890ab9a89e0b279d000969ef0e68d82313490a0249b6d1fb44d56f6259d833b6a7e8435c277bef954fb234671d44d205e819c311cd425810723339be7b825d159f9300a95b2234eebc2a7c0d5df453d5fbc4de76f16ff7a4b662286e5bb16e5afd9b26c06100335df06faaa969e7ed659ce5b132e0e8fb33c8cfb1f63a2b4198a3af32d768c07fc22c7f8a01f99cbd356f0cac15f55b34fb63a0dcb52ec1317ed578c2c1eca517e4604a506abccb17f2262f4d34dae410e61748c39e024ac4bf27a5051216a00b088a4a760e6ce7fc9440b6efbc29288e8158c9ede19419794e5088df7c8872d959908fb46be034333e13cd8720394e71317529662d969e88b3d1d4f5ea3bf2c19dd68b5667771714feaee36a72b60efad1a11b125138302dff0bf785fd97549ba2f25fbdd6a00a6cab36d63d305712a158
|
||||
{"pubk":"ac2a318e0e0f4548f07b5444d293304b52bde3e22e23da82147d03a4b6721b98dc43a53adbc1ff33a3819f0c3899b3e2dc9b7cb18b0da96ad6c4ff93123764b68ec660314ee13167c7ece3bb73c72258e05c273155b2bb13860820aebf9c9400158f38b3208826e176ef5b90ea209c5fc302e8162f75ae8fa2bf4c50f5c16256d5d413e6bf69592ed90ae9f91af590c06faf71b5e87ba3dc4a4f96b3","enck":"58e578980580a793c01765b6d8709784d41dbcb53f3fe87e7e4e4d4b33c4f93295bac351966d6cd70f5e352cae1d290bec3b8234d4048807e5aa4d3bb983ab0d668be1f2843b77aea181ea8b92ffbf641aa5f8e25e12243ade696cbace216c5148cb68d0ae93342da9712561b1ca806dd992ce6d14b1cb0d6211780faae7ca15","salt":"327d3d5fa3e8df5012ca12a8d65d0644669861797f659ac13adf15c2508bec5bd43538ba6c5c6871992c35ebafdaf019","hash":"3d90d389b7454bd3f1a84c4509c0afdc2a92d6acafdd387a541590ed6caf34e0","sign":"cd18d99ec9af3dabd548a5e2b8e4f34add2605671c733342968159eb9fc23484ca14b7b6e465fa3527bcc03a50aa6203240077c5118e18f28d48939df5bfab4fa3d59ed3b23a0bc6a8ba08275256a6c3577bcb887ed7657578e7de711eac7af88de9f75f0fce0428134aa24fe5c9655256c7753d54b49a5504c8d1a2a1d242c8d4459431474ebe9f5e4bd005d7a94681"}@4b25caa0f199bd7c19fa9fba50d705b497767f9204d038a0d2ccf705270964cbd26c6edc592737836a59e37038dc7065905f0f753c5f6c7530470e7be9c36b38389aa48b0bde34eebe916ce0b510fe968d3f7d2023d90e98be44932876596b5f5fb4739e6389e3fe5bfcc700a9c4c7dce2f1a6cd2caff84f3758d007444781f09a749c6a89e7ad32834e6403f60ca29eee8a99c0413204385278a0bfaf9ae0334d84663e85dbc176f7d8811a119b1b8fe182cdeb8dd2d65f2dea02408106e8bd607d39607881f6b84a4fb2c00d35766d5658db0b3fc8cadf2ea03fa8f36583444ed4e84bc23304d071a4455f60412635e69374c491b6030c5bbe6282f0f6773123c1d9186e6ca60ea95a5406b286a595f8b2436d350748610a1e0c6c6e5e4dc52b9e0f8dc9d227f1646ad378c094c1307a6de7b854e8a2566c3108a728eef1e80dd0aec0a2dc7daf80be046401b35f90707562306686e6ee9b97559c10e82d9f9e7e0a5c1123d5e8793b0df742576df52bfa99990dd559762b25310820a8ff31d657c75e6fec5923add2571cd8bddd3f53ad4bdabe0c612b31128ce33ea5c66259a3e912e6cd3f3a16638806a9436c223d4644b4a5ffbabc0c0d32be2a34f24784c138ec5475e09009443077beb339c8d52a7dddb87647cc3a621c31550bac6ce9d57900abac27734cec2caef24a1ef791297e78ed83c6c81e6e0729429fa0a9edf18903e8a36c8761c4069963c39ff804923ad7650ee467304fca95c2ba36e026bd11ee1aa732f79efb8b921adc7c67234e17a7b95de6dda96f6374d981e4217ba4c4d01ba360b3ca8212fe9afedc0ac9c7bd845343e2d70d4735af3fae74f3b5de7b6dd628be64ff26d7151256ff965be8f235ba6f1a69f101b27db9c9130d457169ecb56068894bce3e67c12f7e7cc14a6e4ddd4b3b3931498a3427b3c46ea0894de94e7c2977ae18c1d9c82d1a6537b92d77d53e2ce435b8c2adaf95682d5fcf4c86d726f4e1114024f2b2d2bcf36b446f67bedc890ebe8ad1b88d900fddcf1cc97979677bba6b9953a4ad968e66ac63f6602fe9eb789bd4d5db06cd4894de0ac258ddb18df2da88d09c50c6b8c9f8ed7c45b4d9ae36af2b7e91fd244180804ee34f4a2a73ae636a199a81cda521dfb708d038565531be74ed070666dcfa56450a723fb48709a786e51514a5acca6ebb3de64a7930eaa1acca5bc45b36c172b0a5c75cd94e31fbde2293f1e0aa863a59597dfc1a3d517238394a37e24c590454f2cf6c1b1b96a1b772b5e81f91f8c71f65a2ea38b7fcc0b0776d16ac775faf0f3dc864ae9c99a46021db6c230a12c022cce871d13508bfe06b4f6c0086b23f21ddd3047c285b0637085aaaaa0ff2a84dc012
|
||||
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 49%"><title>coverage: 49%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#e05d44"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">49%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">49%</text></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 48%"><title>coverage: 48%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#e05d44"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">48%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">48%</text></g></svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user