Add support for V10 protocol with BulletProofV2 and short amount.

This commit is contained in:
cslashm 2019-02-08 16:11:51 +01:00 committed by wowario
parent e1b8e3d7b4
commit 356ea85da7
No known key found for this signature in database
GPG Key ID: 24DCBE762DE9C111
1 changed files with 34 additions and 13 deletions

View File

@ -1288,7 +1288,10 @@ namespace hw {
this->controle_device->ecdhEncode(unmasked_x, AKout_x, short_amount);
#endif
int offset = set_command_header_noopt(INS_BLIND);
int offset = set_command_header(INS_BLIND);
//options
this->buffer_send[offset] = short_amount?0x02:0x00;
offset += 1;
// AKout
memmove(this->buffer_send+offset, AKout.bytes, 32);
offset += 32;
@ -1325,8 +1328,10 @@ namespace hw {
this->controle_device->ecdhDecode(masked_x, AKout_x, short_amount);
#endif
int offset = set_command_header_noopt(INS_UNBLIND);
int offset = set_command_header(INS_UNBLIND);
//options
this->buffer_send[offset] = short_amount?0x02:0x00;
offset += 1;
// AKout
memmove(this->buffer_send+offset, AKout.bytes, 32);
offset += 32;
@ -1421,7 +1426,11 @@ namespace hw {
// ====== Aout, Bout, AKout, C, v, k ======
kv_offset = data_offset;
C_offset = kv_offset+ (32*2)*outputs_size;
if (type==rct::RCTTypeBulletproof2) {
C_offset = kv_offset+ (8)*outputs_size;
} else {
C_offset = kv_offset+ (32+32)*outputs_size;
}
for ( i = 0; i < outputs_size; i++) {
ABPkeys outKeys;
bool found;
@ -1434,6 +1443,7 @@ namespace hw {
offset = set_command_header(INS_VALIDATE, 0x02, i+1);
//options
this->buffer_send[offset] = (i==outputs_size-1)? 0x00:0x80 ;
this->buffer_send[offset] |= (type==rct::RCTTypeBulletproof2)?0x02:0x00;
offset += 1;
if (found) {
//is_subaddress
@ -1453,20 +1463,31 @@ namespace hw {
offset+=32;
} else {
// dummy: is_subaddress Aout Bout AKout
offset += 1+32*3;
offset += 2+32*3;
}
//C
memmove(this->buffer_send+offset, data+C_offset,32);
offset += 32;
C_offset += 32;
//k
memmove(this->buffer_send+offset, data+kv_offset,32);
offset += 32;
kv_offset += 32;
//v
memmove(this->buffer_send+offset, data+kv_offset,32);
offset += 32;
kv_offset += 32;
if (type==rct::RCTTypeBulletproof2) {
//k
memset(this->buffer_send+offset, 0, 32);
offset += 32;
//v
memset(this->buffer_send+offset, 0, 32);
memmove(this->buffer_send+offset, data+kv_offset,8);
offset += 32;
kv_offset += 8;
} else {
//k
memmove(this->buffer_send+offset, data+kv_offset,32);
offset += 32;
kv_offset += 32;
//v
memmove(this->buffer_send+offset, data+kv_offset,32);
offset += 32;
kv_offset += 32;
}
this->buffer_send[4] = offset-5;
this->length_send = offset;