mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 05:11:19 -04:00
70 lines
2.6 KiB
Go
70 lines
2.6 KiB
Go
// Package packetpadding is an package that defines methods to pad packets
|
|
// with a given number of bytes, and to unpack the padding from a padded packet.
|
|
// The packet format is as follows if the desired output length is greater than
|
|
// 2 bytes:
|
|
// | data | padding | data length |
|
|
// The data length is a 16-bit big-endian integer that represents the length of
|
|
// the data in bytes.
|
|
// If the desired output length is 2 bytes or less, the packet format is as
|
|
// follows:
|
|
// | padding |
|
|
// No payload will be included in the packet.
|
|
package packetpadding
|
|
|
|
import "encoding/binary"
|
|
|
|
// Pack pads the given data with the given number of bytes, and appends the
|
|
// length of the data to the end of the data. The returned byte slice
|
|
// contains the padded data.
|
|
// This generates a packet with a length of
|
|
// len(data_OWNERSHIP_RELINQUISHED) + padding + 2
|
|
// @param data_OWNERSHIP_RELINQUISHED - The payload, this reference is consumed and should not be used after this call.
|
|
// @param padding - The number of padding bytes to add to the data.
|
|
func Pack(data_OWNERSHIP_RELINQUISHED []byte, paddingLength int) []byte {
|
|
data := append(data_OWNERSHIP_RELINQUISHED, make([]byte, paddingLength)...)
|
|
dataLength := len(data_OWNERSHIP_RELINQUISHED)
|
|
data = binary.BigEndian.AppendUint16(data, uint16(dataLength))
|
|
return data
|
|
}
|
|
|
|
// Pad returns a padding packet of padding length.
|
|
// If the padding length is less than 0, nil is returned.
|
|
// @param padding - The number of padding bytes to add to the data.
|
|
func Pad(paddingLength int) []byte {
|
|
if assertPaddingLengthIsNotNegative := paddingLength < 0; assertPaddingLengthIsNotNegative {
|
|
return nil
|
|
}
|
|
switch paddingLength {
|
|
case 0:
|
|
return []byte{}
|
|
case 1:
|
|
return []byte{0}
|
|
case 2:
|
|
return []byte{0, 0}
|
|
default:
|
|
return append(make([]byte, paddingLength-2), byte(paddingLength>>8), byte(paddingLength))
|
|
}
|
|
|
|
}
|
|
|
|
// Unpack extracts the data and padding from the given padded data. It
|
|
// returns the data and the number of padding bytes.
|
|
// the data may be nil.
|
|
// @param wrappedData_OWNERSHIP_RELINQUISHED - The packet, this reference is consumed and should not be used after this call.
|
|
func Unpack(wrappedData_OWNERSHIP_RELINQUISHED []byte) ([]byte, int) {
|
|
dataLength := len(wrappedData_OWNERSHIP_RELINQUISHED)
|
|
if dataLength < 2 {
|
|
return nil, dataLength
|
|
}
|
|
|
|
dataLen := int(binary.BigEndian.Uint16(wrappedData_OWNERSHIP_RELINQUISHED[dataLength-2:]))
|
|
if dataLen > 2047 {
|
|
return nil, 0
|
|
}
|
|
paddingLength := dataLength - dataLen - 2
|
|
if paddingLength < 0 {
|
|
return nil, paddingLength
|
|
}
|
|
|
|
return wrappedData_OWNERSHIP_RELINQUISHED[:dataLen], paddingLength
|
|
}
|