Corrected signed value decoding.
This commit is contained in:
+52
-18
@@ -323,6 +323,7 @@ int decode_unsigned32(uint8_t * apdu, uint32_t * value)
|
|||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* returns the number of APDU octets used */
|
||||||
int encode_signed8(uint8_t * apdu, int8_t value)
|
int encode_signed8(uint8_t * apdu, int8_t value)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
@@ -337,21 +338,41 @@ int encode_signed8(uint8_t * apdu, int8_t value)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int decode_signed8(uint8_t * apdu, int8_t * value)
|
/* returns the number of APDU octets consumed */
|
||||||
|
int decode_signed8(uint8_t * apdu, int32_t * value)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
uint8_t byte;
|
uint8_t byte[4];
|
||||||
int8_t value;
|
int32_t value;
|
||||||
} byte_data = {
|
} long_data = { {
|
||||||
0};
|
0}};
|
||||||
|
|
||||||
byte_data.byte = apdu[0];
|
#if BIG_ENDIAN
|
||||||
|
/* negative - bit 7 is set */
|
||||||
|
if (apdu[0] & 0x80) {
|
||||||
|
long_data.byte[0] = 0xFF;
|
||||||
|
long_data.byte[1] = 0xFF;
|
||||||
|
long_data.byte[2] = 0xFF;
|
||||||
|
}
|
||||||
|
/* fill in the rest */
|
||||||
|
long_data.byte[3] = apdu[0];
|
||||||
|
#else
|
||||||
|
/* negative - bit 7 is set */
|
||||||
|
if (apdu[0] & 0x80) {
|
||||||
|
long_data.byte[3] = 0xFF;
|
||||||
|
long_data.byte[2] = 0xFF;
|
||||||
|
long_data.byte[1] = 0xFF;
|
||||||
|
}
|
||||||
|
/* fill in the rest */
|
||||||
|
long_data.byte[0] = apdu[0];
|
||||||
|
#endif
|
||||||
if (value)
|
if (value)
|
||||||
*value = byte_data.value;
|
*value = long_data.value;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* returns the number of APDU octets used */
|
||||||
int encode_signed16(uint8_t * apdu, int16_t value)
|
int encode_signed16(uint8_t * apdu, int16_t value)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
@@ -372,23 +393,36 @@ int encode_signed16(uint8_t * apdu, int16_t value)
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int decode_signed16(uint8_t * apdu, int16_t * value)
|
/* returns the number of APDU octets consumed */
|
||||||
|
int decode_signed16(uint8_t * apdu, int32_t * value)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
uint8_t byte[2];
|
uint8_t byte[4];
|
||||||
int16_t value;
|
int32_t value;
|
||||||
} short_data = { {
|
} long_data = { {
|
||||||
0}};
|
0}};
|
||||||
|
|
||||||
#if BIG_ENDIAN
|
#if BIG_ENDIAN
|
||||||
short_data.byte[0] = apdu[0];
|
/* negative - bit 7 is set */
|
||||||
short_data.byte[1] = apdu[1];
|
if (apdu[0] & 0x80) {
|
||||||
|
long_data.byte[0] = 0xFF;
|
||||||
|
long_data.byte[1] = 0xFF;
|
||||||
|
}
|
||||||
|
/* fill in the rest */
|
||||||
|
long_data.byte[2] = apdu[0];
|
||||||
|
long_data.byte[3] = apdu[1];
|
||||||
#else
|
#else
|
||||||
short_data.byte[1] = apdu[0];
|
/* negative - bit 7 is set */
|
||||||
short_data.byte[0] = apdu[1];
|
if (apdu[0] & 0x80) {
|
||||||
|
long_data.byte[3] = 0xFF;
|
||||||
|
long_data.byte[2] = 0xFF;
|
||||||
|
}
|
||||||
|
/* fill in the rest */
|
||||||
|
long_data.byte[1] = apdu[0];
|
||||||
|
long_data.byte[0] = apdu[1];
|
||||||
#endif
|
#endif
|
||||||
if (value)
|
if (value)
|
||||||
*value = short_data.value;
|
*value = long_data.value;
|
||||||
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
@@ -1343,11 +1377,11 @@ int decode_signed(uint8_t * apdu, uint32_t len_value, int32_t * value)
|
|||||||
if (value) {
|
if (value) {
|
||||||
switch (len_value) {
|
switch (len_value) {
|
||||||
case 1:
|
case 1:
|
||||||
decode_signed8(&apdu[0], &signed8_value);
|
decode_signed8(&apdu[0], value);
|
||||||
*value = signed8_value;
|
*value = signed8_value;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
decode_signed16(&apdu[0], &signed16_value);
|
decode_signed16(&apdu[0], value);
|
||||||
*value = signed16_value;
|
*value = signed16_value;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
|||||||
Reference in New Issue
Block a user