b2f:start
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
b2f:start [2025/02/11 19:55] – created f4hof | b2f:start [2025/02/15 10:13] (current) – [Standard Forwarding protocol (MBL/RLI)] f4hof | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
+ | **WARNING** At this stage, this page is the scratchpad of an attempt to summarize everything related to the BBS forwarding protocol (including Winlink extensions). Considering the poor redactional and lacunar nature of the reference documentation, | ||
===== SID ===== | ===== SID ===== | ||
Line 46: | Line 47: | ||
==== Required extensions for Winlink ==== | ==== Required extensions for Winlink ==== | ||
- | TODO Actually challenge | + | FIXME Fuzz Wl2k express to see which extensions break its nominal operation. |
Here are the strict minimum extensions required by Winlink to accept a remote party, according the selected mode of operation: | Here are the strict minimum extensions required by Winlink to accept a remote party, according the selected mode of operation: | ||
Line 56: | Line 57: | ||
| P2P | '' | | P2P | '' | ||
===== Commands (AKA proposals) ===== | ===== Commands (AKA proposals) ===== | ||
- | ==== Common subset ==== | ||
- | The '' | ||
- | Format: | + | ==== Ascii Basic Protocol ===== |
- | < | + | (i) Usage of this proposal implies the presence of the '' |
- | ^ Code ^ Action ^ Remarks ^ | + | Details in the dedicated page on the [[b2f:ascii|ASCII Basic Protocol]] |
- | | '' | + | ==== Binary compressed protocol version 0 ==== |
- | | '' | + | |
- | | '' | + | |
- | Starting from Binary compressed format version 1, additional responses are possible: | + | (i) Usage of this proposal implies the presence of both the '' |
- | ^ Code ^ Action ^ Remarks ^ | + | Details in the dedicated page on the [[b2f: |
- | | '' | + | ==== Binary |
- | | '' | + | |
- | | '' | + | |
- | | '' | + | |
- | | '' | + | |
- | | '' | + | |
- | | '' | + | |
+ | (i) Usage of this proposal implies the presence of both the '' | ||
- | ==== Calling Station ID ==== | + | Details in the dedicated page on the [[b2f: |
- | The calling station identification command is to be sent **PRIOR** | + | ==== B2F ==== |
- | < | + | B2F is a superset of BCFv1, so '' |
- | ==== Ascii Basic Protocol ===== | + | |
- | + | ||
- | (i) Usage of this proposal implies | + | |
- | ==== Binary | + | |
- | ==== Binary compressed protocol version | + | |
- | ==== Binary compressed protocol version 2 ==== | + | |
- | BCPv2 is a superset of BCPv1, so '' | + | |
- | + | ||
- | Additionally, | + | |
+ | This protocol' | ||
==== GZIP Experiment ==== | ==== GZIP Experiment ==== | ||
- | The GZIP Experiment is a superset of BCPv2 which adds the '' | + | The GZIP Experiment is a superset of BCPv2 which adds the '' |
===== Winlink specifics ===== | ===== Winlink specifics ===== | ||
Line 102: | Line 86: | ||
W0RLI also ties the features '' | W0RLI also ties the features '' | ||
- | ==== Secure login ==== | ||
- | The exchange happens after the SID has been transmitted. | ||
- | The server sends a ''; | ||
- | |||
- | < | ||
- | |||
- | The client computes the response using the following pseudocode: | ||
- | |||
- | <code c> | ||
- | // Trailing salt | ||
- | uint8_t sl_salt[] = { | ||
- | 77, 197, 101, 206, 190, 249, 93, 200, | ||
- | 51, 243, 93, 237, 71, 94, 239, 138, | ||
- | 68, 108, 70, 185, 225, 137, 217, 16, | ||
- | 51, 122, 193, 48, 194, 195, 198, 175, | ||
- | 172, 169, 70, 84, 61, 62, 104, 186, | ||
- | 114, 52, 61, 168, 66, 129, 192, 208, | ||
- | 187, 249, 232, 193, 41, 113, 41, 45, | ||
- | 240, 16, 29, 228, 208, 228, 61, 20 | ||
- | }; | ||
- | |||
- | // Concatenate the challenge, the password and the salt. | ||
- | payload = concat( challenge, password, sl_salt) | ||
- | |||
- | // Compute the md5 of the last result | ||
- | md5sum = md5(payload) | ||
- | |||
- | // Take the first 4 bytes of the hash, flip the byte-wise endianness, and cap the first byte to 0x3f | ||
- | response = ( (uint8_t)(md5sum[3]) & 0x3f ) << 24 | (uint8_t)(md5sum[2]) << 16 | (uint8_t)(md5sum[1]) << 8 | (uint8_t)(md5sum[0]) ) | ||
- | |||
- | // Keep the 8 least significant digits in base 10 of response. | ||
- | // If response is shorter than 8 digits, 0-pad from the left. | ||
- | resval = itoa( response % 100000000, base10) | ||
- | sprintf( result, " | ||
- | |||
- | </ | ||
- | |||
- | The result is then sent to the server using the following format: | ||
- | |||
- | < | ||
- | |||
- | Reference source code in [[https:// | ||
==== Forward messages ==== | ==== Forward messages ==== | ||
==== Pending messages ==== | ==== Pending messages ==== | ||
Line 158: | Line 100: | ||
Your software is supposed to fall back in this mode when the feature '' | Your software is supposed to fall back in this mode when the feature '' | ||
- | Best recommended stance, for now, is to reject connections with an error message, given the lack of available documentation. | + | F4HOF' |
==== ASCII Basic Protocol ==== | ==== ASCII Basic Protocol ==== | ||
- | ==== Ascii Basic Protocol ==== | + | |
==== Binary compressed protocol version 0 ==== | ==== Binary compressed protocol version 0 ==== | ||
- | === Header === | ||
- | Format: | ||
- | < | ||
- | |||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | |||
- | === Data === | ||
- | Format: | ||
- | < | ||
- | * '' | ||
- | |||
- | === Checksum === | ||
- | Format: | ||
- | < | ||
- | The checksum is designed so that the bytewise sum of data bytes, plus the checksum modulo 256 equals to zero if no error occured. | ||
- | |||
- | To generate the checksum, compute the two's complement of the bytewise sum of data bytes. | ||
==== Binary compressed protocol version 1 ==== | ==== Binary compressed protocol version 1 ==== | ||
==== Binary compressed protocol version 2 ==== | ==== Binary compressed protocol version 2 ==== |
b2f/start.1739303748.txt.gz · Last modified: 2025/02/11 19:55 by f4hof