mirror of
https://github.com/lightning/bolts.git
synced 2024-11-19 01:50:03 +01:00
BOLT 1: Add test vectors.
These are based on @t-bast's vectors from #607, with a few more cases: 1. Explicitly test encodings for 253, 254 and 255. 2. Use BigSize and make sure tests break badly if endian parsing is wrong.' 3. Test wrap-around of type encodings in stream. Many thanks to @t-bast and @cfromknecht for their contributions and testing Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
2fe6af8567
commit
aa33af0c4d
244
01-messaging.md
244
01-messaging.md
@ -20,7 +20,8 @@ All data fields are unsigned big-endian unless otherwise specified.
|
||||
* [The `error` Message](#the-error-message)
|
||||
* [Control Messages](#control-messages)
|
||||
* [The `ping` and `pong` Messages](#the-ping-and-pong-messages)
|
||||
* [Appendix B: BigSize Test Vectors](#appendix-b-bigsize-test-vectors)
|
||||
* [Appendix A: BigSize Test Vectors](#appendix-a-bigsize-test-vectors)
|
||||
* [Appendix B: Type-Length-Value Test Vectors](#appendix-b-type-length-value-test-vectors)
|
||||
* [Acknowledgments](#acknowledgments)
|
||||
* [References](#references)
|
||||
* [Authors](#authors)
|
||||
@ -97,7 +98,7 @@ A `tlv_record` represents a single field, encoded in the form:
|
||||
* [`length`: `value`]
|
||||
|
||||
A `varint` is a variable-length, unsigned integer encoding using the
|
||||
[BigSize](#appendix-b-bigsize-test-vectors) format, which resembles the bitcoin
|
||||
[BigSize](#appendix-a-bigsize-test-vectors) format, which resembles the bitcoin
|
||||
CompactSize encoding but uses big-endian for multi-byte values rather than
|
||||
little-endian.
|
||||
|
||||
@ -397,7 +398,7 @@ every message maximally).
|
||||
Finally, the usage of periodic `ping` messages serves to promote frequent key
|
||||
rotations as specified within [BOLT #8](08-transport.md).
|
||||
|
||||
## Appendix B: BigSize Test Vectors
|
||||
## Appendix A: BigSize Test Vectors
|
||||
|
||||
The following test vectors can be used to assert the correctness of a BigSize
|
||||
implementation used in the TLV format. The format is identical to the
|
||||
@ -620,6 +621,243 @@ A correct implementation should pass against the following test vectors:
|
||||
]
|
||||
```
|
||||
|
||||
## Appendix B: Type-Length-Value Test Vectors
|
||||
|
||||
The following tests assume that two separate TLV namespaces exist: n1 and n2.
|
||||
|
||||
The n1 namespace supports the following TLV types:
|
||||
|
||||
1. tlvs: `n1`
|
||||
2. types:
|
||||
1. type: 1 (`tlv1`)
|
||||
2. data:
|
||||
* [`tu64`:`amount_msat`]
|
||||
1. type: 2 (`tlv2`)
|
||||
2. data:
|
||||
* [`short_channel_id`:`scid`]
|
||||
1. type: 3 (`tlv3`)
|
||||
2. data:
|
||||
* [`point`:`node_id`]
|
||||
* [`u64`:`amount_msat_1`]
|
||||
* [`u64`:`amount_msat_2`]
|
||||
1. type: 254 (`tlv4`)
|
||||
2. data:
|
||||
* [`u16`:`cltv_delta`]
|
||||
|
||||
The n2 namespace supports the following TLV types:
|
||||
|
||||
1. tlvs: `n2`
|
||||
2. types:
|
||||
1. type: 0 (`tlv1`)
|
||||
2. data:
|
||||
* [`tu64`:`amount_msat`]
|
||||
1. type: 11 (`tlv2`)
|
||||
2. data:
|
||||
* [`tu32`:`cltv_expiry`]
|
||||
|
||||
### TLV Decoding Failures
|
||||
|
||||
The following TLV streams in any namespace should trigger a decoding failure:
|
||||
|
||||
1. Invalid stream: 0xfd
|
||||
2. Reason: type truncated
|
||||
|
||||
1. Invalid stream: 0xfd01
|
||||
2. Reason: type truncated
|
||||
|
||||
1. Invalid stream: 0xfd0001 00
|
||||
2. Reason: not minimally encoded type
|
||||
|
||||
1. Invalid stream: 0xfd0101
|
||||
2. Reason: missing length
|
||||
|
||||
1. Invalid stream: 0x0f fd
|
||||
2. Reason: (length truncated)
|
||||
|
||||
1. Invalid stream: 0x0f fd26
|
||||
2. Reason: (length truncated)
|
||||
|
||||
1. Invalid stream: 0x0f fd2602
|
||||
2. Reason: missing value
|
||||
|
||||
1. Invalid stream: 0x0f fd0001 00
|
||||
2. Reason: not minimally encoded length
|
||||
|
||||
1. Invalid stream: 0x0f fd0201 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
2. Reason: value truncated
|
||||
|
||||
The following TLV streams in either namespace should trigger a
|
||||
decoding failure:
|
||||
|
||||
1. Invalid stream: 0x12 00
|
||||
2. Reason: unknown even type.
|
||||
|
||||
1. Invalid stream: 0xfd0102 00
|
||||
2. Reason: unknown even type.
|
||||
|
||||
1. Invalid stream: 0xfe01000002 00
|
||||
2. Reason: unknown even type.
|
||||
|
||||
1. Invalid stream: 0xff0100000000000002 00
|
||||
2. Reason: unknown even type.
|
||||
|
||||
The following TLV streams in namespace `n1` should trigger a decoding
|
||||
failure:
|
||||
|
||||
1. Invalid stream: 0x01 09 ffffffffffffffffff
|
||||
2. Reason: greater than encoding length for `n1`s `tlv1`.
|
||||
|
||||
1. Invalid stream: 0x01 01 00
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 02 0001
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 03 000100
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 04 00010000
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 05 0001000000
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 06 000100000000
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 07 00010000000000
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x01 08 0001000000000000
|
||||
2. Reason: encoding for `n1`s `tlv1`s `amount_msat` is not minimal
|
||||
|
||||
1. Invalid stream: 0x02 07 01010101010101
|
||||
2. Reason: less than encoding length for `n1`s `tlv2`.
|
||||
|
||||
1. Invalid stream: 0x02 09 010101010101010101
|
||||
2. Reason: greater than encoding length for `n1`s `tlv2`.
|
||||
|
||||
1. Invalid stream: 0x03 21 023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb
|
||||
2. Reason: less than encoding length for `n1`s `tlv3`.
|
||||
|
||||
1. Invalid stream: 0x03 29 023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb0000000000000001
|
||||
2. Reason: less than encoding length for `n1`s `tlv3`.
|
||||
|
||||
1. Invalid stream: 0x03 30 023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb000000000000000100000000000001
|
||||
2. Reason: less than encoding length for `n1`s `tlv3`.
|
||||
|
||||
1. Invalid stream: 0x03 31 043da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb00000000000000010000000000000002
|
||||
2. Reason: `n1`s `node_id` is not a valid point.
|
||||
|
||||
1. Invalid stream: 0x03 32 023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb0000000000000001000000000000000001
|
||||
2. Reason: greater than encoding length for `n1`s `tlv3`.
|
||||
|
||||
1. Invalid stream: 0xfd00fe 00
|
||||
2. Reason: less than encoding length for `n1`s `tlv4`.
|
||||
|
||||
1. Invalid stream: 0xfd00fe 01 01
|
||||
2. Reason: less than encoding length for `n1`s `tlv4`.
|
||||
|
||||
1. Invalid stream: 0xfd00fe 03 010101
|
||||
2. Reason: greater than encoding length for `n1`s `tlv4`.
|
||||
|
||||
1. Invalid stream: 0x00 00
|
||||
2. Reason: unknown even field for `n1`s namespace.
|
||||
|
||||
### TLV Decoding Successes
|
||||
|
||||
The following TLV streams in either namespace should correctly decode,
|
||||
and be ignored:
|
||||
|
||||
1. Valid stream: 0x
|
||||
2. Explanation: empty message
|
||||
|
||||
1. Valid stream: 0x21 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
1. Valid stream: 0xfd0201 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
1. Valid stream: 0xfd00fd 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
1. Valid stream: 0xfd00ff 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
1. Valid stream: 0xfe02000001 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
1. Valid stream: 0xff0200000000000001 00
|
||||
2. Explanation: Unknown odd type.
|
||||
|
||||
The following TLV streams in `n1` namespace should correctly decode,
|
||||
with the values given here:
|
||||
|
||||
1. Valid stream: 0x01 00
|
||||
2. Values: `tlv1` `amount_msat`=0
|
||||
|
||||
1. Valid stream: 0x01 01 01
|
||||
2. Values: `tlv1` `amount_msat`=1
|
||||
|
||||
1. Valid stream: 0x01 02 0100
|
||||
2. Values: `tlv1` `amount_msat`=256
|
||||
|
||||
1. Valid stream: 0x01 03 010000
|
||||
2. Values: `tlv1` `amount_msat`=65536
|
||||
|
||||
1. Valid stream: 0x01 04 01000000
|
||||
2. Values: `tlv1` `amount_msat`=16777216
|
||||
|
||||
1. Valid stream: 0x01 05 0100000000
|
||||
2. Values: `tlv1` `amount_msat`=4294967296
|
||||
|
||||
1. Valid stream: 0x01 06 010000000000
|
||||
2. Values: `tlv1` `amount_msat`=1099511627776
|
||||
|
||||
1. Valid stream: 0x01 07 01000000000000
|
||||
2. Values: `tlv1` `amount_msat`=281474976710656
|
||||
|
||||
1. Valid stream: 0x01 08 0100000000000000
|
||||
2. Values: `tlv1` `amount_msat`=72057594037927936
|
||||
|
||||
1. Valid stream: 0x02 08 0000000000000226
|
||||
2. Values: `tlv2` `scid`=0x0x550
|
||||
|
||||
1. Valid stream: 0x03 31 023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb00000000000000010000000000000002
|
||||
2. Values: `tlv3` `node_id`=023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb `amount_msat_1`=1 `amount_msat_2`=2
|
||||
|
||||
1. Valid stream: 0xfd00fe 02 0226
|
||||
2. Values: `tlv4` `cltv_delta`=550
|
||||
|
||||
### TLV Stream Decoding Failure
|
||||
|
||||
Any appending of an invalid stream to a valid stream should trigger
|
||||
a decoding failure.
|
||||
|
||||
Any appending of a higher-numbered valid stream to a lower-numbered
|
||||
valid stream should not trigger a decoding failure.
|
||||
|
||||
In addition, the following TLV streams in namespace `n1` should
|
||||
trigger a decoding failure:
|
||||
|
||||
1. Invalid stream: 0x02 08 0000000000000226 01 01 2a
|
||||
2. Reason: valid TLV records but invalid ordering
|
||||
|
||||
1. Invalid stream: 0x02 08 0000000000000231 02 08 0000000000000451
|
||||
2. Reason: duplicate TLV type
|
||||
|
||||
1. Invalid stream: 0x1f 00 0f 01 2a
|
||||
2. Reason: valid (ignored) TLV records but invalid ordering
|
||||
|
||||
1. Invalid stream: 0x1f 00 1f 01 2a
|
||||
2. Reason: duplicate TLV type (ignored)
|
||||
|
||||
The following TLV stream in namespace `n2` should trigger a decoding
|
||||
failure:
|
||||
|
||||
1. Invalid stream: 0xffffffffffffffffff 00 00 00
|
||||
2. Reason: valid TLV records but invalid ordering
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
[ TODO: (roasbeef); fin ]
|
||||
|
Loading…
Reference in New Issue
Block a user