tpm2_createek(1) General Commands Manual tpm2_createek(1)

tpm2_createek - ایجاد کلید تاییدیه اصلی TPM2 (Endorsement Key)

tpm2_createek [گزینه‌ها]

دستور tpm2_createek(1) یک کلید تاییدیه (EK) منطبق بر پروفایل TCG ایجاد می‌کند که شیء اصلی در سلسله‌مراتب تاییدیه (endorsement hierarchy) است.

اگر یک شیء گذرا (transient) ایجاد شود، این ابزار یک فایل بافت (context file) را در مسیر مشخص‌شده با گزینه -c خروجی می‌دهد.

مراجعه کنید به: http://www.trustedcomputinggroup.org/files/static_page_files/7CAA5687-1A4B-B294-D04080D058E86C5F

•
-P، --eh-auth=AUTH:

مقدار احراز هویت برای سلسله‌مراتب تاییدیه (endorsement hierarchy).

•
-w، --owner-auth=AUTH

مقدار احراز هویت برای سلسله‌مراتب مالک (owner hierarchy).

•
-c، --ek-context=OBJECT یا FILE:

مسیر یک فایل یا مقدار یک دستگیره پایدار (persistent handle) برای ذخیره کلید تاییدیه.

اگر مقدار - ارسال شود، ابزار یک دستگیره پایدار خالی را برای استفاده پیدا کرده و دستگیره انتخاب‌شده خودکار را چاپ می‌کند.

اگر فایل بافت از طریق این گزینه و کلید عمومی از طریق گزینه -u ذخیره شود، کلید تاییدیه (EK) را می‌توان از طریق فراخوانی دستور tpm2_loadexternal(1) بازیابی کرد.

•
-G، --key-algorithm=ALGORITHM:

الگوریتم کلید تاییدیه. پشتیبانی می‌کند از:

•
ecc - به‌طور پیش‌فرض یک کلید NIST_P256. منحنی‌های جایگزین را می‌توان با استفاده از مشخص‌کننده‌های الگوریتم انتخاب کرد (مانند ecc384 یا ecc_nist_p384).
•
rsa - یک کلید RSA2048.
•
keyedhash - کلید hmac. به‌طور پیش‌فرض، برای NIST_P256 و RSA2048 از الگوی محدوده LOW تعریف‌شده در EK Credential Profile استفاده خواهد شد. الگوی محدوده HIGH را می‌توان با افزودن پسوند _high به نام الگوریتم انتخاب کرد.
•
-u، --public=FILE:

ورودی اختیاری برای فایلی جهت ذخیره بخش عمومی کلید تاییدیه.

•
-t، --template:

الگوی کلید تاییدیه و نانس (nonce) اختیاری تعریف‌شده توسط سازنده از ایندکس‌های ثابت NV برای مقداردهی ناحیه عمومی TPM2B_PUBLIC. برای اطلاعات بیشتر به مشخصات TCG EK Credential Profile مراجعه کنید: https://trustedcomputinggroup.org/wp-content/uploads/TCG_IWG_Credential_Profile_EK_V2.1_R13.pdf

•
-f، --format:

انتخاب فرمت برای فایل خروجی کلید عمومی. مقدار “tss” (پیش‌فرض) یک حباب دودویی (binary blob) طبق مشخصات TPM 2.0 تولید می‌کند. مقدار “pem” یک کلید عمومی با کدگذاری PEM و سازگار با OpenSSL تولید می‌کند. مقدار “der” یک کلید عمومی با کدگذاری DER و سازگار با OpenSSL تولید می‌کند. مقدار “tpmt” یک حباب دودویی از ساختار TPMT_PUBLIC ارجاع‌شده در مشخصات TPM 2.0 تولید می‌کند.

فرمت کلید عمومی.

نوع یک شیء بافت (context object)، چه یک دستگیره (handle) باشد یا نام فایل، طبق منطق زیر و به‌ترتیب تعیین می‌شود:

