Expand description
§freefare-sys
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.hAPI instead of exposing generator artifacts and non-header symbols. - Opaque native types such as
MifareTag,MifareDESFireKey,Mad, andMifareDESFireAIDare no longer represented as fake Rust structs with internals. - Old
Struct_*andEnum_*bindgen names were replaced with stable Rust-facing FFI names. - Unsound
Defaultimplementations based onmem::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
libfreefareandlibnfcversions 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
- MifareDES
FireDF - MifareDES
Fire File Settings - MifareDES
Fire Record File Settings - MifareDES
Fire Standard File Settings - MifareDES
Fire Value File Settings - MifareDES
Fire Version Component - MifareDES
Fire Version Info - mad
- mifare_
desfire_ aid - mifare_
desfire_ key - mifare_
tag
Enums§
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§
- Freefare
Tag - Mad
- Mifare
Classic Block - Mifare
Classic Block Number - Mifare
Classic Key - Mifare
Classic Sector Number - MifareDES
FireAID - MifareDES
Fire Key - Mifare
Tag - Mifare
Ultralight Page - Mifare
Ultralight Page Number