- netty tcp codecs
 
            "Byte Array Stream"                     "Byte Array Stream"
                    |                                      /|\
                    |                                       |
                   \|/                                      |
FixedConstructorLengthFieldBasedFrameDecoder                |
                    |                                       |
                    |                                       |
                   \|/                                      | 
                    -----------------------------------------
                    |                                       |
                    |  HandShakeSimpleChannelInboundHandler |
                    |                                       |
                    ----------------------------------------     
            "Byte Array Stream"                            "Byte Array Stream"
                    |                                             /|\
                    |                                              |
                   \|/                                             |
FixedConstructorLengthFieldBasedFrameDecoder                       |
                    |                                              |
                    |                                              |
                   \|/                                             |
      EncryptedInboundMessageDecoder                     OutboundMessageEncoder
                    |                                              |
                    |                                              |
                   \|/                                             |
             "InboundMessage"                                      |
   ( require next decoder or handler )                      "InboundMessage"
                    |                                             /|\
                    |                                              |
                   \|/                                             |
                    ------------------------------------------------
                    |                                              |
                    |         Some handler will handle it          |
                    |                                              |
                    ------------------------------------------------
The end of the body should always end with 'CrLf'.
- Server can verify that the Body Length is normal.
 - On the server side, the 'body length Delimiter' method and the 'CrLf Delimiter' method can be used interchangeably.
 
- HandshakeType
 
- required 'RSA 1024', other failure
 
| name | hex | 
|---|---|
| NONE | 0x00 | 
| RSA 1024 | 0x01 | 
| RSA 2048 | 0x02 | 
| RSA 4096 | 0x03 | 
- Type
 
- encryption type
 - require 'AES', other failure
 
| name | hex | 
|---|---|
| NONE | 0x00 | 
| AES | 0x01 | 
- Mode
 
- encryption mode
 - require 'CBC', other failure
 
| name | hex | 
|---|---|
| NONE | 0x00 | 
| ECB | 0x01 | 
| CBC | 0x02 | 
| CFB | 0x03 | 
| OFB | 0x04 | 
| CTR | 0x05 | 
- Padding
 
- encryption Padding
 - require 'PKCS 7 PADDING', other failure
 
| name | hex | 
|---|---|
| NONE | 0x00 | 
| PKCS#5 | 0x01 | 
| PKCS#7 | 0x02 | 
- IV Parameter
 
- require 16 byte fixed length.
 
- Symmetric Key
 
- 16 or 24 or 32 byte variable length.
 
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                           Length                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | HandShakeType |      Type     |     Mode      |    Padding    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                              ...                              |
 |                          IV Parameter                         |
 |                              ...                              |
 |                              ...                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                              ...                              |
 |                              ...                              |
 |                              ...                              |
 |                          Symmetric Key                        |
 |                              ...                              |
 |                              ...                              |
 |                              ...                              |
 |                              ...                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
| type | name | length | binary | range | hexadecimal | 
|---|---|---|---|---|---|
| Header | Length | 4 byte | 32 bit | -2,147,483,648 ~ 2,147,483,647 | 0x80000000 ~ 0x7fffffff | 
| Header | HandShake Type | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Type | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Mode | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Padding | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Body | IV Parameter | 16 byte | 128 bit | - | - | 
| Body | Symmetric Key | 16 or 24 or 32 byte | 128 bit or 192 bit or 256 bit | - | - | 
- iv parameter rule
 
set 'default' if null padding. 
'default' value is server private.
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                           Length                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | HandShakeType |  EncryptType  |  EncryptMode  | EncryptPadding|
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                              ...                              |
 |                              ...                              |
 |                        Encrypted Body                         |
 |                              ...                              |
 |                              ...                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
| type | name | length | binary | range | hexadecimal | 
|---|---|---|---|---|---|
| Header | Length | 4 byte | 32 bit | -2,147,483,648 ~ 2,147,483,647 | 0x80000000 ~ 0x7fffffff | 
| Header | HandShake Type | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Type | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Mode | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Padding | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Body | Encrypted Body | variable | variable | variable | variable | 
- encrypted body rule
 
1. 'handshake' uses 'rsa' algorithm.
2. Public key algorithm for 'AES' key exchange.
3. The 'AES' key is provided by the client.
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                             Length                            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                               ID                              |
 |                                                               |                            
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |     Type    |    Status     |   Encoding    |    Reserved     |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                              ...                              |
 |                              Body                             |
 |                              ...                              |                            
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
| type | name | length | binary | range | hexadecimal | 
|---|---|---|---|---|---|
| Header | Length | 4 byte | 32 bit | -2,147,483,648 ~ 2,147,483,647 | 0x80000000 ~ 0x7fffffff | 
| Header | ID | 8 byte | 64 bit | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0x8000000000000000 ~ 0x7fffffffffffffff | 
| Header | Type | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Status | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Encoding | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Header | Reserved | 1 byte | 8 bit | -128 ~ 127 | 0x80 ~ 0x7f | 
| Body | Body | variable | variable | - | - | 
- encryption fields
 
Id, Type, Status, Encoding, Reserved, Body
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                             Length                            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                              ...                              |
 |                         Encrypted Body                        |
 |                              ...                              |                            
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
| name | length | binary | range | hexadecimal | 
|---|---|---|---|---|
| Length | 4 byte | 32 bit | -2,147,483,648 ~ 2,147,483,647 | 0x80000000 ~ 0x7fffffff | 
| Body | variable | variable | variable | variable | 
- encrypted body rule
 
Except for the length field, all headers and bodies are encrypted by 'AES'.
implementation("io.github.ppzxc:codec:X.X.X")