TPM的全称是Trusted Platfrom Module ,其是一个微控制器,可以存储密匙,密码和数字证书

TPM 目前看有SPI和I2C 两种接口,其一般嵌入到主板上,主要用于低于外部软件攻击和物理偷窃,

保证信息存储的安全,目前有tpm1 和 tpm2 两个标准。

其代码的路径在drivers\char\tpm,可以看到tpm 至少是一个字符设备.

obj-$(CONFIG_TCG_ATMEL) += tpm_atmel.o

我们以atmel为例来看看如果写tpm的驱动

这是一个独立的模块,其入口函数在init_atmel

static int __init init_atmel(void)

{

int rc = 0;

void __iomem *iobase = NULL;

int have_region, region_size;

unsigned long base;

struct tpm_chip *chip;

struct tpm_atmel_priv *priv;

#常规操作,注册driver.

rc = platform_driver_register(&atml_drv);

if (rc)

return rc;

#拿到io 资源

if ((iobase = atmel_get_base_addr(&base, &region_size)) == NULL) {

rc = -ENODEV;

goto err_unreg_drv;

}

#判断io资源是否有效

have_region =

(atmel_request_region

(base, region_size, "tpm_atmel0") == NULL) ? 0 : 1;

#注册一个device,从这里看ateml这个设备,或者tpm 设备都不需要bios 来传递dsdttable,毕竟是tpm 设备不一定存在.

pdev = platform_device_register_simple("tpm_atmel", -1, NULL, 0);

if (IS_ERR(pdev)) {

rc = PTR_ERR(pdev);

goto err_rel_reg;

}

#申请社保的私有资源

priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);

if (!priv) {

rc = -ENOMEM;

goto err_unreg_dev;

}

#私有资源就是io 相关的资源

priv->iobase = iobase;

priv->base = base;

priv->have_region = have_region;

priv->region_size = region_size;

#这里是最重要的第一步,区别于一般的驱动,这里要申请一个tpm_chip 资源,其第二个参数对卡的读写的一些操作。

chip = tpmm_chip_alloc(&pdev->dev, &tpm_atmel);

if (IS_ERR(chip)) {

rc = PTR_ERR(chip);

goto err_unreg_dev;

}

dev_set_drvdata(&chip->dev, priv);

#注册一个字符设备,并添加一个sys的文件系统。到这里tpm设备就注册完毕了。

rc = tpm_chip_register(chip);

if (rc)

goto err_unreg_dev;

return 0;

}

那我们看看一个tpm 设备到底要听那些编程接口呢?

static const struct tpm_class_ops tpm_atmel = {

.recv = tpm_atml_recv,

.send = tpm_atml_send,

.cancel = tpm_atml_cancel,

.status = tpm_atml_status,

.req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL,

.req_complete_val = ATML_STATUS_DATA_AVAIL,

.req_canceled = tpm_atml_req_canceled,

};

从这里可以看到kernel 为我们提供了一个通用的接口,驱动只要填充tpm_class_ops就可以

根据这个接口,可以自己写一个不依赖硬件的tpm 模拟设备.

我们看看tpm设备具体怎么接受信息

static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)

{

struct tpm_atmel_priv *priv = dev_get_drvdata(&chip->dev);

u8 status, *hdr = buf;

u32 size;

int i;

__be32 *native_size;

/* start reading header */

if (count < 6)

return -EIO;

for (i = 0; i < 6; i++) {

#可以看到这里主要是直接读tpm的寄存器来读取信息

status = ioread8(priv->iobase + 1);

if ((status & ATML_STATUS_DATA_AVAIL) == 0) {

dev_err(&chip->dev, "error reading header\n");

return -EIO;

}

*buf++ = ioread8(priv->iobase);

}

/* size of the data received */

native_size = (__force __be32 *) (hdr + 2);

size = be32_to_cpu(*native_size);

}

static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)

{

struct tpm_atmel_priv *priv = dev_get_drvdata(&chip->dev);

int i;

dev_dbg(&chip->dev, "tpm_atml_send:\n");

for (i = 0; i < count; i++) {

dev_dbg(&chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);

#通过直接写tpm的寄存器来写信息

iowrite8(buf[i], priv->iobase);

}

return 0;

}

