本节主要讨论NTAG I2C Demo这个APP里的认证机制(安全机制)

文中会结合一些NXP NFC芯片DataSheet中的内容,但会以尽可能简单的语言描述

首先看一下这句代码

mAuthStatus是一个int型的变量,以private static修饰,足见其安全程度之高

这个变量的初始化是在这个地方,当然一开始初始化为Disabled ,也就是默认你是没有权限的

接下来看一下launchDemo的实现

private void launchDemo(String currTab) {

if(mAuthStatus == AuthStatus.Authenticated.getValue()) {

demo.Auth(mPassword, AuthStatus.Protected_RW.getValue());

}

// ===========================================================================

// LED Test

// ===========================================================================

if (currTab.equalsIgnoreCase("leds")) {

// This demo is available even if the product is protected

// as long as the SRAM is unprotected

if(mAuthStatus == AuthStatus.Disabled.getValue()

|| mAuthStatus == AuthStatus.Unprotected.getValue()

|| mAuthStatus == AuthStatus.Authenticated.getValue()

|| mAuthStatus == AuthStatus.Protected_W.getValue()

|| mAuthStatus == AuthStatus.Protected_RW.getValue() ) {

try {

// if (LedFragment.getChosen()) {

demo.LED();

} catch (Exception e) {

e.printStackTrace();

LedFragment.setAnswer(getString(R.string.Tag_lost));

}

} else {

Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected",

Toast.LENGTH_LONG).show();

showAuthDialog();

}

}

// ===========================================================================

// NDEF Demo

// ===========================================================================

if (currTab.equalsIgnoreCase("ndef")) {

// This demo is only available when the tag is not protected

if(mAuthStatus == AuthStatus.Disabled.getValue()

|| mAuthStatus == AuthStatus.Unprotected.getValue()

|| mAuthStatus == AuthStatus.Authenticated.getValue()) {

try {

demo.NDEF();

} catch (Exception e) {

// NdefFragment.setAnswer(getString(R.string.Tag_lost));

}

} else {

Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected",

Toast.LENGTH_LONG).show();

showAuthDialog();

}

}

// ===========================================================================

// Config

// ===========================================================================

if (currTab.equalsIgnoreCase("config")) {

}

// ===========================================================================

// Speedtest

// ===========================================================================

if (currTab.equalsIgnoreCase("ntag_rf")) {

try {

// SRAM Test

if ((SpeedTestFragment.isSRamEnabled() == true)) {

// This demo is available even if the product is protected

// as long as the SRAM is unprotected

if(mAuthStatus == AuthStatus.Disabled.getValue()

|| mAuthStatus == AuthStatus.Unprotected.getValue()

|| mAuthStatus == AuthStatus.Authenticated.getValue()

|| mAuthStatus == AuthStatus.Protected_W.getValue()

|| mAuthStatus == AuthStatus.Protected_RW.getValue()) {

demo.SRAMSpeedtest();

} else {

Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected",

Toast.LENGTH_LONG).show();

showAuthDialog();

}

}

// EEPROM Test

if ((SpeedTestFragment.isSRamEnabled() == false)) {

// This demo is only available when the tag is not protected

if(mAuthStatus == AuthStatus.Disabled.getValue()

|| mAuthStatus == AuthStatus.Unprotected.getValue()

|| mAuthStatus == AuthStatus.Authenticated.getValue()) {

demo.EEPROMSpeedtest();

} else {

Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected",

Toast.LENGTH_LONG).show();

showAuthDialog();

}

} // end if eeprom test

} catch (Exception e) {

SpeedTestFragment.setAnswer(getString(R.string.Tag_lost));

e.printStackTrace();

}

}

}

先看一下传给launchDemo函数的参数,实参是tabID,形参是currTab,也就是当前你选择的是哪个Tab

先查看一下,当前的认证状态(也就是变量mAuthStatus的值)是否是Authenticated,如果是的话,执行demo的Auth函数

那么这个demo的Auth函数是干嘛的呢,其实就是执行一个认证的操作

你给进去一个pwd(一个byte的数组),一个当前的认证状态,这些在注释里面都有写好

我对于你的当前的每个不同认证状态,用条件语句进行判别,分类处理

1.Unprotected

这种状态下,我用protectPlus函数进行处理

我把你的pwd传进去,然后再传进去一个Capability Container的值,这个值其实就是常数0x03,表示密码存放在NXP NFC芯片某个寄存器的offset为0x03的位置,具体的函数实现过程待会儿细说

2.Authenticated

这种状态下,用unprotectPlus函数去处理,这个函数不需要任何参数

