Beispiel #1
0
 def pop(byte_string):
     t, byte_string, err = BigSize.pop(byte_string)
     if err:
         return None, None, "could not get type: %s" % err
     l, byte_string, err = BigSize.pop(byte_string)
     if err:
         return None, None, "could not get length: %s" % err
     if len(byte_string) < l:
         return None, None, "value truncated"
     return Tlv(t, byte_string[:l]), byte_string[l:], None
Beispiel #2
0
 def peek(byte_string):
     t, remainder, err = BigSize.pop(byte_string)
     if err:
         return None, "could not get type: %s" % err
     l, remainder, err = BigSize.pop(remainder)
     if err:
         return None, "could not get length: %s" % err
     if len(remainder) < l:
         return None, "value truncated"
     return Tlv(t, remainder[:l]), None
Beispiel #3
0
 def encode_non_final(amt_to_forward, outgoing_cltv_value, short_channel_id,
                      art_no, pixels):
     unextended = TlvHopPayload.encode_non_final(amt_to_forward,
                                                 outgoing_cltv_value,
                                                 short_channel_id)
     old_len, content, err = BigSize.pop(unextended)
     assert err is None
     art_no_content = Extension._encode_art_no(art_no)
     pixel_content = Extension._encode_pixels(pixels)
     new_content = content + art_no_content + pixel_content
     return BigSize.encode(len(new_content)) + new_content
Beispiel #4
0
 def encode_final(amt_to_forward, outgoing_cltv_value, payment_secret,
                  total_msat, art_no, pixels):
     unextended = TlvHopPayload.encode_final(amt_to_forward,
                                             outgoing_cltv_value,
                                             pament_secret=payment_secret,
                                             totol_msat=total_msat)
     old_len, content, err = BigSize.pop(unextended)
     assert err is None
     art_no_content = Extension._encode_art_no(art_no)
     pixel_content = Extension._encode_pixels(pixels)
     new_content = content + art_no_content + pixel_content
     return BigSize.encode(len(new_content)) + new_content
Beispiel #5
0
 def parse(byte_string, extension_parsers=None):
     length, remainder, err = BigSize.pop(byte_string)
     if err:
         return None, err
     if length == 1:
         return None, "unknown version"
     if length == 0:
         return LegacyHopPayload.parse(remainder)
     if len(remainder) != length:
         return None, "remainder length does not match state length"
     return TlvHopPayload.parse(remainder,
                                extension_parsers=extension_parsers)
Beispiel #6
0
    "name": "four byte no read",
    "value": 0,
    "bytes": "fe",
    "exp_error": "unexpected EOF"
}, {
    "name": "eight byte no read",
    "value": 0,
    "bytes": "ff",
    "exp_error": "unexpected EOF"
}]

if __name__ == "__main__":
    print("running test cases")
    for test in BIGSIZE_DECODING_TESTS:
        #print("test: %s" % test)
        v, remainder, err = BigSize.pop(h2b(test['bytes']))
        #print("%s %s %s %s" % (test['value'], str(v), remainder, err))
        if 'exp_error' in test.keys():
            assert err is not None, "did not get error as expected"
        else:
            assert v == test['value'], "did not get value expected"
    print("passed test cases")

    print("running small")
    TEST_ITERATIONS = 10000
    for _ in range(TEST_ITERATIONS):
        v = random.randint(0, 0xfc)
        encoded = BigSize.encode(v)
        decoded, remainder, err = BigSize.pop(encoded)
        assert err is None, "unexpected error"
        assert len(remainder) == 0, "unexpected remainder"