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")))
34 #define MIFARE_CMD_RAW 0x00U
35 #define MIFARE_CMD_AUTH_A 0x60U /**< authenticate with key A */
36 #define MIFARE_CMD_AUTH_B 0x61U /**< authenticate with key B */
37 #define MIFARE_CMD_READ 0x30U /**< read 16 bytes */
38 #define MIFARE_CMD_WRITE_BLOCK 0xA0U /**< write 16 bytes */
39 #define MIFARE_CMD_WRITE_PAGE 0xA2U /**< write 4 bytes */
40 #define MIFARE_CMD_INCREMENT 0xC1U /**< Increment. */
41 #define MIFARE_CMD_DECREMENT 0xC0U /**< Decrement. */
42 #define MIFARE_CMD_TRANSFER 0xB0U /**< Tranfer. */
43 #define MIFARE_CMD_RESTORE 0xC2U /**< Restore. */
44 #define MIFARE_TAG_KEY "UID"
46 #define MIFARE_CMD_READ_SECTOR 0x38U /* read sector */
47 #define MIFARE_CMD_WRITE_SECTOR 0xA8U /* write sector */
49 static uint8_t default_key[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
50 static uint8_t mad_key[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
51 static uint8_t net_nfc_forum_key[6] = { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
53 #define MIFARE_BLOCK_4 4
54 #define MIFARE_BLOCK_16 16
56 #define MIFARE_MINI_SECTORS 5
57 #define MIFARE_1K_SECTORS 16
58 #define MIFARE_4K_SECTORS 40
60 #define MIFARE_BLOCK_SIZE 16 /* 1 block is 16 byte */
61 #define MIFARE_PAGE_SIZE 4 /* 1 page is 4 byte */
65 net_nfc_error_e net_nfc_client_mifare_authenticate_with_keyA(
66 net_nfc_target_handle_h handle,
72 net_nfc_target_info_s* target_info = NULL;
79 uint8_t* send_buffer = NULL;
82 int send_buffer_length = 0;
84 uint8_t sector_to_block = 0;
87 if (handle == NULL || auth_key == NULL)
88 return NET_NFC_NULL_PARAMETER;
90 if (net_nfc_client_tag_is_connected() == FALSE)
91 return NET_NFC_OPERATION_FAIL;
93 key = (data_s *)auth_key;
96 return NET_NFC_OUT_OF_BOUND;
98 target_info = net_nfc_client_tag_get_client_target_info();
102 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
103 target_info->devType > NET_NFC_MIFARE_4K_PICC)
105 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG");
106 return NET_NFC_NOT_SUPPORTED;
110 if (net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info,
114 return NET_NFC_NO_DATA_FOUND;
117 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;
149 sector_to_block = (31 * MIFARE_BLOCK_4 + 3)
151 * MIFARE_BLOCK_16 + 15;
160 /* cmd + addr + UID + AUTH_KEY + CRC_A */
161 send_buffer_length = 1 + 1 + ((data_s*)UID)->length
164 _net_nfc_util_alloc_mem(send_buffer,
165 send_buffer_length * sizeof(uint8_t));
166 if (send_buffer == NULL)
168 net_nfc_free_data(UID);
169 return NET_NFC_ALLOC_FAIL;
174 *temp = MIFARE_CMD_AUTH_A;
177 *temp = sector_to_block;
180 memcpy(temp, ((data_s*)UID)->buffer, ((data_s*)UID)->length);
181 temp = temp + ((data_s*)UID)->length;
183 memcpy(temp, key->buffer, key->length);
185 net_nfc_util_compute_CRC(CRC_A, send_buffer, send_buffer_length);
188 rawdata.buffer = send_buffer;
189 rawdata.length = send_buffer_length;
191 net_nfc_error_e result = net_nfc_client_transceive(handle,
196 if (send_buffer != NULL)
197 _net_nfc_util_free_mem(send_buffer);
203 net_nfc_error_e net_nfc_client_mifare_authenticate_with_keyB(
204 net_nfc_target_handle_h handle,
210 net_nfc_target_info_s* target_info = NULL;
217 uint8_t* send_buffer = NULL;
218 uint8_t* temp = NULL;
220 int send_buffer_length = 0;
222 uint8_t sector_to_block = 0;
225 if (handle == NULL || auth_key == NULL)
226 return NET_NFC_NULL_PARAMETER;
228 if (net_nfc_client_tag_is_connected() == FALSE)
229 return NET_NFC_OPERATION_FAIL;
231 key = (data_s *)auth_key;
233 if (key->length != 6)
234 return NET_NFC_OUT_OF_BOUND;
236 target_info = net_nfc_client_tag_get_client_target_info();
238 if (target_info != NULL)
240 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
241 target_info->devType > NET_NFC_MIFARE_4K_PICC)
243 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG");
244 return NET_NFC_NOT_SUPPORTED;
248 if (net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info,
252 return NET_NFC_NO_DATA_FOUND;
255 switch (target_info->devType)
257 case NET_NFC_MIFARE_MINI_PICC :
259 /* 0 ~ 4 : 5 sector and 4 block with 16 bytes */
260 if (sector > MIFARE_MINI_SECTORS)
261 return NET_NFC_OUT_OF_BOUND;
263 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
266 case NET_NFC_MIFARE_1K_PICC :
268 /* 0 ~ 15 : 16 sector and 4 block with 16 bytes */
269 if (sector > MIFARE_1K_SECTORS)
270 return NET_NFC_OUT_OF_BOUND;
272 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
275 case NET_NFC_MIFARE_4K_PICC :
277 /* 0 ~ 31 : 32 sector and 4 block with 16 bytes
278 * 32 ~ 39 : 8 sector and 16 block with 16 bytes
280 if (sector > MIFARE_4K_SECTORS)
281 return NET_NFC_OUT_OF_BOUND;
284 sector_to_block = sector * MIFARE_BLOCK_4 + 3;
287 sector_to_block = (31 * MIFARE_BLOCK_4 + 3)
289 * MIFARE_BLOCK_16 + 15;
297 send_buffer_length = 1 + 1 + ((data_s*)UID)->length
298 + key->length + 2; /* cmd + addr + UID + AUTH_KEY + CRC_A */
300 _net_nfc_util_alloc_mem(send_buffer, send_buffer_length
302 if (send_buffer == NULL)
304 net_nfc_free_data(UID);
305 return NET_NFC_ALLOC_FAIL;
310 *temp = MIFARE_CMD_AUTH_B;
313 *temp = sector_to_block;
316 memcpy(temp, ((data_s*)UID)->buffer, ((data_s*)UID)->length);
317 temp = temp + ((data_s*)UID)->length;
319 memcpy(temp, key->buffer, key->length);
321 net_nfc_util_compute_CRC(CRC_A, send_buffer, send_buffer_length);
323 rawdata.buffer = send_buffer;
324 rawdata.length = send_buffer_length;
326 net_nfc_error_e result = net_nfc_client_transceive(handle,
331 if (send_buffer != NULL)
332 _net_nfc_util_free_mem(send_buffer);
338 net_nfc_error_e net_nfc_client_mifare_read(net_nfc_target_handle_h handle,
343 net_nfc_target_info_s* target_info = NULL;
347 uint8_t send_buffer[2] = { 0 };
351 return NET_NFC_NULL_PARAMETER;
353 if (net_nfc_client_tag_is_connected() == FALSE)
354 return NET_NFC_OPERATION_FAIL;
356 target_info = net_nfc_client_tag_get_client_target_info();
358 if (target_info != NULL)
360 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
361 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC)
363 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d]",
364 target_info->devType);
365 return NET_NFC_NOT_SUPPORTED;
368 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC)
371 return NET_NFC_OUT_OF_BOUND;
376 send_buffer[0] = MIFARE_CMD_READ;
377 send_buffer[1] = addr;
380 rawdata.buffer = send_buffer;
383 return net_nfc_client_transceive_data(handle,
390 net_nfc_error_e net_nfc_client_mifare_write_block(
391 net_nfc_target_handle_h handle,
397 net_nfc_target_info_s* target_info = NULL;
401 uint8_t* send_buffer = NULL;
403 uint32_t send_buffer_length = 0;
407 return NET_NFC_NULL_PARAMETER;
409 if (net_nfc_client_tag_is_connected() == FALSE)
410 return NET_NFC_OPERATION_FAIL;
413 target_info = net_nfc_client_tag_get_client_target_info();
415 if (target_info == NULL)
416 return NET_NFC_NOT_INITIALIZED;
418 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
419 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC)
421 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d] ",
422 target_info->devType);
423 return NET_NFC_NOT_SUPPORTED;
426 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC)
429 return NET_NFC_OUT_OF_BOUND;
432 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC)
434 if (((data_s *)data)->length > MIFARE_PAGE_SIZE)
436 uint8_t* temp = NULL;
438 /* cmd + addr + page */
439 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
441 _net_nfc_util_alloc_mem(send_buffer,
442 send_buffer_length * sizeof(uint8_t));
443 if (send_buffer == NULL)
444 return NET_NFC_ALLOC_FAIL;
448 *temp = MIFARE_CMD_WRITE_PAGE;
455 ((data_s*)data)->buffer,
461 uint8_t* temp = NULL;
463 /* cmd + addr + page */
464 send_buffer_length = 1 + 1 +
465 ((data_s*)data)->length;
467 _net_nfc_util_alloc_mem(send_buffer,
468 send_buffer_length * sizeof(uint8_t));
469 if (send_buffer == NULL)
470 return NET_NFC_ALLOC_FAIL;
474 *temp = MIFARE_CMD_WRITE_PAGE;
481 ((data_s*)data)->buffer,
482 ((data_s*)data)->length);
489 if (((data_s*)data)->length > MIFARE_BLOCK_SIZE)
491 uint8_t* temp = NULL;
493 /* cmd + addr + page*/
494 send_buffer_length = 1 + 1 + MIFARE_BLOCK_SIZE;
496 _net_nfc_util_alloc_mem(send_buffer,
497 send_buffer_length * sizeof(uint8_t));
498 if (send_buffer == NULL)
499 return NET_NFC_ALLOC_FAIL;
503 *temp = MIFARE_CMD_WRITE_BLOCK;
510 ((data_s*)data)->buffer,
515 uint8_t* temp = NULL;
517 /* cmd + addr + page */
518 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
520 _net_nfc_util_alloc_mem(send_buffer,
521 send_buffer_length * sizeof(uint8_t));
522 if (send_buffer == NULL)
523 return NET_NFC_ALLOC_FAIL;
527 *temp = MIFARE_CMD_WRITE_BLOCK;
534 ((data_s*)data)->buffer,
535 ((data_s*)data)->length);
540 rawdata.buffer = send_buffer;
541 rawdata.length = send_buffer_length;
543 net_nfc_error_e result = net_nfc_client_transceive(handle,
548 if (send_buffer != NULL)
549 _net_nfc_util_free_mem(send_buffer);
555 net_nfc_error_e net_nfc_client_mifare_write_page(
556 net_nfc_target_handle_h handle,
562 net_nfc_target_info_s* target_info = NULL;
564 uint8_t* send_buffer = NULL;
566 uint32_t send_buffer_length = 0;
569 return NET_NFC_NULL_PARAMETER;
571 if (net_nfc_client_tag_is_connected() == FALSE)
572 return NET_NFC_OPERATION_FAIL;
574 target_info = net_nfc_client_tag_get_client_target_info();
576 if (target_info == NULL)
577 return NET_NFC_NOT_INITIALIZED;
579 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
580 target_info->devType > NET_NFC_MIFARE_ULTRA_PICC)
582 DEBUG_CLIENT_MSG("not a MIFARE TAG = [%d] ",
583 target_info->devType);
584 return NET_NFC_NOT_SUPPORTED;
587 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC)
590 return NET_NFC_OUT_OF_BOUND;
593 if (target_info->devType == NET_NFC_MIFARE_ULTRA_PICC)
595 if (((data_s*)data)->length > MIFARE_PAGE_SIZE)
597 uint8_t* temp = NULL;
599 /* cmd + addr + page */
600 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
602 _net_nfc_util_alloc_mem(send_buffer,
603 send_buffer_length * sizeof(uint8_t));
604 if (send_buffer == NULL)
605 return NET_NFC_ALLOC_FAIL;
609 *temp = MIFARE_CMD_WRITE_PAGE;
616 ((data_s*)data)->buffer,
621 uint8_t* temp = NULL;
623 /* cmd + addr + page */
624 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
626 _net_nfc_util_alloc_mem(send_buffer,
627 send_buffer_length * sizeof(uint8_t));
628 if (send_buffer == NULL)
629 return NET_NFC_ALLOC_FAIL;
633 *temp = MIFARE_CMD_WRITE_PAGE;
640 ((data_s*)data)->buffer,
641 ((data_s*)data)->length);
647 if (((data_s*)data)->length > MIFARE_PAGE_SIZE)
649 uint8_t* temp = NULL;
651 /* cmd + addr + page */
652 send_buffer_length = 1 + 1 + MIFARE_PAGE_SIZE;
654 _net_nfc_util_alloc_mem(send_buffer,
655 send_buffer_length * sizeof(uint8_t));
656 if (send_buffer == NULL)
657 return NET_NFC_ALLOC_FAIL;
661 *temp = MIFARE_CMD_WRITE_BLOCK;
668 ((data_s*)data)->buffer,
674 uint8_t* temp = NULL;
676 /* cmd + addr + page */
677 send_buffer_length = 1 + 1 + ((data_s*)data)->length;
679 _net_nfc_util_alloc_mem(send_buffer,
680 send_buffer_length * sizeof(uint8_t));
681 if (send_buffer == NULL)
682 return NET_NFC_ALLOC_FAIL;
686 *temp = MIFARE_CMD_WRITE_BLOCK;
693 ((data_s*)data)->buffer,
694 ((data_s*)data)->length);
702 rawdata.buffer = send_buffer;
703 rawdata.length = send_buffer_length;
705 net_nfc_error_e result = net_nfc_client_transceive(handle,
710 if (send_buffer != NULL)
711 _net_nfc_util_free_mem(send_buffer);
717 net_nfc_error_e net_nfc_client_mifare_increment(net_nfc_target_handle_h handle,
723 net_nfc_target_info_s* target_info = NULL;
727 uint8_t send_buffer[8] = { 0 };
731 return NET_NFC_NULL_PARAMETER;
733 if (net_nfc_client_tag_is_connected() == FALSE)
734 return NET_NFC_OPERATION_FAIL;
736 target_info = net_nfc_client_tag_get_client_target_info();
740 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
741 target_info->devType > NET_NFC_MIFARE_4K_PICC)
744 "not a MIFARE Classic TAG = [%d]",
745 target_info->devType);
746 return NET_NFC_NOT_SUPPORTED;
751 send_buffer[0] = MIFARE_CMD_INCREMENT;
752 send_buffer[1] = addr;
755 little value of byte array will be saved first in memory */
756 send_buffer[5] = (value & 0xFF000000) >> 24;
757 send_buffer[4] = (value & 0x00FF0000) >> 16;
758 send_buffer[3] = (value & 0x0000FF00) >> 8;
759 send_buffer[2] = (value & 0x000000FF);
761 net_nfc_util_compute_CRC(CRC_A, send_buffer, 8);
763 rawdata.buffer = send_buffer;
766 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
771 net_nfc_error_e net_nfc_client_mifare_decrement(net_nfc_target_handle_h handle,
777 net_nfc_target_info_s* target_info = NULL;
781 uint8_t send_buffer[8] = { 0 };
784 return NET_NFC_NULL_PARAMETER;
786 if (net_nfc_client_tag_is_connected() == FALSE)
787 return NET_NFC_OPERATION_FAIL;
789 target_info = net_nfc_client_tag_get_client_target_info();
794 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
795 target_info->devType > NET_NFC_MIFARE_4K_PICC)
797 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d] ",
798 target_info->devType);
799 return NET_NFC_NOT_SUPPORTED;
803 send_buffer[0] = MIFARE_CMD_DECREMENT;
804 send_buffer[1] = addr;
807 little value of byte array will be saved first in memory */
808 send_buffer[5] = (value & 0xFF000000) >> 24;
809 send_buffer[4] = (value & 0x00FF0000) >> 16;
810 send_buffer[3] = (value & 0x0000FF00) >> 8;
811 send_buffer[2] = (value & 0x000000FF);
813 net_nfc_util_compute_CRC(CRC_A, send_buffer, 8);
815 DEBUG_MSG_PRINT_BUFFER(send_buffer, 8);
817 rawdata.buffer = send_buffer;
820 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
825 net_nfc_error_e net_nfc_client_mifare_transfer(net_nfc_target_handle_h handle,
830 net_nfc_target_info_s* target_info = NULL;
834 uint8_t send_buffer[4] = { 0 };
837 return NET_NFC_NULL_PARAMETER;
839 if (net_nfc_client_tag_is_connected() == FALSE)
840 return NET_NFC_OPERATION_FAIL;
842 target_info = net_nfc_client_tag_get_client_target_info();
846 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
847 target_info->devType > NET_NFC_MIFARE_4K_PICC)
849 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d]",
850 target_info->devType);
851 return NET_NFC_NOT_SUPPORTED;
855 send_buffer[0] = MIFARE_CMD_TRANSFER;
856 send_buffer[1] = addr;
858 net_nfc_util_compute_CRC(CRC_A, send_buffer, 4);
860 rawdata.buffer = send_buffer;
863 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
868 net_nfc_error_e net_nfc_client_mifare_restore(net_nfc_target_handle_h handle,
873 net_nfc_target_info_s* target_info = NULL;
877 uint8_t send_buffer[4] = { 0 };
880 return NET_NFC_NULL_PARAMETER;
882 if (net_nfc_client_tag_is_connected() == FALSE)
883 return NET_NFC_OPERATION_FAIL;
885 target_info = net_nfc_client_tag_get_client_target_info();
889 if (target_info->devType < NET_NFC_MIFARE_MINI_PICC ||
890 target_info->devType > NET_NFC_MIFARE_4K_PICC)
892 DEBUG_CLIENT_MSG("not a MIFARE Classic TAG = [%d]",
893 target_info->devType);
894 return NET_NFC_NOT_SUPPORTED;
898 send_buffer[0] = MIFARE_CMD_RESTORE;
899 send_buffer[1] = addr;
901 net_nfc_util_compute_CRC(CRC_A, send_buffer, 4);
903 rawdata.buffer = send_buffer;
906 return net_nfc_client_transceive(handle, (data_h)&rawdata, callback,
911 net_nfc_error_e net_nfc_client_mifare_create_default_key(data_h* key)
914 return NET_NFC_NULL_PARAMETER;
916 return net_nfc_create_data(key, default_key, 6);
920 net_nfc_error_e net_nfc_client_mifare_create_application_directory_key(
924 return NET_NFC_NULL_PARAMETER;
926 return net_nfc_create_data(key, mad_key, 6);
930 net_nfc_error_e net_nfc_client_mifare_create_net_nfc_forum_key(data_h* key)
933 return NET_NFC_NULL_PARAMETER;
935 return net_nfc_create_data(key, net_nfc_forum_key, 6);