return 0;
}
-int random_bit(void)
+static int random_bit(void)
{
- unsigned long e;
+ unsigned long e;
- e = randctx[0];
- randctx[0]=randctx[1];
- randctx[1]=(randctx[2]<<19) + (randctx[2]>>13) + randctx[3];
- randctx[2]=randctx[3] ^ randctx[0];
- randctx[3]=e+randctx[1];
+ e = randctx[0];
+ randctx[0] = randctx[1];
+ randctx[1] = (randctx[2]<<19) + (randctx[2]>>13) + randctx[3];
+ randctx[2] = randctx[3] ^ randctx[0];
+ randctx[3] = e+randctx[1];
- return randctx[1]&1;
+ return randctx[1]&1;
}
/* first bit is '1', second bit '2' */
static void
rnd_toggle_bit_in_field(unsigned char *bitfield, unsigned int size, unsigned int bit)
{
- unsigned int byte,rnd;
+ unsigned int byte,rnd;
- if(bit && (bit <= (size*8)) )
- {
- rnd=random_bit();
+ if (bit && (bit <= (size*8))) {
+ rnd = random_bit();
- DEBUGP("xor'ing bit %u with %u\n",bit,rnd);
- bit--;
- byte=bit/8;
- bit=rnd<<(bit%8);
- bitfield[byte] ^= bit;
- }
+ DEBUGP("xor'ing bit %u with %u\n",bit,rnd);
+ bit--;
+ byte = bit/8;
+ bit = rnd << (bit % 8);
+ bitfield[byte] ^= bit;
+ }
}
iso14443a_code_nvb_bits(&acf.nvb, 16);
ret = iso14443a_transceive_acf(handle, &acf, &bit_of_col);
+ DEBUGP("tran_acf->%d boc: %d\n",ret,bit_of_col);
if (ret < 0)
return ret;
switch (acf.sel_code) {
case ISO14443A_AC_SEL_CODE_CL1:
/* cascading from CL1 to CL2 */
+ DEBUGP("cascading from CL1 to CL2\n");
if (acf.uid_bits[0] != 0x88) {
DEBUGP("Cascade bit set, but UID0 != 0x88\n");
return -1;
break;
case ISO14443A_AC_SEL_CODE_CL2:
/* cascading from CL2 to CL3 */
+ DEBUGP("cascading from CL2 to CL3\n");
memcpy(&handle->uid[3], &acf.uid_bits[1], 3);
acf.sel_code = ISO14443A_AC_SEL_CODE_CL3;
h->level = ISO14443A_LEVEL_CL3;
}
}
- h->level = ISO14443A_LEVEL_NONE;
- h->state = ISO14443A_STATE_SELECTED;
-
{
- if (uid_size == 1)
+ if (h->level == ISO14443A_LEVEL_CL1)
handle->uid_len = 4;
- else if (uid_size == 2)
+ else if (h->level == ISO14443A_LEVEL_CL2)
handle->uid_len = 7;
else
handle->uid_len = 10;
DEBUGP("UID %s\n", rfid_hexdump(handle->uid, handle->uid_len));
}
+ h->level = ISO14443A_LEVEL_NONE;
+ h->state = ISO14443A_STATE_SELECTED;
+ h->sak = sak[0];
+
if (sak[0] & 0x20) {
DEBUGP("we have a T=CL compliant PICC\n");
handle->proto_supported = 1 << RFID_PROTOCOL_TCL;
int ret = -EINVAL;
struct iso14443a_handle *h = &handle->priv.iso14443a;
struct iso14443a_atqa *atqa = optval;
+ u_int8_t *opt_u8 = optval;
int *wupa = optval;
switch (optname) {
+ case RFID_OPT_14443A_SAK:
+ *opt_u8 = h->sak;
+ *optlen = sizeof(*opt_u8);
+ break;
case RFID_OPT_14443A_ATQA:
*atqa = h->atqa;
+ *optlen = sizeof(*atqa);
ret = 0;
break;
case RFID_OPT_14443A_WUPA:
*wupa = ((handle->flags & RFID_OPT_LAYER2_WUP) != 0);
+ *optlen = sizeof(*wupa);
ret = 0;
break;
};
h->priv.iso14443a.state = ISO14443A_STATE_NONE;
h->priv.iso14443a.level = ISO14443A_LEVEL_NONE;
- ret = h->rh->reader->iso14443a.init(h->rh);
+ ret = h->rh->reader->init(h->rh, RFID_LAYER2_ISO14443A);
if (ret < 0) {
free_layer2_handle(h);
return NULL;