•
اگر آرگومان یک مسیر فایل باشد، فایل به عنوان یک شیء گذرای (transient) بازیابی‌شده TPM بارگذاری می‌شود.
•
اگر آرگومان با یک پیشوند از موارد زیر تطابق داشته باشد:
•
owner: سلسله‌مراتب مالک (owner hierarchy)
•
platform: سلسله‌مراتب پلتفرم (platform hierarchy)
•
endorsement: سلسله‌مراتب تاییدیه (endorsement hierarchy)
•
lockout: شیء پایدار کنترل قفل (lockout control persistent object)
•
اگر آرگومان بتواند به عنوان یک عدد بارگذاری شود، به عنوان یک دستگیره (handle) مانند 0x81010013 در نظر گرفته شده و مستقیماً استفاده می‌شود.

احراز هویت برای استفاده از یک شیء در TPM 2.0 می‌تواند به ۳ شکل مختلف انجام شود:

1.
گذرواژه (Password)
2.
کد HMAC
3.
نشست‌ها (Sessions)

نکته: “در صورت عدم تعیین، احراز هویت‌ها به‌طور پیش‌فرض بر روی گذرواژه خالی (EMPTY PASSWORD) قرار می‌گیرند”.

برای احراز هویت با مقادیر auth، دستورات این ابزار به صورت ضمنی یک نشست HMAC ایجاد می‌کنند. بنابراین گذرواژه‌ها به صورت رمزنگاری‌نشده منتقل نمی‌شوند. این مورد برای گذرواژه‌های تعریف‌شده برای اشیاء صدق نمی‌کند. در این حالت، باید از یک نشست HMAC استفاده شود (رجوع کنید به tpm2_startauthsession(1)).

گذرواژه‌ها بر اساس شناسه‌های پیشوندی به اشکال زیر تفسیر می‌شوند.

نکته: به‌طور پیش‌فرض اگر گذرواژه‌ها پیشوند نداشته باشند، در قالب رشته متنی فرض می‌شوند.

یک گذرواژه رشته‌ای که با پیشوند “str:” یا بدون پیشوند (رشته خام) مشخص می‌شود، تفسیر نشده و مستقیماً برای احراز هویت به کار می‌رود.

foobar
str:foobar

یک گذرواژه به صورت رشته هگزادسیمال، با پیشوند “hex:” مشخص می‌شود و از قالب هگزادسیمال به آرایه بایت تبدیل می‌گردد؛ بدین ترتیب استفاده از گذرواژه‌هایی با نویسه‌های غیرقابل‌چاپ یا ناسازگار با ترمینال امکان‌پذیر می‌شود.

hex:1122334455667788

یک گذرواژه مبتنی بر فایل که با پیشوند “file:” مشخص می‌شود، باید مسیر فایلی حاوی گذرواژه باشد تا توسط ابزار خوانده شود، یا “-” برای استفاده از ورودی استاندارد (stdin). ذخیره گذرواژه‌ها در فایل از نشت اطلاعات جلوگیری می‌کند، زیرا گذرواژه‌های ارسال‌شده به عنوان گزینه ممکن است از طریق فهرست پردازش‌ها یا تاریخچه پوسته خوانده شوند.

# استفاده از stdin و درخواست از کاربر
file:-
# استفاده از فایل از یک مسیر
file:path/to/password/file
# ارسال گذرواژه از طریق stdin با echo:
echo foobar | tpm2_tool -p file:-
# استفاده از here-string بش از طریق stdin:
tpm2_tool -p file:- <<< foobar

هنگام استفاده از یک نشست پالیسی (policy session) برای مجاز کردن استفاده از یک شیء، کلمه کلیدی session را به عنوان پیشوند آرگومان گزینه قرار دهید. سپس مسیری به یک فایل بافت نشست که با دستور tpm2_startauthsession(1) ایجاد شده است را مشخص کنید. در صورت تمایل، اگر نشست نیازمند ارسال مقدار auth همراه با دستگیره نشست باشد (مانند گذرواژه پالیسی)، یک علامت + و رشته‌ای مطابق با بخش گذرواژه‌ها (Passwords) اضافه کنید.

برای استفاده از فایل بافت نشست با نام session.ctx:

session:session.ctx

برای استفاده از فایل بافت نشست با نام session.ctx و ارسال مقدار auth برابر با mypassword:

session:session.ctx+mypassword

برای استفاده از فایل بافت نشست با نام session.ctx و ارسال مقدار auth هگزادسیمال 0x11223344:

session:session.ctx+hex:11223344

می‌توانید یک پالیسی PCR را با استفاده از پیشوند “pcr:” و زبان کوچک PCR برآورده سازید. زبان کوچک PCR به صورت زیر است: <pcr-spec>=<raw-pcr-file>

