Merge pull request #318 from LedgerHQ/develop

App release 1.9.19
This commit is contained in:
apaillier-ledger
2022-06-15 17:37:18 +02:00
committed by GitHub
84 changed files with 450 additions and 210 deletions

View File

@@ -21,10 +21,14 @@ inputs:
description: 'The directory in which the action will be performed'
required: true
default: '.'
branch:
description: 'Checkout (or create) on a specific branch before commit/push'
required: true
default: 'master'
src_branch:
description: 'Checkout (or create) a specific branch before commit/push. Defaults to current branch'
required: false
default: ''
dst_branch:
description: 'Push the created commit on a specific branch. Defaults to current branch'
required: false
default: ''
secret:
description: 'A token allowing to push the commit on the repository'
required: true
@@ -43,38 +47,73 @@ runs:
git config --global user.name ${{ inputs.name }}
ORIGIN="$(pwd)"
cd ${{ inputs.directory }}
git switch ${{ inputs.branch }} 2>/dev/null || git switch -c ${{ inputs.branch }}
CURRENT_BRANCH=${GITHUB_REF#refs/heads/};
# calculating source branch
if [ -n "${{ inputs.src_branch }}" ]; \
then \
git switch ${{ inputs.src_branch }} 2>/dev/null || git switch -c ${{ inputs.src_branch }}; \
SRC_BRANCH=${{ inputs.src_branch }}; \
else \
SRC_BRANCH=`git branch --show-current`; \
if [ -z "$SRC_BRANCH" ]; \
then \
SRC_BRANCH=$CURRENT_BRANCH; \
fi \
fi
# calculating destination branch
if [ -n "${{ inputs.dst_branch }}" ]; \
then \
DST_BRANCH=${{ inputs.dst_branch }}; \
else \
DST_BRANCH=`git branch --show-current`; \
if [ -z "$DST_BRANCH" ]; \
then \
DST_BRANCH=$CURRENT_BRANCH; \
fi \
fi
echo "-----------------------------------------------------------"
echo "Initial repo status"
git status
# checking changes, commit if needed
CHANGES="$(git status --porcelain ${{ inputs.files }})"
if [ -z "${CHANGES}" ]; \
if [ -n "${CHANGES}" ]; \
then \
echo -e "Changes:\n${CHANGES}"; \
git add ${{ inputs.files }}; \
echo "-----------------------------------------------------------"; \
echo "No changes, stopping now"; \
echo "COMMIT=NO" > $GITHUB_ENV; \
cd "${ORIGIN}"; \
exit 0; \
echo "Repo status before commit"; \
git status; \
git commit -am "${{ inputs.message }}"; \
fi
echo -e "Changes:\n${CHANGES}"
git add ${{ inputs.files }}
echo "-----------------------------------------------------------"
echo "Repo status before commit"
git status
git commit -am "${{ inputs.message }}"
echo "COMMIT=YES" > $GITHUB_ENV
# compute if a push is needed
if [ -n "${CHANGES}" -o "$SRC_BRANCH" != "$DST_BRANCH" ]; \
then \
PUSH="YES"; \
else \
PUSH="NO"; \
fi
git log -n 2
cd "${ORIGIN}"
shell: bash
- run: echo "${{ env.COMMIT }}"
echo " -- Env SRC_BRANCH: $SRC_BRANCH";
echo " -- Env DST_BRANCH: $DST_BRANCH";
echo " -- Env PUSH: $PUSH"
# exporting these variables for next steps
echo "##[set-output name=src_branch;]$(echo $SRC_BRANCH)";
echo "##[set-output name=dst_branch;]$(echo $DST_BRANCH)";
echo "##[set-output name=push;]$(echo $PUSH)";
shell: bash
- name: Push commit
if: ${{ env.COMMIT == 'YES' }}
if: steps.commit.outputs.push == 'YES'
uses: ad-m/github-push-action@master
with:
github_token: ${{ inputs.secret }}
branch: ${{ inputs.branch }}
branch: ${{ steps.commit.outputs.src_branch }}:${{ steps.commit.outputs.dst_branch }}
directory: ${{ inputs.directory }}
repository: ${{ inputs.repository }}

View File

@@ -37,7 +37,7 @@ jobs:
with:
name: 'ldg-github-ci'
directory: ethereum-plugin-sdk
branch: ${{ steps.extract_branch.outputs.branch }}
dst_branch: ${{ steps.extract_branch.outputs.branch }}
message: "[update] Branch ${{ steps.extract_branch.outputs.branch }} | Commit ${GITHUB_SHA}"
secret: ${{ secrets.CI_BOT_TOKEN }}
repository: LedgerHQ/ethereum-plugin-sdk
@@ -47,7 +47,6 @@ jobs:
with:
name: 'ldg-github-ci'
files: ethereum-plugin-sdk
branch: ${{ steps.extract_branch.outputs.branch }}
message: "[update][SDK] Branch ${{ steps.extract_branch.outputs.branch }} | Commit ${GITHUB_SHA}"
secret: ${{ secrets.CI_BOT_TOKEN }}
repository: LedgerHQ/app-ethereum

View File

@@ -5,17 +5,34 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15
### Added
- (clone) OKXChain
- (clone) Cube
- (clone) Astar EVM
- (clone) Shiden EVM
### Changed
- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS) the actual data contained in the message (clear-signing)
### Fixed
- Bug with huge swap amounts
## [1.9.18](https://github.com/ledgerhq/app-ethereum/compare/1.9.17...1.9.18) - 2022-04-25
### Added
- Easier way of adding a chain into the Makefile
- EIP 1024 support
- Conflux chain
- Moonbeam chain
- KardiaChain
- BitTorrent Chain
- Wethio chain
- (clone) Conflux chain
- (clone) Moonbeam chain
- (clone) KardiaChain
- (clone) BitTorrent Chain
- (clone) Wethio chain
### Changed

