---
name: "mifare_classic"
section: "3"
platform: "linux"
package: "libfreefare-doc"
version: "0.4.0-2.3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/mifare_classic"
---

# mifare\_classic(3)

Mifare Classic Manipulation Functions

## NAME

**mifare\_classic\_connect**, **mifare\_classic\_disconnect**, **mifare\_classic\_authenticate**, **mifare\_classic\_read**, **mifare\_classic\_init\_value**, **mifare\_classic\_read\_value**, **mifare\_classic\_write**, **mifare\_classic\_increment**, **mifare\_classic\_decrement**, **mifare\_classic\_restore**, **mifare\_classic\_transfer**, **mifare\_classic\_get\_trailer\_block\_permission**, **mifare\_classic\_get\_data\_block\_permission**, **mifare\_classic\_format\_sector**, **mifare\_classic\_trailer\_block**, **mifare\_classic\_block\_sector**, **mifare\_classic\_sector\_first\_block**, **mifare\_classic\_sector\_block\_count**, **mifare\_classic\_sector\_last\_block** – Mifare Classic Manipulation Functions

## LIBRARY

Mifare card manipulation library (libfreefare, -lfreefare)

## SYNOPSIS

**#include \<freefare.h\>**

*int*\

**mifare\_classic\_connect**(*MifareTag tag*);

*int*\

**mifare\_classic\_disconnect**(*MifareTag tag*);

*int*\

**mifare\_classic\_authenticate**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const MifareClassicKey key*, *const MifareClassicKeyType key\_type*);

*int*\

**mifare\_classic\_read**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *MifareClassicBlock \*data*);

*int*\

**mifare\_classic\_init\_value**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const int32\_t value*, *const MifareClassicBlockNumber adr*);

*int*\

**mifare\_classic\_read\_value**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *int32\_t \*value*, *MifareClassicBlockNumber \*adr*);

*int*\

**mifare\_classic\_write**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const MifareClassicBlock data*);

*int*\

**mifare\_classic\_increment**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const uint32\_t amount*);

*int*\

**mifare\_classic\_decrement**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const uint32\_t amount*);

*int*\

**mifare\_classic\_restore**(*MifareTag tag*, *const MifareClassicBlockNumber block*);

*int*\

**mifare\_classic\_transfer**(*MifareTag tag*, *const MifareClassicBlockNumber block*);

*int*\

**mifare\_classic\_get\_trailer\_block\_permission**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const uint16\_t permission*, *const MifareClassicKeyType key\_type*);

*int*\

**mifare\_classic\_get\_data\_block\_permission**(*MifareTag tag*, *const MifareClassicBlockNumber block*, *const unsigned char permission*, *const MifareClassicKeyType key\_type*);

*int*\

**mifare\_classic\_format\_sector**(*MifareTag tag*, *const MifareClassicSectorNumber sector*);

*void*\

**mifare\_classic\_trailer\_block**(*MifareClassicBlock \*block*, *const MifareClassicKey key\_a*, *const uint8\_t ab\_0*, *const uint8\_t ab\_1*, *const uint8\_t ab\_2*, *const uint8\_t ab\_tb*, *const uint8\_t gpb*, *const MifareClassicKey key\_b*);

*MifareClassicSectorNumber*\

**mifare\_classic\_block\_sector**(*MifareClassicBlockNumber block*);

*MifareClassicBlockNumber*\

**mifare\_classic\_sector\_first\_block**(*MifareClassicSectorNumber sector*);

*size\_t*\

**mifare\_classic\_sector\_block\_count**(*MifareClassicSectorNumber sector*);

*MifareClassicBlockNumber*\

**mifare\_classic\_sector\_last\_block**(*MifareClassicSectorNumber sector*);

## DESCRIPTION

The **mifare\_classic\_\***() set of functions allow manipulation of both Mifare Classic 1k and Mifare Classic 4k cards.

A given *tag* is activated using **mifare\_classic\_connect**(), deactivation is performed with **mifare\_classic\_disconnect**().

After a successful connection, an authentication for a *block* using a *key* of type *key\_type* (either *MFC\_KEY\_A* or *MFC\_KEY\_B*) using **mifare\_classic\_authenticate**() is required for further operation.

Once successfuly authenticated, *data* of a *block* can be read using **mifare\_classic\_read**() and written using **mifare\_classic\_write**().

Value-blocks can be easily accessed using the **mifare\_classic\_read\_value**() and **mifare\_classic\_init\_value**() functions. Additional functions are available for such *blocks*: **mifare\_classic\_increment**() and **mifare\_classic\_decrement**() increment or decrement the value of the provided *block* by *amount* and store the result in the target's internal data register.  The value in this register can also be loaded with the value from another *block* using **mifare\_classic\_restore**(). Writing back the value of the target's internal data register to a *block* is requested using **mifare\_classic\_transfer**().

Permissions for a data *block* can be fetched using **mifare\_classic\_get\_data\_block\_permission**(). The access *permission* to be checkf for key *key\_type* is one of *MCAB\_R*, *MCAB\_W*, *MCAB\_I* *or* *MCAB\_D*; respectively for read, write, increment and decrement permissions.

**mifare\_classic\_get\_trailer\_block\_permission**() acts like **mifare\_classic\_get\_data\_block\_permission**() but the available *permissions* are *MCAB\_READ\_KEYA*, *MCAB\_READ\_KEYB*, *MCAB\_READ\_ACCESS\_BITS*, *MCAB\_WRITE\_ACCESS\_BITS*, *MCAB\_READ\_KEYB* *and* *MCAB\_WRITE\_KEYB*.

A whole sector can be reset to factory defaults using **mifare\_classic\_format\_sector**().

The **mifare\_classic\_trailer\_block**() is a convenience function for building a trailer block *block* given a A key *key\_a*; access bits for the blocks of the sector *ab\_0*, *ab\_1* *and* *ab\_2*; and a B key *key\_b*.

The **mifare\_classic\_block\_sector**(), function returns the number of the sector holding *block*.

The **mifare\_classic\_sector\_first\_block**(), **mifare\_classic\_sector\_block\_count**(), **mifare\_classic\_sector\_last\_block**() or the complement of the **mifare\_classic\_block\_sector**() function and return various block-level information about the provided *sector*.

## RETURN VALUES

Unless stated otherwise, all functions return a value greater than or equal to *0* on success or *-1* on failure.

## SEE ALSO

[freefare(3)](/freefare/3.md), [mad(3)](/mad/3.md)

## AUTHORS

Romain Tartiere ⟨romain@blogreen.org⟩ Romuald Conty ⟨romuald@libnfc.org⟩
