<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://teaclave.apache.org/blog</id>
    <title>Apache Teaclave™  Blog</title>
    <updated>2026-01-30T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://teaclave.apache.org/blog"/>
    <subtitle>Apache Teaclave™  Blog</subtitle>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ TrustZone SDK 0.8.0]]></title>
        <id>https://teaclave.apache.org/blog/2026/01/30/announcing-teaclave-trustzone-sdk-0.8.0</id>
        <link href="https://teaclave.apache.org/blog/2026/01/30/announcing-teaclave-trustzone-sdk-0.8.0"/>
        <updated>2026-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the release of]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the release of
Teaclave TrustZone SDK 0.8.0.</p>
<p>Teaclave empowers developers to build memory-safe Trusted Applications across
diverse confidential computing platforms, including Intel SGX and Arm TrustZone.
Apache Teaclave TrustZone SDK, a subproject of Apache Teaclave, is based on the
OP-TEE project, a widely used open-source TrustZone OS.</p>
<p>This release focuses on tooling improvements, ecosystem polish, and better build
compatibility, while keeping pace with upstream OP-TEE changes.</p>
<p>For more details, please refer to our release notes:
<a href="https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.8.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.8.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2026/01/30/announcing-teaclave-trustzone-sdk-0.8.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>You can download the release from the
<a href="https://teaclave.apache.org/download/" target="_blank" rel="noopener noreferrer" class="">download</a> page. Also, please checkout
our <a href="https://github.com/apache/teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">repository</a> hosted on
GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="contributing">Contributing<a href="https://teaclave.apache.org/blog/2026/01/30/announcing-teaclave-trustzone-sdk-0.8.0#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">​</a></h2>
<p>Teaclave TrustZone SDK is under the Apache License v2 and open source in The
Apache Way. We aim to create a project that is maintained and owned by the
community. All kinds of contributions are welcome. Thanks to our contributors.</p>]]></content>
        <author>
            <name>Yuan Zhuang</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ TrustZone SDK 0.7.0]]></title>
        <id>https://teaclave.apache.org/blog/2025/12/03/announcing-teaclave-trustzone-sdk-0.7.0</id>
        <link href="https://teaclave.apache.org/blog/2025/12/03/announcing-teaclave-trustzone-sdk-0.7.0"/>
        <updated>2025-12-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the release of]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the release of
Teaclave TrustZone SDK 0.7.0.</p>
<p>Teaclave empowers developers to build memory-safe Trusted Applications across
diverse confidential computing platforms, including Intel SGX and Arm TrustZone.
Apache Teaclave TrustZone SDK, a subproject of Apache Teaclave, is based on the
OP-TEE project, a widely used open-source TrustZone OS.</p>
<p>This release updates the project to OP-TEE 4.8.0, introduces the std feature for
optee-utee to improve build-option flexibility, adds no-std support to several
examples, and delivers significant Build/CI enhancements. It also improves error
messages and expands the documentation.</p>
<p>For more details, please refer to our release notes:
<a href="https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.7.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.7.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2025/12/03/announcing-teaclave-trustzone-sdk-0.7.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>You can download the release from the
<a href="https://teaclave.apache.org/download/" target="_blank" rel="noopener noreferrer" class="">download</a> page. Also, please checkout
our <a href="https://github.com/apache/teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">repository</a> hosted on
GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="contributing">Contributing<a href="https://teaclave.apache.org/blog/2025/12/03/announcing-teaclave-trustzone-sdk-0.7.0#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">​</a></h2>
<p>Teaclave TrustZone SDK is under the Apache License v2 and open source in The
Apache Way. We aim to create a project that is maintained and owned by the
community. All kinds of contributions are welcome. Thanks to our contributors.</p>]]></content>
        <author>
            <name>Yuan Zhuang</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ TrustZone SDK 0.6.0]]></title>
        <id>https://teaclave.apache.org/blog/2025/09/12/announcing-teaclave-trustzone-sdk-0.6.0</id>
        <link href="https://teaclave.apache.org/blog/2025/09/12/announcing-teaclave-trustzone-sdk-0.6.0"/>
        <updated>2025-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the release of]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the release of
Teaclave TrustZone SDK 0.6.0.</p>
<p>Teaclave empowers developers to build memory-safe Trusted Applications across
diverse confidential computing platforms, including Intel SGX and Arm TrustZone.
Apache Teaclave TrustZone SDK, a subproject of Apache Teaclave, is based on the
OP-TEE project, a widely used open-source TrustZone OS.</p>
<p>This release aligns with the OP-TEE quarterly release schedule and is compatible
with OP-TEE 4.7.0. It introduces major improvements across features, build
workflows, and documentation. Highlights include new TLS client and server
examples built on the latest Rustls, a significant refactoring of the Object
component for better maintainability, and enhancements to the build system and
CI pipeline with separated test workflows, new environment configurations for
building standard TAs, and simplified Makefiles. Documentation has also been
refreshed for consistency, clarity, and an improved developer experience.</p>
<p>For more details, please refer to our release notes:
<a href="https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.6.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/teaclave-trustzone-sdk/releases/tag/v0.6.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2025/09/12/announcing-teaclave-trustzone-sdk-0.6.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>You can download the release from the
<a href="https://teaclave.apache.org/download/" target="_blank" rel="noopener noreferrer" class="">download</a> page. Also, please checkout
our <a href="https://github.com/apache/teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">repository</a> hosted on
GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="contributing">Contributing<a href="https://teaclave.apache.org/blog/2025/09/12/announcing-teaclave-trustzone-sdk-0.6.0#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">​</a></h2>
<p>Teaclave TrustZone SDK is under the Apache License v2 and open source in The
Apache Way. We aim to create a project that is maintained and owned by the
community. All kinds of contributions are welcome. Thanks to our contributors.</p>]]></content>
        <author>
            <name>Yuan Zhuang</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Repository Restructuring and Community Focus]]></title>
        <id>https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus</id>
        <link href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus"/>
        <updated>2025-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Apache Teaclave™ (incubating) was originally created with a broad vision to explore the possibilities of confidential computing. It consisted of multiple components, including SDKs supporting Intel SGX and Arm TrustZone, a general-purpose application framework (FaaS), and experimental verification efforts, spanning several repositories under the Apache Incubator.]]></summary>
        <content type="html"><![CDATA[<p>Apache Teaclave™ (incubating) was originally created with a broad vision to explore the possibilities of confidential computing. It consisted of multiple components, including SDKs supporting Intel SGX and Arm TrustZone, a general-purpose application framework (FaaS), and experimental verification efforts, spanning several repositories under the Apache Incubator.</p>
<p>Over the years, as the field of confidential computing evolved, we observed a clear trend: developers increasingly preferred building their own Trusted Applications using SDKs directly, rather than relying on a general-purpose FaaS framework. This organic shift in usage has also been reflected in our contributor activities. Most community engagement and active development now center around the SDKs, especially the Rust-based TrustZone and SGX SDKs.</p>
<p>As part of our preparation for graduation from the Apache Incubator, we’ve received recurring questions about what Teaclave is today, and what its long-term focus should be. To address this and align with current usage and contributions, we propose a refined mission and corresponding repository restructuring.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="refined-mission">Refined Mission<a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#refined-mission" class="hash-link" aria-label="Direct link to Refined Mission" title="Direct link to Refined Mission" translate="no">​</a></h2>
<p><code>Teaclave empowers developers to build memory-safe (e.g. Rust) Trusted Applications across diverse confidential computing platforms.</code><br>
Our primary focus going forward will be on maintaining and improving SDKs that support this mission.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="repository-restructuring-plan">Repository Restructuring Plan<a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#repository-restructuring-plan" class="hash-link" aria-label="Direct link to Repository Restructuring Plan" title="Direct link to Repository Restructuring Plan" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="goals">Goals<a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#goals" class="hash-link" aria-label="Direct link to Goals" title="Direct link to Goals" translate="no">​</a></h3>
<ul>
<li class="">Reflect Teaclave’s active development and current focus</li>
<li class="">Reduce long-term maintenance costs for inactive components</li>
<li class="">Preserve historical contributions and community merit</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="incubator-teaclave"><code>incubator-teaclave</code><a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#incubator-teaclave" class="hash-link" aria-label="Direct link to incubator-teaclave" title="Direct link to incubator-teaclave" translate="no">​</a></h3>
<p><strong>Current Status:</strong></p>
<ul>
<li class="">Role: Former flagship repository for the FaaS-style confidential computing framework.</li>
<li class="">Activity: Last commit in July 2023.</li>
<li class="">Maintenance: No longer actively developed or aligned with the community’s current direction.</li>
</ul>
<p><strong>Shift in Focus:</strong></p>
<ul>
<li class="">This repository will be repurposed as the <strong>main landing page</strong> for the Teaclave project (Podling or TLP). It will provide high-level documentation, links to active SDKs, examples to help users get started, and showcases to build with Teaclave SDKs.</li>
<li class="">Historical contributions and community merit will be preserved <a href="https://github.com/apache/incubator-teaclave/graphs/contributors" target="_blank" rel="noopener noreferrer" class="">1</a>.</li>
<li class="">Preview of reorganized content is already hosted on the <code>main</code> branch <a href="https://github.com/apache/incubator-teaclave/tree/main" target="_blank" rel="noopener noreferrer" class="">2</a>.
<ul>
<li class="">A clear project overview</li>
<li class="">Links to active SDK repositories (TrustZone, SGX, etc.)</li>
<li class="">Showcases for each SDK</li>
<li class="">A unified contribution guide and roadmap</li>
</ul>
</li>
</ul>
<p><strong>Action Items:</strong></p>
<ul>
<li class="">Deprecate the existing <code>master</code> branch and rename it to <code>legacy</code></li>
<li class="">Set <code>main</code> as the default branch</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="incubator-teaclave-crates"><code>incubator-teaclave-crates</code><a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#incubator-teaclave-crates" class="hash-link" aria-label="Direct link to incubator-teaclave-crates" title="Direct link to incubator-teaclave-crates" translate="no">​</a></h3>
<p><strong>Current Status:</strong></p>
<ul>
<li class="">Role: Hosts ported/forked crates for TEE platforms (e.g., sgx-crypto, protobuf)</li>
<li class="">Activity: Some crates are outdated or redundant</li>
<li class="">Maintenance: Partial</li>
</ul>
<p><strong>Shift in Focus:</strong><br>
This repository will remain an <strong>auxiliary dependency hub</strong> supporting only the active SDKs. It will be <strong>cleaned and scoped down</strong> to what is still necessary for TrustZone/SGX development.<br>
<strong>Action Items:</strong></p>
<ul>
<li class="">Retain the repository to support SDK builds and examples</li>
<li class="">Remove:
<ul>
<li class="">Crates no longer used by maintained SDKs or demos</li>
<li class="">Redundant forks of crates that now work upstream</li>
</ul>
</li>
<li class="">Preserve and maintain:
<ul>
<li class="">Crates required by <code>incubator-teaclave-trustzone-sdk</code> or <code>incubator-teaclave-sgx-sdk</code></li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="incubator-teaclave-verification"><code>incubator-teaclave-verification</code><a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#incubator-teaclave-verification" class="hash-link" aria-label="Direct link to incubator-teaclave-verification" title="Direct link to incubator-teaclave-verification" translate="no">​</a></h3>
<p><strong>Current Status:</strong></p>
<ul>
<li class="">Role: Experimental repo for formal verification methods</li>
<li class="">Activity: No active development or adoption</li>
<li class="">Maintenance: Unmaintained</li>
</ul>
<p><strong>Shift in Focus:</strong><br>
This repository will become a <strong>historical archive</strong> for early verification efforts, preserved for transparency and reference.</p>
<p><strong>Action Items:</strong></p>
<ul>
<li class="">Archive the repository on GitHub (read-only)</li>
<li class="">Add a short README noting its archival status and rationale</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="active-sdks">Active SDKs<a href="https://teaclave.apache.org/blog/2025/07/08/repo-reorg-community-focus#active-sdks" class="hash-link" aria-label="Direct link to Active SDKs" title="Direct link to Active SDKs" translate="no">​</a></h3>
<p>These SDKs are actively maintained and form the core of Teaclave’s current focus:</p>
<ul>
<li class=""><code>incubator-teaclave-trustzone-sdk</code></li>
<li class=""><code>incubator-teaclave-sgx-sdk</code></li>
<li class=""><code>incubator-teaclave-java-tee-sdk</code></li>
</ul>
<p>No changes are proposed at this time. Any future updates will be discussed in separate threads.</p>]]></content>
        <author>
            <name>zfc@apache.org</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #15]]></title>
        <id>https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15</id>
        <link href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15"/>
        <updated>2022-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="propose-he-as-committer">Propose He as Committer<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#propose-he-as-committer" class="hash-link" aria-label="Direct link to Propose He as Committer" title="Direct link to Propose He as Committer" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-faas">Teaclave FaaS<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#teaclave-faas" class="hash-link" aria-label="Direct link to Teaclave FaaS" title="Direct link to Teaclave FaaS" translate="no">​</a></h3>
<ul>
<li class="">upgrading Teacalve SGX SDK 2.0 PR
<ul>
<li class="">disable macos/ios CI</li>
<li class="">protected fs in teaclavs SGX sdk is not compatible with intel sgx sdk</li>
<li class="">TODO: support macos/ios target for protected fs in Teaclave SGX SDK</li>
<li class="">third-party crates
<ul>
<li class="">new repo to host forked crates: incubator-teaclave-crates</li>
<li class="">no need to vendor third-party crates, having a Cargo.lock to lock the third-party</li>
<li class="">update readme to explain the supply chain issue</li>
</ul>
</li>
<li class="">need review</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="java-tee-sdk">Java TEE SDK<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#java-tee-sdk" class="hash-link" aria-label="Direct link to Java TEE SDK" title="Direct link to Java TEE SDK" translate="no">​</a></h3>
<ul>
<li class="">S2 (March 2023): integrate with Teaclave SGX SDK 2.0</li>
<li class="">Release PR</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="discussion">Discussion<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#discussion" class="hash-link" aria-label="Direct link to Discussion" title="Direct link to Discussion" translate="no">​</a></h3>
<p><a href="https://r3conclave.github.io/ccl-documentation/" target="_blank" rel="noopener noreferrer" class="">https://r3conclave.github.io/ccl-documentation/</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2022/12/21/teaclave-meetup-15#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">He Sun</li>
<li class="">Hongbo chen</li>
<li class="">Kailun Qin</li>
<li class="">Mingshen Sun</li>
<li class="">Qinkun Bao</li>
<li class="">Ran Duan</li>
<li class="">Sanhong Li</li>
<li class="">Shaojun Wang</li>
<li class="">Yingchun Gao</li>
<li class="">Yu Lei</li>
<li class="">Ziyi Lin</li>
</ul>]]></content>
        <author>
            <name>He Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #14]]></title>
        <id>https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14</id>
        <link href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14"/>
        <updated>2022-12-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="introduction">Introduction<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-faas">Teaclave FaaS<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#teaclave-faas" class="hash-link" aria-label="Direct link to Teaclave FaaS" title="Direct link to Teaclave FaaS" translate="no">​</a></h3>