مشخصات PCR در بخش “مشخص‌کننده‌های بانک PCR (PCR bank specifiers)” مستند شده است.

آرگومان raw-pcr-file یک آرگومان اختیاری است که حاوی خروجی خام محتویات PCR است که توسط tpm2_pcrread(1) بازگردانده می‌شود.

مشخص‌کننده‌های بانک PCR

برای برآورده کردن یک پالیسی PCR با sha256 روی بانک‌های ۰، ۱، ۲ و ۳ از مشخص‌کننده زیر استفاده کنید:

pcr:sha256:0,1,2,3

مشخص کردن AUTH.

گزینه‌هایی که الگوریتم دریافت می‌کنند از “نام‌های مناسب (nice-names)” پشتیبانی می‌کنند.

دو دسته اصلی رشته‌های مشخص‌کننده الگوریتم وجود دارد: ساده و پیچیده. بر اساس کاربرد و شرایط، تنها الگوریتم‌های خاصی توسط TPM پذیرفته می‌شوند.

این‌ها رشته‌هایی بدون داده‌های مشخص‌کننده اضافی هستند. هنگام ایجاد اشیاء، بخش‌های نامشخص شیء به مقادیر پیش‌فرض ارجاع داده می‌شوند. می‌توانید فهرست “مشخص‌کننده‌های ساده” شناخته‌شده را در زیر بیابید.

•
rsa
•
ecc

•
aes
•
camellia
•
sm4

•
sha1
•
sha256
•
sha384
•
sha512
•
sm3_256
•
sha3_256
•
sha3_384
•
sha3_512

•
hmac
•
xor

•
rsassa
•
rsapss
•
ecdsa
•
ecdaa
•
ecschnorr
•
sm2

•
oaep
•
rsaes
•
ecdh

•
ctr
•
ofb
•
cbc
•
cfb
•
ecb

•
null

اشیاء هنگام تعیین برای ایجاد توسط TPM، دارای الگوریتم‌های متعددی هستند که باید در داده‌های عمومی مقداردهی شوند؛ مواردی مانند نوع، طرح و جزئیات نامتقارن، اندازه کلید و غیره. در زیر قالب کلی برای مشخص کردن این داده‌ها آمده است: <type>:<scheme>:<symmetric-details>

این بخش از مشخص‌کننده الگوریتم پیچیده الزامی است. طرح و جزئیات متقارن باقی‌مانده بر اساس نوع مشخص‌شده و نوع شیء در حال ایجاد، پیش‌فرض‌گذاری می‌شوند.

•
aes - مقدار پیش‌فرض AES: aes128.
•
aes128<mode> - الگوریتم AES با طول ۱۲۸ بیت و حالت اختیاری (ctr|ofb|cbc|cfb|ecb). اگر حالت مشخص نشود، پیش‌فرض null خواهد بود.
•
aes192<mode> - مشابه aes128<mode>، به‌جز اندازه کلید ۱۹۲ بیتی.
•
aes256<mode> - مشابه aes128<mode>، به‌جز اندازه کلید ۲۵۶ بیتی.
•
sm4 - مقدار پیش‌فرض SM4: sm4128.
•
sm4128 یا sm4_128 <mode> - الگوریتم SM4 با طول ۱۲۸ بیت و حالت اختیاری (ctr|ofb|cbc|cfb|ecb). اگر حالت مشخص نشود، پیش‌فرض null خواهد بود.
•
ecc - خم بیضوی، پیش‌فرض ecc256.
•
ecc192 یا ecc_nist_p192 - خم بیضوی ۱۹۲ بیتی NIST ECC.
•
ecc224 یا ecc_nist_p224 - خم بیضوی ۲۲۴ بیتی NIST ECC.
•
ecc256 یا ecc_nist_p256 - خم بیضوی ۲۵۶ بیتی NIST ECC.
•
ecc384 یا ecc_nist_p384 - خم بیضوی ۳۸۴ بیتی NIST ECC.
•
ecc521 یا ecc_nist_p521 - خم بیضوی ۵۲۱ بیتی NIST ECC.
•
ecc_sm2 یا ecc_sm2_p256 - خم بیضوی ۲۵۶ بیتی SM2.
•
rsa - مقدار پیش‌فرض RSA: rsa2048.
•
rsa1024 - الگوریتم RSA با اندازه کلید ۱۰۲۴ بیت.
•
rsa2048 - الگوریتم RSA با اندازه کلید ۲۰۴۸ بیت.
•
rsa3072 - الگوریتم RSA با اندازه کلید ۳۰۷۲ بیت.
•
rsa4096 - الگوریتم RSA با اندازه کلید ۴۰۹۶ بیت.