View File

@@ -34,7 +34,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'"
APPVERSION_M=1
APPVERSION_N=9
APPVERSION_P=18
APPVERSION_P=19
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
@@ -79,7 +79,7 @@ all: default
############
DEFINES += OS_IO_SEPROXYHAL
DEFINES += HAVE_BAGL HAVE_SPRINTF
DEFINES += HAVE_BAGL HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U
DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU
DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P)

BIN
icons/nanos_app_astar.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

BIN
icons/nanos_app_cube.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 B

BIN
icons/nanos_app_okc.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 B

BIN
icons/nanos_app_shiden.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

BIN
icons/nanox_app_astar.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 B

BIN
icons/nanox_app_cube.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

BIN
icons/nanox_app_okc.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 B

BIN
icons/nanox_app_shiden.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 B

View File

@@ -0,0 +1,3 @@
APP_LOAD_PARAMS += --path "44'/810'" --path "44'/60'"
DEFINES += CHAINID_UPCASE=\"ASTAR\" CHAINID_COINNAME=\"ASTR\" CHAIN_KIND=CHAIN_KIND_ASTAR CHAIN_ID=592
APPNAME = "Astar EVM"

View File

@@ -0,0 +1,3 @@
APP_LOAD_PARAMS += --path "44'/60'"
DEFINES += CHAINID_UPCASE=\"CUBE\" CHAINID_COINNAME=\"CUBE\" CHAIN_KIND=CHAIN_KIND_CUBE CHAIN_ID=1818
APPNAME = "Cube"

View File

@@ -0,0 +1,3 @@
APP_LOAD_PARAMS += --path "44'/60'"
DEFINES += CHAINID_UPCASE=\"OKC\" CHAINID_COINNAME=\"OKT\" CHAIN_KIND=CHAIN_KIND_OKC CHAIN_ID=66
APPNAME = "OKXChain"

View File

@@ -0,0 +1,3 @@
APP_LOAD_PARAMS += --path "44'/809'" --path "44'/60'"
DEFINES += CHAINID_UPCASE=\"SHIDEN\" CHAINID_COINNAME=\"SDN\" CHAIN_KIND=CHAIN_KIND_SHIDEN CHAIN_ID=336
APPNAME = "Shiden EVM"

View File

