2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "net_nfc_client_transceive.h"
20 #include "net_nfc_client_tag_internal.h"
22 #include "net_nfc_tag_mifare.h"
24 #include "net_nfc_data.h"
25 #include "net_nfc_typedef_internal.h"
26 #include "net_nfc_debug_internal.h"
27 #include "net_nfc_target_info.h"
28 #include "net_nfc_util_internal.h"
30 #ifndef NET_NFC_EXPORT_API
31 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))
36 #define MIFARE_CMD_RAW 0x00U
37 #define MIFARE_CMD_AUTH_A 0x60U /**< authenticate with key A */
38 #define MIFARE_CMD_AUTH_B 0x61U /**< authenticate with key B */
39 #define MIFARE_CMD_READ 0x30U /**< read 16 bytes */
40 #define MIFARE_CMD_WRITE_BLOCK 0xA0U /**< write 16 bytes */
41 #define MIFARE_CMD_WRITE_PAGE 0xA2U /**< write 4 bytes */
42 #define MIFARE_CMD_INCREMENT 0xC1U /**< Increment. */
43 #define MIFARE_CMD_DECREMENT 0xC0U /**< Decrement. */
44 #define MIFARE_CMD_TRANSFER 0xB0U /**< Tranfer. */
45 #define MIFARE_CMD_RESTORE 0xC2U /**< Restore. */
46 #define MIFARE_TAG_KEY "UID"
48 #define MIFARE_CMD_READ_SECTOR 0x38U /* read sector */
49 #define MIFARE_CMD_WRITE_SECTOR 0xA8U /* write sector */
51 static uint8_t default_key[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
52 static uint8_t mad_key[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
53 static uint8_t net_nfc_forum_key[6] = { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
55 #define MIFARE_BLOCK_4 4
56 #define MIFARE_BLOCK_16 16
58 #define MIFARE_MINI_SECTORS 5
59 #define MIFARE_1K_SECTORS 16
60 #define MIFARE_4K_SECTORS 40
62 #define MIFARE_BLOCK_SIZE 16 /* 1 block is 16 byte */
63 #define MIFARE_PAGE_SIZE 4 /* 1 page is 4 byte */
67 net_nfc_error_e net_nfc_client_mifare_authenticate_with_keyA(
68 net_nfc_target_handle_h handle,
74 net_nfc_target_info_s* target_info = NULL;
81 uint8_t* send_buffer = NULL;
84 int send_buffer_length = 0;
86 uint8_t sector_to_block = 0;
89 if (handle == NULL || auth_key == NULL)
90 return NET_NFC_NULL_PARAMETER;
92 if (net_nfc_client_tag_is_connected() == FALSE)
93 return NET_NFC_OPERATION_FAIL;
95 key = (data_s *)auth_key;
98 return NET_NFC_OUT_OF_BOUND;
100 target_info = net_nfc_client_tag_get_client_target_info();
103 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
104 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
105 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG");
106 return NET_NFC_NOT_SUPPORTED;
109 return NET_NFC_NO_DATA_FOUND;
112 if (net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info,
114 &UID) != NET_NFC_OK) {
115 return NET_NFC_NO_DATA_FOUND;
118 switch (target_info->devType) {
119 case NET_NFC_MIFARE_MINI_PICC:
121 /* 0 ~ 4 : 5 sector and 4 block with 16 bytes */
122 if (sector > MIFARE_MINI_SECTORS - 1)
123 return NET_NFC_OUT_OF_BOUND;
125 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
128 case NET_NFC_MIFARE_1K_PICC:
130 /* 0 ~ 15 : 16 sector and 4 block with 16 bytes */
131 if (sector > MIFARE_1K_SECTORS)
132 return NET_NFC_OUT_OF_BOUND;
134 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
137 case NET_NFC_MIFARE_4K_PICC:
139 /* 0 ~ 31 : 32 sector and 4 block with 16 bytes
140 * 32 ~ 39 : 8 sector and 16 block with 16 bytes
142 if (sector > MIFARE_4K_SECTORS)
143 return NET_NFC_OUT_OF_BOUND;
146 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
148 sector_to_block = (31 * MIFARE_BLOCK_4 + 3)
150 * MIFARE_BLOCK_16 + 15;
159 /* cmd + addr + UID + AUTH_KEY + CRC_A */
160 send_buffer_length = 1 + 1 + ((data_s*)UID)->length
163 _net_nfc_util_alloc_mem(send_buffer,
164 send_buffer_length * sizeof(uint8_t));
165 if (send_buffer == NULL) {
166 net_nfc_free_data(UID);
167 return NET_NFC_ALLOC_FAIL;
172 *temp = MIFARE_CMD_AUTH_A;
175 *temp = sector_to_block;
178 memcpy(temp, ((data_s*)UID)->buffer, ((data_s*)UID)->length);
179 temp = temp + ((data_s*)UID)->length;
181 memcpy(temp, key->buffer, key->length);
183 net_nfc_util_compute_CRC(CRC_A, send_buffer, send_buffer_length);
186 rawdata.buffer = send_buffer;
187 rawdata.length = send_buffer_length;
189 net_nfc_error_e result = net_nfc_client_transceive(handle,
194 if (send_buffer != NULL)
195 _net_nfc_util_free_mem(send_buffer);
201 net_nfc_error_e net_nfc_client_mifare_authenticate_with_keyB(
202 net_nfc_target_handle_h handle,
208 net_nfc_target_info_s* target_info = NULL;
215 uint8_t* send_buffer = NULL;
216 uint8_t* temp = NULL;
218 int send_buffer_length = 0;
220 uint8_t sector_to_block = 0;
223 if (handle == NULL || auth_key == NULL)
224 return NET_NFC_NULL_PARAMETER;
226 if (net_nfc_client_tag_is_connected() == FALSE)
227 return NET_NFC_OPERATION_FAIL;
229 key = (data_s *)auth_key;
231 if (key->length != 6)
232 return NET_NFC_OUT_OF_BOUND;
234 target_info = net_nfc_client_tag_get_client_target_info();
236 if (target_info != NULL) {
237 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
238 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
239 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG");
240 return NET_NFC_NOT_SUPPORTED;
243 return NET_NFC_NO_DATA_FOUND;
246 if (net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info,
248 &UID) != NET_NFC_OK) {
249 return NET_NFC_NO_DATA_FOUND;
252 switch (target_info->devType) {
253 case NET_NFC_MIFARE_MINI_PICC:
255 /* 0 ~ 4 : 5 sector and 4 block with 16 bytes */
256 if (sector > MIFARE_MINI_SECTORS)
257 return NET_NFC_OUT_OF_BOUND;
259 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
262 case NET_NFC_MIFARE_1K_PICC:
264 /* 0 ~ 15 : 16 sector and 4 block with 16 bytes */
265 if (sector > MIFARE_1K_SECTORS)
266 return NET_NFC_OUT_OF_BOUND;
268 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
271 case NET_NFC_MIFARE_4K_PICC:
273 /* 0 ~ 31 : 32 sector and 4 block with 16 bytes
274 * 32 ~ 39 : 8 sector and 16 block with 16 bytes
276 if (sector > MIFARE_4K_SECTORS)
277 return NET_NFC_OUT_OF_BOUND;
280 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
282 sector_to_block = (31 * MIFARE_BLOCK_4 + 3)
284 * MIFARE_BLOCK_16 + 15;
292 send_buffer_length = 1 + 1 + ((data_s*)UID)->length
293 + key->length + 2; /* cmd + addr + UID + AUTH_KEY + CRC_A */
295 _net_nfc_util_alloc_mem(send_buffer, send_buffer_length
297 if (send_buffer == NULL) {
298 net_nfc_free_data(UID);
299 return NET_NFC_ALLOC_FAIL;
304 *temp = MIFARE_CMD_AUTH_B;
307 *temp = sector_to_block;
310 memcpy(temp, ((data_s*)UID)->buffer, ((data_s*)UID)->length);
311 temp = temp + ((data_s*)UID)->length;
313 memcpy(temp, key->buffer, key->length);
315 net_nfc_util_compute_CRC(CRC_A, send_buffer, send_buffer_length);
317 rawdata.buffer = send_buffer;
318 rawdata.length = send_buffer_length;
320 net_nfc_error_e result = net_nfc_client_transceive(handle,
325 if (send_buffer != NULL)
326 _net_nfc_util_free_mem(send_buffer);
332 net_nfc_error_e net_nfc_client_mifare_read(net_nfc_target_handle_h handle,
337 net_nfc_target_info_s* target_info = NULL;
341 uint8_t send_buffer[2] = { 0 };
345 return NET_NFC_NULL_PARAMETER;
347 if (net_nfc_client_tag_is_connected() == FALSE)
348 return NET_NFC_OPERATION_FAIL;
350 target_info = net_nfc_client_tag_get_client_target_info();
352 if (target_info != NULL) {
353 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
354 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC) {
355 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d]",
356 target_info->devType);
357 return NET_NFC_NOT_SUPPORTED;
360 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC) {
362 return NET_NFC_OUT_OF_BOUND;
367 send_buffer[0] = MIFARE_CMD_READ;
368 send_buffer[1] = addr;
371 rawdata.buffer = send_buffer;
374 return net_nfc_client_transceive_data(handle,
381 net_nfc_error_e net_nfc_client_mifare_write_block(
382 net_nfc_target_handle_h handle,
388 net_nfc_target_info_s* target_info = NULL;
392 uint8_t* send_buffer = NULL;
394 uint32_t send_buffer_length = 0;
398 return NET_NFC_NULL_PARAMETER;
400 if (net_nfc_client_tag_is_connected() == FALSE)
401 return NET_NFC_OPERATION_FAIL;
404 target_info = net_nfc_client_tag_get_client_target_info();
406 if (target_info == NULL)
407 return NET_NFC_NOT_INITIALIZED;
409 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
410 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC) {
411 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d] ",
412 target_info->devType);
413 return NET_NFC_NOT_SUPPORTED;
416 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC) {
418 return NET_NFC_OUT_OF_BOUND;
421 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC) {
422 if (((data_s *)data)->length > MIFARE_PAGE_SIZE) {
423 uint8_t* temp = NULL;
425 /* cmd + addr + page */
426 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
428 _net_nfc_util_alloc_mem(send_buffer,
429 send_buffer_length * sizeof(uint8_t));
430 if (send_buffer == NULL)
431 return NET_NFC_ALLOC_FAIL;
435 *temp = MIFARE_CMD_WRITE_PAGE;
442 ((data_s*)data)->buffer,
446 uint8_t* temp = NULL;
448 /* cmd + addr + page */
449 send_buffer_length = 1 + 1 +
450 ((data_s*)data)->length;
452 _net_nfc_util_alloc_mem(send_buffer,
453 send_buffer_length * sizeof(uint8_t));
454 if (send_buffer == NULL)
455 return NET_NFC_ALLOC_FAIL;
459 *temp = MIFARE_CMD_WRITE_PAGE;
466 ((data_s*)data)->buffer,
467 ((data_s*)data)->length);
471 if (((data_s*)data)->length > MIFARE_BLOCK_SIZE) {
472 uint8_t* temp = NULL;
474 /* cmd + addr + page*/
475 send_buffer_length = 1 + 1 + MIFARE_BLOCK_SIZE;
477 _net_nfc_util_alloc_mem(send_buffer,
478 send_buffer_length * sizeof(uint8_t));
479 if (send_buffer == NULL)
480 return NET_NFC_ALLOC_FAIL;
484 *temp = MIFARE_CMD_WRITE_BLOCK;
491 ((data_s*)data)->buffer,
494 uint8_t* temp = NULL;
496 /* cmd + addr + page */
497 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
499 _net_nfc_util_alloc_mem(send_buffer,
500 send_buffer_length * sizeof(uint8_t));
501 if (send_buffer == NULL)
502 return NET_NFC_ALLOC_FAIL;
506 *temp = MIFARE_CMD_WRITE_BLOCK;
513 ((data_s*)data)->buffer,
514 ((data_s*)data)->length);
519 rawdata.buffer = send_buffer;
520 rawdata.length = send_buffer_length;
522 net_nfc_error_e result = net_nfc_client_transceive(handle,
527 if (send_buffer != NULL)
528 _net_nfc_util_free_mem(send_buffer);
534 net_nfc_error_e net_nfc_client_mifare_write_page(
535 net_nfc_target_handle_h handle,
541 net_nfc_target_info_s* target_info = NULL;
543 uint8_t* send_buffer = NULL;
545 uint32_t send_buffer_length = 0;
548 return NET_NFC_NULL_PARAMETER;
550 if (net_nfc_client_tag_is_connected() == FALSE)
551 return NET_NFC_OPERATION_FAIL;
553 target_info = net_nfc_client_tag_get_client_target_info();
555 if (target_info == NULL)
556 return NET_NFC_NOT_INITIALIZED;
558 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
559 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC) {
560 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d] ",
561 target_info->devType);
562 return NET_NFC_NOT_SUPPORTED;
565 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC) {
567 return NET_NFC_OUT_OF_BOUND;
570 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC) {
571 if (((data_s*)data)->length > MIFARE_PAGE_SIZE) {
572 uint8_t* temp = NULL;
574 /* cmd + addr + page */
575 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
577 _net_nfc_util_alloc_mem(send_buffer,
578 send_buffer_length * sizeof(uint8_t));
579 if (send_buffer == NULL)
580 return NET_NFC_ALLOC_FAIL;
584 *temp = MIFARE_CMD_WRITE_PAGE;
591 ((data_s*)data)->buffer,
594 uint8_t* temp = NULL;
596 /* cmd + addr + page */
597 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
599 _net_nfc_util_alloc_mem(send_buffer,
600 send_buffer_length * sizeof(uint8_t));
601 if (send_buffer == NULL)
602 return NET_NFC_ALLOC_FAIL;
606 *temp = MIFARE_CMD_WRITE_PAGE;
613 ((data_s*)data)->buffer,
614 ((data_s*)data)->length);
618 if (((data_s*)data)->length > MIFARE_PAGE_SIZE) {
619 uint8_t* temp = NULL;
621 /* cmd + addr + page */
622 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
624 _net_nfc_util_alloc_mem(send_buffer,
625 send_buffer_length * sizeof(uint8_t));
626 if (send_buffer == NULL)
627 return NET_NFC_ALLOC_FAIL;
631 *temp = MIFARE_CMD_WRITE_BLOCK;
638 ((data_s*)data)->buffer,
642 uint8_t* temp = NULL;
644 /* cmd + addr + page */
645 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
647 _net_nfc_util_alloc_mem(send_buffer,
648 send_buffer_length * sizeof(uint8_t));
649 if (send_buffer == NULL)
650 return NET_NFC_ALLOC_FAIL;
654 *temp = MIFARE_CMD_WRITE_BLOCK;
661 ((data_s*)data)->buffer,
662 ((data_s*)data)->length);
670 rawdata.buffer = send_buffer;
671 rawdata.length = send_buffer_length;
673 net_nfc_error_e result = net_nfc_client_transceive(handle,
678 if (send_buffer != NULL)
679 _net_nfc_util_free_mem(send_buffer);
685 net_nfc_error_e net_nfc_client_mifare_increment(net_nfc_target_handle_h handle,
691 net_nfc_target_info_s* target_info = NULL;
695 uint8_t send_buffer[8] = { 0 };
699 return NET_NFC_NULL_PARAMETER;
701 if (net_nfc_client_tag_is_connected() == FALSE)
702 return NET_NFC_OPERATION_FAIL;
704 target_info = net_nfc_client_tag_get_client_target_info();
707 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
708 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
710 "not a MIFARE Classic TAG = [%d]",
711 target_info->devType);
712 return NET_NFC_NOT_SUPPORTED;
717 send_buffer[0] = MIFARE_CMD_INCREMENT;
718 send_buffer[1] = addr;
721 little value of byte array will be saved first in memory */
722 send_buffer[5] = (value & 0xFF000000) >> 24;
723 send_buffer[4] = (value & 0x00FF0000) >> 16;
724 send_buffer[3] = (value & 0x0000FF00) >> 8;
725 send_buffer[2] = (value & 0x000000FF);
727 net_nfc_util_compute_CRC(CRC_A, send_buffer, 8);
729 rawdata.buffer = send_buffer;
732 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
737 net_nfc_error_e net_nfc_client_mifare_decrement(net_nfc_target_handle_h handle,
743 net_nfc_target_info_s* target_info = NULL;
747 uint8_t send_buffer[8] = { 0 };
750 return NET_NFC_NULL_PARAMETER;
752 if (net_nfc_client_tag_is_connected() == FALSE)
753 return NET_NFC_OPERATION_FAIL;
755 target_info = net_nfc_client_tag_get_client_target_info();
759 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
760 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
761 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d] ",
762 target_info->devType);
763 return NET_NFC_NOT_SUPPORTED;
767 send_buffer[0] = MIFARE_CMD_DECREMENT;
768 send_buffer[1] = addr;
771 little value of byte array will be saved first in memory */
772 send_buffer[5] = (value & 0xFF000000) >> 24;
773 send_buffer[4] = (value & 0x00FF0000) >> 16;
774 send_buffer[3] = (value & 0x0000FF00) >> 8;
775 send_buffer[2] = (value & 0x000000FF);
777 net_nfc_util_compute_CRC(CRC_A, send_buffer, 8);
779 DEBUG_MSG_PRINT_BUFFER(send_buffer, 8);
781 rawdata.buffer = send_buffer;
784 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
789 net_nfc_error_e net_nfc_client_mifare_transfer(net_nfc_target_handle_h handle,
794 net_nfc_target_info_s* target_info = NULL;
798 uint8_t send_buffer[4] = { 0 };
801 return NET_NFC_NULL_PARAMETER;
803 if (net_nfc_client_tag_is_connected() == FALSE)
804 return NET_NFC_OPERATION_FAIL;
806 target_info = net_nfc_client_tag_get_client_target_info();
809 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
810 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
811 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d]",
812 target_info->devType);
813 return NET_NFC_NOT_SUPPORTED;
817 send_buffer[0] = MIFARE_CMD_TRANSFER;
818 send_buffer[1] = addr;
820 net_nfc_util_compute_CRC(CRC_A, send_buffer, 4);
822 rawdata.buffer = send_buffer;
825 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
830 net_nfc_error_e net_nfc_client_mifare_restore(net_nfc_target_handle_h handle,
835 net_nfc_target_info_s* target_info = NULL;
839 uint8_t send_buffer[4] = { 0 };
842 return NET_NFC_NULL_PARAMETER;
844 if (net_nfc_client_tag_is_connected() == FALSE)
845 return NET_NFC_OPERATION_FAIL;
847 target_info = net_nfc_client_tag_get_client_target_info();
850 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
851 target_info->devType > NET_NFC_MIFARE_4K_PICC) {
852 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d]",
853 target_info->devType);
854 return NET_NFC_NOT_SUPPORTED;
858 send_buffer[0] = MIFARE_CMD_RESTORE;
859 send_buffer[1] = addr;
861 net_nfc_util_compute_CRC(CRC_A, send_buffer, 4);
863 rawdata.buffer = send_buffer;
866 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
871 net_nfc_error_e net_nfc_client_mifare_create_default_key(data_h* key)
874 return NET_NFC_NULL_PARAMETER;
876 return net_nfc_create_data(key, default_key, 6);
880 net_nfc_error_e net_nfc_client_mifare_create_application_directory_key(
884 return NET_NFC_NULL_PARAMETER;
886 return net_nfc_create_data(key, mad_key, 6);
890 net_nfc_error_e net_nfc_client_mifare_create_net_nfc_forum_key(data_h* key)
893 return NET_NFC_NULL_PARAMETER;
895 return net_nfc_create_data(key, net_nfc_forum_key, 6);