Class Buffer

java.lang.Object
org.apache.sshd.common.util.buffer.Buffer
All Implemented Interfaces:
Readable
Direct Known Subclasses:
ByteArrayBuffer

public abstract class Buffer extends Object implements Readable
Provides an abstract message buffer for encoding SSH messages
Author:
Apache MINA SSHD Project
  • Field Details

    • workBuf

      protected final byte[] workBuf
  • Constructor Details

    • Buffer

      protected Buffer()
  • Method Details

    • rpos

      public abstract int rpos()
      Returns:
      Current reading position
    • rpos

      public abstract void rpos(int rpos)
      Parameters:
      rpos - Set current reading position
    • wpos

      public abstract int wpos()
      Returns:
      Current writing position
    • wpos

      public abstract void wpos(int wpos)
      Parameters:
      wpos - Set current writing position - Note: if necessary, the underlying data buffer will be increased so as to allow writing from the new position
    • capacity

      public abstract int capacity()
      Returns:
      Number of bytes that can still be written without re-sizing the internal buffer
    • array

      public abstract byte[] array()
      Returns:
      The raw underlying data bytes
    • getBytesConsumed

      public abstract byte[] getBytesConsumed()
      Returns:
      The bytes consumed so far
    • rawByte

      public byte rawByte(int pos)
      Parameters:
      pos - A position in the raw underlying data bytes
      Returns:
      The byte at the specified position without changing the current read position. Note: no validation is made whether the position lies within array boundaries
    • rawUInt

      public long rawUInt(int pos)
      Parameters:
      pos - A position in the raw underlying data bytes
      Returns:
      The unsigned 32 bit integer at the specified position without changing the current read position. Note: no validation is made whether the position and the required extra 4 bytes lie within array boundaries
    • compact

      public abstract void compact()
      "Shift" the internal data so that reading starts from position zero.
    • getCompactData

      public byte[] getCompactData()
    • clear

      public Buffer clear()
      Reset read/write positions to zero - Note: zeroes any previously existing data
      Returns:
      Reference to this buffer
      See Also:
    • clear

      public abstract Buffer clear(boolean wipeData)
      Reset read/write positions to zero
      Parameters:
      wipeData - Whether to zero any previously existing data
      Returns:
      Reference to this buffer
    • isValidMessageStructure

      public boolean isValidMessageStructure(Class<?>... fieldTypes)
    • isValidMessageStructure

      public boolean isValidMessageStructure(Collection<Class<?>> fieldTypes)
    • copyRawBytes

      protected abstract void copyRawBytes(int offset, byte[] buf, int pos, int len)
    • toHex

      public String toHex()
    • dumpHex

      public void dumpHex(SimplifiedLog logger, String prefix, PropertyResolver resolver)
    • dumpHex

      public void dumpHex(SimplifiedLog logger, Level level, String prefix, PropertyResolver resolver)
    • getUByte

      public int getUByte()
    • getByte

      public byte getByte()
    • getShort

      public short getShort()
    • getInt

      public int getInt()
    • getUInt

      public long getUInt()
    • getLong

      public long getLong()
    • getBoolean

      public boolean getBoolean()
    • getString

      public String getString()
      Returns:
      Reads a UTF-8 encoded string
    • getNameList

      public List<String> getNameList()
      According to RFC 4251: A name-list is represented as a uint32 containing its length (number of bytes that follow) followed by a comma-separated list of zero or more names.
      Returns:
      The parsed result
    • getNameList

      public List<String> getNameList(Charset charset)
    • getNameList

      public List<String> getNameList(char separator)
    • getNameList

      public List<String> getNameList(Charset charset, char separator)
      Parses a string that contains values separated by a delimiter
      Parameters:
      charset - The Charset to use to read the string
      separator - The separator
      Returns:
      A List of the parsed values
    • getCertificateOptions

      public List<OpenSshCertificate.CertificateOption> getCertificateOptions()
    • getCertificateOptions

      public List<OpenSshCertificate.CertificateOption> getCertificateOptions(Charset charset)
      According to PROTOCOL.certkeys: Critical Options is a set of bytes that is [overall length][name(string)][[length of buffer][[length of string][data(string)]]]... Where each Certificate Option is encoded as a name (string) and buffer of data (string packed in a buffer) Then the entire name (string) + data (buffer) are added as bytes (which will get a length prefix)
      Parameters:
      charset - Charset to use for converting bytes to characters
      Returns:
      the parsed result, never null, but possibly empty
    • getStringList

      public Collection<String> getStringList(boolean usePrependedLength)
      Parameters:
      usePrependedLength - If true then there is a 32-bit value indicating the number of strings to read. Otherwise, the method will use a "greedy" reading of strings while more data available.
      Returns:
      A Collection of the read strings
      See Also:
    • getStringList

      public Collection<String> getStringList(boolean usePrependedLength, Charset charset)
      Parameters:
      usePrependedLength - If true then there is a 32-bit value indicating the number of strings to read. Otherwise, the method will use a "greedy" reading of strings while more data available.
      charset - The Charset to use for the strings
      Returns:
      A Collection of the read strings
      See Also:
    • getAvailableStrings

      public Collection<String> getAvailableStrings()
      Returns:
      The remaining data as a list of strings
      See Also:
    • getAvailableStrings

      public Collection<String> getAvailableStrings(Charset charset)
      Parameters:
      charset - The Charset to use for the strings
      Returns:
      The remaining data as a list of strings
      See Also:
    • getStringList

      public List<String> getStringList(int count)
      Parameters:
      count - The exact number of strings to read - can be zero
      Returns:
      A List with the specified number of strings
      See Also:
    • getStringList

      public List<String> getStringList(int count, Charset charset)
      Parameters:
      count - The exact number of strings to read - can be zero
      charset - The Charset of the strings
      Returns:
      A List with the specified number of strings
      See Also:
    • getString

      public abstract String getString(Charset charset)
      Reads a string using a given charset.
      Parameters:
      charset - The Charset to use for the string bytes
      Returns:
      The read string
    • getMPInt

      public BigInteger getMPInt()
    • getMPIntAsBytes

      public byte[] getMPIntAsBytes()
    • getBytes

      public byte[] getBytes()
    • getRawBytes

      public void getRawBytes(byte[] buf)
    • getPublicKey

      public PublicKey getPublicKey() throws SshException
      Throws:
      SshException
    • getPublicKey

      public PublicKey getPublicKey(BufferPublicKeyParser<? extends PublicKey> parser) throws SshException
      Parameters:
      parser - A BufferPublicKeyParser to extract the key from the buffer - never null
      Returns:
      The extracted PublicKey - may be null if the parser so decided
      Throws:
      SshException - If failed to extract the key
      See Also:
    • getRawPublicKey

      public PublicKey getRawPublicKey() throws SshException
      Throws:
      SshException
    • getRawPublicKey

      public PublicKey getRawPublicKey(BufferPublicKeyParser<? extends PublicKey> parser) throws SshException
      Parameters:
      parser - A BufferPublicKeyParser to extract the key from the buffer - never null
      Returns:
      The extracted PublicKey - may be null if the parser so decided
      Throws:
      SshException - If failed to extract the key
    • getKeyPair

      public KeyPair getKeyPair() throws SshException
      Throws:
      SshException
    • extractEC

      protected KeyPair extractEC(String expectedCurveName, ECParameterSpec spec) throws GeneralSecurityException
      Throws:
      GeneralSecurityException
    • ensureAvailable

      public int ensureAvailable(int reqLen) throws BufferException
      Makes sure the buffer contains enough data to accommodate the requested length
      Parameters:
      reqLen - Requested data in bytes
      Returns:
      Same as input if validation successful
      Throws:
      BufferException - If negative length or beyond available requested
    • putByte

      public void putByte(byte b)
    • putOptionalBufferedData

      public void putOptionalBufferedData(Object buffer)
      Checks if the buffer argument is an array of bytes, a Readable instance or a ByteBuffer and invokes the appropriate putXXX method. If null then puts an empty byte array value
      Parameters:
      buffer - The buffered data object to inspect
      See Also:
    • putBufferedData

      public void putBufferedData(Object buffer)
      Checks if the buffer argument is an array of bytes, a Readable instance or a ByteBuffer and invokes the appropriate putXXX method.
      Parameters:
      buffer - The (never null) buffer object to put
      Throws:
      IllegalArgumentException - If buffer is none of the supported types
    • putBuffer

      public void putBuffer(Readable buffer)
    • putBuffer

      public abstract int putBuffer(Readable buffer, boolean expand)
    • putBuffer

      public abstract void putBuffer(ByteBuffer buffer)
    • putShort

      public void putShort(int i)
      Writes 16 bits
      Parameters:
      i - The 16-bit value
    • putInt

      public void putInt(long i)
    • putUInt

      public void putUInt(long i)
      Writes 32 bits
      Parameters:
      i - The 32-bit value
    • putLong

      public void putLong(long i)
      Writes 64 bits
      Parameters:
      i - The 64-bit value
    • putBoolean

      public void putBoolean(boolean b)
    • putAndWipeBytes

      public void putAndWipeBytes(byte[] b)
      Adds the bytes to the buffer and wipes the data from the input buffer after having added it - useful for sensitive information such as password
      Parameters:
      b - The buffer to add - OK if null
    • putAndWipeBytes

      public void putAndWipeBytes(byte[] b, int off, int len)
    • putBytes

      public void putBytes(byte[] b)
    • putBytes

      public void putBytes(byte[] b, int off, int len)
    • putStringList

      public void putStringList(Collection<?> objects, boolean prependLength)
      Encodes the toString value of each member.
      Parameters:
      objects - The objects to be encoded in the buffer - OK if null/empty
      prependLength - If true then the list is preceded by a 32-bit count of the number of members in the list
      See Also:
    • putStringList

      public void putStringList(Collection<?> objects, Charset charset, boolean prependLength)
      Encodes the toString value of each member
      Parameters:
      objects - The objects to be encoded in the buffer - OK if null/empty
      charset - The Charset to use for encoding
      prependLength - If true then the list is preceded by a 32-bit count of the number of members in the list
      See Also:
    • putCertificateOptions

      public void putCertificateOptions(List<OpenSshCertificate.CertificateOption> options)
    • putCertificateOptions

      public void putCertificateOptions(List<OpenSshCertificate.CertificateOption> options, Charset charset)
      According to PROTOCOL.certkeys: Certificate Options is a set of bytes that is [overall length][name(string)][[length of buffer][[length of string][data(string)]]]... Where each Certificate Option is encoded as a name (string) and data (string packed in a buffer) Then the entire name (string) + data (buffer) are added as bytes (which will get a length prefix)
      Parameters:
      options - to write into the buffer, may be null or empty but must not contain null elements
      charset - The Charset to use for string options
    • putNameList

      public void putNameList(Collection<String> names)
      According to RFC 4251: A name-list is represented as a uint32 containing its length (number of bytes that follow) followed by a comma-separated list of zero or more names.
      Parameters:
      names - The name list to put
    • putNameList

      public void putNameList(Collection<String> names, Charset charset)
    • putNameList

      public void putNameList(Collection<String> names, char separator)
    • putNameList

      public void putNameList(Collection<String> names, Charset charset, char separator)
      Adds a string that contains values separated by a delimiter
      Parameters:
      names - The names to set
      charset - The Charset to use to encode the string
      separator - The separator
    • putString

      public void putString(String string)
    • putString

      public void putString(String string, Charset charset)
    • putAndWipeChars

      public void putAndWipeChars(char[] chars)
      Zeroes the input array after having put the characters in the buffer - useful for sensitive information such as passwords
      Parameters:
      chars - The characters to put in the buffer - may be null/empty
      See Also:
    • putAndWipeChars

      public void putAndWipeChars(char[] chars, int offset, int len)
    • putAndWipeChars

      public void putAndWipeChars(char[] chars, Charset charset)
    • putAndWipeChars

      public void putAndWipeChars(char[] chars, int offset, int len, Charset charset)
    • putChars

      public void putChars(char[] chars)
    • putChars

      public void putChars(char[] chars, int offset, int len)
    • putChars

      public void putChars(char[] chars, Charset charset)
    • putChars

      public void putChars(char[] chars, int offset, int len, Charset charset)
    • putMPInt

      public void putMPInt(BigInteger bigint)
    • putMPInt

      public void putMPInt(byte[] mpInt)
    • putRawBytes

      public void putRawBytes(byte[] d)
    • putRawBytes

      public abstract void putRawBytes(byte[] d, int off, int len)
    • putPublicKey

      public void putPublicKey(PublicKey key)
    • putRawPublicKey

      public void putRawPublicKey(PublicKey key)
    • putRawPublicKeyBytes

      public void putRawPublicKeyBytes(PublicKey key)
    • putKeyPair

      public void putKeyPair(KeyPair kp)
    • ensureCapacity

      public Buffer ensureCapacity(int capacity)
    • ensureCapacity

      public abstract Buffer ensureCapacity(int capacity, IntUnaryOperator growthFactor)
      Parameters:
      capacity - The required capacity
      growthFactor - An IntUnaryOperator that is invoked if the current capacity is insufficient. The argument is the minimum required new data length, the function result should be the effective new data length to be allocated - if less than minimum then an exception is thrown
      Returns:
      This buffer instance
    • size

      protected abstract int size()
      Returns:
      Current size of underlying backing data bytes array
    • toString

      public String toString()
      Overrides:
      toString in class Object