فیلد بعدی اختیاری است و می‌توان از آن صرف‌نظر کرد.

طرح‌ها معمولاً طرح‌های امضا (Signing Schemes) یا طرح‌های رمزنگاری نامتقارن (Asymmetric Encryption Schemes) هستند. بیشتر طرح‌های امضا بلافاصله پس از طرح امضا، یک الگوریتم درهم‌سازی دریافت می‌کنند. اگر الگوریتم درهم‌سازی ذکر نشود، پیش‌فرض sha256 خواهد بود. برخی هیچ آرگومانی نمی‌پذیرند و برخی چندین آرگومان دریافت می‌کنند.

پس از این مشخص‌کننده‌های طرح، یک خط تیره و یک الگوریتم درهم‌سازی معتبر قرار می‌گیرد، برای مثال: oaep-sha256.

•
oaep
•
ecdh
•
rsassa
•
rsapss
•
ecdsa
•
ecschnorr
•
sm2

پس از این مشخص‌کننده طرح، یک شمارنده (حداکثر اندازه UINT16) و سپس یک خط تیره (-) و یک الگوریتم درهم‌سازی معتبر قرار می‌گیرد. * ecdaa به عنوان مثال، ecdaa4-sha256. اگر شمارنده‌ای مشخص نشود، پیش‌فرض ۴ خواهد بود.

این مشخص‌کننده طرح هیچ آرگومانی دریافت نمی‌کند. * rsaes

این فیلد اختیاری است و بر اساس نوع (type) شیء در حال ایجاد و ویژگی‌های آن پیش‌فرض‌گذاری می‌شود. به‌طور کلی، هر مشخص‌کننده معتبر متقارن از فهرست مشخص‌کننده‌های نوع باید کار کند. اگر مشخص نشود، جزئیات متقارن یک شیء نامتقارن به‌طور پیش‌فرض به aes128cfb تنظیم می‌شود.

tpm2_create -C parent.ctx -G rsa2048:rsaes -u key.pub -r key.priv

tpm2_create -C parent.ctx -G ecc256:ecdaa4-sha384 -u key.pub -r key.priv الگوریتم‌های رمزنگاری ALGORITHM.

این مجموعه گزینه‌ها بین بسیاری از برنامه‌ها مشترک هستند و اطلاعاتی را ارائه می‌دهند که بسیاری از کاربران انتظار دارند.

•
-h، --help=[man|no-man]: نمایش صفحه راهنمای (manpage) ابزار. به‌طور پیش‌فرض، تلاش می‌کند تا صفحه‌بند man (manpager) را برای ابزار فراخوانی کند؛ اما در صورت شکست، خلاصه کوتاهی از ابزار را نمایش می‌دهد. این رفتار مشابه زمانی است که آرگومان گزینه “man” مشخص شده باشد؛ اما اگر “man” به‌طور صریح درخواست شود، ابزار خطاهای man را در stderr ارائه می‌دهد. اگر گزینه “no-man” مشخص شود، یا فراخوانی صفحه‌بند man با شکست مواجه گردد، گزینه‌های کوتاه در stdout نمایش داده می‌شوند.

استفاده موفقیت‌آمیز از ویژگی صفحات راهنما نیازمند آن است که این صفحات نصب شده باشند یا در MANPATH قرار داشته باشند؛ برای جزئیات بیشتر به man(1) مراجعه کنید.

