Skip to content

Commit ca3b1d8

Browse files
authored
Merge pull request #25 from Zondax/leongb/txtypes
Add support for state transaction read signatures
2 parents a2113ed + 90d84fb commit ca3b1d8

File tree

25 files changed

+411
-145
lines changed

25 files changed

+411
-145
lines changed

app/src/crypto.c

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,53 @@ typedef struct {
122122
//78377b525757b494427f89014f97d79928f3938d14eb51e20fb5dec9834eb304
123123
//arg
124124
//b25f03dedd69be07f356a06fe35c1b0ddc0de77dcd9066c4be0c6bbde14b23ff
125+
//paths
126+
//504dbd7ea99e812ff1ef64c6a162e32890b928a3df1f9e3450aadb7037889be5
125127

126-
zxerr_t crypto_getDigest(uint8_t *digest){
128+
zxerr_t crypto_getDigestStateTransactionRead(uint8_t *digest){
129+
cx_sha256_t ctx;
130+
cx_sha256_init(&ctx);
131+
132+
uint8_t tmpdigest[CX_SHA256_SIZE];
133+
MEMZERO(tmpdigest,sizeof(tmpdigest));
134+
135+
cx_hash_sha256((uint8_t *)"sender", 6, tmpdigest, CX_SHA256_SIZE);
136+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
137+
138+
cx_hash_sha256((uint8_t *)parser_tx_obj.sender.data, parser_tx_obj.sender.len, tmpdigest, CX_SHA256_SIZE);
139+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
140+
141+
cx_hash_sha256((uint8_t *)"ingress_expiry", 14, tmpdigest, CX_SHA256_SIZE);
142+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
143+
144+
uint8_t ingressbuf[10];
145+
uint16_t enc_size = 0;
146+
CHECK_ZXERR(compressLEB128(parser_tx_obj.ingress_expiry, sizeof(ingressbuf), ingressbuf, &enc_size));
147+
148+
cx_hash_sha256((uint8_t *)ingressbuf, enc_size, tmpdigest, CX_SHA256_SIZE);
149+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
150+
151+
cx_hash_sha256((uint8_t *)"paths", 5, tmpdigest, CX_SHA256_SIZE);
152+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
153+
154+
uint8_t arrayBuffer[PATH_MAX_ARRAY * CX_SHA256_SIZE];
155+
for (uint8_t index = 0; index < parser_tx_obj.paths.arrayLen ; index++){
156+
cx_hash_sha256((uint8_t *)parser_tx_obj.paths.paths[index].data, parser_tx_obj.paths.paths[index].len, arrayBuffer + index * CX_SHA256_SIZE, CX_SHA256_SIZE);
157+
}
158+
cx_hash_sha256(arrayBuffer, parser_tx_obj.paths.arrayLen*CX_SHA256_SIZE, tmpdigest, CX_SHA256_SIZE);
159+
cx_hash_sha256(tmpdigest, CX_SHA256_SIZE, tmpdigest, CX_SHA256_SIZE);
160+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
161+
162+
cx_hash_sha256((uint8_t *)"request_type", 12, tmpdigest, CX_SHA256_SIZE);
163+
cx_hash(&ctx.header, 0, tmpdigest, CX_SHA256_SIZE, NULL, 0);
164+
165+
cx_hash_sha256((uint8_t *)parser_tx_obj.request_type.data, parser_tx_obj.request_type.len, tmpdigest, CX_SHA256_SIZE);
166+
cx_hash(&ctx.header, CX_LAST, tmpdigest, CX_SHA256_SIZE, digest, CX_SHA256_SIZE);
167+
CHECK_APP_CANARY()
168+
return zxerr_ok;
169+
}
170+
171+
zxerr_t crypto_getDigestTokenTransfer(uint8_t *digest){
127172
cx_sha256_t ctx;
128173
cx_sha256_init(&ctx);
129174

@@ -195,8 +240,20 @@ zxerr_t crypto_sign(uint8_t *signatureBuffer,
195240
signatureBuffer[0] = 0x0a;
196241
MEMCPY(&signatureBuffer[1], (uint8_t *)"ic-request",SIGN_PREFIX_SIZE - 1);
197242

198-
CHECK_ZXERR(crypto_getDigest(signatureBuffer + SIGN_PREFIX_SIZE));
199-
243+
switch(parser_tx_obj.txtype){
244+
case 0x00: {
245+
CHECK_ZXERR(crypto_getDigestTokenTransfer(signatureBuffer + SIGN_PREFIX_SIZE));
246+
break;
247+
}
248+
case 0x01 :{
249+
CHECK_ZXERR(crypto_getDigestStateTransactionRead(signatureBuffer + SIGN_PREFIX_SIZE));
250+
break;
251+
}
252+
default : {
253+
return zxerr_unknown;
254+
}
255+
}
256+
CHECK_APP_CANARY()
200257
cx_hash_sha256(signatureBuffer, SIGN_PREHASH_SIZE, message_digest, CX_SHA256_SIZE);
201258

202259
cx_ecfp_private_key_t cx_privateKey;

app/src/parser.c

Lines changed: 88 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,19 @@ void __assert_fail(const char * assertion, const char * file, unsigned int line,
3030
#endif
3131

3232
parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, size_t dataLen) {
33-
CHECK_PARSER_ERR(parser_init(ctx, data, dataLen))
34-
parser_error_t err = _read(ctx, &parser_tx_obj);
35-
return err;
33+
CHECK_PARSER_ERR(parser_init(ctx, data + 1, dataLen - 1))
34+
parser_tx_obj.txtype = data[0];
35+
switch (parser_tx_obj.txtype){
36+
case 0x00: {
37+
return _readTokenTransfer(ctx, &parser_tx_obj);
38+
}
39+
case 0x01: {
40+
return _readTransactionStateRead(ctx, &parser_tx_obj);
41+
}
42+
default: {
43+
return parser_unexepected_error;
44+
}
45+
}
3646
}
3747

3848
parser_error_t parser_validate(const parser_context_t *ctx) {
@@ -58,7 +68,62 @@ parser_error_t parser_getNumItems(const parser_context_t *ctx, uint8_t *num_item
5868
return parser_ok;
5969
}
6070

61-
parser_error_t parser_getItem(const parser_context_t *ctx,
71+
parser_error_t parser_getItemTransactionStateRead(const parser_context_t *ctx,
72+
uint8_t displayIdx,
73+
char *outKey, uint16_t outKeyLen,
74+
char *outVal, uint16_t outValLen,
75+
uint8_t pageIdx, uint8_t *pageCount) {
76+
MEMZERO(outKey, outKeyLen);
77+
MEMZERO(outVal, outValLen);
78+
snprintf(outKey, outKeyLen, "?");
79+
snprintf(outVal, outValLen, "?");
80+
*pageCount = 1;
81+
82+
uint8_t numItems = 0;
83+
CHECK_PARSER_ERR(parser_getNumItems(ctx, &numItems))
84+
CHECK_APP_CANARY()
85+
86+
unsigned char buffer[100];
87+
MEMZERO(buffer, sizeof(buffer));
88+
89+
if (displayIdx < 0 || displayIdx >= numItems) {
90+
return parser_no_data;
91+
}
92+
93+
if (displayIdx == 0) {
94+
snprintf(outKey, outKeyLen, "request_type");
95+
snprintf(outVal, outValLen, "%s", parser_tx_obj.request_type.data);
96+
return parser_ok;
97+
}
98+
if (displayIdx == 1) {
99+
snprintf(outKey, outKeyLen, "ingress_expiry");
100+
fpuint64_to_str(buffer, sizeof(buffer), parser_tx_obj.ingress_expiry, 0);
101+
pageString(outVal, outValLen, buffer, pageIdx, pageCount);
102+
return parser_ok;
103+
}
104+
105+
if (displayIdx == 2) {
106+
snprintf(outKey, outKeyLen, "sender");
107+
uint16_t outLen = 0;
108+
uint8_t tmpbuffer[100];
109+
crypto_addrToTextual((uint8_t *)parser_tx_obj.sender.data, parser_tx_obj.sender.len, tmpbuffer, &outLen);
110+
addr_to_textual(buffer, sizeof(buffer), tmpbuffer, outLen);
111+
pageString(outVal, outValLen, buffer, pageIdx, pageCount);
112+
return parser_ok;
113+
}
114+
115+
displayIdx -= 3;
116+
if (displayIdx < 0 || displayIdx >= parser_tx_obj.paths.arrayLen) {
117+
return parser_no_data;
118+
}
119+
snprintf(outKey, outKeyLen, "Path %d", displayIdx + 1);
120+
//pageString(outVal, outValLen, (char *)parser_tx_obj.paths.paths[displayIdx].data, pageIdx, pageCount);
121+
return parser_ok;
122+
123+
124+
}
125+
126+
parser_error_t parser_getItemTokenTransfer(const parser_context_t *ctx,
62127
uint8_t displayIdx,
63128
char *outKey, uint16_t outKeyLen,
64129
char *outVal, uint16_t outValLen,
@@ -134,45 +199,24 @@ parser_error_t parser_getItem(const parser_context_t *ctx,
134199

135200
return parser_ok;
136201
}
137-
//
138-
// if (displayIdx == 7) {
139-
// snprintf(outKey, outKeyLen, "Method");
140-
// *pageCount = 1;
141-
// switch(parser_tx_obj.method) {
142-
// case method0:
143-
// snprintf(outVal, outValLen, "Transfer");
144-
// return parser_ok;
145-
// case method1:
146-
// snprintf(outVal, outValLen, "Method1");
147-
// return parser_ok;
148-
// case method2:
149-
// snprintf(outVal, outValLen, "Method2");
150-
// return parser_ok;
151-
// case method3:
152-
// snprintf(outVal, outValLen, "Method3");
153-
// return parser_ok;
154-
// case method4:
155-
// snprintf(outVal, outValLen, "Method4");
156-
// return parser_ok;
157-
// case method5:
158-
// snprintf(outVal, outValLen, "Method5");
159-
// return parser_ok;
160-
// case method6:
161-
// snprintf(outVal, outValLen, "Method6");
162-
// return parser_ok;
163-
// case method7:
164-
// snprintf(outVal, outValLen, "Method7");
165-
// return parser_ok;
166-
// }
167-
// return parser_unexpected_method;
168-
// }
169-
//
170-
// if (displayIdx == 8) {
171-
// *pageCount = 1;
172-
// snprintf(outKey, outKeyLen, "Params");
173-
// snprintf(outVal, outValLen, "Not Available");
174-
// return parser_ok;
175-
// }
176-
177202
return parser_ok;
178203
}
204+
205+
parser_error_t parser_getItem(const parser_context_t *ctx,
206+
uint8_t displayIdx,
207+
char *outKey, uint16_t outKeyLen,
208+
char *outVal, uint16_t outValLen,
209+
uint8_t pageIdx, uint8_t *pageCount){
210+
switch (parser_tx_obj.txtype){
211+
case 0x00: {
212+
return parser_getItemTokenTransfer(ctx, displayIdx, outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount);
213+
}
214+
case 0x01: {
215+
return parser_getItemTransactionStateRead(ctx, displayIdx, outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount);
216+
217+
}
218+
default : {
219+
return parser_unexepected_error;
220+
}
221+
}
222+
}

0 commit comments

Comments
 (0)