NFC adapter: Difference between revisions
Socram8888 (talk | contribs) |
Socram8888 (talk | contribs) No edit summary |
||
Line 38: | Line 38: | ||
Packets are sent using IrDA-SIR (using [[ir:USER]]), with a 8N1 encoding (eight data bits, one stop bit, without parity). Each one is formed by a 2-byte header, a varint with the payload size, an obfuscated payload, and trailing error detection byte. | Packets are sent using IrDA-SIR (using [[ir:USER]]), with a 8N1 encoding (eight data bits, one stop bit, without parity). Each one is formed by a 2-byte header, a varint with the payload size, an obfuscated payload, and trailing error detection byte. | ||
== | == Layer 1 - framing format == | ||
Frames are encoded using two different yet very simmilar formats, depending on how large the payload to be transmitted is: | |||
* For payloads with less than 64 bytes, the third byte represents the payload size. | * For payloads with less than 64 bytes, the third byte represents the payload size. | ||
* For packets with up to 16383 bytes, the size is split in two bytes, with the third byte being the upper 6 bits of the payload size, OR'd with 0x40, and the fourth being the lower eight bits of the payload size | * For packets with up to 16383 bytes, the size is split in two bytes, with the third byte being the upper 6 bits of the payload size, OR'd with 0x40, and the fourth being the lower eight bits of the payload size | ||
{| class="wikitable" style="margin: 0 auto; text-align: center;" | |||
{| class="wikitable" border="1" | |+IR framing format - short frame | ||
! | |- | ||
! RFU | ! style="border-top: none" | Byte | ||
! style="width:10%;"| 7 | |||
! style="width:10%;"| 6 | |||
! style="width:10%;"| 5 | |||
! style="width:10%;"| 4 | |||
! style="width:10%;"| 3 | |||
! style="width:10%;"| 2 | |||
! style="width:10%;"| 1 | |||
! style="width:10%;"| 0 | |||
|- | |||
! 0x00 | |||
| colspan="8"|Synchronization byte (<code>0xA5</code>) | |||
|- | |||
! 0x01 | |||
| colspan="8"|Reserved for future use (<code>0x00</code>) | |||
|- | |||
! 0x02 | |||
| RFU (<code>0</code>) | |||
| Short frame (<code>0</code>) | |||
| colspan="6"|Payload size | |||
|- | |- | ||
| | ! 0x03 | ||
| | | colspan="8"|Payload byte 0 | ||
| | |- | ||
| colspan="9"|... | |||
|- | |||
! 0x03+n-1 | |||
| colspan="8"|Payload byte n-1 | |||
|- | |||
! 0x03+n | |||
| colspan="8"|[[CRC-8-CCITT]] computer over whole packet | |||
|} | |} | ||
{| class="wikitable" border="1" | {| class="wikitable" style="margin: 0 auto; text-align: center;" | ||
! | |+IR framing format - long frame | ||
! RFU | |- | ||
! style="border-top: none" | Byte | |||
! | ! style="width:10%;"| 7 | ||
! style="width:10%;"| 6 | |||
! style="width:10%;"| 5 | |||
! style="width:10%;"| 4 | |||
! style="width:10%;"| 3 | |||
! style="width:10%;"| 2 | |||
! style="width:10%;"| 1 | |||
! style="width:10%;"| 0 | |||
|- | |||
! 0x00 | |||
| colspan="8"|Synchronization byte (<code>0xA5</code>) | |||
|- | |||
! 0x01 | |||
| colspan="8"|Reserved for future use (<code>0x00</code>) | |||
|- | |||
! 0x02 | |||
| RFU (<code>0</code>) | |||
| Long frame (<code>1</code>) | |||
| colspan="6"|Payload size (upper 6 bits) | |||
|- | |||
! 0x03 | |||
| colspan="8"|Payload size (lower 8 bits) | |||
|- | |||
! 0x04 | |||
| colspan="8"|Payload byte 0 | |||
|- | |- | ||
| | | colspan="9"|... | ||
| | |- | ||
| | ! 0x04+n-1 | ||
| | | colspan="8"|Payload byte n-1 | ||
|- | |||
! 0x04+n | |||
| colspan="8"|[[CRC-8-CCITT]] computer over whole packet | |||
|} | |} | ||
=== Header === | |||
The packet header is fixed and consists in a synchronization byte (0xA5), followed by a unused (possibly RFU) zero byte. After these two hardcoded bytes, there's a varint representing the payload size, which may use one byte or two, depending on the how big the payload is. | |||
In C: | In C: | ||
Line 87: | Line 141: | ||
}</nowiki> | }</nowiki> | ||
== Payload == | === Payload === | ||
The payload is obfuscated using a XOR-based encryption. In C: | The payload is obfuscated using a XOR-based encryption. In C: | ||
<nowiki>void payloadObfuscate(const void * voidplain, void * voidcipher, size_t size) { | <nowiki>void payloadObfuscate(const void * voidplain, void * voidcipher, size_t size) { | ||
Line 118: | Line 172: | ||
}</nowiki> | }</nowiki> | ||
== Error detection == | === Error detection === | ||
The trailing error detection byte is calculated using [[CRC-8-CCITT]] <b>over the whole packet</b> (both the header and the payload) | The trailing error detection byte is calculated using [[CRC-8-CCITT]] <b>over the whole packet</b> (both the header and the payload) | ||