•
-v، --version: نمایش اطلاعات نسخه این ابزار، TCTIهای پشتیبانی‌شده و سپس خروج.
•
-V، --verbose: افزایش اطلاعاتی که ابزار در طول اجرای خود در کنسول چاپ می‌کند. هنگام استفاده از این گزینه، نام فایل و شماره خط چاپ می‌شوند.
•
-Q، --quiet: بی‌صدا کردن خروجی عادی ابزار در stdout.
•
-Z، --enable-errata: فعال‌سازی اعمال اصلاحات اشتباه‌نامه (errata fixups). زمانی مفید است که لازم باشد یک اصلاح اشتباه‌نامه بر روی دستورات ارسالی به TPM اعمال شود. تعریف متغیر محیطی TPM2TOOLS_ENABLE_ERRATA نیز معادل این گزینه است.
•
-z، --pwd-session: استفاده از نشست گذرواژه به جای نشست HMAC برای احراز هویت. یک گذرواژه متنی آشکار (clear text) به TPM ارسال می‌شود تا اقدام مورد نظر مجاز شود. این گزینه می‌تواند برای جلوگیری از مشکلاتی که هنگام استفاده از نشست‌های بدون نمک (unsalted) در حالت OpenSSL FIPS رخ می‌دهد، استفاده شود. اگر مقادیر auth استفاده می‌شوند، باید از یک نشست با نمک (salted) برای احراز هویت استفاده گردد.
•
-R، --autoflush: فعال‌سازی تخلیه خودکار (autoflush) برای اشیاء گذرای ایجادشده توسط دستور. اگر یک شیء والد از یک فایل بافت بارگذاری شود، شیء والد گذرا نیز تخلیه خواهد شد. تخلیه خودکار همچنین می‌تواند با تنظیم متغیر محیطی TPM2TOOLS_AUTOFLUSH بر روی yes یا true فعال شود. اطلاعاتی که بسیاری از کاربران ممکن است انتظار داشته باشند.

رابط TCTI یا “رابط انتقال (Transmission Interface)” مکانیزم ارتباط با TPM است. رابط‌های TCTI را می‌توان برای ارتباط با TPM از طریق بسترهای مختلف تغییر داد.

برای کنترل TCTI، ابزارها موارد زیر را رعایت می‌کنند:

1.
گزینه خط فرمان -T یا --tcti
2.
متغیر محیطی: TPM2TOOLS_TCTI.

نکته: گزینه خط فرمان همواره بر متغیر محیطی اولویت دارد.

رابط‌های TCTI شناخته‌شده فعلی عبارتند از:

•
tabrmd - مدیر منابع، تحت عنوان tabrmd. توجه داشته باشید که tabrmd و abrmd به عنوان نام tcti مترادف یکدیگر هستند.
•
mssim - معمولاً برای برقراری ارتباط با شبیه‌ساز نرم‌افزاری TPM استفاده می‌شود.
•
device - برای ارتباط مستقیم با فایل دستگاه TPM استفاده می‌شود.
•
none - اتصالی با TPM برقرار نمی‌کند. برخی ابزارها امکان استفاده از گزینه‌های خارج از TPM را دارند و بنابراین از عدم استفاده از TCTI پشتیبانی می‌کنند. ابزارهایی که از آن پشتیبانی نمی‌کنند، در صورت تلاش برای استفاده بدون اتصال TCTI با خطا مواجه می‌شوند. این حالت از هیچ گزینه‌ای پشتیبانی نمی‌کند و باید حتماً دقیقاً به صورت عبارت “none” ارائه شود.

آرگومان‌های گزینه خط فرمان یا متغیر محیطی به قالب زیر هستند:

<tcti-name>:<tcti-option-config>

مشخص کردن یک رشته خالی برای هر یک از بخش‌های <tcti-name> یا <tcti-option-config> باعث می‌شود که برای آن بخش به ترتیب مقدار پیش‌فرض استفاده شود.

هنگامی که TCTI مشخص نشده باشد، TCTI پیش‌فرض با استفاده از قواعد dlopen(3) جستجو می‌شود. ابزارها TCTIهای tabrmd، device و mssim را به همین ترتیب جستجو کرده و از اولین موردی که یافت شود استفاده می‌کنند. می‌توانید با استفاده از گزینه -v برای چاپ اطلاعات نسخه، بررسی کنید که کدام TCTI به عنوان پیش‌فرض انتخاب خواهد شد. جفت کلید-مقدار “default-tcti” نشان می‌دهد که کدام یک از TCTIهای یادشده پیش‌فرض است.

هر TCTI که رابط پویای TCTI را پیاده‌سازی کند می‌تواند بارگذاری شود. ابزارها در داخل از dlopen(3) استفاده می‌کنند و مقدار خام tcti-name برای جستجو به کار می‌رود. بنابراین، این مقدار می‌تواند مسیری به کتابخانه اشتراکی یا نام کتابخانه‌ای باشد که بر اساس قواعد dlopen(3) قابل درک است.

