59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
#include "handle_check_address.h"
|
|
#include "apdu_constants.h"
|
|
#include "os.h"
|
|
#include "shared_context.h"
|
|
#include "string.h"
|
|
#include "lib_standard_app/crypto_helpers.h"
|
|
|
|
#define ZERO(x) explicit_bzero(&x, sizeof(x))
|
|
|
|
void handle_check_address(check_address_parameters_t* params, chain_config_t* chain_config) {
|
|
params->result = 0;
|
|
PRINTF("Params on the address %d\n", (unsigned int) params);
|
|
PRINTF("Address to check %s\n", params->address_to_check);
|
|
PRINTF("Inside handle_check_address\n");
|
|
if (params->address_to_check == 0) {
|
|
PRINTF("Address to check == 0\n");
|
|
return;
|
|
}
|
|
|
|
const uint8_t* bip32_path_ptr = params->address_parameters;
|
|
uint8_t bip32PathLength = *(bip32_path_ptr++);
|
|
uint32_t bip32Path[MAX_BIP32_PATH];
|
|
char address[51];
|
|
uint8_t raw_pubkey[65];
|
|
|
|
if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH) ||
|
|
(bip32PathLength * 4 != params->address_parameters_length - 1)) {
|
|
PRINTF("Invalid path\n");
|
|
return;
|
|
}
|
|
for (uint8_t i = 0; i < bip32PathLength; i++) {
|
|
bip32Path[i] = U4BE(bip32_path_ptr, 0);
|
|
bip32_path_ptr += 4;
|
|
}
|
|
|
|
if (bip32_derive_get_pubkey_256(CX_CURVE_256K1,
|
|
bip32Path,
|
|
bip32PathLength,
|
|
raw_pubkey,
|
|
NULL,
|
|
CX_SHA512) != CX_OK) {
|
|
THROW(APDU_RESPONSE_UNKNOWN);
|
|
}
|
|
|
|
getEthAddressStringFromRawKey((const uint8_t*) raw_pubkey, address, chain_config->chainId);
|
|
|
|
uint8_t offset_0x = 0;
|
|
if (memcmp(params->address_to_check, "0x", 2) == 0) {
|
|
offset_0x = 2;
|
|
}
|
|
|
|
if (strcmp(address, params->address_to_check + offset_0x) != 0) {
|
|
PRINTF("Addresses don't match\n");
|
|
} else {
|
|
PRINTF("Addresses match\n");
|
|
params->result = 1;
|
|
}
|
|
}
|