From 1558d77ea020fb2b231f547823ff24ab3f057d97 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 16 Aug 2016 14:06:05 +0200 Subject: [PATCH] split rlp_encode_length into rlp_encode_length and rlp_encode_list_length --- firmware/ethereum.c | 50 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/firmware/ethereum.c b/firmware/ethereum.c index 9bf34cc88..5b8df6c05 100644 --- a/firmware/ethereum.c +++ b/firmware/ethereum.c @@ -38,28 +38,56 @@ struct SHA3_CTX keccak_ctx; /* * Encode length according to RLP. - * FIXME: improve */ -static int rlp_encode_length(uint8_t *buf, int length, uint8_t firstbyte, bool list) +static int rlp_encode_length(uint8_t *buf, int length, uint8_t firstbyte) { - if (!list && (length == 1 && firstbyte <= 0x7f)) { - /* Extra-special case: null is encoded differently */ - buf[0] = !firstbyte ? 0x80 : firstbyte; + if (length == 1 && firstbyte == 0x00) { + // extra-special case: null is encoded differently + buf[0] = 0x80; + return 1; + } else if (length == 1 && firstbyte <= 0x7f) { + buf[0] = firstbyte; return 1; } else if (length <= 55) { - buf[0] = (list ? 0xc0 : 0x80) + length; + buf[0] = 0x80 + length; + return 1; + } else if (length <= 0xff) { + buf[0] = 0xb7 + 1; + buf[1] = length; + return 2; + } else if (length <= 0xffff) { + buf[0] = 0xb7 + 2; + buf[1] = length >> 8; + buf[2] = length & 0xff; + return 3; + } else { + buf[0] = 0xb7 + 3; + buf[1] = length >> 16; + buf[2] = length >> 8; + buf[3] = length & 0xff; + return 4; + } +} + +/* + * Encode list length according to RLP. + */ +static int rlp_encode_list_length(uint8_t *buf, int length) +{ + if (length <= 55) { + buf[0] = 0xc0 + length; return 1; } else if (length <= 0xff) { - buf[0] = (list ? 0xf7 : 0xb7) + 1; + buf[0] = 0xf7 + 1; buf[1] = length; return 2; } else if (length <= 0xffff) { - buf[0] = (list ? 0xf7 : 0xb7) + 2; + buf[0] = 0xf7 + 2; buf[1] = length >> 8; buf[2] = length & 0xff; return 3; } else { - buf[0] = (list ? 0xf7 : 0xb7) + 3; + buf[0] = 0xf7 + 3; buf[1] = length >> 16; buf[2] = length >> 8; buf[3] = length & 0xff; @@ -97,7 +125,7 @@ static inline void hash_data(const uint8_t *buf, size_t size) static void hash_rlp_length(int length, uint8_t firstbyte) { uint8_t buf[4]; - size_t size = rlp_encode_length(buf, length, firstbyte, false); + size_t size = rlp_encode_length(buf, length, firstbyte); hash_data(buf, size); } @@ -107,7 +135,7 @@ static void hash_rlp_length(int length, uint8_t firstbyte) static void hash_rlp_list_length(int length) { uint8_t buf[4]; - size_t size = rlp_encode_length(buf, length, 0, true); + size_t size = rlp_encode_list_length(buf, length); hash_data(buf, size); }