|
|
|
@ -105,14 +105,23 @@ namespace llarp
|
|
|
|
|
if(!BEncodeWriteDictEntry("C", C, buf))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(!BEncodeWriteDictEntry("D", D, buf))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if(D.size() > 0)
|
|
|
|
|
{
|
|
|
|
|
if(!BEncodeWriteDictEntry("D", D, buf))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(!BEncodeWriteDictEntry("F", F, buf))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if(!BEncodeWriteDictEntry("N", N, buf))
|
|
|
|
|
return false;
|
|
|
|
|
if(!N.IsZero())
|
|
|
|
|
{
|
|
|
|
|
if(!BEncodeWriteDictEntry("N", N, buf))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(R)
|
|
|
|
|
{
|
|
|
|
|
if(!BEncodeWriteDictInt("R", R, buf))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(!T.IsZero())
|
|
|
|
|
{
|
|
|
|
|
if(!BEncodeWriteDictEntry("T", T, buf))
|
|
|
|
@ -148,6 +157,8 @@ namespace llarp
|
|
|
|
|
return false;
|
|
|
|
|
if(!BEncodeMaybeReadDictInt("S", S, read, key, val))
|
|
|
|
|
return false;
|
|
|
|
|
if(!BEncodeMaybeReadDictInt("R", R, read, key, val))
|
|
|
|
|
return false;
|
|
|
|
|
if(!BEncodeMaybeReadDictEntry("T", T, read, key, val))
|
|
|
|
|
return false;
|
|
|
|
|
if(!BEncodeMaybeReadVersion("V", version, LLARP_PROTO_VERSION, read, key,
|
|
|
|
@ -169,6 +180,25 @@ namespace llarp
|
|
|
|
|
return msg.BDecode(buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
ProtocolFrame::Sign(llarp::Crypto* crypto, const Identity& localIdent)
|
|
|
|
|
{
|
|
|
|
|
Z.Zero();
|
|
|
|
|
std::array< byte_t, MAX_PROTOCOL_MESSAGE_SIZE > tmp;
|
|
|
|
|
llarp_buffer_t buf(tmp);
|
|
|
|
|
// encode
|
|
|
|
|
if(!BEncode(&buf))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("message too big to encode");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// rewind
|
|
|
|
|
buf.sz = buf.cur - buf.base;
|
|
|
|
|
buf.cur = buf.base;
|
|
|
|
|
// sign
|
|
|
|
|
return localIdent.Sign(crypto, Z, buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
ProtocolFrame::EncryptAndSign(llarp::Crypto* crypto,
|
|
|
|
|
const ProtocolMessage& msg,
|
|
|
|
@ -313,6 +343,7 @@ namespace llarp
|
|
|
|
|
N = other.N;
|
|
|
|
|
Z = other.Z;
|
|
|
|
|
T = other.T;
|
|
|
|
|
R = other.R;
|
|
|
|
|
S = other.S;
|
|
|
|
|
version = other.version;
|
|
|
|
|
return *this;
|
|
|
|
|