این مجموعه گزینه‌ها برای پیکربندی ماژول‌های مختلف و شناخته‌شده TCTI موجود به کار می‌روند:

•
device: برای رابط TCTI از نوع device، می‌توان فایل دستگاه نویسه‌ای TPM را برای استفاده توسط این رابط تعیین کرد. مقدار پیش‌فرض /dev/tpm0 است.

مثال: -T device:/dev/tpm0 یا export TPM2TOOLS_TCTI=“device:/dev/tpm0”

•
mssim: برای رابط TCTI از نوع mssim، می‌توان نام دامنه یا آدرس IP و شماره درگاه مورد استفاده شبیه‌ساز را تعیین کرد. مقادیر پیش‌فرض 127.0.0.1 و 2321 هستند.

مثال: -T mssim:host=localhost,port=2321 یا export TPM2TOOLS_TCTI=“mssim:host=localhost,port=2321”

•
abrmd: برای رابط TCTI از نوع abrmd، قالب رشته پیکربندی مجموعه‌ای از جفت‌های کلید-مقدار ساده است که با نویسه «,» از هم جدا شده‌اند. رشته‌های کلید و مقدار با نویسه «=» از یکدیگر تفکیک می‌شوند.
•
رابط abrmd TCTI از دو کلید پشتیبانی می‌کند:
1.
«bus_name» : نام سرویس tabrmd بر روی گذرگاه (یک رشته).
2.
«bus_type» : نوع نمونه dbus (یک رشته) محدود به «session» و «system».

تعیین نام tabrmd tcti و یک رشته پیکربندی با bus_name=com.example.FooBar:

\--tcti=tabrmd:bus_name=com.example.FooBar

تعیین tcti پیش‌فرض (abrmd) و یک رشته پیکربندی با bus_type=session:

\--tcti:bus_type=session

نکته: abrmd و tabrmd مترادف یکدیگرند. ماژول‌های مختلف TCTI شناخته‌شده.

tpm2_createek -P abc123 -w abc123 -c 0x81010001 -G rsa -u ek.pub

tpm2_createek -G ecc384 -c 0x81010002

معمولاً هنگام استفاده از TPM، تعاملات از طریق یک مدیر منابع مانند tpm2-abrmd(8) انجام می‌شود. با این حال، هنگام تعامل مستقیم با TPM، این سناریو امکان‌پذیر است. مثال زیر دسترسی مستقیم به TPM را بدون واسطه مدیر منابع فرض می‌کند. به‌طور مشخص، از /dev/tpm0 استفاده خواهیم کرد.

tpm2_createek -c ek.ctx -G rsa -u ek.pub -Tdevice:/dev/tpm0
# بررسی اینکه آیا در حافظه گذرا بارگذاری شده است یا خیر
tpm2_getcap handles-transient -Tdevice:/dev/tpm0
- 0x80000000
# تخلیه دستگیره
tpm2_flushcontext 0x80000000 -Tdevice:/dev/tpm0
# توجه داشته باشید که تخلیه شده است
tpm2_getcap handles-transient -Tdevice:/dev/tpm0
<null output>
# بارگذاری مجدد آن از طریق loadexternal
tpm2_loadexternal -C o -u ek.pub -c ek.ctx -Tdevice:/dev/tpm0
# بررسی اینکه آیا مجدداً در حافظه گذرا بارگذاری شده است یا خیر
tpm2_getcap handles-transient -Tdevice:/dev/tpm0
- 0x80000000

ابزارها می‌توانند هر یک از کدهای زیر را بازگردانند:

•
0 - موفقیت.
•
1 - خطای کلی و نامشخص.
•
2 - خطای مدیریت گزینه‌ها.
•
3 - خطای احراز هویت.
•
4 - خطای مربوط به TCTI.
•
5 - طرح پشتیبانی‌نشده. قابل اعمال در tpm2_testparams.

گزارش اشکالات در گیت‌هاب (Github Issues)

مشاهده فهرست پستی (Mailing List)

این اثر تحت مجوز بین‌المللی کریتیو کامنز ارجاع ۴.۰ (CC BY 4.0).

tpm2-tools