具有固定UID的Android NFC卡仿真

时间:2014-11-10 19:55:05

标签: 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);
}

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

  

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

有谁知道如何实现它?

由于

1 个答案:

答案 0 :(得分:2)

要知道的一件重要事情是UID转移到nfc协议的非常低的水平。这意味着它由nfc固件独立完成,而不是在Android操作系统中完成。 我们在NFCGate项目中遇到了同样的问题,并通过将UID与NFC_SetConfig直接写入芯片固件,找到了与Nexus4 / 5和其他芯片一样的Broadcom BCM20793芯片的解决方案。

您可以看到工作版in our repository on 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);

我们的测试显示,android有时会将UID设置为随机(如果我没记错的话,长度= 0),所以你需要找到一个好的地方来设置你需要它或做类似我们做的事情并拦截NFC_SetConfig从android调用来重新设置我们自己的UID。

相关问题