具有固定UID的Android NFC卡仿真

Jul*_*Jul 5 android nfc

我从AOSP下载了NFC部件,我正在寻找Android使用的方法来生成卡仿真使用的随机UID.我的目标是在每次与目标进行通信时修复UID而不是使用不同的UID.我在"libnfc-nci"模块中找到了包含以下内容的文件"nfa_ce_act.c":

void nfa_ce_t3t_generate_rand_nfcid (UINT8 nfcid2[NCI_RF_F_UID_LEN])
{
UINT32 rand_seed = GKI_get_tick_count ();

/* For Type-3 tag, nfcid2 starts witn 02:fe */
nfcid2[0] = 0x02;
nfcid2[1] = 0xFE;

/* The remaining 6 bytes are random */
nfcid2[2] = (UINT8) (rand_seed & 0xFF);
nfcid2[3] = (UINT8) (rand_seed>>8 & 0xFF);
rand_seed>>=(rand_seed&3);
nfcid2[4] = (UINT8) (rand_seed & 0xFF);
nfcid2[5] = (UINT8) (rand_seed>>8 & 0xFF);
rand_seed>>=(rand_seed&3);
nfcid2[6] = (UINT8) (rand_seed & 0xFF);
nfcid2[7] = (UINT8) (rand_seed>>8 & 0xFF);
}
Run Code Online (Sandbox Code Playgroud)

此方法为FeliCa标记生成UID.我无法找到ISO14443卡(MIFARE)的卡,它默认生成一个以0x08开头的UID.根据Martijn Coenen的说法,正如他在G + Post中所解释的那样,这是可能的.

对不起,我意识到很多人都想要这个,但在官方版本中这是不可能的.(你当然可以通过一些AOSP黑客来做).原因是HCE是围绕后台操作设计的.如果我们允许应用程序设置UID,则每个应用程序都可能想要设置自己的UID,并且无法解决冲突.我们希望通过HCE,NFC基础设施将转移到更高级别的协议栈进行身份验证,而不是依赖于UID(无论如何都很容易克隆). https://plus.google.com/+MartijnCoenen/posts/iX6LLoQmZLZ

有谁知道如何实现它?

谢谢

a4c*_*c8b 5

需要了解的一件重要事情是,UID 在 nfc 协议的非常低级别上传输。这意味着它是由 NFC 固件独立完成的,而不是在 Android 操作系统内完成的。我们在NFCGate项目中遇到了同样的问题,并通过将带有 NFC_SetConfig 的 UID 直接写入芯片固件中,找到了适用于 Broadcom BCM20793 芯片(例如 Nexus4/5 等中的芯片)的解决方案。

您可以在我们的 github 存储库中查看工作版本。这是一个未经测试的版本来展示其原理:

uint8_t cfg[] = {
    CFG_TYPE_UID, // config type
    3,            // uid length
    0x0A,         // uid byte 1
    0x0B,         // uid byte 2
    0x0C          // uid byte 3
};
NFC_SetConfig(sizeof(cfg), cfg);
Run Code Online (Sandbox Code Playgroud)

我们的测试显示,android有时会将UID设置回随机(如果我没记错的话,长度=0),因此您需要在需要时找到一个好地方来设置它,或者执行类似于我们所做的操作并拦截来自android的NFC_SetConfig调用重新设置我们自己的UID。