@@ -63,7 +63,11 @@ typedef enum chain_kind_e {
CHAIN_KIND_MOONBEAM,
CHAIN_KIND_BTTC,
CHAIN_KIND_KARDIACHAIN,
CHAIN_KIND_WETHIO
CHAIN_KIND_WETHIO,
CHAIN_KIND_OKC,
CHAIN_KIND_CUBE,
CHAIN_KIND_SHIDEN,
CHAIN_KIND_ASTAR
} chain_kind_t;
typedef struct chain_config_s {

View File

@@ -16,7 +16,7 @@ int handle_check_address(check_address_parameters_t* params, chain_config_t* cha
}
uint8_t i;
uint8_t* bip32_path_ptr = params->address_parameters;
const uint8_t* bip32_path_ptr = params->address_parameters;
uint8_t bip32PathLength = *(bip32_path_ptr++);
cx_sha3_t local_sha3;

View File

@@ -284,6 +284,18 @@ extraInfo_t *getKnownToken(uint8_t *contractAddress) {
case CHAIN_KIND_WETHIO:
numTokens = NUM_TOKENS_WETHIO;
break;
case CHAIN_KIND_OKC:
numTokens = NUM_TOKENS_OKC;
break;
case CHAIN_KIND_CUBE:
numTokens = NUM_TOKENS_CUBE;
break;
case CHAIN_KIND_SHIDEN:
numTokens = NUM_TOKENS_SHIDEN;
break;
case CHAIN_KIND_ASTAR:
numTokens = NUM_TOKENS_ASTAR;
break;
}
for (i = 0; i < numTokens; i++) {
switch (chainConfig->kind) {
@@ -410,6 +422,18 @@ extraInfo_t *getKnownToken(uint8_t *contractAddress) {
case CHAIN_KIND_WETHIO:
currentToken = (tokenDefinition_t *) PIC(&TOKENS_WETHIO[i]);
break;
case CHAIN_KIND_OKC:
currentToken = (tokenDefinition_t *) PIC(&TOKENS_OKC[i]);
break;
case CHAIN_KIND_CUBE:
currentToken = (tokenDefinition_t *) PIC(&TOKENS_CUBE[i]);
break;
case CHAIN_KIND_SHIDEN:
currentToken = (tokenDefinition_t *) PIC(&TOKENS_SHIDEN[i]);
break;
case CHAIN_KIND_ASTAR:
currentToken = (tokenDefinition_t *) PIC(&TOKENS_ASTAR[i]);
break;
}
if (memcmp(currentToken->address, tmpContent.txContent.destination, ADDRESS_LENGTH) == 0) {
return currentToken;

View File

@@ -170,7 +170,11 @@ typedef struct txStringProperties_t {
char network_name[NETWORK_STRING_MAX_SIZE];
} txStringProperties_t;
#ifdef TARGET_NANOS
#define SHARED_CTX_FIELD_1_SIZE 100
#else
#define SHARED_CTX_FIELD_1_SIZE 256
#endif
#define SHARED_CTX_FIELD_2_SIZE 40
typedef struct strDataTmp_t {

View File

@@ -11,17 +11,19 @@
#define GET_PRINTABLE_AMOUNT 4
#define MAX_PRINTABLE_AMOUNT_SIZE 50
// structure that should be send to specific coin application to get address
typedef struct check_address_parameters_s {
// IN
unsigned char* coin_configuration;
unsigned char coin_configuration_length;
const unsigned char* const coin_configuration;
const unsigned char coin_configuration_length;
// serialized path, segwit, version prefix, hash used, dictionary etc.
// fields and serialization format depends on spesific coin app
unsigned char* address_parameters;
unsigned char address_parameters_length;
char* address_to_check;
char* extra_id_to_check;
const unsigned char* const address_parameters;
const unsigned char address_parameters_length;
const char* const address_to_check;
const char* const extra_id_to_check;
// OUT
int result;
} check_address_parameters_t;
@@ -29,25 +31,25 @@ typedef struct check_address_parameters_s {
// structure that should be send to specific coin application to get printable amount
typedef struct get_printable_amount_parameters_s {
// IN
unsigned char* coin_configuration;
unsigned char coin_configuration_length;
unsigned char* amount;
unsigned char amount_length;
bool is_fee;
const unsigned char* const coin_configuration;
const unsigned char coin_configuration_length;
const unsigned char* const amount;
const unsigned char amount_length;
const bool is_fee;
// OUT
char printable_amount[30];
char printable_amount[MAX_PRINTABLE_AMOUNT_SIZE];
// int result;
} get_printable_amount_parameters_t;
typedef struct create_transaction_parameters_s {
unsigned char* coin_configuration;
unsigned char coin_configuration_length;
unsigned char* amount;
unsigned char amount_length;
unsigned char* fee_amount;
unsigned char fee_amount_length;
char* destination_address;
char* destination_address_extra_id;
const unsigned char* const coin_configuration;
const unsigned char coin_configuration_length;
const unsigned char* const amount;
const unsigned char amount_length;
const unsigned char* const fee_amount;
const unsigned char fee_amount_length;
const char* const destination_address;
const char* const destination_address_extra_id;
} create_transaction_parameters_t;
#endif // _SWAP_LIB_CALLS_H_

View File

@@ -204,4 +204,12 @@ const tokenDefinition_t const TOKENS_KARDIACHAIN[NUM_TOKENS_KARDIACHAIN] = {};
const tokenDefinition_t const TOKENS_WETHIO[NUM_TOKENS_WETHIO] = {};
const tokenDefinition_t const TOKENS_OKC[NUM_TOKENS_OKC] = {};
const tokenDefinition_t const TOKENS_CUBE[NUM_TOKENS_CUBE] = {};
const tokenDefinition_t const TOKENS_ASTAR[NUM_TOKENS_ASTAR] = {};
const tokenDefinition_t const TOKENS_SHIDEN[NUM_TOKENS_SHIDEN] = {};
#endif

View File

@@ -106,6 +106,10 @@ static const uint8_t LEDGER_SIGNATURE_PUBLIC_KEY[] = {
#define NUM_TOKENS_BTTC 0
#define NUM_TOKENS_KARDIACHAIN 0
#define NUM_TOKENS_WETHIO 0
#define NUM_TOKENS_OKC 0
#define NUM_TOKENS_CUBE 0
#define NUM_TOKENS_ASTAR 0
#define NUM_TOKENS_SHIDEN 0
extern tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA];
extern tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM];
@@ -148,6 +152,9 @@ extern tokenDefinition_t const TOKENS_MOONBEAM[NUM_TOKENS_MOONBEAM];
extern tokenDefinition_t const TOKENS_BTTC[NUM_TOKENS_BTTC];
extern tokenDefinition_t const TOKENS_KARDIACHAIN[NUM_TOKENS_KARDIACHAIN];
extern tokenDefinition_t const TOKENS_WETHIO[NUM_TOKENS_WETHIO];
extern tokenDefinition_t const TOKENS_CUBE[NUM_TOKENS_CUBE];
extern tokenDefinition_t const TOKENS_ASTAR[NUM_TOKENS_ASTAR];
extern tokenDefinition_t const TOKENS_SHIDEN[NUM_TOKENS_SHIDEN];
#endif /* HAVE_TOKENS_LIST */

View File

@@ -138,7 +138,7 @@ void amountToString(const uint8_t *amount,
out_buffer[out_buffer_size - 1] = '\0';
}
bool parse_swap_config(uint8_t *config, uint8_t config_len, char *ticker, uint8_t *decimals) {
bool parse_swap_config(const uint8_t *config, uint8_t config_len, char *ticker, uint8_t *decimals) {
uint8_t ticker_len, offset = 0;
if (config_len == 0) {
return false;

View File

@@ -39,6 +39,6 @@ void amountToString(const uint8_t* amount,
char* out_buffer,
size_t out_buffer_size);
bool parse_swap_config(uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals);
bool parse_swap_config(const uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals);
#endif // _UTILS_H_

View File

@@ -24,7 +24,10 @@ const network_info_t NETWORK_MAPPING[] = {
{.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX "},
{.chain_id = 44787, .name = "Celo Alfajores", .ticker = "aCELO "},
{.chain_id = 62320, .name = "Celo Baklava", .ticker = "bCELO "},
{.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM "}};
{.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM "},
{.chain_id = 1818, .name = "Cube", .ticker = "CUBE "},
{.chain_id = 336, .name = "Shiden", .ticker = "SDN "},
{.chain_id = 592, .name = "Astar", .ticker = "ASTR "}};
uint64_t get_chain_id(void) {
uint64_t chain_id = 0;

View File

@@ -1,5 +1,6 @@
#include "shared_context.h"
#include "apdu_constants.h"
#include "ethUtils.h"
#include "ui_flow.h"
#include "feature_performPrivacyOperation.h"

View File

@@ -1,6 +1,7 @@
#include "shared_context.h"
#include "feature_getPublicKey.h"
#include "ui_callbacks.h"
#include "feature_performPrivacyOperation.h"
unsigned int io_seproxyhal_touch_privacy_ok(__attribute__((unused)) const bagl_element_t *e) {
uint32_t tx = set_result_perform_privacy_operation();

View File

@@ -1,3 +1,4 @@
#include <stdbool.h>
#include "shared_context.h"
#include "apdu_constants.h"
#include "utils.h"
@@ -7,6 +8,109 @@ static const char SIGN_MAGIC[] =
"\x19"
"Ethereum Signed Message:\n";
/**
* Check if a given character is a "special" displayable ASCII character
*
* @param[in] c character we're checking
* @return wether the character is special or not
*/
static inline bool is_char_special(char c) {
return ((c >= '\b') && (c <= '\r'));
}
/**
* Check if a given data is made of ASCII characters
*
* @param[in] data the input data
* @param[in] the length of the input data
* @return wether the data is fully ASCII or not
*/
static bool is_data_ascii(const uint8_t *const data, size_t length) {
for (uint8_t idx = 0; idx < length; ++idx) {
if (!is_char_special(data[idx]) && ((data[idx] < 0x20) || (data[idx] > 0x7e))) {
return false;
}
}
return true;
}
/**
* Initialize value string that will be displayed in the UX STEP
*
* @param[in] if the value is ASCII
*/
static void init_value_str(bool is_ascii) {
if (is_ascii) {
strings.tmp.tmp[0] = '\0'; // init string as empty
} else {
strcpy(strings.tmp.tmp, "0x"); // will display the hex bytes instead
}
}
/**
* @return Whether the currently stored data is initialized as ASCII or not
*/
static bool is_value_str_ascii() {
return (memcmp(strings.tmp.tmp, "0x", 2) != 0);
}
/**
* Update the global UI string variable by formatting & appending the new data to it
*
* @param[in] data the input data
* @param[in] length the data length
* @param[in] is_ascii wether the data is ASCII or not
*/
static void feed_value_str(const uint8_t *const data, size_t length, bool is_ascii) {
uint16_t value_strlen = strlen(strings.tmp.tmp);
if ((value_strlen + 1) < sizeof(strings.tmp.tmp)) {
if (is_ascii) {
uint8_t src_idx = 0;
uint16_t dst_idx = value_strlen;
bool prev_is_special = false;
while ((src_idx < length) && (dst_idx < sizeof(strings.tmp.tmp))) {
if (prev_is_special) {
if (!is_char_special(data[src_idx])) {
prev_is_special = false;
}
} else {
if (is_char_special(data[src_idx])) {
prev_is_special = true;
strings.tmp.tmp[dst_idx] = ' ';
dst_idx += 1;
}
}
if (!is_char_special(data[src_idx])) {
strings.tmp.tmp[dst_idx] = data[src_idx];
dst_idx += 1;
}
src_idx += 1;
}
if (dst_idx < sizeof(strings.tmp.tmp)) {
strings.tmp.tmp[dst_idx] = '\0';
} else {
const char marker[] = "...";
memcpy(strings.tmp.tmp + sizeof(strings.tmp.tmp) - sizeof(marker),
marker,
sizeof(marker));
}
} else {
// truncate to strings.tmp.tmp 's size
length = MIN(length, (sizeof(strings.tmp.tmp) - value_strlen) / 2);
for (size_t i = 0; i < length; i++) {
snprintf(strings.tmp.tmp + value_strlen + 2 * i,
sizeof(strings.tmp.tmp) - value_strlen - 2 * i,
"%02X",
data[i]);
}
}
}
}
void handleSignPersonalMessage(uint8_t p1,
uint8_t p2,
uint8_t *workBuffer,
@@ -16,10 +120,7 @@ void handleSignPersonalMessage(uint8_t p1,
UNUSED(tx);
uint8_t hashMessage[INT256_LENGTH];
if (p1 == P1_FIRST) {
char tmp[11];
uint32_t index;
uint32_t base = 10;
uint8_t pos = 0;
char tmp[11] = {0};
uint32_t i;
if (dataLength < 1) {
PRINTF("Invalid data\n");
@@ -29,6 +130,7 @@ void handleSignPersonalMessage(uint8_t p1,
reset_app_context();
}
appState = APP_STATE_SIGNING_MESSAGE;
tmpCtx.messageSigningContext.pathLength = workBuffer[0];
if ((tmpCtx.messageSigningContext.pathLength < 0x01) ||
(tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) {
@@ -38,21 +140,21 @@ void handleSignPersonalMessage(uint8_t p1,
workBuffer++;
dataLength--;
for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) {
if (dataLength < 4) {
if (dataLength < sizeof(uint32_t)) {
PRINTF("Invalid data\n");
THROW(0x6a80);
}
tmpCtx.messageSigningContext.bip32Path[i] = U4BE(workBuffer, 0);
workBuffer += 4;
dataLength -= 4;
workBuffer += sizeof(uint32_t);
dataLength -= sizeof(uint32_t);
}
if (dataLength < 4) {
if (dataLength < sizeof(uint32_t)) {
PRINTF("Invalid data\n");
THROW(0x6a80);
}
tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0);
workBuffer += 4;
dataLength -= 4;
workBuffer += sizeof(uint32_t);
dataLength -= sizeof(uint32_t);
// Initialize message header + length
cx_keccak_init(&global_sha3, 256);
cx_hash((cx_hash_t *) &global_sha3,
@@ -61,16 +163,12 @@ void handleSignPersonalMessage(uint8_t p1,
sizeof(SIGN_MAGIC) - 1,
NULL,
0);
for (index = 1; (((index * base) <= tmpCtx.messageSigningContext.remainingLength) &&
(((index * base) / base) == index));
index *= base)
;
for (; index; index /= base) {
tmp[pos++] = '0' + ((tmpCtx.messageSigningContext.remainingLength / index) % base);
}
tmp[pos] = '\0';
cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, pos, NULL, 0);
snprintf(tmp, sizeof(tmp), "%u", tmpCtx.messageSigningContext.remainingLength);
cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, strlen(tmp), NULL, 0);
cx_sha256_init(&tmpContent.sha2);
init_value_str(is_data_ascii(workBuffer, dataLength));
} else if (p1 != P1_MORE) {
THROW(0x6B00);
}
@@ -84,9 +182,13 @@ void handleSignPersonalMessage(uint8_t p1,
if (dataLength > tmpCtx.messageSigningContext.remainingLength) {
THROW(0x6A80);
}
cx_hash((cx_hash_t *) &global_sha3, 0, workBuffer, dataLength, NULL, 0);
cx_hash((cx_hash_t *) &tmpContent.sha2, 0, workBuffer, dataLength, NULL, 0);
tmpCtx.messageSigningContext.remainingLength -= dataLength;
feed_value_str(workBuffer, dataLength, is_value_str_ascii());
if (tmpCtx.messageSigningContext.remainingLength == 0) {
cx_hash((cx_hash_t *) &global_sha3,
CX_LAST,
@@ -95,11 +197,6 @@ void handleSignPersonalMessage(uint8_t p1,
tmpCtx.messageSigningContext.hash,
32);
cx_hash((cx_hash_t *) &tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32);
snprintf(strings.tmp.tmp,
sizeof(strings.tmp.tmp),
"%.*H",
sizeof(hashMessage),
hashMessage);
#ifdef NO_CONSENT
io_seproxyhal_touch_signMessage_ok(NULL);

View File

@@ -14,7 +14,7 @@ UX_STEP_NOCB(
ux_sign_flow_2_step,
bnnn_paging,
{
.title = "Message hash",
.title = "Message",
.text = strings.tmp.tmp,
});
UX_STEP_CB(

View File

@@ -1,22 +0,0 @@
export default jest;
export const { expect, test } = global;
export const sim_options_s = {
model: "nanos",
logging: true,
start_delay: 2000,
X11: true,
custom: "",
};
export const sim_options_x = {
model: "nanox",
logging: true,
start_delay: 2000,
X11: true,
custom: "",
};
export const Resolve = require("path").resolve;
export const NANOS_ELF_PATH = Resolve("elfs/ethereum_nanos.elf");
export const NANOX_ELF_PATH = Resolve("elfs/ethereum_nanox.elf");

View File

@@ -15,7 +15,7 @@
"@ledgerhq/hw-app-eth": "^6.5.0",
"@ledgerhq/hw-transport-http": "^4.74.2",
"@ledgerhq/logs": "^5.50.0",
"@zondax/zemu": "^0.22.1",
"@zondax/zemu": "^0.27.4",
"bignumber.js": "^9.0.0",
"bip32-path": "^0.4.2",
"core-js": "^3.7.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

View File

@@ -1,6 +1,5 @@
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import { expect } from "../jest";
import { TransportStatusError } from "@ledgerhq/errors";
import { waitForAppScreen, zemu, nano_models } from './test.fixture';
import Zemu from '@zondax/zemu';

65
tests/src/eip191.test.js Normal file
View File

@@ -0,0 +1,65 @@
import "core-js/stable";
import "regenerator-runtime/runtime";
import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture';
const testgroup = "EIP-191";
nano_models.forEach(function(model) {
test("[Nano " + model.letter + "] "+ testgroup +" Metamask test", zemu(model, async (sim, eth) => {
const tx = eth.signPersonalMessage(
"44'/60'/0'/0/0",
Buffer.from("Example `personal_sign` message").toString("hex")
);
await waitForAppScreen(sim);
const rclicks = (model.letter == 'S') ? 4 : 3;
await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_metamask', [rclicks, -1, 0]);
await expect(tx).resolves.toEqual({
"v": 28,
"r": "916099cf0d9c21911c85f0770a47a9696a8189e78c259cf099749748c507baae",
"s": "0d72234bc0ac2e94c5f7a5f4f9cd8610a52be4ea55515a85b9703f1bb158415c"
});
}));
test("[Nano " + model.letter + "] "+ testgroup +" non-ASCII test", zemu(model, async (sim, eth) => {
const tx = eth.signPersonalMessage(
"44'/60'/0'/0/0",
"9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658"
);
await waitForAppScreen(sim);
const rclicks = (model.letter == 'S') ? 6 : 4;
await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_nonascii', [rclicks, -1, 0]);
await expect(tx).resolves.toEqual({
"v": 28,
"r": "64bdbdb6959425445d00ff2536a7018d2dce904e1f7475938fe4221c3c72500c",
"s": "7c9208e99b6b9266a73aae17b73472d06499746edec34fd47a9dab42f06f2e42"
});
}));
test("[Nano " + model.letter + "] "+ testgroup +" OpenSea test", zemu(model, async (sim, eth) => {
const tx = eth.signPersonalMessage(
"44'/60'/0'/0/0",
Buffer.from("Welcome to OpenSea!\n\nClick to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\nThis request will not trigger a blockchain transaction or cost any gas fees.\n\nYour authentication status will reset after 24 hours.\n\nWallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121").toString("hex")
);
await waitForAppScreen(sim);
await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [7, -1, 0]);
await expect(tx).resolves.toEqual({
"v": 28,
"r": "61a68c986f087730d2f6ecf89d6d1e48ab963ac461102bb02664bc05c3db75bb",
"s": "5714729ef441e097673a7b29a681e97f6963d875eeed2081f26b0b6686cd2bd2"
});
}));
});

View File

@@ -1637,11 +1637,12 @@
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@grpc/grpc-js@^1.3.4":
version "1.3.7"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.7.tgz#58b687aff93b743aafde237fd2ee9a3259d7f2d8"
integrity sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==
"@grpc/grpc-js@^1.5.5":
version "1.6.7"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz#4c4fa998ff719fe859ac19fe977fdef097bb99aa"
integrity sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==
dependencies:
"@grpc/proto-loader" "^0.6.4"
"@types/node" ">=12.12.47"
"@grpc/proto-loader@^0.6.4":
@@ -1655,6 +1656,17 @@
protobufjs "^6.10.0"
yargs "^16.1.1"
"@grpc/proto-loader@^0.6.9":
version "0.6.12"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz#459b619b8b9b67794bf0d1cb819653a38c63e164"
integrity sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==
dependencies:
"@types/long" "^4.0.1"
lodash.camelcase "^4.3.0"
long "^4.0.0"
protobufjs "^6.10.0"
yargs "^16.2.0"
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@@ -1945,6 +1957,16 @@
"@ledgerhq/logs" "^4.72.0"
rxjs "^6.5.3"
"@ledgerhq/devices@^6.27.1":
version "6.27.1"
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.27.1.tgz#3b13ab1d1ba8201e9e74a08f390560483978c962"
integrity sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ==
dependencies:
"@ledgerhq/errors" "^6.10.0"
"@ledgerhq/logs" "^6.10.0"
rxjs "6"
semver "^7.3.5"
"@ledgerhq/devices@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.3.0.tgz#7ee59614198882311d1805912e368451527d05b2"
@@ -1960,6 +1982,11 @@
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.78.0.tgz#23daf3af54d03b1bda3e616002b555da1bdb705a"
integrity sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg==
"@ledgerhq/errors@^6.10.0":
version "6.10.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4"
integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg==
"@ledgerhq/errors@^6.2.0":
version "6.2.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.2.0.tgz#7dc2b3bf6bdedccdaa1b97dccacfa912c4fc22f8"
@@ -1989,16 +2016,16 @@
axios "^0.19.0"
ws "6"
"@ledgerhq/hw-transport-http@^6.1.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-6.3.0.tgz#e409ba846b3fda9366f1ad68f545b799336ab08b"
integrity sha512-KIYRlobKsjxBa7wNIDB+8Vo+OcKRmUy/nImyFZLTnKE0nLNgwRaK+P7D/Qw3VXBMpwHkdCtsTeBho+0fapkHxA==
"@ledgerhq/hw-transport-http@^6.24.1":
version "6.27.1"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-6.27.1.tgz#25c6cf02c4b464fae416d163f9ab4fda7b6198ff"
integrity sha512-494Zk5jvHcasa5xjZW7l5g+QqJqLlZpuV/RvlIWnKHdVdrBWYvG/1VukQfJQPgbK3WHtt/9WhrnJoLI+xv2PrA==
dependencies:
"@ledgerhq/errors" "^6.2.0"
"@ledgerhq/hw-transport" "^6.3.0"
"@ledgerhq/logs" "^6.2.0"
axios "^0.21.1"
ws "7"
"@ledgerhq/errors" "^6.10.0"
"@ledgerhq/hw-transport" "^6.27.1"
"@ledgerhq/logs" "^6.10.0"
axios "^0.26.1"
ws "8.5.0"
"@ledgerhq/hw-transport@^4.78.0":
version "4.78.0"
@@ -2009,7 +2036,16 @@
"@ledgerhq/errors" "^4.78.0"
events "^3.0.0"
"@ledgerhq/hw-transport@^6.1.0", "@ledgerhq/hw-transport@^6.3.0":
"@ledgerhq/hw-transport@^6.24.1", "@ledgerhq/hw-transport@^6.27.1":
version "6.27.1"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.1.tgz#88072278f69c279cb6569352acd4ae2fec33ace3"
integrity sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ==
dependencies:
"@ledgerhq/devices" "^6.27.1"
"@ledgerhq/errors" "^6.10.0"
events "^3.3.0"
"@ledgerhq/hw-transport@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz#4fc966b1a68c991c0a6b5384841f99c4f8304ce9"
integrity sha512-kdnVrgmxrFtKaRdkoaQBEa02RXgLzEBiooYbxA65BGSJig3PGWDS9LrqNpzLTZM1RQlivd9NLBmfwU2ze4chWA==
@@ -2028,6 +2064,11 @@
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186"
integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==
"@ledgerhq/logs@^6.10.0":
version "6.10.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1"
integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw==
"@ledgerhq/logs@^6.2.0":
version "6.2.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.2.0.tgz#9fb2d6f1811316697f7b3cc14607f6c608912419"
@@ -2238,22 +2279,21 @@
dependencies:
"@types/yargs-parser" "*"
"@zondax/zemu@^0.22.1":
version "0.22.1"
resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.22.1.tgz#378ea193ccc4836ee5407b01028e9030f70a696e"
integrity sha512-WxX65myug9tyQuoXENO4XujDpTY+guQpc+mzN8rggmIwNqleNDe/HmBc5aeTqNyORBCSJkYpUVv3O9q2xcqzrg==
"@zondax/zemu@^0.27.4":
version "0.27.4"
resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.27.4.tgz#4e306ba76f5c718d901c7948516668e944a6aa1e"
integrity sha512-bbYAW9JJUx+hVBdwkTonu+0q9WkeFQpcGMRUrzS/Gfc6rvhAQ+X9KrGhwGrnxmBuzajt0oXZ50QvoEJHBR9PDA==
dependencies:
"@grpc/grpc-js" "^1.3.4"
"@grpc/proto-loader" "^0.6.4"
"@ledgerhq/hw-transport" "^6.1.0"
"@ledgerhq/hw-transport-http" "^6.1.0"
axios "^0.22.0"
"@grpc/grpc-js" "^1.5.5"
"@grpc/proto-loader" "^0.6.9"
"@ledgerhq/hw-transport" "^6.24.1"
"@ledgerhq/hw-transport-http" "^6.24.1"
axios "^0.26.0"
axios-retry "^3.2.0"
dockerode "^3.3.0"
dockerode "^3.3.1"
elfy "^1.0.0"
fs-extra "^10.0.0"
get-port "^5.1.1"
json-rpc2 "^2.0.0"
path "^0.12.7"
pngjs "^6.0.0"
randomstring "^1.2.1"
@@ -2486,12 +2526,12 @@ axios@^0.21.1:
dependencies:
follow-redirects "^1.10.0"
axios@^0.22.0:
version "0.22.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25"
integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==
axios@^0.26.0, axios@^0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
dependencies:
follow-redirects "^1.14.4"
follow-redirects "^1.14.8"
babel-jest@^24.9.0:
version "24.9.0"
@@ -2658,11 +2698,6 @@ bech32@1.1.4:
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
better-curry@1.x.x:
version "1.6.0"
resolved "https://registry.yarnpkg.com/better-curry/-/better-curry-1.6.0.tgz#38f716b24c8cee07a262abc41c22c314e20e3869"
integrity sha1-OPcWskyM7geiYqvEHCLDFOIOOGk=
bignumber.js@^9.0.0, bignumber.js@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
@@ -3274,10 +3309,10 @@ docker-modem@^3.0.0:
split-ca "^1.0.1"
ssh2 "^0.8.7"
dockerode@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.0.tgz#bedaf48ef9fa9124275a54a9881a92374c51008e"
integrity sha512-St08lfOjpYCOXEM8XA0VLu3B3hRjtddODphNW5GFoA0AS3JHgoPQKOz0Qmdzg3P+hUPxhb02g1o1Cu1G+U3lRg==
dockerode@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.1.tgz#74f66e239e092e7910e2beae6322d35c44b08cdc"
integrity sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==
dependencies:
docker-modem "^3.0.0"
tar-fs "~2.0.1"
@@ -3416,13 +3451,6 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
es5class@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/es5class/-/es5class-2.3.1.tgz#42c5c18a9016bcb0db28a4d340ebb831f55d1b66"
integrity sha1-QsXBipAWvLDbKKTTQOu4MfVdG2Y=
dependencies:
better-curry "1.x.x"
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -3723,13 +3751,6 @@ fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
faye-websocket@^0.11.3:
version "0.11.4"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
dependencies:
websocket-driver ">=0.5.1"
fb-watchman@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
@@ -3800,10 +3821,10 @@ follow-redirects@^1.10.0:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
follow-redirects@^1.14.4:
version "1.14.7"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685"
integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==
follow-redirects@^1.14.8:
version "1.15.0"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4"
integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==
for-each@^0.3.3:
version "0.3.3"
@@ -4120,11 +4141,6 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
http-parser-js@>=0.5.1:
version "0.5.3"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9"
integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==
http-proxy-agent@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
@@ -5324,18 +5340,6 @@ json-parse-even-better-errors@^2.3.0:
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-rpc2@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/json-rpc2/-/json-rpc2-2.0.0.tgz#7935199f23cf3665fe6b19b03a85d4a3ea3d94b8"
integrity sha512-0jfrGSH0ZDxrpaaHUkigg/oA6MQqsZDpKSpUzeokhP2jyy6h+cH4G+MPoAa4SVdw9sTzc+YK2hzhUgdShMzKow==
dependencies:
debug "^4.1.1"
es5class "^2.3.1"
faye-websocket "^0.11.3"
jsonparse "^1.3.1"
lodash "^4.17.15"
object-assign "^4.1.1"
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -5367,11 +5371,6 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
jsonparse@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -5474,7 +5473,7 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0:
lodash@^4.17.19, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -5747,11 +5746,6 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
object-copy@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
@@ -6384,7 +6378,7 @@ rxjs@6, rxjs@^6.5.3:
dependencies:
tslib "^1.9.0"
safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -7234,20 +7228,6 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
websocket-driver@>=0.5.1:
version "0.7.4"
resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
dependencies:
http-parser-js ">=0.5.1"
safe-buffer ">=5.1.0"
websocket-extensions ">=0.1.1"
websocket-extensions@>=0.1.1:
version "0.1.4"
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
@@ -7380,16 +7360,16 @@ ws@6:
dependencies:
async-limiter "~1.0.0"
ws@7:
version "7.5.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
ws@7.4.6, ws@^7.4.5:
version "7.4.6"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
ws@8.5.0:
version "8.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
ws@^5.2.0:
version "5.2.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
@@ -7481,7 +7461,7 @@ yargs@^15.4.1:
y18n "^4.0.0"
yargs-parser "^18.1.2"
yargs@^16.1.1:
yargs@^16.1.1, yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==