mirror of
https://github.com/go-i2p/go-i2p.git
synced 2025-07-04 21:55:18 -04:00
164 lines
4.6 KiB
Go
164 lines
4.6 KiB
Go
package i2np
|
|
|
|
import (
|
|
"github.com/hkparker/go-i2p/lib/common"
|
|
"github.com/hkparker/go-i2p/lib/tunnel"
|
|
)
|
|
|
|
/*
|
|
I2P I2NP BuildRequestRecord
|
|
https://geti2p.net/spec/i2np
|
|
Accurate for version 0.9.28
|
|
|
|
ElGamal and AES encrypted:
|
|
|
|
+----+----+----+----+----+----+----+----+
|
|
| encrypted data... |
|
|
~ ~
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
|
|
encrypted_data :: ElGamal and AES encrypted data
|
|
length -> 528
|
|
|
|
total length: 528
|
|
|
|
ElGamal encrypted:
|
|
|
|
+----+----+----+----+----+----+----+----+
|
|
| toPeer |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
| encrypted data... |
|
|
~ ~
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
|
|
toPeer :: First 16 bytes of the SHA-256 Hash of the peer's RouterIdentity
|
|
length -> 16 bytes
|
|
|
|
encrypted_data :: ElGamal-2048 encrypted data (see notes)
|
|
length -> 512
|
|
|
|
total length: 528
|
|
|
|
Cleartext:
|
|
|
|
+----+----+----+----+----+----+----+----+
|
|
| receive_tunnel | our_ident |
|
|
+----+----+----+----+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +----+----+----+----+
|
|
| | next_tunnel |
|
|
+----+----+----+----+----+----+----+----+
|
|
| next_ident |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
| layer_key |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
| iv_key |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
| reply_key |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
| reply_iv |
|
|
+ +
|
|
| |
|
|
+----+----+----+----+----+----+----+----+
|
|
|flag| request_time | send_msg_id
|
|
+----+----+----+----+----+----+----+----+
|
|
| |
|
|
+----+ +
|
|
| 29 bytes padding |
|
|
+ +
|
|
| |
|
|
+ +----+----+
|
|
| |
|
|
+----+----+----+----+----+----+
|
|
|
|
receive_tunnel :: TunnelId
|
|
length -> 4 bytes
|
|
|
|
our_ident :: Hash
|
|
length -> 32 bytes
|
|
|
|
next_tunnel :: TunnelId
|
|
length -> 4 bytes
|
|
|
|
next_ident :: Hash
|
|
length -> 32 bytes
|
|
|
|
layer_key :: SessionKey
|
|
length -> 32 bytes
|
|
|
|
iv_key :: SessionKey
|
|
length -> 32 bytes
|
|
|
|
reply_key :: SessionKey
|
|
length -> 32 bytes
|
|
|
|
reply_iv :: data
|
|
length -> 16 bytes
|
|
|
|
flag :: Integer
|
|
length -> 1 byte
|
|
|
|
request_time :: Integer
|
|
length -> 4 bytes
|
|
Hours since the epoch, i.e. current time / 3600
|
|
|
|
send_message_id :: Integer
|
|
length -> 4 bytes
|
|
|
|
padding :: Data
|
|
length -> 29 bytes
|
|
source -> random
|
|
|
|
total length: 222
|
|
*/
|
|
|
|
type BuildRequestRecordELGamalAES [528]byte
|
|
type BuildRequestRecordELGamal [528]byte
|
|
|
|
type BuildRequestRecord struct {
|
|
ReceiveTunnel tunnel.TunnelID
|
|
OurIdent common.Hash
|
|
NextTunnel tunnel.TunnelID
|
|
NextIdent common.Hash
|
|
LayerKey common.SessionKey
|
|
IVKey common.SessionKey
|
|
ReplyKey common.SessionKey
|
|
ReplyIV [16]byte
|
|
flag int
|
|
RequestTime int
|
|
SendMessageID int
|
|
Padding [29]byte
|
|
}
|