github.com/ava-labs/avalanchego@v1.11.11/network/peer/msg_length.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package peer
     5  
     6  import (
     7  	"encoding/binary"
     8  	"errors"
     9  	"fmt"
    10  
    11  	"github.com/ava-labs/avalanchego/utils/wrappers"
    12  )
    13  
    14  var (
    15  	errInvalidMessageLength     = errors.New("invalid message length")
    16  	errMaxMessageLengthExceeded = errors.New("maximum message length exceeded")
    17  )
    18  
    19  func writeMsgLen(msgLen uint32, maxMsgLen uint32) ([wrappers.IntLen]byte, error) {
    20  	if msgLen > maxMsgLen {
    21  		return [wrappers.IntLen]byte{}, fmt.Errorf(
    22  			"%w; the message length %d exceeds the specified limit %d",
    23  			errMaxMessageLengthExceeded,
    24  			msgLen,
    25  			maxMsgLen,
    26  		)
    27  	}
    28  
    29  	b := [wrappers.IntLen]byte{}
    30  	binary.BigEndian.PutUint32(b[:], msgLen)
    31  
    32  	return b, nil
    33  }
    34  
    35  func readMsgLen(b []byte, maxMsgLen uint32) (uint32, error) {
    36  	if len(b) != wrappers.IntLen {
    37  		return 0, fmt.Errorf(
    38  			"%w; readMsgLen only supports 4 bytes (got %d bytes)",
    39  			errInvalidMessageLength,
    40  			len(b),
    41  		)
    42  	}
    43  
    44  	// parse the message length
    45  	msgLen := binary.BigEndian.Uint32(b)
    46  	if msgLen > maxMsgLen {
    47  		return 0, fmt.Errorf(
    48  			"%w; the message length %d exceeds the specified limit %d",
    49  			errMaxMessageLengthExceeded,
    50  			msgLen,
    51  			maxMsgLen,
    52  		)
    53  	}
    54  
    55  	return msgLen, nil
    56  }