// Package exchange contains Telegram key exchange algorithm flows. // See https://core.telegram.org/mtproto/auth_key.
package exchange import ( ) // DefaultTimeout is default WithTimeout parameter value. const DefaultTimeout = 1 * time.Minute // Exchanger is builder for key exchangers. type Exchanger struct { conn transport.Conn clock clock.Clock rand io.Reader log *zap.Logger timeout time.Duration dc int } // WithClock sets exchange flow clock. func ( Exchanger) ( clock.Clock) Exchanger { .clock = return } // WithRand sets exchange flow random source. func ( Exchanger) ( io.Reader) Exchanger { .rand = return } // WithLogger sets exchange flow logger. func ( Exchanger) ( *zap.Logger) Exchanger { .log = return } // WithTimeout sets write/read deadline of every exchange request. func ( Exchanger) ( time.Duration) Exchanger { .timeout = return } // NewExchanger creates new Exchanger. func ( transport.Conn, int) Exchanger { return Exchanger{ conn: , clock: clock.System, rand: crypto.DefaultRand(), log: zap.NewNop(), timeout: DefaultTimeout, dc: , } } func ( Exchanger) (, proto.MessageType) unencryptedWriter { return unencryptedWriter{ clock: .clock, conn: .conn, timeout: .timeout, input: , output: , } } // Client creates new ClientExchange using parameters from Exchanger. func ( Exchanger) ( []PublicKey) ClientExchange { return ClientExchange{ unencryptedWriter: .unencryptedWriter( proto.MessageServerResponse, proto.MessageFromClient, ), rand: .rand, log: .log, keys: , dc: .dc, } } // Server creates new ServerExchange using parameters from Exchanger. func ( Exchanger) ( PrivateKey) ServerExchange { return ServerExchange{ unencryptedWriter: .unencryptedWriter( proto.MessageFromClient, proto.MessageServerResponse, ), rand: .rand, log: .log, rng: TestServerRNG{rand: .rand}, key: , dc: .dc, } }