<ul>
<li class="">Upgrade to Rust SGX SDK 2.0</li>
<li class="">Q: DockerHub image (Mingshen: add He as owner)</li>
<li class="">MS: apache DockerHub infra for Teaclave</li>
<li class="">Protected FS in 2.0 for macos/iOS is not supported (Ran)</li>
<li class="">Replace RPC as tonic based on RA-TLS (Yingchun: create a github issue)</li>
<li class="">RA-TLS standard (CCC, Ali, Intel, etc)</li>
<li class="">Function languages: Rust, WebAssembly, Python, Occlum</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-sgx-sdk-rust-sgx-sdk">Teaclave SGX SDK (Rust SGX SDK)<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#teaclave-sgx-sdk-rust-sgx-sdk" class="hash-link" aria-label="Direct link to Teaclave SGX SDK (Rust SGX SDK)" title="Direct link to Teaclave SGX SDK (Rust SGX SDK)" translate="no">​</a></h3>
<ul>
<li class="">Protected FS in SDK is not compatible with Intel SGX SDK</li>
<li class="">Supports Teaclave and Occlum features</li>
<li class="">Cache size/key policy added in Teaclave SGX SDK</li>
<li class="">2.0 release
<ul>
<li class="">testing
<ul>
<li class="">unit test</li>
<li class="">Rust std tests (800) and benchmark</li>
<li class="">sample code test</li>
<li class="">teaclave dependencies</li>
</ul>
</li>
<li class="">document</li>
<li class="">CI</li>
<li class="">EDMM in 2.0 (Occlum will use EDMM)</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-java-tee-sdk">Teaclave Java TEE SDK<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#teaclave-java-tee-sdk" class="hash-link" aria-label="Direct link to Teaclave Java TEE SDK" title="Direct link to Teaclave Java TEE SDK" translate="no">​</a></h3>
<ul>
<li class="">0.1 release
<ul>
<li class="">Voting</li>
<li class="">Checklist</li>
</ul>
</li>
<li class="">CI (self-hosted runner for GitHub Actions)
<ul>
<li class="">Apache Infra Jira ticket, Github Actions token (Mingshen: apply token)</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-trustzone-sdk-rust-op-tee-trustzone-sdk">Teaclave TrustZone SDK (Rust OP-TEE TrustZone SDK)<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#teaclave-trustzone-sdk-rust-op-tee-trustzone-sdk" class="hash-link" aria-label="Direct link to Teaclave TrustZone SDK (Rust OP-TEE TrustZone SDK)" title="Direct link to Teaclave TrustZone SDK (Rust OP-TEE TrustZone SDK)" translate="no">​</a></h3>
<ul>
<li class="">N/A</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2022/12/14/teaclave-meetup-14#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">He Sun</li>
<li class="">Hongbo chen</li>
<li class="">Kailun Qin</li>
<li class="">Mingshen Sun</li>
<li class="">Qinkun Bao</li>
<li class="">Ran Duan</li>
<li class="">Sanhong Li</li>
<li class="">Shaojun Wang</li>
<li class="">Yingchun Gao</li>
<li class="">Yu Lei</li>
<li class="">Ziyi Lin</li>
</ul>]]></content>
        <author>
            <name>He Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Accepting JavaEnclave to Apache Teaclave™ (incubating) Proposal]]></title>
        <id>https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal</id>
        <link href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal"/>
        <updated>2022-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Abstract]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="abstract">Abstract<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#abstract" class="hash-link" aria-label="Direct link to Abstract" title="Direct link to Abstract" translate="no">​</a></h2>
<p>Teaclave Java TEE SDK is a Java confidential computing programming framework.
It follows the host-and-enclave partition programming model defined by Intel-SGX SDK.
Teaclave Java TEE SDK provides an elegant way to divide a java project into host and
enclave modules, where the enclave module is a provider of a user-defined service
interface which is similar to the Java SPI model. Teaclave Java TEE SDK could
help you to develop and build a Java confidential computing project with
high efficiency.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="proposal">Proposal<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#proposal" class="hash-link" aria-label="Direct link to Proposal" title="Direct link to Proposal" translate="no">​</a></h2>
<p>Teaclave Java TEE SDK is a pure Java SDK for Java confidential computing. It eases
the interactions between secured and unsecured environment with a few concise APIs.
From user's aspect, creating an enclave environment and invoking confidential
computing services would be as simple as invoking SPI services.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="background">Background<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h3>
<p>The Teaclave Java TEE SDK project is being actively developed within Alibaba Cloud.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="rationale">Rationale<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#rationale" class="hash-link" aria-label="Direct link to Rationale" title="Direct link to Rationale" translate="no">​</a></h3>
<p>Teaclave Java TEE SDK is a Java confidential computing programming framework.
The goal of Teaclave is to provide a universal secure computing platform for
multiple programming languages. Teaclave currently supports Rust, Python and
WebAssembly, but Java is still missing. Teaclave Java TEE SDK would be an
important piece of the puzzle.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="initial-goals">Initial Goals<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#initial-goals" class="hash-link" aria-label="Direct link to Initial Goals" title="Direct link to Initial Goals" translate="no">​</a></h3>
<ul>
<li class="">Transfer the repository to the Apache Incubator under the Teaclave project</li>
<li class="">Code cleanup and more documentation</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="meritocracy">Meritocracy:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#meritocracy" class="hash-link" aria-label="Direct link to Meritocracy:" title="Direct link to Meritocracy:" translate="no">​</a></h4>
<p>Teaclave Java TEE SDK project was originally developed and reviewed by
Shaojun Wang/Ziyi Lin/Lei Yu/Sanhong Li within Alibaba Cloud.
We encourage everyone to ask questions and create pull requests for the project.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="community">Community:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#community" class="hash-link" aria-label="Direct link to Community:" title="Direct link to Community:" translate="no">​</a></h4>
<p>Teaclave Java TEE SDK was developed and applied within Alibaba Cloud before
it was donated to Teaclave.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="core-developers">Core Developers:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#core-developers" class="hash-link" aria-label="Direct link to Core Developers:" title="Direct link to Core Developers:" translate="no">​</a></h4>
<p>The core developers are:</p>
<ul>
<li class="">Shaojun Wang (<a href="mailto:jeffery.wsj@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">jeffery.wsj@alibaba-inc.com</a>)</li>
<li class="">Ziyi Lin (<a href="mailto:cengfeng.lzy@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">cengfeng.lzy@alibaba-inc.com</a>)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="alignment">Alignment:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#alignment" class="hash-link" aria-label="Direct link to Alignment:" title="Direct link to Alignment:" translate="no">​</a></h4>
<p>The project is complimentary of Teaclave's TEE backends.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="known-risks">Known Risks<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#known-risks" class="hash-link" aria-label="Direct link to Known Risks" title="Direct link to Known Risks" translate="no">​</a></h3>
<p>An exercise in self-knowledge. Risks don't mean that a project is unacceptable.
If they are recognized and noted, then they can be addressed during incubation.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="project-name">Project Name<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#project-name" class="hash-link" aria-label="Direct link to Project Name" title="Direct link to Project Name" translate="no">​</a></h4>
<p>Teaclave Java TEE SDK was initially developed and applied within Alibaba Cloud
as a closed-source project which was called JavaEnclave.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="inexperience-with-open-source">Inexperience with Open Source:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#inexperience-with-open-source" class="hash-link" aria-label="Direct link to Inexperience with Open Source:" title="Direct link to Inexperience with Open Source:" translate="no">​</a></h4>
<p>Teaclave Java TEE SDK has been reviewed by Mingshen Sun, who is from the Teaclave
community. He's familiar with The Apache Way for the open-source community.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="length-of-incubation">Length of Incubation:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#length-of-incubation" class="hash-link" aria-label="Direct link to Length of Incubation:" title="Direct link to Length of Incubation:" translate="no">​</a></h4>
<p>The project will be in incubation with Apache Teaclave™ (incubating) project.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="documentation">Documentation<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h3>
<ul>
<li class="">Teaclave Java TEE SDK's documentation will be submit to Teaclave PPMC for review
by email <a href="mailto:private@teaclave.apache.org" target="_blank" rel="noopener noreferrer" class="">private@teaclave.apache.org</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="initial-source">Initial Source<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#initial-source" class="hash-link" aria-label="Direct link to Initial Source" title="Direct link to Initial Source" translate="no">​</a></h3>
<ul>
<li class="">Teaclave Java TEE SDK's source code will be submit to Teaclave PPMC for review
by email <a href="mailto:private@teaclave.apache.org" target="_blank" rel="noopener noreferrer" class="">private@teaclave.apache.org</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="source-and-intellectual-property-submission-plan">Source and Intellectual Property Submission Plan<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#source-and-intellectual-property-submission-plan" class="hash-link" aria-label="Direct link to Source and Intellectual Property Submission Plan" title="Direct link to Source and Intellectual Property Submission Plan" translate="no">​</a></h3>
<p>We will submit a Software Grant for this project later.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="external-dependencies">External Dependencies:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#external-dependencies" class="hash-link" aria-label="Direct link to External Dependencies:" title="Direct link to External Dependencies:" translate="no">​</a></h4>
<p>The dependencies have Apache compatible license, which is provided under the
BSD 2-Clause license and GPL2.0 license. One dependency of Teaclave Java TEE SDK
is GraalVM SubstraceVM with GPL2.0 license, it's used as the enclave module's
native image compiler, and Teaclave Java TEE SDK has contributed some patches
to GraalVM and they had been contained in GraalVM's official releases assets.
Teaclave Java TEE SDK is dependent on GraalVM's official releases and doesn't
make any modifications to GraalVM's source code, so there's no legal risk.
<a href="https://www.apache.org/legal/resolved.html" target="_blank" rel="noopener noreferrer" class="">https://www.apache.org/legal/resolved.html</a></p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="cryptography">Cryptography:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#cryptography" class="hash-link" aria-label="Direct link to Cryptography:" title="Direct link to Cryptography:" translate="no">​</a></h4>
<p>N/A</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="required-resources">Required Resources<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#required-resources" class="hash-link" aria-label="Direct link to Required Resources" title="Direct link to Required Resources" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="mailing-lists">Mailing lists:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#mailing-lists" class="hash-link" aria-label="Direct link to Mailing lists:" title="Direct link to Mailing lists:" translate="no">​</a></h4>
<p>The project shares the same mailing list of Teaclave.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="git-repositories">Git Repositories:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#git-repositories" class="hash-link" aria-label="Direct link to Git Repositories:" title="Direct link to Git Repositories:" translate="no">​</a></h4>
<ul>
<li class="">N/A</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="issue-tracking">Issue Tracking:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#issue-tracking" class="hash-link" aria-label="Direct link to Issue Tracking:" title="Direct link to Issue Tracking:" translate="no">​</a></h4>
<p>Same with Teaclave.</p>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="other-resources">Other Resources:<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#other-resources" class="hash-link" aria-label="Direct link to Other Resources:" title="Direct link to Other Resources:" translate="no">​</a></h4>
<p>N/A</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="initial-committers">Initial Committers<a href="https://teaclave.apache.org/blog/2022/10/08/accepting-java-enclave-proposal#initial-committers" class="hash-link" aria-label="Direct link to Initial Committers" title="Direct link to Initial Committers" translate="no">​</a></h3>
<ul>
<li class="">Shaojun Wang (<a href="mailto:jeffery.wsj@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">jeffery.wsj@alibaba-inc.com</a>)</li>
<li class="">Ziyi Lin (<a href="mailto:cengfeng.lzy@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">cengfeng.lzy@alibaba-inc.com</a>)</li>
<li class="">Lei Yu (<a href="mailto:lei.yul@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">lei.yul@alibaba-inc.com</a>)</li>
<li class="">Sanhong Li (<a href="mailto:sanhong.lsh@alibaba-inc.com" target="_blank" rel="noopener noreferrer" class="">sanhong.lsh@alibaba-inc.com</a>)</li>
</ul>]]></content>
        <author>
            <name>The Teaclave PPMC</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #13]]></title>
        <id>https://teaclave.apache.org/blog/2022/06/29/teaclave-meetup-13</id>
        <link href="https://teaclave.apache.org/blog/2022/06/29/teaclave-meetup-13"/>
        <updated>2022-06-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/06/29/teaclave-meetup-13#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<p>Dear Teaclave community,</p>
<p>Since some members have conflicts on tomorrow's meetup and suggested
scheduling the meetup today, let's have an informal meet today at
7:00am PT (10am China Time).</p>
<p>There's no presentation today. Let's just have a chitchat and discuss
recent updates in the community. Thanks.</p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #12]]></title>
        <id>https://teaclave.apache.org/blog/2022/04/28/teaclave-meetup-12</id>
        <link href="https://teaclave.apache.org/blog/2022/04/28/teaclave-meetup-12"/>
        <updated>2022-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/04/28/teaclave-meetup-12#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">Recent Updates on Teaclave - Mingshen Sun (10m)</li>
<li class="">Enarx - Wenwen Ruan (40m)</li>
<li class="">Free discussion (10m)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2022/04/28/teaclave-meetup-12#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Mingshen Sun</li>
<li class="">Shuang Liu</li>
<li class="">He Sun</li>
<li class="">Weijie Liu</li>
<li class="">Gordon</li>
<li class="">Tongxin Li</li>
<li class="">Wenhao Wang</li>
<li class="">Ukei Kim</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="group-photo">Group Photo<a href="https://teaclave.apache.org/blog/2022/04/28/teaclave-meetup-12#group-photo" class="hash-link" aria-label="Direct link to Group Photo" title="Direct link to Group Photo" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Group Photo" src="https://teaclave.apache.org/assets/images/teaclave-meetup-12-zoom-78cf41ba05ee1e2c6c506d02ed8dbe59.png" width="3808" height="2414" class="img__Ss2"></p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ (incubating) 0.4.0]]></title>
        <id>https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0</id>
        <link href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0"/>
        <updated>2022-04-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the fourth Apache]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the <em>fourth</em> Apache
