| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
- // SPDX-License-Identifier: MIT
- package dtls
- import (
- "bytes"
- "context"
- "errors"
- "github.com/pion/dtls/v2/pkg/protocol"
- "github.com/pion/dtls/v2/pkg/protocol/alert"
- "github.com/pion/dtls/v2/pkg/protocol/handshake"
- "github.com/pion/dtls/v2/pkg/protocol/recordlayer"
- )
- func flight2Parse(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) {
- seq, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite,
- handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false},
- )
- if !ok {
- // Client may retransmit the first ClientHello when HelloVerifyRequest is dropped.
- // Parse as flight 0 in this case.
- return flight0Parse(ctx, c, state, cache, cfg)
- }
- state.handshakeRecvSequence = seq
- var clientHello *handshake.MessageClientHello
- // Validate type
- if clientHello, ok = msgs[handshake.TypeClientHello].(*handshake.MessageClientHello); !ok {
- return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil
- }
- if !clientHello.Version.Equal(protocol.Version1_2) {
- return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion
- }
- if len(clientHello.Cookie) == 0 {
- return 0, nil, nil
- }
- if !bytes.Equal(state.cookie, clientHello.Cookie) {
- return 0, &alert.Alert{Level: alert.Fatal, Description: alert.AccessDenied}, errCookieMismatch
- }
- return flight4, nil, nil
- }
- func flight2Generate(_ context.Context, _ flightConn, state *State, _ *handshakeCache, _ *handshakeConfig) ([]*packet, *alert.Alert, error) {
- // [Psiphon]
- // With SetDTLSInsecureSkipHelloVerify set, this should never be called,
- // so handshake randomization is not implemented here.
- return nil, nil, errors.New("unexpected flight2Generate call")
- state.handshakeSendSequence = 0
- return []*packet{
- {
- record: &recordlayer.RecordLayer{
- Header: recordlayer.Header{
- Version: protocol.Version1_2,
- },
- Content: &handshake.Handshake{
- Message: &handshake.MessageHelloVerifyRequest{
- Version: protocol.Version1_2,
- Cookie: state.cookie,
- },
- },
- },
- },
- }, nil, nil
- }
|