|
|
@ -31,7 +31,7 @@ namespace garlic |
|
|
|
const int ECIESX25519_SEND_INACTIVITY_TIMEOUT = 5000; // number of milliseconds we can send empty(pyaload only) packet after
|
|
|
|
const int ECIESX25519_SEND_INACTIVITY_TIMEOUT = 5000; // number of milliseconds we can send empty(pyaload only) packet after
|
|
|
|
const int ECIESX25519_INCOMING_TAGS_EXPIRATION_TIMEOUT = 600; // in seconds
|
|
|
|
const int ECIESX25519_INCOMING_TAGS_EXPIRATION_TIMEOUT = 600; // in seconds
|
|
|
|
const int ECIESX25519_PREVIOUS_TAGSET_EXPIRATION_TIMEOUT = 180; // 180
|
|
|
|
const int ECIESX25519_PREVIOUS_TAGSET_EXPIRATION_TIMEOUT = 180; // 180
|
|
|
|
const int ECIESX25519_TAGSET_MAX_NUM_TAGS = 4096; // number of tags we request new tagset after
|
|
|
|
const int ECIESX25519_TAGSET_MAX_NUM_TAGS = 8192; // number of tags we request new tagset after
|
|
|
|
const int ECIESX25519_MIN_NUM_GENERATED_TAGS = 24; |
|
|
|
const int ECIESX25519_MIN_NUM_GENERATED_TAGS = 24; |
|
|
|
const int ECIESX25519_MAX_NUM_GENERATED_TAGS = 160; |
|
|
|
const int ECIESX25519_MAX_NUM_GENERATED_TAGS = 160; |
|
|
|
const int ECIESX25519_NSR_NUM_GENERATED_TAGS = 12; |
|
|
|
const int ECIESX25519_NSR_NUM_GENERATED_TAGS = 12; |
|
|
@ -129,7 +129,9 @@ namespace garlic |
|
|
|
const uint8_t ECIESX25519_NEXT_KEY_REVERSE_KEY_FLAG = 0x02; |
|
|
|
const uint8_t ECIESX25519_NEXT_KEY_REVERSE_KEY_FLAG = 0x02; |
|
|
|
const uint8_t ECIESX25519_NEXT_KEY_REQUEST_REVERSE_KEY_FLAG = 0x04; |
|
|
|
const uint8_t ECIESX25519_NEXT_KEY_REQUEST_REVERSE_KEY_FLAG = 0x04; |
|
|
|
|
|
|
|
|
|
|
|
class ECIESX25519AEADRatchetSession: public GarlicRoutingSession, public std::enable_shared_from_this<ECIESX25519AEADRatchetSession> |
|
|
|
class ECIESX25519AEADRatchetSession: public GarlicRoutingSession, |
|
|
|
|
|
|
|
private i2p::crypto::NoiseSymmetricState, |
|
|
|
|
|
|
|
public std::enable_shared_from_this<ECIESX25519AEADRatchetSession> |
|
|
|
{ |
|
|
|
{ |
|
|
|
enum SessionState |
|
|
|
enum SessionState |
|
|
|
{ |
|
|
|
{ |
|
|
@ -137,7 +139,8 @@ namespace garlic |
|
|
|
eSessionStateNewSessionReceived, |
|
|
|
eSessionStateNewSessionReceived, |
|
|
|
eSessionStateNewSessionSent, |
|
|
|
eSessionStateNewSessionSent, |
|
|
|
eSessionStateNewSessionReplySent, |
|
|
|
eSessionStateNewSessionReplySent, |
|
|
|
eSessionStateEstablished |
|
|
|
eSessionStateEstablished, |
|
|
|
|
|
|
|
eSessionStateOneTime |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct DHRatchet |
|
|
|
struct DHRatchet |
|
|
@ -155,7 +158,8 @@ namespace garlic |
|
|
|
|
|
|
|
|
|
|
|
bool HandleNextMessage (uint8_t * buf, size_t len, std::shared_ptr<RatchetTagSet> receiveTagset, int index = 0); |
|
|
|
bool HandleNextMessage (uint8_t * buf, size_t len, std::shared_ptr<RatchetTagSet> receiveTagset, int index = 0); |
|
|
|
std::shared_ptr<I2NPMessage> WrapSingleMessage (std::shared_ptr<const I2NPMessage> msg); |
|
|
|
std::shared_ptr<I2NPMessage> WrapSingleMessage (std::shared_ptr<const I2NPMessage> msg); |
|
|
|
|
|
|
|
std::shared_ptr<I2NPMessage> WrapOneTimeMessage (std::shared_ptr<const I2NPMessage> msg); |
|
|
|
|
|
|
|
|
|
|
|
const uint8_t * GetRemoteStaticKey () const { return m_RemoteStaticKey; } |
|
|
|
const uint8_t * GetRemoteStaticKey () const { return m_RemoteStaticKey; } |
|
|
|
void SetRemoteStaticKey (const uint8_t * key) { memcpy (m_RemoteStaticKey, key, 32); } |
|
|
|
void SetRemoteStaticKey (const uint8_t * key) { memcpy (m_RemoteStaticKey, key, 32); } |
|
|
|
|
|
|
|
|
|
|
@ -175,7 +179,6 @@ namespace garlic |
|
|
|
private: |
|
|
|
private: |
|
|
|
|
|
|
|
|
|
|
|
void ResetKeys (); |
|
|
|
void ResetKeys (); |
|
|
|
void MixHash (const uint8_t * buf, size_t len); |
|
|
|
|
|
|
|
void CreateNonce (uint64_t seqn, uint8_t * nonce); |
|
|
|
void CreateNonce (uint64_t seqn, uint8_t * nonce); |
|
|
|
bool GenerateEphemeralKeysAndEncode (uint8_t * buf); // buf is 32 bytes
|
|
|
|
bool GenerateEphemeralKeysAndEncode (uint8_t * buf); // buf is 32 bytes
|
|
|
|
std::shared_ptr<RatchetTagSet> CreateNewSessionTagset (); |
|
|
|
std::shared_ptr<RatchetTagSet> CreateNewSessionTagset (); |
|
|
@ -186,7 +189,7 @@ namespace garlic |
|
|
|
void HandlePayload (const uint8_t * buf, size_t len, const std::shared_ptr<RatchetTagSet>& receiveTagset, int index); |
|
|
|
void HandlePayload (const uint8_t * buf, size_t len, const std::shared_ptr<RatchetTagSet>& receiveTagset, int index); |
|
|
|
void HandleNextKey (const uint8_t * buf, size_t len, const std::shared_ptr<RatchetTagSet>& receiveTagset); |
|
|
|
void HandleNextKey (const uint8_t * buf, size_t len, const std::shared_ptr<RatchetTagSet>& receiveTagset); |
|
|
|
|
|
|
|
|
|
|
|
bool NewOutgoingSessionMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NewOutgoingSessionMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen, bool isStatic = true); |
|
|
|
bool NewSessionReplyMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NewSessionReplyMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NextNewSessionReplyMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NextNewSessionReplyMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NewExistingSessionMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
|
bool NewExistingSessionMessage (const uint8_t * payload, size_t len, uint8_t * out, size_t outLen); |
|
|
@ -200,7 +203,7 @@ namespace garlic |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
|
|
|
|
|
|
|
|
uint8_t m_H[32], m_CK[64] /* [chainkey, key] */, m_RemoteStaticKey[32]; |
|
|
|
uint8_t m_RemoteStaticKey[32]; |
|
|
|
uint8_t m_Aepk[32]; // Alice's ephemeral keys, for incoming only
|
|
|
|
uint8_t m_Aepk[32]; // Alice's ephemeral keys, for incoming only
|
|
|
|
uint8_t m_NSREncodedKey[32], m_NSRH[32], m_NSRKey[32]; // new session reply, for incoming only
|
|
|
|
uint8_t m_NSREncodedKey[32], m_NSRH[32], m_NSRKey[32]; // new session reply, for incoming only
|
|
|
|
std::shared_ptr<i2p::crypto::X25519Keys> m_EphemeralKeys; |
|
|
|
std::shared_ptr<i2p::crypto::X25519Keys> m_EphemeralKeys; |
|
|
|