Authentication SW=6300从Android读取ePassport时出错

Authentication SW=6300从Android读取ePassport时出错,authentication,nfc,access-control,apdu,contactless-smartcard,Authentication,Nfc,Access Control,Apdu,Contactless Smartcard,我遵循国际民航组织第7版“第11部分附录D——工作示例:基本访问控制”创建了一个带有Xamarin.Android的Android应用程序,该应用程序可以从ePassport读取数据。然而,在外部验证步骤中,我从芯片上获得了6300状态码,关于该错误码的信息并不多。它太模糊了 以下是应用程序执行的步骤的日志: Tag tech list from the chip: android.nfc.tech.IsoDep, android.nfc.tech.NfcA Select AID comman

我遵循国际民航组织第7版“第11部分附录D——工作示例:基本访问控制”创建了一个带有Xamarin.Android的Android应用程序,该应用程序可以从ePassport读取数据。然而,在外部验证步骤中,我从芯片上获得了6300状态码,关于该错误码的信息并不多。它太模糊了

以下是应用程序执行的步骤的日志:

Tag tech list from the chip: android.nfc.tech.IsoDep, android.nfc.tech.NfcA

Select AID command:
00A4040C07A0000002471001

Select AID response:
9000

GET_CHALLENGE command:
0084000008

GET_CHALLENGE response:
6211B520F00565DD9000

documentNumber:
HU1234560

dateOfBirth:
920229

dateOfExpiry:
150101

keySeed SHA1(documentNumber + checkDigit + dateOfBirth + checkDigit + dateOfExpiry + checkDigit):
F3B48FDEF6A2374676C6B8892AFA58FB

kEnc SHA1(keySeed + 00000001):
9F399B0855DAD12F04FB3CB84D1F9AB3

kMac SHA1(keySeed + 00000002):
51102BA4C6A69CEF26BD45C94537B103

rndIFD:
CC95C0CD499F6306

kIFD:
39D661B07605B175E8BEF948609556F1

rndICC:
6211B520F00565DD

S:
CC95C0CD499F63066211B520F00565DD39D661B07605B175E8BEF948609556F1

eIFD(DesEdeEngine/CBC/NoPadding):
EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1D4

mIFD(DesEngine/ISO9797Alg3Mac/ISO7816d4Padding):
CED0EA4979A35978

External Authenticate command:
0082000028EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1CED0EA4979A359780028

External Authenticate response:
6300

有什么建议吗?

您的外部身份验证命令似乎有误。看起来好像您将M_IFD值复制到了错误的位置(关闭1)。因此,将E_IFD的最后一个字节切掉,并在末尾保留一个零字节:

00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28 ^^ ^^ Last byte of E_IFD missing (only 31 bytes here) <--/ | Additional zero byte here? <--/ 00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28 ^^ ^^
缺少E_IFD的最后一个字节(此处仅31个字节)您的外部身份验证命令似乎错误。看起来好像您将M_IFD值复制到了错误的位置(关闭1)。因此,将E_IFD的最后一个字节切掉,并在末尾保留一个零字节:

00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28 ^^ ^^ Last byte of E_IFD missing (only 31 bytes here) <--/ | Additional zero byte here? <--/ 00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28 ^^ ^^
E_IFD的最后一个字节丢失(这里只有31个字节)正如@Michael Roland所指出的,所有步骤和计算都是正确的,但在仔细检查MRZ(输入)后,我注意到我输入了错误的出生日期,导致状态代码=6300。因此,当输入错误时,可能会返回此状态代码


不幸的是,国际民航组织的文件不够清楚,无法说明这种情况。

正如@Michael Roland所指出的,所有步骤和计算都是正确的,但在按照建议仔细检查MRZ(输入)后,我注意到我错打了出生日期,导致状态代码=6300。因此,当输入错误时,可能会返回此状态代码



不幸的是,国际民航组织的文件不够清楚,无法说明这种情况。

原则上,编码似乎正确,但如果输入是正确的ASCII编码(或者是BCD编码?我不这么认为),我看不到定义了任何校验位。此外,我当然不知道输入是否正确。6300是认证失败时出现的一般错误(当然,正式警告)。如果您自己编写代码,则需要与已知的良好实现进行比较。Hi@MaartenBodewes,以下是包含检查数字的字符串:hu1234560009202871501010。是的,输入使用.NET的System.Text.Encoding.ASCII.GetBytes(字符串)进行编码。我的代码基于JAVA的库。我还不能确定我错过了什么=/我记得加密是用零IV进行的,但我记不起校验数字的计算。请务必指出输入的初始值(以及伪值,以防您没有注意到)SHA1散列以及MAC的输入值(以十六进制表示);这些是最有可能失败的。我将尝试通过查看实际规格(我的老朋友)和进行一些计算来刷新我的记忆。实现速度要“有趣”得多:)是的,我使用的是带零IV的DESede(8字节带零)。校验位的计算是将数据的每个数字乘以相应的乘数(7,3,1,7,3,1,…),然后将乘积之和除以10。余数为校验位。初始SHA1的输入如上所示为键速。我将开始查看速度;)原则上,编码似乎是正确的,但如果输入是正确的ASCII编码(或者是BCD编码的?我不这么认为),我看不到定义了任何校验位。此外,我当然不知道输入是否正确。6300是认证失败时出现的一般错误(当然,正式警告)。如果您自己编写代码,则需要与已知的良好实现进行比较。Hi@MaartenBodewes,以下是包含检查数字的字符串:hu1234560009202871501010。是的,输入使用.NET的System.Text.Encoding.ASCII.GetBytes(字符串)进行编码。我的代码基于JAVA的库。我还不能确定我错过了什么=/我记得加密是用零IV进行的,但我记不起校验数字的计算。请务必指出输入的初始值(以及伪值,以防您没有注意到)SHA1散列以及MAC的输入值(以十六进制表示);这些是最有可能失败的。我将尝试通过查看实际规格(我的老朋友)和进行一些计算来刷新我的记忆。实现速度要“有趣”得多:)是的,我使用的是带零IV的DESede(8字节带零)。校验位的计算是将数据的每个数字乘以相应的乘数(7,3,1,7,3,1,…),然后将乘积之和除以10。余数为校验位。初始SHA1的输入如上所示为键速。我将开始查看速度;)好眼睛,迈克尔!可能问题出在我创建APDU命令时使用的库中。我将再次测试它并检查丢失的最后一个字节。谢谢由于挑战计算是正确的,奇偶校验位不会改变任何东西。如果没有包含随机值的完整跟踪,我无法检查APDU。顺便说一句。您是否验证了文件编号和有效期与机器可用区中的文件编号和有效期匹配?我刚刚更新了问题中的跟踪。天哪,我打错了出生日期。正确的日期是1992年2月28日,而不是1992年2月29日,猜猜看!?现在可以了=数据丢失字节问题是解决方案的一部分,但真正的问题是错误的出生日期。要我为这个答案打绿色记号吗?好眼睛,迈克尔!可能问题出在我使用时使用的库中