X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Frfid_layer2_iso14443a.c;h=98722f5a0041bc4fe89f9609af876e6946af2af7;hb=893a580c6f1c7f1cc50d9bd1acc51c9fd6307a17;hp=66914db8c0458fa9dcc2b2080a058e161616d219;hpb=7f510a35e8c64da454d2bce2fb171791057d79e9;p=librfid diff --git a/src/rfid_layer2_iso14443a.c b/src/rfid_layer2_iso14443a.c index 66914db..98722f5 100644 --- a/src/rfid_layer2_iso14443a.c +++ b/src/rfid_layer2_iso14443a.c @@ -43,7 +43,7 @@ iso14443a_transceive_sf(struct rfid_layer2_handle *handle, unsigned char cmd, struct iso14443a_atqa *atqa) { - struct rfid_reader *rdr = handle->rh->reader; + const struct rfid_reader *rdr = handle->rh->reader; return rdr->iso14443a.transceive_sf(handle->rh, cmd, atqa); } @@ -54,7 +54,7 @@ iso14443a_transceive_acf(struct rfid_layer2_handle *handle, struct iso14443a_anticol_cmd *acf, unsigned int *bit_of_col) { - struct rfid_reader *rdr = handle->rh->reader; + const struct rfid_reader *rdr = handle->rh->reader; return rdr->iso14443a.transceive_acf(handle->rh, acf, bit_of_col); } @@ -85,35 +85,34 @@ iso14443a_code_nvb_bits(unsigned char *nvb, unsigned int bits) 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; + } } @@ -171,6 +170,7 @@ cascade: 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; @@ -199,6 +199,7 @@ cascade: 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; @@ -209,6 +210,7 @@ cascade: 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; @@ -238,13 +240,10 @@ cascade: } } - 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; @@ -252,6 +251,10 @@ cascade: 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; @@ -289,7 +292,7 @@ iso14443a_setopt(struct rfid_layer2_handle *handle, int optname, const void *optval, unsigned int optlen) { int ret = -EINVAL; - struct rfid_reader *rdr = handle->rh->reader; + const struct rfid_reader *rdr = handle->rh->reader; unsigned int speed; switch (optname) { @@ -324,15 +327,22 @@ iso14443a_getopt(struct rfid_layer2_handle *handle, int optname, 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; }; @@ -362,7 +372,7 @@ iso14443a_init(struct rfid_reader_handle *rh) 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;