Incubator release of Teaclave, 0.4.0. Teaclave is a universal secure computing
platform, making computation on privacy-sensitive data safe and simple.
Apache Teaclave™ (including the
<a href="https://github.com/apache/incubator-teaclave" target="_blank" rel="noopener noreferrer" class="">FaaS platform</a>,
<a href="https://github.com/apache/incubator-teaclave-sgx-sdk" target="_blank" rel="noopener noreferrer" class="">SGX SDK</a>,
and <a href="https://github.com/apache/incubator-teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">TrustZone SDK</a>) is
being used and contributed by developers from many organizations and
other open source projects. Please see the <a class="" href="https://teaclave.apache.org/powered-by"><em>powered by</em></a> page to learn more.</p>
<p>In this release, we mainly focus on better user management, task management,
performance improvement and stability.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="highlights">Highlights<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>In this release, we introduce a role-based access control for user management.
Specifically, we define roles like admin, function owner, data owner, data owner
manager, etc. Additionally, we also add APIs to support user management
functionalities. In addition, we also implement a feature to cancel a running
task to kill a long-run function which is no longer needed. Besides these two
new features, we also made a lot of underlying changes to improve the
performance of RPC and stability of the secure database.</p>
<p>To learn more, here is a list of notable changes in Teaclave version 0.4.0.</p>
<p><strong>Features</strong></p>
<ul>
<li class="">Add the <code>DisableFunction</code> interface (#620)</li>
<li class="">Better user management interfaces: add the <code>UserUpdate</code>, <code>UserChangePassword</code>, <code>ResetUserPassword</code>, <code>DeleteUser</code>, and <code>ListUsers</code> interfaces</li>
<li class="">Support optional input/output files (#603)</li>
<li class="">Start Teaclave docker services with auto-detection mechanism (#559)</li>
<li class="">Add watchdog functionality to monitor service status (#600)</li>
<li class="">Support cancel a task</li>
<li class="">Support intermediate cert in DCAP attestation cert</li>
</ul>
<p><strong>Enhancements</strong></p>
<ul>
<li class="">Better error handling in Python client SDK (#632)</li>
<li class="">Refactor services error types and messages, make them readable to end users</li>
<li class="">Optimize RPC memory footprint of serde (#577)</li>
<li class="">Support selectively including executors (#574)</li>
<li class="">Support AES-GCM output files (#629)</li>
<li class="">Add port probe for service launching</li>
<li class="">Update WAMR version to WAMR-01-18-2022 (#616)</li>
<li class="">Move execution context into a separate crate (#598)</li>
<li class="">Support Ubuntu 20.04 docker image and add corresponding CI pipelines</li>
<li class="">Persistent MockDB in test mode (#580)</li>
</ul>
<p><strong>Bug Fixes</strong></p>
<ul>
<li class="">Better task state error and fix cancel error issue in the example (#637)</li>
<li class="">Fix privilege issues in the <code>GetFunction</code> and <code>ListFunctions</code> interfaces (#636)</li>
<li class="">Better building system: fix packages rebuild every time, avoid issues in parallel make (#589, #596)</li>
<li class="">Fix the issue of generating code coverage of tests (#627)</li>
<li class="">Fix LevelDB assertion issue: leveldb lru bug, using disk db for unit test (#583)</li>
</ul>
<p><strong>Docs</strong></p>
<ul>
<li class="">Add release guide for releasing Teaclave in the community: <a href="https://teaclave.apache.org/docs/release-guide/" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/docs/release-guide/</a></li>
<li class="">Remove <code>CONTRIBUTORS.md</code> and point to the homepage (#552)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>Teaclave 0.4.0 can be downloaded at <a class="" href="https://teaclave.apache.org/download/">the download page</a>. Note that
it is essential to verify the integrity of the downloaded file using the
PGP signature (the <code>.asc</code> file) or a hash (the <code>.sha256</code> file).</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="documentation">Documentation<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>If it is the first time to try Teaclave, we provide a simple but clear tutorial
to guide you getting stated with Teaclave by invoking
<a class="" href="https://teaclave.apache.org/docs/my-first-function/">your first function</a> in Teaclave.</p>
<p>Basically, you can build the Teaclave platform using docker with these commands:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ tar zxvf apache-teaclave-0.4.0-incubating.tar.gz &amp;&amp; cd \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  apache-teaclave-0.4.0-incubating</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ # Instructions to verify the source tar: https://teaclave.apache.org/download/#verify-the-integrity-of-the-files</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ docker run --rm -v $(pwd):/teaclave -w /teaclave \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.14:latest \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   bash -c ". /root/.cargo/env &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     . /opt/sgxsdk/environment &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     mkdir -p build &amp;&amp; cd build &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON -DGIT_SUBMODULE=OFF .. &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     make"</span><br></span></code></pre></div></div>
<p>Launch all services with <code>docker-compose</code> using simulation mode:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ (cd docker &amp;&amp; docker-compose -f docker-compose-ubuntu-1804-sgx-sim-mode.yml up --build)</span><br></span></code></pre></div></div>
<p>And invoke function with a Python client:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd examples/python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ PYTHONPATH=../../sdk/python python3 builtin_echo.py 'Hello, Teaclave!'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] registering user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] login</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] registering function</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] creating task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] approving task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] invoking task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] getting result</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] function return:  b'Hello, Teaclave!'</span><br></span></code></pre></div></div>
<p>If you want to understand the internals of Teaclave, we provide several
documents about the <a class="" href="https://teaclave.apache.org/docs/#design">design</a> of Teaclave. Also, we extensively
document our <a class="" href="https://teaclave.apache.org/docs/#codebase">codebase</a> in each sub directories. At last, <a class="" href="https://teaclave.apache.org/docs/#api-references">API references</a>
are automatically generated and uploaded to our homepage.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="community">Community<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-0.4.0#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no">​</a></h2>
<ul>
<li class="">Join us on our <a href="https://lists.apache.org/list.html?dev@teaclave.apache.org" target="_blank" rel="noopener noreferrer" class="">mailing list</a> and <a href="https://discord.gg/ynECXsxm5P" target="_blank" rel="noopener noreferrer" class="">Discord channel</a>.</li>
<li class="">Follow us at <a href="https://twitter.com/ApacheTeaclave" target="_blank" rel="noopener noreferrer" class="">@ApacheTeaclave</a>.</li>
<li class="">Meet us at our <a href="https://teaclave.apache.org/community/#calendar" target="_blank" rel="noopener noreferrer" class="">monthly community meetup</a>.</li>
<li class="">See <a href="https://teaclave.apache.org/community/" target="_blank" rel="noopener noreferrer" class="">more</a>.</li>
</ul>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ TrustZone SDK (incubating) 0.2.0]]></title>
        <id>https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0</id>
        <link href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0"/>
        <updated>2022-04-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the release of]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the release of
Teaclave TrustZone SDK 0.2.0.</p>
<p>Teaclave TrustZone SDK provides abilities to build safe TrustZone applications
in Rust. The SDK is based on the OP-TEE project which follows GlobalPlatform TEE
specifications and provides ergonomic APIs. In addition, it enables capability
to write TrustZone applications with Rust's standard library and many
third-party libraries (i.e., crates). Teaclave TrustZone SDK is a sub-project of
Apache Teaclave™ (incubating). To learn more about the design and history of
TrustZone SDK,
please read the blog <a href="https://teaclave.apache.org/blog/2021-03-14-welcome-rust-optee-trustzone-sdk/" target="_blank" rel="noopener noreferrer" class="">Welcome Rust OP-TEE TrustZone SDK To Teaclave</a>.</p>
<p>This is the second Apache Incubator release of Teaclave TrustZone SDK. Teaclave
TrustZone SDK provides abilities to build safe TrustZone applications in Rust.
The SDK is based on the OP-TEE project which follows GlobalPlatform TEE
specifications and provides ergonomic APIs. In addition, it enables the
capability to write TrustZone applications with Rust's standard library and many
third-party libraries (i.e., crates). Teaclave TrustZone SDK is a sub-project of
Apache Teaclave™ (incubating).</p>
<p>During this period, we are working closely with the OP-TEE community to
integrate TA examples written in Rust into the upstream repository. You can try
and play with the examples written in Rust with Teaclave TrustZone SDK since the
OP-TEE 3.15.0 release.</p>
<p>More specifically, in this release we have the following updates:</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="features">Features<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<ul>
<li class="">Add support for tee-supplicant loadable plugins and examples</li>
<li class="">Add TEE Socket APIs and examples</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="enhancements">Enhancements<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#enhancements" class="hash-link" aria-label="Direct link to Enhancements" title="Direct link to Enhancements" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="integration-into-op-tee">Integration into OP-TEE<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#integration-into-op-tee" class="hash-link" aria-label="Direct link to Integration into OP-TEE" title="Direct link to Integration into OP-TEE" translate="no">​</a></h4>
<ul>
<li class="">Add the <code>-rs</code> suffix to examples and update test scripts (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/34" target="_blank" rel="noopener noreferrer" class="">#34</a>)</li>
<li class="">Update to OP-TEE 3.14.0 (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/35" target="_blank" rel="noopener noreferrer" class="">#35</a>)</li>
<li class="">Update to OP-TEE 3.16.0 (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/59" target="_blank" rel="noopener noreferrer" class="">#59</a>)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="building">Building<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#building" class="hash-link" aria-label="Direct link to Building" title="Direct link to Building" translate="no">​</a></h4>
<ul>
<li class="">Upgrade building docker to Ubuntu 20.04 (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/33" target="_blank" rel="noopener noreferrer" class="">#33</a>)</li>
<li class="">Update Rust toolchain to nightly-2021-09-20 and std to 1.56.1 (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/53" target="_blank" rel="noopener noreferrer" class="">#53</a>)</li>
<li class="">Add setup.sh to setup rust environment and initialize submodules (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/40" target="_blank" rel="noopener noreferrer" class="">#40</a>, <a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/63" target="_blank" rel="noopener noreferrer" class="">#63</a>)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="ci">CI<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#ci" class="hash-link" aria-label="Direct link to CI" title="Direct link to CI" translate="no">​</a></h4>
<ul>
<li class="">Switch to GitHub Actions (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/33" target="_blank" rel="noopener noreferrer" class="">#33</a>)</li>
<li class="">Add expect script for OP-TEE CI and fix CI errors (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/45" target="_blank" rel="noopener noreferrer" class="">#45</a>, <a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/50" target="_blank" rel="noopener noreferrer" class="">#50</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="bug-fixes">Bug fixes<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#bug-fixes" class="hash-link" aria-label="Direct link to Bug fixes" title="Direct link to Bug fixes" translate="no">​</a></h2>
<ul>
<li class="">Fix ldelf error of arm32 ta (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/38" target="_blank" rel="noopener noreferrer" class="">#38</a>)</li>
<li class="">fix error when making the plugin example second time (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/42" target="_blank" rel="noopener noreferrer" class="">#42</a>)</li>
<li class="">Correct toolchain PATH env (<a href="https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/44" target="_blank" rel="noopener noreferrer" class="">#44</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="docs">Docs<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#docs" class="hash-link" aria-label="Direct link to Docs" title="Direct link to Docs" translate="no">​</a></h2>
<ul>
<li class="">Add debugging OP-TEE TA doc: Debugging OP-TEE TA</li>
<li class="">Add documentation of Rust examples: Overview of OP-TEE Rust Examples</li>
<li class="">Polish the getting started documentation</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>You can download the release from the
<a href="https://teaclave.apache.org/download/" target="_blank" rel="noopener noreferrer" class="">download</a> page. Also, please checkout
our <a href="https://github.com/apache/incubator-teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">repository</a>
hosted on GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="contributing">Contributing<a href="https://teaclave.apache.org/blog/2022/04/18/announcing-teaclave-trustzone-sdk-0.2.0#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">​</a></h2>
<p>Teaclave TrustZone SDK is under the Apache License v2 and open source in The
Apache Way. We aim to create a project that is maintained and owned by the
community. All kinds of contributions are welcome. Thanks to our contributors.</p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #11]]></title>
        <id>https://teaclave.apache.org/blog/2022/03/31/teaclave-meetup-11</id>
        <link href="https://teaclave.apache.org/blog/2022/03/31/teaclave-meetup-11"/>
        <updated>2022-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/03/31/teaclave-meetup-11#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">Recent Updates on Teaclave - Mingshen Sun (10m)</li>
<li class="">HyperEnclave - Shuang Liu (40m)</li>
<li class="">Free discussion (10m)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2022/03/31/teaclave-meetup-11#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Mingshen Sun</li>
<li class="">Ran Duan</li>
<li class="">He Sun</li>
<li class="">Weijie Liu</li>
<li class="">Shuang Liu</li>
<li class="">Bing Duan</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="group-photo">Group Photo<a href="https://teaclave.apache.org/blog/2022/03/31/teaclave-meetup-11#group-photo" class="hash-link" aria-label="Direct link to Group Photo" title="Direct link to Group Photo" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Group Photo" src="https://teaclave.apache.org/assets/images/teaclave-meetup-11-zoom-3a1729fdf06ff6398df471d49334cd13.png" width="3808" height="2414" class="img__Ss2"></p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #10]]></title>
        <id>https://teaclave.apache.org/blog/2022/02/24/teaclave-meetup-10</id>
        <link href="https://teaclave.apache.org/blog/2022/02/24/teaclave-meetup-10"/>
        <updated>2022-02-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2022/02/24/teaclave-meetup-10#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">Recent Updates on Teaclave - Mingshen Sun (15m)</li>
<li class="">Proof of Being Forgotten: Verified Privacy Protection in Confidential Computing Platform - Hongbo Chen (30m)</li>
<li class="">Free discussion (15m)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="notes">Notes<a href="https://teaclave.apache.org/blog/2022/02/24/teaclave-meetup-10#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no">​</a></h2>
<p><strong>Teaclave Recent Updates</strong></p>
<ul>
<li class="">Teaclave FaaS
<ul>
<li class="">Optimize RPC memory footprint of <code>serde</code></li>
<li class="">Server error refactoring</li>
<li class="">Executor watchdog</li>
<li class="">Task canceling</li>
<li class="">APIs: <code>list_users</code>, <code>delete_user</code>, <code>reset_user</code>, <code>user_change_password</code>, <code>disable_function</code></li>
<li class="">Optional input/output files</li>
</ul>
</li>
<li class="">Teaclave TrustZone SDK
<ul>
<li class="">Update to OP-TEE 3.16.0 (no breaking change)</li>
</ul>
</li>
<li class="">GSoC 2022 call for participation</li>
<li class="">Powered by Teaclave - P4Cleanroom: P4Cleanroom is a confidential cloud service
for hosting computational biology algorithms as SaaS services on the cloud.
Computational biology researchers can publish their algorithms on P4Cleanroom
as a SaaS service to customers, such as researchers in pharmaceutical
companies and health care institutes.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="P4Cleanroom - Powered by Teclave" src="https://teaclave.apache.org/assets/images/p4cleanroom-powered-by-teaclave-0571ff757db35bd4f1ea4fb1ee097f26.png" width="2346" height="1206" class="img__Ss2"></p>
<p><strong>Proof of Being Forgotten</strong></p>
<p>The talk is same with the recent talk on OC3. Video can be found at:</p>
<ul>
<li class="">Video: <a href="https://www.youtube.com/watch?v=NrOySgI7O3o&amp;list=PLEhAl3D5WVvSD7Kh1lyF95dWmcPICXc2u" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=NrOySgI7O3o&amp;list=PLEhAl3D5WVvSD7Kh1lyF95dWmcPICXc2u</a></li>
</ul>
<p>Q&amp;A during the talk:</p>
<p>Gary: Assumption on reusing TEE sandbox?</p>
<p>Hongbo: No, if not reuse TEE, still has leakage.</p>
<p>Gary: What is Zone, is it heap?</p>
<p>Hongbo: No only. E.g., secrets in stack and also in general purpose registers.</p>
<p>Gary: How to demonstrate/show the Proof of Being Forgotten? Attestation? Enclave hash?</p>
<p>Mingshen: PoBF is a statically verified property. We also consider to add
dynamic traces for post-mortem auditing. Combined with the enclave hash and
reproducible build, we can provide the proof before the execution statically,
and after the execution dynamically.</p>
<p><strong>Topic for the Next Meetup</strong></p>
<ul>
<li class="">HyperEnclave in Ant Finance - Shuang Liu</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2022/02/24/teaclave-meetup-10#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Hongbo Chen</li>
<li class="">Gary</li>
<li class="">Ran Duan</li>
<li class="">He Sun</li>
<li class="">Ruide Zhang</li>
<li class="">Weijie Liu</li>
<li class="">Chan Zhao</li>
</ul>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #9]]></title>
        <id>https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9</id>
        <link href="https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9"/>
        <updated>2021-11-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">SmashEx: Smashing SGX Enclaves Using Exceptions — Jinhua Cui</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="notes">Notes<a href="https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no">​</a></h2>
<ul>
<li class=""><em>SmashEx: Smashing SGX Enclaves Using Exceptions</em> (CCS 2021):
Jinhua Cui (National University of Defense Technology, National University of
Singapore); Zhijingcheng Yu (National University of Singapore); Shweta Shinde
(ETH Zurich); Prateek Saxena (National University of Singapore); Zhiping Cai
(National University of Defense Technology)</li>
<li class=""><a href="https://arxiv.org/ftp/arxiv/papers/2110/2110.06657.pdf" target="_blank" rel="noopener noreferrer" class="">https://arxiv.org/ftp/arxiv/papers/2110/2110.06657.pdf</a></li>
<li class="">CVE-2021-0186
<ul>
<li class=""><a href="https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html" target="_blank" rel="noopener noreferrer" class="">https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html</a></li>
<li class=""><strong>Description</strong>: Improper input validation in the Intel(R) SGX SDK
applications compiled for SGX2 enabled processors may allow a privileged
user to potentially escalation of privilege via local access.</li>
<li class=""><strong>Affected Products</strong>: Intel SGX SDK for Windows v2.12 and earlier, Intel
SGX SDK for Linux v2.13 and earlier, Intel® Processors supporting SGX2.</li>
<li class="">Intel recommends updating the Intel® SGX SDK to the versions listed below.
Enclaves built with the new Intel® SGX SDK version should increment the
value of their ISVSVN field.</li>
</ul>
</li>
<li class="">Patch: <a href="https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc" target="_blank" rel="noopener noreferrer" class="">https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc</a></li>
<li class=""><a href="https://teaclave.apache.org/blog/2021-10-25-security-advisory-of-smashex-and-cve-2021-0186/" target="_blank" rel="noopener noreferrer" class="">Security Advisory from the Teaclave Community</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Jinghua</li>
<li class="">Ran Duan</li>
<li class="">Rong Fan</li>
<li class="">Gordon</li>
<li class="">He Sun</li>
<li class="">Hongbo Chen</li>
<li class="">Jason Yu</li>
<li class="">Pei Wang</li>
<li class="">ruanwenwen</li>
<li class="">Rundong</li>
<li class="">Tongxin Li</li>
<li class="">Weijie Liu</li>
<li class="">Yuan Zhuang</li>
<li class="">Zha0Chan</li>
<li class="">Mingshen Sun</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="group-photo">Group Photo<a href="https://teaclave.apache.org/blog/2021/11/30/teaclave-meetup-9#group-photo" class="hash-link" aria-label="Direct link to Group Photo" title="Direct link to Group Photo" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Group Photo" src="https://teaclave.apache.org/assets/images/teaclave-meetup-9-zoom-44f7cab836413763990b7bd2543585f5.png" width="3808" height="2414" class="img__Ss2"></p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Security Advisory of SmashEx and CVE-2021-0186]]></title>
        <id>https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186</id>
        <link href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186"/>
        <updated>2021-10-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Recently, we were notified of a re-entrancy vulnerability in the exception]]></summary>
        <content type="html"><![CDATA[<p>Recently, we were notified of a re-entrancy vulnerability in the exception
handling designs of some popular SGX SDKs (including Intel SGX SDK), resulting in
arbitrary disclosure of enclave private memory and code-reuse attacks in SGX
enclave.</p>
<p>The vulnerability is named as <a href="https://jasonyu1996.github.io/SmashEx/" target="_blank" rel="noopener noreferrer" class="">SmashEx</a>
[1]. The SmashEx attack affects several SGX runtimes with exception handling.
For Intel SGX SDK, the assigned identifier is
<a href="https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html" target="_blank" rel="noopener noreferrer" class="">CVE-2021-0186</a> [2].
While the vulnerability itself is not a Teaclave flaw, we're taking proactive
measures to explain and mitigate its impact on Teaclave users.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="overview">Overview<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Due to the lack of atomicity primitives in SGX enclaves, an SGX enclave can be
interrupted and re-entered at any time, including when it is in a state unsafe
for re-entry (i.e., when it is executing a critical section). The SmashEx attack
exploits such unsafe enclave re-entries happening in the exception handling
mechanism in the SGX runtime.</p>
<p>A malicious host can create an exception immediately after EENTER which causes
control to be transferred to the host before the enclave stack (RSP register)
has been properly set up. Then, a special ECALL (called <code>ECMD_EXCEPT</code>) to
enclave will use the attacker-controlled RSP register to setup the context of
the exception handler function. At last, when the host transfers control back to the
enclave with ERESUME, it may execute with a stack that resides in host memory
thereby enabling ROP exploits.</p>
<p>This vulnerability can be fixed by adding extra checks on untrusted RSP when
constructing the context of the exception handler.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="affected-versions">Affected Versions<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#affected-versions" class="hash-link" aria-label="Direct link to Affected Versions" title="Direct link to Affected Versions" translate="no">​</a></h2>
<p>For Intel SGX SDK, the vulnerability affects all projects using the following
versions.</p>
<ul>
<li class="">Intel SGX SDK for Windows v2.12 and erlier</li>
<li class="">Intel SGX SDK for Linux v2.13 and earlier</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="impacts-on-teaclave">Impacts on Teaclave<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#impacts-on-teaclave" class="hash-link" aria-label="Direct link to Impacts on Teaclave" title="Direct link to Impacts on Teaclave" translate="no">​</a></h2>
<p>Teaclave SGX SDK wraps Intel SGX SDK and provides a Rust development
environment. The affected Intel SGX SDK version was recommended in Rust SGX SDK
v1.1.3 (which is a pre-Apache release). Therefore, people using Rust SGX SDK
v1.1.3 with the vulnerable Intel SGX SDK (v2.13 and earlier) are also
vulnerable. <em>However, the current Teaclave SGX SDK is compatible with newer Intel SGX
SDK versions. Therefore, we recommend all users to upgrade to the latest Intel
SGX SDK.</em></p>
<p>For Teaclave (i.e., the Teaclave FaaS platform), it uses Teaclave SGX SDK to
build a confidential computing platform. Therefore, the Teaclave v0.2.0 released
in March used the vulnerable Intel SGX SDK version.
<em>However, the <a href="https://github.com/apache/incubator-teaclave/releases/tag/v0.3.0" target="_blank" rel="noopener noreferrer" class="">v0.3.0 released</a> [3]
in August has upgraded the Intel SGX SDK to v2.14 with the fix. Therefore,
the latest release of Teaclave is not affected by this vulnerability.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="patches--mitigations">Patches &amp; Mitigations<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#patches--mitigations" class="hash-link" aria-label="Direct link to Patches &amp; Mitigations" title="Direct link to Patches &amp; Mitigations" translate="no">​</a></h2>
<p>The vulnerability has been fixed in Intel SGX SDK in this patch:</p>
<ul>
<li class="">Patch: <a href="https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc" target="_blank" rel="noopener noreferrer" class="">https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc</a></li>
</ul>
<p>Teaclave users can apply the following mitigations:</p>
<ul>
<li class="">Use Teacalve SGX SDK with Intel SGX SDK for Linux version 2.14 or later</li>
<li class="">Upgrade to Teaclave 0.3.0 or later</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="acknowledgements">Acknowledgements<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>We would like to thank Jinhua Cui, National University of Defense Technology and
National University of Singapore, Shweta Shinde, ETH Zurich , Zhijingcheng Yu,
National University of Singapore, and Prateek Saxena, National University of
Singapore for notifying us about this issue.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="references">References<a href="https://teaclave.apache.org/blog/2021/11/01/security-advisory-of-smashex-and-cve-2021-0186#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class="">[1] <a href="https://jasonyu1996.github.io/SmashEx/" target="_blank" rel="noopener noreferrer" class="">https://jasonyu1996.github.io/SmashEx/</a></li>
<li class="">[2] <a href="https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html" target="_blank" rel="noopener noreferrer" class="">https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html</a></li>
<li class="">[3] <a href="https://github.com/apache/incubator-teaclave/releases/tag/v0.3.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/incubator-teaclave/releases/tag/v0.3.0</a></li>
<li class=""><a href="https://arxiv.org/abs/2110.06657" target="_blank" rel="noopener noreferrer" class="">SmashEx: Smashing SGX Enclaves Using Exceptions</a></li>
<li class=""><a href="https://github.com/openenclave/openenclave/security/advisories/GHSA-mj87-466f-jq42" target="_blank" rel="noopener noreferrer" class="">Open Enclave SDK Elevation of Privilege Vulnerability</a></li>
</ul>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[使用 Teaclave TrustZone SDK 开发 TrustZone 应用]]></title>
        <id>https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk</id>
        <link href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk"/>
        <updated>2021-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[[[TOC]]]]></summary>
        <content type="html"><![CDATA[<p>[[TOC]]</p>
<p>在 <a href="https://teaclave.apache.org/blog/2021-03-15-welcome-rust-optee-trustzone-sdk-cn/" target="_blank" rel="noopener noreferrer" class="">欢迎 RUST OP-TEE TRUSTZONE SDK 成为 TEACLAVE 子项目</a> 一文中已经对Teaclave TrustZone SDK 项目进行了简单的介绍。在本文中，将会介绍使用 Teaclave TrustZone SDK 开发 TrustZone 应用程序。</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-trustzone-sdk-应用开发环境搭建">Teaclave TrustZone SDK 应用开发环境搭建<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#teaclave-trustzone-sdk-%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="Direct link to Teaclave TrustZone SDK 应用开发环境搭建" title="Direct link to Teaclave TrustZone SDK 应用开发环境搭建" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="准备条件">准备条件<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E5%87%86%E5%A4%87%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="Direct link to 准备条件" title="Direct link to 准备条件" translate="no">​</a></h3>
<ul>
<li class="">Ubuntu 系列</li>
</ul>
<p><em>本文基于的 Teaclave TrustZone SDK 提交哈希值：8520a2018705edcebfb7e729bd2ced12414fc052</em></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="配置-teaclave-trustzone-sdk-编译环境">配置 Teaclave TrustZone SDK 编译环境<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E9%85%8D%E7%BD%AE-teaclave-trustzone-sdk-%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 配置 Teaclave TrustZone SDK 编译环境" title="Direct link to 配置 Teaclave TrustZone SDK 编译环境" translate="no">​</a></h3>
<p>下载 Teaclave TrustZone SDK 项目，初始化相关的子模块并安装 Rust 工具链以及交叉编译工具 Xargo。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ git clone https://github.com/apache/incubator-teaclave-trustzone-sdk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ cd incubator-teaclave-trustzone-sdk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ ./setup.sh</span><br></span></code></pre></div></div>
<p>初始化 OP-TEE 子模块。初始化完毕之后，在 <code>optee</code> 根目录下需要有 <code>build/</code>, <code>optee_os/</code> 和 <code>optee_client</code> 子目录。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ git submodule update --init -- optee</span><br></span></code></pre></div></div>
<p>在编译样例之前，需要设置环境变量。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ source environment</span><br></span></code></pre></div></div>
<p>默认情况下，目标平台是 <code>aarch64</code>，如果希望为 <code>arm</code> 平台编译，需要在 <code>source environment</code> 之前设置 <code>ARCH</code> 变量。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ export ARCH=arm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ source environment</span><br></span></code></pre></div></div>
<p>接着，下载 ARM 工具链并编译 OP-TEE 库。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">make optee</span><br></span></code></pre></div></div>
<p>最后，编译 Teaclave TrustZone SDK 官方提供的例子。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">make examples</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="在-qemu-armv8-上运行-teaclave-trustzone-sdk-应用程序">在 QEMU ARMv8 上运行 Teaclave TrustZone SDK 应用程序<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E5%9C%A8-qemu-armv8-%E4%B8%8A%E8%BF%90%E8%A1%8C-teaclave-trustzone-sdk-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" class="hash-link" aria-label="Direct link to 在 QEMU ARMv8 上运行 Teaclave TrustZone SDK 应用程序" title="Direct link to 在 QEMU ARMv8 上运行 Teaclave TrustZone SDK 应用程序" translate="no">​</a></h3>
<p>现在，Teaclave TrustZone SDK 官方提供的示例已经编译好了，但如果需要在 QEMU ARMv8 模拟器上运行这些示例，还需要准备一个支持 OP-TEE 的 QEMU 环境，从而在该环境上运行已经编译好的 SDK 中的示例。
首先，需要安装 QEMU 环境需要的依赖。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        automake bc bison build-essential ccache cscope curl device-tree-compiler \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        expect flex ftp-upload gdisk iasl libattr1-dev libc6:i386 libcap-dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        libpixman-1-dev libssl-dev libstdc++6:i386 libtool libz1:i386 make \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mtools netcat python-crypto python3-crypto python-pyelftools \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        python3-pycryptodome python3-pyelftools python-serial python3-serial \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        rsync unzip uuid-dev xdg-utils xterm xz-utils zlib1g-dev</span><br></span></code></pre></div></div>
<p>也可以选择使用 Teaclave TrustZone SDK 官方提供的 docker，在 docker 中开发就无需下载上述依赖。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ docker pull teaclave/teaclave-trustzone-sdk-build:0.2.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># start docker</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ docker run -ti teaclave/teaclave-trustzone-sdk-build:0.2.1</span><br></span></code></pre></div></div>
<p>下载 QEMU ARMv8 对应的 OP-TEE 的源代码。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ mkdir -p ~/bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ curl https://storage.googleapis.com/git-repo-downloads/repo-1 &gt; ~/bin/repo &amp;&amp; chmod a+x ~/bin/repo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ export PATH=~/bin:$PATH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ mkdir optee-qemuv8-3.14.0 &amp;&amp; cd optee-qemuv8-3.14.0 &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml -b 3.14.0 &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  repo sync -j4 --no-clone-bundle</span><br></span></code></pre></div></div>
<p>编译 QEMU ARMv8 OP-TEE。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ make -j2 toolchains &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make QEMU_VIRTFS_ENABLE=y CFG_TEE_RAM_VA_SIZE=0x00300000</span><br></span></code></pre></div></div>
<p>在漫长的编译过程之后，还需要新建一个共享文件夹，用于和 QEMU 子系统共享示例的 host apps 和 TAs。</p>
<p>首先要将 <code>path/to/example/host/target/aarch64-unknown-linux-gnu/release/example</code> 和 <code>path/to/example/ta/target/aarch64-unknown-optee-trustzone/release/*.ta</code> 分别复制到 <code>incubator-teaclave-trustzone-sdk/out/host</code> 和 <code>incubator-teaclave-trustzone-sdk/out/ta/</code>。接着还需要将 <code>incubator-teaclave-trustzone-sdk/out/*</code> 中的文件复制到 QEMU 共享文件夹 <code>shared_folder/</code> 中。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ mkdir shared_folder</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ (cd /project/root/dir/ &amp;&amp; make examples-install)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ cp -r /project/root/dir/out/* shared_folder/</span><br></span></code></pre></div></div>
<p>如果处于一个没有 GUI 的运行环境，在启动 QEMU 之前，还需要修改 <code>qemu_v8.mk</code> 中的代码。以 OP-TEE QEMU 3.14.0 版本为例，注释掉 <code>optee-qemuv8-3.14.0/build/qemu_v8.mk</code> 中的 386-388 行。</p>
<div class="language-makefile codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-makefile codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">.PHONY: run-only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">run-only:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ln -sf $(ROOT)/out-br/images/rootfs.cpio.gz $(BINARIES_PATH)/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        $(call check-terminal)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        $(call run-help)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        # $(call launch-terminal,54320,"Normal World")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        # $(call launch-terminal,54321,"Secure World")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        # $(call wait-for-ports,54320,54321)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        cd $(BINARIES_PATH) &amp;&amp; $(QEMU_BUILD)/aarch64-softmmu/qemu-system-aarch64 \</span><br></span></code></pre></div></div>
<p>在启动 QEMU 之前前，需要运行 <code>nc</code> 来监听端口 <code>54320</code> 和 <code>54321</code>。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ nc -l 127.0.0.1 -p 54320</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ nc -l 127.0.0.1 -p 54321</span><br></span></code></pre></div></div>
<p>进入 <code>qemu_v8.mk</code> 所在的目录启动 QEMU。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">make run-only QEMU_VIRTFS_ENABLE=y QEMU_VIRTFS_HOST_DIR=$(pwd)/shared_folder</span><br></span></code></pre></div></div>
<p>当 QEMU 启动之后，端口 <code>54320</code> 窗口中运行的是普通世界，端口 <code>54321</code> 窗口中运行的是安全世界。在普通世界中，根据提示输入 <code>root</code> 登录后，需要将共享文件夹挂载到 QEMU 子系统中，用于在 QEMU 中访问编译好的 CA/TA 可执行文件。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ mkdir shared &amp;&amp; mount -t 9p -o trans=virtio host shared</span><br></span></code></pre></div></div>
<p>接着，需要将 TA 复制到 <code>/lib/optee_armtz</code> 目录下，提供给安全世界调用。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd shared &amp;&amp; cp ta/*.ta /lib/optee_armtz/</span><br></span></code></pre></div></div>
<p>进入 <code>host</code> 文件夹中并执行 host apps。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ ./hello_world</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">original value is 29</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">inc value is 129</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dec value is 29</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Success</span><br></span></code></pre></div></div>
<p>至此，我们成功地在 QEMU 环境中运行了 Teaclave TrustZone SDK 的 <code>hello_world-rs</code> 示例。</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="配置-teaclave-trustzone-sdk-应用程序的-debug-环境">配置 Teaclave TrustZone SDK 应用程序的 debug 环境<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E9%85%8D%E7%BD%AE-teaclave-trustzone-sdk-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84-debug-%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 配置 Teaclave TrustZone SDK 应用程序的 debug 环境" title="Direct link to 配置 Teaclave TrustZone SDK 应用程序的 debug 环境" translate="no">​</a></h3>
<p>在开发应用程序的时候，难免会有 debug 的需求，在这不一部分，将会简单介绍如何在 Teaclave TrustZone SDK 中配置 debug 环境。</p>
<p>在编译 QEMU ARMv8 OPTEE 时需要关闭 ASLR，可以通过直接修改 <code>OP-TEE/optee_os/mk/config.mk</code> 文件中的 <code>CFG_CORE_ASLR</code> 为 <code>n</code>，注意修改之后还需要重新编译 <code>make run</code>。</p>
<div class="language-makefile codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-makefile codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain"># CFG_CORE_ASLR ?= y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CFG_CORE_ASLR ?= n</span><br></span></code></pre></div></div>
<p>也可以直接在编译时添加编译信息： <code>make run CFG_CORE_ASLR=n</code>。</p>
<p>由于程序是在远程系统上 (QEMU) 上被 debugged，所以在编译时还需要加上 <code>GDBSERVER=y</code>。</p>
<p>在启动 gdb 之后，执行 <code>target remote :1234</code> 命令连接上 QEMU GDB 服务器端口。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ ./path/to/qemu-v8-project/out-br/host/bin/aarch64-buildroot-linux-gnu-gdb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">(gdb) target remote :1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Remote debugging using :1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">warning: No executable has been specified and target does not support</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">determining executable automatically.  Try using the "file" command.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0xffffb30b00ea12b4 in ?? ()</span><br></span></code></pre></div></div>
<p>接下来，加载 TEE 内核符号表。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">(gdb) symbol-file /path/to/qemu-v8-project/optee_os/out/arm/core/tee.elf</span><br></span></code></pre></div></div>
<p>以 <code>hello_world-rs</code> 为例，根据安全世界窗口提示，可知 <code>hello_world-rs</code> 的 TA text 部分的起始地址为 0x40014000。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">D/LD:  ldelf:168 ELF (133af0ca-bdab-11eb-9130-43bf7873bf67) at 0x40014000</span><br></span></code></pre></div></div>
<p>根据该地址提示，从该地址开始加载 <code>hello_world-rs</code> 的 ta 符号表。</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">(gdb) add-symbol-file /path/to/examples/hello_world-rs/ta/target/aarch64-unknown-optee-trustzone/debug/ta 0x40014000</span><br></span></code></pre></div></div>
<p>然后，可以根据自己的需求在相应的函数或地址上打断点。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">(gdb) b open_session</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="QEMU 执行示意图" src="https://teaclave.apache.org/assets/images/2021-10-15-qemu-world-execution-windows-6ac2c359fde49aa8310143bb005c6553.png" width="1900" height="1064" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-trustzone-sdk-示例-hello_world-rs-剖析">Teaclave TrustZone SDK 示例 hello_world-rs 剖析<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#teaclave-trustzone-sdk-%E7%A4%BA%E4%BE%8B-hello_world-rs-%E5%89%96%E6%9E%90" class="hash-link" aria-label="Direct link to Teaclave TrustZone SDK 示例 hello_world-rs 剖析" title="Direct link to Teaclave TrustZone SDK 示例 hello_world-rs 剖析" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="hello_world-rs-目录结构"><code>hello_world-rs</code> 目录结构<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#hello_world-rs-%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" class="hash-link" aria-label="Direct link to hello_world-rs-目录结构" title="Direct link to hello_world-rs-目录结构" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── main.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── proto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── build.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── lib.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── ta</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Xargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── build.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── main.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── ta_aarch64.lds</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── ta_arm.lds</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── ta_static.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── uuid.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class=""><code>host</code> 文件夹中存放的是普通世界的 <code>untrusted code</code>。
<ul>
<li class=""><code>host/src/main.rs</code> 是 <code>hello_world-rs</code> 应用程序执行的入口，<code>Cargo.toml</code> 描述了 <code>host</code> 部分的依赖， <code>Cargo.lock</code> 中包含了依赖项的完整信息，<code>Makefile</code> 定义了 <code>host</code> 部分的编译信息。</li>
</ul>
</li>
<li class=""><code>ta</code> 文件夹中存放的是安全世界中的 <code>trusted code</code>。
<ul>
<li class="">相比较 <code>host</code>，<code>ta</code> 文件夹中多了以下文件：<code>Xargo.toml</code> 是 TA 的交叉编译文件 ，<code>ta_aarch64.lds</code> 和 <code>ta_arm.lds</code> 分别定义了在 64 位架构和 32 位架构下 teaclave trustzone sdk 应用程序各部分在程序地址空间内的布局；<code>ta_static.rs</code> 定义了 TA 中的静态数据信息。</li>
</ul>
</li>
<li class=""><code>proto</code> 文件夹中存放的是 CA (Client Application) 和 TA (Trusted Application) 共享的数据结构，并承担着解析 <code>uuid.txt</code> 提取 UUID 的任务。</li>
<li class=""><code>uuid.txt</code> 文件中记录的是 TA 的 UUID，是每个 TA 独一无二的身份标识。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="hello_world-rs-重要代码文件解析"><code>hello_world-rs</code> 重要代码文件解析<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#hello_world-rs-%E9%87%8D%E8%A6%81%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="Direct link to hello_world-rs-重要代码文件解析" title="Direct link to hello_world-rs-重要代码文件解析" translate="no">​</a></h3>
<ul>
<li class=""><code>host/src/main.rs</code></li>
</ul>
<p>进入 <code>main</code> 函数，首先调用 <code>Context::new</code> 函数建立起 <code>hello_world-rs</code> CA 和 TA 的逻辑联系，<code>ctx</code> 指向类型为 <code>Context</code> 的变量的地址，用于 CA 和 TA 的连接和通信。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Context</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>调用 <code>open_session</code> 在 CA 和对应的 TA 中打开一个 <code>session</code>，并将 <code>hello_world-rs</code> 的 UUID 作为参数传入，用于指引 CA 连接对应 UUID 值的 TA。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Uuid</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">parse_str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">UUID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> session </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">open_session</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>将 <code>&amp;mut session</code> 作为参数传入 <code>hello_world</code> 函数中。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">hello_world</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>进入到 <code>hello_world</code> 函数中，首先将要进行运算的 <code>u32</code> 操作数用 <code>ParamValue</code> 类型包装为操作数 <code>p0</code>，设置其值为29，类型为 <code>ValueInout</code>，表示同时作为输入参数和返回值。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> p0 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ParamValue</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">29</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ParamType</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">ValueInout</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><code>operation</code> 用于保存 CA 要传递给 TA 的参数信息，第一个参数一般保留为 0，由于这里只有一个要传递的参数 <code>p0</code>，其他参数都保留为 <code>ParamNone</code>。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> operation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Operation</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> p0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ParamNone</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ParamNone</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ParamNone</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>CA 端使用获取到的 <code>session</code>, <code>command_id</code> 和要传递的参数 <code>operation</code> 调用 <code>invoke_command</code> 执行特定的 <code>command</code>，该操作将会切换到安全世界。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">invoke_command</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">IncValue</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> operation</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<ul>
<li class=""><code>ta/src/main.rs</code></li>
</ul>
<p><code>ta/src/main.rs</code> 中的 <code>invoke_command</code> 函数参数与 host 中调用的 <code>invoke_command</code> 略有不同，第二个参数是 <code>Paramters</code> 类型。当数据从 CA 传递到 TA 时，实际上执行的是按 bit 的复制操作，所以 <code>params</code> 中的数据就是从 <code>operation</code> 中传递过来的数据.</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">invoke_command</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token class-name">Parameters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><br></span></code></pre></div></div>
<p><code>values</code> 从 <code>params</code> 取出要操作的 <code>u32</code> 值，<code>match</code> 表达式根据传入的参数 <code>cmd_id</code> 匹配对应的操作。在下面的代码中，如果匹配到 <code>Command::IncValue</code>，就对 <code>values</code> 中的 <code>u32</code> 值执行 +100 的操作；如果匹配到 <code>Command::DecValue</code>，就执行 -100 的操作；如果匹配到其他值，就直接返回错误参数的错误类型。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">invoke_command</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token class-name">Parameters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">trace_println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"[+] TA invoke command"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> values </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token number" style="color:#36acaa">.0</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">IncValue</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            values</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_a</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">values</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">a</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">DecValue</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            values</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_a</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">values</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">a</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _ </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ErrorKind</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">BadParameters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<ul>
<li class=""><code>proto/src/lib.rs</code></li>
</ul>
<p><code>lib.rs</code> 中的枚举变量 <code>Command</code> 声明是开发者要实现的命令。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token type-definition class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">IncValue</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">DecValue</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Unknown</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="编译之后的-hello_world-rs-代码目录">编译之后的 <code>hello_world-rs</code> 代码目录<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E7%BC%96%E8%AF%91%E4%B9%8B%E5%90%8E%E7%9A%84-hello_world-rs-%E4%BB%A3%E7%A0%81%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="Direct link to 编译之后的-hello_world-rs-代码目录" title="Direct link to 编译之后的-hello_world-rs-代码目录" translate="no">​</a></h3>
<p>编译之后的代码目录如下所示，这里省略了 <code>release</code> 文件夹下的内容。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── main.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── target                               #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── aarch64-unknown-linux-gnu        #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     │&nbsp;&nbsp; └── release                      #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── release                          #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── proto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── build.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── lib.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── target                               #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── rls                              #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;         └── debug                        #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── ta</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Xargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── build.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── main.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── ta_aarch64.lds</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── ta_arm.lds</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── ta_static.rs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── target                               #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── aarch64-unknown-optee-trustzone  #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     │&nbsp;&nbsp; └── release                      #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── release                          #[generate]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── uuid.txt</span><br></span></code></pre></div></div>
<p><code>hello_world-rs</code> 编译过程更类似于 Rust 程序编译。</p>
<ul>
<li class="">编译不可信部分 host 文件夹，生成 <code>hello_world-rs</code> 可执行文件；</li>
<li class="">交叉编译可信部分 ta 文件夹，再用 UUID 和密钥进行签名，生成 <code>UUID.ta</code> 可执行文件。</li>
<li class="">在执行时，<code>hello_world-rs</code> 对 <code>UUID.ta</code> 验证通过后调用执行。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="开发者如何开发自己的-teaclave-trustzone-sdk-应用程序">开发者如何开发自己的 Teaclave TrustZone SDK 应用程序<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E5%BC%80%E5%8F%91%E8%80%85%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91%E8%87%AA%E5%B7%B1%E7%9A%84-teaclave-trustzone-sdk-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" class="hash-link" aria-label="Direct link to 开发者如何开发自己的 Teaclave TrustZone SDK 应用程序" title="Direct link to 开发者如何开发自己的 Teaclave TrustZone SDK 应用程序" translate="no">​</a></h2>
<p>和前面介绍过的 <a href="https://teaclave.apache.org/blog/2021-08-25-developing-sgx-application-with-teaclave-sgx-sdk/" target="_blank" rel="noopener noreferrer" class="">使用 TEACLAVE SGX SDK 开发 SGX 应用</a> 相似，这里也同样通过对 Teaclave TrustZone SDK 示例程序 <code>hello_world-rs</code> 进行改写来介绍如何构造自己的 Teaclave TrustZone SDK。</p>
<p>需要注意的是，Teaclave TrustZone SDK 是通过 UUID 唯一标识系统中的 TA，UUID 值不能重复，所以我们首先需要通过 <a href="https://www.itu.int/en/ITU-T/asn1/Pages/UUID/uuids.aspx" target="_blank" rel="noopener noreferrer" class="">ITU-T UUID generator</a> 网站申请属于自己的唯一的 UUID，并将 <code>uuid.rs</code> 文件中的内容修改为新得到的 UUID 值。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">1487a406-160d-4641-957e-66292f8d1309</span><br></span></code></pre></div></div>
<p>假设开发目标是为两个 <code>u8</code> 数组求得交集和并集，也就是要实现交集函数 <code>Intersection</code> 和并集函数 <code>Union</code> 两个功能函数。</p>
<p>对 <code>proto/lib.rs</code> 进行修改，将 <code>Command</code> 中的成员替换为待实现的 <code>Intersection</code> 和 <code>Union</code>。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token type-definition class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Intersection</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Union</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Unknown</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">From</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">u32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute attr-name" style="color:#00a4db">#[inline]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u32</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> value </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Intersection</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Union</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            _ </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Unknown</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>接着，进入 <code>host/src/main.rs</code> 中的 <code>main</code> 函数，添加进行数据计算的函数，将用于与 TA 通信的 session 内存地址作为参数传递到 <code>data_compute</code> 中。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">data_compute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>在 <code>data_compute</code> 中，首先声明要进行数据处理的两个 <code>u8</code> 数组 <code>nums1</code> 和 <code>nums2</code>，以及用于存储数据处理结果的 <code>resu</code>。在示例代码 <code>hello_world</code> 中的变量声明使用的是 <code>ParamValue</code>，但这里我们需要访问数组，一段连续的内存变量而非变量。通过阅读 Teaclave TrustZone SDK client 端的 Rust 仓库 <a href="https://teaclave.apache.org/api-docs/trustzone-sdk/optee-teec/optee_teec/index.html" target="_blank" rel="noopener noreferrer" class="">Crate optee_teec</a>，可知 <code>ParamTmpRef</code> 用于定义临时内存访问。于是将这三个数组地址作为参数新建 <code>ParamTmpRef</code> 类型，并将 <code>ParamTmpRef</code> 类型变量传递到 <code>operation</code> 中，用于传递给 TA 交互信息。</p>
<p>在准备好与 TA 交互的信息后，调用 <code>invoke_command</code> 通知对应的 TA 执行 <code>Command::Intersection</code> 指定的操作。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// in host/src/main.rs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">data_compute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token class-name">Session</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">optee_teec</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">[</span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">[</span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> resu </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">vec!</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> p1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ParamTmpRef</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new_input</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> p2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ParamTmpRef</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new_input</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> p3 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ParamTmpRef</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new_output</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> operation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Operation</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> p1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> p2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> p3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ParamNone</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"intersection invoke"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">invoke_command</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Intersection</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> operation</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><code>invoke_command</code> 函数的具体实现在 <code>ta/sec/main.rs</code> 文件中的 <code>invoke_command</code>。共享的参数通过 <code>params</code> 从 CA 传递到 TA 中，
同样，可以根据 TA 端的 Rust 仓库 <a href="https://teaclave.apache.org/api-docs/trustzone-sdk/optee-utee/optee_utee/index.html" target="_blank" rel="noopener noreferrer" class="">optee_utee</a> 提供的接口函数抽丝剥茧般地提取出来 <code>ParamMemref</code> 类型的 <code>nums1</code>, <code>nums2</code> 和 <code>vec_resu</code>。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token number" style="color:#36acaa">.0</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_memref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">raw</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token number" style="color:#36acaa">.1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_memref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">raw</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> vec_resu </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token number" style="color:#36acaa">.2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_memref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">raw</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums1_size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> nums2_size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>现在，进入 <code>match</code> 表达式中，将 <code>Command::from</code> 的枚举修改为 <code>Command::Intersection</code> 和 <code>Command::Union</code>。要实现的函数就填充到对应的分支括号中。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Intersection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Command</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Union</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>下面的示例代码实现的是求两个数组之间的交集元素。具体的实现是通过一个额外的散列集 <code>set</code>，记录 <code>nums1</code> 中的所有元素，然后对 <code>nums2</code> 中的元素进行遍历，如果 <code>nums2</code> 中的元素也出现在了 <code>set</code> 中，那么该元素为 <code>nums1</code> 和 <code>nums2</code> 共有，是交集元素，写入结果向量 <code>vec_resu</code> 中，并移除掉 <code>set</code> 中的该元素。最后，将结果向量的 <code>size</code> 修改为共有的交集元素的个数。其中，要读取 <code>nums1</code> 和 <code>nums2</code> 数组中的元素，还需要解引用 <code>ParamMemref</code> 类型的指针读取出指向元素值的 <code>buffer</code> 指针地址，再使用 <code>offset</code> 偏移指针从而读出 <code>nums1</code> 和 <code>nums2</code> 的值。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">u8</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> vec_count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">nums1_size </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">val_nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">nums2_size </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">vec_resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vec_count </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> val_nums2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          vec_count </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">vec_resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vec_count</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>对于 <code>Union</code> 函数的实现，同样是利用一个额外的散列集 <code>set</code>，记录 <code>nums1</code> 中的所有元素，并直接将 <code>nums1</code> 中的元素写入结果向量 <code>vec_resu</code> 中，而后再依次读取 <code>nums2</code> 中的元素，如果该元素没有在 <code>set</code> 中出现，则写入结果向量 <code>vec_resu</code> 和散列集 <code>set</code> 中。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">u8</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> vec_count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">nums1_size </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">vec_resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vec_count </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> val_nums1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        vec_count </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">val_nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">nums2_size </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">vec_resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">buffer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vec_count </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> val_nums2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          vec_count </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">vec_resu</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vec_count</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>回到 <code>host/src/main.rs</code>，通过 <code>updated_size</code> 函数读取到在 <code>ta/src/main.rs</code> 中对 <code>vec_resu</code> 新设置的 <code>size</code> 值，也就是 <code>nums1</code> 和 <code>nums2</code> 共有的元素的个数，最后打印出结果向量 <code>resu</code> 的值。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// in data_compute function</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> updated_size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> operation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">parameters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">updated_size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Intersection resu = {:?}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">resu</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">updated_size</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>这样，我们就基于 Teaclave TrustZone SDK 提供的示例代码实现了自己的求交集和并集函数。</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="总结">总结<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h2>
<p>本文首先介绍 Teaclave TrustZone SDK 项目的环境配置过程，然后介绍了简单示例 <code>hello_world-rs</code> 的组织结构和编译过程 ，最后，通过修改 <code>hello_world-rs</code> 实现 <code>intersection</code> 和 <code>union</code> 函数为例，介绍如何基于提供的 SampleCode 进行 Teaclave TrustZone SDK 应用程序的开发。</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="延伸阅读">延伸阅读<a href="https://teaclave.apache.org/blog/2021/10/15/developing-teaclave-application-with-teaclave-trustzone-sdk#%E5%BB%B6%E4%BC%B8%E9%98%85%E8%AF%BB" class="hash-link" aria-label="Direct link to 延伸阅读" title="Direct link to 延伸阅读" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://teaclave.apache.org/trustzone-sdk-docs/" target="_blank" rel="noopener noreferrer" class="">Teaclave TrustZone SDK 文档</a></li>
<li class=""><a href="https://dl.acm.org/doi/10.1145/3427228.3427262" target="_blank" rel="noopener noreferrer" class="">Teaclave TrustZone SDK 项目论文：《RusTEE: Developing Memory-Safe ARM TrustZone Applications》</a></li>
</ul>]]></content>
        <author>
            <name>Wenwen Ruan</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #8]]></title>
        <id>https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8</id>
        <link href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8"/>
        <updated>2021-10-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Agenda]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">Recent update in Teaclave — Mingshen Sun</li>
<li class="">Using and Customizing Teaclave SGX SDK — Shunfan Zhou</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="notes">Notes<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="recent-update-in-teaclave--mingshen">Recent Update in Teaclave — Mingshen<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#recent-update-in-teaclave--mingshen" class="hash-link" aria-label="Direct link to Recent Update in Teaclave — Mingshen" title="Direct link to Recent Update in Teaclave — Mingshen" translate="no">​</a></h3>
<p><strong>Platform</strong></p>
<ul>
<li class="">[docker] start Teaclave docker services with auto-detection mechanism (#559).</li>
<li class="">Use <code>run-teaclave-service.sh</code> instead of using <code>docker-compose</code> directly.</li>
</ul>
<p><strong>SGX SDK</strong></p>
<ul>
<li class="">v1.1.4-testing: <a href="https://github.com/apache/incubator-teaclave-sgx-sdk/commits/v1.1.4-testing" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/incubator-teaclave-sgx-sdk/commits/v1.1.4-testing</a>
<ul>
<li class="">Rust <code>nightly-2021-09-13</code></li>
<li class="">Support Intel SGX SDK 2.15 and DCAP 1.12</li>
</ul>
</li>
<li class="">Project template refactoring</li>
<li class="">README polishing</li>
</ul>
<p><strong>TrustZone SDK</strong></p>
<ul>
<li class="">Teaclave/OP-TEE: Integrating examples in Rust TrustZone SDK in OP-TEE
<ul>
<li class="">Multiple PRs to OP-TEE's <code>manifest</code>, <code>build</code> repos.</li>
<li class="">Now in the <code>master</code> branch, should be available in the next release 3.15 in Oct 15.</li>
<li class="">OP-TEE with Rust: <a href="https://optee.readthedocs.io/en/latest/building/optee_with_rust.html" target="_blank" rel="noopener noreferrer" class="">https://optee.readthedocs.io/en/latest/building/optee_with_rust.html</a></li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="OP-TEE with Rust" src="https://teaclave.apache.org/assets/images/optee-with-rust-doc-a8f3b6b7bbcddffa2a1803fc65387b18.png" width="2234" height="1160" class="img__Ss2"></p>
<p><strong>Website</strong></p>
<ul>
<li class="">Add project/organization logos in the "Powered By" page: <a href="https://teaclave.apache.org/powered-by/" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/powered-by/</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Project Powered By Teaclave" src="https://teaclave.apache.org/assets/images/project-powered-by-teaclave-logo-d39c68917c55b2424528f648aa334722.png" width="2738" height="854" class="img__Ss2"></p>
<ul>
<li class="">Redesign the "Contributors" page
<ul>
<li class="">add Apache ID, GitHub ID to mentors, PPMC, and committers</li>
<li class="">Tags for committers to show areas that they are familiar with</li>
</ul>
</li>
<li class="">Add API Docs (references) of TrustZone SDK both for host and TA sides
<ul>
<li class="">Host: <a href="https://teaclave.apache.org/api-docs/trustzone-sdk/optee-teec" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/api-docs/trustzone-sdk/optee-teec</a></li>
<li class="">TA: <a href="https://teaclave.apache.org/api-docs/trustzone-sdk/optee-utee" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/api-docs/trustzone-sdk/optee-utee</a></li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Teaclave TrustZone SDK Links in Homepage" src="https://teaclave.apache.org/assets/images/teaclave-trustzone-sdk-links-in-homepage-79a052c9781f6bb626d6c8b8dfe13cf2.png" width="2538" height="752" class="img__Ss2"></p>
<ul>
<li class="">Blog
<ul>
<li class=""><a href="https://teaclave.apache.org/blog/2021-10-06-podling-teaclave-report-october-2021/" target="_blank" rel="noopener noreferrer" class="">Podling Teaclave Report - October 2021</a>&nbsp;· Oct 05 2021</li>
<li class=""><a href="https://teaclave.apache.org/blog/2021-10-01-announcing-teaclave-0-3-0/" target="_blank" rel="noopener noreferrer" class="">Announcing Apache Teaclave™ (incubating) 0.3.0</a>&nbsp;· Sep 30 2021</li>
</ul>
</li>
</ul>
<p><strong>Community</strong></p>
<ul>
<li class="">New committers: Yuan Zhuang and Rong Fan from Baidu</li>
<li class="">Discord: Connect directly with Teaclave community members (join link: <a href="https://discord.gg/ynECXsxm5P" target="_blank" rel="noopener noreferrer" class="">https://discord.gg/ynECXsxm5P</a>)</li>
</ul>
<p><strong>Security</strong></p>
<ul>
<li class=""><em>SmashEx: Smashing SGX Enclaves Using Exceptions</em> (to appear at CCS 2021):
Jinhua Cui (National University of Defense Technology, National University of
Singapore); Zhijingcheng Yu (National University of Singapore); Shweta Shinde
(ETH Zurich); Prateek Saxena (National University of Singapore); Zhiping Cai
(National University of Defense Technology)</li>
<li class=""><a href="https://arxiv.org/ftp/arxiv/papers/2110/2110.06657.pdf" target="_blank" rel="noopener noreferrer" class="">https://arxiv.org/ftp/arxiv/papers/2110/2110.06657.pdf</a></li>
<li class="">CVE-2021-0186
<ul>
<li class=""><a href="https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html" target="_blank" rel="noopener noreferrer" class="">https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00548.html</a></li>
<li class=""><strong>Description</strong>: Improper input validation in the Intel(R) SGX SDK
applications compiled for SGX2 enabled processors may allow a privileged
user to potentially escalation of privilege via local access.</li>
<li class=""><strong>Affected Products</strong>: Intel SGX SDK for Windows v2.12 and earlier, Intel
SGX SDK for Linux v2.13 and earlier, Intel® Processors supporting SGX2.</li>
<li class="">Intel recommends updating the Intel® SGX SDK to the versions listed below.
Enclaves built with the new Intel® SGX SDK version should increment the
value of their ISVSVN field.</li>
</ul>
</li>
<li class="">Patch: <a href="https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc" target="_blank" rel="noopener noreferrer" class="">https://github.com/intel/linux-sgx/commit/edfe42a517b3e4b1d81204c3cdef6da6cb35fefc</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Patch in Intel SGX SDK" src="https://teaclave.apache.org/assets/images/cve-2021-0186-patch-faa6b7d42812c2cb5f40541f41158001.png" width="2388" height="1520" class="img__Ss2"></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="using-and-customizing-teaclave-sgx-sdk--shunfan-zhou">Using and Customizing Teaclave SGX SDK — Shunfan Zhou<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#using-and-customizing-teaclave-sgx-sdk--shunfan-zhou" class="hash-link" aria-label="Direct link to Using and Customizing Teaclave SGX SDK — Shunfan Zhou" title="Direct link to Using and Customizing Teaclave SGX SDK — Shunfan Zhou" translate="no">​</a></h3>
<ul>
<li class="">Teaclave SGX SDK
<ul>
<li class="">pro: security</li>
<li class="">con: testing is hard</li>
</ul>
</li>
<li class="">Case study: rust-bitcoin
<ul>
<li class="">std</li>
<li class="">Feature</li>
<li class="">Port dependencies recursively</li>
</ul>
</li>
<li class="">Some issues
<ul>
<li class="">efforts of porting</li>
<li class="">security: 1) updates of upstream, 2) unit tests</li>
<li class="">More TEE backend: AMD SEV, ARM CCA</li>
</ul>
</li>
<li class="">libs is not completed in SGX for vanilla Rust standard library</li>
<li class="">Phala libc-hacks
<ul>
<li class="">directly use Intel's libc</li>
<li class="">use ocall warpper functions</li>
</ul>
</li>
<li class="">Conflicts: multiple language items in Rust</li>
<li class="">Runtime behavior checks</li>
<li class="">HW mode issue: <code>rand::thread_rnd()</code> is using CPUID, which is not allowed in SGX</li>
<li class="">Check instructions after compiling</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="free-discussion">Free Discussion<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#free-discussion" class="hash-link" aria-label="Direct link to Free Discussion" title="Direct link to Free Discussion" translate="no">​</a></h3>
<ul>
<li class="">About AMD SEV in Azure: <a href="https://azure.microsoft.com/en-us/blog/azure-and-amd-enable-lift-and-shift-confidential-computing/" target="_blank" rel="noopener noreferrer" class="">https://azure.microsoft.com/en-us/blog/azure-and-amd-enable-lift-and-shift-confidential-computing/</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Mingshen Sun</li>
<li class="">Qinkun Bao</li>
<li class="">He Sun</li>
<li class="">George</li>
<li class="">Hongbo Chen</li>
<li class="">hang</li>
<li class="">Kevin</li>
<li class="">Ben</li>
<li class="">Ruide</li>
<li class="">Rudong Zhou</li>
<li class="">shelven</li>
<li class="">Tongxin Li</li>
<li class="">Weijie Liu</li>
<li class="">Zha0Chan</li>
<li class="">Tianyi Li</li>
<li class="">DuanRan</li>
<li class="">Gordon</li>
<li class="">david</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="group-photo">Group Photo<a href="https://teaclave.apache.org/blog/2021/10/14/teaclave-meetup-8#group-photo" class="hash-link" aria-label="Direct link to Group Photo" title="Direct link to Group Photo" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Group Photo" src="https://teaclave.apache.org/assets/images/teaclave-meetup-8-zoom-2474b7cbe44239ceb31b2100c02ea448.png" width="3808" height="2414" class="img__Ss2"></p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing Apache Teaclave™ (incubating) 0.3.0]]></title>
        <id>https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0</id>
        <link href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0"/>
        <updated>2021-10-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On behalf of the Teaclave community, I am happy to announce the third Apache]]></summary>
        <content type="html"><![CDATA[<p>On behalf of the Teaclave community, I am happy to announce the <em>third</em> Apache
Incubator release of Teaclave, 0.3.0. Teaclave is a universal secure computing
platform, making computation on privacy-sensitive data safe and simple.
Apache Teaclave™ (including the
<a href="https://github.com/apache/incubator-teaclave" target="_blank" rel="noopener noreferrer" class="">FaaS platform</a>,
<a href="https://github.com/apache/incubator-teaclave-sgx-sdk" target="_blank" rel="noopener noreferrer" class="">SGX SDK</a>,
and <a href="https://github.com/apache/incubator-teaclave-trustzone-sdk" target="_blank" rel="noopener noreferrer" class="">TrustZone SDK</a>) is
being used and contributed by developers from many organizations and
other open source projects. Please see the <a class="" href="https://teaclave.apache.org/powered-by"><em>powered by</em></a> page to learn more.</p>
<p>This is the third official Apache Incubator release. In this release, we focus
more on bringing <a href="https://webassembly.org/" target="_blank" rel="noopener noreferrer" class="">WebAssembly</a> into Teaclave. Now, you
can run functions written in different languages in Teaclave with the
WebAssembly executor. Specifically, we modify
<a href="https://github.com/bytecodealliance/wasm-micro-runtime" target="_blank" rel="noopener noreferrer" class="">WebAssembly Micro Runtime</a> and add
it as a new executor in Teaclave.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="highlights">Highlights<a href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<p>In this release, we added a new WebAssembly executor which supports to run
function in the WebAssembly bytecode. Therefore, in addition to native code and
Python scripts, Teaclave can run many other languages which can be compiled in
to WebAssembly. This enables a lot of functions of privacy-preseving computation
that are not easily rewritten in Rust or Python. Furthermore, because of the
ecosystem of WebAssembly, we can even run deep neural network models in the
WebAssembly executor.</p>
<p><img decoding="async" loading="lazy" alt="Teaclave Function Executors" src="https://teaclave.apache.org/assets/images/teaclave-function-executors-wasm-dd2467ef360dd45f571f4a7954920d3e.png" width="2946" height="1046" class="img__Ss2"></p>
<p>To illustrate the capability of the executor, we also support WebAssembly
machine learning models compiled by <a href="https://tvm.apache.org/" target="_blank" rel="noopener noreferrer" class="">Apache TVM</a>.
Apache TVM is an open source machine learning compiler framework for CPUs, GPUs,
and machine learning accelerators. TVM also supports WebAssembly runtime
backend. We also introduce a new MNIST inference example to show the usage of
the new executor with TVM.</p>
<p><img decoding="async" loading="lazy" alt="Using the WebAssembly executor for Machine Learning Inference with TVM" src="https://teaclave.apache.org/assets/images/teaclave-tvm-webassembly-3a2f265798d6122b93e5fe775ed8201d.png" width="1522" height="908" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="030-release-notes">0.3.0 Release Notes<a href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0#030-release-notes" class="hash-link" aria-label="Direct link to 0.3.0 Release Notes" title="Direct link to 0.3.0 Release Notes" translate="no">​</a></h2>
<p>Here is a list of notable changes in Teaclave version 0.3.0.</p>
<p><strong>Features</strong></p>
<ul>
<li class="">Add the WebAssembly executor to support functions written in other languages.</li>
<li class="">Examples of running C and Rust with the WebAssembly executor.</li>
<li class="">Support inference tasks with models compiled by TVM.</li>
<li class="">Add the MNIST inference example to demonstrate the ability of using TVM in Teaclave.</li>
</ul>
<p><strong>Enhancements</strong></p>
<ul>
<li class="">Add the script to simplify developing with editors with Rust's Language Server Protocol support.</li>
<li class="">Upgrade SGX SDK dependencies, i.e., Intel SGX SDK to version 2.14.100.2, DCAP to version 1.11.100.2.</li>
</ul>
<p><strong>Bug Fixes</strong></p>
<ul>
<li class="">Update the SGX SDK used in the runtime dockerfile.</li>
<li class="">Fix <code>Python.h</code> not found when compiling <code>acs_py_enclave.c</code>.</li>
<li class="">Fix building system messed up by untracked <code>Cargo.lock</code> files.</li>
<li class="">Fix dcap building issue.</li>
</ul>
<p><strong>Docs</strong></p>
<ul>
<li class="">Add instructions to configure URLs of input/output files in examples.</li>
<li class="">Executing WebAssembly in Teaclave: <a href="https://teaclave.apache.org/docs/executing-wasm/" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/docs/executing-wasm/</a>.</li>
<li class="">Inferencing with TVM in Teaclave: <a href="https://teaclave.apache.org/docs/inference-with-tvm/" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/docs/inference-with-tvm/</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="download">Download<a href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
<p>Teaclave 0.3.0 can be downloaded at <a class="" href="https://teaclave.apache.org/download/">the download page</a>. Note that
it is essential to verify the integrity of the downloaded file using the
PGP signature (the <code>.asc</code> file) or a hash (the <code>.sha256</code> file).</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="documentation">Documentation<a href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>If it is the first time to try Teaclave, we provide a simple but clear tutorial
to guide you getting stated with Teaclave by invoking
<a class="" href="https://teaclave.apache.org/docs/my-first-function/">your first function</a> in Teaclave.</p>
<p>Basically, you can build the Teaclave platform using docker with these commands:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ tar zxvf apache-teaclave-0.3.0-incubating.tar.gz &amp;&amp; cd \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  apache-teaclave-0.3.0-incubating</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ # Instructions to verify the source tar: https://teaclave.apache.org/download/#verify-the-integrity-of-the-files</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ docker run --rm -v $(pwd):/teaclave -w /teaclave \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.14:latest \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   bash -c ". /root/.cargo/env &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     . /opt/sgxsdk/environment &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     mkdir -p build &amp;&amp; cd build &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON -DGIT_SUBMODULE=OFF .. &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     make"</span><br></span></code></pre></div></div>
<p>Launch all services with <code>docker-compose</code> using simulation mode:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ (cd docker &amp;&amp; docker-compose -f docker-compose-ubuntu-1804-sgx-sim-mode.yml up --build)</span><br></span></code></pre></div></div>
<p>And invoke function with a Python client:</p>
<div class="language-sh codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sh codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd examples/python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ PYTHONPATH=../../sdk/python python3 builtin_echo.py 'Hello, Teaclave!'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] registering user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] login</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] registering function</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] creating task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] approving task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] invoking task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] getting result</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] function return:  b'Hello, Teaclave!'</span><br></span></code></pre></div></div>
<p>If you want to understand the internals of Teaclave, we provide several
documents about the <a class="" href="https://teaclave.apache.org/docs/#design">design</a> of Teaclave. Also, we extensively
document our <a class="" href="https://teaclave.apache.org/docs/#codebase">codebase</a> in each sub directories. At last, <a class="" href="https://teaclave.apache.org/docs/#api-references">API references</a>
are automatically generated and uploaded to our homepage.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="community">Community<a href="https://teaclave.apache.org/blog/2021/10/01/announcing-teaclave-0.3.0#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no">​</a></h2>
<ul>
<li class="">Join us on our <a href="https://lists.apache.org/list.html?dev@teaclave.apache.org" target="_blank" rel="noopener noreferrer" class="">mailing list</a> and <a href="https://discord.gg/ynECXsxm5P" target="_blank" rel="noopener noreferrer" class="">Discord channel</a>.</li>
<li class="">Follow us at <a href="https://twitter.com/ApacheTeaclave" target="_blank" rel="noopener noreferrer" class="">@ApacheTeaclave</a>.</li>
<li class="">Meet us at our <a href="https://teaclave.apache.org/community/#calendar" target="_blank" rel="noopener noreferrer" class="">monthly community meetup</a>.</li>
<li class="">See <a href="https://teaclave.apache.org/community/" target="_blank" rel="noopener noreferrer" class="">more</a>.</li>
</ul>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Teaclave Meetup #7]]></title>
        <id>https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7</id>
        <link href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7"/>
        <updated>2021-08-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In Aug 26, we gathered on Zoom for the 7th Teaclave meetup. In this meetup,]]></summary>
        <content type="html"><![CDATA[<p>In Aug 26, we gathered on Zoom for the 7th Teaclave meetup. In this meetup,
Mingshen briefly introduce recent updates in Teaclave, and also introduce new
members attending the meetup.</p>
<p>For all Teaclave events, we publish a <em>Teaclave Community Event Calendar</em>:
<a href="https://calendar.google.com/calendar/u/0/embed?src=l1q5osem2br8i4bj7dgik5sae4@group.calendar.google.com" target="_blank" rel="noopener noreferrer" class="">https://calendar.google.com/calendar/u/0/embed?src=l1q5osem2br8i4bj7dgik5sae4@group.calendar.google.com</a>.
You can subscribe to see our latest schedule information including the Zoom
link.</p>
<p>Here is the minutes for Teaclave Meetup #7 on Aug 26, 2021.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="attendees">Attendees<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#attendees" class="hash-link" aria-label="Direct link to Attendees" title="Direct link to Attendees" translate="no">​</a></h2>
<ul>
<li class="">Mingshen Sun</li>
<li class="">Ran Duan</li>
<li class="">Tianyi Li</li>
<li class="">Ruide Zhang</li>
<li class="">Yanhua Luo</li>
<li class="">Hongbo Chen</li>
<li class="">Weijie Liu</li>
<li class="">Tongxin Li</li>
<li class="">Wenhao Wang</li>
<li class="">Chan Zhao</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="agenda">Agenda<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda" translate="no">​</a></h2>
<ul>
<li class="">Recent updates in Teaclave - Mingshen Sun</li>
<li class="">Free discussion</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="notes">Notes<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="recent-updates-in-teaclave---mingshen">Recent updates in Teaclave - Mingshen<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#recent-updates-in-teaclave---mingshen" class="hash-link" aria-label="Direct link to Recent updates in Teaclave - Mingshen" title="Direct link to Recent updates in Teaclave - Mingshen" translate="no">​</a></h3>
<p><strong>Teaclave Faas Platform</strong></p>
<ul>
<li class="">Add TVM MNIST example (#535)</li>
<li class="">Add IDE helper script (#539)</li>
<li class="">Release v0.3.0: <a href="https://teaclave.apache.org/download/#teaclave" target="_blank" rel="noopener noreferrer" class="">https://teaclave.apache.org/download/#teaclave</a></li>
</ul>
<p><strong>Teaclave TrustZone SDK</strong></p>
<ul>
<li class="">TEE Socket APIs and examples</li>
<li class="">Upgrade building docker to Ubuntu 20.04</li>
<li class="">Switch to GitHub Actions</li>
<li class="">Add -rs to examples and update test scripts (#34)</li>
<li class="">Update to OP-TEE 3.14.0 (#35)</li>
</ul>
<p><strong>Teaclave SGX SDK</strong></p>
<ul>
<li class="">Intel SGX SDK 2.14</li>
</ul>
<p><strong>Website</strong></p>
<ul>
<li class="">[blog] <a href="https://teaclave.apache.org/blog/2021-08-02-podling-teaclave-report-august-2021/" target="_blank" rel="noopener noreferrer" class="">Podling Teaclave Report - August 2021 · Aug 01 2021</a></li>
<li class="">[blog] <a href="https://teaclave.apache.org/blog/2021-08-25-developing-sgx-application-with-teaclave-sgx-sdk/" target="_blank" rel="noopener noreferrer" class="">使用 Teaclave SGX SDK 开发 SGX 应用 · Aug 24 2021</a></li>
</ul>
<p><strong>External Collaboration</strong></p>
<ul>
<li class="">Teaclave/Intel: Integrating Graphene as a new Library OS executor</li>
<li class="">Teaclave/OP-TEE: Integrating examples in Rust TrustZone SDK in OP-TEE</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="free-discussion">Free Discussion<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#free-discussion" class="hash-link" aria-label="Direct link to Free Discussion" title="Direct link to Free Discussion" translate="no">​</a></h3>
<p>Intro</p>
<ul>
<li class="">New members: Tianyi Li from Ant Group, Wenhao Wang from CAS</li>
</ul>
<p>About Occlum NGO</p>
<ul>
<li class="">Mingshen: what is Occlum NGO? <a href="https://github.com/occlum/ngo" target="_blank" rel="noopener noreferrer" class="">https://github.com/occlum/ngo</a></li>
<li class="">Wenhao: related news: <a href="https://juejin.cn/post/6963839027665436709" target="_blank" rel="noopener noreferrer" class="">https://juejin.cn/post/6963839027665436709</a></li>
<li class="">Ran: will discuss with the Occlum group</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="group-photos">Group Photos<a href="https://teaclave.apache.org/blog/2021/08/26/teaclave-meetup-7#group-photos" class="hash-link" aria-label="Direct link to Group Photos" title="Direct link to Group Photos" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Teaclave Meetup #7" src="https://teaclave.apache.org/assets/images/teaclave-meetup-7-zoom-fb72705d1f17840d53367f1ef09d0da1.png" width="3808" height="2414" class="img__Ss2"></p>]]></content>
        <author>
            <name>Mingshen Sun</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[使用 Teaclave SGX SDK 开发 SGX 应用]]></title>
        <id>https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk</id>
        <link href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk"/>
        <updated>2021-08-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[[[TOC]]]]></summary>
        <content type="html"><![CDATA[<p>[[TOC]]</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-sgx-sdk应用开发环境简介以及搭建">Teaclave SGX SDK应用开发环境简介以及搭建<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#teaclave-sgx-sdk%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="Direct link to Teaclave SGX SDK应用开发环境简介以及搭建" title="Direct link to Teaclave SGX SDK应用开发环境简介以及搭建" translate="no">​</a></h2>
<p>Intel SGX (Software Guard Extension, 软件防护扩展) 因为其较为出色的性能和安全性，是目前最为学术界和工业界关注的 TEE (Trusted Execution Environment, 可信执行环境)。Intel SGX 在内存中划分了名为 enclave（飞地）的隔离区域，用来存放敏感数据和代码。通过提供该隔离的可信执行环境，enclave 在操作系统、BIOS 和虚拟机监控器等系统软件均不可信的情况下，仍然对 enclave 内部的代码和数据提供保护，保障用户的关键数据和代码的机密性和完整性。</p>
<p>但如果 Intel SGX 程序仍然使用 C/C++ 这类内存不安全的语言开发的话，就会和传统软件一样面临着内存破坏漏洞的问题。对于 enclave 来说，受到的危害会更为严重，因为 enclave 中保存的多是机密数据和代码。Teaclave SGX 的主要目标就是通过使用高效的内存安全语言 —— Rust 来支持 enclave 应用程序的开发，从而在保证 Intel SGX enclave 内存安全的同时不会带来显著的性能开销。</p>
<p>Teaclave SGX SDK 内部结构分为三层：</p>
<ul>
<li class="">最底层是使用 C/C++ 和汇编实现的 Intel SGX SDK。</li>
<li class="">中间层是 Rust 对 C/C++ 的 FFI (Foreign function Interfaces, 外部函数接口)。</li>
<li class="">最高层是 Teaclave SGX SDK。</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Teaclave SGX SDK 概要图" src="https://teaclave.apache.org/assets/images/2021-08-13-overview-of-teaclave-sgx-sdk-cn-b86d37357d198f14e10fbbcb03fe612c.png" width="1050" height="964" class="img__Ss2"></p>
<p>Teaclave SGX SDK 应用程序开发者在进行开发时就只需要基于最上层的 Teaclave SGX SDK 来进行开发，底层的实现对于开发者来说是透明的。本文将从开发者的角度介绍基于 Teaclave SGX SDK 开发自己的应用程序的过程。</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="准备条件">准备条件<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E5%87%86%E5%A4%87%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="Direct link to 准备条件" title="Direct link to 准备条件" translate="no">​</a></h3>
<ul>
<li class="">Ubuntu16.04 或者 18.04 或者 20.04 (Teaclave SGX SDK v1.1.3 中增加了对 Ubuntu 20.04 的支持)</li>
<li class="">docker 环境</li>
</ul>
<p><em>本文基于 Teaclave SGX SDK v1.1.3 提交哈希值：d107bd0718f723221750a4f2973451b386cbf9d2</em></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="基于-docker-配置-teaclave-sgx-sdk-开发环境">基于 docker 配置 Teaclave SGX SDK 开发环境<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E5%9F%BA%E4%BA%8E-docker-%E9%85%8D%E7%BD%AE-teaclave-sgx-sdk-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 基于 docker 配置 Teaclave SGX SDK 开发环境" title="Direct link to 基于 docker 配置 Teaclave SGX SDK 开发环境" translate="no">​</a></h3>
<p>首先需要用户机器 CPU 支持 Intel SGX 并且在 BIOS 上开启了 Intel SGX 支持。用户可以通过 <a href="https://github.com/ayeks/SGX-hardware" target="_blank" rel="noopener noreferrer" class="">SGX-hardware项目</a> 或者在 <a href="https://www.intel.com/content/www/us/en/products/details/processors.html" target="_blank" rel="noopener noreferrer" class="">Intel 官网</a> 中搜索自己的 CPU 型号查看是否支持 Intel SGX。下图以 Intel Core i7-7700K 处理器为例，如下图所示，该机型支持 SGX。</p>
<p><img decoding="async" loading="lazy" alt="sgx-enable.png" src="https://teaclave.apache.org/assets/images/2021-08-13-sgx-enable-d429fcecc11ac9b4cfa4290dfbc507aa.png" width="1232" height="710" class="img__Ss2"></p>
<p>当确定 CPU 支持 Intel SGX 之后，还需要开启 BIOS 中的 SGX 选项。CPU 上的 SGX 选项可能有 <code>enabled</code> 或者 <code>software controlled</code>。具有 <code>enabled</code> 选项的主机直接在 BIOS 上选择 <code>enabled</code> 即可，而<code>software controlled</code> 表示 SGX 的开启需要由软件触发，还需通过 Intel 官方提供的 <a href="https://github.com/intel/sgx-software-enable" target="_blank" rel="noopener noreferrer" class="">sgx-software-enable</a> 开启。下载好 <code>sgx-software-enable</code> 之后，运行 <code>Makefile</code> 编译生成可执行代码 <code>sgx_enable</code> ，执行 <code>sudo ./sgx_enable</code> 顺利运行后重启主机，即可顺利开启 Intel SGX。</p>
<p>硬件条件准备完毕之后，还需要安装 <a href="https://download.01.org/intel-sgx/sgx-linux/2.10/distro/ubuntu16.04-server/sgx_linux_x64_driver_2.6.0_602374c.bin" target="_blank" rel="noopener noreferrer" class="">Linux SGX 驱动</a>（本实验环境的操作系统版本为 ubuntu16.04 ，安装时需要根据自己的操作系统版本号在 <a href="https://download.01.org/intel-sgx/" target="_blank" rel="noopener noreferrer" class="">官网</a> 下载对应的 Intel SGX 驱动） ，安装完毕之后需要确认 <code>/dev/isgx</code> 的存在。</p>
<p>下载 Teaclave SGX SDK 以及支持编译 SGX 设备的 docker image。</p>
<p><code>$ https://github.com/apache/incubator-teaclave-sgx-sdk</code></p>
<p><code>$ docker pull baiduxlab/sgx-rust</code></p>
<p>启动一个 docker，并且把 Teaclave SGX SDK 项目目录映射到 docker 中。</p>
<p><code>$ docker run -v /your/absolute/path/to/incubator-teaclave-sgx-sdk:/root/sgx -ti --device /dev/isgx baiduxlab/sgx-rust</code></p>
<p>在运行的 docker container 中启动 aesm 服务，<strong>White list update request successful for Version</strong> 语句意味着启动成功。</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">root@docker:/# LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm/ /opt/intel/sgx-aesm-service/aesm/aesm_service &amp;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aesm_service[17]: [ADMIN]White List update requested</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aesm_service[17]: Failed to load QE3: 0x4004</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aesm_service[17]: The server sock is 0x56096ab991c0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aesm_service[17]: [ADMIN]White list update request successful for Version: 103</span><br></span></code></pre></div></div>
<p>执行 Teaclave SGX SDK 中的简单实例 helloworld ，检查是否正常运行。</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">root@docker:~# cd sgx/samplecode/helloworld/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@docker:~/sgx/samplecode/helloworld# make</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@docker:~/sgx/samplecode/helloworld# cd bin/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@docker:~/sgx/samplecode/helloworld/bin# ./app</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] global_eid: 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This is normal world string passed into enclave!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This is a Rust string!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] say_something success ...</span><br></span></code></pre></div></div>
<p>至此，我们已经成功在自己的机器上跑起来了 Teaclave SGX SDK 的 helloworld 示例啦！</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="teaclave-sgx-sdk-示例-helloworld-剖析">Teaclave SGX SDK 示例 helloworld 剖析<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#teaclave-sgx-sdk-%E7%A4%BA%E4%BE%8B-helloworld-%E5%89%96%E6%9E%90" class="hash-link" aria-label="Direct link to Teaclave SGX SDK 示例 helloworld 剖析" title="Direct link to Teaclave SGX SDK 示例 helloworld 剖析" translate="no">​</a></h2>
<p>接下来，我们通过阅读 helloworld 这个简单的例子来理解 Teaclave SGX SDK 应用程序的组织结构和运行方式。</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="helloworld-目录结构">helloworld 目录结构<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#helloworld-%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" class="hash-link" aria-label="Direct link to helloworld 目录结构" title="Direct link to helloworld 目录结构" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">helloworld/ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── app </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── app.c </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── app.h </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── bin </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── readme.txt </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── enclave </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.config.xml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.edl </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.lds </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_private.pem </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── lib.rs </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── x86_64-unknown-linux-sgx.json </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── Xargo.toml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── lib </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── readme.txt </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── Makefile </span><br></span></code></pre></div></div>
<p>helloworld 的目录结构和 Intel SGX 的 <a href="https://github.com/intel/linux-sgx/blob/HEAD/SampleCode/SampleEnclave" target="_blank" rel="noopener noreferrer" class="">SampleEnclave</a> 目录结构非常类似。</p>
<ul>
<li class="">app 目录中存放的是不可信部分代码，包括 <code>main</code> 函数以及 <code>OCALL</code> 函数具体逻辑实现。</li>
<li class="">enclave 目录中存放的是可信部分代码，主要是 <code>ECALL</code> 函数具体逻辑实现。
<ul>
<li class="">不同于 SGX ，应用安全区的代码实现位于 <strong><code>src/lib.rs</code></strong>, 该文件是整个 <code>helloworld</code> 文件夹中唯一使用 Rust 编写的文件，程序员可以在该文件中增加需要的功能。</li>
<li class="">另外，enclave 文件夹下多了 <code>Cargo.toml</code>, <code>src/lib.rs</code>, <code>x86_64-unknown-linux-sgx.json</code>, <code>Xargo.toml</code>：
<ul>
<li class=""><strong><code>Cargo.toml</code></strong>: 项目清单文件，包括项目名称、项目版本以及依赖项等。</li>
<li class=""><strong><code>x86_64-unknown-linux-sgx.json</code></strong> 和 <strong><code>Xargo.toml</code></strong> 描述了用于项目交叉编译的信息。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="重要代码文件解析">重要代码文件解析<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E9%87%8D%E8%A6%81%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="Direct link to 重要代码文件解析" title="Direct link to 重要代码文件解析" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>Enclave.edl</code></strong> <br>
该文件规定了 Enclave 边界 <code>ECALL/OCALL</code> 的定义。</li>
</ul>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">enclave {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_tstd.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_stdio.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_backtrace.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_tstdc.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    trusted {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        /* define ECALLs here. */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        public sgx_status_t say_something([in, size=len] const uint8_t* some_string, size_t len);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    untrusted {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre></div></div>
<p><code>trusted {...}</code> 中声明 <code>ECALL</code> 函数， <code>untrusted {...}</code> 中声明 <code>OCALL</code> 函数。本例中声明了一个 <code>ECALL</code> 函数 <code>say_something</code>，该函数的具体实现在 <code>src/lib.rs</code> 中，它的参数包括 <code>uint8_t *</code> 类型的指针和长度参数 <code>len</code>。</p>
<ul>
<li class=""><strong><code>app/app.c</code></strong></li>
</ul>
<p>在 <code>app/app.c</code> 的 <code>main</code> 函数中有一个完整的调用 <code>ECALL</code> 的例子。</p>
<div class="language-c codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-c codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">sgx_ret </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">say_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">global_eid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">enclave_ret</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name">uint8_t</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        len</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>这里的 <code>say_something</code> 似乎和 <code>Enclave.edl</code> 中的声明不太一样，ECALL传递参数时多了两个隐参数：<code>enclave_eid</code> 和 <code>say_something</code> 的返回值 <code>&amp;enclave_ret</code>。而 <code>sgx_ret</code> 表示的是 ECALL 执行是否成功，是 SGX 的返回值。</p>
<ul>
<li class=""><strong><code>enclave/</code>文件夹部分</strong></li>
</ul>
<p><code>enclave/Cargo.toml</code> 中声明了这是一个 <code>staticlib</code>，表明 Enclave 在最后会被编译成一个 <code>.a</code> 文件，该文件会和 Intel 提供的 <code>sgx_tstdc.a</code> 等文件链接形成 <code>enclave.so</code>，再经由 <code>sgx_sign</code> 工具配合 <code>Enclave.config.xml</code> 配置文件、<code>Enclave_private.pem</code> 签名私钥做签名并计算 <code>measurement</code> ，最后生成 <code>enclave.signed.so</code>，这是 Enclave 的完全体。</p>
<ul>
<li class=""><strong><code>enclave/src/lib.rs</code></strong></li>
</ul>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"C"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">say_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">some_string</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> some_len</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> sgx_status_t </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> str_slice </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">slice</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">from_raw_parts</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">some_string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> some_len</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> _ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">io</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">stdout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">str_slice</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// A sample &amp;'static string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> rust_raw_string </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"This is a "</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// An array</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> word</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">[</span><span class="token keyword" style="color:#00009f">u8</span><span class="token punctuation" style="color:#393A34">;</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">82</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">117</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">115</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">116</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// An vector</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> word_vec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">u8</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">vec!</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">115</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">116</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">114</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">105</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">110</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">103</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">33</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Construct a string from &amp;'static string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> hello_string </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rust_raw_string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Iterate on word array</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> c </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> word</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">iter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        hello_string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">c </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">char</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Rust style convertion</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    hello_string </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from_utf8</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">word_vec</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Invalid UTF-8"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                               </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Ocall to normal world for output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">hello_string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token namespace" style="opacity:0.7">sgx_status_t</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token constant" style="color:#36acaa">SGX_SUCCESS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>该函数实现了一个简单的将 <code>&amp;[u8]</code> 数组转化为字符串输出的函数，注意在函数的最后调用的 <code>println!</code> 函数是一个 <code>OCALL</code>。 <code>println!</code> 的具体实现中加入了内置的 <code>OCALL</code>，并定义了内置的 <code>edl</code> ，import到了 <code>Enclave.edl</code> 中。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">enclave {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_tstd.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_stdio.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_backtrace.edl" import *;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    from "sgx_tstdc.edl" import *;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="编译后的代码目录">编译后的代码目录<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E7%BC%96%E8%AF%91%E5%90%8E%E7%9A%84%E4%BB%A3%E7%A0%81%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="Direct link to 编译后的代码目录" title="Direct link to 编译后的代码目录" translate="no">​</a></h3>
<p>经过编译之后的代码目录如下所示，这里省略了 <code>release</code> 文件夹下的内容。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">├── app </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── app.c </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── app.h </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── app.o               #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_u.c         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_u.h         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── Enclave_u.o         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── bin </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── app                 #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── enclave.signed.so   #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── readme.txt </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── enclave </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.lock          #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Cargo.toml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.config.xml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.edl </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave.lds </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_private.pem </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── enclave.so          #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_t.c         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_t.h         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Enclave_t.o         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── Makefile </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── src </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── lib.rs </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── target              #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── CACHEDIR.TAG    #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── release         #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── x86_64-unknown-linux-sgx.json </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── Xargo.toml </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── lib </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── libenclave.a        #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── libsgx_ustdc.a      #[generate] </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── readme.txt </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── Makefile </span><br></span></code></pre></div></div>
<p>helloworld 编译的基本流程类似于 Intel SGX:</p>
<ul>
<li class=""><code>edger8r</code> 将输入的 <code>EDL</code> 在 <code>app/</code> 目录下生成不可信代码 <code>Enclave_u.h</code> 和 <code>Enclave_u.c</code>；</li>
<li class="">编译不可信部分生成 <code>bin/app</code>；</li>
<li class=""><code>edger8r</code> 在 <code>enclave/</code> 目录下生成可信代码 <code>Enclave_t.h</code> 和 <code>Enclave_t.c</code>；</li>
<li class="">编译并签名生成可信动态链接库 <code>enclave.signed.so</code>。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="开发者如何开发自己的-rust-sgx-application">开发者如何开发自己的 Rust SGX Application<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E5%BC%80%E5%8F%91%E8%80%85%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91%E8%87%AA%E5%B7%B1%E7%9A%84-rust-sgx-application" class="hash-link" aria-label="Direct link to 开发者如何开发自己的 Rust SGX Application" title="Direct link to 开发者如何开发自己的 Rust SGX Application" translate="no">​</a></h2>
<p>同样类似于开发 Intel SGX Application，用户可以通过改写 Teaclave SGX SDK 所提供的 <code>samplecode</code>，在这里，我以一个简单的例子抛砖引玉。</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="添加自定义的函数">添加自定义的函数<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0" class="hash-link" aria-label="Direct link to 添加自定义的函数" title="Direct link to 添加自定义的函数" translate="no">​</a></h3>
<p>假设用户希望在 Teaclave SGX SDK 中实现一个简单的求两个数组的交集的函数，只需要直接在 <code>src/lib.rs</code> 中添加实现的函数。下面的示例代码 <code>intersection</code> 函数是希望添加的求交集函数，注意这里求到的交集结果是无重复元素的。传入的两个参数是需要求交集的 <code>i32</code> 向量，最后返回的是两个向量的交集。其具体的实现是通过一个额外的散列集，记录 <code>num1</code> 出现的元素，再对 <code>num2</code> 进行遍历，如果 <code>num2</code> 出现了散列集中的元素，则将该值 <code>push</code> 到交集数组中，并将散列表中的对应元素移除。当 <code>num2</code> 遍历完毕之后，返回交集数组。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">intersection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">i32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">i32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">i32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">collections</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">i32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">i32</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> nums1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">iter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">iter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                vec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>考虑一个比较现实的场景，两个用户分别将自己的向量作为参数传入 enclave 中进行计算，这时候数据需要从不可信代码区域复制到可信代码区域。
首先，需要在 <code>Enclave.edl</code> 文件中修改 <code>say_something</code> 函数的定义，输入参数为两个用户的向量指针以及对应的向量大小。</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">public sgx_status_t say_something([in, size=len1] size_t* num1, size_t len1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                  [in, size=len2] size_t* num2, size_t len2);</span><br></span></code></pre></div></div>
<p>接着，在 <code>app.c</code> 文件中声明需要求交集的数组以及大小并仿照示例调用 <code>say_something</code>。</p>
<div class="language-c codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-c codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">size_t</span><span class="token plain"> nums1</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">size_t</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">11</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">14</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">size_t</span><span class="token plain"> len1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">sizeof</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">size_t</span><span class="token plain"> len2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">sizeof</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sgx_ret </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">say_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">global_eid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">enclave_ret</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            nums1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            len1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            nums2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            len2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>回到 <code>enclave/src/lib.rs</code>，<code>say_something</code> 传进来的是两个向量的起始地址以及大小。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"C"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">say_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> sgx_status_t </span><br></span></code></pre></div></div>
<p>由于数据是从非安全区复制到安全区的，还需要对 <code>intersection</code> 函数进行部分改写。传进来的参数是数组指针，以指针地址为起始地址，根据大小参数限制迭代范围并获得一个用于循环的序号变量 <code>i</code>，在 <code>for</code> 循环中使用 <code>offset</code> 偏移指针，解引用它，读出 <code>nums1</code> 和 <code>nums2</code> 的元素值。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">intersection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">collections</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">len1</span><span class="token operator" style="color:#393A34">/</span><span class="token namespace" style="opacity:0.7">mem</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">size_of</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            val_nums1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">val_nums1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">len2</span><span class="token operator" style="color:#393A34">/</span><span class="token namespace" style="opacity:0.7">mem</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">size_of</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">unsafe</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            val_nums2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">nums2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">isize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            vec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            set</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">val_nums2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>完整的 <code>say_something</code> 函数如下所示。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[no_mangle]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"C"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">say_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">usize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> sgx_status_t </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">usize</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">intersection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nums1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nums2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"intersection set is {:?}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> vec</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token namespace" style="opacity:0.7">sgx_status_t</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token constant" style="color:#36acaa">SGX_SUCCESS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>重新编译并运行，得到运行结果：</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">[+] global_eid: 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">intersection set is [5, 6, 7, 8, 9]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[+] say_something success ...</span><br></span></code></pre></div></div>
<p>我们基于 Teaclave SGX SDK 的 helloworld 实现了自己的求交集函数。</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="调用-teaclave-sgx-sdk-提供的-crate">调用 Teaclave SGX SDK 提供的 <code>crate</code><a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E8%B0%83%E7%94%A8-teaclave-sgx-sdk-%E6%8F%90%E4%BE%9B%E7%9A%84-crate" class="hash-link" aria-label="Direct link to 调用-teaclave-sgx-sdk-提供的-crate" title="Direct link to 调用-teaclave-sgx-sdk-提供的-crate" translate="no">​</a></h3>
<p>Teaclave SGX SDK 重写了很多 SGX 的库，当我们需要用某个库时，可以先在仓库中查看是否有相应的 <code>crate</code> 实现以及对应的 <a href="https://teaclave.apache.org/api-docs/crates-enclave/" target="_blank" rel="noopener noreferrer" class="">doc</a>。比如当我们希望生成一个随机数时，在 <code>C++</code> 或者 <code>Rust</code> 环境下，会想到使用 <code>rand</code> 库。自然而然地，Teaclave SGX SDK 也用 Rust 重写了 <a href="https://github.com/apache/incubator-teaclave-sgx-sdk/tree/master/sgx_rand" target="_blank" rel="noopener noreferrer" class=""><code>sgx_rand</code></a> 库。</p>
<p>首先在 <code>enclave/Cargo.toml</code> 中的 <code>[target.'cfg(not(target_env = "sgx"))'.dependencies]</code> 部分添加 <code>sgx_rand</code> 库的地址。</p>
<div class="language-toml codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-toml codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">[target.'cfg(not(target_env = "sgx"))'.dependencies]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sgx_rand = {git = "https://github.com/apache/teaclave-sgx-sdk.git" }</span><br></span></code></pre></div></div>
<p>现在万事俱备，只欠调用。回到 <code>lib.rs</code> 文件中，链接到 <code>sgx_rand</code> <code>crate</code>，导入其中的所有项，声明需要使用的模块。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">crate</span><span class="token plain"> </span><span class="token module-declaration namespace" style="opacity:0.7">sgx_rand</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">sgx_rand</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Rng</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">sgx_rand</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">os</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">SgxRng</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>调用 <code>gen_range</code> 函数生成 0-10 之间的随机数。</p>
<div class="language-rust codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-rust codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> random </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> rng</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">gen_range</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>这样就可以在 Teaclave SGX SDK 中的 enclave 中通过调用官方 <code>crate</code> 随机生成一个随机数。</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="总结">总结<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h2>
<p>本文首先介绍了 Teaclave SGX SDK 项目的基本结构，然后以 <code>helloworld</code> 为例子，介绍了一个简单的 Teaclave SGX SDK 的示例的组织结构和编译过程，最后，以在 <code>helloworld</code> 中实现 <code>intersection</code> 函数为例，介绍了如何基于提供的 SampleCode 进行 Teaclave SGX SDK 应用程序的开发。</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="延伸阅读">延伸阅读<a href="https://teaclave.apache.org/blog/2021/08/25/developing-sgx-application-with-teaclave-sgx-sdk#%E5%BB%B6%E4%BC%B8%E9%98%85%E8%AF%BB" class="hash-link" aria-label="Direct link to 延伸阅读" title="Direct link to 延伸阅读" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/dingelish/SGXfail/blob/master/01.md" target="_blank" rel="noopener noreferrer" class="">一份主观的 SGX 导读：运行第一个 SGX 程序</a></li>
<li class=""><a href="http://teaclave.apache.org/" target="_blank" rel="noopener noreferrer" class="">Teaclave 官网</a></li>
<li class=""><a href="https://dl.acm.org/citation.cfm?id=3354241" target="_blank" rel="noopener noreferrer" class="">Teaclave SGX SDK 项目论文：《Towards Memory Safe Enclave Programming with Rust-SGX》</a></li>
</ul>]]></content>
        <author>
            <name>Wenwen Ruan</name>
        </author>
    </entry>
</feed>