android 加密 tpm,TPM 设备相关推荐

  1. nb-iot链路层加密_Google为低端Android手机和IoT设备创建了更快的加密

    nb-iot链路层加密 Google谷歌 Low-resource Android phones and IoT devices don't have the processing power to ...

  2. Android加密之全盘加密(FDE)

    全盘加密 注意:搭载 Android 7.0 - 9 的设备支持全盘加密.搭载 Android 10 及更高版本的新设备必须使用文件级加密. 全盘加密是使用密钥(密钥本身也经过加密)对 Android ...

  3. Android 加密之文件加密(FBE)

    一:加密简介: 加密是使用对称加密密钥对 Android 设备上的所有用户数据进行编码的过程.设备经过加密后,所有由用户创建的数据在存入磁盘之前都会自动加密,并且所有读取操作都会在将数据返回给调用进程 ...

  4. Android加密手机

    CSDN地址: http://blog.csdn.net/magod/article/details/7928090 原文地址:http://source.android.com/tech/encry ...

  5. android 加密指定文件系统,基于android系统的加密文件系统设计

    android开放性,使其快速发展.并给人们带来便利,但也给个人信息安全带来风险, 个人私密文件面临着被窥视与窃取的风险,哈哈,特别是官员和明星尤其担心!还有商务人士. 网络爆光最多的私密文件:通讯信 ...

  6. Android系统修改硬件设备访问权限

    Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...

  7. 为什么Android Geeks购买Nexus设备

    The Galaxy S III is the highest-selling Android phone, but much of the geeky buzz is around the Nexu ...

  8. android 删除模拟器,android – 如何从avd设备中删除脱机模拟器?

    我在Android Studio中创建了几个AVD-s.他们在模拟器端口5554上启动.然后我通过android avd应用程序创建了另一个AVD,他们从端口5556开始. 现在运行一个模拟器,我从a ...

  9. 为什么在Android上的某些设备上使用相机意图捕获的图像会被旋转?

    本文翻译自:Why does an image captured using camera intent gets rotated on some devices on Android? I'm ca ...

  10. android定位地点的保存,Android获得所有存储设备位置的最佳方法

    本方式可以获得内部存储设备地址.SD卡地址.USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->存储页面的源码). 由于调用了几个被@hide的方法,所以 ...

最新文章

  1. torch view view_as
  2. caffe loss
  3. document操作例题1-延迟注册与二级菜单
  4. HTML5-canvas实例:刮刮乐游戏
  5. wpf 如何设置弹出窗口必须关闭才能打开其他软件_CAD如何打印才能不留白?原来打印图纸还有这么多技巧?...
  6. 【小白学习C++ 教程】十一、C++类中访问修饰符
  7. java请模拟出双重定时器_Java多线程基础 - osc_czmaebyq的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. windows phone7资料整理
  9. 022 - cocos creator 3D
  10. CIO必看:跨国集团采购部报表系统的建设经验分享
  11. 动态风云--互联网感言(三)
  12. 可视化图布局算法简介
  13. f1c100s 调试问题汇总
  14. 关于springboot:Spring-ContentNegotiation内容协商之使用篇一
  15. 一阶微分方程的物理意义_薛定谔方程的物理意义
  16. Calling CRDA to update world regulatory domain
  17. 心形一行python_心的解释|心的意思|汉典“心”字的基本解释
  18. BERTILO发“富”啦,来元代艺数get你的专属「招财兔」!
  19. 一种崭新的长尾分布下分类问题的通用算法|NeurIPS 2020
  20. yolo3训练人脸检测模型

热门文章

  1. 在浏览器访问不到在阿里云购买服务器的公网ip的解决历程
  2. Codeforces Round #277
  3. 四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等)
  4. 网络服务与配置管理——————6、Windows下V*N设置
  5. BSV疯狂暴涨,最大赢家竟然是…
  6. 让阿宅不再寂寞的聊天机器人
  7. Ghost11之DISK TO DISK引发的血案
  8. 如何使用快递鸟API接口查询物流轨迹信息?
  9. 第三次全国土地调查业务培训考试试题分析
  10. RGB三基色LED实验