Rewrite some tests using switch statements.
Add a note for the reason I do this in the HACKING file.
This commit is contained in:
parent
1d3c3f5dfd
commit
373cb4f0ef
3 changed files with 39 additions and 7 deletions
12
HACKING
12
HACKING
|
@ -70,3 +70,15 @@ infrastructure ready for hacking the new card support:
|
||||||
knows...
|
knows...
|
||||||
- <tag>_tag_free() SHALL free all resources allocated for the tag
|
- <tag>_tag_free() SHALL free all resources allocated for the tag
|
||||||
(surprising, isn't it?)
|
(surprising, isn't it?)
|
||||||
|
|
||||||
|
|
||||||
|
Various guidelines
|
||||||
|
------------------
|
||||||
|
|
||||||
|
- If a given card has different cryptographic modes, you SHOULD use
|
||||||
|
switch/cases to handle specific branches of code, even when applicable to
|
||||||
|
only one cypher. The idea is that if you don't provide support for all
|
||||||
|
cryptographic schemes, or if an evolution of the card provides more
|
||||||
|
cryptographic possibilities, when adding support for a new cypher, the
|
||||||
|
compiler can warn the developer about unhandled values in switch
|
||||||
|
statements. Please refer to the Mifare DESFire code for an example.
|
||||||
|
|
|
@ -395,8 +395,14 @@ authenticate (MifareTag tag, uint8_t cmd, uint8_t key_no, MifareDESFireKey key)
|
||||||
MIFARE_DESFIRE (tag)->session_key = mifare_desfire_session_key_new (PCD_RndA, PICC_RndB, key);
|
MIFARE_DESFIRE (tag)->session_key = mifare_desfire_session_key_new (PCD_RndA, PICC_RndB, key);
|
||||||
memset (MIFARE_DESFIRE (tag)->ivect, 0, MAX_CRYPTO_BLOCK_SIZE);
|
memset (MIFARE_DESFIRE (tag)->ivect, 0, MAX_CRYPTO_BLOCK_SIZE);
|
||||||
|
|
||||||
if (MIFARE_DESFIRE (tag)->session_key->type == T_AES)
|
switch (MIFARE_DESFIRE (tag)->session_key->type) {
|
||||||
|
case T_DES:
|
||||||
|
case T_3DES:
|
||||||
|
break;
|
||||||
|
case T_AES:
|
||||||
cmac_generate_subkeys (MIFARE_DESFIRE (tag)->session_key);
|
cmac_generate_subkeys (MIFARE_DESFIRE (tag)->session_key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1196,10 +1202,16 @@ read_data (MifareTag tag, uint8_t command, uint8_t file_no, off_t offset, size_t
|
||||||
BUFFER_APPEND_LE (cmd, offset, 3, sizeof (off_t));
|
BUFFER_APPEND_LE (cmd, offset, 3, sizeof (off_t));
|
||||||
BUFFER_APPEND_LE (cmd, length, 3, sizeof (size_t));
|
BUFFER_APPEND_LE (cmd, length, 3, sizeof (size_t));
|
||||||
|
|
||||||
// FIXME This is somewhat done in mifare_cryto_preprocess_data (or should be!!)
|
|
||||||
uint8_t ocs = cs;
|
uint8_t ocs = cs;
|
||||||
if ((MIFARE_DESFIRE (tag)->session_key) && (MIFARE_DESFIRE (tag)->session_key->type == T_AES) && (cs | MDCM_MACED)) {
|
if ((MIFARE_DESFIRE (tag)->session_key) && (cs | MDCM_MACED)) {
|
||||||
cs = MDCM_PLAIN;
|
switch (MIFARE_DESFIRE (tag)->session_key->type) {
|
||||||
|
case T_DES:
|
||||||
|
case T_3DES:
|
||||||
|
break;
|
||||||
|
case T_AES:
|
||||||
|
cs = MDCM_PLAIN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uint8_t *p = mifare_cryto_preprocess_data (tag, cmd, &__cmd_n, 8, cs | CMAC_COMMAND);
|
uint8_t *p = mifare_cryto_preprocess_data (tag, cmd, &__cmd_n, 8, cs | CMAC_COMMAND);
|
||||||
cs = ocs;
|
cs = ocs;
|
||||||
|
|
|
@ -403,12 +403,20 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t o
|
||||||
memcpy (res, data, *nbytes);
|
memcpy (res, data, *nbytes);
|
||||||
if (!(communication_settings & NO_CRC)) {
|
if (!(communication_settings & NO_CRC)) {
|
||||||
// ... CRC ...
|
// ... CRC ...
|
||||||
|
switch (key->type) {
|
||||||
|
case T_DES:
|
||||||
|
case T_3DES:
|
||||||
iso14443a_crc_append ((uint8_t *)res + offset, *nbytes - offset);
|
iso14443a_crc_append ((uint8_t *)res + offset, *nbytes - offset);
|
||||||
} else {
|
*nbytes += 2;
|
||||||
bzero ((uint8_t *) res + *nbytes, 2);
|
break;
|
||||||
|
case T_AES:
|
||||||
|
// Never reached.
|
||||||
|
abort ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// ... and 0 padding
|
// ... and 0 padding
|
||||||
memset ((uint8_t *)(res) + *nbytes + 2, 0, edl - *nbytes - 2);
|
memset ((uint8_t *)(res) + *nbytes, 0, edl - *nbytes);
|
||||||
|
|
||||||
*nbytes = edl;
|
*nbytes = edl;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue