Skip to main content

Crate freefare_sys

Crate freefare_sys 

Source
Expand description

§freefare-sys

Crates.io Docs.rs

Raw FFI bindings to the public libfreefare C API.

This crate intentionally stays low level. It exposes the upstream ABI for use by higher-level Rust wrappers and NFC tooling, and does not add safe abstractions over tag access, authentication, or memory management.

§What changed in 1.0.0

Version 1.0.0 is a breaking cleanup release:

  • The binding surface now tracks the public freefare.h API instead of exposing generator artifacts and non-header symbols.
  • Opaque native types such as MifareTag, MifareDESFireKey, Mad, and MifareDESFireAID are no longer represented as fake Rust structs with internals.
  • Old Struct_* and Enum_* bindgen names were replaced with stable Rust-facing FFI names.
  • Unsound Default implementations based on mem::zeroed() were removed.
  • Modern Rust FFI types are used throughout (c_char, c_int, c_void, u8, u16, u32, usize, isize).
  • The crate now ships smoke tests for layout assumptions and native linking.

§Native dependencies

You need both libfreefare and libnfc installed on the system.

§macOS with Homebrew

brew install libfreefare libnfc

§Debian or Ubuntu

sudo apt install libfreefare-dev libnfc-dev

§Linking

build.rs links against freefare. The nfc-sys dependency links libnfc.

By default it checks common Homebrew and Linux library directories for libfreefare. If your libfreefare installation lives elsewhere, set either the preferred LIBFREEFARE_LIB_DIR variable or the legacy LIBFREEFARE_PATH variable:

export LIBFREEFARE_LIB_DIR=/custom/prefix/lib

§Usage

[dependencies]
freefare-sys = "1"
libc = "0.2"
nfc-sys = "1"

§Example

use std::ffi::CStr;
use std::ptr;

fn main() {
    unsafe {
        let mut context: *mut nfc_sys::nfc_context = ptr::null_mut();
        nfc_sys::nfc_init(&mut context);
        assert!(!context.is_null());

        let device = nfc_sys::nfc_open(context, ptr::null());
        if device.is_null() {
            nfc_sys::nfc_exit(context);
            return;
        }

        let tags = freefare_sys::freefare_get_tags(device);
        if !tags.is_null() && !(*tags).is_null() {
            let tag = *tags;
            let uid = freefare_sys::freefare_get_tag_uid(tag);

            if !uid.is_null() {
                println!("tag uid: {}", CStr::from_ptr(uid).to_string_lossy());
                libc::free(uid.cast());
            }

            freefare_sys::freefare_free_tags(tags);
        }

        nfc_sys::nfc_close(device);
        nfc_sys::nfc_exit(context);
    }
}

§Safety

This crate exposes raw C bindings. Callers are responsible for:

  • Upholding all pointer validity and lifetime requirements from libfreefare.
  • Freeing memory returned by the native library with the correct native deallocator.
  • Ensuring linked libfreefare and libnfc versions are ABI-compatible with the declarations in this crate.

§Versioning

The Rust crate version follows the Rust FFI surface, not the upstream libfreefare release number. Breaking binding corrections or symbol removals may require a new major version even when the C library version is unchanged.

§License

MIT

Structs§

MadAid
MifareDESFireDF
MifareDESFireFileSettings
MifareDESFireRecordFileSettings
MifareDESFireStandardFileSettings
MifareDESFireValueFileSettings
MifareDESFireVersionComponent
MifareDESFireVersionInfo
mad
mifare_desfire_aid
mifare_desfire_key
mifare_tag

Enums§

FreefareTagType
MifareClassicKeyType
MifareDesfireFileType

Constants§

ADDITIONAL_FRAME
APPLICATION_CRYPTO_3K3DES
APPLICATION_CRYPTO_AES
APPLICATION_CRYPTO_DES
APPLICATION_NOT_FOUND
APPL_INTEGRITY_ERROR
AUTHENTICATION_ERROR
BOUNDARY_ERROR
COMMAND_ABORTED
COUNT_ERROR
CRYPTO_ERROR
C_000
C_001
C_010
C_011
C_100
C_101
C_110
C_111
C_DEFAULT
DUPLICATE_ERROR
EEPROM_ERROR
FILE_INTEGRITY_ERROR
FILE_NOT_FOUND
ILLEGAL_COMMAND_CODE
INTEGRITY_ERROR
LENGTH_ERROR
MCAB_D
MCAB_I
MCAB_R
MCAB_READ_ACCESS_BITS
MCAB_READ_KEYA
MCAB_READ_KEYB
MCAB_W
MCAB_WRITE_ACCESS_BITS
MCAB_WRITE_KEYA
MCAB_WRITE_KEYB
MDAR_DENY
MDAR_FREE
MDAR_KEY0
MDAR_KEY1
MDAR_KEY2
MDAR_KEY3
MDAR_KEY4
MDAR_KEY5
MDAR_KEY6
MDAR_KEY7
MDAR_KEY8
MDAR_KEY9
MDAR_KEY10
MDAR_KEY11
MDAR_KEY12
MDAR_KEY13
MDCM_ENCIPHERED
MDCM_MACED
MDCM_PLAIN
NO_CHANGES
NO_SUCH_KEY
OPERATION_OK
OUT_OF_EEPROM_ERROR
PARAMETER_ERROR
PERMISSION_ERROR
PICC_DISABLED_ERROR
PICC_INTEGRITY_ERROR

Statics§

mad_card_holder_aid
mad_defect_aid
mad_free_aid
mad_nfcforum_aid
mad_not_applicable_aid
mad_public_key_a
mad_reserved_aid
mifare_classic_nfcforum_public_key_a

Functions§

freefare_free_tag
freefare_free_tags
freefare_get_tag_friendly_name
freefare_get_tag_type
freefare_get_tag_uid
freefare_get_tags
freefare_perror
freefare_strerror
freefare_strerror_r
freefare_tag_new
is_mifare_ultralightc_on_reader
mad_free
mad_get_aid
mad_get_card_publisher_sector
mad_get_version
mad_new
mad_read
mad_sector_reserved
mad_set_aid
mad_set_card_publisher_sector
mad_set_version
mad_write
mdar
mdar_change_ar
mdar_read
mdar_read_write
mdar_write
mifare_application_alloc
mifare_application_find
mifare_application_free
mifare_application_read
mifare_application_write
mifare_classic_authenticate
mifare_classic_block_sector
mifare_classic_connect
mifare_classic_decrement
mifare_classic_disconnect
mifare_classic_format_sector
mifare_classic_get_data_block_permission
mifare_classic_get_trailer_block_permission
mifare_classic_increment
mifare_classic_init_value
mifare_classic_read
mifare_classic_read_value
mifare_classic_restore
mifare_classic_sector_block_count
mifare_classic_sector_first_block
mifare_classic_sector_last_block
mifare_classic_trailer_block
mifare_classic_transfer
mifare_classic_write
mifare_desfire_3des_key_new
mifare_desfire_3des_key_new_with_version
mifare_desfire_3k3des_key_new
mifare_desfire_3k3des_key_new_with_version
mifare_desfire_abort_transaction
mifare_desfire_aes_key_new
mifare_desfire_aes_key_new_with_version
mifare_desfire_aid_get_aid
mifare_desfire_aid_new
mifare_desfire_aid_new_with_mad_aid
mifare_desfire_authenticate
mifare_desfire_authenticate_aes
mifare_desfire_authenticate_iso
mifare_desfire_change_file_settings
mifare_desfire_change_key
mifare_desfire_change_key_settings
mifare_desfire_clear_record_file
mifare_desfire_commit_transaction
mifare_desfire_connect
mifare_desfire_create_application
mifare_desfire_create_application_3k3des
mifare_desfire_create_application_3k3des_iso
mifare_desfire_create_application_aes
mifare_desfire_create_application_aes_iso
mifare_desfire_create_application_iso
mifare_desfire_create_backup_data_file
mifare_desfire_create_backup_data_file_iso
mifare_desfire_create_cyclic_record_file
mifare_desfire_create_cyclic_record_file_iso
mifare_desfire_create_linear_record_file
mifare_desfire_create_linear_record_file_iso
mifare_desfire_create_std_data_file
mifare_desfire_create_std_data_file_iso
mifare_desfire_create_value_file
mifare_desfire_credit
mifare_desfire_credit_ex
mifare_desfire_debit
mifare_desfire_debit_ex
mifare_desfire_delete_application
mifare_desfire_delete_file
mifare_desfire_des_key_new
mifare_desfire_des_key_new_with_version
mifare_desfire_disconnect
mifare_desfire_format_picc
mifare_desfire_free_application_ids
mifare_desfire_free_mem
mifare_desfire_get_application_ids
mifare_desfire_get_card_uid
mifare_desfire_get_df_names
mifare_desfire_get_file_ids
mifare_desfire_get_file_settings
mifare_desfire_get_iso_file_ids
mifare_desfire_get_key_settings
mifare_desfire_get_key_version
mifare_desfire_get_value
mifare_desfire_get_value_ex
mifare_desfire_get_version
mifare_desfire_key_free
mifare_desfire_key_get_version
mifare_desfire_key_set_version
mifare_desfire_last_pcd_error
mifare_desfire_last_picc_error
mifare_desfire_limited_credit
mifare_desfire_limited_credit_ex
mifare_desfire_read_data
mifare_desfire_read_data_ex
mifare_desfire_read_records
mifare_desfire_read_records_ex
mifare_desfire_select_application
mifare_desfire_set_ats
mifare_desfire_set_configuration
mifare_desfire_set_default_key
mifare_desfire_write_data
mifare_desfire_write_data_ex
mifare_desfire_write_record
mifare_desfire_write_record_ex
mifare_ultralight_connect
mifare_ultralight_disconnect
mifare_ultralight_read
mifare_ultralight_write
mifare_ultralightc_authenticate
tlv_append
tlv_decode
tlv_encode
tlv_record_length

Type Aliases§

FreefareTag
Mad
MifareClassicBlock
MifareClassicBlockNumber
MifareClassicKey
MifareClassicSectorNumber
MifareDESFireAID
MifareDESFireKey
MifareTag
MifareUltralightPage
MifareUltralightPageNumber

Unions§

MifareDESFireFileSettingsData