mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-26 17:38:39 +00:00
split rlp_encode_length into rlp_encode_length and rlp_encode_list_length
This commit is contained in:
parent
3db323c599
commit
1558d77ea0
@ -38,28 +38,56 @@ struct SHA3_CTX keccak_ctx;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Encode length according to RLP.
|
* 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)) {
|
if (length == 1 && firstbyte == 0x00) {
|
||||||
/* Extra-special case: null is encoded differently */
|
// extra-special case: null is encoded differently
|
||||||
buf[0] = !firstbyte ? 0x80 : firstbyte;
|
buf[0] = 0x80;
|
||||||
|
return 1;
|
||||||
|
} else if (length == 1 && firstbyte <= 0x7f) {
|
||||||
|
buf[0] = firstbyte;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (length <= 55) {
|
} else if (length <= 55) {
|
||||||
buf[0] = (list ? 0xc0 : 0x80) + length;
|
buf[0] = 0x80 + length;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (length <= 0xff) {
|
} else if (length <= 0xff) {
|
||||||
buf[0] = (list ? 0xf7 : 0xb7) + 1;
|
buf[0] = 0xb7 + 1;
|
||||||
buf[1] = length;
|
buf[1] = length;
|
||||||
return 2;
|
return 2;
|
||||||
} else if (length <= 0xffff) {
|
} else if (length <= 0xffff) {
|
||||||
buf[0] = (list ? 0xf7 : 0xb7) + 2;
|
buf[0] = 0xb7 + 2;
|
||||||
buf[1] = length >> 8;
|
buf[1] = length >> 8;
|
||||||
buf[2] = length & 0xff;
|
buf[2] = length & 0xff;
|
||||||
return 3;
|
return 3;
|
||||||
} else {
|
} else {
|
||||||
buf[0] = (list ? 0xf7 : 0xb7) + 3;
|
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] = 0xf7 + 1;
|
||||||
|
buf[1] = length;
|
||||||
|
return 2;
|
||||||
|
} else if (length <= 0xffff) {
|
||||||
|
buf[0] = 0xf7 + 2;
|
||||||
|
buf[1] = length >> 8;
|
||||||
|
buf[2] = length & 0xff;
|
||||||
|
return 3;
|
||||||
|
} else {
|
||||||
|
buf[0] = 0xf7 + 3;
|
||||||
buf[1] = length >> 16;
|
buf[1] = length >> 16;
|
||||||
buf[2] = length >> 8;
|
buf[2] = length >> 8;
|
||||||
buf[3] = length & 0xff;
|
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)
|
static void hash_rlp_length(int length, uint8_t firstbyte)
|
||||||
{
|
{
|
||||||
uint8_t buf[4];
|
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);
|
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)
|
static void hash_rlp_list_length(int length)
|
||||||
{
|
{
|
||||||
uint8_t buf[4];
|
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);
|
hash_data(buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user