diff --git a/src/anolisos-tss.md b/src/anolisos-tss.md index 29af3da2ed234d06e7773376027b601e1d30d850..03958a746dc92c112797d5ed3bbd3bffd5cef5fb 100644 --- a/src/anolisos-tss.md +++ b/src/anolisos-tss.md @@ -1,22 +1,20 @@ -# TSS概述 +# 可信软件栈概述 -TPM 软件栈 (TSS) 是一种软件规范,提供用于访问 TPM 的标准 API。 应用程序开发人员可以使用此软件规范来更好地使用TPM和开发基于TPM的应用程序,以实现更防篡改的效果等。 - -TSS 工作组的目的是为希望使用 TPM 的应用程序供应商提供一组标准 API。 该小组致力于制定一个中立的规范,该规范将提供硬件差异的抽象,以便应用程序供应商可以编写无论使用什么硬件、操作系统或环境都可以工作的应用程序。 TSS 还旨在为应用程序提供与本地或远程 TPM 对话的方法。 +TPM 软件栈 (TSS) 是一种软件规范,提供用于访问 TPM 的标准 API。 应用程序开发人员可以使用此软件规范来更好地使用TPM和开发基于TPM的应用程序。 # 各个语言的TPM TSS软件栈现状 TPM的软件栈非常繁荣,涉及到多个语言以及多个开源项目。以下表格仅列出部分主流开发语言(C/Go/Java/Python/Rust)的主流TPM TSS软件栈现状。 -TSS项目 | 开发语言 | 对TPM1.2/TPM2.0的支持情况 | 简介与现状 - :-------: | :-------: | :-------: | :-------: - [tpm2-tss](https://github.com/tpm2-software/tpm2-tss) | C | 支持TPM 2.0 | 基于TCG标准实现的TPM2软件栈;包括FAPI、ESAPI、SAPI、MU、TCTI多层APIs, 在多个主流OS发行版本中被集成,用户量多,基于该开源项目开发的TPM知名项目有tpm2-tools和tpm2-abrmd等 -[IBM's TPM 2.0 TSS](https://sourceforge.net/projects/ibmtpm20tss/) | C | 支持TPM 1.2和TPM 2.0 | 在功能上等于但在API上不兼容TCG标准的ESAPI、SAPI、TCTI等API,用户相比于tpm2-tss少很多。 -[go-tpm](https://github.com/google/go-tpm) | Go | 支持TPM 1.2和TPM 2.0 | Google开源的Go语言的TSS软件栈项目,提供[legacy APIs](https://pkg.go.dev/github.com/google/go-tpm@v0.9.0/legacy/tpm2#section-sourcefiles)和与TPM2.0 APIs 1:1映射的[Direct APIs](https://pkg.go.dev/github.com/google/go-tpm@v0.9.0/tpm2#pkg-overview), 这些APIs没有完整实现TPM 1.2/2.0的整个规范。 -[go-tpm2](https://github.com/canonical/go-tpm2) | Go | 支持TPM 2.0 | canonical实现的用于与TPM 2.0交互的Go库,没有google/go-tpm活跃,且采用更加严格的LGPL3.0 license -[JSR 321](https://jcp.org/en/jsr/detail?id=321) | Java | 支持TPM 1.2 | JSR 321是基于Java的可信计算API标准规范,由[TPM/J](https://sourceforge.net/projects/tpmj/)和[IAIK/OpenTC](https://trustedjava.sourceforge.net/index.php?item=jtss/about)两个Java TPM软件栈开源项目共同发起并在2011年被JCP接受,但因为10年来没有更新后又被撤销。且该标准不支持TPM 2.0 -[tpm2-pytss](https://github.com/tpm2-software/tpm2-pytss) | Python | 支持TPM 2.0 | pytss在tpm2-tss上实现的wrapper,便于python用户较好地使用tpm2-tss软件栈开发基于TPM 2.0的Python应用程序 -[rust-tss-esapi](https://github.com/parallaxsecond/rust-tss-esapi) | Rust | 支持TPM 2.0 | rust-tss-esapi是基于tpm2-tss的ESAPI开发的wrapper,便于RUST用户较好地使用tpm2-tss软件栈开发基于TPM 2.0的RUST应用程序。包括Keylime在内的一些TPM知名开源项目都是该项目的使用者。 +TSS项目 | 主要贡献者/企业 | 开发语言 | 对TPM1.2/TPM2.0的支持情况 | 简介与现状 + :-------: | :-------: | :-------: | :-------: | :-------: + [tpm2-tss](https://github.com/tpm2-software/tpm2-tss) | Intel | C | 支持TPM 2.0 | 基于TCG标准实现的TPM2软件栈;包括FAPI、ESAPI、SAPI、MU、TCTI多层APIs, 在多个主流OS发行版本中被集成,用户量多,基于该开源项目开发的TPM知名项目有tpm2-tools和tpm2-abrmd等 +[IBM's TPM 2.0 TSS](https://sourceforge.net/projects/ibmtpm20tss/) | IBM | C | 支持TPM 1.2和TPM 2.0 | 在功能上等于但在API上不兼容TCG标准的ESAPI、SAPI、TCTI等API,用户相比于tpm2-tss少很多。 +[go-tpm](https://github.com/google/go-tpm) | Google | Go | 支持TPM 1.2和TPM 2.0 | Google开源的Go语言的TSS软件栈项目,提供[legacy APIs](https://pkg.go.dev/github.com/google/go-tpm@v0.9.0/legacy/tpm2#section-sourcefiles)和与TPM2.0 APIs 1:1映射的[Direct APIs](https://pkg.go.dev/github.com/google/go-tpm@v0.9.0/tpm2#pkg-overview), 这些APIs没有完整实现TPM 1.2/2.0的整个规范。 +[go-tpm2](https://github.com/canonical/go-tpm2) | canonical | Go | 支持TPM 2.0 | canonical实现的用于与TPM 2.0交互的Go库,没有google/go-tpm活跃,且采用更加严格的LGPL3.0 license +[JSR 321](https://jcp.org/en/jsr/detail?id=321) | MIT | Java | 支持TPM 1.2 | JSR 321是基于Java的可信计算API标准规范,由[TPM/J](https://sourceforge.net/projects/tpmj/)和[IAIK/OpenTC](https://trustedjava.sourceforge.net/index.php?item=jtss/about)两个Java TPM软件栈开源项目共同发起并在2011年被JCP接受,但因为10年来没有更新后又被撤销。且该标准不支持TPM 2.0 +[tpm2-pytss](https://github.com/tpm2-software/tpm2-pytss) | Intel | Python | 支持TPM 2.0 | pytss在tpm2-tss上实现的wrapper,便于python用户较好地使用tpm2-tss软件栈开发基于TPM 2.0的Python应用程序 +[rust-tss-esapi](https://github.com/parallaxsecond/rust-tss-esapi) | Arm | Rust | 支持TPM 2.0 | rust-tss-esapi是基于tpm2-tss的ESAPI开发的wrapper,便于RUST用户较好地使用tpm2-tss软件栈开发基于TPM 2.0的RUST应用程序。包括Keylime在内的一些TPM知名开源项目都是该项目的使用者。 # 龙蜥社区在TPM TSS软件栈的贡献 @@ -49,15 +47,15 @@ TSS项目 | 开发语言 | 对TPM1.2/TPM2.0的支持情况 | 简介与现状 # tpm2-tss架构、开发接口和开发示例 ## tpm2-tss架构 -TSS包含以下由高到低的几层软件:FAPI,ESAPI,SAPI,TCTI(TPM Command Transmission Interface, TPM命令传输接口),TAB(TPM Access Broker,TPM访问代理),RM(Resource Manager),和设备驱动。 -- 大多数的用户层引用程序基于FAPI开发就可以了,因为FAPI实现了TPM百分之八十的常用应用场景。使用这一层开发应用就像是使用JAVA,C#等高级语言开发应用一样方便。FAPI对应的库为`libtss2-fapi`,对应的标准为[TCG Feature API (FAPI) Specification,TCG TSS 2.0 JSON Data Types and Policy Language Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_JSON_Policy_v0p7_r08_pub.pdf)。 -- 往下一层是ESAPI,它需要你对TPM了解很深,它实现了TPM2命令的1:1映射,但是同时提供了会话管理以及加解密的辅助功能。这有点像使用C++开发应用程序。ESAPI对应的库为libtss-esys +tpm2-tss包含以下由高到低的几层软件:FAPI,ESAPI,SAPI,TCTI(TPM Command Transmission Interface, TPM命令传输接口)等,在tpm2-tss和TPM 2.0之间还有TAB(TPM Access Broker,TPM访问代理),RM(Resource Manager),和设备驱动等软件层次。这些软件层次与tpm2-tss包含的软件层次的功能如下: +- FAPI: 大多数的用户层引用程序基于FAPI开发就可以了,因为FAPI实现了TPM百分之八十的常用应用场景。使用这一层开发应用就像是使用JAVA,C#等高级语言开发应用一样方便。FAPI对应的库为`libtss2-fapi`,对应的标准为[TCG Feature API (FAPI) Specification,TCG TSS 2.0 JSON Data Types and Policy Language Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_JSON_Policy_v0p7_r08_pub.pdf)。 +- ESAPI: 往下一层是ESAPI,它需要你对TPM了解很深,它实现了TPM2命令的1:1映射,但是同时提供了会话管理以及加解密的辅助功能。这有点像使用C++开发应用程序。ESAPI对应的库为libtss-esys , 对应的标准为[TCG TSS 2.0 Enhanced System API (ESAPI) Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_ESAPI_v1p0_r08_pub.pdf)。 -- 应用程序也可以直接基于SAPI这一层,它实现了TPM2命令的1:1映射,但这需要你对TPM了如指掌。这就像是使用C语言编写应用程序,而不是用高级语言。它提供了TPM的所有功能,但是要想用好它你必须对TPM有很深的理解。SAPI对应的库为`libtss2‑sys`,对应的标准为[TCG TSS 2.0 System Level API (SAPI) Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_SAPI_v1p1_r29_pub_20190806.pdf)。 -- TCTI层用于向TPM发送命令并接收TPM对命令的响应。应用可以直接通过TCTI发送命令的数据流并解析接收到的响应数据流。这就像是使用汇编语言来编写应用程序。它对应的库为`libtss2‑tcti‑device`、`libtss2‑tcti‑tbs`等,对应的标准为[TCG TSS 2.0 TPM Command Transmission Interface (TCTI) API Specification](https://trustedcomputinggroup.org/wp-content/uploads/TCG_TSS_TCTI_v1p0_r18_pub.pdf)。 -- TAB这一层主要负责多线程环境下TPM资源的同步。也就是说它允许多个线程同时访问TPM而不发生冲突。 -- 因为TPM内部的存储资源非常有限,所以需要一个资源管理器RM,它的原理于虚拟内存管理类似,它可以将TPM对象和会话换进换出TPM。 -- 最后一层就是设备驱动,它主要是控制通信外设与TPM互相传输数据。如果你愿意的话,直接调用设备驱动接口来编写应用程序也是可以的,当然这就像是你用二进制数据编写程序一样。 +- SAPI: 应用程序也可以直接基于SAPI这一层,它实现了TPM2命令的1:1映射,但这需要你对TPM了如指掌。这就像是使用C语言编写应用程序,而不是用高级语言。它提供了TPM的所有功能,但是要想用好它你必须对TPM有很深的理解。SAPI对应的库为`libtss2‑sys`,对应的标准为[TCG TSS 2.0 System Level API (SAPI) Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_SAPI_v1p1_r29_pub_20190806.pdf)。 +- TCTI: TCTI层用于向TPM发送命令并接收TPM对命令的响应。应用可以直接通过TCTI发送命令的数据流并解析接收到的响应数据流。这就像是使用汇编语言来编写应用程序。它对应的库为`libtss2‑tcti‑device`、`libtss2‑tcti‑tbs`等,对应的标准为[TCG TSS 2.0 TPM Command Transmission Interface (TCTI) API Specification](https://trustedcomputinggroup.org/wp-content/uploads/TCG_TSS_TCTI_v1p0_r18_pub.pdf)。 +- TAB: TAB这一层主要负责多线程环境下TPM资源的同步。也就是说它允许多个线程同时访问TPM而不发生冲突。 +- RM: 因为TPM内部的存储资源非常有限,所以需要一个资源管理器RM,它的原理于虚拟内存管理类似,它可以将TPM对象和会话换进换出TPM。 +- 驱动:最后一层就是设备驱动,它主要是控制通信外设与TPM互相传输数据。如果你愿意的话,直接调用设备驱动接口来编写应用程序也是可以的,当然这就像是你用二进制数据编写程序一样。 ![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136439/1692165449775-5f211546-3054-40ec-923d-929fac7bcd15.png)