You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FreeFareTagInternal.cpp 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // Created by robin on 6/19/16.
  3. //
  4. #include <sstream>
  5. #include <map>
  6. #include "FreeFareTagInternal.h"
  7. namespace LibNfc
  8. {
  9. namespace FreeFare
  10. {
  11. FreeFareTagInternal::FreeFareTagInternal(FreefareTag tag)
  12. : _tag(tag)
  13. {
  14. _type = freefare_get_tag_type(tag);
  15. _uid = freefare_get_tag_uid(tag);
  16. }
  17. FreeFareTagInternal::~FreeFareTagInternal()
  18. {
  19. freefare_free_tag(_tag);
  20. }
  21. LibNfc::Utils::ResultBool FreeFareTagInternal::authenticate(int sector, std::string key, int keyType)
  22. {
  23. if (mifare_classic_connect(_tag) != 0) {
  24. return LibNfc::Utils::ResultBool::error("Failed to connect to MIFARE tag");
  25. }
  26. int block = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector);
  27. if (mifare_classic_authenticate(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)key.c_str(),
  28. (MifareClassicKeyType)keyType) != 0) {
  29. return LibNfc::Utils::ResultBool::error("Failed to authenticate to MIFARE tag");
  30. }
  31. mifare_classic_disconnect(_tag);
  32. return LibNfc::Utils::ResultBool::ok(true);
  33. }
  34. LibNfc::Utils::ResultString FreeFareTagInternal::readBlock(int sector, int block, std::string key, int keyType)
  35. {
  36. if (mifare_classic_connect(_tag) != 0) {
  37. return LibNfc::Utils::ResultString::error("Failed to connect to MIFARE tag");
  38. }
  39. block = mifare_classic_sector_first_block((MifareClassicBlockNumber)sector) + block;
  40. if (mifare_classic_authenticate(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)key.c_str(),
  41. (MifareClassicKeyType)keyType) != 0) {
  42. return LibNfc::Utils::ResultString::error("Failed to authenticate to MIFARE tag");
  43. }
  44. MifareClassicBlock data;
  45. if (mifare_classic_read(_tag, (MifareClassicBlockNumber)block, &data)) {
  46. return LibNfc::Utils::ResultString::error("Failed to read MIFARE tag data");
  47. }
  48. mifare_classic_disconnect(_tag);
  49. return LibNfc::Utils::ResultString::ok(std::string((const char*)data, sizeof(data)));
  50. }
  51. LibNfc::Utils::ResultBool FreeFareTagInternal::writeBlock(int sector, int block, std::string key, int keyType, const std::string &data)
  52. {
  53. if (mifare_classic_connect(_tag) != 0) {
  54. return LibNfc::Utils::ResultBool::error("Failed to connect to MIFARE tag");
  55. }
  56. block = mifare_classic_sector_first_block((MifareClassicBlockNumber)sector) + block;
  57. if (mifare_classic_authenticate(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)key.c_str(),
  58. (MifareClassicKeyType)keyType) != 0) {
  59. return LibNfc::Utils::ResultBool::error("Failed to authenticate to MIFARE tag");
  60. }
  61. if (mifare_classic_write(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)data.c_str())) {
  62. return LibNfc::Utils::ResultBool::error("Failed to write data to MIFARE tag");
  63. }
  64. mifare_classic_disconnect(_tag);
  65. return LibNfc::Utils::ResultBool::ok(true);
  66. }
  67. const freefare_tag *FreeFareTagInternal::getTag() const
  68. {
  69. return _tag;
  70. }
  71. int FreeFareTagInternal::getFirstBlock(int sector) const
  72. {
  73. return mifare_classic_sector_first_block(sector);
  74. }
  75. int FreeFareTagInternal::getLastBlock(int sector) const
  76. {
  77. return mifare_classic_sector_last_block(sector);
  78. }
  79. int FreeFareTagInternal::getSectorBlockCount(int sector)
  80. {
  81. return mifare_classic_sector_block_count(sector);
  82. }
  83. freefare_tag_type FreeFareTagInternal::getType() const
  84. {
  85. return _type;
  86. }
  87. const std::string &FreeFareTagInternal::getUid() const
  88. {
  89. return _uid;
  90. }
  91. }; // FreeFare
  92. }; // LibNfc