mirror of https://github.com/vacp2p/nim-quic.git
Communicate transport parameters via encrypted payload
This commit is contained in:
parent
20d3b009dc
commit
81cfe64137
|
@ -6,3 +6,6 @@ proc `[]=`*[T,U,V](
|
|||
doAssert replacement.len == slice.len
|
||||
for i in 0..<replacement.len:
|
||||
target[slice.a + i] = replacement[i]
|
||||
|
||||
template toOpenArray*[T](a: ptr T, length: uint): openArray[T] =
|
||||
toOpenArray(cast[ptr UncheckedArray[T]](a), 0, length.int-1)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import quic/openarray
|
||||
import ngtcp2
|
||||
import ids
|
||||
import encrypt
|
||||
|
@ -5,21 +6,18 @@ import decrypt
|
|||
import hp
|
||||
import keys
|
||||
import settings
|
||||
import params
|
||||
import crypto
|
||||
|
||||
let zeroKey = Key()
|
||||
var cryptoData: array[4096, uint8]
|
||||
var randomId: ngtcp2_cid
|
||||
|
||||
proc clientInitial(connection: ptr ngtcp2_conn, user_data: pointer): cint {.cdecl.} =
|
||||
connection.install0RttKey(zeroKey)
|
||||
|
||||
assert 0 == ngtcp2_conn_submit_crypto_data(
|
||||
connection, NGTCP2_CRYPTO_LEVEL_INITIAL, addr cryptoData[0], sizeof(cryptoData).uint
|
||||
)
|
||||
connection.submitCryptoData()
|
||||
|
||||
proc receiveCryptoData(connection: ptr ngtcp2_conn, level: ngtcp2_crypto_level, offset: uint64, data: ptr uint8, datalen: uint, userData: pointer): cint {.cdecl.} =
|
||||
var params = defaultSettings().transport_params
|
||||
params.initial_scid = connection.ngtcp2_conn_get_dcid()[]
|
||||
var params = decodeTransportParameters(toOpenArray(data, datalen))
|
||||
params.original_dcid = randomId
|
||||
assert 0 == ngtcp2_conn_set_remote_transport_params(connection, addr params)
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
import ngtcp2
|
||||
import params
|
||||
|
||||
proc submitCryptoData*(connection: ptr ngtcp2_conn) =
|
||||
var cryptoData = connection.encodeTransportParameters()
|
||||
assert 0 == ngtcp2_conn_submit_crypto_data(
|
||||
connection,
|
||||
NGTCP2_CRYPTO_LEVEL_INITIAL,
|
||||
addr cryptoData[0],
|
||||
cryptoData.len.uint
|
||||
)
|
|
@ -0,0 +1,22 @@
|
|||
import ngtcp2
|
||||
|
||||
proc encodeTransportParameters*(connection: ptr ngtcp2_conn): seq[byte] =
|
||||
var buffer: array[4096, byte]
|
||||
var params: ngtcp2_transport_params
|
||||
connection.ngtcp2_conn_get_local_transport_params(addr params)
|
||||
let length = ngtcp2_encode_transport_params(
|
||||
addr buffer[0],
|
||||
buffer.len.uint,
|
||||
NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
|
||||
addr params
|
||||
)
|
||||
buffer[0..<length]
|
||||
|
||||
proc decodeTransportParameters*(bytes: openArray[byte]): ngtcp2_transport_params =
|
||||
assert 0 == ngtcp2_decode_transport_params(
|
||||
addr result,
|
||||
NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
|
||||
unsafeAddr bytes[0],
|
||||
bytes.len.uint
|
||||
)
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import quic/openarray
|
||||
import ngtcp2
|
||||
import encrypt
|
||||
import decrypt
|
||||
|
@ -5,26 +6,21 @@ import hp
|
|||
import ids
|
||||
import keys
|
||||
import settings
|
||||
import params
|
||||
import crypto
|
||||
|
||||
let zeroKey = Key()
|
||||
var cryptoData: array[4096, uint8]
|
||||
|
||||
proc receiveClientInitial(connection: ptr ngtcp2_conn, dcid: ptr ngtcp2_cid, userData: pointer): cint {.cdecl.} =
|
||||
connection.install0RttKey(zeroKey)
|
||||
connection.installHandshakeKeys(zeroKey, zeroKey)
|
||||
|
||||
proc receiveCryptoData(connection: ptr ngtcp2_conn, level: ngtcp2_crypto_level, offset: uint64, data: ptr uint8, datalen: uint, userData: pointer): cint {.cdecl.} =
|
||||
assert 0 == ngtcp2_conn_submit_crypto_data(
|
||||
connection,
|
||||
if level == NGTCP2_CRYPTO_LEVEL_INITIAL: NGTCP2_CRYPTO_LEVEL_INITIAL else: NGTCP2_CRYPTO_LEVEL_HANDSHAKE,
|
||||
addr cryptoData[0],
|
||||
sizeof(cryptoData).uint
|
||||
)
|
||||
|
||||
var params = defaultSettings().transport_params
|
||||
params.initial_scid = connection.ngtcp2_conn_get_dcid()[]
|
||||
var params = decodeTransportParameters(toOpenArray(data, datalen))
|
||||
assert 0 == ngtcp2_conn_set_remote_transport_params(connection, addr params)
|
||||
|
||||
connection.submitCryptoData()
|
||||
|
||||
ngtcp2_conn_handshake_completed(connection)
|
||||
|
||||
proc updateKey(conn: ptr ngtcp2_conn, rx_secret: ptr uint8, tx_secret: ptr uint8, rx_aead_ctx: ptr ngtcp2_crypto_aead_ctx, rx_iv: ptr uint8, tx_aead_ctx: ptr ngtcp2_crypto_aead_ctx, tx_iv: ptr uint8, current_rx_secret: ptr uint8, current_tx_secret: ptr uint8, secretlen: uint, user_data: pointer): cint {.cdecl} =
|
||||
|
|
Loading…
Reference in New Issue