Global hash making

This commit is contained in:
Alexandre Paillier
2022-05-02 11:04:59 +02:00
parent a2a72edf83
commit 6d86a5de77
4 changed files with 176 additions and 28 deletions

View File

@@ -260,6 +260,7 @@ bool set_struct_name(const uint8_t *const data)
}
// TODO: Split this function
// TODO: Handle partial sends
bool set_struct_field(const uint8_t *const data)
{
uint8_t data_idx = OFFSET_DATA;
@@ -381,7 +382,6 @@ bool handle_apdu(const uint8_t *const data)
switch (data[OFFSET_P2])
{
case P2_NAME:
type_hash(structs_array, (char*)&data[OFFSET_DATA], data[OFFSET_LC], true);
// set root type
path_set_root((char*)&data[OFFSET_DATA], data[OFFSET_LC]);
break;
@@ -449,7 +449,7 @@ int main(void)
}
}
#ifdef DEBUG
printf("\n%lu bytes used in RAM\n", (mem_max + 1));
printf("%lu bytes used in RAM\n", (mem_max + 1));
#endif
return EXIT_SUCCESS;
}

View File

@@ -32,7 +32,8 @@ const uint8_t *field_hash(const uint8_t *data,
const char *key;
uint8_t keylen;
e_type field_type;
uint8_t *hash_ptr = NULL;
uint8_t *value = NULL;
(void)data;
if (fh == NULL)
@@ -51,7 +52,10 @@ const uint8_t *field_hash(const uint8_t *data,
data += sizeof(uint16_t);
data_length -= sizeof(uint16_t);
fh->state = FHS_WAITING_FOR_MORE;
cx_keccak_init((cx_hash_t*)&global_sha3, 256); // init hash
if (IS_DYN(field_type))
{
cx_keccak_init((cx_hash_t*)&global_sha3, 256); // init hash
}
}
fh->remaining_size -= data_length;
// if a dynamic type -> continue progressive hash
@@ -78,8 +82,6 @@ const uint8_t *field_hash(const uint8_t *data,
fwrite(key, sizeof(char), keylen, stdout);
printf("\n");
uint8_t *value = NULL;
if (!IS_DYN(field_type))
{
switch (field_type)
@@ -105,28 +107,39 @@ const uint8_t *field_hash(const uint8_t *data,
{
return NULL;
}
cx_hash((cx_hash_t*)&global_sha3,
0,
(uint8_t*)value,
EIP_712_ENCODED_FIELD_LENGTH,
NULL,
0);
// restore the memory location
mem_dealloc(EIP_712_ENCODED_FIELD_LENGTH);
}
if ((hash_ptr = mem_alloc(KECCAK256_HASH_BYTESIZE)) == NULL)
else
{
return NULL;
if ((value = mem_alloc(KECCAK256_HASH_BYTESIZE)) == NULL)
{
return NULL;
}
// copy hash into memory
cx_hash((cx_hash_t*)&global_sha3,
CX_LAST,
NULL,
0,
value,
KECCAK256_HASH_BYTESIZE);
}
// copy hash into memory
cx_hash((cx_hash_t*)&global_sha3,
CX_LAST,
NULL,
// TODO: Move elsewhere
uint8_t len = IS_DYN(field_type) ?
KECCAK256_HASH_BYTESIZE :
EIP_712_ENCODED_FIELD_LENGTH;
// last thing in mem is the hash of the previous field
// and just before it is the current hash context
cx_sha3_t *hash_ctx = (cx_sha3_t*)(value - sizeof(cx_sha3_t));
// start the progressive hash on it
cx_hash((cx_hash_t*)hash_ctx,
0,
hash_ptr,
KECCAK256_HASH_BYTESIZE);
value,
len,
NULL,
0);
// deallocate it
mem_dealloc(len);
printf("FEED %d\n", len);
path_advance();
fh->state = FHS_IDLE;
@@ -138,5 +151,6 @@ const uint8_t *field_hash(const uint8_t *data,
return NULL;
}
}
return hash_ptr;
return value;
}

View File

@@ -5,7 +5,7 @@
#include "mem.h"
#define SIZE_MEM_BUFFER 2048
#define SIZE_MEM_BUFFER 8192
static uint8_t mem_buffer[SIZE_MEM_BUFFER];
static size_t mem_idx;

View File

@@ -5,6 +5,8 @@
#include "mem.h"
#include "context.h"
#include "eip712.h"
#include "type_hash.h"
#include "shared_context.h"
static s_path *path_struct = NULL;
@@ -107,6 +109,43 @@ static bool path_depth_list_pop(void)
return false;
}
path_struct->depth_count -= 1;
// TODO: Move elsewhere
uint8_t shash[KECCAK256_HASH_BYTESIZE];
cx_sha3_t *hash_ctx = mem_alloc(0) - sizeof(cx_sha3_t);
// finalize hash
cx_hash((cx_hash_t*)hash_ctx,
CX_LAST,
NULL,
0,
&shash[0],
KECCAK256_HASH_BYTESIZE);
mem_dealloc(sizeof(cx_sha3_t)); // remove hash context
#ifdef DEBUG
// print computed hash
printf("SHASH POP 0x");
for (int idx = 0; idx < KECCAK256_HASH_BYTESIZE; ++idx)
{
printf("%.02x", shash[idx]);
}
printf("\n");
#endif
if (path_struct->depth_count > 0)
{
hash_ctx = mem_alloc(0) - sizeof(cx_sha3_t); // previous one
// continue progressive hash with the array hash
cx_hash((cx_hash_t*)hash_ctx,
0,
&shash[0],
KECCAK256_HASH_BYTESIZE,
NULL,
0);
}
else
{
printf("\n");
}
return true;
}
@@ -125,6 +164,7 @@ static bool array_depth_list_push(uint8_t path_idx, uint8_t size)
{
return false;
}
arr->path_index = path_idx;
arr->size = size;
path_struct->array_depth_count += 1;
@@ -142,6 +182,28 @@ static bool array_depth_list_pop(void)
{
return false;
}
// TODO: Move elsewhere
uint8_t ahash[KECCAK256_HASH_BYTESIZE];
cx_sha3_t *hash_ctx = mem_alloc(0) - sizeof(cx_sha3_t);
// finalize hash
cx_hash((cx_hash_t*)hash_ctx,
CX_LAST,
NULL,
0,
&ahash[0],
KECCAK256_HASH_BYTESIZE);
mem_dealloc(sizeof(cx_sha3_t)); // remove hash context
hash_ctx = mem_alloc(0) - sizeof(cx_sha3_t); // previous one
// continue progressive hash with the array hash
cx_hash((cx_hash_t*)hash_ctx,
0,
&ahash[0],
KECCAK256_HASH_BYTESIZE,
NULL,
0);
printf("AHASH POP\n");
path_struct->array_depth_count -= 1;
return true;
}
@@ -166,7 +228,6 @@ static bool path_update(void)
}
while (struct_field_type(field_ptr) == TYPE_CUSTOM)
{
// TODO: calculate the type hash here
typename = get_struct_field_typename(field_ptr, &typename_len);
if ((struct_ptr = get_structn(structs_array, typename, typename_len)) == NULL)
{
@@ -176,6 +237,33 @@ static bool path_update(void)
{
return false;
}
// TODO: Move elsewhere
cx_sha3_t *hash_ctx;
const uint8_t *thash_ptr;
// allocate new hash context
if ((hash_ctx = mem_alloc(sizeof(cx_sha3_t))) == NULL)
{
return false;
}
cx_keccak_init((cx_hash_t*)hash_ctx, 256); // initialize it
// get the struct typehash
if ((thash_ptr = type_hash(structs_array, typename, typename_len, true)) == NULL)
{
return false;
}
// start the progressive hash on it
cx_hash((cx_hash_t*)hash_ctx,
0,
thash_ptr,
KECCAK256_HASH_BYTESIZE,
NULL,
0);
// deallocate it
mem_dealloc(KECCAK256_HASH_BYTESIZE);
printf("SHASH PUSH w/o deps %p\n", hash_ctx);
path_depth_list_push();
}
return true;
@@ -202,6 +290,30 @@ bool path_set_root(const char *const struct_name, uint8_t name_length)
return false;
}
// TODO: Move elsewhere
cx_sha3_t *hash_ctx;
const uint8_t *thash_ptr;
if ((hash_ctx = mem_alloc(sizeof(cx_sha3_t))) == NULL)
{
return false;
}
cx_keccak_init((cx_hash_t*)hash_ctx, 256); // init hash
if ((thash_ptr = type_hash(structs_array, struct_name, name_length, true)) == NULL)
{
return false;
}
// start the progressive hash on it
cx_hash((cx_hash_t*)hash_ctx,
0,
thash_ptr,
KECCAK256_HASH_BYTESIZE,
NULL,
0);
// deallocate it
mem_dealloc(KECCAK256_HASH_BYTESIZE);
printf("SHASH PUSH w/ deps %p\n", hash_ctx);
//
// init depth, at 0 : empty path
path_struct->depth_count = 0;
path_depth_list_push();
@@ -262,7 +374,8 @@ static bool check_and_add_array_depth(const void *depth,
*/
bool path_new_array_depth(uint8_t size)
{
const void *field_ptr, *depth;
const void *field_ptr = NULL;
const void *depth = NULL;
uint8_t depth_count;
uint8_t total_count = 0;
uint8_t pidx;
@@ -302,6 +415,27 @@ bool path_new_array_depth(uint8_t size)
printf("Did not find a matching array type.\n");
return false;
}
// TODO: Move elsewhere
cx_sha3_t *hash_ctx;
if ((hash_ctx = mem_alloc(sizeof(cx_sha3_t))) == NULL)
{
return false;
}
printf("AHASH PUSH %p", hash_ctx);
if (struct_field_type(field_ptr) == TYPE_CUSTOM)
{
cx_sha3_t *old_ctx = (void*)hash_ctx - sizeof(cx_sha3_t);
memcpy(hash_ctx, old_ctx, sizeof(cx_sha3_t));
cx_keccak_init((cx_hash_t*)old_ctx, 256); // init hash
printf(" (switched)");
}
else // solidity type
{
cx_keccak_init((cx_hash_t*)hash_ctx, 256); // init hash
}
printf("\n");
return true;
}