3.其他认证状态

就是这些认证状态

这些状态下,使用authenticatePlus函数进行进一步的认证,需要的参数是就是你给进去的pwd

上面提到的这些不同认证状态下的认证方式的具体实现,在另外一篇文章详细描述

https://blog.csdn.net/qq_24118527/article/details/82950796

android a20 i2c 通信,Android程序运行分析——中等复杂程度的NTAG I2C Demo为例(二)...相关推荐

  1. Android蓝牙无法通信,android.bluetooth.BluetoothSocket无法连接

    我已经尝试了其他评论中的所有建议,但都没有效果,我希望有人能帮助我.我已经为这个问题挣扎了三天了.我确信我的uuid是正确的,并且我知道清单中启用了蓝牙访问. 我正在尝试将我的android应用程序连 ...

  2. 传感器i2c与arduino连接_Arduino中进行I2C通信发送数据案例分析

    在之前的文章中,我们介绍了Arduino之间的SPI通信.今天我们将学习另一种串行通信协议:I2C(内部集成电路).比较I2C和SPI,I2C只有两条线,而SPI使用四条,I2C可以有多个主机和从机, ...

  3. android 多线程间通信,android实现线程间通信的四种常见方式

    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递conten ...

  4. android udp 广播通信,Android开启热点进行UDP通信中的坑

    1.写在前面: 2018年的第一篇文章,最近在使用UDP协议进行硬件通信,大家都知道UDP协议通信必须在同一个局域网内,但是每个用户家的wifi都是不一样的,硬件设备是无法只值连接到用户家的wifi的 ...

  5. 多个android手机客户端通信,android中利用Socket实现手机客户端与PC端进行通信

    服务器端: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; impo ...

  6. Android ADT插件更新后程序运行时抛出java.lang.VerifyError异常解决办法

    当我把Eclipse中的 Android ADT插件从21.1.0更新到22.0.1之后,安装后运行程序抛出java.lang.VerifyError异常. 经过调查,终于找到了一个有效的解决办法: ...

  7. android devik进程,suckit后门程序的分析 (二)

    这篇文章为我早期的时候发表的文章,为什么我要写这个呢?因为这个程序写得太精妙了,我不得不佩服他的隐藏性,非常先进.看看我写的就知道他的精妙之处了! 关于这场攻击与反攻击的文章我随后几天撰写.精彩不容错 ...

  8. android与usb通信,android USB通信

    USB模式 支持USB accessory模式和USB host模式.通过这两种模式,android支持各种各样的USB 外围设备和USB 配件(硬件需要实现android配件协议). USB acc ...

  9. 【朝花夕拾】Android跨进程通信总结篇

    前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...

  10. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10256379.html],谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面 ...

最新文章

  1. MacOS系统下简单安装以及配置MongoDB数据库(一)
  2. Python 入门 Day4
  3. mysql5.6视频_网易视频云:MySQL 5.6 5.7最优配置文件模板
  4. QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决
  5. YurunOAuthLogin v2.0.2,第三方 OAuth2 授权一把梭
  6. 【Java】说明变量作用域的示例程序
  7. [置顶] 金山云存储解决企业办公难题
  8. 初入WebService
  9. 如何自动调整代码格式 - vim /Visual Studio/ Source Insight...
  10. 安全视角下的CAN协议分析
  11. 计算机数学公式画爱心教程,几何画板如何绘制爱心?几何画板爱心函数教程
  12. oracle授权怎么收费,Oracle数据库如何授权收费(Database Licensing)
  13. 英语口语收集(十三)
  14. excel概率密度函数公式_使用Excel绘制F分布概率密度函数图表
  15. CI 与 CD 有什么区别
  16. Java核心技术(进阶)
  17. java中文分词的简单实现
  18. natapp 配置微信小程序开发需要的网络环境
  19. php 分数大于80 小于90优,“ 90 分改成 80 分”学生期末成绩须“正态分布”?不必搞一刀切...
  20. 基于内容的图片检索CBIR(Content Based Image Retrieval)简介

热门文章

  1. 把握linux内核设计思想系列【转】
  2. 命令行下对apk签名
  3. Yii框架官方指南系列53——专题:使用命令行生成代码(已废弃)
  4. Processing的条件式
  5. Xamarin.Forms 仿照京东搜索记录控件
  6. 递归系列——数组和对象的相关递归
  7. Linux ssh服务开启秘钥和密码认证
  8. [DSF] Devices Syndication Foundation Architecture V1
  9. Android 游戏开发中横竖屏切换问题
  10. 推行ISO9000的作用及相关知识